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, author, _, resolver, def := makeTestContext()
15
16 opp := &operationPack{
17 Author: author,
18 Operations: []Operation{
19 newOp1(author, "foo"),
20 newOp2(author, "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 for _, op := range opp.Operations {
36 // force the creation of the id
37 op.Id()
38 }
39 require.Equal(t, opp, opp2)
40}
41
42func TestOperationPackSignedReadWrite(t *testing.T) {
43 repo, author, _, resolver, def := makeTestContext()
44
45 err := author.(*identity.Identity).Mutate(repo, func(orig *identity.Mutator) {
46 orig.Keys = append(orig.Keys, identity.GenerateKey())
47 })
48 require.NoError(t, err)
49
50 opp := &operationPack{
51 Author: author,
52 Operations: []Operation{
53 newOp1(author, "foo"),
54 newOp2(author, "bar"),
55 },
56 CreateTime: 123,
57 EditTime: 456,
58 }
59
60 commitHash, err := opp.Write(def, repo)
61 require.NoError(t, err)
62
63 commit, err := repo.ReadCommit(commitHash)
64 require.NoError(t, err)
65
66 opp2, err := readOperationPack(def, repo, resolver, commit)
67 require.NoError(t, err)
68
69 for _, op := range opp.Operations {
70 // force the creation of the id
71 op.Id()
72 }
73 require.Equal(t, opp, opp2)
74}
75
76func TestOperationPackFiles(t *testing.T) {
77 repo, author, _, resolver, def := makeTestContext()
78
79 blobHash1, err := repo.StoreData(randomData())
80 require.NoError(t, err)
81
82 blobHash2, err := repo.StoreData(randomData())
83 require.NoError(t, err)
84
85 opp := &operationPack{
86 Author: author,
87 Operations: []Operation{
88 newOp1(author, "foo", blobHash1, blobHash2),
89 newOp1(author, "foo", blobHash2),
90 },
91 CreateTime: 123,
92 EditTime: 456,
93 }
94
95 commitHash, err := opp.Write(def, repo)
96 require.NoError(t, err)
97
98 commit, err := repo.ReadCommit(commitHash)
99 require.NoError(t, err)
100
101 opp2, err := readOperationPack(def, repo, resolver, commit)
102 require.NoError(t, err)
103
104 for _, op := range opp.Operations {
105 // force the creation of the id
106 op.Id()
107 }
108 require.Equal(t, opp, opp2)
109
110 require.ElementsMatch(t, opp2.Operations[0].(OperationWithFiles).GetFiles(), []repository.Hash{
111 blobHash1,
112 blobHash2,
113 })
114 require.ElementsMatch(t, opp2.Operations[1].(OperationWithFiles).GetFiles(), []repository.Hash{
115 blobHash2,
116 })
117
118 tree, err := repo.ReadTree(commit.TreeHash)
119 require.NoError(t, err)
120
121 extraTreeHash, ok := repository.SearchTreeEntry(tree, extraEntryName)
122 require.True(t, ok)
123
124 extraTree, err := repo.ReadTree(extraTreeHash.Hash)
125 require.NoError(t, err)
126 require.ElementsMatch(t, extraTree, []repository.TreeEntry{
127 {
128 ObjectType: repository.Blob,
129 Hash: blobHash1,
130 Name: "file0",
131 },
132 {
133 ObjectType: repository.Blob,
134 Hash: blobHash2,
135 Name: "file1",
136 },
137 })
138}
139
140func randomData() []byte {
141 var letterRunes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
142 b := make([]byte, 32)
143 for i := range b {
144 b[i] = letterRunes[rand.Intn(len(letterRunes))]
145 }
146 return b
147}