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