11package tests
22
33import (
4- "context"
54 "errors"
5+ "fmt"
66 "io"
77 "log"
88 "net/url"
99 "os"
1010 "os/exec"
1111 "path/filepath"
1212 "testing"
13- "time"
1413
1514 "golang.org/x/sync/errgroup"
1615
@@ -24,6 +23,7 @@ import (
2423)
2524
2625func TestMain (m * testing.M ) {
26+ sqlite3 .Initialize ()
2727 sqlite3 .AutoExtension (func (c * sqlite3.Conn ) error {
2828 return c .ConfigLog (func (code sqlite3.ExtendedErrorCode , msg string ) {
2929 // Having to do journal recovery is unexpected.
@@ -54,6 +54,7 @@ func Test_parallel(t *testing.T) {
5454 "?_pragma=busy_timeout(10000)" +
5555 "&_pragma=journal_mode(truncate)" +
5656 "&_pragma=synchronous(off)"
57+ createDB (t , name )
5758 testParallel (t , name , iter )
5859 testIntegrity (t , name )
5960}
@@ -75,6 +76,7 @@ func Test_wal(t *testing.T) {
7576 "?_pragma=busy_timeout(10000)" +
7677 "&_pragma=journal_mode(wal)" +
7778 "&_pragma=synchronous(off)"
79+ createDB (t , name )
7880 testParallel (t , name , iter )
7981 testIntegrity (t , name )
8082}
@@ -90,6 +92,7 @@ func Test_memdb(t *testing.T) {
9092 name := memdb .TestDB (t , url.Values {
9193 "_pragma" : {"busy_timeout(10000)" },
9294 })
95+ createDB (t , name )
9396 testParallel (t , name , iter )
9497 testIntegrity (t , name )
9598}
@@ -113,6 +116,7 @@ func Test_adiantum(t *testing.T) {
113116 "&_pragma=busy_timeout(10000)" +
114117 "&_pragma=journal_mode(truncate)" +
115118 "&_pragma=synchronous(off)"
119+ createDB (t , name )
116120 testParallel (t , name , iter )
117121 testIntegrity (t , name )
118122}
@@ -136,6 +140,7 @@ func Test_xts(t *testing.T) {
136140 "&_pragma=busy_timeout(10000)" +
137141 "&_pragma=journal_mode(truncate)" +
138142 "&_pragma=synchronous(off)"
143+ createDB (t , name )
139144 testParallel (t , name , iter )
140145 testIntegrity (t , name )
141146}
@@ -155,14 +160,17 @@ func Test_MultiProcess_rollback(t *testing.T) {
155160 "?_pragma=busy_timeout(10000)" +
156161 "&_pragma=journal_mode(truncate)" +
157162 "&_pragma=synchronous(off)"
163+ createDB (t , name )
158164
159165 exe , err := os .Executable ()
160166 if err != nil {
161167 t .Fatal (err )
162168 }
163169
164- cmd := exec .Command (exe , append (os .Args [1 :], "-test.v" , "-test.run=Test_ChildProcess_rollback" )... )
170+ cmd := exec .Command (exe , append (os .Args [1 :],
171+ "-test.v" , "-test.count=1" , "-test.run=Test_ChildProcess_rollback" )... )
165172 out , err := cmd .StdoutPipe ()
173+ cmd .Stderr = os .Stderr
166174 if err != nil {
167175 t .Fatal (err )
168176 }
@@ -214,14 +222,17 @@ func Test_MultiProcess_wal(t *testing.T) {
214222 "?_pragma=busy_timeout(10000)" +
215223 "&_pragma=journal_mode(wal)" +
216224 "&_pragma=synchronous(off)"
225+ createDB (t , name )
217226
218227 exe , err := os .Executable ()
219228 if err != nil {
220229 t .Fatal (err )
221230 }
222231
223- cmd := exec .Command (exe , append (os .Args [1 :], "-test.v" , "-test.run=Test_ChildProcess_wal" )... )
232+ cmd := exec .Command (exe , append (os .Args [1 :],
233+ "-test.v" , "-test.count=1" , "-test.run=Test_ChildProcess_wal" )... )
224234 out , err := cmd .StdoutPipe ()
235+ cmd .Stderr = os .Stderr
225236 if err != nil {
226237 t .Fatal (err )
227238 }
@@ -263,14 +274,14 @@ func Benchmark_parallel(b *testing.B) {
263274 b .Skip ("skipping without shared memory" )
264275 }
265276
266- sqlite3 .Initialize ()
267- b .ResetTimer ()
268-
269277 name := "file:" +
270278 filepath .Join (b .TempDir (), "test.db" ) +
271279 "?_pragma=busy_timeout(10000)" +
272280 "&_pragma=journal_mode(truncate)" +
273281 "&_pragma=synchronous(off)"
282+ createDB (b , name )
283+
284+ b .ResetTimer ()
274285 testParallel (b , name , b .N )
275286}
276287
@@ -279,55 +290,51 @@ func Benchmark_wal(b *testing.B) {
279290 b .Skip ("skipping without shared memory" )
280291 }
281292
282- sqlite3 .Initialize ()
283- b .ResetTimer ()
284-
285293 name := "file:" +
286294 filepath .Join (b .TempDir (), "test.db" ) +
287295 "?_pragma=busy_timeout(10000)" +
288296 "&_pragma=journal_mode(wal)" +
289297 "&_pragma=synchronous(off)"
298+ createDB (b , name )
299+
300+ b .ResetTimer ()
290301 testParallel (b , name , b .N )
291302}
292303
293304func Benchmark_memdb (b * testing.B ) {
294- sqlite3 .Initialize ()
295- b .ResetTimer ()
296-
297305 name := memdb .TestDB (b , url.Values {
298306 "_pragma" : {"busy_timeout(10000)" },
299307 })
308+ createDB (b , name )
309+
310+ b .ResetTimer ()
300311 testParallel (b , name , b .N )
301312}
302313
314+ func createDB (t testing.TB , name string ) {
315+ db , err := sqlite3 .Open (name )
316+ if err != nil {
317+ t .Fatal (err )
318+ }
319+ defer db .Close ()
320+
321+ err = db .Exec (`CREATE TABLE IF NOT EXISTS users (id INT, name VARCHAR(10))` )
322+ if err != nil {
323+ t .Fatal (err )
324+ }
325+ }
326+
303327func testParallel (t testing.TB , name string , n int ) {
304328 writer := func () error {
305329 db , err := sqlite3 .Open (name )
306330 if err != nil {
307- return err
331+ return fmt . Errorf ( "writer: open: %w" , err )
308332 }
309333 defer db .Close ()
310334
311- err = db .BusyHandler (func (ctx context.Context , count int ) (retry bool ) {
312- select {
313- case <- time .After (time .Millisecond ):
314- return true
315- case <- ctx .Done ():
316- return false
317- }
318- })
319- if err != nil {
320- return err
321- }
322-
323- err = db .Exec (`CREATE TABLE IF NOT EXISTS users (id INT, name VARCHAR(10))` )
324- if err != nil {
325- return err
326- }
327-
328335 err = db .Exec (`INSERT INTO users (id, name) VALUES (0, 'go'), (1, 'zig'), (2, 'whatever')` )
329336 if err != nil {
330- return err
337+ return fmt . Errorf ( "writer: insert: %w" , err )
331338 }
332339
333340 return db .Close ()
@@ -336,13 +343,13 @@ func testParallel(t testing.TB, name string, n int) {
336343 reader := func () error {
337344 db , err := sqlite3 .Open (name )
338345 if err != nil {
339- return err
346+ return fmt . Errorf ( "reader: open: %w" , err )
340347 }
341348 defer db .Close ()
342349
343350 stmt , _ , err := db .Prepare (`SELECT id, name FROM users` )
344351 if err != nil {
345- return err
352+ return fmt . Errorf ( "reader: select: %w" , err )
346353 }
347354 defer stmt .Close ()
348355
@@ -351,15 +358,15 @@ func testParallel(t testing.TB, name string, n int) {
351358 row ++
352359 }
353360 if err := stmt .Err (); err != nil {
354- return err
361+ return fmt . Errorf ( "reader: step: %w" , err )
355362 }
356363 if row % 3 != 0 {
357- t .Errorf ("got %d rows, want multiple of 3" , row )
364+ return fmt .Errorf ("reader: got %d rows, want multiple of 3" , row )
358365 }
359366
360367 err = stmt .Close ()
361368 if err != nil {
362- return err
369+ return fmt . Errorf ( "reader: close: %w" , err )
363370 }
364371
365372 return db .Close ()
0 commit comments