internal/restore: Atomarer Restore ueber Temp-Verzeichnis + Rename, nicht-leeres Ziel ohne -force bricht VOR jeder Beruehrung ab, JSONL- Protokoll jedes Laufs. Drei reale Defekte beim Bau gefunden und behoben: pg_combinebackup braucht Plain- statt Tar-Format (Extraktionsschritt ergaenzt), pg_wal.tar.gz wurde nie verifiziert/wiederhergestellt (BAK-01s Verify jetzt erweitert), Go-exec haengt bei pg_ctl start wegen vererbter Pipes (Testfix: echte Logdatei statt CombinedOutput). Beide Restore-Pfade real auf 131 ueber restore-cli nachgewiesen, inkl. echtem Postgres-Start aus wiederhergestelltem Verzeichnis.
42 lines
1.2 KiB
Go
42 lines
1.2 KiB
Go
package objectbackup
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
// TestRestore_RecoversRealContentFromSnapshot ist Pruefung 1 fuer BAK-03
|
|
// (Objekt-Storage-Teil): Restore auf leerem Zielverzeichnis vollstaendig
|
|
// erfolgreich, real gegen restic geprueft, Dateiinhalt tatsaechlich
|
|
// verglichen (kein Bloss-Existenz-Check).
|
|
func TestRestore_RecoversRealContentFromSnapshot(t *testing.T) {
|
|
cfg := setupTest(t)
|
|
ctx := context.Background()
|
|
|
|
sourceDir := t.TempDir()
|
|
content := []byte("original objektinhalt fuer restore-test")
|
|
if err := os.WriteFile(filepath.Join(sourceDir, "objekt.txt"), content, 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
summary, err := Backup(ctx, cfg, sourceDir)
|
|
if err != nil {
|
|
t.Fatalf("backup: %v", err)
|
|
}
|
|
|
|
targetDir := t.TempDir()
|
|
if err := Restore(ctx, cfg, summary.SnapshotID, targetDir); err != nil {
|
|
t.Fatalf("restore: %v", err)
|
|
}
|
|
|
|
restoredPath := filepath.Join(targetDir, sourceDir, "objekt.txt")
|
|
got, err := os.ReadFile(restoredPath)
|
|
if err != nil {
|
|
t.Fatalf("wiederhergestellte datei lesen (%s): %v", restoredPath, err)
|
|
}
|
|
if string(got) != string(content) {
|
|
t.Fatalf("wiederhergestellter inhalt = %q, want %q", got, content)
|
|
}
|
|
}
|