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