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