aboutsummaryrefslogtreecommitdiff
path: root/object/store/packed/writer_test.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-06-12 18:41:58 +0000
committerGravatar Runxi Yu2026-06-12 18:41:58 +0000
commit7faa841b581dbbacf563a6ca3167efbfd697d37c (patch)
treeab54845bcf708b1099f88a339d18bdf1cdb6f23f /object/store/packed/writer_test.go
parentobject/store/packed: Add missing t.Helper (diff)
object/store/packed: Add basic ingestion
Diffstat (limited to 'object/store/packed/writer_test.go')
-rw-r--r--object/store/packed/writer_test.go105
1 files changed, 105 insertions, 0 deletions
diff --git a/object/store/packed/writer_test.go b/object/store/packed/writer_test.go
new file mode 100644
index 00000000..8227caa7
--- /dev/null
+++ b/object/store/packed/writer_test.go
@@ -0,0 +1,105 @@
+package packed_test
+
+import (
+ "bytes"
+ "os"
+ "testing"
+
+ "lindenii.org/go/furgit/internal/testgit"
+ "lindenii.org/go/furgit/object/id"
+ "lindenii.org/go/furgit/object/store"
+ "lindenii.org/go/furgit/object/store/packed"
+ "lindenii.org/go/furgit/object/typ"
+)
+
+// TestWritePack verifies that writing a pack through the store
+// makes its objects readable without a manual refresh.
+func TestWritePack(t *testing.T) {
+ t.Parallel()
+
+ for _, objectFormat := range id.SupportedObjectFormats() {
+ t.Run(objectFormat.String(), func(t *testing.T) {
+ t.Parallel()
+
+ repo, err := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: objectFormat})
+ if err != nil {
+ t.Fatalf("NewRepo: %v", err)
+ }
+
+ seeded, err := repo.SeedHistory(t)
+ if err != nil {
+ t.Fatalf("SeedHistory: %v", err)
+ }
+
+ stream, err := repo.PackObjectsStdout(t, seeded.All(), testgit.PackObjectsStdoutOptions{
+ Revs: false,
+ Thin: false,
+ Exclude: nil,
+ })
+ if err != nil {
+ t.Fatalf("PackObjectsStdout: %v", err)
+ }
+
+ packedStore := openEmptyStore(t, objectFormat)
+
+ err = packedStore.WritePack(bytes.NewReader(stream), store.PackWriteOptions{
+ ThinBase: nil,
+ Progress: nil,
+ })
+ if err != nil {
+ t.Fatalf("WritePack: %v", err)
+ }
+
+ probes := []struct {
+ ty typ.Type
+ oid id.ObjectID
+ }{
+ {typ.Blob, seeded.Blobs[0]},
+ {typ.Tree, seeded.Trees[0]},
+ {typ.Commit, seeded.Commits[len(seeded.Commits)-1]},
+ {typ.Tag, seeded.Tags[0]},
+ }
+
+ for _, probe := range probes {
+ want, err := repo.CatFile(t, probe.ty, probe.oid)
+ if err != nil {
+ t.Fatalf("CatFile(%s): %v", probe.oid, err)
+ }
+
+ ty, content, err := packedStore.ReadBytesContent(probe.oid)
+ if err != nil {
+ t.Fatalf("ReadBytesContent(%s): %v", probe.oid, err)
+ }
+
+ if ty != probe.ty {
+ t.Fatalf("ReadBytesContent(%s) type = %v, want %v", probe.oid, ty, probe.ty)
+ }
+
+ if !bytes.Equal(content, want) {
+ t.Fatalf("ReadBytesContent(%s) content mismatch", probe.oid)
+ }
+ }
+ })
+ }
+}
+
+// openEmptyStore opens a packed store over a fresh empty directory.
+func openEmptyStore(t *testing.T, objectFormat id.ObjectFormat) *packed.Packed {
+ t.Helper()
+
+ root, err := os.OpenRoot(t.TempDir())
+ if err != nil {
+ t.Fatalf("OpenRoot: %v", err)
+ }
+
+ t.Cleanup(func() { _ = root.Close() })
+
+ packedStore, err := packed.New(root, objectFormat)
+ if err != nil {
+ t.Fatalf("New: %v", err)
+ }
+
+ t.Cleanup(func() { _ = packedStore.Close() })
+
+ return packedStore
+}