xref: /sqlite-3.40.0/test/permutations.test (revision 50f79f56)
1# 2008 June 21
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11#
12
13set testdir [file dirname $argv0]
14source $testdir/tester.tcl
15db close
16
17#-------------------------------------------------------------------------
18# test_suite NAME OPTIONS
19#
20# where available options are:
21#
22#       -description TITLE                  (default "")
23#       -initialize  SCRIPT                 (default "")
24#       -shutdown    SCRIPT                 (default "")
25#       -presql      SQL                    (default "")
26#       -files       LIST-OF-FILES          (default $::ALLTESTS)
27#       -prefix      NAME                   (default "$::NAME.")
28#       -dbconfig    SCRIPT                 (default "")
29#
30proc test_suite {name args} {
31
32  set default(-shutdown)    ""
33  set default(-initialize)  ""
34  set default(-presql)      ""
35  set default(-description) "no description supplied (fixme)"
36  set default(-files)       ""
37  set default(-prefix)      "${name}."
38  set default(-dbconfig)    ""
39
40  array set options [array get default]
41  if {[llength $args]%2} {
42    error "uneven number of options/switches passed to test_suite"
43  }
44  foreach {k v} $args {
45    set o [array names options ${k}*]
46    if {[llength $o]>1}  { error "ambiguous option: $k" }
47    if {[llength $o]==0} { error "unknown option: $k" }
48    set options([lindex $o 0]) $v
49  }
50
51  set     ::testspec($name) [array get options]
52  lappend ::testsuitelist $name
53}
54
55#-------------------------------------------------------------------------
56# test_set ARGS...
57#
58proc test_set {args} {
59  set isExclude 0
60  foreach a $args {
61    if {[string match -* $a]} {
62      switch -- $a {
63        -include { set isExclude 0 }
64        -exclude { set isExclude 1 }
65        default {
66          error "Unknown switch: $a"
67        }
68      }
69    } elseif {$isExclude == 0} {
70      foreach f $a { set t($f) 1 }
71    } else {
72      foreach f $a { array unset t $f }
73      foreach f $a { array unset t */$f }
74    }
75  }
76
77  return [array names t]
78}
79
80#-------------------------------------------------------------------------
81# Set up the following global list variables containing the names of
82# various test scripts:
83#
84#   $alltests
85#   $allquicktests
86#
87set alltests [list]
88foreach f [glob $testdir/*.test] { lappend alltests [file tail $f] }
89foreach f [glob -nocomplain $testdir/../ext/rtree/*.test] {
90  lappend alltests $f
91}
92
93if {$::tcl_platform(platform)!="unix"} {
94  set alltests [test_set $alltests -exclude crash.test crash2.test]
95}
96set alltests [test_set $alltests -exclude {
97  all.test        async.test         quick.test  veryquick.test
98  memleak.test    permutations.test  soak.test   fts3.test
99  mallocAll.test  rtree.test
100}]
101
102set allquicktests [test_set $alltests -exclude {
103  async2.test async3.test backup_ioerr.test corrupt.test
104  corruptC.test crash.test crash2.test crash3.test crash4.test crash5.test
105  crash6.test crash7.test delete3.test e_fts3.test fts3rnd.test
106  fkey_malloc.test fuzz.test fuzz3.test fuzz_malloc.test in2.test loadext.test
107  misc7.test mutex2.test notify2.test onefile.test pagerfault2.test
108  savepoint4.test savepoint6.test select9.test
109  speed1.test speed1p.test speed2.test speed3.test speed4.test
110  speed4p.test sqllimits1.test tkt2686.test thread001.test thread002.test
111  thread003.test thread004.test thread005.test trans2.test vacuum3.test
112  incrvacuum_ioerr.test autovacuum_crash.test btree8.test shared_err.test
113  vtab_err.test walslow.test walcrash.test walcrash3.test
114  walthread.test rtree3.test indexfault.test
115}]
116if {[info exists ::env(QUICKTEST_INCLUDE)]} {
117  set allquicktests [concat $allquicktests $::env(QUICKTEST_INCLUDE)]
118}
119
120#############################################################################
121# Start of tests
122#
123
124#-------------------------------------------------------------------------
125# Define the generic test suites:
126#
127#   veryquick
128#   quick
129#   full
130#
131lappend ::testsuitelist xxx
132
133test_suite "veryquick" -prefix "" -description {
134  "Very" quick test suite. Runs in less than 5 minutes on a workstation.
135  This test suite is the same as the "quick" tests, except that some files
136  that test malloc and IO errors are omitted.
137} -files [
138  test_set $allquicktests -exclude *malloc* *ioerr* *fault*
139]
140
141test_suite "valgrind" -prefix "" -description {
142  Run the "veryquick" test suite with a couple of multi-process tests (that
143  fail under valgrind) omitted.
144} -files [
145  test_set $allquicktests -exclude *malloc* *ioerr* *fault* wal.test
146] -initialize {
147  set ::G(valgrind) 1
148} -shutdown {
149  unset -nocomplain ::G(valgrind)
150}
151
152test_suite "quick" -prefix "" -description {
153  Quick test suite. Runs in around 10 minutes on a workstation.
154} -files [
155  test_set $allquicktests
156]
157
158test_suite "full" -prefix "" -description {
159  Full test suite. Takes a long time.
160} -files [
161  test_set $alltests
162] -initialize {
163  unset -nocomplain ::G(isquick)
164}
165
166test_suite "threads" -prefix "" -description {
167  All multi-threaded tests.
168} -files {
169  notify2.test   thread001.test thread002.test thread003.test
170  thread004.test thread005.test walthread.test
171}
172
173test_suite "fts3" -prefix "" -description {
174  All FTS3 tests except fts3rnd.test.
175} -files {
176  fts3aa.test fts3ab.test fts3ac.test fts3ad.test fts3ae.test
177  fts3af.test fts3ag.test fts3ah.test fts3ai.test fts3aj.test
178  fts3ak.test fts3al.test fts3am.test fts3an.test fts3ao.test
179  fts3atoken.test fts3b.test fts3c.test fts3cov.test fts3d.test
180  fts3defer.test fts3defer2.test fts3e.test fts3expr.test fts3expr2.test
181  fts3near.test fts3query.test fts3shared.test fts3snippet.test
182  fts3sort.test
183  fts3fault.test fts3malloc.test fts3matchinfo.test
184  fts3aux1.test fts3comp1.test fts3auto.test
185  fts4aa.test fts4content.test
186  fts3conf.test fts3prefix.test fts3fault2.test fts3corrupt.test
187  fts3corrupt2.test fts3first.test fts4langid.test fts4merge.test
188  fts4check.test
189}
190
191
192lappend ::testsuitelist xxx
193#-------------------------------------------------------------------------
194# Define the coverage related test suites:
195#
196#   coverage-wal
197#
198test_suite "coverage-wal" -description {
199  Coverage tests for file wal.c.
200} -files {
201  wal.test       wal2.test     wal3.test       walmode.test
202  walbak.test    walhook.test  walcrash2.test  walcksum.test
203  walfault.test  walbig.test   walnoshm.test
204  wal5.test
205}
206
207test_suite "coverage-pager" -description {
208  Coverage tests for file pager.c.
209} -files {
210  pager1.test    pager2.test  pagerfault.test  pagerfault2.test
211  walfault.test  walbak.test  journal2.test    tkt-9d68c883.test
212}
213
214
215lappend ::testsuitelist xxx
216#-------------------------------------------------------------------------
217# Define the permutation test suites:
218#
219
220# Run some tests using pre-allocated page and scratch blocks.
221#
222test_suite "memsubsys1" -description {
223  Tests using pre-allocated page and scratch blocks
224} -files [
225  test_set $::allquicktests -exclude ioerr5.test malloc5.test
226] -initialize {
227  catch {db close}
228  sqlite3_shutdown
229  sqlite3_config_pagecache 4096 24
230  sqlite3_config_scratch 25000 1
231  sqlite3_initialize
232  autoinstall_test_functions
233} -shutdown {
234  catch {db close}
235  sqlite3_shutdown
236  sqlite3_config_pagecache 0 0
237  sqlite3_config_scratch 0 0
238  sqlite3_initialize
239  autoinstall_test_functions
240}
241
242# Run some tests using pre-allocated page and scratch blocks. This time
243# the allocations are too small to use in most cases.
244#
245# Both ioerr5.test and malloc5.test are excluded because they test the
246# sqlite3_soft_heap_limit() and sqlite3_release_memory() functionality.
247# This functionality is disabled if a pre-allocated page block is provided.
248#
249test_suite "memsubsys2" -description {
250  Tests using small pre-allocated page and scratch blocks
251} -files [
252  test_set $::allquicktests -exclude ioerr5.test malloc5.test
253] -initialize {
254  catch {db close}
255  sqlite3_shutdown
256  sqlite3_config_pagecache 512 5
257  sqlite3_config_scratch 1000 1
258  sqlite3_initialize
259  autoinstall_test_functions
260} -shutdown {
261  catch {db close}
262  sqlite3_shutdown
263  sqlite3_config_pagecache 0 0
264  sqlite3_config_scratch 0 0
265  sqlite3_initialize
266  autoinstall_test_functions
267}
268
269# Run all tests with the lookaside allocator disabled.
270#
271test_suite "nolookaside" -description {
272  OOM tests with lookaside disabled
273} -initialize {
274  catch {db close}
275  sqlite3_shutdown
276  sqlite3_config_lookaside 0 0
277  sqlite3_initialize
278  autoinstall_test_functions
279} -shutdown {
280  catch {db close}
281  sqlite3_shutdown
282  sqlite3_config_lookaside 100 500
283  sqlite3_initialize
284  autoinstall_test_functions
285} -files $::allquicktests
286
287# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
288#
289test_suite "singlethread" -description {
290  Tests run in SQLITE_CONFIG_SINGLETHREAD mode
291} -initialize {
292  catch {db close}
293  sqlite3_shutdown
294  catch {sqlite3_config singlethread}
295  sqlite3_initialize
296  autoinstall_test_functions
297} -files {
298  delete.test   delete2.test  insert.test  rollback.test  select1.test
299  select2.test  trans.test    update.test  vacuum.test    types.test
300  types2.test   types3.test
301} -shutdown {
302  catch {db close}
303  sqlite3_shutdown
304  catch {sqlite3_config serialized}
305  sqlite3_initialize
306  autoinstall_test_functions
307}
308
309test_suite "nomutex" -description {
310  Tests run with the SQLITE_OPEN_MULTITHREADED flag passed to sqlite3_open().
311} -initialize {
312  rename sqlite3 sqlite3_nomutex
313  proc sqlite3 {args} {
314    if {[string range [lindex $args 0] 0 0] ne "-"} {
315      lappend args -fullmutex 0 -nomutex 1
316    }
317    uplevel [concat sqlite3_nomutex $args]
318  }
319} -files {
320  delete.test   delete2.test  insert.test  rollback.test  select1.test
321  select2.test  trans.test    update.test  vacuum.test    types.test
322  types2.test   types3.test
323} -shutdown {
324  rename sqlite3 {}
325  rename sqlite3_nomutex sqlite3
326}
327
328# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
329#
330test_suite "multithread" -description {
331  Tests run in SQLITE_CONFIG_MULTITHREAD mode
332} -initialize {
333  catch {db close}
334  sqlite3_shutdown
335  catch {sqlite3_config multithread}
336  sqlite3_initialize
337  autoinstall_test_functions
338} -files {
339  delete.test   delete2.test  insert.test  rollback.test  select1.test
340  select2.test  trans.test    update.test  vacuum.test    types.test
341  types2.test   types3.test
342} -shutdown {
343  catch {db close}
344  sqlite3_shutdown
345  catch {sqlite3_config serialized}
346  sqlite3_initialize
347  autoinstall_test_functions
348}
349
350# Run some tests in SQLITE_OPEN_FULLMUTEX mode.
351#
352test_suite "fullmutex" -description {
353  Tests run in SQLITE_OPEN_FULLMUTEX mode
354} -initialize {
355  rename sqlite3 sqlite3_fullmutex
356  proc sqlite3 {args} {
357    if {[string range [lindex $args 0] 0 0] ne "-"} {
358      lappend args -nomutex 0 -fullmutex 1
359    }
360    uplevel [concat sqlite3_fullmutex $args]
361  }
362} -files {
363  delete.test   delete2.test  insert.test  rollback.test  select1.test
364  select2.test  trans.test    update.test  vacuum.test    types.test
365  types2.test   types3.test
366} -shutdown {
367  rename sqlite3 {}
368  rename sqlite3_fullmutex sqlite3
369}
370
371# Run some tests using the "onefile" demo.
372#
373test_suite "onefile" -description {
374  Run some tests using the "test_onefile.c" demo
375} -initialize {
376  rename sqlite3 sqlite3_onefile
377  proc sqlite3 {args} {
378    if {[string range [lindex $args 0] 0 0] ne "-"} {
379      lappend args -vfs fs
380    }
381    uplevel [concat sqlite3_onefile $args]
382  }
383} -files {
384  conflict.test  insert.test   insert2.test  insert3.test
385  rollback.test  select1.test  select2.test  select3.test
386} -shutdown {
387  rename sqlite3 {}
388  rename sqlite3_onefile sqlite3
389}
390
391# Run some tests using UTF-16 databases.
392#
393test_suite "utf16" -description {
394  Run tests using UTF-16 databases
395} -presql {
396  pragma encoding = 'UTF-16'
397} -files {
398    alter.test alter3.test
399    auth.test bind.test blob.test capi2.test capi3.test collate1.test
400    collate2.test collate3.test collate4.test collate5.test collate6.test
401    conflict.test date.test delete.test expr.test fkey1.test func.test
402    hook.test index.test insert2.test insert.test interrupt.test in.test
403    intpkey.test ioerr.test join2.test join.test lastinsert.test
404    laststmtchanges.test limit.test lock2.test lock.test main.test
405    memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
406    null.test progress.test quote.test rowid.test select1.test select2.test
407    select3.test select4.test select5.test select6.test sort.test
408    subselect.test tableapi.test table.test temptable.test
409    trace.test trigger1.test trigger2.test trigger3.test
410    trigger4.test types2.test types.test unique.test update.test
411    vacuum.test view.test where.test
412}
413
414# Run some tests in exclusive locking mode.
415#
416test_suite "exclusive" -description {
417  Run tests in exclusive locking mode.
418} -presql {
419  pragma locking_mode = 'exclusive'
420} -files {
421  rollback.test select1.test select2.test
422  malloc.test ioerr.test
423}
424
425# Run some tests in exclusive locking mode with truncated journals.
426#
427test_suite "exclusive-truncate" -description {
428  Run tests in exclusive locking mode and truncate journal mode.
429} -presql {
430  pragma locking_mode = 'exclusive';
431  pragma journal_mode = TRUNCATE;
432} -files {
433  delete.test delete2.test insert.test rollback.test select1.test
434  select2.test update.test malloc.test ioerr.test
435}
436
437# Run some tests in persistent journal mode.
438#
439test_suite "persistent_journal" -description {
440  Run tests in persistent-journal mode.
441} -presql {
442  pragma journal_mode = persist
443} -files {
444  delete.test delete2.test insert.test rollback.test select1.test
445  select2.test trans.test update.test vacuum.test
446}
447
448# Run some tests in truncating journal mode.
449#
450test_suite "truncate_journal" -description {
451  Run tests in persistent-journal mode.
452} -presql {
453  pragma journal_mode = truncate
454} -files {
455  delete.test delete2.test insert.test rollback.test select1.test
456  select2.test trans.test update.test vacuum.test
457  malloc.test ioerr.test
458}
459
460# Run some error tests in persistent journal mode.
461#
462test_suite "persistent_journal_error" -description {
463  Run malloc.test and ioerr.test in persistent-journal mode.
464} -presql {
465  pragma journal_mode = persist
466} -files {
467  malloc.test ioerr.test
468}
469
470# Run some tests in no journal mode.
471#
472test_suite "no_journal" -description {
473  Run tests in no-journal mode.
474} -presql {
475  pragma journal_mode = persist
476} -files {
477  delete.test delete2.test insert.test rollback.test select1.test
478  select2.test trans.test update.test vacuum.test
479}
480
481# Run some error tests in no journal mode.
482#
483test_suite "no_journal_error" -description {
484  Run malloc.test and ioerr.test in no-journal mode.
485} -presql {
486  pragma journal_mode = persist
487} -files {
488  malloc.test ioerr.test
489}
490
491# Run some crash-tests in autovacuum mode.
492#
493test_suite "autovacuum_crash" -description {
494  Run crash.test in autovacuum mode.
495} -presql {
496  pragma auto_vacuum = 1
497} -files crash.test
498
499# Run some ioerr-tests in autovacuum mode.
500#
501test_suite "autovacuum_ioerr" -description {
502  Run ioerr.test in autovacuum mode.
503} -presql {
504  pragma auto_vacuum = 1
505} -files ioerr.test
506
507# Run tests with an in-memory journal.
508#
509test_suite "inmemory_journal" -description {
510  Run tests with an in-memory journal file.
511} -presql {
512  pragma journal_mode = 'memory'
513} -files [test_set $::allquicktests -exclude {
514  # Exclude all tests that simulate IO errors.
515  autovacuum_ioerr2.test incrvacuum_ioerr.test ioerr.test
516  ioerr.test ioerr2.test ioerr3.test ioerr4.test ioerr5.test
517  vacuum3.test incrblob_err.test diskfull.test backup_ioerr.test
518  e_fts3.test fts3cov.test fts3malloc.test fts3rnd.test
519  fts3snippet.test
520
521  # Exclude test scripts that use tcl IO to access journal files or count
522  # the number of fsync() calls.
523  pager.test exclusive.test jrnlmode.test sync.test misc1.test
524  journal1.test conflict.test crash8.test tkt3457.test io.test
525  journal3.test 8_3_names.test
526
527  pager1.test async4.test corrupt.test filefmt.test pager2.test
528  corrupt5.test corruptA.test pageropt.test
529
530  # Exclude stmt.test, which expects sub-journals to use temporary files.
531  stmt.test
532
533  zerodamage.test
534
535  # WAL mode is different.
536  wal* tkt-2d1a5c67d.test backcompat.test
537}]
538
539ifcapable mem3 {
540  test_suite "memsys3" -description {
541    Run tests using the allocator in mem3.c.
542  } -files [test_set $::allquicktests -exclude {
543    autovacuum.test           delete3.test              manydb.test
544    bigrow.test               incrblob2.test            memdb.test
545    bitvec.test               index2.test               memsubsys1.test
546    capi3c.test               ioerr.test                memsubsys2.test
547    capi3.test                join3.test                pagesize.test
548    collate5.test             limit.test                backup_ioerr.test
549    backup_malloc.test
550  }] -initialize {
551    catch {db close}
552    sqlite3_reset_auto_extension
553    sqlite3_shutdown
554    sqlite3_config_heap 25000000 0
555    sqlite3_config_lookaside 0 0
556    ifcapable mem5 {
557      # If both memsys3 and memsys5 are enabled in the build, the call to
558      # [sqlite3_config_heap] will initialize the system to use memsys5.
559      # The following overrides this preference and installs the memsys3
560      # allocator.
561      sqlite3_install_memsys3
562    }
563    install_malloc_faultsim 1
564    sqlite3_initialize
565    autoinstall_test_functions
566  } -shutdown {
567    catch {db close}
568    sqlite3_shutdown
569    sqlite3_config_heap 0 0
570    sqlite3_config_lookaside 100 500
571    install_malloc_faultsim 1
572    sqlite3_initialize
573    autoinstall_test_functions
574  }
575}
576
577ifcapable mem5 {
578  test_suite "memsys5" -description {
579    Run tests using the allocator in mem5.c.
580  } -files [test_set $::allquicktests -exclude {
581    autovacuum.test           delete3.test              manydb.test
582    bigrow.test               incrblob2.test            memdb.test
583    bitvec.test               index2.test               memsubsys1.test
584    capi3c.test               ioerr.test                memsubsys2.test
585    capi3.test                join3.test                pagesize.test
586    collate5.test             limit.test                zeroblob.test
587  }] -initialize {
588    catch {db close}
589    sqlite3_shutdown
590    sqlite3_config_heap 25000000 64
591    sqlite3_config_lookaside 0 0
592    install_malloc_faultsim 1
593    sqlite3_initialize
594    autoinstall_test_functions
595  } -shutdown {
596    catch {db close}
597    sqlite3_shutdown
598    sqlite3_config_heap 0 0
599    sqlite3_config_lookaside 100 500
600    install_malloc_faultsim 1
601    sqlite3_initialize
602    autoinstall_test_functions
603  }
604
605  test_suite "memsys5-2" -description {
606    Run tests using the allocator in mem5.c in a different configuration.
607  } -files {
608    select1.test
609  } -initialize {
610    catch {db close}
611    sqlite3_shutdown
612    sqlite3_config_memstatus 0
613    sqlite3_config_heap 40000000 16
614    sqlite3_config_lookaside 0 0
615    install_malloc_faultsim 1
616    sqlite3_initialize
617    autoinstall_test_functions
618  } -shutdown {
619    catch {db close}
620    sqlite3_shutdown
621    sqlite3_config_heap 0 0
622    sqlite3_config_lookaside 100 500
623    install_malloc_faultsim 1
624    sqlite3_initialize
625    autoinstall_test_functions
626  }
627}
628
629ifcapable threadsafe {
630  test_suite "no_mutex_try" -description {
631     The sqlite3_mutex_try() interface always fails
632  } -files [
633    test_set $::allquicktests -exclude mutex1.test mutex2.test
634  ] -initialize {
635    catch {db close}
636    sqlite3_shutdown
637    install_mutex_counters 1
638    set ::disable_mutex_try 1
639    sqlite3_initialize
640    autoinstall_test_functions
641  } -shutdown {
642    catch {db close}
643    sqlite3_shutdown
644    install_mutex_counters 0
645    sqlite3_initialize
646    autoinstall_test_functions
647  }
648}
649
650# run_tests "crash_safe_append" -description {
651#   Run crash.test with persistent journals on a SAFE_APPEND file-system.
652# } -initialize {
653#   rename crashsql sa_crashsql
654#   proc crashsql {args} {
655#     set options [lrange $args 0 [expr {[llength $args]-2}]]
656#     lappend options -char safe_append
657#     set sql [lindex $args end]
658#     lappend options "
659#       PRAGMA journal_mode=persistent;
660#       $sql
661#     "
662#     set fd [open test.db-journal w]
663#     puts $fd [string repeat 1234567890 100000]
664#     close $fd
665#     eval sa_crashsql $options
666#   }
667# } -shutdown {
668#   rename crashsql {}
669#   rename sa_crashsql crashsql
670# } -files crash.test
671
672test_suite "safe_append" -description {
673  Run some tests on a SAFE_APPEND file-system.
674} -initialize {
675  rename sqlite3 sqlite3_safeappend
676  proc sqlite3 {args} {
677    if {[string range [lindex $args 0] 0 0] ne "-"} {
678      lappend args -vfs devsym
679    }
680    uplevel [concat sqlite3_safeappend $args]
681  }
682  sqlite3_simulate_device -char safe_append
683} -shutdown {
684  rename sqlite3 {}
685  rename sqlite3_shutdown sqlite3
686} -files [
687  test_set $::allquicktests shared_err.test -exclude async3.test
688]
689
690# The set of tests to run on the alternative-pcache
691set perm-alt-pcache-testset {
692  async.test
693  attach.test
694  delete.test delete2.test
695  index.test
696  insert.test insert2.test
697  join.test join2.test
698  rollback.test
699  select1.test select2.test
700  trans.test
701  update.test
702}
703
704foreach discard_rate {0 10 50 90 100} {
705  test_suite "pcache${discard_rate}" -description "
706    Alternative pcache implementation with ${discard_rate}% random discard
707  " -initialize "
708    catch {db close}
709    sqlite3_shutdown
710    sqlite3_config_alt_pcache 1 $discard_rate 1
711    sqlite3_initialize
712    autoinstall_test_functions
713  " -shutdown {
714    catch {db close}
715    sqlite3_shutdown
716    sqlite3_config_alt_pcache 0 0 0
717    sqlite3_config_lookaside 100 500
718    install_malloc_faultsim 1
719    sqlite3_initialize
720    autoinstall_test_functions
721  } -files ${perm-alt-pcache-testset}
722}
723
724test_suite "journaltest" -description {
725  Check that pages are synced before being written (test_journal.c).
726} -initialize {
727  catch {db close}
728  register_jt_vfs -default ""
729} -shutdown {
730  unregister_jt_vfs
731} -files [test_set $::allquicktests -exclude {
732  wal* incrvacuum.test ioerr.test corrupt4.test io.test crash8.test
733  async4.test bigfile.test backcompat.test
734}]
735
736if {[info commands register_demovfs] != ""} {
737  test_suite "demovfs" -description {
738    Check that the demovfs (code in test_demovfs.c) more or less works.
739  } -initialize {
740    register_demovfs
741  } -shutdown {
742    unregister_demovfs
743  } -files {
744    insert.test   insert2.test  insert3.test rollback.test
745    select1.test  select2.test  select3.test
746  }
747}
748
749test_suite "wal" -description {
750  Run tests with journal_mode=WAL
751} -initialize {
752  set ::G(savepoint6_iterations) 100
753} -shutdown {
754  unset -nocomplain ::G(savepoint6_iterations)
755} -files {
756  savepoint.test     savepoint2.test     savepoint6.test
757  trans.test         avtrans.test
758
759  fts3aa.test  fts3ab.test  fts3ac.test  fts3ad.test
760  fts3ae.test  fts3af.test  fts3ag.test  fts3ah.test
761  fts3ai.test  fts3aj.test  fts3ak.test  fts3al.test
762  fts3am.test  fts3an.test  fts3ao.test  fts3b.test
763  fts3c.test   fts3d.test   fts3e.test   fts3query.test
764}
765
766test_suite "rtree" -description {
767  All R-tree related tests. Provides coverage of source file rtree.c.
768} -files [glob -nocomplain $::testdir/../ext/rtree/*.test]
769
770test_suite "no_optimization" -description {
771  Run test scripts with optimizations disabled using the
772  sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS) interface.
773} -files {
774  where.test where2.test where3.test where4.test where5.test
775  where6.test where7.test where8.test where9.test
776  whereA.test whereB.test wherelimit.test
777  select1.test select2.test select3.test select4.test select5.test
778  select7.test select8.test selectA.test selectC.test
779} -dbconfig {
780  optimization_control $::dbhandle all 0
781}
782
783test_suite "prepare" -description {
784  Run tests with the db connection using sqlite3_prepare() instead of _v2().
785} -dbconfig {
786  db_use_legacy_prepare $::dbhandle 1
787  #$::dbhandle cache size 0
788} -files [
789  test_set $allquicktests -exclude *malloc* *ioerr* *fault*
790]
791
792# End of tests
793#############################################################################
794
795# run_tests NAME OPTIONS
796#
797# where available options are:
798#
799#       -description TITLE
800#       -initialize  SCRIPT
801#       -shutdown    SCRIPT
802#       -presql      SQL
803#       -files       LIST-OF-FILES
804#       -prefix      NAME
805#
806proc run_tests {name args} {
807  array set options $args
808
809  set ::G(perm:name)         $name
810  set ::G(perm:prefix)       $options(-prefix)
811  set ::G(perm:presql)       $options(-presql)
812  set ::G(isquick)           1
813  set ::G(perm:dbconfig)     $options(-dbconfig)
814
815  uplevel $options(-initialize)
816
817  foreach file [lsort $options(-files)] {
818    if {[file tail $file] == $file} { set file [file join $::testdir $file] }
819    slave_test_file $file
820  }
821
822  uplevel $options(-shutdown)
823
824  unset ::G(perm:name)
825  unset ::G(perm:prefix)
826  unset ::G(perm:presql)
827  unset ::G(perm:dbconfig)
828}
829
830proc run_test_suite {name} {
831  if {[info exists ::testspec($name)]==0} {
832    error "No such test suite: $name"
833  }
834  uplevel run_tests $name $::testspec($name)
835}
836
837proc help {} {
838  puts "Usage: $::argv0 TESTSUITE ?TESTFILE?"
839  puts ""
840  puts "Available test-suites are:"
841  foreach k $::testsuitelist {
842    if {[info exists ::testspec($k)]==0} {
843      puts "         ----------------------------------------"
844      puts ""
845    } else {
846      array set o $::testspec($k)
847      puts "Test suite: \"$k\""
848      set d [string trim $o(-description)]
849      set d [regsub {\n *} $d "\n  "]
850      puts "  $d"
851      puts ""
852    }
853  }
854  exit -1
855}
856
857if {[info script] == $argv0} {
858  proc main {argv} {
859    if {[llength $argv]==0} {
860      help
861    } else {
862      set suite [lindex $argv 0]
863      if {[info exists ::testspec($suite)]==0} help
864      set extra ""
865      if {[llength $argv]>1} { set extra [list -files [lrange $argv 1 end]] }
866      eval run_tests $suite $::testspec($suite) $extra
867    }
868  }
869  main $argv
870  finish_test
871}
872