package dag import ( "math/rand" "testing" "github.com/stretchr/testify/require" "github.com/MichaelMure/git-bug/identity" "github.com/MichaelMure/git-bug/repository" ) func TestOperationPackReadWrite(t *testing.T) { repo, id1, _, resolver, def := makeTestContext() opp := &operationPack{ Author: id1, Operations: []Operation{ newOp1(id1, "foo"), newOp2(id1, "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) require.Equal(t, opp, opp2) // make sure we get the same Id with the same data opp3 := &operationPack{ Author: id1, Operations: []Operation{ newOp1(id1, "foo"), newOp2(id1, "bar"), }, CreateTime: 123, EditTime: 456, } require.Equal(t, opp.Id(), opp3.Id()) } func TestOperationPackSignedReadWrite(t *testing.T) { repo, id1, _, resolver, def := makeTestContext() err := id1.(*identity.Identity).Mutate(repo, func(orig *identity.Mutator) { orig.Keys = append(orig.Keys, identity.GenerateKey()) }) require.NoError(t, err) opp := &operationPack{ Author: id1, Operations: []Operation{ newOp1(id1, "foo"), newOp2(id1, "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) require.Equal(t, opp, opp2) // make sure we get the same Id with the same data opp3 := &operationPack{ Author: id1, Operations: []Operation{ newOp1(id1, "foo"), newOp2(id1, "bar"), }, CreateTime: 123, EditTime: 456, } require.Equal(t, opp.Id(), opp3.Id()) } func TestOperationPackFiles(t *testing.T) { repo, id1, _, resolver, def := makeTestContext() blobHash1, err := repo.StoreData(randomData()) require.NoError(t, err) blobHash2, err := repo.StoreData(randomData()) require.NoError(t, err) opp := &operationPack{ Author: id1, Operations: []Operation{ newOp1(id1, "foo", blobHash1, blobHash2), newOp1(id1, "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) 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 }