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}