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