bug_actions_test.go

  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, unix, "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, unix, "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, unix, "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, unix, "message2")
159	operations.Comment(bug2, rene, unix, "message3")
160	operations.Comment(bug2, rene, unix, "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, unix, "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, unix, "message2")
214	operations.Comment(bug1, rene, unix, "message3")
215	operations.Comment(bug1, rene, unix, "message4")
216	err = bug1.Commit(repoA)
217	checkErr(t, err)
218
219	operations.Comment(bug1, rene, unix, "message5")
220	operations.Comment(bug1, rene, unix, "message6")
221	operations.Comment(bug1, rene, unix, "message7")
222	err = bug1.Commit(repoA)
223	checkErr(t, err)
224
225	operations.Comment(bug1, rene, unix, "message8")
226	operations.Comment(bug1, rene, unix, "message9")
227	operations.Comment(bug1, rene, unix, "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, unix, "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, unix, "message2")
286	operations.Comment(bug1, rene, unix, "message3")
287	operations.Comment(bug1, rene, unix, "message4")
288	err = bug1.Commit(repoA)
289	checkErr(t, err)
290
291	operations.Comment(bug1, rene, unix, "message5")
292	operations.Comment(bug1, rene, unix, "message6")
293	operations.Comment(bug1, rene, unix, "message7")
294	err = bug1.Commit(repoA)
295	checkErr(t, err)
296
297	operations.Comment(bug1, rene, unix, "message8")
298	operations.Comment(bug1, rene, unix, "message9")
299	operations.Comment(bug1, rene, unix, "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, unix, "message11")
307	operations.Comment(bug2, rene, unix, "message12")
308	operations.Comment(bug2, rene, unix, "message13")
309	err = bug2.Commit(repoB)
310	checkErr(t, err)
311
312	operations.Comment(bug2, rene, unix, "message14")
313	operations.Comment(bug2, rene, unix, "message15")
314	operations.Comment(bug2, rene, unix, "message16")
315	err = bug2.Commit(repoB)
316	checkErr(t, err)
317
318	operations.Comment(bug2, rene, unix, "message17")
319	operations.Comment(bug2, rene, unix, "message18")
320	operations.Comment(bug2, rene, unix, "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}