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