64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
//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)
|
|
}
|
|
}
|