Merge branch 'prerelease' of ssh://git.zetetic.net/sqlcipher into prerelease
[sqlcipher.git] / test / permutations.test
blob0987daeb1d26735e29bb05d6fe5469b59f64b1b2
1 # 2008 June 21
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
13 set testdir [file dirname $argv0]
14 source $testdir/tester.tcl
15 db close
17 #-------------------------------------------------------------------------
18 # test_suite NAME OPTIONS
20 # where available options are:  
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 "")
30 proc test_suite {name args} {
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)    ""
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   }
51   set     ::testspec($name) [array get options]
52   lappend ::testsuitelist $name
55 #-------------------------------------------------------------------------
56 # test_set ARGS...
58 proc 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   }
77   return [array names t]
80 #-------------------------------------------------------------------------
81 # Set up the following global list variables containing the names of 
82 # various test scripts:
84 #   $alltests
85 #   $allquicktests
87 set alltests [list]
88 foreach f [glob $testdir/*.test] { lappend alltests [file tail $f] }
89 foreach f [glob -nocomplain            \
90     $testdir/../ext/rtree/*.test       \
91     $testdir/../ext/fts5/test/*.test   \
92     $testdir/../ext/expert/*.test      \
93     $testdir/../ext/lsm1/test/*.test   \
94 ] {
95   lappend alltests $f 
97 foreach f [glob -nocomplain $testdir/../ext/session/*.test] { 
98   lappend alltests $f 
101 if {$::tcl_platform(platform)!="unix"} {
102   set alltests [test_set $alltests -exclude crash.test crash2.test]
104 set alltests [test_set $alltests -exclude {
105   all.test        async.test         quick.test  veryquick.test
106   memleak.test    permutations.test  soak.test   fts3.test
107   mallocAll.test  rtree.test         full.test   extraquick.test
108   session.test    rbu.test
111 set allquicktests [test_set $alltests -exclude {
112   async2.test async3.test backup_ioerr.test corrupt.test
113   corruptC.test crash.test crash2.test crash3.test crash4.test crash5.test
114   crash6.test crash7.test delete3.test e_fts3.test fts3rnd.test
115   fkey_malloc.test fuzz.test fuzz3.test fuzz_malloc.test in2.test loadext.test
116   misc7.test mutex2.test notify2.test onefile.test pagerfault2.test 
117   savepoint4.test savepoint6.test select9.test 
118   speed1.test speed1p.test speed2.test speed3.test speed4.test 
119   speed4p.test sqllimits1.test tkt2686.test thread001.test thread002.test
120   thread003.test thread004.test thread005.test trans2.test vacuum3.test 
121   incrvacuum_ioerr.test autovacuum_crash.test btree8.test shared_err.test
122   vtab_err.test walslow.test walcrash.test walcrash3.test
123   walthread.test rtree3.test indexfault.test securedel2.test
124   sort3.test sort4.test fts4growth.test fts4growth2.test
125   bigsort.test walprotocol.test mmap4.test fuzzer2.test
126   walcrash2.test e_fkey.test backup.test
128   fts4merge.test fts4merge2.test fts4merge4.test fts4check.test
129   fts4merge5.test
130   fts3cov.test fts3snippet.test fts3corrupt2.test fts3an.test
131   fts3defer.test fts4langid.test fts3sort.test fts5unicode.test
133   rtree4.test
134   sessionbig.test
136 if {[info exists ::env(QUICKTEST_INCLUDE)]} {
137   set allquicktests [concat $allquicktests $::env(QUICKTEST_INCLUDE)]
139 if {[info exists ::env(QUICKTEST_OMIT)]} {
140   # If environment variable QUICKTEST_OMIT is set, it is a comma-separated
141   # list of regular expressions to match against test file names in
142   # the "allquicktests" set. Any matches are excluded. Only the filename
143   # is matched, not any directory component of the path.
144   set all [list]
145   foreach a $allquicktests {
146     set bIn 1
147     foreach x [split $::env(QUICKTEST_OMIT) ,] {
148       if {[regexp $x [file tail $a]]} {
149         set bIn 0
150         break
151       }
152     }
153     if {$bIn} {
154       lappend all $a
155     }
156   }
157   set allquicktests $all
160 # If the TEST_FAILURE environment variable is set, it means that we what to
161 # deliberately provoke test failures in order to test the test infrastructure.
162 # Only the main.test module is needed for this.
164 if {[info exists ::env(TEST_FAILURE)]} {
165   set allquicktests main.test
168 #############################################################################
169 # Start of tests
172 #-------------------------------------------------------------------------
173 # Define the generic test suites:
175 #   veryquick
176 #   quick
177 #   full
179 lappend ::testsuitelist xxx
181 test_suite "veryquick" -prefix "" -description {
182   "Very" quick test suite. Runs in minutes on a workstation.
183   This test suite is the same as the "quick" tests, except that some files
184   that test malloc and IO errors are omitted.
185 } -files [
186   test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
187       *fts5corrupt* *fts5big* *fts5aj*
190 test_suite "shell" -prefix "" -description {
191   Run tests of the command-line shell
192 } -files [
193   test_set [glob $testdir/shell*.test]
196 test_suite "extraquick" -prefix "" -description {
197   "Extra" quick test suite. Runs in a few minutes on a workstation.
198   This test suite is the same as the "veryquick" tests, except that
199   slower tests are omitted.
200 } -files [
201   test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
202      wal3.test fts4merge* sort2.test mmap1.test walcrash* \
203      percentile.test where8m.test walcksum.test savepoint3.test \
204      fuzzer1.test fuzzer3.test fts3expr3.test
207 test_suite "mmap" -prefix "mm-" -description {
208   Similar to veryquick. Except with memory mapping enabled.
209 } -presql {
210   pragma mmap_size = 268435456;
211 } -files [
212   test_set $allquicktests -exclude *malloc* *ioerr* *fault* -include malloc.test
215 test_suite "valgrind" -prefix "" -description {
216   Run the "veryquick" test suite with a couple of multi-process tests (that
217   fail under valgrind) omitted.
218 } -files [
219   test_set $allquicktests -exclude *malloc* *ioerr* *fault* *_err* wal.test \
220               shell*.test crash8.test atof1.test selectG.test \
221               tkt-fc62af4523.test numindex1.test corruptK.test
222 ] -initialize {
223   set ::G(valgrind) 1
224 } -shutdown {
225   unset -nocomplain ::G(valgrind)
228 test_suite "valgrind-nolookaside" -prefix "" -description {
229   Run the "veryquick" test suite with a couple of multi-process tests (that
230   fail under valgrind) omitted.
231 } -files [
232   test_set $allquicktests -exclude *malloc* *ioerr* *fault* *_err* \
233       wal.test atof1.test
234 ] -initialize {
235   set ::G(valgrind) 1
236   catch {db close}
237   sqlite3_shutdown
238   sqlite3_config_lookaside 0 0
239   sqlite3_initialize
240   autoinstall_test_functions
241 } -shutdown {
242   catch {db close}
243   sqlite3_shutdown
244   sqlite3_config_lookaside 100 500
245   sqlite3_initialize
246   autoinstall_test_functions
247   unset -nocomplain ::G(valgrind)
251 test_suite "quick" -prefix "" -description {
252   Quick test suite. Runs in around 10 minutes on a workstation.
253 } -files [
254   test_set $allquicktests
257 test_suite "full" -prefix "" -description {
258   Full test suite. Takes a long time.
259 } -files [ 
260   test_set $alltests 
261 ] -initialize {
262   unset -nocomplain ::G(isquick)
265 test_suite "threads" -prefix "" -description {
266   All multi-threaded tests.
267 } -files {
268   notify2.test   thread001.test thread002.test thread003.test 
269   thread004.test thread005.test walthread.test
272 test_suite "fts3" -prefix "" -description {
273   All FTS3 tests except fts3rnd.test.
274 } -files {
275   fts3aa.test fts3ab.test fts3ac.test fts3ad.test
276   fts3ae.test fts3af.test fts3ag.test fts3ah.test
277   fts3ai.test fts3aj.test fts3ak.test fts3al.test
278   fts3am.test fts3an.test fts3ao.test fts3atoken.test
279   fts3auto.test fts3aux1.test fts3aux2.test fts3b.test
280   fts3comp1.test fts3conf.test fts3corrupt2.test fts3corrupt.test
281   fts3corrupt4.test
282   fts3cov.test fts3c.test fts3defer2.test fts3defer3.test
283   fts3defer.test fts3drop.test fts3d.test fts3e.test
284   fts3expr2.test fts3expr3.test fts3expr4.test fts3expr5.test
285   fts3expr.test fts3fault2.test fts3fault.test fts3first.test
286   fts3join.test fts3malloc.test fts3matchinfo.test fts3near.test
287   fts3offsets.test fts3prefix2.test fts3prefix.test fts3query.test
288   fts3shared.test fts3snippet.test fts3sort.test fts3tok1.test
289   fts3tok_err.test fts3varint.test fts4aa.test fts4check.test
290   fts4content.test fts4docid.test fts4growth2.test fts4growth.test
291   fts4incr.test fts4langid.test fts4lastrowid.test fts4merge2.test
292   fts4merge4.test fts4merge.test fts4noti.test fts4onepass.test 
293   fts4opt.test fts4unicode.test
294   fts3corrupt3.test
295   fts3misc.test
298 test_suite "fts5" -prefix "" -description {
299   All FTS5 tests.
300 } -files [glob -nocomplain $::testdir/../ext/fts5/test/*.test]
302 test_suite "fts5-light" -prefix "" -description {
303   All FTS5 tests.
304 } -files [
305   test_set \
306       [glob -nocomplain $::testdir/../ext/fts5/test/*.test] \
307       -exclude *corrupt* *fault* *big* *fts5aj*
310 test_suite "window" -prefix "" -description {
311   All window function related tests .
312 } -files [
313   test_set [glob -nocomplain $::testdir/window*.test]
316 test_suite "lsm1" -prefix "" -description {
317   All LSM1 tests.
318 } -files [glob -nocomplain $::testdir/../ext/lsm1/test/*.test]
320 test_suite "nofaultsim" -prefix "" -description {
321   "Very" quick test suite. Runs in less than 5 minutes on a workstation. 
322   This test suite is the same as the "quick" tests, except that some files
323   that test malloc and IO errors are omitted.
324 } -files [
325   test_set $allquicktests -exclude *malloc* *ioerr* *fault* *_err*
326 ] -initialize {
327   catch {db close}
328   sqlite3_shutdown
329   install_malloc_faultsim 0
330   sqlite3_initialize
331   autoinstall_test_functions
332 } -shutdown {
333   unset -nocomplain ::G(valgrind)
336 test_suite "queryplanner" -prefix "" -description {
337   Tests of the query planner and query optimizer
338 } -files {
339   alter2.test alter3.test alter4.test alter.test analyze3.test
340   analyze4.test analyze5.test analyze6.test analyze7.test analyze8.test
341   analyze.test attach2.test attach3.test attach4.test
342   attach.test autoinc.test autoindex1.test between.test cast.test
343   check.test closure01.test coalesce.test collate1.test collate2.test
344   collate3.test collate4.test collate5.test collate6.test collate7.test
345   collate8.test collate9.test collateA.test colmeta.test colname.test
346   conflict.test count.test coveridxscan.test createtab.test cse.test
347   date.test dbstatus2.test dbstatus.test default.test delete2.test
348   delete3.test delete.test descidx1.test descidx2.test descidx3.test
349   distinctagg.test distinct.test e_createtable.test e_delete.test
350   e_droptrigger.test e_dropview.test e_expr.test e_insert.test
351   eqp.test e_reindex.test e_resolve.test e_select2.test e_select.test
352   e_update.test exists.test expr.test fkey1.test fkey2.test fkey3.test
353   fkey4.test fkey5.test func2.test func3.test func.test 
354   in3.test in4.test in5.test index2.test index3.test
355   index4.test index5.test indexedby.test index.test
356   insert2.test insert3.test insert4.test insert5.test insert.test
357   instr.test in.test intpkey.test join2.test join3.test join4.test
358   join5.test join6.test join.test like2.test like.test limit.test
359   minmax2.test minmax3.test minmax4.test minmax.test misc1.test misc2.test
360   misc3.test misc4.test misc5.test misc6.test misc7.test orderby1.test
361   orderby2.test orderby3.test orderby4.test randexpr1.test regexp1.test
362   reindex.test rowhash.test rowid.test schema2.test schema3.test
363   schema4.test schema5.test schema.test
364   select1.test select2.test select3.test select4.test select5.test
365   select6.test select7.test select8.test select9.test selectA.test
366   selectB.test selectC.test selectD.test selectE.test sidedelete.test
367   sort.test spellfix.test subquery2.test subquery.test subselect.test
368   substr.test tkt-02a8e81d44.test tkt1435.test tkt1443.test tkt1444.test
369   tkt1449.test tkt1473.test tkt1501.test tkt1512.test tkt1514.test
370   tkt1536.test tkt1537.test tkt1567.test tkt1644.test tkt1667.test
371   tkt1873.test tkt2141.test tkt2192.test tkt2213.test tkt2251.test
372   tkt2285.test tkt2332.test tkt2339.test tkt2391.test tkt2409.test
373   tkt2450.test tkt2565.test tkt2640.test tkt2643.test tkt2686.test
374   tkt-26ff0c2d1e.test tkt2767.test tkt2817.test tkt2820.test tkt2822.test
375   tkt2832.test tkt2854.test tkt2920.test tkt2927.test tkt2942.test
376   tkt-2a5629202f.test tkt-2d1a5c67d.test tkt-2ea2425d34.test tkt3080.test
377   tkt3093.test tkt3121.test tkt-31338dca7e.test tkt-313723c356.test
378   tkt3201.test tkt3292.test tkt3298.test tkt3334.test tkt3346.test
379   tkt3357.test tkt3419.test tkt3424.test tkt3442.test tkt3457.test
380   tkt3461.test tkt3493.test tkt3508.test tkt3522.test tkt3527.test
381   tkt3541.test tkt3554.test tkt3581.test tkt35xx.test tkt3630.test
382   tkt3718.test tkt3731.test tkt3757.test tkt3761.test tkt3762.test
383   tkt3773.test tkt3791.test tkt3793.test tkt3810.test tkt3824.test
384   tkt3832.test tkt3838.test tkt3841.test tkt-385a5b56b9.test tkt3871.test
385   tkt3879.test tkt-38cb5df375.test tkt3911.test tkt3918.test tkt3922.test
386   tkt3929.test tkt3935.test tkt3992.test tkt3997.test tkt-3998683a16.test
387   tkt-3a77c9714e.test tkt-3fe897352e.test tkt4018.test tkt-4a03edc4c8.test
388   tkt-4dd95f6943.test tkt-54844eea3f.test tkt-5d863f876e.test
389   tkt-5e10420e8d.test tkt-5ee23731f.test tkt-6bfb98dfc0.test
390   tkt-752e1646fc.test tkt-78e04e52ea.test tkt-7a31705a7e6.test
391   tkt-7bbfb7d442.test tkt-80ba201079.test tkt-80e031a00f.test
392   tkt-8454a207b9.test tkt-91e2e8ba6f.test tkt-94c04eaadb.test
393   tkt-9d68c883.test tkt-a7b7803e.test tkt-b1d3a2e531.test
394   tkt-b351d95f9.test tkt-b72787b1.test tkt-bd484a090c.test
395   tkt-bdc6bbbb38.test tkt-c48d99d690.test tkt-cbd054fa6b.test
396   tkt-d11f09d36e.test tkt-d635236375.test tkt-d82e3f3721.test
397   tkt-f3e5abed55.test tkt-f777251dc7a.test tkt-f7b4edec.test
398   tkt-f973c7ac31.test tkt-fa7bf5ec.test tkt-fc62af4523.test
399   tkt-fc7bd6358f.test trigger1.test trigger2.test trigger3.test
400   trigger4.test trigger5.test trigger6.test trigger7.test trigger8.test
401   trigger9.test triggerA.test triggerB.test triggerC.test triggerD.test
402   types2.test types3.test types.test unique.test unordered.test
403   update.test view.test vtab1.test vtab2.test vtab3.test vtab4.test
404   vtab5.test vtab6.test vtab7.test vtab8.test vtab9.test vtab_alter.test
405   vtabA.test vtabB.test vtabC.test vtabD.test vtabE.test
406   vtabF.test where2.test where3.test where4.test where5.test where6.test
407   where7.test where8m.test where8.test where9.test whereA.test whereB.test
408   whereC.test whereD.test whereE.test whereF.test wherelimit.test
409   where.test
412 test_suite "vfslog" -prefix "" -description {
413   "Vfslog" quick test suite. Like "veryquick" except does not omits
414   a few tests that do not work with a version 1 VFS. And the quota* tests,
415   which do not work with a VFS that uses the pVfs argument passed to
416   sqlite3_vfs methods.
417 } -files [
418   test_set $allquicktests -exclude *malloc* *ioerr* *fault* oserror.test \
419   pager1.test syscall.test sysfault.test tkt3457.test quota* superlock* \
420   wal* mmap*
423 test_suite "atomic-batch-write" -prefix "" -description {
424   Like veryquick.test, but must be run on a file-system that supports
425   atomic-batch-writes. Tests that depend on the journal file being present
426   are omitted.
427 } -files [
428   test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
429       *fts5corrupt* *fts5big* *fts5aj*  \
430       crash8.test delete_db.test        \
431       exclusive.test journal3.test      \
432       journal1.test                     \
433       jrnlmode.test jrnlmode2.test      \
434       lock4.test pager1.test            \
435       pager3.test sharedA.test          \
436       symlink.test stmt.test            \
437       sync.test sync2.test              \
438       tempdb.test tkt3457.test          \
439       vacuum5.test wal2.test            \
440       walmode.test zerodamage.test
441 ] -initialize {
442   if {[atomic_batch_write test.db]==0} {
443     error "File system does NOT support atomic-batch-write"
444   }
447 lappend ::testsuitelist xxx
448 #-------------------------------------------------------------------------
449 # Define the coverage related test suites:
451 #   coverage-wal
453 test_suite "coverage-wal" -description {
454   Coverage tests for file wal.c.
455 } -files {
456   wal.test wal2.test wal3.test wal4.test wal5.test
457   wal64k.test wal6.test wal7.test wal8.test wal9.test
458   walbak.test walbig.test walblock.test walcksum.test walcrash2.test
459   walcrash3.test walcrash4.test walcrash.test walfault.test walhook.test
460   walmode.test walnoshm.test waloverwrite.test walpersist.test 
461   walprotocol2.test walprotocol.test walro2.test walrofault.test 
462   walro.test walshared.test walslow.test walvfs.test
463   walfault2.test
464   nockpt.test
466   snapshot2.test snapshot3.test snapshot4.test
467   snapshot_fault.test snapshot.test snapshot_up.test
470 test_suite "coverage-pager" -description {
471   Coverage tests for file pager.c.
472 } -files {
473   pager1.test    pager2.test  pagerfault.test  pagerfault2.test
474   walfault.test  walbak.test  journal2.test    tkt-9d68c883.test
477 test_suite "coverage-analyze" -description {
478   Coverage tests for file analyze.c.
479 } -files {
480   analyze3.test analyze4.test analyze5.test analyze6.test
481   analyze7.test analyze8.test analyze9.test
482   analyze.test mallocA.test
485 test_suite "coverage-sorter" -description {
486   Coverage tests for file vdbesort.c.
487 } -files {
488   sort.test sortfault.test
492 lappend ::testsuitelist xxx
493 #-------------------------------------------------------------------------
494 # Define the permutation test suites:
497 # Run some tests using pre-allocated page blocks.
499 # mmap1.test is excluded because a good number of its tests depend on 
500 # the page-cache being larger than the database. But this permutation
501 # causes the effective limit on the page-cache to be just 24 pages.
503 test_suite "memsubsys1" -description {
504   Tests using pre-allocated page blocks
505 } -files [
506   test_set $::allquicktests -exclude ioerr5.test malloc5.test mmap1.test
507 ] -initialize {
508   test_set_config_pagecache 4096 24
509   catch {db close}
510   sqlite3_shutdown
511   sqlite3_initialize
512   autoinstall_test_functions
513 } -shutdown {
514   test_restore_config_pagecache
515   catch {db close}
516   sqlite3_shutdown
517   sqlite3_initialize
518   autoinstall_test_functions
521 # Run some tests using pre-allocated page blocks. This time
522 # the allocations are too small to use in most cases.
524 # Both ioerr5.test and malloc5.test are excluded because they test the
525 # sqlite3_soft_heap_limit() and sqlite3_release_memory() functionality.
526 # This functionality is disabled if a pre-allocated page block is provided.
528 test_suite "memsubsys2" -description {
529   Tests using small pre-allocated page blocks
530 } -files [
531   test_set $::allquicktests -exclude ioerr5.test malloc5.test
532 ] -initialize {
533   test_set_config_pagecache 512 5
534   catch {db close}
535   sqlite3_shutdown
536   sqlite3_initialize
537   autoinstall_test_functions
538 } -shutdown {
539   test_restore_config_pagecache
540   catch {db close}
541   sqlite3_shutdown
542   sqlite3_initialize
543   autoinstall_test_functions
546 # Run all tests with the lookaside allocator disabled.
548 test_suite "nolookaside" -description {
549   OOM tests with lookaside disabled
550 } -initialize {
551   catch {db close}
552   sqlite3_shutdown
553   sqlite3_config_lookaside 0 0
554   sqlite3_initialize
555   autoinstall_test_functions
556 } -shutdown {
557   catch {db close}
558   sqlite3_shutdown
559   sqlite3_config_lookaside 100 500
560   sqlite3_initialize
561   autoinstall_test_functions
562 } -files $::allquicktests
564 # Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
566 test_suite "singlethread" -description {
567   Tests run in SQLITE_CONFIG_SINGLETHREAD mode
568 } -initialize {
569   catch {db close}
570   sqlite3_shutdown
571   catch {sqlite3_config singlethread}
572   sqlite3_initialize
573   autoinstall_test_functions
574 } -files {
575   delete.test   delete2.test  insert.test  rollback.test  select1.test
576   select2.test  trans.test    update.test  vacuum.test    types.test
577   types2.test   types3.test
578 } -shutdown {
579   catch {db close}
580   sqlite3_shutdown
581   catch {sqlite3_config serialized}
582   sqlite3_initialize
583   autoinstall_test_functions
586 test_suite "nomutex" -description {
587   Tests run with the SQLITE_OPEN_MULTITHREADED flag passed to sqlite3_open().
588 } -initialize {
589   set ::G(perm:sqlite3_args) [list -fullmutex 0 -nomutex 1]
590 } -files {
591   delete.test   delete2.test  insert.test  rollback.test  select1.test
592   select2.test  trans.test    update.test  vacuum.test    types.test
593   types2.test   types3.test
596 # Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
598 test_suite "multithread" -description {
599   Tests run in SQLITE_CONFIG_MULTITHREAD mode
600 } -initialize {
601   catch {db close}
602   sqlite3_shutdown
603   catch {sqlite3_config multithread}
604   sqlite3_initialize
605   autoinstall_test_functions
606 } -files {
607   delete.test   delete2.test  insert.test  rollback.test  select1.test
608   select2.test  trans.test    update.test  vacuum.test    types.test
609   types2.test   types3.test   sort4.test
610 } -shutdown {
611   catch {db close}
612   sqlite3_shutdown
613   catch {sqlite3_config serialized}
614   sqlite3_initialize
615   autoinstall_test_functions
618 # Run some tests in SQLITE_OPEN_FULLMUTEX mode.
620 test_suite "fullmutex" -description {
621   Tests run in SQLITE_OPEN_FULLMUTEX mode
622 } -initialize {
623   set ::G(perm:sqlite3_args) [list -nomutex 0 -fullmutex 1]
624 } -files {
625   delete.test   delete2.test  insert.test  rollback.test  select1.test
626   select2.test  trans.test    update.test  vacuum.test    types.test
627   types2.test   types3.test
630 # Run some tests using the "onefile" demo.
632 test_suite "onefile" -description {
633   Run some tests using the "test_onefile.c" demo
634 } -initialize {
635   set ::G(perm:sqlite3_args) [list -vfs fs]
636 } -files {
637   conflict.test  insert.test   insert2.test  insert3.test
638   rollback.test  select1.test  select2.test  select3.test
641 # Run some tests using UTF-16 databases.
643 test_suite "utf16" -description {
644   Run tests using UTF-16 databases
645 } -presql {
646   pragma encoding = 'UTF-16'
647 } -files {
648     alter.test alter3.test
649     analyze.test analyze3.test analyze4.test analyze5.test analyze6.test
650     analyze7.test analyze8.test analyze9.test
651     auth.test bind.test blob.test capi2.test capi3.test collate1.test
652     collate2.test collate3.test collate4.test collate5.test collate6.test
653     conflict.test date.test delete.test expr.test fkey1.test func.test
654     hook.test index.test insert2.test insert.test interrupt.test in.test
655     intpkey.test ioerr.test join2.test join.test lastinsert.test
656     laststmtchanges.test limit.test lock2.test lock.test main.test 
657     memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
658     null.test progress.test quote.test rowid.test select1.test select2.test
659     select3.test select4.test select5.test select6.test sort.test 
660     subselect.test tableapi.test table.test temptable.test
661     trace.test trigger1.test trigger2.test trigger3.test
662     trigger4.test types2.test types.test unique.test update.test
663     vacuum.test view.test where.test
664     bestindex1.test
667 # Run some tests in exclusive locking mode.
669 test_suite "exclusive" -description {
670   Run tests in exclusive locking mode.
671 } -presql {
672   pragma locking_mode = 'exclusive'
673 } -files {
674   rollback.test select1.test select2.test 
675   malloc.test ioerr.test
678 # Run some tests in exclusive locking mode with truncated journals.
680 test_suite "exclusive-truncate" -description {
681   Run tests in exclusive locking mode and truncate journal mode.
682 } -presql {
683   pragma locking_mode = 'exclusive';
684   pragma journal_mode = TRUNCATE;
685 } -files {
686   delete.test delete2.test insert.test rollback.test select1.test
687   select2.test update.test malloc.test ioerr.test
690 # Run some tests in persistent journal mode.
692 test_suite "persistent_journal" -description {
693   Run tests in persistent-journal mode.
694 } -presql {
695   pragma journal_mode = persist
696 } -files {
697   delete.test delete2.test insert.test rollback.test select1.test
698   select2.test trans.test update.test vacuum.test 
701 # Run some tests in truncating journal mode.
703 test_suite "truncate_journal" -description {
704   Run tests in persistent-journal mode.
705 } -presql {
706   pragma journal_mode = truncate
707 } -files {
708   delete.test delete2.test insert.test rollback.test select1.test
709   select2.test trans.test update.test vacuum.test 
710   malloc.test ioerr.test
713 # Run some error tests in persistent journal mode.
715 test_suite "persistent_journal_error" -description {
716   Run malloc.test and ioerr.test in persistent-journal mode.
717 } -presql {
718   pragma journal_mode = persist
719 } -files {
720   malloc.test ioerr.test
723 # Run some tests in no journal mode.
725 test_suite "no_journal" -description {
726   Run tests in no-journal mode.
727 } -presql {
728   pragma journal_mode = persist
729 } -files {
730   delete.test delete2.test insert.test rollback.test select1.test
731   select2.test trans.test update.test vacuum.test 
734 # Run some error tests in no journal mode.
736 test_suite "no_journal_error" -description {
737   Run malloc.test and ioerr.test in no-journal mode.
738 } -presql {
739   pragma journal_mode = persist
740 } -files {
741   malloc.test ioerr.test
744 # Run some crash-tests in autovacuum mode.
746 test_suite "autovacuum_crash" -description {
747   Run crash.test in autovacuum mode.
748 } -presql {
749   pragma auto_vacuum = 1
750 } -files crash.test
752 # Run some ioerr-tests in autovacuum mode.
754 test_suite "autovacuum_ioerr" -description {
755   Run ioerr.test in autovacuum mode.
756 } -presql {
757   pragma auto_vacuum = 1
758 } -files ioerr.test
760 # Run tests with an in-memory journal.
762 test_suite "inmemory_journal" -description {
763   Run tests with an in-memory journal file.
764 } -presql {
765   pragma journal_mode = 'memory'
766 } -files [test_set $::allquicktests -exclude {
767   # Exclude all tests that simulate IO errors.
768   autovacuum_ioerr2.test cffault.test incrvacuum_ioerr.test ioerr.test
769   ioerr.test ioerr2.test ioerr3.test ioerr4.test ioerr5.test
770   vacuum3.test incrblob_err.test diskfull.test backup_ioerr.test
771   e_fts3.test fts3cov.test fts3malloc.test fts3rnd.test
772   fts3snippet.test mmapfault.test sessionfault.test sessionfault2.test
774   # Exclude test scripts that use tcl IO to access journal files or count
775   # the number of fsync() calls.
776   pager.test exclusive.test jrnlmode.test sync.test misc1.test 
777   journal1.test conflict.test crash8.test tkt3457.test io.test
778   journal3.test 8_3_names.test shmlock.test
780   pager1.test async4.test corrupt.test filefmt.test pager2.test
781   corrupt5.test corruptA.test pageropt.test
783   # Exclude stmt.test, which expects sub-journals to use temporary files.
784   stmt.test symlink.test
786   zerodamage.test
788   # WAL mode is different.
789   wal* tkt-2d1a5c67d.test backcompat.test e_wal* rowallock.test
791   # This test does not work as the "PRAGMA journal_mode = memory"
792   # statement switches the database out of wal mode at inopportune
793   # times.
794   snapshot_fault.test
795   
796   # This test assumes a journal file is created on disk.
797   delete_db.test
798   
799   # This test depends on a successful recovery from the pager error 
800   # state. Which is not possible with an in-memory journal
801   fts5fault1.test
804 ifcapable mem3 {
805   test_suite "memsys3" -description {
806     Run tests using the allocator in mem3.c.
807   } -files [test_set $::allquicktests -exclude {
808     autovacuum.test           delete3.test              manydb.test
809     bigrow.test               incrblob2.test            memdb.test
810     bitvec.test               index2.test               memsubsys1.test
811     capi3c.test               ioerr.test                memsubsys2.test
812     capi3.test                join3.test                pagesize.test
813     collate5.test             limit.test                backup_ioerr.test
814     backup_malloc.test
815   }] -initialize {
816     catch {db close}
817     sqlite3_reset_auto_extension
818     sqlite3_shutdown
819     sqlite3_config_heap 25000000 0
820     sqlite3_config_lookaside 0 0
821     ifcapable mem5 {
822       # If both memsys3 and memsys5 are enabled in the build, the call to
823       # [sqlite3_config_heap] will initialize the system to use memsys5.
824       # The following overrides this preference and installs the memsys3
825       # allocator.
826       sqlite3_install_memsys3
827     }
828     install_malloc_faultsim 1 
829     sqlite3_initialize
830     autoinstall_test_functions
831   } -shutdown {
832     catch {db close}
833     sqlite3_shutdown
834     sqlite3_config_heap 0 0
835     sqlite3_config_lookaside 100 500
836     install_malloc_faultsim 1 
837     sqlite3_initialize
838     autoinstall_test_functions
839   }
842 ifcapable mem5 {
843   test_suite "memsys5" -description {
844     Run tests using the allocator in mem5.c.
845   } -files [test_set $::allquicktests -exclude {
846     autovacuum.test           delete3.test              manydb.test
847     bigrow.test               incrblob2.test            memdb.test
848     bitvec.test               index2.test               memsubsys1.test
849     capi3c.test               ioerr.test                memsubsys2.test
850     capi3.test                join3.test                pagesize.test
851     collate5.test             limit.test                zeroblob.test
852   }] -initialize {
853     catch {db close}
854     sqlite3_shutdown
855     sqlite3_config_heap 25000000 64
856     sqlite3_config_lookaside 0 0
857     install_malloc_faultsim 1 
858     sqlite3_initialize
859     autoinstall_test_functions
860   } -shutdown {
861     catch {db close}
862     sqlite3_shutdown
863     sqlite3_config_heap 0 0
864     sqlite3_config_lookaside 100 500
865     install_malloc_faultsim 1 
866     sqlite3_initialize
867     autoinstall_test_functions
868   }
870   test_suite "memsys5-2" -description {
871     Run tests using the allocator in mem5.c in a different configuration.
872   } -files {
873     select1.test 
874   } -initialize {
875     catch {db close}
876     sqlite3_shutdown
877     sqlite3_config_memstatus 0
878     sqlite3_config_heap 40000000 16
879     sqlite3_config_lookaside 0 0
880     install_malloc_faultsim 1 
881     sqlite3_initialize
882     autoinstall_test_functions
883   } -shutdown {
884     catch {db close}
885     sqlite3_shutdown
886     sqlite3_config_heap 0 0
887     sqlite3_config_lookaside 100 500
888     install_malloc_faultsim 1 
889     sqlite3_initialize
890     autoinstall_test_functions
891   }
894 ifcapable threadsafe {
895   test_suite "no_mutex_try" -description {
896      The sqlite3_mutex_try() interface always fails
897   } -files [
898     test_set $::allquicktests -exclude mutex1.test mutex2.test
899   ] -initialize {
900     catch {db close}
901     sqlite3_shutdown
902     install_mutex_counters 1
903     set ::disable_mutex_try 1
904     sqlite3_initialize
905     autoinstall_test_functions
906   } -shutdown {
907     catch {db close}
908     sqlite3_shutdown
909     install_mutex_counters 0
910     sqlite3_initialize
911     autoinstall_test_functions
912   }
915 # run_tests "crash_safe_append" -description {
916 #   Run crash.test with persistent journals on a SAFE_APPEND file-system.
917 # } -initialize {
918 #   rename crashsql sa_crashsql
919 #   proc crashsql {args} {
920 #     set options [lrange $args 0 [expr {[llength $args]-2}]]
921 #     lappend options -char safe_append
922 #     set sql [lindex $args end]
923 #     lappend options "
924 #       PRAGMA journal_mode=persistent;
925 #       $sql
926 #     "
927 #     set fd [open test.db-journal w]
928 #     puts $fd [string repeat 1234567890 100000]
929 #     close $fd
930 #     eval sa_crashsql $options
931 #   }
932 # } -shutdown {
933 #   rename crashsql {}
934 #   rename sa_crashsql crashsql
935 # } -files crash.test
937 test_suite "safe_append" -description {
938   Run some tests on a SAFE_APPEND file-system.
939 } -initialize {
940   set ::G(perm:sqlite3_args) [list -vfs devsym]
941   sqlite3_simulate_device -char safe_append
942 } -files [
943   test_set $::allquicktests shared_err.test -exclude async3.test
946 # The set of tests to run on the alternative-pcache
947 set perm-alt-pcache-testset {
948   async.test
949   attach.test
950   delete.test delete2.test
951   index.test
952   insert.test insert2.test
953   join.test join2.test
954   rollback.test
955   select1.test select2.test
956   trans.test
957   update.test
960 foreach discard_rate {0 10 50 90 100} {
961   test_suite "pcache${discard_rate}" -description "
962     Alternative pcache implementation with ${discard_rate}% random discard
963   " -initialize "
964     catch {db close}
965     sqlite3_shutdown
966     sqlite3_config_alt_pcache 1 $discard_rate 1
967     sqlite3_initialize
968     autoinstall_test_functions
969   " -shutdown {
970     catch {db close}
971     sqlite3_shutdown
972     sqlite3_config_alt_pcache 0 0 0
973     sqlite3_config_lookaside 100 500
974     install_malloc_faultsim 1 
975     sqlite3_initialize
976     autoinstall_test_functions
977   } -files ${perm-alt-pcache-testset}
980 test_suite "journaltest" -description {
981   Check that pages are synced before being written (test_journal.c).
982 } -initialize {
983   catch {db close}
984   register_jt_vfs -default ""
985 } -shutdown {
986   unregister_jt_vfs
987 } -files [test_set $::allquicktests -exclude {
988   wal* incrvacuum.test ioerr.test corrupt4.test io.test crash8.test 
989   async4.test bigfile.test backcompat.test e_wal* fstat.test mmap2.test
990   pager1.test syscall.test tkt3457.test *malloc* mmap* multiplex* nolock*
991   pager2.test *fault* rowal* snapshot* superlock* symlink.test
992   delete_db.test shmlock.test chunksize.test
993   busy2.test avfs.test external_reader.test
996 if {[info commands register_demovfs] != ""} {
997   test_suite "demovfs" -description {
998     Check that the demovfs (code in test_demovfs.c) more or less works.
999   } -initialize {
1000     register_demovfs
1001   } -shutdown {
1002     unregister_demovfs
1003   } -files {
1004     insert.test   insert2.test  insert3.test rollback.test 
1005     select1.test  select2.test  select3.test
1006   }
1009 test_suite "wal" -description {
1010   Run tests with journal_mode=WAL
1011 } -initialize {
1012   set ::G(savepoint6_iterations) 100
1013 } -shutdown {
1014   unset -nocomplain ::G(savepoint6_iterations)
1015 } -files {
1016   savepoint.test     savepoint2.test     savepoint6.test
1017   trans.test         avtrans.test
1019   fts3aa.test  fts3ab.test  fts3ac.test  fts3ad.test
1020   fts3ae.test  fts3af.test  fts3ag.test  fts3ah.test
1021   fts3ai.test  fts3aj.test  fts3ak.test  fts3al.test
1022   fts3am.test  fts3an.test  fts3ao.test  fts3b.test
1023   fts3c.test   fts3d.test   fts3e.test   fts3query.test 
1026 test_suite "rtree" -description {
1027   All R-tree related tests. Provides coverage of source file rtree.c.
1028 } -files [glob -nocomplain $::testdir/../ext/rtree/*.test]
1030 test_suite "session" -description {
1031   All session module related tests. 
1032 } -files [glob -nocomplain $::testdir/../ext/session/*.test]
1034 test_suite "session_eec" -description {
1035   All session module related tests with sqlite3_extended_result_codes() set. 
1036 } -files [
1037   glob -nocomplain $::testdir/../ext/session/*.test
1038 ] -dbconfig {
1039   sqlite3_extended_result_codes $::dbhandle 1
1042 test_suite "session_strm" -description {
1043   All session module related tests using the streaming APIs.
1044 } -files [
1045   glob -nocomplain $::testdir/../ext/session/*.test
1046 ] -dbconfig {
1047   set ::sqlite3session_streams 1
1050 test_suite "rbu" -description {
1051   RBU tests.
1052 } -files [
1053   test_set [glob -nocomplain $::testdir/../ext/rbu/*.test] -exclude rbu.test
1056 test_suite "no_optimization" -description {
1057   Run test scripts with optimizations disabled using the
1058   sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS) interface.
1059 } -files [
1060   test_set \
1061     [glob -nocomplain $::testdir/window*.test]                       \
1062     where.test where2.test where3.test where4.test where5.test       \
1063     where6.test where7.test where8.test where9.test                  \
1064     whereA.test whereB.test wherelimit.test                          \
1065     select1.test select2.test select3.test select4.test select5.test \
1066     select7.test select8.test selectA.test selectC.test              \
1067     -exclude windowpushd.test
1068 ] -dbconfig {
1069   optimization_control $::dbhandle all 0
1072 test_suite "prepare" -description {
1073   Run tests with the db connection using sqlite3_prepare() instead of _v2().
1074 } -dbconfig {
1075   $::dbhandle version -use-legacy-prepare 1
1076   #$::dbhandle cache size 0
1077 } -files [
1078   test_set $allquicktests -exclude *malloc* *ioerr* *fault* \
1079       stmtvtab1.test index9.test
1082 test_suite "sorterref" -prefix "" -description {
1083   Run the "veryquick" test suite with SQLITE_CONFIG_SORTERREF_SIZE set
1084   to 0 so that sorter-references are used whenever possible.
1085 } -files [
1086   test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
1087       *fts5corrupt* *fts5big* *fts5aj*
1088 ] -initialize {
1089   catch {db close}
1090   sqlite3_shutdown
1091   sqlite3_config_sorterref 0
1092   sqlite3_initialize
1093   autoinstall_test_functions
1094 } -shutdown {
1095   catch {db close}
1096   sqlite3_shutdown
1097   sqlite3_config_sorterref -1
1098   sqlite3_initialize
1099   autoinstall_test_functions
1102 test_suite "maindbname" -prefix "" -description {
1103   Run the "veryquick" test suite with SQLITE_DBCONFIG_MAINDBNAME used to
1104   set the name of database 0 to "icecube".
1105 } -files [
1106   test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* *_err* \
1107       *fts5corrupt* *fts5big* *fts5aj*
1108 ] -dbconfig {
1109   dbconfig_maindbname_icecube $::dbhandle
1112 # End of tests
1113 #############################################################################
1115 # run_tests NAME OPTIONS
1117 # where available options are:  
1119 #       -description TITLE
1120 #       -initialize  SCRIPT
1121 #       -shutdown    SCRIPT
1122 #       -files       LIST-OF-FILES
1123 #       -prefix      NAME
1124 #       -dbconfig    SCRIPT
1126 proc run_tests {name args} {
1127   set options(-initialize) ""
1128   set options(-shutdown) ""
1129   set options(-prefix) ""
1130   set options(-dbconfig) ""
1131   set options(-presql) ""
1133   array set options $args
1135   set ::G(perm:name)         $name
1136   set ::G(perm:prefix)       $options(-prefix)
1137   set ::G(isquick)           1
1138   set ::G(perm:dbconfig)     $options(-dbconfig)
1139   set ::G(perm:presql)       $options(-presql)
1141   set filelist [lsort $options(-files)]
1142   if {[info exists ::env(TCLTEST_PART)]} {
1143     regexp {^([0-9]*)/([0-9]*)$} $::env(TCLTEST_PART) -> A B
1144     set nFile [expr {([llength $filelist]+$B-1)/$B}]
1145     set filelist [lrange $filelist [expr ($A-1)*$nFile] [expr $A*$nFile-1]]
1146   }
1148   foreach file $filelist {
1149     if {[file tail $file] == $file} { set file [file join $::testdir $file] }
1151     if {[info exists ::env(SQLITE_TEST_PATTERN_LIST)]} {
1152       set ok 0
1153       foreach p $::env(SQLITE_TEST_PATTERN_LIST) {
1154         set p [string map {% *} $p]
1155         if {[string match $p [file tail $file]]} {set ok 1 ; break}
1156       }
1157       if {!$ok} continue
1158     }
1160     uplevel $options(-initialize)
1161     slave_test_file $file
1162     uplevel $options(-shutdown)
1163     unset -nocomplain ::G(perm:sqlite3_args)
1164   }
1166   unset ::G(perm:name)
1167   unset ::G(perm:prefix)
1168   unset ::G(perm:dbconfig)
1169   unset ::G(perm:presql)
1172 proc run_test_suite {name} {
1173   if {[info exists ::testspec($name)]==0} {
1174     error "No such test suite: $name"
1175   }
1176   uplevel run_tests $name $::testspec($name)
1179 proc help {} {
1180   puts "Usage: $::argv0 TESTSUITE ?TESTFILE?"
1181   puts ""
1182   puts "Available test-suites are:"
1184   set iPos 0
1185   foreach k $::testsuitelist {
1186     if {[info exists ::testspec($k)]} {
1187       switch $iPos {
1188         0 {
1189           puts ""
1190           puts -nonewline "  [format %-30s $k]"
1191         }
1193         1 {
1194           puts -nonewline [format %-30s $k]
1195         }
1197         2 {
1198           puts -nonewline $k
1199         }
1200       }
1202       set iPos [expr (($iPos+1) % 3)]
1203     }
1204   }
1205   puts ""
1206   exit -1
1209 if {[file tail $argv0] == "permutations.test"} {
1210   proc main {argv} {
1211     if {[llength $argv]==0} {
1212       help
1213     } else {
1215       # See if the first argument is a named test-suite.
1216       #
1217       set suite [file tail [lindex $argv 0]]
1218       if {[info exists ::testspec($suite)]} {
1219         set S $::testspec($suite)
1220         set i 1
1221       } else {
1222         set suite default
1223         set S [list]
1224         set i 0
1225       }
1227       set extra ""
1228       if {$i < [llength $argv] && [string range [lindex $argv $i] 0 0]!="-" } {
1229         set files [list]
1230         for {} {$i < [llength $argv]} {incr i} {
1231           set pattern [string map {% *} [lindex $argv $i]]
1232           if {[string range $pattern 0 0]=="-"} break
1233           foreach f $::alltests {
1234             set tail [file tail $f]
1235             if {[lsearch $files $f]<0 && [string match $pattern $tail]} {
1236               lappend files $f
1237             }
1238           }
1239         }
1240         set extra [list -files $files]
1241       }
1243       eval [list run_tests $suite] $S $extra
1244     }
1245   }
1246   main $argv
1247   set argv {}
1248   finish_test