xref: /sqlite-3.40.0/test/permutations.test (revision 7fdb522c)
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# $Id: permutations.test,v 1.17 2008/07/25 08:49:01 danielk1977 Exp $
13
14set testdir [file dirname $argv0]
15source $testdir/tester.tcl
16
17# Argument processing.
18#
19set ::testmode [lindex $argv 0]
20set ::testfile [lindex $argv 1]
21set argv [lrange $argv 2 end]
22
23set ::permutations_presql ""
24set ::permutations_test_prefix ""
25
26if {$::testmode eq "veryquick"} {
27  set ::testmode [list persistent_journal no_journal]
28  set ISQUICK 1
29}
30if {$::testmode eq "quick"} {
31  set ::testmode [list persistent_journal no_journal autovacuum_ioerr]
32  set ISQUICK 1
33}
34if {$::testmode eq "all"} {
35  set ::testmode {
36    memsubsys1 memsubsys2 singlethread multithread onefile utf16 exclusive
37    persistent_journal persistent_journal_error no_journal no_journal_error
38    autovacuum_ioerr no_mutex_try
39  }
40}
41if {$::testmode eq "targets"} {
42  puts ""
43  puts -nonewline "veryquick            "
44  puts "Same as persistent_journal and no_journal"
45  puts -nonewline "quick                "
46  puts "Same as persistent_journal, no_journal and autovacuum_ioerr"
47  puts -nonewline "all                  "
48  puts "Everything except autovacuum_crash"
49}
50
51set EXCLUDE {
52  all.test                  in2.test                  onefile.test
53  async2.test               incrvacuum_ioerr.test     permutations.test
54  async.test                jrnlmode2.test            quick.test
55  autovacuum_crash.test     jrnlmode3.test            shared_err.test
56  autovacuum_ioerr.test     jrnlmode4.test            soak.test
57  btree8.test               loadext.test              speed1p.test
58  corrupt.test              malloc2.test              speed1.test
59  crash2.test               malloc3.test              speed2.test
60  crash3.test               malloc4.test              speed3.test
61  crash4.test               mallocAll.test            speed4p.test
62  crash6.test               malloc.test               speed4.test
63  crash7.test               memleak.test              sqllimits1.test
64  crash.test                memsubsys1.test           thread001.test
65  exclusive3.test           memsubsys2.test           thread002.test
66  fts3.test                 misc7.test                utf16.test
67  fuzz_malloc.test          misuse.test               veryquick.test
68  fuzz.test                 mutex2.test               vtab_err.test
69}
70set ALLTESTS [list]
71foreach filename [glob $testdir/*.test] {
72  set filename [file tail $filename]
73  if {[lsearch $EXCLUDE $filename] < 0} { lappend ALLTESTS $filename }
74}
75
76rename finish_test really_finish_test2
77proc finish_test {} {}
78
79rename do_test really_do_test
80
81proc do_test {name args} {
82  eval really_do_test [list "perm-$::permutations_test_prefix.$name"] $args
83}
84
85# Overload the [sqlite3] command
86rename sqlite3 really_sqlite3
87proc sqlite3 {args} {
88  set r [eval really_sqlite3 $args]
89  if { [llength $args] == 2 && $::permutations_presql ne "" } {
90    [lindex $args 0] eval $::permutations_presql
91  }
92  set r
93}
94
95# run_tests OPTIONS
96#
97# where available options are:
98#
99#       -initialize  SCRIPT                 (default "")
100#       -shutdown    SCRIPT                 (default "")
101#       -include     LIST-OF-FILES          (default $::ALLTESTS)
102#       -exclude     LIST-OF-FILES          (default "")
103#       -presql      SQL                    (default "")
104#       -description TITLE                  (default "")
105#
106proc run_tests {name args} {
107  set ::permutations_test_prefix $name
108  set options(-shutdown) ""
109  set options(-initialize) ""
110  set options(-exclude) ""
111  set options(-include) $::ALLTESTS
112  set options(-presql) ""
113  set options(-description) "no description supplied (fixme)"
114  array set options $args
115
116  if {$::testmode eq "targets"} {
117    puts [format "% -20s %s" $name [string trim $options(-description)]]
118    return
119  }
120  if {$::testmode ne "" && [lsearch $::testmode $name]<0} return
121
122  uplevel $options(-initialize)
123  set ::permutations_presql $options(-presql)
124
125  foreach file $options(-include) {
126    if {[lsearch $options(-exclude) $file] < 0 && (
127      $::testfile eq "" || $::testfile eq $file || "$::testfile.test" eq $file
128    ) } {
129      uplevel source $::testdir/$file
130    }
131  }
132
133  uplevel $options(-shutdown)
134}
135
136#############################################################################
137# Start of tests
138
139# Run some tests using pre-allocated page and scratch blocks.
140#
141run_tests "memsubsys1" -description {
142  Tests using pre-allocated page and scratch blocks
143} -initialize {
144  sqlite3_shutdown
145  sqlite3_config_pagecache 4096 24
146  sqlite3_config_scratch 25000 1
147  sqlite3_initialize
148} -shutdown {
149  catch {db close}
150  sqlite3_shutdown
151  sqlite3_config_pagecache 0 0
152  sqlite3_config_scratch 0 0
153  sqlite3_initialize
154}
155
156# Run some tests using pre-allocated page and scratch blocks. This time
157# the allocations are too small to use in most cases.
158#
159run_tests "memsubsys2" -description {
160  Tests using small pre-allocated page and scratch blocks
161} -initialize {
162  sqlite3_shutdown
163  sqlite3_config_pagecache 512 5
164  sqlite3_config_scratch 1000 1
165  sqlite3_initialize
166} -shutdown {
167  catch {db close}
168  sqlite3_shutdown
169  sqlite3_config_pagecache 0 0
170  sqlite3_config_scratch 0 0
171  sqlite3_initialize
172}
173
174# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
175#
176run_tests "singlethread" -description {
177  Tests run in SQLITE_CONFIG_SINGLETHREAD mode
178} -initialize {
179  do_test mutex2-singlethread.0 {
180    catch {db close}
181    sqlite3_shutdown
182    sqlite3_config singlethread
183  } SQLITE_OK
184} -include {
185  delete.test   delete2.test  insert.test  rollback.test  select1.test
186  select2.test  trans.test    update.test  vacuum.test    types.test
187  types2.test   types3.test
188} -shutdown {
189  do_test mutex2-X {
190    catch {db close}
191    sqlite3_shutdown
192    sqlite3_config serialized
193  } SQLITE_OK
194}
195
196run_tests "nomutex" -description {
197  Tests run with the SQLITE_OPEN_SINGLETHREADED flag passed to sqlite3_open().
198} -initialize {
199  rename sqlite3 sqlite3_nomutex
200  proc sqlite3 {args} {
201    if {[string range [lindex $args 0] 0 0] ne "-"} {
202      lappend args -nomutex 1
203    }
204    uplevel [concat sqlite3_nomutex $args]
205  }
206} -include {
207  delete.test   delete2.test  insert.test  rollback.test  select1.test
208  select2.test  trans.test    update.test  vacuum.test    types.test
209  types2.test   types3.test
210} -shutdown {
211  rename sqlite3 {}
212  rename sqlite3_nomutex sqlite3
213}
214
215# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
216#
217run_tests "multithread" -description {
218  Tests run in SQLITE_CONFIG_MULTITHREAD mode
219} -initialize {
220  do_test mutex2-multithread.0 {
221    catch {db close}
222    sqlite3_shutdown
223    sqlite3_config multithread
224  } SQLITE_OK
225} -include {
226  delete.test   delete2.test  insert.test  rollback.test  select1.test
227  select2.test  trans.test    update.test  vacuum.test    types.test
228  types2.test   types3.test
229} -shutdown {
230  do_test mutex2-X {
231    catch {db close}
232    sqlite3_shutdown
233    sqlite3_config serialized
234  } SQLITE_OK
235}
236
237# Run some tests using the "onefile" demo.
238#
239run_tests "onefile" -description {
240  Run some tests using the "test_onefile.c" demo
241} -initialize {
242  rename sqlite3 sqlite3_onefile
243  proc sqlite3 {args} {
244    if {[string range [lindex $args 0] 0 0] ne "-"} {
245      lappend args -vfs fs
246    }
247    uplevel [concat sqlite3_onefile $args]
248  }
249} -include {
250  conflict.test  insert.test   insert2.test  insert3.test
251  rollback.test  select1.test  select2.test  select3.test
252  temptable.test
253} -shutdown {
254  rename sqlite3 {}
255  rename sqlite3_onefile sqlite3
256}
257
258# Run some tests using UTF-16 databases.
259#
260run_tests "utf16" -description {
261  Run tests using UTF-16 databases
262} -presql {
263  pragma encoding = 'UTF-16'
264} -include {
265    alter.test alter3.test
266    auth.test bind.test blob.test capi2.test capi3.test collate1.test
267    collate2.test collate3.test collate4.test collate5.test collate6.test
268    conflict.test date.test delete.test expr.test fkey1.test func.test
269    hook.test index.test insert2.test insert.test interrupt.test in.test
270    intpkey.test ioerr.test join2.test join.test lastinsert.test
271    laststmtchanges.test limit.test lock2.test lock.test main.test
272    memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
273    null.test progress.test quote.test rowid.test select1.test select2.test
274    select3.test select4.test select5.test select6.test sort.test
275    subselect.test tableapi.test table.test temptable.test
276    trace.test trigger1.test trigger2.test trigger3.test
277    trigger4.test types2.test types.test unique.test update.test
278    vacuum.test view.test where.test
279}
280
281# Run some tests in exclusive locking mode.
282#
283run_tests "exclusive" -description {
284  Run tests in exclusive locking mode.
285} -presql {
286  pragma locking_mode = 'exclusive'
287} -include {
288  rollback.test select1.test select2.test
289  malloc.test ioerr.test
290}
291
292# Run some tests in persistent journal mode.
293#
294run_tests "persistent_journal" -description {
295  Run tests in persistent-journal mode.
296} -presql {
297  pragma journal_mode = persist
298} -include {
299  delete.test delete2.test insert.test rollback.test select1.test
300  select2.test trans.test update.test vacuum.test
301}
302
303# Run some error tests in persistent journal mode.
304#
305run_tests "persistent_journal_error" -description {
306  Run malloc.test and ioerr.test in persistent-journal mode.
307} -presql {
308  pragma journal_mode = persist
309} -include {
310  malloc.test ioerr.test
311}
312
313# Run some tests in no journal mode.
314#
315run_tests "no_journal" -description {
316  Run tests in no-journal mode.
317} -presql {
318  pragma journal_mode = persist
319} -include {
320  delete.test delete2.test insert.test rollback.test select1.test
321  select2.test trans.test update.test vacuum.test
322}
323
324# Run some error tests in no journal mode.
325#
326run_tests "no_journal_error" -description {
327  Run malloc.test and ioerr.test in no-journal mode.
328} -presql {
329  pragma journal_mode = persist
330} -include {
331  malloc.test ioerr.test
332}
333
334# Run some crash-tests in autovacuum mode.
335#
336run_tests "autovacuum_crash" -description {
337  Run crash.test in autovacuum mode.
338} -presql {
339  pragma auto_vacuum = 1
340} -include crash.test
341
342# Run some ioerr-tests in autovacuum mode.
343#
344run_tests "autovacuum_ioerr" -description {
345  Run ioerr.test in autovacuum mode.
346} -presql {
347  pragma auto_vacuum = 1
348} -include ioerr.test
349
350ifcapable mem3 {
351  run_tests "memsys3" -description {
352    Run tests using the allocator in mem3.c.
353  } -exclude {
354    autovacuum.test           delete3.test              manydb.test
355    bigrow.test               incrblob2.test            memdb.test
356    bitvec.test               index2.test               memsubsys1.test
357    capi3c.test               ioerr.test                memsubsys2.test
358    capi3.test                join3.test                pagesize.test
359    collate5.test             limit.test
360  } -initialize {
361    catch {db close}
362    sqlite3_reset_auto_extension
363    sqlite3_shutdown
364    sqlite3_config_heap 25000000 0
365    install_malloc_faultsim 1
366    sqlite3_initialize
367    autoinstall_test_functions
368  } -shutdown {
369    catch {db close}
370    sqlite3_reset_auto_extension
371    sqlite3_shutdown
372    sqlite3_config_heap 0 0
373    install_malloc_faultsim 1
374    sqlite3_initialize
375  }
376}
377
378ifcapable mem5 {
379  run_tests "memsys5" -description {
380    Run tests using the allocator in mem5.c.
381  } -exclude {
382    autovacuum.test           delete3.test              manydb.test
383    bigrow.test               incrblob2.test            memdb.test
384    bitvec.test               index2.test               memsubsys1.test
385    capi3c.test               ioerr.test                memsubsys2.test
386    capi3.test                join3.test                pagesize.test
387    collate5.test             limit.test
388  } -initialize {
389    catch {db close}
390    sqlite3_reset_auto_extension
391    sqlite3_shutdown
392    sqlite3_config_heap 25000000 64
393    install_malloc_faultsim 1
394    sqlite3_initialize
395    autoinstall_test_functions
396  } -shutdown {
397    catch {db close}
398    sqlite3_reset_auto_extension
399    sqlite3_shutdown
400    sqlite3_config_heap 0 0
401    install_malloc_faultsim 1
402    sqlite3_initialize
403  }
404
405  run_tests "memsys5-2" -description {
406    Run tests using the allocator in mem5.c in a different configuration.
407  } -include {
408    select1.test
409  } -initialize {
410    catch {db close}
411    sqlite3_reset_auto_extension
412    sqlite3_shutdown
413    sqlite3_config_heap 40000000 16
414    install_malloc_faultsim 1
415    sqlite3_initialize
416    autoinstall_test_functions
417  } -shutdown {
418    catch {db close}
419    sqlite3_reset_auto_extension
420    sqlite3_shutdown
421    sqlite3_config_heap 0 0
422    install_malloc_faultsim 1
423    sqlite3_initialize
424  }
425}
426
427ifcapable threadsafe {
428  run_tests "no_mutex_try" -description {
429     The sqlite3_mutex_try() interface always fails
430  } -initialize {
431    catch {db close}
432    sqlite3_shutdown
433    install_mutex_counters 1
434    set ::disable_mutex_try 1
435  } -shutdown {
436    catch {db close}
437    sqlite3_shutdown
438    install_mutex_counters 0
439  }
440}
441
442run_tests "memsys6" -description {
443  Run tests using the allocator in mem6.c.
444} -exclude {
445  capi3.test capi3c.test
446} -initialize {
447  catch {db close}
448  sqlite3_reset_auto_extension
449  sqlite3_shutdown
450  sqlite3_config_chunkalloc 0
451  install_malloc_faultsim 1
452  sqlite3_initialize
453  autoinstall_test_functions
454} -shutdown {
455  catch {db close}
456  sqlite3_reset_auto_extension
457  sqlite3_shutdown
458  sqlite3_config_heap 0 0
459  install_malloc_faultsim 1
460  sqlite3_initialize
461}
462
463# run_tests "crash_safe_append" -description {
464#   Run crash.test with persistent journals on a SAFE_APPEND file-system.
465# } -initialize {
466#   rename crashsql sa_crashsql
467#   proc crashsql {args} {
468#     set options [lrange $args 0 [expr {[llength $args]-2}]]
469#     lappend options -char safe_append
470#     set sql [lindex $args end]
471#     lappend options "
472#       PRAGMA journal_mode=persistent;
473#       $sql
474#     "
475#     set fd [open test.db-journal w]
476#     puts $fd [string repeat 1234567890 100000]
477#     close $fd
478#     eval sa_crashsql $options
479#   }
480# } -shutdown {
481#   rename crashsql {}
482#   rename sa_crashsql crashsql
483# } -include crash.test
484
485
486# End of tests
487#############################################################################
488
489if {$::testmode eq "targets"} { puts "" ; exit }
490
491# Restore the [sqlite3] command.
492#
493rename sqlite3 {}
494rename really_sqlite3 sqlite3
495
496# Restore the [finish_test] command.
497#
498rename finish_test ""
499rename really_finish_test2 finish_test
500
501# Restore the [do_test] command.
502#
503rename do_test ""
504rename really_do_test do_test
505
506finish_test
507