diff options
| author | 2026-02-21 15:39:10 +0800 | |
|---|---|---|
| committer | 2026-02-21 15:39:10 +0800 | |
| commit | c9eefd50557a5436da84e0a38ee96c812d453336 (patch) | |
| tree | a64a5d67a727e6e2ec54b426179e473f4b6806fc /repository/write_loose_test.go | |
| parent | repository, {ref,object}store: Make stores own their roots (diff) | |
| signature | No signature | |
repository: Add loose object writing v0.1.20
Diffstat (limited to 'repository/write_loose_test.go')
| -rw-r--r-- | repository/write_loose_test.go | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/repository/write_loose_test.go b/repository/write_loose_test.go new file mode 100644 index 00000000..a09cbbde --- /dev/null +++ b/repository/write_loose_test.go @@ -0,0 +1,145 @@ +package repository_test + +import ( + "bytes" + "io" + "testing" + + "codeberg.org/lindenii/furgit/internal/testgit" + "codeberg.org/lindenii/furgit/objectid" + "codeberg.org/lindenii/furgit/objecttype" + "codeberg.org/lindenii/furgit/repository" +) + +func TestWriteLooseBytesContent(t *testing.T) { + t.Parallel() + + testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper + repoHarness := testgit.NewRepo(t, testgit.RepoOptions{ + ObjectFormat: algo, + Bare: true, + RefFormat: "files", + }) + + repo, err := repository.Open(repoHarness.Dir()) + if err != nil { + t.Fatalf("repository.Open: %v", err) + } + defer func() { _ = repo.Close() }() + + content := []byte("write-loose-bytes-content\n") + gotID, err := repo.WriteLooseBytesContent(objecttype.TypeBlob, content) + if err != nil { + t.Fatalf("WriteLooseBytesContent: %v", err) + } + + wantID := repoHarness.HashObject(t, "blob", content) + if gotID != wantID { + t.Fatalf("WriteLooseBytesContent id = %s, want %s", gotID, wantID) + } + + ty, gotContent, err := repo.ReadStoredBytesContent(gotID) + if err != nil { + t.Fatalf("ReadStoredBytesContent: %v", err) + } + if ty != objecttype.TypeBlob { + t.Fatalf("ReadStoredBytesContent type = %v, want %v", ty, objecttype.TypeBlob) + } + if !bytes.Equal(gotContent, content) { + t.Fatalf("ReadStoredBytesContent content mismatch") + } + }) +} + +func TestWriteLooseWriterContent(t *testing.T) { + t.Parallel() + + testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper + repoHarness := testgit.NewRepo(t, testgit.RepoOptions{ + ObjectFormat: algo, + Bare: true, + RefFormat: "files", + }) + + repo, err := repository.Open(repoHarness.Dir()) + if err != nil { + t.Fatalf("repository.Open: %v", err) + } + defer func() { _ = repo.Close() }() + + content := []byte("write-loose-writer-content\n") + writer, finalize, err := repo.WriteLooseWriterContent(objecttype.TypeBlob, int64(len(content))) + if err != nil { + t.Fatalf("WriteLooseWriterContent: %v", err) + } + + if _, err := writer.Write(content[:6]); err != nil { + t.Fatalf("WriteLooseWriterContent first write: %v", err) + } + if _, err := writer.Write(content[6:]); err != nil { + t.Fatalf("WriteLooseWriterContent second write: %v", err) + } + if err := writer.Close(); err != nil { + t.Fatalf("WriteLooseWriterContent close: %v", err) + } + gotID, err := finalize() + if err != nil { + t.Fatalf("WriteLooseWriterContent finalize: %v", err) + } + + wantID := repoHarness.HashObject(t, "blob", content) + if gotID != wantID { + t.Fatalf("WriteLooseWriterContent id = %s, want %s", gotID, wantID) + } + }) +} + +func TestWriteLooseFull(t *testing.T) { + t.Parallel() + + testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper + repoHarness := testgit.NewRepo(t, testgit.RepoOptions{ + ObjectFormat: algo, + Bare: true, + RefFormat: "files", + }) + _, _, commitID := repoHarness.MakeCommit(t, "write-loose-full") + + repo, err := repository.Open(repoHarness.Dir()) + if err != nil { + t.Fatalf("repository.Open: %v", err) + } + defer func() { _ = repo.Close() }() + + raw, err := repo.ReadStoredBytesFull(commitID) + if err != nil { + t.Fatalf("ReadStoredBytesFull: %v", err) + } + + idFromBytes, err := repo.WriteLooseBytesFull(raw) + if err != nil { + t.Fatalf("WriteLooseBytesFull: %v", err) + } + if idFromBytes != commitID { + t.Fatalf("WriteLooseBytesFull id = %s, want %s", idFromBytes, commitID) + } + + writer, finalize, err := repo.WriteLooseWriterFull() + if err != nil { + t.Fatalf("WriteLooseWriterFull: %v", err) + } + if _, err := io.Copy(writer, bytes.NewReader(raw)); err != nil { + t.Fatalf("WriteLooseWriterFull copy: %v", err) + } + if err := writer.Close(); err != nil { + t.Fatalf("WriteLooseWriterFull close: %v", err) + } + idFromWriter, err := finalize() + if err != nil { + t.Fatalf("WriteLooseWriterFull finalize: %v", err) + } + if idFromWriter != commitID { + t.Fatalf("WriteLooseWriterFull id = %s, want %s", idFromWriter, commitID) + } + }) +} |
