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