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) } }