39 lines
1.2 KiB
Go
39 lines
1.2 KiB
Go
package libraryrelease
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// failingObserver 模拟"预备份引用无法持久化":真实场景是治理库写入失败。
|
|
type failingObserver struct{ stageLog }
|
|
|
|
func (f *failingObserver) BackupPrepared(context.Context, BackupRef) error {
|
|
return errors.New("persist backup ref failed")
|
|
}
|
|
|
|
// 预备份引用持久化失败时必须零写入:没有可恢复基线就不许碰目标。
|
|
func TestRunRefusesToWriteWhenBackupReferenceCannotBePersisted(t *testing.T) {
|
|
target := &fakeTarget{}
|
|
backups := &fakeBackups{}
|
|
recorder := &failingObserver{}
|
|
outcome := Run(context.Background(), request(time.Now()), target, backups, recorder)
|
|
if outcome.State == "succeeded" {
|
|
t.Fatalf("state = %s, must not succeed without a recoverable backup", outcome.State)
|
|
}
|
|
if len(target.applied) != 0 {
|
|
t.Fatalf("applied stages = %v, must be zero when the backup reference is lost", target.applied)
|
|
}
|
|
if target.restored != 0 {
|
|
t.Fatalf("restore must not run when nothing was written (restored=%d)", target.restored)
|
|
}
|
|
if !recorder.has("prebackup:failed") {
|
|
t.Fatalf("stage log = %v, want prebackup:failed", recorder.entries)
|
|
}
|
|
if outcome.Recovery == "" {
|
|
t.Fatal("failed outcome must explain how to recover")
|
|
}
|
|
}
|