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