package repository import ( "os" "path/filepath" "strings" "testing" ) // TestInitDBCorruptedFileIsNotOverwritten 数据文件损坏时,原内容必须以 .corrupt-* 备份留档, // 不允许被随后的空库落盘覆盖(可恢复数据销毁 = P0)。 func TestInitDBCorruptedFileIsNotOverwritten(t *testing.T) { dir := t.TempDir() dataFile := filepath.Join(dir, "lokistack.json") corrupt := "{not valid json" if err := os.WriteFile(dataFile, []byte(corrupt), 0o600); err != nil { t.Fatal(err) } d := &JsonDB{dataFile: dataFile} d.loadFromDisk() // 模拟启动后任意一次落盘:损坏原文若未被移走,这里就会覆盖它 if err := d.doSaveInner(); err != nil { t.Fatalf("空库落盘失败: %v", err) } entries, err := os.ReadDir(dir) if err != nil { t.Fatal(err) } backedUp := false for _, e := range entries { if strings.HasPrefix(e.Name(), "lokistack.json.corrupt-") { content, readErr := os.ReadFile(filepath.Join(dir, e.Name())) if readErr == nil && string(content) == corrupt { backedUp = true } } } if !backedUp { t.Fatalf("损坏原文未被完整备份留档: %v", entries) } }