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/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 err = 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 err = 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 err = 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 err = 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 err = 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 err = 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 err = 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 err = 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 err = 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 err = 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 err = 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 err = 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 err = 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 err = 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 err = 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}