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