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