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