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, 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}