package vaultik_test import ( "context" "io/fs" "os" "path/filepath" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "sneak.berlin/go/vaultik/internal/log" "sneak.berlin/go/vaultik/internal/snapshot" ) // TestNukeRemoteLeavesNoFiles checks that remote nuke leaves no file // under a file:// destination, including the `.partial` files uploads // killed part-way leave next to a snapshot's metadata and next to where a // blob would have been. func TestNukeRemoteLeavesNoFiles(t *testing.T) { log.Initialize(log.Config{}) t.Parallel() ctx := context.Background() storeDir := filepath.Join(t.TempDir(), "store") v, repos, _ := backUpToFileDestination(ctx, t, storeDir) snapshots, err := repos.Snapshots.ListRecent(ctx, listRecentTestLimit) require.NoError(t, err) require.Len(t, snapshots, 1) snapshotKey := snapshot.RemoteSnapshotKey(snapshots[0].ID.String()) hash := testBlobHashA leftovers := []string{ filepath.Join(storeDir, "metadata", snapshotKey, "db.zst.age-123456.partial"), filepath.Join(storeDir, "blobs", hash[:2], hash[2:4], hash+"-123456.partial"), } for _, leftover := range leftovers { require.NoError(t, os.MkdirAll(filepath.Dir(leftover), 0o750)) require.NoError(t, os.WriteFile(leftover, []byte("half an upload"), 0o600)) } require.NoError(t, v.NukeRemote(true)) var files []string err = filepath.WalkDir(storeDir, func(path string, entry fs.DirEntry, err error) error { if err != nil { return err } if !entry.IsDir() { files = append(files, path) } return nil }) require.NoError(t, err) assert.Empty(t, files) }