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