//nolint:testpackage // exercises the unexported copyDatabase helper package snapshot import ( "context" "os" "path/filepath" "syscall" "testing" "github.com/spf13/afero" "sneak.berlin/go/vaultik/internal/database" ) // TestCopyDatabaseExportCopyMode verifies that the exported snapshot // database copy is created owner-only (0600), even under a lenient 022 // umask that would otherwise leave a fresh file world-readable. // //nolint:paralleltest // syscall.Umask is process-global; parallel tests would clash func TestCopyDatabaseExportCopyMode(t *testing.T) { restore := syscall.Umask(0o022) defer syscall.Umask(restore) ctx := context.Background() dir := t.TempDir() src := filepath.Join(dir, "index.sqlite") db, err := database.New(ctx, src) if err != nil { t.Fatalf("creating source index: %v", err) } err = db.Close() if err != nil { t.Fatalf("closing source index: %v", err) } dst := filepath.Join(dir, "snapshot.db") sm := &SnapshotManager{fs: afero.NewOsFs()} err = sm.copyDatabase(ctx, src, dst) if err != nil { t.Fatalf("copyDatabase: %v", err) } info, err := os.Stat(dst) if err != nil { t.Fatalf("stat export copy: %v", err) } got := info.Mode().Perm() if got != 0o600 { t.Fatalf("export copy permissions = %#o, want %#o", got, 0o600) } }