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