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