v1.5.1 增强程序稳定性
This commit is contained in:
63
EdgeDNS/internal/dbs/db_migrate_sqlite_internal_test.go
Normal file
63
EdgeDNS/internal/dbs/db_migrate_sqlite_internal_test.go
Normal file
@@ -0,0 +1,63 @@
|
||||
//go:build plus
|
||||
|
||||
package dbs
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/cockroachdb/pebble"
|
||||
)
|
||||
|
||||
func TestDB_MigrateSQLiteIfNeeded_FlushFailureKeepsSQLite(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
sqlitePath := filepath.Join(dir, "data.db")
|
||||
|
||||
sqliteDB, err := sql.Open("sqlite3", sqlitePath)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
_, err = sqliteDB.Exec(`CREATE TABLE "domains_v2" ("id" INTEGER, "clusterId" INTEGER, "userId" INTEGER, "name" TEXT, "tsig" TEXT, "version" INTEGER)`)
|
||||
if err != nil {
|
||||
if strings.Contains(err.Error(), "requires cgo") || strings.Contains(err.Error(), "CGO_ENABLED=0") {
|
||||
_ = sqliteDB.Close()
|
||||
t.Skip("sqlite3 driver is unavailable in current environment")
|
||||
}
|
||||
_ = sqliteDB.Close()
|
||||
t.Fatal(err)
|
||||
}
|
||||
err = sqliteDB.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
oldFlushRawDB := flushRawDB
|
||||
flushRawDB = func(rawDB *pebble.DB) error {
|
||||
return errors.New("flush failed")
|
||||
}
|
||||
defer func() {
|
||||
flushRawDB = oldFlushRawDB
|
||||
}()
|
||||
|
||||
db := NewDB(sqlitePath)
|
||||
defer func() {
|
||||
_ = db.Close()
|
||||
}()
|
||||
|
||||
err = db.Init()
|
||||
if err == nil {
|
||||
t.Fatal("expected migration error, got nil")
|
||||
}
|
||||
if !strings.Contains(err.Error(), "flush failed") {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
_, err = os.Stat(sqlitePath)
|
||||
if err != nil {
|
||||
t.Fatalf("sqlite source should remain after flush failure: %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user