fix: 修复写队列 busy 恢复、关闭安全、备份与配置构建问题
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestFailingMigrationReusesBackup(t *testing.T) {
|
||||
t.Parallel()
|
||||
dir := t.TempDir()
|
||||
|
||||
db, err := Open(dir, "FULL")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
_ = db.Close()
|
||||
|
||||
w, err := OpenWriter(dir, "FULL")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer func() { _ = w.Close() }()
|
||||
|
||||
pending := []migrationFile{{
|
||||
version: 9999,
|
||||
name: "9999_fail.sql",
|
||||
body: "THIS IS NOT VALID SQL",
|
||||
}}
|
||||
if err := applyPending(w, dir, true, pending); err == nil {
|
||||
t.Fatal("expected first failing migration to error")
|
||||
}
|
||||
backupDir := filepath.Join(dir, "backup")
|
||||
first, err := os.ReadDir(backupDir)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(first) != 1 || first[0].Name() != "pre-migrate-v2-to-v9999.db" {
|
||||
t.Fatalf("first backups=%v", dirNames(first))
|
||||
}
|
||||
|
||||
if err := applyPending(w, dir, true, pending); err == nil {
|
||||
t.Fatal("expected second failing migration to error")
|
||||
}
|
||||
second, err := os.ReadDir(backupDir)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(second) != 1 || second[0].Name() != first[0].Name() {
|
||||
t.Fatalf("second backups=%v first=%v", dirNames(second), dirNames(first))
|
||||
}
|
||||
info1, err := first[0].Info()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
info2, err := second[0].Info()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if info2.ModTime().After(info1.ModTime().Add(time.Second)) && info2.Size() != info1.Size() {
|
||||
// 复用同一文件即可;时钟精度下允许 mtime 相同。
|
||||
t.Logf("mtime first=%s second=%s", info1.ModTime(), info2.ModTime())
|
||||
}
|
||||
}
|
||||
|
||||
func dirNames(entries []os.DirEntry) []string {
|
||||
out := make([]string, 0, len(entries))
|
||||
for _, e := range entries {
|
||||
out = append(out, e.Name())
|
||||
}
|
||||
return out
|
||||
}
|
||||
Reference in New Issue
Block a user