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