fix(backup): retain staging cleanup capability

This commit is contained in:
2026-08-18 10:50:56 +02:00
parent d43738eeae
commit 5f9a3ae066
9 changed files with 349 additions and 27 deletions
+62
View File
@@ -149,6 +149,68 @@ func TestCreateCanonicalNewPrivateFileProvidesPrivateStreamingWriter(t *testing.
}
}
func TestPrivateDirectoryCreatesAndRemovesStreamingRegularFile(t *testing.T) {
temporaryRoot, err := filepath.EvalSymlinks(os.TempDir())
if err != nil {
t.Fatal(err)
}
root, err := os.MkdirTemp(temporaryRoot, "tht-safeio-stream-")
if err != nil {
t.Fatal(err)
}
t.Cleanup(func() { _ = os.RemoveAll(root) })
if err := ProtectPrivateDirectory(root); err != nil {
t.Fatal(err)
}
directory, found, err := OpenPrivateDirectory(root, true)
if err != nil || !found {
t.Fatalf("OpenPrivateDirectory() = found %v, err %v", found, err)
}
defer directory.Close()
file, created, err := directory.CreateRegularFile("archive-stream.zip")
if err != nil || !created || file == nil {
t.Fatalf("CreateRegularFile() = file %v, created %v, err %v", file, created, err)
}
if _, err := file.Write([]byte("private archive")); err != nil {
t.Fatal(err)
}
if err := file.Sync(); err != nil {
t.Fatal(err)
}
if _, err := file.Seek(0, io.SeekStart); err != nil {
t.Fatal(err)
}
streamed := make([]byte, len("private archive"))
if _, err := io.ReadFull(file, streamed); err != nil {
t.Fatal(err)
}
if string(streamed) != "private archive" {
t.Fatalf("streamed contents = %q, want %q", streamed, "private archive")
}
if err := file.Close(); err != nil {
t.Fatal(err)
}
removed, err := directory.RemoveRegular("archive-stream.zip")
if err != nil || !removed {
t.Fatalf("RemoveRegular() = removed %v, err %v", removed, err)
}
if created, err := directory.CreateRegular("existing.zip", []byte("existing")); err != nil || !created {
t.Fatalf("CreateRegular(existing.zip) = created %v, err %v", created, err)
}
if file, created, err := directory.CreateRegularFile("existing.zip"); err != nil || created || file != nil {
t.Fatalf("CreateRegularFile(existing.zip) = file %v, created %v, err %v", file, created, err)
}
if created, err := directory.CreateRegular("target.zip", []byte("target")); err != nil || !created {
t.Fatalf("CreateRegular(target.zip) = created %v, err %v", created, err)
}
testsupport.SymlinkOrSkip(t, filepath.Join(root, "target.zip"), filepath.Join(root, "linked.zip"))
if file, created, err := directory.CreateRegularFile("linked.zip"); !errors.Is(err, ErrUnsafeFile) || created || file != nil {
t.Fatalf("CreateRegularFile(linked.zip) = file %v, created %v, err %v", file, created, err)
}
}
func TestPreflightPrivateDirectoryAllowsOnlyAMissingFinalComponentWithoutMutation(t *testing.T) {
temporaryRoot, err := filepath.EvalSymlinks(os.TempDir())
if err != nil {