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