aboutsummaryrefslogtreecommitdiff
path: root/object/store/packed/refresh_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'object/store/packed/refresh_test.go')
-rw-r--r--object/store/packed/refresh_test.go108
1 files changed, 108 insertions, 0 deletions
diff --git a/object/store/packed/refresh_test.go b/object/store/packed/refresh_test.go
new file mode 100644
index 00000000..e54dc97d
--- /dev/null
+++ b/object/store/packed/refresh_test.go
@@ -0,0 +1,108 @@
+package packed_test
+
+import (
+ "errors"
+ "os"
+ "path/filepath"
+ "testing"
+
+ "lindenii.org/go/furgit/object/id"
+ "lindenii.org/go/furgit/object/store"
+ "lindenii.org/go/furgit/object/store/packed"
+)
+
+func TestRefreshIsExplicit(t *testing.T) {
+ t.Parallel()
+
+ for _, objectFormat := range id.SupportedObjectFormats() {
+ t.Run(objectFormat.String(), func(t *testing.T) {
+ t.Parallel()
+
+ _, prefix, seeded := makeGitPack(t, objectFormat)
+ oids := seeded.All()
+
+ dir := t.TempDir()
+
+ root, err := os.OpenRoot(dir)
+ 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() })
+
+ _, _, err = packedStore.ReadBytesContent(oids[0])
+ if !errors.Is(err, store.ErrObjectNotFound) {
+ t.Fatalf("empty store read error = %v, want ErrObjectNotFound", err)
+ }
+
+ t.Helper()
+
+ base := filepath.Base(prefix)
+ cp(t, prefix+".pack", filepath.Join(dir, base+".pack"))
+ cp(t, prefix+".idx", filepath.Join(dir, base+".idx"))
+
+ // New packs must stay invisible until an explicit Refresh.
+ _, _, err = packedStore.ReadBytesContent(oids[0])
+ if !errors.Is(err, store.ErrObjectNotFound) {
+ t.Fatalf("pre-Refresh read error = %v, want ErrObjectNotFound", err)
+ }
+
+ err = packedStore.Refresh()
+ if err != nil {
+ t.Fatalf("Refresh: %v", err)
+ }
+
+ for _, oid := range oids {
+ _, _, err := packedStore.ReadBytesContent(oid)
+ if err != nil {
+ t.Fatalf("post-Refresh ReadBytesContent(%s): %v", oid, err)
+ }
+ }
+ })
+ }
+}
+
+func TestRefreshRejectsIndexWithoutPack(t *testing.T) {
+ t.Parallel()
+
+ objectFormat := id.ObjectFormatSHA256
+
+ _, prefix, _ := makeGitPack(t, objectFormat)
+
+ dir := t.TempDir()
+ cp(t, prefix+".idx", filepath.Join(dir, filepath.Base(prefix)+".idx"))
+
+ root, err := os.OpenRoot(dir)
+ if err != nil {
+ t.Fatalf("OpenRoot: %v", err)
+ }
+
+ t.Cleanup(func() { _ = root.Close() })
+
+ _, err = packed.New(root, objectFormat)
+ if err == nil {
+ t.Fatalf("New with orphan index: expected error")
+ }
+}
+
+// cp copies one file from src to dst.
+func cp(t *testing.T, src, dst string) {
+ t.Helper()
+
+ data, err := os.ReadFile(src) //nolint:gosec
+ if err != nil {
+ t.Fatalf("ReadFile: %v", err)
+ }
+
+ err = os.WriteFile(dst, data, 0o600) //#nosec G703
+ if err != nil {
+ t.Fatalf("WriteFile: %v", err)
+ }
+}