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