check / check (push) Canceled after 0s
The default database URL asked for WAL mode with `_journal_mode` and `_busy_timeout`, which the SQLite driver does not read, so the database ran in rollback-journal mode. The default now uses the driver's `_pragma=journal_mode(WAL)` and `_pragma=busy_timeout(5000)` parameters, in one constant that both the config default and the database fallback use. The database no longer sets its own busy timeout after opening, so the URL's value applies. A new test opens a file database with those parameters through db.New and checks the journal mode and busy timeout. README.md's database text now matches, and an in-memory test database drops the same ignored parameter. Model: opus-5-5
76 lines
1.6 KiB
Go
76 lines
1.6 KiB
Go
package db_test
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"go.uber.org/fx/fxtest"
|
|
"sneak.berlin/go/neoirc/internal/config"
|
|
"sneak.berlin/go/neoirc/internal/db"
|
|
"sneak.berlin/go/neoirc/internal/globals"
|
|
"sneak.berlin/go/neoirc/internal/logger"
|
|
)
|
|
|
|
const wantBusyTimeoutMS = 5000
|
|
|
|
// TestDefaultDBURLSetsWALAndBusyTimeout opens a file database
|
|
// with the default URL's parameters the way the server does,
|
|
// and checks the journal mode and busy timeout it ends up with.
|
|
func TestDefaultDBURLSetsWALAndBusyTimeout(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
_, params, _ := strings.Cut(config.DefaultDBURL, "?")
|
|
dbURL := "file://" + filepath.Join(t.TempDir(), "state.db") +
|
|
"?" + params
|
|
|
|
lifecycle := fxtest.NewLifecycle(t)
|
|
|
|
log, err := logger.New(lifecycle, logger.Params{
|
|
Globals: &globals.Globals{},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
database, err := db.New(lifecycle, db.Params{
|
|
Logger: log,
|
|
Config: &config.Config{DBURL: dbURL},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
lifecycle.RequireStart()
|
|
t.Cleanup(lifecycle.RequireStop)
|
|
|
|
var journalMode string
|
|
|
|
err = database.GetDB().QueryRowContext(
|
|
t.Context(), "PRAGMA journal_mode",
|
|
).Scan(&journalMode)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if journalMode != "wal" {
|
|
t.Errorf("journal_mode = %q, want %q", journalMode, "wal")
|
|
}
|
|
|
|
var busyTimeout int
|
|
|
|
err = database.GetDB().QueryRowContext(
|
|
t.Context(), "PRAGMA busy_timeout",
|
|
).Scan(&busyTimeout)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if busyTimeout != wantBusyTimeoutMS {
|
|
t.Errorf(
|
|
"busy_timeout = %d, want %d",
|
|
busyTimeout, wantBusyTimeoutMS,
|
|
)
|
|
}
|
|
}
|