bug_actions_test.go

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