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