package dag import ( "math/rand" "testing" "github.com/stretchr/testify/require" "github.com/git-bug/git-bug/entities/identity" "github.com/git-bug/git-bug/entity" "github.com/git-bug/git-bug/repository" ) func TestOperationPackReadWrite(t *testing.T) { repo, author, _, resolver, def := makeTestContext() opp := &operationPack{ Author: author, Operations: []Operation{ newOp1(author, "foo"), newOp2(author, "bar"), }, CreateTime: 123, EditTime: 456, } commitHash, err := opp.Write(def, repo) require.NoError(t, err) commit, err := repo.ReadCommit(commitHash) require.NoError(t, err) opp2, err := readOperationPack(def, repo, resolver, commit) require.NoError(t, err) for _, op := range opp.Operations { // force the creation of the id op.Id() } require.Equal(t, opp, opp2) } func TestOperationPackSignedReadWrite(t *testing.T) { type makerFn func() (repository.ClockedRepo, identity.Interface, identity.Interface, entity.Resolvers, Definition) for _, maker := range []makerFn{ makeTestContext, func() (repository.ClockedRepo, identity.Interface, identity.Interface, entity.Resolvers, Definition) { return makeTestContextGoGit(t) }, } { repo, author, _, resolver, def := maker() err := author.(*identity.Identity).Mutate(repo, func(orig *identity.Mutator) { orig.Keys = append(orig.Keys, identity.GenerateKey()) }) require.NoError(t, err) opp := &operationPack{ Author: author, Operations: []Operation{ newOp1(author, "foo"), newOp2(author, "bar"), }, CreateTime: 123, EditTime: 456, } commitHash, err := opp.Write(def, repo) require.NoError(t, err) commit, err := repo.ReadCommit(commitHash) require.NoError(t, err) opp2, err := readOperationPack(def, repo, resolver, commit) require.NoError(t, err) for _, op := range opp.Operations { // force the creation of the id op.Id() } require.Equal(t, opp, opp2) } } func TestOperationPackFiles(t *testing.T) { repo, author, _, resolver, def := makeTestContext() blobHash1, err := repo.StoreData(randomData()) require.NoError(t, err) blobHash2, err := repo.StoreData(randomData()) require.NoError(t, err) opp := &operationPack{ Author: author, Operations: []Operation{ newOp1(author, "foo", blobHash1, blobHash2), newOp1(author, "foo", blobHash2), }, CreateTime: 123, EditTime: 456, } commitHash, err := opp.Write(def, repo) require.NoError(t, err) commit, err := repo.ReadCommit(commitHash) require.NoError(t, err) opp2, err := readOperationPack(def, repo, resolver, commit) require.NoError(t, err) for _, op := range opp.Operations { // force the creation of the id op.Id() } require.Equal(t, opp, opp2) require.ElementsMatch(t, opp2.Operations[0].(OperationWithFiles).GetFiles(), []repository.Hash{ blobHash1, blobHash2, }) require.ElementsMatch(t, opp2.Operations[1].(OperationWithFiles).GetFiles(), []repository.Hash{ blobHash2, }) tree, err := repo.ReadTree(commit.TreeHash) require.NoError(t, err) extraTreeHash, ok := repository.SearchTreeEntry(tree, extraEntryName) require.True(t, ok) extraTree, err := repo.ReadTree(extraTreeHash.Hash) require.NoError(t, err) require.ElementsMatch(t, extraTree, []repository.TreeEntry{ { ObjectType: repository.Blob, Hash: blobHash1, Name: "file0", }, { ObjectType: repository.Blob, Hash: blobHash2, Name: "file1", }, }) } func randomData() []byte { var letterRunes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" b := make([]byte, 32) for i := range b { b[i] = letterRunes[rand.Intn(len(letterRunes))] } return b }