package sqlite import ( "path/filepath" "testing" "time" ) func TestNewConnectionReadsWhileWriteIsOpen(t *testing.T) { db, err := Open(filepath.Join(t.TempDir(), "t.db")) if err != nil { t.Fatal(err) } defer db.Close() if _, err := db.Exec(`create table t (x integer)`); err != nil { t.Fatal(err) } tx, err := db.Begin() if err != nil { t.Fatal(err) } defer tx.Rollback() if _, err := tx.Exec(`insert into t values (1)`); err != nil { t.Fatal(err) } start := time.Now() var n int if err := db.QueryRow(`select count(*) from t`).Scan(&n); err != nil { t.Fatalf("read on a fresh connection while a write is open: %v", err) } if took := time.Since(start); took > time.Second { t.Fatalf("read on a fresh connection waited %v behind the open write", took) } } func TestOpenPopulatedFileWhileWriteIsOpen(t *testing.T) { path := filepath.Join(t.TempDir(), "t.db") writer, err := Open(path) if err != nil { t.Fatal(err) } defer writer.Close() if _, err := writer.Exec(`create table t (x integer)`); err != nil { t.Fatal(err) } tx, err := writer.Begin() if err != nil { t.Fatal(err) } defer tx.Rollback() if _, err := tx.Exec(`insert into t values (1)`); err != nil { t.Fatal(err) } start := time.Now() other, err := Open(path) if err != nil { t.Fatalf("opening a populated file while a write is open: %v", err) } defer other.Close() if took := time.Since(start); took > time.Second { t.Fatalf("opening a populated file waited %v behind the open write", took) } } func TestFreshFileGetsIncrementalAutoVacuum(t *testing.T) { db, err := Open(filepath.Join(t.TempDir(), "t.db")) if err != nil { t.Fatal(err) } defer db.Close() if _, err := db.Exec(`create table t (x integer)`); err != nil { t.Fatal(err) } var mode int if err := db.QueryRow(`pragma auto_vacuum`).Scan(&mode); err != nil { t.Fatal(err) } if mode != 2 { t.Fatalf("auto_vacuum = %d, want 2 (incremental)", mode) } }