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