operation_pack_test.go

  1package dag
  2
  3import (
  4	"math/rand"
  5	"testing"
  6
  7	"github.com/stretchr/testify/require"
  8
  9	"github.com/MichaelMure/git-bug/identity"
 10	"github.com/MichaelMure/git-bug/repository"
 11)
 12
 13func TestOperationPackReadWrite(t *testing.T) {
 14	repo, id1, _, resolver, def := makeTestContext()
 15
 16	opp := &operationPack{
 17		Author: id1,
 18		Operations: []Operation{
 19			newOp1(id1, "foo"),
 20			newOp2(id1, "bar"),
 21		},
 22		CreateTime: 123,
 23		EditTime:   456,
 24	}
 25
 26	commitHash, err := opp.Write(def, repo)
 27	require.NoError(t, err)
 28
 29	commit, err := repo.ReadCommit(commitHash)
 30	require.NoError(t, err)
 31
 32	opp2, err := readOperationPack(def, repo, resolver, commit)
 33	require.NoError(t, err)
 34
 35	require.Equal(t, opp, opp2)
 36
 37	// make sure we get the same Id with the same data
 38	opp3 := &operationPack{
 39		Author: id1,
 40		Operations: []Operation{
 41			newOp1(id1, "foo"),
 42			newOp2(id1, "bar"),
 43		},
 44		CreateTime: 123,
 45		EditTime:   456,
 46	}
 47	require.Equal(t, opp.Id(), opp3.Id())
 48}
 49
 50func TestOperationPackSignedReadWrite(t *testing.T) {
 51	repo, id1, _, resolver, def := makeTestContext()
 52
 53	err := id1.(*identity.Identity).Mutate(repo, func(orig *identity.Mutator) {
 54		orig.Keys = append(orig.Keys, identity.GenerateKey())
 55	})
 56	require.NoError(t, err)
 57
 58	opp := &operationPack{
 59		Author: id1,
 60		Operations: []Operation{
 61			newOp1(id1, "foo"),
 62			newOp2(id1, "bar"),
 63		},
 64		CreateTime: 123,
 65		EditTime:   456,
 66	}
 67
 68	commitHash, err := opp.Write(def, repo)
 69	require.NoError(t, err)
 70
 71	commit, err := repo.ReadCommit(commitHash)
 72	require.NoError(t, err)
 73
 74	opp2, err := readOperationPack(def, repo, resolver, commit)
 75	require.NoError(t, err)
 76
 77	require.Equal(t, opp, opp2)
 78
 79	// make sure we get the same Id with the same data
 80	opp3 := &operationPack{
 81		Author: id1,
 82		Operations: []Operation{
 83			newOp1(id1, "foo"),
 84			newOp2(id1, "bar"),
 85		},
 86		CreateTime: 123,
 87		EditTime:   456,
 88	}
 89	require.Equal(t, opp.Id(), opp3.Id())
 90}
 91
 92func TestOperationPackFiles(t *testing.T) {
 93	repo, id1, _, resolver, def := makeTestContext()
 94
 95	blobHash1, err := repo.StoreData(randomData())
 96	require.NoError(t, err)
 97
 98	blobHash2, err := repo.StoreData(randomData())
 99	require.NoError(t, err)
100
101	opp := &operationPack{
102		Author: id1,
103		Operations: []Operation{
104			newOp1(id1, "foo", blobHash1, blobHash2),
105			newOp1(id1, "foo", blobHash2),
106		},
107		CreateTime: 123,
108		EditTime:   456,
109	}
110
111	commitHash, err := opp.Write(def, repo)
112	require.NoError(t, err)
113
114	commit, err := repo.ReadCommit(commitHash)
115	require.NoError(t, err)
116
117	opp2, err := readOperationPack(def, repo, resolver, commit)
118	require.NoError(t, err)
119
120	require.Equal(t, opp, opp2)
121
122	require.ElementsMatch(t, opp2.Operations[0].(OperationWithFiles).GetFiles(), []repository.Hash{
123		blobHash1,
124		blobHash2,
125	})
126	require.ElementsMatch(t, opp2.Operations[1].(OperationWithFiles).GetFiles(), []repository.Hash{
127		blobHash2,
128	})
129
130	tree, err := repo.ReadTree(commit.TreeHash)
131	require.NoError(t, err)
132
133	extraTreeHash, ok := repository.SearchTreeEntry(tree, extraEntryName)
134	require.True(t, ok)
135
136	extraTree, err := repo.ReadTree(extraTreeHash.Hash)
137	require.NoError(t, err)
138	require.ElementsMatch(t, extraTree, []repository.TreeEntry{
139		{
140			ObjectType: repository.Blob,
141			Hash:       blobHash1,
142			Name:       "file0",
143		},
144		{
145			ObjectType: repository.Blob,
146			Hash:       blobHash2,
147			Name:       "file1",
148		},
149	})
150}
151
152func randomData() []byte {
153	var letterRunes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
154	b := make([]byte, 32)
155	for i := range b {
156		b[i] = letterRunes[rand.Intn(len(letterRunes))]
157	}
158	return b
159}