2013-09-11 12:17:45 -05:00
|
|
|
package git
|
|
|
|
|
|
|
|
import (
|
2018-07-03 18:43:07 -05:00
|
|
|
"bytes"
|
2015-03-04 13:40:26 -06:00
|
|
|
"errors"
|
2018-12-22 21:25:52 -06:00
|
|
|
"fmt"
|
2013-09-11 12:17:45 -05:00
|
|
|
"io"
|
2018-12-27 22:42:09 -06:00
|
|
|
"io/ioutil"
|
2018-12-22 21:25:52 -06:00
|
|
|
"os"
|
|
|
|
"path"
|
2013-09-11 12:17:45 -05:00
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
2018-07-03 18:43:07 -05:00
|
|
|
func TestOdbRead(t *testing.T) {
|
2016-08-27 12:21:05 -05:00
|
|
|
t.Parallel()
|
2016-02-02 12:02:15 -06:00
|
|
|
repo := createTestRepo(t)
|
|
|
|
defer cleanupTestRepo(t, repo)
|
|
|
|
|
|
|
|
_, _ = seedTestRepo(t, repo)
|
|
|
|
odb, err := repo.Odb()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Odb: %v", err)
|
|
|
|
}
|
|
|
|
data := []byte("hello")
|
|
|
|
id, err := odb.Write(data, ObjectBlob)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("odb.Write: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
sz, typ, err := odb.ReadHeader(id)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("ReadHeader: %v", err)
|
|
|
|
}
|
2018-12-27 22:42:09 -06:00
|
|
|
|
2016-02-02 12:02:15 -06:00
|
|
|
if sz != uint64(len(data)) {
|
|
|
|
t.Errorf("ReadHeader got size %d, want %d", sz, len(data))
|
|
|
|
}
|
|
|
|
if typ != ObjectBlob {
|
|
|
|
t.Errorf("ReadHeader got object type %s", typ)
|
|
|
|
}
|
2018-07-03 18:43:07 -05:00
|
|
|
|
|
|
|
obj, err := odb.Read(id)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("Read: %v", err)
|
|
|
|
}
|
|
|
|
if !bytes.Equal(obj.Data(), data) {
|
|
|
|
t.Errorf("Read got wrong data")
|
|
|
|
}
|
|
|
|
if sz := obj.Len(); sz != uint64(len(data)) {
|
|
|
|
t.Errorf("Read got size %d, want %d", sz, len(data))
|
|
|
|
}
|
|
|
|
if typ := obj.Type(); typ != ObjectBlob {
|
|
|
|
t.Errorf("Read got object type %s", typ)
|
|
|
|
}
|
2016-02-02 12:02:15 -06:00
|
|
|
}
|
|
|
|
|
2013-09-11 12:17:45 -05:00
|
|
|
func TestOdbStream(t *testing.T) {
|
2016-08-27 12:21:05 -05:00
|
|
|
t.Parallel()
|
2013-09-11 12:17:45 -05:00
|
|
|
repo := createTestRepo(t)
|
2015-04-24 05:59:29 -05:00
|
|
|
defer cleanupTestRepo(t, repo)
|
|
|
|
|
2013-09-11 12:17:45 -05:00
|
|
|
_, _ = seedTestRepo(t, repo)
|
|
|
|
|
2021-02-15 09:26:19 -06:00
|
|
|
odb, err := repo.Odb()
|
|
|
|
checkFatal(t, err)
|
2013-09-11 12:17:45 -05:00
|
|
|
|
|
|
|
str := "hello, world!"
|
|
|
|
|
2021-02-15 09:26:19 -06:00
|
|
|
writeStream, err := odb.NewWriteStream(int64(len(str)), ObjectBlob)
|
|
|
|
checkFatal(t, err)
|
|
|
|
n, err := io.WriteString(writeStream, str)
|
|
|
|
checkFatal(t, err)
|
2013-09-11 12:17:45 -05:00
|
|
|
if n != len(str) {
|
|
|
|
t.Fatalf("Bad write length %v != %v", n, len(str))
|
|
|
|
}
|
|
|
|
|
2021-02-15 09:26:19 -06:00
|
|
|
err = writeStream.Close()
|
|
|
|
checkFatal(t, err)
|
2013-09-11 12:17:45 -05:00
|
|
|
|
2021-02-15 09:26:19 -06:00
|
|
|
expectedId, err := NewOid("30f51a3fba5274d53522d0f19748456974647b4f")
|
|
|
|
checkFatal(t, err)
|
2018-12-27 22:42:09 -06:00
|
|
|
if writeStream.Id.Cmp(expectedId) != 0 {
|
2013-09-11 12:17:45 -05:00
|
|
|
t.Fatal("Wrong data written")
|
|
|
|
}
|
2018-12-27 22:42:09 -06:00
|
|
|
|
2021-02-15 09:26:19 -06:00
|
|
|
readStream, err := odb.NewReadStream(&writeStream.Id)
|
|
|
|
checkFatal(t, err)
|
|
|
|
data, err := ioutil.ReadAll(readStream)
|
2018-12-27 22:42:09 -06:00
|
|
|
if str != string(data) {
|
|
|
|
t.Fatalf("Wrong data read %v != %v", str, string(data))
|
|
|
|
}
|
2014-01-25 15:18:43 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestOdbHash(t *testing.T) {
|
2016-08-27 12:21:05 -05:00
|
|
|
t.Parallel()
|
2015-03-04 13:40:26 -06:00
|
|
|
repo := createTestRepo(t)
|
2015-04-24 05:59:29 -05:00
|
|
|
defer cleanupTestRepo(t, repo)
|
|
|
|
|
2014-01-25 15:18:43 -06:00
|
|
|
_, _ = seedTestRepo(t, repo)
|
|
|
|
|
2021-02-15 09:26:19 -06:00
|
|
|
odb, err := repo.Odb()
|
|
|
|
checkFatal(t, err)
|
2014-01-25 15:18:43 -06:00
|
|
|
|
|
|
|
str := `tree 115fcae49287c82eb55bb275cbbd4556fbed72b7
|
|
|
|
parent 66e1c476199ebcd3e304659992233132c5a52c6c
|
|
|
|
author John Doe <john@doe.com> 1390682018 +0000
|
|
|
|
committer John Doe <john@doe.com> 1390682018 +0000
|
|
|
|
|
2014-05-06 07:19:34 -05:00
|
|
|
Initial commit.`
|
2014-01-25 15:18:43 -06:00
|
|
|
|
2018-07-03 18:43:07 -05:00
|
|
|
for _, data := range [][]byte{[]byte(str), doublePointerBytes()} {
|
2021-02-15 09:26:19 -06:00
|
|
|
oid, err := odb.Hash(data, ObjectCommit)
|
|
|
|
checkFatal(t, err)
|
2014-01-25 15:18:43 -06:00
|
|
|
|
2021-02-15 09:26:19 -06:00
|
|
|
coid, err := odb.Write(data, ObjectCommit)
|
|
|
|
checkFatal(t, err)
|
2014-01-25 15:18:43 -06:00
|
|
|
|
2018-07-03 18:43:07 -05:00
|
|
|
if oid.Cmp(coid) != 0 {
|
|
|
|
t.Fatal("Hash and write Oids are different")
|
|
|
|
}
|
2014-01-25 15:18:43 -06:00
|
|
|
}
|
2014-03-17 23:04:26 -05:00
|
|
|
}
|
2014-05-06 07:19:34 -05:00
|
|
|
|
|
|
|
func TestOdbForeach(t *testing.T) {
|
2016-08-27 12:21:05 -05:00
|
|
|
t.Parallel()
|
2014-05-06 07:19:34 -05:00
|
|
|
repo := createTestRepo(t)
|
2015-04-24 05:59:29 -05:00
|
|
|
defer cleanupTestRepo(t, repo)
|
|
|
|
|
2014-05-06 07:19:34 -05:00
|
|
|
_, _ = seedTestRepo(t, repo)
|
|
|
|
|
|
|
|
odb, err := repo.Odb()
|
|
|
|
checkFatal(t, err)
|
|
|
|
|
|
|
|
expect := 3
|
|
|
|
count := 0
|
|
|
|
err = odb.ForEach(func(id *Oid) error {
|
|
|
|
count++
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
|
|
|
|
checkFatal(t, err)
|
|
|
|
if count != expect {
|
2015-04-24 02:55:06 -05:00
|
|
|
t.Fatalf("Expected %v objects, got %v", expect, count)
|
2014-05-06 07:19:34 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
expect = 1
|
|
|
|
count = 0
|
|
|
|
to_return := errors.New("not really an error")
|
|
|
|
err = odb.ForEach(func(id *Oid) error {
|
|
|
|
count++
|
|
|
|
return to_return
|
|
|
|
})
|
|
|
|
|
|
|
|
if err != to_return {
|
|
|
|
t.Fatalf("Odb.ForEach() did not return the expected error, got %v", err)
|
|
|
|
}
|
|
|
|
}
|
2016-12-22 08:46:13 -06:00
|
|
|
|
|
|
|
func TestOdbWritepack(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
repo := createTestRepo(t)
|
|
|
|
defer cleanupTestRepo(t, repo)
|
|
|
|
|
|
|
|
_, _ = seedTestRepo(t, repo)
|
|
|
|
|
|
|
|
odb, err := repo.Odb()
|
|
|
|
checkFatal(t, err)
|
|
|
|
|
|
|
|
var finalStats TransferProgress
|
|
|
|
writepack, err := odb.NewWritePack(func(stats TransferProgress) ErrorCode {
|
|
|
|
finalStats = stats
|
2020-12-05 09:23:44 -06:00
|
|
|
return ErrorCodeOK
|
2016-12-22 08:46:13 -06:00
|
|
|
})
|
|
|
|
checkFatal(t, err)
|
|
|
|
defer writepack.Free()
|
|
|
|
|
|
|
|
_, err = writepack.Write(outOfOrderPack)
|
|
|
|
checkFatal(t, err)
|
|
|
|
err = writepack.Commit()
|
|
|
|
checkFatal(t, err)
|
|
|
|
|
|
|
|
if finalStats.TotalObjects != 3 {
|
|
|
|
t.Errorf("mismatched transferred objects, expected 3, got %v", finalStats.TotalObjects)
|
|
|
|
}
|
|
|
|
if finalStats.ReceivedObjects != 3 {
|
|
|
|
t.Errorf("mismatched received objects, expected 3, got %v", finalStats.ReceivedObjects)
|
|
|
|
}
|
|
|
|
if finalStats.IndexedObjects != 3 {
|
|
|
|
t.Errorf("mismatched indexed objects, expected 3, got %v", finalStats.IndexedObjects)
|
|
|
|
}
|
|
|
|
}
|
2018-12-22 21:25:52 -06:00
|
|
|
|
|
|
|
func TestOdbBackendLoose(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
repo := createTestRepo(t)
|
|
|
|
defer cleanupTestRepo(t, repo)
|
|
|
|
|
|
|
|
_, _ = seedTestRepo(t, repo)
|
|
|
|
|
|
|
|
odb, err := repo.Odb()
|
|
|
|
checkFatal(t, err)
|
|
|
|
|
|
|
|
looseObjectsDir, err := ioutil.TempDir("", fmt.Sprintf("loose_objects_%s", path.Base(repo.Path())))
|
|
|
|
checkFatal(t, err)
|
|
|
|
defer os.RemoveAll(looseObjectsDir)
|
|
|
|
|
|
|
|
looseObjectsBackend, err := NewOdbBackendLoose(looseObjectsDir, -1, false, 0, 0)
|
|
|
|
checkFatal(t, err)
|
|
|
|
if err := odb.AddBackend(looseObjectsBackend, 999); err != nil {
|
|
|
|
looseObjectsBackend.Free()
|
|
|
|
checkFatal(t, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
str := "hello, world!"
|
|
|
|
|
|
|
|
writeStream, err := odb.NewWriteStream(int64(len(str)), ObjectBlob)
|
|
|
|
checkFatal(t, err)
|
|
|
|
n, err := io.WriteString(writeStream, str)
|
|
|
|
checkFatal(t, err)
|
|
|
|
if n != len(str) {
|
|
|
|
t.Fatalf("Bad write length %v != %v", n, len(str))
|
|
|
|
}
|
|
|
|
|
|
|
|
err = writeStream.Close()
|
|
|
|
checkFatal(t, err)
|
|
|
|
|
|
|
|
expectedId, err := NewOid("30f51a3fba5274d53522d0f19748456974647b4f")
|
|
|
|
checkFatal(t, err)
|
|
|
|
if !writeStream.Id.Equal(expectedId) {
|
|
|
|
t.Fatalf("writeStream.id = %v; want %v", writeStream.Id, expectedId)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = os.Stat(path.Join(looseObjectsDir, expectedId.String()[:2], expectedId.String()[2:]))
|
|
|
|
checkFatal(t, err)
|
|
|
|
}
|