1package bug
2
3import (
4 "testing"
5 "time"
6
7 "github.com/stretchr/testify/require"
8
9 "github.com/MichaelMure/git-bug/identity"
10 "github.com/MichaelMure/git-bug/repository"
11)
12
13func TestPushPull(t *testing.T) {
14 repoA, repoB, remote := repository.SetupReposAndRemote(t)
15 defer repository.CleanupTestRepos(t, repoA, repoB, remote)
16
17 reneA := identity.NewIdentity("René Descartes", "rene@descartes.fr")
18
19 bug1, _, err := Create(reneA, time.Now().Unix(), "bug1", "message")
20 require.NoError(t, err)
21 err = bug1.Commit(repoA)
22 require.NoError(t, err)
23
24 // distribute the identity
25 _, err = identity.Push(repoA, "origin")
26 require.NoError(t, err)
27 err = identity.Pull(repoB, "origin")
28 require.NoError(t, err)
29
30 // A --> remote --> B
31 _, err = Push(repoA, "origin")
32 require.NoError(t, err)
33
34 err = Pull(repoB, "origin")
35 require.NoError(t, err)
36
37 bugs := allBugs(t, ReadAllLocalBugs(repoB))
38
39 if len(bugs) != 1 {
40 t.Fatal("Unexpected number of bugs")
41 }
42
43 // B --> remote --> A
44 reneB, err := identity.ReadLocal(repoA, reneA.Id())
45 require.NoError(t, err)
46
47 bug2, _, err := Create(reneB, time.Now().Unix(), "bug2", "message")
48 require.NoError(t, err)
49 err = bug2.Commit(repoB)
50 require.NoError(t, err)
51
52 _, err = Push(repoB, "origin")
53 require.NoError(t, err)
54
55 err = Pull(repoA, "origin")
56 require.NoError(t, err)
57
58 bugs = allBugs(t, ReadAllLocalBugs(repoA))
59
60 if len(bugs) != 2 {
61 t.Fatal("Unexpected number of bugs")
62 }
63}
64
65func allBugs(t testing.TB, bugs <-chan StreamedBug) []*Bug {
66 var result []*Bug
67 for streamed := range bugs {
68 if streamed.Err != nil {
69 t.Fatal(streamed.Err)
70 }
71 result = append(result, streamed.Bug)
72 }
73 return result
74}
75
76func TestRebaseTheirs(t *testing.T) {
77 _RebaseTheirs(t)
78}
79
80func BenchmarkRebaseTheirs(b *testing.B) {
81 for n := 0; n < b.N; n++ {
82 _RebaseTheirs(b)
83 }
84}
85
86func _RebaseTheirs(t testing.TB) {
87 repoA, repoB, remote := repository.SetupReposAndRemote(t)
88 defer repository.CleanupTestRepos(t, repoA, repoB, remote)
89
90 reneA := identity.NewIdentity("René Descartes", "rene@descartes.fr")
91
92 bug1, _, err := Create(reneA, time.Now().Unix(), "bug1", "message")
93 require.NoError(t, err)
94 err = bug1.Commit(repoA)
95 require.NoError(t, err)
96
97 // distribute the identity
98 _, err = identity.Push(repoA, "origin")
99 require.NoError(t, err)
100 err = identity.Pull(repoB, "origin")
101 require.NoError(t, err)
102
103 // A --> remote
104
105 _, err = Push(repoA, "origin")
106 require.NoError(t, err)
107
108 // remote --> B
109 err = Pull(repoB, "origin")
110 require.NoError(t, err)
111
112 bug2, err := ReadLocalBug(repoB, bug1.Id())
113 require.NoError(t, err)
114
115 reneB, err := identity.ReadLocal(repoA, reneA.Id())
116 require.NoError(t, err)
117
118 _, err = AddComment(bug2, reneB, time.Now().Unix(), "message2")
119 require.NoError(t, err)
120 _, err = AddComment(bug2, reneB, time.Now().Unix(), "message3")
121 require.NoError(t, err)
122 _, err = AddComment(bug2, reneB, time.Now().Unix(), "message4")
123 require.NoError(t, err)
124 err = bug2.Commit(repoB)
125 require.NoError(t, err)
126
127 // B --> remote
128 _, err = Push(repoB, "origin")
129 require.NoError(t, err)
130
131 // remote --> A
132 err = Pull(repoA, "origin")
133 require.NoError(t, err)
134
135 bugs := allBugs(t, ReadAllLocalBugs(repoB))
136
137 if len(bugs) != 1 {
138 t.Fatal("Unexpected number of bugs")
139 }
140
141 bug3, err := ReadLocalBug(repoA, bug1.Id())
142 require.NoError(t, err)
143
144 if nbOps(bug3) != 4 {
145 t.Fatal("Unexpected number of operations")
146 }
147}
148
149func TestRebaseOurs(t *testing.T) {
150 _RebaseOurs(t)
151}
152
153func BenchmarkRebaseOurs(b *testing.B) {
154 for n := 0; n < b.N; n++ {
155 _RebaseOurs(b)
156 }
157}
158
159func _RebaseOurs(t testing.TB) {
160 repoA, repoB, remote := repository.SetupReposAndRemote(t)
161 defer repository.CleanupTestRepos(t, repoA, repoB, remote)
162
163 reneA := identity.NewIdentity("René Descartes", "rene@descartes.fr")
164
165 bug1, _, err := Create(reneA, time.Now().Unix(), "bug1", "message")
166 require.NoError(t, err)
167 err = bug1.Commit(repoA)
168 require.NoError(t, err)
169
170 // distribute the identity
171 _, err = identity.Push(repoA, "origin")
172 require.NoError(t, err)
173 err = identity.Pull(repoB, "origin")
174 require.NoError(t, err)
175
176 // A --> remote
177 _, err = Push(repoA, "origin")
178 require.NoError(t, err)
179
180 // remote --> B
181 err = Pull(repoB, "origin")
182 require.NoError(t, err)
183
184 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message2")
185 require.NoError(t, err)
186 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message3")
187 require.NoError(t, err)
188 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message4")
189 require.NoError(t, err)
190 err = bug1.Commit(repoA)
191 require.NoError(t, err)
192
193 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message5")
194 require.NoError(t, err)
195 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message6")
196 require.NoError(t, err)
197 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message7")
198 require.NoError(t, err)
199 err = bug1.Commit(repoA)
200 require.NoError(t, err)
201
202 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message8")
203 require.NoError(t, err)
204 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message9")
205 require.NoError(t, err)
206 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message10")
207 require.NoError(t, err)
208 err = bug1.Commit(repoA)
209 require.NoError(t, err)
210
211 // remote --> A
212 err = Pull(repoA, "origin")
213 require.NoError(t, err)
214
215 bugs := allBugs(t, ReadAllLocalBugs(repoA))
216
217 if len(bugs) != 1 {
218 t.Fatal("Unexpected number of bugs")
219 }
220
221 bug2, err := ReadLocalBug(repoA, bug1.Id())
222 require.NoError(t, err)
223
224 if nbOps(bug2) != 10 {
225 t.Fatal("Unexpected number of operations")
226 }
227}
228
229func nbOps(b *Bug) int {
230 it := NewOperationIterator(b)
231 counter := 0
232 for it.Next() {
233 counter++
234 }
235 return counter
236}
237
238func TestRebaseConflict(t *testing.T) {
239 _RebaseConflict(t)
240}
241
242func BenchmarkRebaseConflict(b *testing.B) {
243 for n := 0; n < b.N; n++ {
244 _RebaseConflict(b)
245 }
246}
247
248func _RebaseConflict(t testing.TB) {
249 repoA, repoB, remote := repository.SetupReposAndRemote(t)
250 defer repository.CleanupTestRepos(t, repoA, repoB, remote)
251
252 reneA := identity.NewIdentity("René Descartes", "rene@descartes.fr")
253
254 bug1, _, err := Create(reneA, time.Now().Unix(), "bug1", "message")
255 require.NoError(t, err)
256 err = bug1.Commit(repoA)
257 require.NoError(t, err)
258
259 // distribute the identity
260 _, err = identity.Push(repoA, "origin")
261 require.NoError(t, err)
262 err = identity.Pull(repoB, "origin")
263 require.NoError(t, err)
264
265 // A --> remote
266 _, err = Push(repoA, "origin")
267 require.NoError(t, err)
268
269 // remote --> B
270 err = Pull(repoB, "origin")
271 require.NoError(t, err)
272
273 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message2")
274 require.NoError(t, err)
275 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message3")
276 require.NoError(t, err)
277 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message4")
278 require.NoError(t, err)
279 err = bug1.Commit(repoA)
280 require.NoError(t, err)
281
282 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message5")
283 require.NoError(t, err)
284 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message6")
285 require.NoError(t, err)
286 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message7")
287 require.NoError(t, err)
288 err = bug1.Commit(repoA)
289 require.NoError(t, err)
290
291 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message8")
292 require.NoError(t, err)
293 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message9")
294 require.NoError(t, err)
295 _, err = AddComment(bug1, reneA, time.Now().Unix(), "message10")
296 require.NoError(t, err)
297 err = bug1.Commit(repoA)
298 require.NoError(t, err)
299
300 bug2, err := ReadLocalBug(repoB, bug1.Id())
301 require.NoError(t, err)
302
303 reneB, err := identity.ReadLocal(repoA, reneA.Id())
304 require.NoError(t, err)
305
306 _, err = AddComment(bug2, reneB, time.Now().Unix(), "message11")
307 require.NoError(t, err)
308 _, err = AddComment(bug2, reneB, time.Now().Unix(), "message12")
309 require.NoError(t, err)
310 _, err = AddComment(bug2, reneB, time.Now().Unix(), "message13")
311 require.NoError(t, err)
312 err = bug2.Commit(repoB)
313 require.NoError(t, err)
314
315 _, err = AddComment(bug2, reneB, time.Now().Unix(), "message14")
316 require.NoError(t, err)
317 _, err = AddComment(bug2, reneB, time.Now().Unix(), "message15")
318 require.NoError(t, err)
319 _, err = AddComment(bug2, reneB, time.Now().Unix(), "message16")
320 require.NoError(t, err)
321 err = bug2.Commit(repoB)
322 require.NoError(t, err)
323
324 _, err = AddComment(bug2, reneB, time.Now().Unix(), "message17")
325 require.NoError(t, err)
326 _, err = AddComment(bug2, reneB, time.Now().Unix(), "message18")
327 require.NoError(t, err)
328 _, err = AddComment(bug2, reneB, time.Now().Unix(), "message19")
329 require.NoError(t, err)
330 err = bug2.Commit(repoB)
331 require.NoError(t, err)
332
333 // A --> remote
334 _, err = Push(repoA, "origin")
335 require.NoError(t, err)
336
337 // remote --> B
338 err = Pull(repoB, "origin")
339 require.NoError(t, err)
340
341 bugs := allBugs(t, ReadAllLocalBugs(repoB))
342
343 if len(bugs) != 1 {
344 t.Fatal("Unexpected number of bugs")
345 }
346
347 bug3, err := ReadLocalBug(repoB, bug1.Id())
348 require.NoError(t, err)
349
350 if nbOps(bug3) != 19 {
351 t.Fatal("Unexpected number of operations")
352 }
353
354 // B --> remote
355 _, err = Push(repoB, "origin")
356 require.NoError(t, err)
357
358 // remote --> A
359 err = Pull(repoA, "origin")
360 require.NoError(t, err)
361
362 bugs = allBugs(t, ReadAllLocalBugs(repoA))
363
364 if len(bugs) != 1 {
365 t.Fatal("Unexpected number of bugs")
366 }
367
368 bug4, err := ReadLocalBug(repoA, bug1.Id())
369 require.NoError(t, err)
370
371 if nbOps(bug4) != 19 {
372 t.Fatal("Unexpected number of operations")
373 }
374}