aboutsummaryrefslogtreecommitdiff
path: root/objectstore/packed/helpers_test.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-02-21 05:35:12 +0800
committerGravatar Runxi Yu2026-02-21 11:15:18 +0800
commitae879b8cf5a87199802a33d6b15c76afafa8002b (patch)
treea93e9486a9610b78823e157c68b75e0724366217 /objectstore/packed/helpers_test.go
parentcache/lru: Add basic LRU (diff)
signatureNo signature
objectstore/packed: Add initial pack reading support
Diffstat (limited to 'objectstore/packed/helpers_test.go')
-rw-r--r--objectstore/packed/helpers_test.go96
1 files changed, 96 insertions, 0 deletions
diff --git a/objectstore/packed/helpers_test.go b/objectstore/packed/helpers_test.go
new file mode 100644
index 00000000..5af44f66
--- /dev/null
+++ b/objectstore/packed/helpers_test.go
@@ -0,0 +1,96 @@
+package packed_test
+
+import (
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "strconv"
+ "strings"
+ "testing"
+
+ "codeberg.org/lindenii/furgit/internal/testgit"
+ "codeberg.org/lindenii/furgit/objectheader"
+ "codeberg.org/lindenii/furgit/objectid"
+ "codeberg.org/lindenii/furgit/objectstore/packed"
+ "codeberg.org/lindenii/furgit/objecttype"
+)
+
+func openPackedStore(t *testing.T, repoPath string, algo objectid.Algorithm) *packed.Store {
+ t.Helper()
+ packPath := filepath.Join(repoPath, "objects", "pack")
+ root, err := os.OpenRoot(packPath)
+ if err != nil {
+ t.Fatalf("OpenRoot(%q): %v", packPath, err)
+ }
+ t.Cleanup(func() { _ = root.Close() })
+
+ store, err := packed.New(root, algo)
+ if err != nil {
+ t.Fatalf("packed.New: %v", err)
+ }
+ return store
+}
+
+func mustReadAllAndClose(t *testing.T, reader io.ReadCloser) []byte {
+ t.Helper()
+ data, err := io.ReadAll(reader)
+ if err != nil {
+ _ = reader.Close()
+ t.Fatalf("ReadAll: %v", err)
+ }
+ if err := reader.Close(); err != nil {
+ t.Fatalf("Close: %v", err)
+ }
+ return data
+}
+
+func expectedRawObject(t *testing.T, testRepo *testgit.TestRepo, id objectid.ObjectID) (objecttype.Type, []byte, []byte) {
+ t.Helper()
+
+ typeName := testRepo.Run(t, "cat-file", "-t", id.String())
+ ty, ok := objecttype.ParseName(typeName)
+ if !ok {
+ t.Fatalf("ParseName(%q) failed", typeName)
+ }
+ body := testRepo.CatFile(t, typeName, id)
+ header, ok := objectheader.Encode(ty, int64(len(body)))
+ if !ok {
+ t.Fatalf("objectheader.Encode failed")
+ }
+
+ raw := make([]byte, len(header)+len(body))
+ copy(raw, header)
+ copy(raw[len(header):], body)
+ return ty, body, raw
+}
+
+func createPackedFixtureRepo(t *testing.T, algo objectid.Algorithm) (*testgit.TestRepo, []objectid.ObjectID) {
+ t.Helper()
+
+ testRepo := testgit.NewBareRepo(t, algo)
+ blobID, treeID, commitID := testRepo.MakeCommit(t, "packed store base commit")
+ testRepo.Run(t, "update-ref", "refs/heads/main", commitID.String())
+ tagID := testRepo.TagAnnotated(t, "v1.0.0", commitID, "packed-store-tag")
+
+ parent := commitID
+ for i := range 24 {
+ content := "common-prefix\n" + strings.Repeat("line-"+strconv.Itoa(i%3)+"\n", 256) + fmt.Sprintf("tail-%d\n", i)
+ nextBlob, nextTree := testRepo.MakeSingleFileTree(t, fmt.Sprintf("file-%02d.txt", i), []byte(content))
+ nextCommit := testRepo.CommitTree(t, nextTree, fmt.Sprintf("commit-%02d", i), parent)
+ testRepo.Run(t, "update-ref", "refs/heads/main", nextCommit.String())
+ parent = nextCommit
+
+ _ = nextBlob
+ _ = nextTree
+ }
+
+ testRepo.Repack(t, "-a", "-d", "-f", "--window=64", "--depth=64")
+ return testRepo, []objectid.ObjectID{
+ blobID,
+ treeID,
+ commitID,
+ tagID,
+ parent,
+ }
+}