ref: 5ce52142bf5ef4a7c845018000b537f01c8bbcca
dir: /obj_blob_test.go/
package furgit
import (
"bytes"
"fmt"
"testing"
)
func TestBlobRead(t *testing.T) {
repoPath, cleanup := setupTestRepo(t)
defer cleanup()
testData := []byte("Hello, Furgit!\nThis is test blob data.")
gitHash := gitHashObject(t, repoPath, "blob", testData)
repo, err := OpenRepository(repoPath)
if err != nil {
t.Fatalf("OpenRepository failed: %v", err)
}
defer func() {
_ = repo.Close()
}()
hash, _ := repo.ParseHash(gitHash)
obj, err := repo.ReadObject(hash)
if err != nil {
t.Fatalf("ReadObject failed: %v", err)
}
blob, ok := obj.(*StoredBlob)
if !ok {
t.Fatalf("expected *StoredBlob, got %T", obj)
}
if !bytes.Equal(blob.Data, testData) {
t.Errorf("Data mismatch: got %q, want %q", blob.Data, testData)
}
if blob.Hash() != hash {
t.Errorf("Hash(): got %s, want %s", blob.Hash(), hash)
}
if blob.ObjectType() != ObjectTypeBlob {
t.Errorf("ObjectType(): got %d, want %d", blob.ObjectType(), ObjectTypeBlob)
}
gitData := gitCatFile(t, repoPath, "blob", gitHash)
if !bytes.Equal(blob.Data, gitData) {
t.Error("furgit data doesn't match git data")
}
}
func TestBlobWrite(t *testing.T) {
repoPath, cleanup := setupTestRepo(t)
defer cleanup()
repo, err := OpenRepository(repoPath)
if err != nil {
t.Fatalf("OpenRepository failed: %v", err)
}
defer func() {
_ = repo.Close()
}()
testData := []byte("Test data written by furgit")
blob := &Blob{Data: testData}
hash, err := repo.WriteLooseObject(blob)
if err != nil {
t.Fatalf("WriteLooseObject failed: %v", err)
}
gitType := string(gitCatFile(t, repoPath, "-t", hash.String()))
if gitType != "blob" {
t.Errorf("git type: got %q, want %q", gitType, "blob")
}
gitData := gitCatFile(t, repoPath, "blob", hash.String())
if !bytes.Equal(gitData, testData) {
t.Error("git data doesn't match written data")
}
gitSize := string(gitCatFile(t, repoPath, "-s", hash.String()))
if gitSize != fmt.Sprintf("%d", len(testData)) {
t.Errorf("git size: got %s, want %d", gitSize, len(testData))
}
}
func TestBlobRoundtrip(t *testing.T) {
repoPath, cleanup := setupTestRepo(t)
defer cleanup()
repo, err := OpenRepository(repoPath)
if err != nil {
t.Fatalf("OpenRepository failed: %v", err)
}
defer func() {
_ = repo.Close()
}()
testData := []byte("Roundtrip test data")
blob := &Blob{Data: testData}
hash, err := repo.WriteLooseObject(blob)
if err != nil {
t.Fatalf("WriteLooseObject failed: %v", err)
}
obj, err := repo.ReadObject(hash)
if err != nil {
t.Fatalf("ReadObject failed: %v", err)
}
readBlob, ok := obj.(*StoredBlob)
if !ok {
t.Fatalf("expected *StoredBlob, got %T", obj)
}
if !bytes.Equal(readBlob.Data, testData) {
t.Error("roundtrip data mismatch")
}
}