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