2017-05-15 21:59:25 +00:00
|
|
|
package odb
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"compress/zlib"
|
|
|
|
"encoding/hex"
|
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"io/ioutil"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
2017-05-15 22:01:53 +00:00
|
|
|
"time"
|
2017-05-15 21:59:25 +00:00
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
2017-05-15 22:01:04 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
2017-05-15 21:59:25 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestDecodeBlob(t *testing.T) {
|
|
|
|
sha := "af5626b4a114abcb82d63db7c8082c3c4756e51b"
|
|
|
|
contents := "Hello, world!\n"
|
|
|
|
|
|
|
|
var buf bytes.Buffer
|
|
|
|
|
|
|
|
zw := zlib.NewWriter(&buf)
|
|
|
|
fmt.Fprintf(zw, "blob 14\x00%s", contents)
|
|
|
|
zw.Close()
|
|
|
|
|
2017-05-16 21:29:03 +00:00
|
|
|
odb := &ObjectDatabase{s: newMemoryStorer(map[string]io.ReadWriter{
|
2017-05-15 21:59:25 +00:00
|
|
|
sha: &buf,
|
|
|
|
})}
|
|
|
|
|
|
|
|
shaHex, _ := hex.DecodeString(sha)
|
|
|
|
blob, err := odb.Blob(shaHex)
|
|
|
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.EqualValues(t, 14, blob.Size)
|
|
|
|
|
|
|
|
got, err := ioutil.ReadAll(blob.Contents)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, contents, string(got))
|
|
|
|
}
|
|
|
|
|
2017-05-15 22:01:04 +00:00
|
|
|
func TestDecodeTree(t *testing.T) {
|
|
|
|
sha := "fcb545d5746547a597811b7441ed8eba307be1ff"
|
|
|
|
hexSha, err := hex.DecodeString(sha)
|
|
|
|
require.Nil(t, err)
|
|
|
|
|
|
|
|
blobSha := "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
|
|
|
hexBlobSha, err := hex.DecodeString(blobSha)
|
|
|
|
require.Nil(t, err)
|
|
|
|
|
|
|
|
var buf bytes.Buffer
|
|
|
|
|
|
|
|
zw := zlib.NewWriter(&buf)
|
|
|
|
fmt.Fprintf(zw, "tree 37\x00")
|
|
|
|
fmt.Fprintf(zw, "100644 hello.txt\x00")
|
|
|
|
zw.Write(hexBlobSha)
|
|
|
|
zw.Close()
|
|
|
|
|
2017-05-16 21:29:03 +00:00
|
|
|
odb := &ObjectDatabase{s: newMemoryStorer(map[string]io.ReadWriter{
|
2017-05-15 22:01:04 +00:00
|
|
|
sha: &buf,
|
|
|
|
})}
|
|
|
|
|
|
|
|
tree, err := odb.Tree(hexSha)
|
|
|
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
require.Equal(t, 1, len(tree.Entries))
|
|
|
|
assert.Equal(t, &TreeEntry{
|
|
|
|
Name: "hello.txt",
|
|
|
|
Oid: hexBlobSha,
|
|
|
|
Filemode: 0100644,
|
|
|
|
}, tree.Entries[0])
|
|
|
|
}
|
|
|
|
|
2017-05-15 22:01:53 +00:00
|
|
|
func TestDecodeCommit(t *testing.T) {
|
|
|
|
sha := "d7283480bb6dc90be621252e1001a93871dcf511"
|
|
|
|
commitShaHex, err := hex.DecodeString(sha)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
var buf bytes.Buffer
|
|
|
|
|
|
|
|
zw := zlib.NewWriter(&buf)
|
|
|
|
fmt.Fprintf(zw, "commit 173\x00")
|
|
|
|
fmt.Fprintf(zw, "tree fcb545d5746547a597811b7441ed8eba307be1ff\n")
|
|
|
|
fmt.Fprintf(zw, "author Taylor Blau <me@ttaylorr.com> 1494620424 -0600\n")
|
|
|
|
fmt.Fprintf(zw, "committer Taylor Blau <me@ttaylorr.com> 1494620424 -0600\n")
|
|
|
|
fmt.Fprintf(zw, "\ninitial commit\n")
|
|
|
|
zw.Close()
|
|
|
|
|
2017-05-16 21:29:03 +00:00
|
|
|
odb := &ObjectDatabase{s: newMemoryStorer(map[string]io.ReadWriter{
|
2017-05-15 22:01:53 +00:00
|
|
|
sha: &buf,
|
|
|
|
})}
|
|
|
|
|
|
|
|
commit, err := odb.Commit(commitShaHex)
|
|
|
|
|
|
|
|
assert.Nil(t, err)
|
2017-05-22 20:27:18 +00:00
|
|
|
assert.Equal(t, "Taylor Blau <me@ttaylorr.com> 1494620424 -0600", commit.Author)
|
|
|
|
assert.Equal(t, "Taylor Blau <me@ttaylorr.com> 1494620424 -0600", commit.Committer)
|
2017-05-15 22:01:53 +00:00
|
|
|
assert.Equal(t, "initial commit", commit.Message)
|
2017-05-16 21:47:07 +00:00
|
|
|
assert.Equal(t, 0, len(commit.ParentIDs))
|
2017-05-16 21:46:38 +00:00
|
|
|
assert.Equal(t, "fcb545d5746547a597811b7441ed8eba307be1ff", hex.EncodeToString(commit.TreeID))
|
2017-05-15 22:01:53 +00:00
|
|
|
}
|
|
|
|
|
2017-05-15 21:59:25 +00:00
|
|
|
func TestWriteBlob(t *testing.T) {
|
2017-05-16 21:29:03 +00:00
|
|
|
fs := newMemoryStorer(make(map[string]io.ReadWriter))
|
2017-05-15 21:59:25 +00:00
|
|
|
odb := &ObjectDatabase{s: fs}
|
|
|
|
|
|
|
|
sha, err := odb.WriteBlob(&Blob{
|
|
|
|
Size: 14,
|
|
|
|
Contents: strings.NewReader("Hello, world!\n"),
|
|
|
|
})
|
|
|
|
|
|
|
|
expected := "af5626b4a114abcb82d63db7c8082c3c4756e51b"
|
|
|
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, expected, hex.EncodeToString(sha))
|
|
|
|
assert.NotNil(t, fs.fs[hex.EncodeToString(sha)])
|
|
|
|
}
|
2017-05-15 22:01:04 +00:00
|
|
|
|
|
|
|
func TestWriteTree(t *testing.T) {
|
2017-05-16 21:29:03 +00:00
|
|
|
fs := newMemoryStorer(make(map[string]io.ReadWriter))
|
2017-05-15 22:01:04 +00:00
|
|
|
odb := &ObjectDatabase{s: fs}
|
|
|
|
|
|
|
|
blobSha := "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
|
|
|
|
hexBlobSha, err := hex.DecodeString(blobSha)
|
|
|
|
require.Nil(t, err)
|
|
|
|
|
|
|
|
sha, err := odb.WriteTree(&Tree{Entries: []*TreeEntry{
|
|
|
|
{
|
|
|
|
Name: "hello.txt",
|
|
|
|
Oid: hexBlobSha,
|
|
|
|
Filemode: 0100644,
|
|
|
|
},
|
|
|
|
}})
|
|
|
|
|
|
|
|
expected := "fcb545d5746547a597811b7441ed8eba307be1ff"
|
|
|
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, expected, hex.EncodeToString(sha))
|
|
|
|
assert.NotNil(t, fs.fs[hex.EncodeToString(sha)])
|
|
|
|
}
|
2017-05-15 22:01:53 +00:00
|
|
|
|
|
|
|
func TestWriteCommit(t *testing.T) {
|
2017-05-16 21:29:03 +00:00
|
|
|
fs := newMemoryStorer(make(map[string]io.ReadWriter))
|
2017-05-15 22:01:53 +00:00
|
|
|
odb := &ObjectDatabase{s: fs}
|
|
|
|
|
2017-05-16 21:24:18 +00:00
|
|
|
when := time.Unix(1257894000, 0).UTC()
|
2017-05-15 22:01:53 +00:00
|
|
|
author := &Signature{Name: "John Doe", Email: "john@example.com", When: when}
|
|
|
|
committer := &Signature{Name: "Jane Doe", Email: "jane@example.com", When: when}
|
|
|
|
|
|
|
|
tree := "fcb545d5746547a597811b7441ed8eba307be1ff"
|
|
|
|
treeHex, err := hex.DecodeString(tree)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
sha, err := odb.WriteCommit(&Commit{
|
2017-05-22 20:27:18 +00:00
|
|
|
Author: author.String(),
|
|
|
|
Committer: committer.String(),
|
2017-05-16 21:46:38 +00:00
|
|
|
TreeID: treeHex,
|
2017-05-15 22:01:53 +00:00
|
|
|
Message: "initial commit",
|
|
|
|
})
|
|
|
|
|
2017-05-16 21:24:18 +00:00
|
|
|
expected := "fee8a35c2890cd6e0e28d24cc457fcecbd460962"
|
2017-05-15 22:01:53 +00:00
|
|
|
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.Equal(t, expected, hex.EncodeToString(sha))
|
|
|
|
assert.NotNil(t, fs.fs[hex.EncodeToString(sha)])
|
|
|
|
}
|
2017-05-31 20:13:30 +00:00
|
|
|
|
2017-05-31 20:13:56 +00:00
|
|
|
func TestReadingAMissingObjectAfterClose(t *testing.T) {
|
|
|
|
sha, _ := hex.DecodeString("af5626b4a114abcb82d63db7c8082c3c4756e51b")
|
|
|
|
|
|
|
|
db := &ObjectDatabase{
|
|
|
|
s: newMemoryStorer(nil),
|
|
|
|
closed: 1,
|
|
|
|
}
|
|
|
|
|
2017-05-31 21:55:59 +00:00
|
|
|
blob, err := db.Blob(sha)
|
2017-09-05 21:04:44 +00:00
|
|
|
assert.EqualError(t, err, "git/odb: cannot use closed *pack.Set")
|
2017-05-31 21:55:59 +00:00
|
|
|
assert.Nil(t, blob)
|
2017-05-31 20:13:56 +00:00
|
|
|
}
|
|
|
|
|
2017-05-31 20:13:30 +00:00
|
|
|
func TestClosingAnObjectDatabaseMoreThanOnce(t *testing.T) {
|
2017-10-25 00:59:36 +00:00
|
|
|
db, err := FromFilesystem("/tmp", "")
|
2017-05-31 20:13:30 +00:00
|
|
|
assert.Nil(t, err)
|
|
|
|
|
2017-05-31 21:55:59 +00:00
|
|
|
assert.Nil(t, db.Close())
|
|
|
|
assert.EqualError(t, db.Close(), "git/odb: *ObjectDatabase already closed")
|
2017-05-31 20:13:30 +00:00
|
|
|
}
|
2017-06-01 22:29:26 +00:00
|
|
|
|
|
|
|
func TestObjectDatabaseRootWithRoot(t *testing.T) {
|
2017-10-25 00:59:36 +00:00
|
|
|
db, err := FromFilesystem("/foo/bar/baz", "")
|
2017-06-01 22:29:26 +00:00
|
|
|
assert.Nil(t, err)
|
|
|
|
|
|
|
|
root, ok := db.Root()
|
|
|
|
assert.Equal(t, "/foo/bar/baz", root)
|
|
|
|
assert.True(t, ok)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestObjectDatabaseRootWithoutRoot(t *testing.T) {
|
|
|
|
root, ok := new(ObjectDatabase).Root()
|
|
|
|
|
|
|
|
assert.Equal(t, "", root)
|
|
|
|
assert.False(t, ok)
|
|
|
|
}
|