Scert/backend/internal/cli/sqlite_snapshot_concurrency_test.go
xuans 0b74886c45 修复Linux启动就绪通知并隔离命令行测试目录
通过本机Unix套接字报告HTTPS监听状态,同步服务配置与安装模板,保持初始化业务就绪隔离。补充生命周期回归并修复旧CLI测试误用正式目录的问题。更新Linux原生测试证据,明确新候选尚未部署、生产验收未放行。
2026-10-02 12:20:47 +08:00

58 lines
1.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cli
import (
"database/sql"
"os"
"path/filepath"
"testing"
"git.pcux.cn/xuans/Scert/backend/internal/database"
)
func TestSQLiteSnapshotWhileWriterIsActive(t *testing.T) {
cfg := isolatedCLIConfig(t.TempDir())
db, err := database.Open(t.Context(), cfg.Database)
if err != nil {
t.Fatal(err)
}
defer db.Close()
if _, err := db.DB.ExecContext(t.Context(), "CREATE TABLE snapshot_probe (id INTEGER PRIMARY KEY, value INTEGER); INSERT INTO snapshot_probe VALUES (1, 7)"); err != nil {
t.Fatal(err)
}
if info, err := os.Stat(cfg.Database.DSN + "-wal"); err != nil || info.Size() == 0 {
t.Fatalf("没有实际生成 WAL 数据:%v", err)
}
writer, err := db.DB.BeginTx(t.Context(), nil)
if err != nil {
t.Fatal(err)
}
defer writer.Rollback()
if _, err := writer.ExecContext(t.Context(), "UPDATE snapshot_probe SET value = 99 WHERE id = 1"); err != nil {
t.Fatal(err)
}
for _, name := range []string{"uncommitted", "committed"} {
t.Run(name, func(t *testing.T) {
want := 7
if name == "committed" {
if err := writer.Commit(); err != nil {
t.Fatal(err)
}
want = 99
}
output := filepath.Join(t.TempDir(), "snapshot.db")
if err := backupSQLiteDatabase(t.Context(), cfg, output); err != nil {
t.Fatalf("活动文件库快照失败:%v", err)
}
snapshot, err := sql.Open("sqlite", output)
if err != nil {
t.Fatal(err)
}
defer snapshot.Close()
var value int
if err := snapshot.QueryRowContext(t.Context(), "SELECT value FROM snapshot_probe WHERE id = 1").Scan(&value); err != nil || value != want {
t.Fatalf("快照没有保存对应提交状态:得到 %d,期望 %d,错误=%v", value, want, err)
}
})
}
}