--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/sqlite3api/TEST/TclScript/permutations.test Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,646 @@
+# 2008 June 21
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# $Id: permutations.test,v 1.32 2008/09/29 14:27:41 danielk1977 Exp $
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+# Argument processing.
+#
+#puts "PERM-DEBUG: argv=$argv"
+namespace eval ::perm {
+ variable testmode [lindex $::argv 0]
+ variable testfile [lindex $::argv 1]
+}
+set argv [lrange $argv 2 end]
+#puts "PERM-DEBUG: testmode=$::perm::testmode tstfile=$::perm::testfile"
+
+set ::permutations_presql ""
+set ::permutations_test_prefix ""
+
+if {$::perm::testmode eq "veryquick"} {
+ set ::perm::testmode [list persistent_journal no_journal]
+ set ISQUICK 1
+}
+if {$::perm::testmode eq "quick"} {
+ set ::perm::testmode [list persistent_journal no_journal autovacuum_ioerr]
+ set ISQUICK 1
+}
+if {$::perm::testmode eq "all" || $::perm::testmode eq ""} {
+ set ::perm::testmode {
+ memsubsys1 memsubsys2 singlethread multithread onefile utf16 exclusive
+ persistent_journal persistent_journal_error no_journal no_journal_error
+ autovacuum_ioerr no_mutex_try
+ }
+}
+if {$::perm::testmode eq "targets"} {
+ puts ""
+ puts -nonewline "veryquick "
+ puts "Same as persistent_journal and no_journal"
+ puts -nonewline "quick "
+ puts "Same as persistent_journal, no_journal and autovacuum_ioerr"
+ puts -nonewline "all "
+ puts "Everything except autovacuum_crash"
+}
+#puts "PERM-DEBUG: testmode=$::perm::testmode"
+
+set EXCLUDE {
+ all.test in2.test onefile.test
+ async2.test incrvacuum_ioerr.test permutations.test
+ async.test jrnlmode2.test quick.test
+ autovacuum_crash.test jrnlmode3.test shared_err.test
+ autovacuum_ioerr.test jrnlmode4.test soak.test
+ btree8.test loadext.test speed1p.test
+ corrupt.test malloc2.test speed1.test
+ crash2.test malloc3.test speed2.test
+ crash3.test malloc4.test speed3.test
+ crash4.test mallocAll.test speed4p.test
+ crash6.test malloc.test speed4.test
+ crash7.test memleak.test sqllimits1.test
+ crash.test memsubsys1.test thread001.test
+ exclusive3.test memsubsys2.test thread002.test
+ fts3.test misc7.test utf16.test
+ fuzz_malloc.test misuse.test veryquick.test
+ fuzz.test mutex2.test vtab_err.test
+ lookaside.test fuzz3.test
+}
+set ALLTESTS [list]
+foreach filename [glob $testdir/*.test] {
+ set filename [file tail $filename]
+ if {[lsearch $EXCLUDE $filename] < 0} { lappend ALLTESTS $filename }
+}
+set ALLTESTS [lsort $ALLTESTS]
+
+rename finish_test really_finish_test2
+proc finish_test {} {}
+
+rename do_test really_do_test
+
+proc do_test {name args} {
+ eval really_do_test [list "perm-$::permutations_test_prefix.$name"] $args
+}
+
+# Overload the [sqlite3] command
+rename sqlite3 really_sqlite3
+proc sqlite3 {args} {
+ set r [eval really_sqlite3 $args]
+ if { [llength $args] == 2 && $::permutations_presql ne "" } {
+ [lindex $args 0] eval $::permutations_presql
+ }
+ set r
+}
+
+# run_tests OPTIONS
+#
+# where available options are:
+#
+# -initialize SCRIPT (default "")
+# -shutdown SCRIPT (default "")
+# -include LIST-OF-FILES (default $::ALLTESTS)
+# -exclude LIST-OF-FILES (default "")
+# -presql SQL (default "")
+# -description TITLE (default "")
+#
+proc run_tests {name args} {
+ set ::permutations_test_prefix $name
+ set options(-shutdown) ""
+ set options(-initialize) ""
+ set options(-exclude) ""
+ set options(-include) $::ALLTESTS
+ set options(-presql) ""
+ set options(-description) "no description supplied (fixme)"
+ array set options $args
+ #puts "PERM-DEBUG: name=$name testfile=$::perm::testfile"
+ #puts "PERM-DEBUG: [array get options]"
+
+ if {$::perm::testmode eq "targets"} {
+ puts [format "% -20s %s" $name [string trim $options(-description)]]
+ return
+ }
+ if {$::perm::testmode ne "" && [lsearch $::perm::testmode $name]<0} {
+ puts "skipping permutation test $name..."
+ return
+ }
+
+ uplevel $options(-initialize)
+ set ::permutations_presql $options(-presql)
+
+ foreach file [lsort $options(-include)] {
+ if {[lsearch $options(-exclude) $file] < 0 &&
+ ( $::perm::testfile eq "" ||
+ $::perm::testfile eq $file ||
+ "$::perm::testfile.test" eq $file )
+ } {
+ set ::perm::shared_cache_setting [shared_cache_setting]
+ uplevel source $::testdir/$file
+ if {$::perm::shared_cache_setting ne [shared_cache_setting]} {
+ error "File $::testdir/$file changed the shared cache setting from $::perm::shared_cache_setting to [shared_cache_setting]"
+ }
+ } else {
+ # puts "skipping file $file"
+ }
+ }
+
+ uplevel $options(-shutdown)
+}
+
+proc shared_cache_setting {} {
+ set ret 0
+ catch {
+ set ret [sqlite3_enable_shared_cache]
+ }
+ return $ret
+}
+
+#############################################################################
+# Start of tests
+
+# Run some tests using pre-allocated page and scratch blocks.
+#
+run_tests "memsubsys1" -description {
+ Tests using pre-allocated page and scratch blocks
+} -exclude {
+ ioerr5.test
+ malloc5.test
+} -initialize {
+ catch {db close}
+ sqlite3_shutdown
+ sqlite3_config_pagecache 4096 24
+ sqlite3_config_scratch 25000 1
+ sqlite3_initialize
+} -shutdown {
+ catch {db close}
+ sqlite3_shutdown
+ sqlite3_config_pagecache 0 0
+ sqlite3_config_scratch 0 0
+ sqlite3_initialize
+}
+
+# Run some tests using pre-allocated page and scratch blocks. This time
+# the allocations are too small to use in most cases.
+#
+# Both ioerr5.test and malloc5.test are excluded because they test the
+# sqlite3_soft_heap_limit() and sqlite3_release_memory() functionality.
+# This functionality is disabled if a pre-allocated page block is provided.
+#
+run_tests "memsubsys2" -description {
+ Tests using small pre-allocated page and scratch blocks
+} -exclude {
+ ioerr5.test
+ malloc5.test
+} -initialize {
+ catch {db close}
+ sqlite3_shutdown
+ sqlite3_config_pagecache 512 5
+ sqlite3_config_scratch 1000 1
+ sqlite3_initialize
+} -shutdown {
+ catch {db close}
+ sqlite3_shutdown
+ sqlite3_config_pagecache 0 0
+ sqlite3_config_scratch 0 0
+ sqlite3_initialize
+}
+
+# Run all tests with the lookaside allocator disabled.
+#
+run_tests "memsubsys3" -description {
+ OOM tests with lookaside disabled
+} -include {
+ malloc.test
+ malloc3.test
+ malloc4.test
+ malloc5.test
+ malloc6.test
+ malloc7.test
+ malloc8.test
+ malloc9.test
+ mallocA.test
+ mallocB.test
+ mallocC.test
+ mallocD.test
+ mallocE.test
+ mallocF.test
+ mallocG.test
+} -initialize {
+ catch {db close}
+ sqlite3_shutdown
+ sqlite3_config_lookaside 0 0
+ sqlite3_initialize
+} -shutdown {
+ catch {db close}
+ sqlite3_shutdown
+ sqlite3_config_lookaside 100 500
+ sqlite3_initialize
+}
+
+# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
+#
+run_tests "singlethread" -description {
+ Tests run in SQLITE_CONFIG_SINGLETHREAD mode
+} -initialize {
+ do_test mutex2-singlethread.0 {
+ catch {db close}
+ sqlite3_shutdown
+ sqlite3_config singlethread
+ } SQLITE_OK
+} -include {
+ delete.test delete2.test insert.test rollback.test select1.test
+ select2.test trans.test update.test vacuum.test types.test
+ types2.test types3.test
+} -shutdown {
+ do_test mutex2-X {
+ catch {db close}
+ sqlite3_shutdown
+ sqlite3_config serialized
+ } SQLITE_OK
+}
+
+run_tests "nomutex" -description {
+ Tests run with the SQLITE_OPEN_MULTITHREADED flag passed to sqlite3_open().
+} -initialize {
+ rename sqlite3 sqlite3_nomutex
+ proc sqlite3 {args} {
+ if {[string range [lindex $args 0] 0 0] ne "-"} {
+ lappend args -fullmutex 0 -nomutex 1
+ }
+ uplevel [concat sqlite3_nomutex $args]
+ }
+} -include {
+ delete.test delete2.test insert.test rollback.test select1.test
+ select2.test trans.test update.test vacuum.test types.test
+ types2.test types3.test
+} -shutdown {
+ rename sqlite3 {}
+ rename sqlite3_nomutex sqlite3
+}
+
+# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
+#
+run_tests "multithread" -description {
+ Tests run in SQLITE_CONFIG_MULTITHREAD mode
+} -initialize {
+ do_test mutex2-multithread.0 {
+ catch {db close}
+ sqlite3_shutdown
+ sqlite3_config multithread
+ } SQLITE_OK
+} -include {
+ delete.test delete2.test insert.test rollback.test select1.test
+ select2.test trans.test update.test vacuum.test types.test
+ types2.test types3.test
+} -shutdown {
+ do_test mutex2-X {
+ catch {db close}
+ sqlite3_shutdown
+ sqlite3_config serialized
+ } SQLITE_OK
+}
+
+# Run some tests in SQLITE_OPEN_FULLMUTEX mode.
+#
+run_tests "fullmutex" -description {
+ Tests run in SQLITE_OPEN_FULLMUTEX mode
+} -initialize {
+ rename sqlite3 sqlite3_fullmutex
+ proc sqlite3 {args} {
+ if {[string range [lindex $args 0] 0 0] ne "-"} {
+ lappend args -nomutex 0 -fullmutex 1
+ }
+ uplevel [concat sqlite3_fullmutex $args]
+ }
+} -include {
+ delete.test delete2.test insert.test rollback.test select1.test
+ select2.test trans.test update.test vacuum.test types.test
+ types2.test types3.test
+} -shutdown {
+ rename sqlite3 {}
+ rename sqlite3_fullmutex sqlite3
+}
+
+# Run some tests using the "onefile" demo.
+#
+run_tests "onefile" -description {
+ Run some tests using the "test_onefile.c" demo
+} -initialize {
+ rename sqlite3 sqlite3_onefile
+ proc sqlite3 {args} {
+ if {[string range [lindex $args 0] 0 0] ne "-"} {
+ lappend args -vfs fs
+ }
+ uplevel [concat sqlite3_onefile $args]
+ }
+} -include {
+ conflict.test insert.test insert2.test insert3.test
+ rollback.test select1.test select2.test select3.test
+} -shutdown {
+ rename sqlite3 {}
+ rename sqlite3_onefile sqlite3
+}
+
+# Run some tests using UTF-16 databases.
+#
+run_tests "utf16" -description {
+ Run tests using UTF-16 databases
+} -presql {
+ pragma encoding = 'UTF-16'
+} -include {
+ alter.test alter3.test
+ auth.test bind.test blob.test capi2.test capi3.test collate1.test
+ collate2.test collate3.test collate4.test collate5.test collate6.test
+ conflict.test date.test delete.test expr.test fkey1.test func.test
+ hook.test index.test insert2.test insert.test interrupt.test in.test
+ intpkey.test ioerr.test join2.test join.test lastinsert.test
+ laststmtchanges.test limit.test lock2.test lock.test main.test
+ memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
+ null.test progress.test quote.test rowid.test select1.test select2.test
+ select3.test select4.test select5.test select6.test sort.test
+ subselect.test tableapi.test table.test temptable.test
+ trace.test trigger1.test trigger2.test trigger3.test
+ trigger4.test types2.test types.test unique.test update.test
+ vacuum.test view.test where.test
+}
+
+# Run some tests in exclusive locking mode.
+#
+run_tests "exclusive" -description {
+ Run tests in exclusive locking mode.
+} -presql {
+ pragma locking_mode = 'exclusive'
+} -include {
+ rollback.test select1.test select2.test
+ malloc.test ioerr.test
+}
+
+# Run some tests in exclusive locking mode with truncated journals.
+#
+run_tests "exclusive-truncate" -description {
+ Run tests in exclusive locking mode and truncate journal mode.
+} -presql {
+ pragma locking_mode = 'exclusive';
+ pragma journal_mode = TRUNCATE;
+} -include {
+ delete.test delete2.test insert.test rollback.test select1.test
+ select2.test update.test malloc.test ioerr.test
+}
+
+# Run some tests in persistent journal mode.
+#
+run_tests "persistent_journal" -description {
+ Run tests in persistent-journal mode.
+} -presql {
+ pragma journal_mode = persist
+} -include {
+ delete.test delete2.test insert.test rollback.test select1.test
+ select2.test trans.test update.test vacuum.test
+}
+
+# Run some tests in truncating journal mode.
+#
+run_tests "truncate_journal" -description {
+ Run tests in persistent-journal mode.
+} -presql {
+ pragma journal_mode = truncate
+} -include {
+ delete.test delete2.test insert.test rollback.test select1.test
+ select2.test trans.test update.test vacuum.test
+ malloc.test ioerr.test
+}
+
+# Run some error tests in persistent journal mode.
+#
+run_tests "persistent_journal_error" -description {
+ Run malloc.test and ioerr.test in persistent-journal mode.
+} -presql {
+ pragma journal_mode = persist
+} -include {
+ malloc.test ioerr.test
+}
+
+# Run some tests in no journal mode.
+#
+run_tests "no_journal" -description {
+ Run tests in no-journal mode.
+} -presql {
+ pragma journal_mode = persist
+} -include {
+ delete.test delete2.test insert.test rollback.test select1.test
+ select2.test trans.test update.test vacuum.test
+}
+
+# Run some error tests in no journal mode.
+#
+run_tests "no_journal_error" -description {
+ Run malloc.test and ioerr.test in no-journal mode.
+} -presql {
+ pragma journal_mode = persist
+} -include {
+ malloc.test ioerr.test
+}
+
+# Run some crash-tests in autovacuum mode.
+#
+run_tests "autovacuum_crash" -description {
+ Run crash.test in autovacuum mode.
+} -presql {
+ pragma auto_vacuum = 1
+} -include crash.test
+
+# Run some ioerr-tests in autovacuum mode.
+#
+run_tests "autovacuum_ioerr" -description {
+ Run ioerr.test in autovacuum mode.
+} -presql {
+ pragma auto_vacuum = 1
+} -include ioerr.test
+
+ifcapable mem3 {
+ run_tests "memsys3" -description {
+ Run tests using the allocator in mem3.c.
+ } -exclude {
+ autovacuum.test delete3.test manydb.test
+ bigrow.test incrblob2.test memdb.test
+ bitvec.test index2.test memsubsys1.test
+ capi3c.test ioerr.test memsubsys2.test
+ capi3.test join3.test pagesize.test
+ collate5.test limit.test
+ } -initialize {
+ catch {db close}
+ sqlite3_reset_auto_extension
+ sqlite3_shutdown
+ sqlite3_config_heap 25000000 0
+ sqlite3_config_lookaside 0 0
+ install_malloc_faultsim 1
+ sqlite3_initialize
+ autoinstall_test_functions
+ } -shutdown {
+ catch {db close}
+ sqlite3_reset_auto_extension
+ sqlite3_shutdown
+ sqlite3_config_heap 0 0
+ sqlite3_config_lookaside 100 500
+ install_malloc_faultsim 1
+ sqlite3_initialize
+ }
+}
+
+ifcapable mem5 {
+ run_tests "memsys5" -description {
+ Run tests using the allocator in mem5.c.
+ } -exclude {
+ autovacuum.test delete3.test manydb.test
+ bigrow.test incrblob2.test memdb.test
+ bitvec.test index2.test memsubsys1.test
+ capi3c.test ioerr.test memsubsys2.test
+ capi3.test join3.test pagesize.test
+ collate5.test limit.test
+ } -initialize {
+ catch {db close}
+ sqlite3_reset_auto_extension
+ sqlite3_shutdown
+ sqlite3_config_heap 25000000 64
+ sqlite3_config_lookaside 0 0
+ install_malloc_faultsim 1
+ sqlite3_initialize
+ autoinstall_test_functions
+ } -shutdown {
+ catch {db close}
+ sqlite3_reset_auto_extension
+ sqlite3_shutdown
+ sqlite3_config_heap 0 0
+ sqlite3_config_lookaside 100 500
+ install_malloc_faultsim 1
+ sqlite3_initialize
+ }
+
+ run_tests "memsys5-2" -description {
+ Run tests using the allocator in mem5.c in a different configuration.
+ } -include {
+ select1.test
+ } -initialize {
+ catch {db close}
+ sqlite3_reset_auto_extension
+ sqlite3_shutdown
+ sqlite3_config_heap 40000000 16
+ sqlite3_config_lookaside 0 0
+ install_malloc_faultsim 1
+ sqlite3_initialize
+ autoinstall_test_functions
+ } -shutdown {
+ catch {db close}
+ sqlite3_reset_auto_extension
+ sqlite3_shutdown
+ sqlite3_config_heap 0 0
+ sqlite3_config_lookaside 100 500
+ install_malloc_faultsim 1
+ sqlite3_initialize
+ }
+}
+
+ifcapable threadsafe {
+ run_tests "no_mutex_try" -description {
+ The sqlite3_mutex_try() interface always fails
+ } -exclude [concat $EXCLUDE mutex1.test mutex2.test] \
+ -initialize {
+ catch {db close}
+ sqlite3_shutdown
+ install_mutex_counters 1
+ set ::disable_mutex_try 1
+ } -shutdown {
+ catch {db close}
+ sqlite3_shutdown
+ install_mutex_counters 0
+ }
+}
+
+run_tests "memsys6" -description {
+ Run tests using the allocator in mem6.c.
+} -exclude {
+ capi3.test capi3c.test
+} -initialize {
+ catch {db close}
+ sqlite3_reset_auto_extension
+ sqlite3_shutdown
+ sqlite3_config_chunkalloc 0
+ install_malloc_faultsim 1
+ sqlite3_initialize
+ autoinstall_test_functions
+} -shutdown {
+ catch {db close}
+ sqlite3_reset_auto_extension
+ sqlite3_shutdown
+ sqlite3_config_heap 0 0
+ install_malloc_faultsim 1
+ sqlite3_initialize
+}
+
+# run_tests "crash_safe_append" -description {
+# Run crash.test with persistent journals on a SAFE_APPEND file-system.
+# } -initialize {
+# rename crashsql sa_crashsql
+# proc crashsql {args} {
+# set options [lrange $args 0 [expr {[llength $args]-2}]]
+# lappend options -char safe_append
+# set sql [lindex $args end]
+# lappend options "
+# PRAGMA journal_mode=persistent;
+# $sql
+# "
+# set fd [open test.db-journal w]
+# puts $fd [string repeat 1234567890 100000]
+# close $fd
+# eval sa_crashsql $options
+# }
+# } -shutdown {
+# rename crashsql {}
+# rename sa_crashsql crashsql
+# } -include crash.test
+
+run_tests "safe_append" -description {
+ Run some tests on a SAFE_APPEND file-system.
+} -initialize {
+ rename sqlite3 sqlite3_safeappend
+ proc sqlite3 {args} {
+ if {[string range [lindex $args 0] 0 0] ne "-"} {
+ lappend args -vfs devsym
+ }
+ uplevel [concat sqlite3_safeappend $args]
+ }
+ sqlite3_simulate_device -char safe_append
+} -shutdown {
+ rename sqlite3 {}
+ rename sqlite3_shutdown sqlite3
+} -include [lsort [concat shared_err.test $ALLTESTS]] \
+ -exclude async3.test
+
+
+# End of tests
+#############################################################################
+
+if {$::perm::testmode eq "targets"} { puts "" ; exit }
+
+# Restore the [sqlite3] command.
+#
+rename sqlite3 {}
+rename really_sqlite3 sqlite3
+
+# Restore the [finish_test] command.
+#
+rename finish_test ""
+rename really_finish_test2 finish_test
+
+# Restore the [do_test] command.
+#
+rename do_test ""
+rename really_do_test do_test
+
+finish_test