xref: /sqlite-3.40.0/test/permutations.test (revision 049d487e)
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         full.test
100}]
101
102set allquicktests [test_set $alltests -exclude {
103  async2.test async3.test backup_ioerr.test corrupt.test
104  corruptC.test crash.test crash2.test crash3.test crash4.test crash5.test
105  crash6.test crash7.test delete3.test e_fts3.test fts3rnd.test
106  fkey_malloc.test fuzz.test fuzz3.test fuzz_malloc.test in2.test loadext.test
107  misc7.test mutex2.test notify2.test onefile.test pagerfault2.test
108  savepoint4.test savepoint6.test select9.test
109  speed1.test speed1p.test speed2.test speed3.test speed4.test
110  speed4p.test sqllimits1.test tkt2686.test thread001.test thread002.test
111  thread003.test thread004.test thread005.test trans2.test vacuum3.test
112  incrvacuum_ioerr.test autovacuum_crash.test btree8.test shared_err.test
113  vtab_err.test walslow.test walcrash.test walcrash3.test
114  walthread.test rtree3.test indexfault.test securedel2.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 "mmap" -prefix "mm-" -description {
142  Similar to veryquick. Except with memory mapping disabled.
143} -presql {
144  pragma mmap_size = 268435456;
145} -files [
146  test_set $allquicktests -exclude *malloc* *ioerr* *fault* -include malloc.test
147]
148
149test_suite "valgrind" -prefix "" -description {
150  Run the "veryquick" test suite with a couple of multi-process tests (that
151  fail under valgrind) omitted.
152} -files [
153  test_set $allquicktests -exclude *malloc* *ioerr* *fault* wal.test atof1.test
154] -initialize {
155  set ::G(valgrind) 1
156} -shutdown {
157  unset -nocomplain ::G(valgrind)
158}
159
160test_suite "quick" -prefix "" -description {
161  Quick test suite. Runs in around 10 minutes on a workstation.
162} -files [
163  test_set $allquicktests
164]
165
166test_suite "full" -prefix "" -description {
167  Full test suite. Takes a long time.
168} -files [
169  test_set $alltests
170] -initialize {
171  unset -nocomplain ::G(isquick)
172}
173
174test_suite "threads" -prefix "" -description {
175  All multi-threaded tests.
176} -files {
177  notify2.test   thread001.test thread002.test thread003.test
178  thread004.test thread005.test walthread.test
179}
180
181test_suite "fts3" -prefix "" -description {
182  All FTS3 tests except fts3rnd.test.
183} -files {
184  fts3aa.test fts3ab.test fts3ac.test fts3ad.test fts3ae.test
185  fts3af.test fts3ag.test fts3ah.test fts3ai.test fts3aj.test
186  fts3ak.test fts3al.test fts3am.test fts3an.test fts3ao.test
187  fts3atoken.test fts3b.test fts3c.test fts3cov.test fts3d.test
188  fts3defer.test fts3defer2.test fts3e.test fts3expr.test fts3expr2.test
189  fts3expr3.test
190  fts3near.test fts3query.test fts3shared.test fts3snippet.test
191  fts3sort.test
192  fts3fault.test fts3malloc.test fts3matchinfo.test
193  fts3aux1.test fts3comp1.test fts3auto.test
194  fts4aa.test fts4content.test
195  fts3conf.test fts3prefix.test fts3fault2.test fts3corrupt.test
196  fts3corrupt2.test fts3first.test fts4langid.test fts4merge.test
197  fts4check.test fts4unicode.test fts4noti.test
198}
199
200test_suite "nofaultsim" -prefix "" -description {
201  "Very" quick test suite. Runs in less than 5 minutes on a workstation.
202  This test suite is the same as the "quick" tests, except that some files
203  that test malloc and IO errors are omitted.
204} -files [
205  test_set $allquicktests -exclude *malloc* *ioerr* *fault*
206] -initialize {
207  catch {db close}
208  sqlite3_shutdown
209  install_malloc_faultsim 0
210  sqlite3_initialize
211  autoinstall_test_functions
212} -shutdown {
213  unset -nocomplain ::G(valgrind)
214}
215
216test_suite "queryplanner" -prefix "" -description {
217  Tests of the query planner and query optimizer
218} -files {
219  alter2.test alter3.test alter4.test alter.test analyze3.test
220  analyze4.test analyze5.test analyze6.test analyze7.test analyze8.test
221  analyze.test attach2.test attach3.test attach4.test
222  attach.test autoinc.test autoindex1.test between.test cast.test
223  check.test closure01.test coalesce.test collate1.test collate2.test
224  collate3.test collate4.test collate5.test collate6.test collate7.test
225  collate8.test collate9.test collateA.test colmeta.test colname.test
226  conflict.test count.test coveridxscan.test createtab.test cse.test
227  date.test dbstatus2.test dbstatus.test default.test delete2.test
228  delete3.test delete.test descidx1.test descidx2.test descidx3.test
229  distinctagg.test distinct.test e_createtable.test e_delete.test
230  e_droptrigger.test e_dropview.test e_expr.test e_insert.test
231  eqp.test e_reindex.test e_resolve.test e_select2.test e_select.test
232  e_update.test exists.test expr.test fkey1.test fkey2.test fkey3.test
233  fkey4.test fkey5.test func2.test func3.test func.test
234  in3.test in4.test in5.test index2.test index3.test
235  index4.test index5.test indexedby.test index.test
236  insert2.test insert3.test insert4.test insert5.test insert.test
237  instr.test in.test intpkey.test join2.test join3.test join4.test
238  join5.test join6.test join.test like2.test like.test limit.test
239  minmax2.test minmax3.test minmax4.test minmax.test misc1.test misc2.test
240  misc3.test misc4.test misc5.test misc6.test misc7.test orderby1.test
241  orderby2.test orderby3.test orderby4.test randexpr1.test regexp1.test
242  reindex.test rowhash.test rowid.test schema2.test schema3.test
243  schema4.test schema5.test schema.test
244  select1.test select2.test select3.test select4.test select5.test
245  select6.test select7.test select8.test select9.test selectA.test
246  selectB.test selectC.test selectD.test selectE.test sidedelete.test
247  sort.test spellfix.test subquery2.test subquery.test subselect.test
248  substr.test tkt-02a8e81d44.test tkt1435.test tkt1443.test tkt1444.test
249  tkt1449.test tkt1473.test tkt1501.test tkt1512.test tkt1514.test
250  tkt1536.test tkt1537.test tkt1567.test tkt1644.test tkt1667.test
251  tkt1873.test tkt2141.test tkt2192.test tkt2213.test tkt2251.test
252  tkt2285.test tkt2332.test tkt2339.test tkt2391.test tkt2409.test
253  tkt2450.test tkt2565.test tkt2640.test tkt2643.test tkt2686.test
254  tkt-26ff0c2d1e.test tkt2767.test tkt2817.test tkt2820.test tkt2822.test
255  tkt2832.test tkt2854.test tkt2920.test tkt2927.test tkt2942.test
256  tkt-2a5629202f.test tkt-2d1a5c67d.test tkt-2ea2425d34.test tkt3080.test
257  tkt3093.test tkt3121.test tkt-31338dca7e.test tkt-313723c356.test
258  tkt3201.test tkt3292.test tkt3298.test tkt3334.test tkt3346.test
259  tkt3357.test tkt3419.test tkt3424.test tkt3442.test tkt3457.test
260  tkt3461.test tkt3493.test tkt3508.test tkt3522.test tkt3527.test
261  tkt3541.test tkt3554.test tkt3581.test tkt35xx.test tkt3630.test
262  tkt3718.test tkt3731.test tkt3757.test tkt3761.test tkt3762.test
263  tkt3773.test tkt3791.test tkt3793.test tkt3810.test tkt3824.test
264  tkt3832.test tkt3838.test tkt3841.test tkt-385a5b56b9.test tkt3871.test
265  tkt3879.test tkt-38cb5df375.test tkt3911.test tkt3918.test tkt3922.test
266  tkt3929.test tkt3935.test tkt3992.test tkt3997.test tkt-3998683a16.test
267  tkt-3a77c9714e.test tkt-3fe897352e.test tkt4018.test tkt-4a03edc4c8.test
268  tkt-4dd95f6943.test tkt-54844eea3f.test tkt-5d863f876e.test
269  tkt-5e10420e8d.test tkt-5ee23731f.test tkt-6bfb98dfc0.test
270  tkt-752e1646fc.test tkt-78e04e52ea.test tkt-7a31705a7e6.test
271  tkt-7bbfb7d442.test tkt-80ba201079.test tkt-80e031a00f.test
272  tkt-8454a207b9.test tkt-91e2e8ba6f.test tkt-94c04eaadb.test
273  tkt-9d68c883.test tkt-a7b7803e.test tkt-b1d3a2e531.test
274  tkt-b351d95f9.test tkt-b72787b1.test tkt-bd484a090c.test
275  tkt-bdc6bbbb38.test tkt-c48d99d690.test tkt-cbd054fa6b.test
276  tkt-d11f09d36e.test tkt-d635236375.test tkt-d82e3f3721.test
277  tkt-f3e5abed55.test tkt-f777251dc7a.test tkt-f7b4edec.test
278  tkt-f973c7ac31.test tkt-fa7bf5ec.test tkt-fc62af4523.test
279  tkt-fc7bd6358f.test trigger1.test trigger2.test trigger3.test
280  trigger4.test trigger5.test trigger6.test trigger7.test trigger8.test
281  trigger9.test triggerA.test triggerB.test triggerC.test triggerD.test
282  types2.test types3.test types.test unique.test unordered.test
283  update.test view.test vtab1.test vtab2.test vtab3.test vtab4.test
284  vtab5.test vtab6.test vtab7.test vtab8.test vtab9.test vtab_alter.test
285  vtabA.test vtabB.test vtabC.test vtabD.test vtabE.test
286  vtabF.test where2.test where3.test where4.test where5.test where6.test
287  where7.test where8m.test where8.test where9.test whereA.test whereB.test
288  whereC.test whereD.test whereE.test whereF.test wherelimit.test
289  where.test
290}
291
292lappend ::testsuitelist xxx
293#-------------------------------------------------------------------------
294# Define the coverage related test suites:
295#
296#   coverage-wal
297#
298test_suite "coverage-wal" -description {
299  Coverage tests for file wal.c.
300} -files {
301  wal.test       wal2.test     wal3.test       walmode.test
302  walbak.test    walhook.test  walcrash2.test  walcksum.test
303  walfault.test  walbig.test   walnoshm.test
304  wal5.test
305}
306
307test_suite "coverage-pager" -description {
308  Coverage tests for file pager.c.
309} -files {
310  pager1.test    pager2.test  pagerfault.test  pagerfault2.test
311  walfault.test  walbak.test  journal2.test    tkt-9d68c883.test
312}
313
314
315lappend ::testsuitelist xxx
316#-------------------------------------------------------------------------
317# Define the permutation test suites:
318#
319
320# Run some tests using pre-allocated page and scratch blocks.
321#
322# mmap1.test is excluded because a good number of its tests depend on
323# the page-cache being larger than the database. But this permutation
324# causes the effective limit on the page-cache to be just 24 pages.
325#
326test_suite "memsubsys1" -description {
327  Tests using pre-allocated page and scratch blocks
328} -files [
329  test_set $::allquicktests -exclude ioerr5.test malloc5.test mmap1.test
330] -initialize {
331  catch {db close}
332  sqlite3_shutdown
333  sqlite3_config_pagecache 4096 24
334  sqlite3_config_scratch 25000 1
335  sqlite3_initialize
336  autoinstall_test_functions
337} -shutdown {
338  catch {db close}
339  sqlite3_shutdown
340  sqlite3_config_pagecache 0 0
341  sqlite3_config_scratch 0 0
342  sqlite3_initialize
343  autoinstall_test_functions
344}
345
346# Run some tests using pre-allocated page and scratch blocks. This time
347# the allocations are too small to use in most cases.
348#
349# Both ioerr5.test and malloc5.test are excluded because they test the
350# sqlite3_soft_heap_limit() and sqlite3_release_memory() functionality.
351# This functionality is disabled if a pre-allocated page block is provided.
352#
353test_suite "memsubsys2" -description {
354  Tests using small pre-allocated page and scratch blocks
355} -files [
356  test_set $::allquicktests -exclude ioerr5.test malloc5.test
357] -initialize {
358  catch {db close}
359  sqlite3_shutdown
360  sqlite3_config_pagecache 512 5
361  sqlite3_config_scratch 1000 1
362  sqlite3_initialize
363  autoinstall_test_functions
364} -shutdown {
365  catch {db close}
366  sqlite3_shutdown
367  sqlite3_config_pagecache 0 0
368  sqlite3_config_scratch 0 0
369  sqlite3_initialize
370  autoinstall_test_functions
371}
372
373# Run all tests with the lookaside allocator disabled.
374#
375test_suite "nolookaside" -description {
376  OOM tests with lookaside disabled
377} -initialize {
378  catch {db close}
379  sqlite3_shutdown
380  sqlite3_config_lookaside 0 0
381  sqlite3_initialize
382  autoinstall_test_functions
383} -shutdown {
384  catch {db close}
385  sqlite3_shutdown
386  sqlite3_config_lookaside 100 500
387  sqlite3_initialize
388  autoinstall_test_functions
389} -files $::allquicktests
390
391# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
392#
393test_suite "singlethread" -description {
394  Tests run in SQLITE_CONFIG_SINGLETHREAD mode
395} -initialize {
396  catch {db close}
397  sqlite3_shutdown
398  catch {sqlite3_config singlethread}
399  sqlite3_initialize
400  autoinstall_test_functions
401} -files {
402  delete.test   delete2.test  insert.test  rollback.test  select1.test
403  select2.test  trans.test    update.test  vacuum.test    types.test
404  types2.test   types3.test
405} -shutdown {
406  catch {db close}
407  sqlite3_shutdown
408  catch {sqlite3_config serialized}
409  sqlite3_initialize
410  autoinstall_test_functions
411}
412
413test_suite "nomutex" -description {
414  Tests run with the SQLITE_OPEN_MULTITHREADED flag passed to sqlite3_open().
415} -initialize {
416  rename sqlite3 sqlite3_nomutex
417  proc sqlite3 {args} {
418    if {[string range [lindex $args 0] 0 0] ne "-"} {
419      lappend args -fullmutex 0 -nomutex 1
420    }
421    uplevel [concat sqlite3_nomutex $args]
422  }
423} -files {
424  delete.test   delete2.test  insert.test  rollback.test  select1.test
425  select2.test  trans.test    update.test  vacuum.test    types.test
426  types2.test   types3.test
427} -shutdown {
428  rename sqlite3 {}
429  rename sqlite3_nomutex sqlite3
430}
431
432# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
433#
434test_suite "multithread" -description {
435  Tests run in SQLITE_CONFIG_MULTITHREAD mode
436} -initialize {
437  catch {db close}
438  sqlite3_shutdown
439  catch {sqlite3_config multithread}
440  sqlite3_initialize
441  autoinstall_test_functions
442} -files {
443  delete.test   delete2.test  insert.test  rollback.test  select1.test
444  select2.test  trans.test    update.test  vacuum.test    types.test
445  types2.test   types3.test
446} -shutdown {
447  catch {db close}
448  sqlite3_shutdown
449  catch {sqlite3_config serialized}
450  sqlite3_initialize
451  autoinstall_test_functions
452}
453
454# Run some tests in SQLITE_OPEN_FULLMUTEX mode.
455#
456test_suite "fullmutex" -description {
457  Tests run in SQLITE_OPEN_FULLMUTEX mode
458} -initialize {
459  rename sqlite3 sqlite3_fullmutex
460  proc sqlite3 {args} {
461    if {[string range [lindex $args 0] 0 0] ne "-"} {
462      lappend args -nomutex 0 -fullmutex 1
463    }
464    uplevel [concat sqlite3_fullmutex $args]
465  }
466} -files {
467  delete.test   delete2.test  insert.test  rollback.test  select1.test
468  select2.test  trans.test    update.test  vacuum.test    types.test
469  types2.test   types3.test
470} -shutdown {
471  rename sqlite3 {}
472  rename sqlite3_fullmutex sqlite3
473}
474
475# Run some tests using the "onefile" demo.
476#
477test_suite "onefile" -description {
478  Run some tests using the "test_onefile.c" demo
479} -initialize {
480  rename sqlite3 sqlite3_onefile
481  proc sqlite3 {args} {
482    if {[string range [lindex $args 0] 0 0] ne "-"} {
483      lappend args -vfs fs
484    }
485    uplevel [concat sqlite3_onefile $args]
486  }
487} -files {
488  conflict.test  insert.test   insert2.test  insert3.test
489  rollback.test  select1.test  select2.test  select3.test
490} -shutdown {
491  rename sqlite3 {}
492  rename sqlite3_onefile sqlite3
493}
494
495# Run some tests using UTF-16 databases.
496#
497test_suite "utf16" -description {
498  Run tests using UTF-16 databases
499} -presql {
500  pragma encoding = 'UTF-16'
501} -files {
502    alter.test alter3.test
503    auth.test bind.test blob.test capi2.test capi3.test collate1.test
504    collate2.test collate3.test collate4.test collate5.test collate6.test
505    conflict.test date.test delete.test expr.test fkey1.test func.test
506    hook.test index.test insert2.test insert.test interrupt.test in.test
507    intpkey.test ioerr.test join2.test join.test lastinsert.test
508    laststmtchanges.test limit.test lock2.test lock.test main.test
509    memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
510    null.test progress.test quote.test rowid.test select1.test select2.test
511    select3.test select4.test select5.test select6.test sort.test
512    subselect.test tableapi.test table.test temptable.test
513    trace.test trigger1.test trigger2.test trigger3.test
514    trigger4.test types2.test types.test unique.test update.test
515    vacuum.test view.test where.test
516}
517
518# Run some tests in exclusive locking mode.
519#
520test_suite "exclusive" -description {
521  Run tests in exclusive locking mode.
522} -presql {
523  pragma locking_mode = 'exclusive'
524} -files {
525  rollback.test select1.test select2.test
526  malloc.test ioerr.test
527}
528
529# Run some tests in exclusive locking mode with truncated journals.
530#
531test_suite "exclusive-truncate" -description {
532  Run tests in exclusive locking mode and truncate journal mode.
533} -presql {
534  pragma locking_mode = 'exclusive';
535  pragma journal_mode = TRUNCATE;
536} -files {
537  delete.test delete2.test insert.test rollback.test select1.test
538  select2.test update.test malloc.test ioerr.test
539}
540
541# Run some tests in persistent journal mode.
542#
543test_suite "persistent_journal" -description {
544  Run tests in persistent-journal mode.
545} -presql {
546  pragma journal_mode = persist
547} -files {
548  delete.test delete2.test insert.test rollback.test select1.test
549  select2.test trans.test update.test vacuum.test
550}
551
552# Run some tests in truncating journal mode.
553#
554test_suite "truncate_journal" -description {
555  Run tests in persistent-journal mode.
556} -presql {
557  pragma journal_mode = truncate
558} -files {
559  delete.test delete2.test insert.test rollback.test select1.test
560  select2.test trans.test update.test vacuum.test
561  malloc.test ioerr.test
562}
563
564# Run some error tests in persistent journal mode.
565#
566test_suite "persistent_journal_error" -description {
567  Run malloc.test and ioerr.test in persistent-journal mode.
568} -presql {
569  pragma journal_mode = persist
570} -files {
571  malloc.test ioerr.test
572}
573
574# Run some tests in no journal mode.
575#
576test_suite "no_journal" -description {
577  Run tests in no-journal mode.
578} -presql {
579  pragma journal_mode = persist
580} -files {
581  delete.test delete2.test insert.test rollback.test select1.test
582  select2.test trans.test update.test vacuum.test
583}
584
585# Run some error tests in no journal mode.
586#
587test_suite "no_journal_error" -description {
588  Run malloc.test and ioerr.test in no-journal mode.
589} -presql {
590  pragma journal_mode = persist
591} -files {
592  malloc.test ioerr.test
593}
594
595# Run some crash-tests in autovacuum mode.
596#
597test_suite "autovacuum_crash" -description {
598  Run crash.test in autovacuum mode.
599} -presql {
600  pragma auto_vacuum = 1
601} -files crash.test
602
603# Run some ioerr-tests in autovacuum mode.
604#
605test_suite "autovacuum_ioerr" -description {
606  Run ioerr.test in autovacuum mode.
607} -presql {
608  pragma auto_vacuum = 1
609} -files ioerr.test
610
611# Run tests with an in-memory journal.
612#
613test_suite "inmemory_journal" -description {
614  Run tests with an in-memory journal file.
615} -presql {
616  pragma journal_mode = 'memory'
617} -files [test_set $::allquicktests -exclude {
618  # Exclude all tests that simulate IO errors.
619  autovacuum_ioerr2.test incrvacuum_ioerr.test ioerr.test
620  ioerr.test ioerr2.test ioerr3.test ioerr4.test ioerr5.test
621  vacuum3.test incrblob_err.test diskfull.test backup_ioerr.test
622  e_fts3.test fts3cov.test fts3malloc.test fts3rnd.test
623  fts3snippet.test
624
625  # Exclude test scripts that use tcl IO to access journal files or count
626  # the number of fsync() calls.
627  pager.test exclusive.test jrnlmode.test sync.test misc1.test
628  journal1.test conflict.test crash8.test tkt3457.test io.test
629  journal3.test 8_3_names.test
630
631  pager1.test async4.test corrupt.test filefmt.test pager2.test
632  corrupt5.test corruptA.test pageropt.test
633
634  # Exclude stmt.test, which expects sub-journals to use temporary files.
635  stmt.test
636
637  zerodamage.test
638
639  # WAL mode is different.
640  wal* tkt-2d1a5c67d.test backcompat.test
641}]
642
643ifcapable mem3 {
644  test_suite "memsys3" -description {
645    Run tests using the allocator in mem3.c.
646  } -files [test_set $::allquicktests -exclude {
647    autovacuum.test           delete3.test              manydb.test
648    bigrow.test               incrblob2.test            memdb.test
649    bitvec.test               index2.test               memsubsys1.test
650    capi3c.test               ioerr.test                memsubsys2.test
651    capi3.test                join3.test                pagesize.test
652    collate5.test             limit.test                backup_ioerr.test
653    backup_malloc.test
654  }] -initialize {
655    catch {db close}
656    sqlite3_reset_auto_extension
657    sqlite3_shutdown
658    sqlite3_config_heap 25000000 0
659    sqlite3_config_lookaside 0 0
660    ifcapable mem5 {
661      # If both memsys3 and memsys5 are enabled in the build, the call to
662      # [sqlite3_config_heap] will initialize the system to use memsys5.
663      # The following overrides this preference and installs the memsys3
664      # allocator.
665      sqlite3_install_memsys3
666    }
667    install_malloc_faultsim 1
668    sqlite3_initialize
669    autoinstall_test_functions
670  } -shutdown {
671    catch {db close}
672    sqlite3_shutdown
673    sqlite3_config_heap 0 0
674    sqlite3_config_lookaside 100 500
675    install_malloc_faultsim 1
676    sqlite3_initialize
677    autoinstall_test_functions
678  }
679}
680
681ifcapable mem5 {
682  test_suite "memsys5" -description {
683    Run tests using the allocator in mem5.c.
684  } -files [test_set $::allquicktests -exclude {
685    autovacuum.test           delete3.test              manydb.test
686    bigrow.test               incrblob2.test            memdb.test
687    bitvec.test               index2.test               memsubsys1.test
688    capi3c.test               ioerr.test                memsubsys2.test
689    capi3.test                join3.test                pagesize.test
690    collate5.test             limit.test                zeroblob.test
691  }] -initialize {
692    catch {db close}
693    sqlite3_shutdown
694    sqlite3_config_heap 25000000 64
695    sqlite3_config_lookaside 0 0
696    install_malloc_faultsim 1
697    sqlite3_initialize
698    autoinstall_test_functions
699  } -shutdown {
700    catch {db close}
701    sqlite3_shutdown
702    sqlite3_config_heap 0 0
703    sqlite3_config_lookaside 100 500
704    install_malloc_faultsim 1
705    sqlite3_initialize
706    autoinstall_test_functions
707  }
708
709  test_suite "memsys5-2" -description {
710    Run tests using the allocator in mem5.c in a different configuration.
711  } -files {
712    select1.test
713  } -initialize {
714    catch {db close}
715    sqlite3_shutdown
716    sqlite3_config_memstatus 0
717    sqlite3_config_heap 40000000 16
718    sqlite3_config_lookaside 0 0
719    install_malloc_faultsim 1
720    sqlite3_initialize
721    autoinstall_test_functions
722  } -shutdown {
723    catch {db close}
724    sqlite3_shutdown
725    sqlite3_config_heap 0 0
726    sqlite3_config_lookaside 100 500
727    install_malloc_faultsim 1
728    sqlite3_initialize
729    autoinstall_test_functions
730  }
731}
732
733ifcapable threadsafe {
734  test_suite "no_mutex_try" -description {
735     The sqlite3_mutex_try() interface always fails
736  } -files [
737    test_set $::allquicktests -exclude mutex1.test mutex2.test
738  ] -initialize {
739    catch {db close}
740    sqlite3_shutdown
741    install_mutex_counters 1
742    set ::disable_mutex_try 1
743    sqlite3_initialize
744    autoinstall_test_functions
745  } -shutdown {
746    catch {db close}
747    sqlite3_shutdown
748    install_mutex_counters 0
749    sqlite3_initialize
750    autoinstall_test_functions
751  }
752}
753
754# run_tests "crash_safe_append" -description {
755#   Run crash.test with persistent journals on a SAFE_APPEND file-system.
756# } -initialize {
757#   rename crashsql sa_crashsql
758#   proc crashsql {args} {
759#     set options [lrange $args 0 [expr {[llength $args]-2}]]
760#     lappend options -char safe_append
761#     set sql [lindex $args end]
762#     lappend options "
763#       PRAGMA journal_mode=persistent;
764#       $sql
765#     "
766#     set fd [open test.db-journal w]
767#     puts $fd [string repeat 1234567890 100000]
768#     close $fd
769#     eval sa_crashsql $options
770#   }
771# } -shutdown {
772#   rename crashsql {}
773#   rename sa_crashsql crashsql
774# } -files crash.test
775
776test_suite "safe_append" -description {
777  Run some tests on a SAFE_APPEND file-system.
778} -initialize {
779  rename sqlite3 sqlite3_safeappend
780  proc sqlite3 {args} {
781    if {[string range [lindex $args 0] 0 0] ne "-"} {
782      lappend args -vfs devsym
783    }
784    uplevel [concat sqlite3_safeappend $args]
785  }
786  sqlite3_simulate_device -char safe_append
787} -shutdown {
788  rename sqlite3 {}
789  rename sqlite3_shutdown sqlite3
790} -files [
791  test_set $::allquicktests shared_err.test -exclude async3.test
792]
793
794# The set of tests to run on the alternative-pcache
795set perm-alt-pcache-testset {
796  async.test
797  attach.test
798  delete.test delete2.test
799  index.test
800  insert.test insert2.test
801  join.test join2.test
802  rollback.test
803  select1.test select2.test
804  trans.test
805  update.test
806}
807
808foreach discard_rate {0 10 50 90 100} {
809  test_suite "pcache${discard_rate}" -description "
810    Alternative pcache implementation with ${discard_rate}% random discard
811  " -initialize "
812    catch {db close}
813    sqlite3_shutdown
814    sqlite3_config_alt_pcache 1 $discard_rate 1
815    sqlite3_initialize
816    autoinstall_test_functions
817  " -shutdown {
818    catch {db close}
819    sqlite3_shutdown
820    sqlite3_config_alt_pcache 0 0 0
821    sqlite3_config_lookaside 100 500
822    install_malloc_faultsim 1
823    sqlite3_initialize
824    autoinstall_test_functions
825  } -files ${perm-alt-pcache-testset}
826}
827
828test_suite "journaltest" -description {
829  Check that pages are synced before being written (test_journal.c).
830} -initialize {
831  catch {db close}
832  register_jt_vfs -default ""
833} -shutdown {
834  unregister_jt_vfs
835} -files [test_set $::allquicktests -exclude {
836  wal* incrvacuum.test ioerr.test corrupt4.test io.test crash8.test
837  async4.test bigfile.test backcompat.test
838}]
839
840if {[info commands register_demovfs] != ""} {
841  test_suite "demovfs" -description {
842    Check that the demovfs (code in test_demovfs.c) more or less works.
843  } -initialize {
844    register_demovfs
845  } -shutdown {
846    unregister_demovfs
847  } -files {
848    insert.test   insert2.test  insert3.test rollback.test
849    select1.test  select2.test  select3.test
850  }
851}
852
853test_suite "wal" -description {
854  Run tests with journal_mode=WAL
855} -initialize {
856  set ::G(savepoint6_iterations) 100
857} -shutdown {
858  unset -nocomplain ::G(savepoint6_iterations)
859} -files {
860  savepoint.test     savepoint2.test     savepoint6.test
861  trans.test         avtrans.test
862
863  fts3aa.test  fts3ab.test  fts3ac.test  fts3ad.test
864  fts3ae.test  fts3af.test  fts3ag.test  fts3ah.test
865  fts3ai.test  fts3aj.test  fts3ak.test  fts3al.test
866  fts3am.test  fts3an.test  fts3ao.test  fts3b.test
867  fts3c.test   fts3d.test   fts3e.test   fts3query.test
868}
869
870test_suite "rtree" -description {
871  All R-tree related tests. Provides coverage of source file rtree.c.
872} -files [glob -nocomplain $::testdir/../ext/rtree/*.test]
873
874test_suite "no_optimization" -description {
875  Run test scripts with optimizations disabled using the
876  sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS) interface.
877} -files {
878  where.test where2.test where3.test where4.test where5.test
879  where6.test where7.test where8.test where9.test
880  whereA.test whereB.test wherelimit.test
881  select1.test select2.test select3.test select4.test select5.test
882  select7.test select8.test selectA.test selectC.test
883} -dbconfig {
884  optimization_control $::dbhandle all 0
885}
886
887test_suite "prepare" -description {
888  Run tests with the db connection using sqlite3_prepare() instead of _v2().
889} -dbconfig {
890  db_use_legacy_prepare $::dbhandle 1
891  #$::dbhandle cache size 0
892} -files [
893  test_set $allquicktests -exclude *malloc* *ioerr* *fault*
894]
895
896# End of tests
897#############################################################################
898
899# run_tests NAME OPTIONS
900#
901# where available options are:
902#
903#       -description TITLE
904#       -initialize  SCRIPT
905#       -shutdown    SCRIPT
906#       -presql      SQL
907#       -files       LIST-OF-FILES
908#       -prefix      NAME
909#
910proc run_tests {name args} {
911  array set options $args
912
913  set ::G(perm:name)         $name
914  set ::G(perm:prefix)       $options(-prefix)
915  set ::G(perm:presql)       $options(-presql)
916  set ::G(isquick)           1
917  set ::G(perm:dbconfig)     $options(-dbconfig)
918
919  uplevel $options(-initialize)
920
921  foreach file [lsort $options(-files)] {
922    if {[file tail $file] == $file} { set file [file join $::testdir $file] }
923    slave_test_file $file
924  }
925
926  uplevel $options(-shutdown)
927
928  unset ::G(perm:name)
929  unset ::G(perm:prefix)
930  unset ::G(perm:presql)
931  unset ::G(perm:dbconfig)
932}
933
934proc run_test_suite {name} {
935  if {[info exists ::testspec($name)]==0} {
936    error "No such test suite: $name"
937  }
938  uplevel run_tests $name $::testspec($name)
939}
940
941proc help {} {
942  puts "Usage: $::argv0 TESTSUITE ?TESTFILE?"
943  puts ""
944  puts "Available test-suites are:"
945  foreach k $::testsuitelist {
946    if {[info exists ::testspec($k)]==0} {
947      puts "         ----------------------------------------"
948      puts ""
949    } else {
950      array set o $::testspec($k)
951      puts "Test suite: \"$k\""
952      set d [string trim $o(-description)]
953      set d [regsub {\n *} $d "\n  "]
954      puts "  $d"
955      puts ""
956    }
957  }
958  exit -1
959}
960
961if {[info script] == $argv0} {
962  proc main {argv} {
963    if {[llength $argv]==0} {
964      help
965    } else {
966      set suite [lindex $argv 0]
967      if {[info exists ::testspec($suite)]==0} help
968      set extra ""
969      if {[llength $argv]>1} { set extra [list -files [lrange $argv 1 end]] }
970      eval run_tests $suite $::testspec($suite) $extra
971    }
972  }
973  main $argv
974  finish_test
975}
976