//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) } }