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