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