package datasets import ( "os" "path/filepath" "testing" "time" ) func TestLocalStoreBeginWriteResume(t *testing.T) { dir := t.TempDir() store, err := NewLocalStore(dir, "gfs-test") if err != nil { t.Fatalf("NewLocalStore: %v", err) } epoch := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC) h, err := store.BeginWrite(epoch) if err != nil { t.Fatalf("BeginWrite: %v", err) } if err := os.WriteFile(h.Path(), []byte("partial"), 0o644); err != nil { t.Fatalf("write partial: %v", err) } if err := h.Manifest().Mark("step000-A"); err != nil { t.Fatalf("mark: %v", err) } // Re-open should see the previous manifest entry. h2, err := store.BeginWrite(epoch) if err != nil { t.Fatalf("BeginWrite resume: %v", err) } if !h2.Manifest().Has("step000-A") { t.Errorf("resumed manifest missing step000-A; units = %v", h2.Manifest().Units()) } // Commit promotes the temp file and removes the manifest. if err := h2.Commit(); err != nil { t.Fatalf("Commit: %v", err) } if !store.Exists(epoch) { t.Errorf("Exists after commit returned false") } if _, err := os.Stat(filepath.Join(dir, store.manifestPath(epoch))); !os.IsNotExist(err) { t.Errorf("manifest should be removed, got err=%v", err) } // Listing finds the committed epoch. epochs, err := store.List() if err != nil { t.Fatalf("List: %v", err) } if len(epochs) != 1 || !epochs[0].Equal(epoch) { t.Errorf("List = %v, want [%v]", epochs, epoch) } // Remove cleans up. if err := store.Remove(epoch); err != nil { t.Fatalf("Remove: %v", err) } if store.Exists(epoch) { t.Errorf("Exists after remove returned true") } } func TestLocalStoreAbort(t *testing.T) { dir := t.TempDir() store, _ := NewLocalStore(dir, "gfs-test") epoch := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC) h, _ := store.BeginWrite(epoch) os.WriteFile(h.Path(), []byte("x"), 0o644) h.Manifest().Mark("step000-A") if err := h.Abort(); err != nil { t.Fatalf("Abort: %v", err) } if _, err := os.Stat(h.Path()); !os.IsNotExist(err) { t.Errorf("temp file should be removed after abort, got %v", err) } }