bug_actions_test.go

  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}