diff options
author | EuAndreh <eu@euandre.org> | 2024-08-12 16:38:19 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2024-08-14 16:57:23 -0300 |
commit | 5515fe0b549624a6e36ddc6d3889d833e95f3c6c (patch) | |
tree | 3911532619e656389886b548e265fc58fd75f68a | |
parent | Build with "go tool" and hackishly bundle code from same package into one fil... (diff) | |
download | golite-5515fe0b549624a6e36ddc6d3889d833e95f3c6c.tar.gz golite-5515fe0b549624a6e36ddc6d3889d833e95f3c6c.tar.xz |
tests/golite.go: Run tests
Use in-memory databases over disk: decrease test time from minutes to
seconds.
-rw-r--r-- | Makefile | 69 | ||||
-rw-r--r-- | tests/golite.go | 493 | ||||
-rw-r--r-- | tests/libbuild.go | 19 |
3 files changed, 297 insertions, 284 deletions
@@ -33,39 +33,36 @@ all: include deps.mk -cgo-sources = \ - src/_cgo_export.c \ - src/_cgo_export.h \ - src/_cgo_main.c \ - src/_cgo_gotypes.go \ - src/_cgo_import.go \ - src/$(NAME).cgo1.go \ - src/$(NAME).cgo2.c \ - -libdeps = \ +cgo.go = \ src/_cgo_import.go \ src/_cgo_gotypes.go \ src/$(NAME).cgo1.go \ -objects = \ - src/$(NAME).a \ - tests/$(NAME).a \ - tests/main.a \ - $(cgo-sources) \ - src/_cgo_.o \ +cgo.c = \ + src/_cgo_export.c \ + src/$(NAME).cgo2.c \ + +cgo.o = $(cgo.c:.c=.o) sources = \ src/$(NAME).go \ derived-assets = \ - $(objects) \ + src/_cgo_.o \ + $(cgo.go) \ + $(cgo.c) \ + $(cgo.o) \ + src/$(NAME).a \ + tests/$(NAME).a \ + tests/main.a \ + tests/libbuild.a \ tests/main.bin \ - pack2.sentinel \ - src/_cgo_export.o \ - src/$(NAME).cgo2.o \ + tests/libbuild.bin \ side-assets = \ + src/_cgo_export.h \ + src/_cgo_main.c \ @@ -76,39 +73,41 @@ all: $(derived-assets) $(objects): Makefile -# src/$(NAME).a: src/$(NAME).go -tests/main.a: tests/main.go tests/$(NAME).a -tests/main.a: - go tool compile $(GOCFLAGS) -o $@ -p $(*F) -I $(@D) $*.go - -$(cgo-sources): src/_cgo_.o +$(cgo.go) $(cgo.c): src/_cgo_.o src/_cgo_.o: src/$(NAME).go go tool cgo --objdir $(@D) src/$(NAME).go src/_cgo_import.go: src/_cgo_.o go tool cgo --dynpackage $(NAME) --dynimport src/_cgo_.o --dynout $@ -src/$(NAME).a: $(libdeps) - go tool compile $(GOCFLAGS) -o $@ -p $(*F) $(libdeps) +src/$(NAME).a: $(cgo.go) $(cgo.o) + go tool compile $(GOCFLAGS) -o $@ -p $(*F) $(cgo.go) + go tool pack r $@ $(cgo.o) -# FIXME dependency -pack2.sentinel: src/$(NAME).a src/_cgo_export.o src/$(NAME).cgo2.o - go tool pack r $@ src/_cgo_export.o src/$(NAME).cgo2.o - touch $@ +tests/$(NAME).a: tests/$(NAME).go $(cgo.go) $(cgo.o) + go tool compile $(GOCFLAGS) -o $@ -p $(*F) $(cgo.go) $*.go + go tool pack r $@ $(cgo.o) -tests/$(NAME).a: tests/$(NAME).go src/_cgo_gotypes.go src/$(NAME).cgo1.go src/_cgo_import.go src/_cgo_export.o src/$(NAME).cgo2.o - go tool compile $(GOCFLAGS) -o $@ -p $(*F) tests/$(NAME).go src/_cgo_gotypes.go src/$(NAME).cgo1.go src/_cgo_import.go - go tool pack r $@ src/_cgo_export.o src/$(NAME).cgo2.o +tests/main.a: tests/main.go tests/$(NAME).a + go tool compile $(GOCFLAGS) -o $@ -p $(*F) -I $(@D) $*.go + +tests/libbuild.a: tests/libbuild.go src/$(NAME).a + go tool compile $(GOCFLAGS) -o $@ -p main -I src $*.go tests/main.bin: tests/main.a go tool link $(GOLDFLAGS) -o $@ -L $(@D) --extldflags '-lsqlite3' $*.a +tests/libbuild.bin: tests/libbuild.a + go tool link $(GOLDFLAGS) -o $@ -L src --extldflags '-lsqlite3' $*.a + tests.bin-check = \ tests/main.bin-check \ + tests/libbuild.bin-check \ tests/main.bin-check: tests/main.bin +tests/libbuild.bin-check: tests/libbuild.bin $(tests.bin-check): $(EXEC)$*.bin diff --git a/tests/golite.go b/tests/golite.go index 34ea5e4..641614e 100644 --- a/tests/golite.go +++ b/tests/golite.go @@ -22,11 +22,11 @@ import ( "path" "reflect" "regexp" - "runtime" "strconv" "strings" "sync" "testing" + "testing/internal/testdeps" "time" ) @@ -57,8 +57,7 @@ func testBackup(t *testing.T, testRowCount int, usePerPageSteps bool) { }) // Connect to the source database. - srcTempFilename := TempFilename(t) - defer os.Remove(srcTempFilename) + srcTempFilename := "file:src?mode=memory&cache=shared" srcDb, err := sql.Open(driverName, srcTempFilename) if err != nil { t.Fatal("Failed to open the source database:", err) @@ -70,8 +69,7 @@ func testBackup(t *testing.T, testRowCount int, usePerPageSteps bool) { } // Connect to the destination database. - destTempFilename := TempFilename(t) - defer os.Remove(destTempFilename) + destTempFilename := "file:dst?mode=memory&cache=shared" destDb, err := sql.Open(driverName, destTempFilename) if err != nil { t.Fatal("Failed to open the destination database:", err) @@ -281,9 +279,7 @@ func TestBackupError(t *testing.T) { }) // Connect to the database. - dbTempFilename := TempFilename(t) - defer os.Remove(dbTempFilename) - db, err := sql.Open(driverName, dbTempFilename) + db, err := sql.Open(driverName, ":memory:") if err != nil { t.Fatal("Failed to open the database:", err) } @@ -467,8 +463,7 @@ func TestSqlLogicErrors(t *testing.T) { } defer os.RemoveAll(dirName) - dbFileName := path.Join(dirName, "test.db") - db, err := sql.Open("sqlite3", dbFileName) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Error(err) } @@ -494,8 +489,7 @@ func TestExtendedErrorCodes_ForeignKey(t *testing.T) { } defer os.RemoveAll(dirName) - dbFileName := path.Join(dirName, "test.db") - db, err := sql.Open("sqlite3", dbFileName) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Error(err) } @@ -540,8 +534,7 @@ func TestExtendedErrorCodes_NotNull(t *testing.T) { } defer os.RemoveAll(dirName) - dbFileName := path.Join(dirName, "test.db") - db, err := sql.Open("sqlite3", dbFileName) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Error(err) } @@ -596,8 +589,7 @@ func TestExtendedErrorCodes_Unique(t *testing.T) { } defer os.RemoveAll(dirName) - dbFileName := path.Join(dirName, "test.db") - db, err := sql.Open("sqlite3", dbFileName) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Error(err) } @@ -738,10 +730,7 @@ func TestCryptEncoders(t *testing.T) { // //go:build go1.13 && cgo // +build go1.13,cgo func TestBeginTxCancel(t *testing.T) { - srcTempFilename := TempFilename(t) - defer os.Remove(srcTempFilename) - - db, err := sql.Open("sqlite3", srcTempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal(err) } @@ -804,6 +793,7 @@ func TestStmtReadonly(t *testing.T) { if err != nil { t.Fatal(err) } + defer db.Close() _, err = db.Exec("CREATE TABLE t (count INT)") if err != nil { @@ -846,9 +836,7 @@ func TestStmtReadonly(t *testing.T) { // //go:build go1.8 && cgo // +build go1.8,cgo func TestNamedParams(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -938,10 +926,7 @@ func initDatabase(t *testing.T, db *sql.DB, rowCount int64) { } func TestShortTimeout(t *testing.T) { - srcTempFilename := TempFilename(t) - defer os.Remove(srcTempFilename) - - db, err := sql.Open("sqlite3", srcTempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal(err) } @@ -963,21 +948,17 @@ func TestShortTimeout(t *testing.T) { } func TestExecContextCancel(t *testing.T) { - srcTempFilename := TempFilename(t) - defer os.Remove(srcTempFilename) - - db, err := sql.Open("sqlite3", srcTempFilename) + db, err := sql.Open("sqlite3", "file:exec?mode=memory&cache=shared") if err != nil { t.Fatal(err) } - defer db.Close() ts := time.Now() initDatabase(t, db, 1000) spent := time.Since(ts) const minTestTime = 100 * time.Millisecond - if spent < minTestTime { + if spent < minTestTime && false { t.Skipf("test will be too racy (spent=%s < min=%s) as ExecContext below will be too fast.", spent.String(), minTestTime.String(), ) @@ -1007,10 +988,9 @@ FROM test_table t1 LEFT OUTER JOIN test_table t2` } func TestQueryRowContextCancel(t *testing.T) { - srcTempFilename := TempFilename(t) - defer os.Remove(srcTempFilename) - - db, err := sql.Open("sqlite3", srcTempFilename) + // FIXME: too slow + return + db, err := sql.Open("sqlite3", "file:query?mode=memory&cache=shared") if err != nil { t.Fatal(err) } @@ -1041,10 +1021,8 @@ func TestQueryRowContextCancel(t *testing.T) { } func TestQueryRowContextCancelParallel(t *testing.T) { - srcTempFilename := TempFilename(t) - defer os.Remove(srcTempFilename) - - db, err := sql.Open("sqlite3", srcTempFilename) + return // FIXME: too slow + db, err := sql.Open("sqlite3", "file:parallel?mode=memory&cache=shared") if err != nil { t.Fatal(err) } @@ -1114,17 +1092,7 @@ func TestExecCancel(t *testing.T) { } } -func doTestOpenContext(t *testing.T, option string) (string, error) { - tempFilename := TempFilename(t) - url := tempFilename + option - - defer func() { - err := os.Remove(tempFilename) - if err != nil { - t.Error("temp file remove error:", err) - } - }() - +func doTestOpenContext(t *testing.T, url string) (string, error) { db, err := sql.Open("sqlite3", url) if err != nil { return "Failed to open database:", err @@ -1154,20 +1122,16 @@ func doTestOpenContext(t *testing.T, option string) (string, error) { return "Failed to create table:", err } - if stat, err := os.Stat(tempFilename); err != nil || stat.IsDir() { - return "Failed to create ./foo.db", nil - } - return "", nil } func TestOpenContext(t *testing.T) { cases := map[string]bool{ - "": true, - "?_txlock=immediate": true, - "?_txlock=deferred": true, - "?_txlock=exclusive": true, - "?_txlock=bogus": false, + "file:openctx1?mode=memory&cache=shared": true, + "file:openctx2?mode=memory&cache=shared&_txlock=immediate": true, + "file:openctx3?mode=memory&cache=shared&_txlock=deferred": true, + "file:openctx4?mode=memory&cache=shared&_txlock=exclusive": true, + "file:openctx5?mode=memory&cache=shared&_txlock=bogus": false, } for option, expectedPass := range cases { result, err := doTestOpenContext(t, option) @@ -1426,9 +1390,7 @@ func TestColumnTableName(t *testing.T) { // //go:build cgo // +build cgo func TestFTS3(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -1497,9 +1459,7 @@ func TestFTS3(t *testing.T) { } func TestFTS4(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -1691,9 +1651,7 @@ func TestPreUpdateHook(t *testing.T) { func TestSerializeDeserialize(t *testing.T) { // Connect to the source database. - srcTempFilename := TempFilename(t) - defer os.Remove(srcTempFilename) - srcDb, err := sql.Open(driverName, srcTempFilename) + srcDb, err := sql.Open(driverName, "file:src?mode=memory&cache=shared") if err != nil { t.Fatal("Failed to open the source database:", err) } @@ -1704,9 +1662,7 @@ func TestSerializeDeserialize(t *testing.T) { } // Connect to the destination database. - destTempFilename := TempFilename(t) - defer os.Remove(destTempFilename) - destDb, err := sql.Open(driverName, destTempFilename) + destDb, err := sql.Open(driverName, "file:dst?mode=memory&cache=shared") if err != nil { t.Fatal("Failed to open the destination database:", err) } @@ -1787,7 +1743,7 @@ func TestSerializeDeserialize(t *testing.T) { func TestUnlockNotify(t *testing.T) { tempFilename := TempFilename(t) defer os.Remove(tempFilename) - dsn := fmt.Sprintf("file:%s?cache=shared&mode=rwc&_busy_timeout=%d", tempFilename, 500) + dsn := fmt.Sprintf("file:%s?cache=shared&mode=memory&_busy_timeout=%d", tempFilename, 500) db, err := sql.Open("sqlite3", dsn) if err != nil { t.Fatal("Failed to open database:", err) @@ -2123,6 +2079,7 @@ func init() { } } +/* func TestUserAuthCreateDatabase(t *testing.T) { f, db, c, err := connect(t, "", "admin", "admin") if err != nil && c == nil && db == nil { @@ -2169,7 +2126,6 @@ func TestUserAuthCreateDatabaseWithoutArgs(t *testing.T) { } } -/* func TestUserAuthLogin(t *testing.T) { f1, err := create(t, "admin", "admin") if err != nil { @@ -2738,15 +2694,13 @@ func (vc *testVTabCursor) Rowid() (int64, error) { } func TestCreateModule(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) intarray := []int{1, 2, 3} sql.Register("sqlite3_TestCreateModule", &SQLiteDriver{ ConnectHook: func(conn *SQLiteConn) error { return conn.CreateModule("test", testModule{t, intarray}) }, }) - db, err := sql.Open("sqlite3_TestCreateModule", tempFilename) + db, err := sql.Open("sqlite3_TestCreateModule", ":memory:") if err != nil { t.Fatalf("could not open db: %v", err) } @@ -2774,9 +2728,6 @@ func TestCreateModule(t *testing.T) { } func TestVUpdate(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - // create module updateMod := &vtabUpdateModule{t, make(map[string]*vtabUpdateTable)} @@ -2788,7 +2739,7 @@ func TestVUpdate(t *testing.T) { }) // connect - db, err := sql.Open("sqlite3_TestVUpdate", tempFilename) + db, err := sql.Open("sqlite3_TestVUpdate", ":memory:") if err != nil { t.Fatalf("could not open db: %v", err) } @@ -3187,15 +3138,13 @@ func (vc *testVTabCursorEponymousOnly) Rowid() (int64, error) { } func TestCreateModuleEponymousOnly(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) intarray := []int{1, 2, 3} sql.Register("sqlite3_TestCreateModuleEponymousOnly", &SQLiteDriver{ ConnectHook: func(conn *SQLiteConn) error { return conn.CreateModule("test", testModuleEponymousOnly{t, intarray}) }, }) - db, err := sql.Open("sqlite3_TestCreateModuleEponymousOnly", tempFilename) + db, err := sql.Open("sqlite3_TestCreateModuleEponymousOnly", ":memory:") if err != nil { t.Fatalf("could not open db: %v", err) } @@ -3236,17 +3185,7 @@ func TempFilename(t testing.TB) string { return f.Name() } -func doTestOpen(t *testing.T, option string) (string, error) { - tempFilename := TempFilename(t) - url := tempFilename + option - - defer func() { - err := os.Remove(tempFilename) - if err != nil { - t.Error("temp file remove error:", err) - } - }() - +func doTestOpen(t *testing.T, url string) (string, error) { db, err := sql.Open("sqlite3", url) if err != nil { return "Failed to open database:", err @@ -3270,20 +3209,16 @@ func doTestOpen(t *testing.T, option string) (string, error) { return "Failed to create table:", err } - if stat, err := os.Stat(tempFilename); err != nil || stat.IsDir() { - return "Failed to create ./foo.db", nil - } - return "", nil } func TestOpen(t *testing.T) { cases := map[string]bool{ - "": true, - "?_txlock=immediate": true, - "?_txlock=deferred": true, - "?_txlock=exclusive": true, - "?_txlock=bogus": false, + "file:open1?mode=memory&cache=shared": true, + "file:open1?mode=memory&cache=shared&_txlock=immediate": true, + "file:open1?mode=memory&cache=shared&_txlock=deferred": true, + "file:open1?mode=memory&cache=shared&_txlock=exclusive": true, + "file:open1?mode=memory&cache=shared&_txlock=bogus": false, } for option, expectedPass := range cases { result, err := doTestOpen(t, option) @@ -3303,14 +3238,9 @@ func TestOpen(t *testing.T) { } func TestOpenWithVFS(t *testing.T) { - filename := t.Name() + ".sqlite" - - if err := os.Remove(filename); err != nil && !os.IsNotExist(err) { - t.Fatal(err) - } - defer os.Remove(filename) - - db, err := sql.Open("sqlite3", fmt.Sprintf("file:%s?vfs=hello", filename)) + { + uri := fmt.Sprintf("file:%s?mode=memory&vfs=hello", t.Name()) + db, err := sql.Open("sqlite3", uri) if err != nil { t.Fatal("Failed to open", err) } @@ -3319,16 +3249,11 @@ func TestOpenWithVFS(t *testing.T) { t.Fatal("Failed to open", err) } db.Close() - - defer os.Remove(filename) - - var vfs string - if runtime.GOOS == "windows" { - vfs = "win32-none" - } else { - vfs = "unix-none" } - db, err = sql.Open("sqlite3", fmt.Sprintf("file:%s?vfs=%s", filename, vfs)) + + { + uri := fmt.Sprintf("file:%s?mode=memory&vfs=unix-none", t.Name()) + db, err := sql.Open("sqlite3", uri) if err != nil { t.Fatal("Failed to open", err) } @@ -3337,6 +3262,7 @@ func TestOpenWithVFS(t *testing.T) { t.Fatal("Failed to ping", err) } db.Close() + } } func TestOpenNoCreate(t *testing.T) { @@ -3405,12 +3331,14 @@ func TestReadonly(t *testing.T) { if err != nil { t.Fatal(err) } + defer db1.Close() db1.Exec("CREATE TABLE test (x int, y float)") db2, err := sql.Open("sqlite3", "file:"+tempFilename+"?mode=ro") if err != nil { t.Fatal(err) } + defer db2.Close() _ = db2 _, err = db2.Exec("INSERT INTO test VALUES (1, 3.14)") if err == nil { @@ -3425,7 +3353,7 @@ func TestForeignKeys(t *testing.T) { } for option, want := range cases { fname := TempFilename(t) - uri := "file:" + fname + option + uri := "file:" + fname + option + "&mode=memory" db, err := sql.Open("sqlite3", uri) if err != nil { os.Remove(fname) @@ -3449,7 +3377,7 @@ func TestForeignKeys(t *testing.T) { func TestDeferredForeignKey(t *testing.T) { fname := TempFilename(t) - uri := "file:" + fname + "?_foreign_keys=1" + uri := "file:" + fname + "?_foreign_keys=1&mode=memory" db, err := sql.Open("sqlite3", uri) if err != nil { os.Remove(fname) @@ -3491,7 +3419,7 @@ func TestRecursiveTriggers(t *testing.T) { } for option, want := range cases { fname := TempFilename(t) - uri := "file:" + fname + option + uri := "file:" + fname + option + "&mode=memory" db, err := sql.Open("sqlite3", uri) if err != nil { os.Remove(fname) @@ -3514,9 +3442,7 @@ func TestRecursiveTriggers(t *testing.T) { } func TestClose(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -3540,9 +3466,7 @@ func TestClose(t *testing.T) { } func TestInsert(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -3583,9 +3507,7 @@ func TestUpsert(t *testing.T) { if n < 3024000 { t.Skip("UPSERT requires sqlite3 >= 3.24.0") } - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -3628,9 +3550,7 @@ func TestUpsert(t *testing.T) { } func TestUpdate(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -3693,9 +3613,7 @@ func TestUpdate(t *testing.T) { } func TestDelete(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -3754,9 +3672,7 @@ func TestDelete(t *testing.T) { } func TestBooleanRoundtrip(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -3805,9 +3721,7 @@ func TestBooleanRoundtrip(t *testing.T) { func timezone(t time.Time) string { return t.Format("-07:00") } func TestTimestamp(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -3907,9 +3821,7 @@ func TestTimestamp(t *testing.T) { } func TestBoolean(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -3999,9 +3911,7 @@ func TestBoolean(t *testing.T) { } func TestFloat32(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -4036,9 +3946,7 @@ func TestFloat32(t *testing.T) { } func TestNull(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -4067,9 +3975,7 @@ func TestNull(t *testing.T) { } func TestTransaction(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -4126,9 +4032,7 @@ func TestTransaction(t *testing.T) { } func TestWAL(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -4174,9 +4078,7 @@ func TestWAL(t *testing.T) { func TestTimezoneConversion(t *testing.T) { zones := []string{"UTC", "US/Central", "US/Pacific", "Local"} for _, tz := range zones { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename+"?_loc="+url.QueryEscape(tz)) + db, err := sql.Open("sqlite3", "file:tz?mode=memory&_loc="+url.QueryEscape(tz)) if err != nil { t.Fatal("Failed to open database:", err) } @@ -4270,9 +4172,7 @@ func TestTimezoneConversion(t *testing.T) { // TODO: Execer & Queryer currently disabled // https://github.com/mattn/go-sqlite3/issues/82 func TestExecer(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -4290,9 +4190,7 @@ func TestExecer(t *testing.T) { } func TestQueryer(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -4341,23 +4239,16 @@ func TestQueryer(t *testing.T) { } func TestStress(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } + defer db.Close() db.Exec("CREATE TABLE foo (id int);") db.Exec("INSERT INTO foo VALUES(1);") db.Exec("INSERT INTO foo VALUES(2);") - db.Close() for i := 0; i < 10000; i++ { - db, err := sql.Open("sqlite3", tempFilename) - if err != nil { - t.Fatal("Failed to open database:", err) - } - for j := 0; j < 3; j++ { rows, err := db.Query("select * from foo where id=1;") if err != nil { @@ -4374,22 +4265,24 @@ func TestStress(t *testing.T) { } rows.Close() } - db.Close() } } func TestDateTimeLocal(t *testing.T) { - zone := "Asia/Tokyo" + const zone = "Asia/Tokyo" tempFilename := TempFilename(t) defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename+"?_loc="+zone) + filename1 := tempFilename + filename2 := filename1 + "?_loc=" + zone + db1, err := sql.Open("sqlite3", filename2) if err != nil { t.Fatal("Failed to open database:", err) } - db.Exec("CREATE TABLE foo (dt datetime);") - db.Exec("INSERT INTO foo VALUES('2015-03-05 15:16:17');") + defer db1.Close() + db1.Exec("CREATE TABLE foo (dt datetime);") + db1.Exec("INSERT INTO foo VALUES('2015-03-05 15:16:17');") - row := db.QueryRow("select * from foo") + row := db1.QueryRow("select * from foo") var d time.Time err = row.Scan(&d) if err != nil { @@ -4398,14 +4291,14 @@ func TestDateTimeLocal(t *testing.T) { if d.Hour() == 15 || !strings.Contains(d.String(), "JST") { t.Fatal("Result should have timezone", d) } - db.Close() - db, err = sql.Open("sqlite3", tempFilename) + db2, err := sql.Open("sqlite3", filename1) if err != nil { t.Fatal("Failed to open database:", err) } + defer db2.Close() - row = db.QueryRow("select * from foo") + row = db2.QueryRow("select * from foo") err = row.Scan(&d) if err != nil { t.Fatal("Failed to scan datetime:", err) @@ -4414,7 +4307,7 @@ func TestDateTimeLocal(t *testing.T) { t.Fatalf("Result should not have timezone %v %v", zone, d.String()) } - _, err = db.Exec("DELETE FROM foo") + _, err = db2.Exec("DELETE FROM foo") if err != nil { t.Fatal("Failed to delete table:", err) } @@ -4422,15 +4315,15 @@ func TestDateTimeLocal(t *testing.T) { if err != nil { t.Fatal("Failed to parse datetime:", err) } - db.Exec("INSERT INTO foo VALUES(?);", dt) + db2.Exec("INSERT INTO foo VALUES(?);", dt) - db.Close() - db, err = sql.Open("sqlite3", tempFilename+"?_loc="+zone) + db3, err := sql.Open("sqlite3", filename2) if err != nil { t.Fatal("Failed to open database:", err) } + defer db3.Close() - row = db.QueryRow("select * from foo") + row = db3.QueryRow("select * from foo") err = row.Scan(&d) if err != nil { t.Fatal("Failed to scan datetime:", err) @@ -4448,9 +4341,7 @@ func TestVersion(t *testing.T) { } func TestStringContainingZero(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -4508,9 +4399,7 @@ func (t TimeStamp) Value() (driver.Value, error) { } func TestDateTimeNow(t *testing.T) { - tempFilename := TempFilename(t) - defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -5160,7 +5049,7 @@ func TestInsertNilByteSlice(t *testing.T) { func TestNamedParam(t *testing.T) { tempFilename := TempFilename(t) defer os.Remove(tempFilename) - db, err := sql.Open("sqlite3", tempFilename) + db, err := sql.Open("sqlite3", ":memory:") if err != nil { t.Fatal("Failed to open database:", err) } @@ -5265,7 +5154,7 @@ type TestDB struct { tempFilename string } -var db *TestDB +var tdb *TestDB func initializeTestDB(t testing.TB) { tempFilename := TempFilename(t) @@ -5275,15 +5164,15 @@ func initializeTestDB(t testing.TB) { t.Fatal(err) } - db = &TestDB{t, d, SQLITE, sync.Once{}, tempFilename} + tdb = &TestDB{t, d, SQLITE, sync.Once{}, tempFilename} } func freeTestDB() { - err := db.DB.Close() + err := tdb.DB.Close() if err != nil { panic(err) } - err = os.Remove(db.tempFilename) + err = os.Remove(tdb.tempFilename) if err != nil { panic(err) } @@ -5384,10 +5273,10 @@ func (db *TestDB) now() string { } func makeBench() { - if _, err := db.Exec("create table bench (n varchar(32), i integer, d double, s varchar(32), t datetime)"); err != nil { + if _, err := tdb.Exec("create table bench (n varchar(32), i integer, d double, s varchar(32), t datetime)"); err != nil { panic(err) } - st, err := db.Prepare("insert into bench values (?, ?, ?, ?, ?)") + st, err := tdb.Prepare("insert into bench values (?, ?, ?, ?, ?)") if err != nil { panic(err) } @@ -5401,11 +5290,11 @@ func makeBench() { // testResult is test for result func testResult(t *testing.T) { - db.tearDown() - db.mustExec("create temporary table test (id " + db.serialPK() + ", name varchar(10))") + tdb.tearDown() + tdb.mustExec("create temporary table test (id " + tdb.serialPK() + ", name varchar(10))") for i := 1; i < 3; i++ { - r := db.mustExec(db.q("insert into test (name) values (?)"), fmt.Sprintf("row %d", i)) + r := tdb.mustExec(tdb.q("insert into test (name) values (?)"), fmt.Sprintf("row %d", i)) n, err := r.RowsAffected() if err != nil { t.Fatal(err) @@ -5421,22 +5310,22 @@ func testResult(t *testing.T) { t.Errorf("got %v, want %v", n, i) } } - if _, err := db.Exec("error!"); err == nil { + if _, err := tdb.Exec("error!"); err == nil { t.Fatalf("expected error") } } // testBlobs is test for blobs func testBlobs(t *testing.T) { - db.tearDown() + tdb.tearDown() var blob = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} - db.mustExec("create table foo (id integer primary key, bar " + db.blobType(16) + ")") - db.mustExec(db.q("insert into foo (id, bar) values(?,?)"), 0, blob) + tdb.mustExec("create table foo (id integer primary key, bar " + tdb.blobType(16) + ")") + tdb.mustExec(tdb.q("insert into foo (id, bar) values(?,?)"), 0, blob) want := fmt.Sprintf("%x", blob) b := make([]byte, 16) - err := db.QueryRow(db.q("select bar from foo where id = ?"), 0).Scan(&b) + err := tdb.QueryRow(tdb.q("select bar from foo where id = ?"), 0).Scan(&b) got := fmt.Sprintf("%x", b) if err != nil { t.Errorf("[]byte scan: %v", err) @@ -5444,7 +5333,7 @@ func testBlobs(t *testing.T) { t.Errorf("for []byte, got %q; want %q", got, want) } - err = db.QueryRow(db.q("select bar from foo where id = ?"), 0).Scan(&got) + err = tdb.QueryRow(tdb.q("select bar from foo where id = ?"), 0).Scan(&got) want = string(blob) if err != nil { t.Errorf("string scan: %v", err) @@ -5454,14 +5343,14 @@ func testBlobs(t *testing.T) { } func testMultiBlobs(t *testing.T) { - db.tearDown() - db.mustExec("create table foo (id integer primary key, bar " + db.blobType(16) + ")") + tdb.tearDown() + tdb.mustExec("create table foo (id integer primary key, bar " + tdb.blobType(16) + ")") var blob0 = []byte{0, 1, 2, 3, 4, 5, 6, 7} - db.mustExec(db.q("insert into foo (id, bar) values(?,?)"), 0, blob0) + tdb.mustExec(tdb.q("insert into foo (id, bar) values(?,?)"), 0, blob0) var blob1 = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} - db.mustExec(db.q("insert into foo (id, bar) values(?,?)"), 1, blob1) + tdb.mustExec(tdb.q("insert into foo (id, bar) values(?,?)"), 1, blob1) - r, err := db.Query(db.q("select bar from foo order by id")) + r, err := tdb.Query(tdb.q("select bar from foo order by id")) if err != nil { t.Fatal(err) } @@ -5505,12 +5394,12 @@ func testMultiBlobs(t *testing.T) { // testBlobs tests that we distinguish between null and zero-length blobs func testNullZeroLengthBlobs(t *testing.T) { - db.tearDown() - db.mustExec("create table foo (id integer primary key, bar " + db.blobType(16) + ")") - db.mustExec(db.q("insert into foo (id, bar) values(?,?)"), 0, nil) - db.mustExec(db.q("insert into foo (id, bar) values(?,?)"), 1, []byte{}) + tdb.tearDown() + tdb.mustExec("create table foo (id integer primary key, bar " + tdb.blobType(16) + ")") + tdb.mustExec(tdb.q("insert into foo (id, bar) values(?,?)"), 0, nil) + tdb.mustExec(tdb.q("insert into foo (id, bar) values(?,?)"), 1, []byte{}) - r0 := db.QueryRow(db.q("select bar from foo where id=0")) + r0 := tdb.QueryRow(tdb.q("select bar from foo where id=0")) var b0 []byte err := r0.Scan(&b0) if err != nil { @@ -5520,7 +5409,7 @@ func testNullZeroLengthBlobs(t *testing.T) { t.Errorf("for id=0, got %x; want nil", b0) } - r1 := db.QueryRow(db.q("select bar from foo where id=1")) + r1 := tdb.QueryRow(tdb.q("select bar from foo where id=1")) var b1 []byte err = r1.Scan(&b1) if err != nil { @@ -5539,12 +5428,12 @@ func testManyQueryRow(t *testing.T) { t.Log("skipping in short mode") return } - db.tearDown() - db.mustExec("create table foo (id integer primary key, name varchar(50))") - db.mustExec(db.q("insert into foo (id, name) values(?,?)"), 1, "bob") + tdb.tearDown() + tdb.mustExec("create table foo (id integer primary key, name varchar(50))") + tdb.mustExec(tdb.q("insert into foo (id, name) values(?,?)"), 1, "bob") var name string for i := 0; i < 10000; i++ { - err := db.QueryRow(db.q("select name from foo where id = ?"), 1).Scan(&name) + err := tdb.QueryRow(tdb.q("select name from foo where id = ?"), 1).Scan(&name) if err != nil || name != "bob" { t.Fatalf("on query %d: err=%v, name=%q", i, err, name) } @@ -5553,8 +5442,8 @@ func testManyQueryRow(t *testing.T) { // testTxQuery is test for transactional query func testTxQuery(t *testing.T) { - db.tearDown() - tx, err := db.Begin() + tdb.tearDown() + tx, err := tdb.Begin() if err != nil { t.Fatal(err) } @@ -5565,12 +5454,12 @@ func testTxQuery(t *testing.T) { t.Fatal(err) } - _, err = tx.Exec(db.q("insert into foo (id, name) values(?,?)"), 1, "bob") + _, err = tx.Exec(tdb.q("insert into foo (id, name) values(?,?)"), 1, "bob") if err != nil { t.Fatal(err) } - r, err := tx.Query(db.q("select name from foo where id = ?"), 1) + r, err := tx.Query(tdb.q("select name from foo where id = ?"), 1) if err != nil { t.Fatal(err) } @@ -5592,13 +5481,13 @@ func testTxQuery(t *testing.T) { // testPreparedStmt is test for prepared statement func testPreparedStmt(t *testing.T) { - db.tearDown() - db.mustExec("CREATE TABLE t (count INT)") - sel, err := db.Prepare("SELECT count FROM t ORDER BY count DESC") + tdb.tearDown() + tdb.mustExec("CREATE TABLE t (count INT)") + sel, err := tdb.Prepare("SELECT count FROM t ORDER BY count DESC") if err != nil { t.Fatalf("prepare 1: %v", err) } - ins, err := db.Prepare(db.q("INSERT INTO t (count) VALUES (?)")) + ins, err := tdb.Prepare(tdb.q("INSERT INTO t (count) VALUES (?)")) if err != nil { t.Fatalf("prepare 2: %v", err) } @@ -5633,8 +5522,8 @@ func testPreparedStmt(t *testing.T) { // testEmptyQuery is test for validating the API in case of empty query func testExecEmptyQuery(t *testing.T) { - db.tearDown() - res, err := db.Exec(" -- this is just a comment ") + tdb.tearDown() + res, err := tdb.Exec(" -- this is just a comment ") if err != nil { t.Fatalf("empty query err: %v", err) } @@ -5658,7 +5547,7 @@ func testExecEmptyQuery(t *testing.T) { // benchmarkExec is benchmark for exec func benchmarkExec(b *testing.B) { for i := 0; i < b.N; i++ { - if _, err := db.Exec("select 1"); err != nil { + if _, err := tdb.Exec("select 1"); err != nil { panic(err) } } @@ -5672,7 +5561,7 @@ func benchmarkQuery(b *testing.B) { var f float64 var s string // var t time.Time - if err := db.QueryRow("select null, 1, 1.1, 'foo'").Scan(&n, &i, &f, &s); err != nil { + if err := tdb.QueryRow("select null, 1, 1.1, 'foo'").Scan(&n, &i, &f, &s); err != nil { panic(err) } } @@ -5686,7 +5575,7 @@ func benchmarkParams(b *testing.B) { var f float64 var s string // var t time.Time - if err := db.QueryRow("select ?, ?, ?, ?", nil, 1, 1.1, "foo").Scan(&n, &i, &f, &s); err != nil { + if err := tdb.QueryRow("select ?, ?, ?, ?", nil, 1, 1.1, "foo").Scan(&n, &i, &f, &s); err != nil { panic(err) } } @@ -5694,7 +5583,7 @@ func benchmarkParams(b *testing.B) { // benchmarkStmt is benchmark for statement func benchmarkStmt(b *testing.B) { - st, err := db.Prepare("select ?, ?, ?, ?") + st, err := tdb.Prepare("select ?, ?, ?, ?") if err != nil { panic(err) } @@ -5714,7 +5603,7 @@ func benchmarkStmt(b *testing.B) { // benchmarkRows is benchmark for rows func benchmarkRows(b *testing.B) { - db.once.Do(makeBench) + tdb.once.Do(makeBench) for n := 0; n < b.N; n++ { var n sql.NullString @@ -5722,7 +5611,7 @@ func benchmarkRows(b *testing.B) { var f float64 var s string var t time.Time - r, err := db.Query("select * from bench") + r, err := tdb.Query("select * from bench") if err != nil { panic(err) } @@ -5739,9 +5628,9 @@ func benchmarkRows(b *testing.B) { // benchmarkStmtRows is benchmark for statement rows func benchmarkStmtRows(b *testing.B) { - db.once.Do(makeBench) + tdb.once.Do(makeBench) - st, err := db.Prepare("select * from bench") + st, err := tdb.Prepare("select * from bench") if err != nil { panic(err) } @@ -5770,5 +5659,111 @@ func benchmarkStmtRows(b *testing.B) { func MainTest() { - fmt.Println("working binary") + tests := []testing.InternalTest { + { "TestBackupStepByStep", TestBackupStepByStep }, + { "TestBackupAllRemainingPages", TestBackupAllRemainingPages }, + { "TestBackupError", TestBackupError }, + { "TestCallbackArgCast", TestCallbackArgCast }, + { "TestCallbackConverters", TestCallbackConverters }, + { "TestCallbackReturnAny", TestCallbackReturnAny }, + { "TestSimpleError", TestSimpleError }, + { "TestCorruptDbErrors", TestCorruptDbErrors }, + { "TestSqlLogicErrors", TestSqlLogicErrors }, + { "TestExtendedErrorCodes_ForeignKey", TestExtendedErrorCodes_ForeignKey }, + { "TestExtendedErrorCodes_NotNull", TestExtendedErrorCodes_NotNull }, + { "TestExtendedErrorCodes_Unique", TestExtendedErrorCodes_Unique }, + { "TestError_SystemErrno", TestError_SystemErrno }, + { "TestCryptEncoders", TestCryptEncoders }, + { "TestBeginTxCancel", TestBeginTxCancel }, + { "TestStmtReadonly", TestStmtReadonly }, + { "TestNamedParams", TestNamedParams }, + { "TestShortTimeout", TestShortTimeout }, + { "TestExecContextCancel", TestExecContextCancel }, + { "TestQueryRowContextCancel", TestQueryRowContextCancel }, + { "TestQueryRowContextCancelParallel", TestQueryRowContextCancelParallel }, + { "TestExecCancel", TestExecCancel }, + { "TestOpenContext", TestOpenContext }, + { "TestFileCopyTruncate", TestFileCopyTruncate }, + { "TestExtensionsError", TestExtensionsError }, + { "TestLoadExtensionError", TestLoadExtensionError }, + { "TestColumnTableName", TestColumnTableName }, + { "TestFTS3", TestFTS3 }, + { "TestFTS4", TestFTS4 }, + { "TestMathFunctions", TestMathFunctions }, + // { "TestPreUpdateHook", TestPreUpdateHook }, + { "TestSerializeDeserialize", TestSerializeDeserialize }, + // { "TestUnlockNotify", TestUnlockNotify }, + // { "TestUnlockNotifyMany", TestUnlockNotifyMany }, + // { "TestUnlockNotifyDeadlock", TestUnlockNotifyDeadlock }, + // { "TestUserAuthCreateDatabase", TestUserAuthCreateDatabase }, + // { "TestUserAuthCreateDatabaseWithoutArgs", TestUserAuthCreateDatabaseWithoutArgs }, + // { "TestUserAuthLogin", TestUserAuthLogin }, + // { "TestUserAuthAddAdmin", TestUserAuthAddAdmin }, + // { "TestUserAuthAddUser", TestUserAuthAddUser }, + // { "TestUserAuthModifyUser", TestUserAuthModifyUser }, + // { "TestUserAuthDeleteUser", TestUserAuthDeleteUser }, + // { "TestUserAuthEncoders", TestUserAuthEncoders }, + { "TestCreateModule", TestCreateModule }, + { "TestVUpdate", TestVUpdate }, + { "TestCreateModuleEponymousOnly", TestCreateModuleEponymousOnly }, + { "TestOpen", TestOpen }, + { "TestOpenWithVFS", TestOpenWithVFS }, + { "TestOpenNoCreate", TestOpenNoCreate }, + { "TestReadonly", TestReadonly }, + { "TestForeignKeys", TestForeignKeys }, + { "TestDeferredForeignKey", TestDeferredForeignKey }, + { "TestRecursiveTriggers", TestRecursiveTriggers }, + { "TestClose", TestClose }, + { "TestInsert", TestInsert }, + { "TestUpsert", TestUpsert }, + { "TestUpdate", TestUpdate }, + { "TestDelete", TestDelete }, + { "TestBooleanRoundtrip", TestBooleanRoundtrip }, + { "TestTimestamp", TestTimestamp }, + { "TestBoolean", TestBoolean }, + { "TestFloat32", TestFloat32 }, + { "TestNull", TestNull }, + { "TestTransaction", TestTransaction }, + { "TestWAL", TestWAL }, + { "TestTimezoneConversion", TestTimezoneConversion }, + { "TestExecer", TestExecer }, + { "TestQueryer", TestQueryer }, + { "TestStress", TestStress }, + { "TestDateTimeLocal", TestDateTimeLocal }, + { "TestVersion", TestVersion }, + { "TestStringContainingZero", TestStringContainingZero }, + { "TestDateTimeNow", TestDateTimeNow }, + // { "TestFunctionRegistration", TestFunctionRegistration }, + // { "TestAggregatorRegistration", TestAggregatorRegistration }, + // { "TestAggregatorRegistration_GenericReturn", TestAggregatorRegistration_GenericReturn }, + // { "TestCollationRegistration", TestCollationRegistration }, + { "TestDeclTypes", TestDeclTypes }, + { "TestPinger", TestPinger }, + // { "TestUpdateAndTransactionHooks", TestUpdateAndTransactionHooks }, + // { "TestAuthorizer", TestAuthorizer }, + { "TestSetFileControlInt", TestSetFileControlInt }, + { "TestNonColumnString", TestNonColumnString }, + { "TestNilAndEmptyBytes", TestNilAndEmptyBytes }, + { "TestInsertNilByteSlice", TestInsertNilByteSlice }, + { "TestNamedParam", TestNamedParam }, + // { "TestSuite", TestSuite }, // FIXME: too slow + } + + benchmarks := []testing.InternalBenchmark { + /* + { "BenchmarkCustomFunctions", BenchmarkCustomFunctions }, + { "BenchmarkSuite", BenchmarkSuite }, + */ + } + + fuzzTargets := []testing.InternalFuzzTarget {} + examples := []testing.InternalExample {} + m := testing.MainStart( + testdeps.TestDeps {}, + tests, + benchmarks, + fuzzTargets, + examples, + ) + os.Exit(m.Run()) } diff --git a/tests/libbuild.go b/tests/libbuild.go new file mode 100644 index 0000000..3de29ae --- /dev/null +++ b/tests/libbuild.go @@ -0,0 +1,19 @@ +package main + +import ( + "database/sql" + + _ "golite" +) + +func main() { + db, err := sql.Open("sqlite3", ":memory:") + if err != nil { + panic(err) + } + + err = db.Close() + if err != nil { + panic(err) + } +} |