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.45 2009/01/10 18:51:40 danielk1977 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 fullmutex journaltest 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 fuzz3.test savepoint4.test 75 savepoint6.test 76} 77set ALLTESTS [list] 78foreach filename [glob $testdir/*.test] { 79 set filename [file tail $filename] 80 if {[lsearch $EXCLUDE $filename] < 0} { lappend ALLTESTS $filename } 81} 82set ALLTESTS [lsort $ALLTESTS] 83 84rename finish_test really_finish_test2 85proc finish_test {} {} 86 87rename do_test really_do_test 88 89proc do_test {name args} { 90 eval really_do_test [list "perm-$::permutations_test_prefix.$name"] $args 91} 92 93# Overload the [sqlite3] command 94rename sqlite3 really_sqlite3 95proc sqlite3 {args} { 96 set r [eval really_sqlite3 $args] 97 if { [llength $args] == 2 && $::permutations_presql ne "" } { 98 [lindex $args 0] eval $::permutations_presql 99 } 100 set r 101} 102 103# run_tests OPTIONS 104# 105# where available options are: 106# 107# -initialize SCRIPT (default "") 108# -shutdown SCRIPT (default "") 109# -include LIST-OF-FILES (default $::ALLTESTS) 110# -exclude LIST-OF-FILES (default "") 111# -presql SQL (default "") 112# -description TITLE (default "") 113# 114proc run_tests {name args} { 115 set ::permutations_test_prefix $name 116 set options(-shutdown) "" 117 set options(-initialize) "" 118 set options(-exclude) "" 119 set options(-include) $::ALLTESTS 120 set options(-presql) "" 121 set options(-description) "no description supplied (fixme)" 122 array set options $args 123 #puts "PERM-DEBUG: name=$name testfile=$::perm::testfile" 124 #puts "PERM-DEBUG: [array get options]" 125 126 if {$::perm::testmode eq "targets"} { 127 puts [format "% -20s %s" $name [string trim $options(-description)]] 128 return 129 } 130 if {$::perm::testmode ne "" && [lsearch $::perm::testmode $name]<0} { 131 puts "skipping permutation test $name..." 132 return 133 } 134 135 uplevel $options(-initialize) 136 set ::permutations_presql $options(-presql) 137 138 foreach file [lsort $options(-include)] { 139 if {[lsearch $options(-exclude) $file] < 0 && 140 ( $::perm::testfile eq "" || 141 $::perm::testfile eq $file || 142 "$::perm::testfile.test" eq $file ) 143 } { 144 set ::perm::shared_cache_setting [shared_cache_setting] 145 uplevel source $::testdir/$file 146 if {$::perm::shared_cache_setting ne [shared_cache_setting]} { 147 error "File $::testdir/$file changed the shared cache setting from $::perm::shared_cache_setting to [shared_cache_setting]" 148 } 149 } else { 150 # puts "skipping file $file" 151 } 152 } 153 154 uplevel $options(-shutdown) 155 set ::permutations_test_prefix "" 156} 157 158proc shared_cache_setting {} { 159 set ret 0 160 catch { 161 set ret [sqlite3_enable_shared_cache] 162 } 163 return $ret 164} 165 166############################################################################# 167# Start of tests 168 169# Run some tests using pre-allocated page and scratch blocks. 170# 171run_tests "memsubsys1" -description { 172 Tests using pre-allocated page and scratch blocks 173} -exclude { 174 ioerr5.test 175 malloc5.test 176} -initialize { 177 catch {db close} 178 sqlite3_shutdown 179 sqlite3_config_pagecache 4096 24 180 sqlite3_config_scratch 25000 1 181 sqlite3_initialize 182} -shutdown { 183 catch {db close} 184 sqlite3_shutdown 185 sqlite3_config_pagecache 0 0 186 sqlite3_config_scratch 0 0 187 sqlite3_initialize 188} 189 190# Run some tests using pre-allocated page and scratch blocks. This time 191# the allocations are too small to use in most cases. 192# 193# Both ioerr5.test and malloc5.test are excluded because they test the 194# sqlite3_soft_heap_limit() and sqlite3_release_memory() functionality. 195# This functionality is disabled if a pre-allocated page block is provided. 196# 197run_tests "memsubsys2" -description { 198 Tests using small pre-allocated page and scratch blocks 199} -exclude { 200 ioerr5.test 201 malloc5.test 202} -initialize { 203 catch {db close} 204 sqlite3_shutdown 205 sqlite3_config_pagecache 512 5 206 sqlite3_config_scratch 1000 1 207 sqlite3_initialize 208} -shutdown { 209 catch {db close} 210 sqlite3_shutdown 211 sqlite3_config_pagecache 0 0 212 sqlite3_config_scratch 0 0 213 sqlite3_initialize 214} 215 216# Run all tests with the lookaside allocator disabled. 217# 218run_tests "nolookaside" -description { 219 OOM tests with lookaside disabled 220} -initialize { 221 catch {db close} 222 sqlite3_shutdown 223 sqlite3_config_lookaside 0 0 224 sqlite3_initialize 225} -shutdown { 226 catch {db close} 227 sqlite3_shutdown 228 sqlite3_config_lookaside 100 500 229 sqlite3_initialize 230} 231 232# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode. 233# 234run_tests "singlethread" -description { 235 Tests run in SQLITE_CONFIG_SINGLETHREAD mode 236} -initialize { 237 catch {db close} 238 sqlite3_shutdown 239 catch {sqlite3_config singlethread} 240} -include { 241 delete.test delete2.test insert.test rollback.test select1.test 242 select2.test trans.test update.test vacuum.test types.test 243 types2.test types3.test 244} -shutdown { 245 catch {db close} 246 sqlite3_shutdown 247 catch {sqlite3_config serialized} 248} 249 250run_tests "nomutex" -description { 251 Tests run with the SQLITE_OPEN_MULTITHREADED flag passed to sqlite3_open(). 252} -initialize { 253 rename sqlite3 sqlite3_nomutex 254 proc sqlite3 {args} { 255 if {[string range [lindex $args 0] 0 0] ne "-"} { 256 lappend args -fullmutex 0 -nomutex 1 257 } 258 uplevel [concat sqlite3_nomutex $args] 259 } 260} -include { 261 delete.test delete2.test insert.test rollback.test select1.test 262 select2.test trans.test update.test vacuum.test types.test 263 types2.test types3.test 264} -shutdown { 265 rename sqlite3 {} 266 rename sqlite3_nomutex sqlite3 267} 268 269# Run some tests in SQLITE_CONFIG_MULTITHREAD mode. 270# 271run_tests "multithread" -description { 272 Tests run in SQLITE_CONFIG_MULTITHREAD mode 273} -initialize { 274 catch {db close} 275 sqlite3_shutdown 276 catch {sqlite3_config multithread} 277} -include { 278 delete.test delete2.test insert.test rollback.test select1.test 279 select2.test trans.test update.test vacuum.test types.test 280 types2.test types3.test 281} -shutdown { 282 catch {db close} 283 sqlite3_shutdown 284 catch {sqlite3_config serialized} 285} 286 287# Run some tests in SQLITE_OPEN_FULLMUTEX mode. 288# 289run_tests "fullmutex" -description { 290 Tests run in SQLITE_OPEN_FULLMUTEX mode 291} -initialize { 292 rename sqlite3 sqlite3_fullmutex 293 proc sqlite3 {args} { 294 if {[string range [lindex $args 0] 0 0] ne "-"} { 295 lappend args -nomutex 0 -fullmutex 1 296 } 297 uplevel [concat sqlite3_fullmutex $args] 298 } 299} -include { 300 delete.test delete2.test insert.test rollback.test select1.test 301 select2.test trans.test update.test vacuum.test types.test 302 types2.test types3.test 303} -shutdown { 304 rename sqlite3 {} 305 rename sqlite3_fullmutex sqlite3 306} 307 308# Run some tests using the "onefile" demo. 309# 310run_tests "onefile" -description { 311 Run some tests using the "test_onefile.c" demo 312} -initialize { 313 rename sqlite3 sqlite3_onefile 314 proc sqlite3 {args} { 315 if {[string range [lindex $args 0] 0 0] ne "-"} { 316 lappend args -vfs fs 317 } 318 uplevel [concat sqlite3_onefile $args] 319 } 320} -include { 321 conflict.test insert.test insert2.test insert3.test 322 rollback.test select1.test select2.test select3.test 323} -shutdown { 324 rename sqlite3 {} 325 rename sqlite3_onefile sqlite3 326} 327 328# Run some tests using UTF-16 databases. 329# 330run_tests "utf16" -description { 331 Run tests using UTF-16 databases 332} -presql { 333 pragma encoding = 'UTF-16' 334} -include { 335 alter.test alter3.test 336 auth.test bind.test blob.test capi2.test capi3.test collate1.test 337 collate2.test collate3.test collate4.test collate5.test collate6.test 338 conflict.test date.test delete.test expr.test fkey1.test func.test 339 hook.test index.test insert2.test insert.test interrupt.test in.test 340 intpkey.test ioerr.test join2.test join.test lastinsert.test 341 laststmtchanges.test limit.test lock2.test lock.test main.test 342 memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test 343 null.test progress.test quote.test rowid.test select1.test select2.test 344 select3.test select4.test select5.test select6.test sort.test 345 subselect.test tableapi.test table.test temptable.test 346 trace.test trigger1.test trigger2.test trigger3.test 347 trigger4.test types2.test types.test unique.test update.test 348 vacuum.test view.test where.test 349} 350 351# Run some tests in exclusive locking mode. 352# 353run_tests "exclusive" -description { 354 Run tests in exclusive locking mode. 355} -presql { 356 pragma locking_mode = 'exclusive' 357} -include { 358 rollback.test select1.test select2.test 359 malloc.test ioerr.test 360} 361 362# Run some tests in exclusive locking mode with truncated journals. 363# 364run_tests "exclusive-truncate" -description { 365 Run tests in exclusive locking mode and truncate journal mode. 366} -presql { 367 pragma locking_mode = 'exclusive'; 368 pragma journal_mode = TRUNCATE; 369} -include { 370 delete.test delete2.test insert.test rollback.test select1.test 371 select2.test update.test malloc.test ioerr.test 372} 373 374# Run some tests in persistent journal mode. 375# 376run_tests "persistent_journal" -description { 377 Run tests in persistent-journal mode. 378} -presql { 379 pragma journal_mode = persist 380} -include { 381 delete.test delete2.test insert.test rollback.test select1.test 382 select2.test trans.test update.test vacuum.test 383} 384 385# Run some tests in truncating journal mode. 386# 387run_tests "truncate_journal" -description { 388 Run tests in persistent-journal mode. 389} -presql { 390 pragma journal_mode = truncate 391} -include { 392 delete.test delete2.test insert.test rollback.test select1.test 393 select2.test trans.test update.test vacuum.test 394 malloc.test ioerr.test 395} 396 397# Run some error tests in persistent journal mode. 398# 399run_tests "persistent_journal_error" -description { 400 Run malloc.test and ioerr.test in persistent-journal mode. 401} -presql { 402 pragma journal_mode = persist 403} -include { 404 malloc.test ioerr.test 405} 406 407# Run some tests in no journal mode. 408# 409run_tests "no_journal" -description { 410 Run tests in no-journal mode. 411} -presql { 412 pragma journal_mode = persist 413} -include { 414 delete.test delete2.test insert.test rollback.test select1.test 415 select2.test trans.test update.test vacuum.test 416} 417 418# Run some error tests in no journal mode. 419# 420run_tests "no_journal_error" -description { 421 Run malloc.test and ioerr.test in no-journal mode. 422} -presql { 423 pragma journal_mode = persist 424} -include { 425 malloc.test ioerr.test 426} 427 428# Run some crash-tests in autovacuum mode. 429# 430run_tests "autovacuum_crash" -description { 431 Run crash.test in autovacuum mode. 432} -presql { 433 pragma auto_vacuum = 1 434} -include crash.test 435 436# Run some ioerr-tests in autovacuum mode. 437# 438run_tests "autovacuum_ioerr" -description { 439 Run ioerr.test in autovacuum mode. 440} -presql { 441 pragma auto_vacuum = 1 442} -include ioerr.test 443 444# Run tests with an in-memory journal. 445# 446run_tests "inmemory_journal" -description { 447 Run tests with an in-memory journal file. 448} -presql { 449 pragma journal_mode = 'memory' 450} -exclude { 451 # Exclude all tests that simulate IO errors. 452 autovacuum_ioerr2.test incrvacuum_ioerr.test ioerr.test 453 ioerr.test ioerr2.test ioerr3.test ioerr4.test ioerr5.test 454 vacuum3.test incrblob_err.test diskfull.test 455 456 # Exclude test scripts that use tcl IO to access journal files or count 457 # the number of fsync() calls. 458 pager.test exclusive.test jrnlmode.test sync.test misc1.test 459 journal1.test conflict.test 460} 461 462ifcapable mem3 { 463 run_tests "memsys3" -description { 464 Run tests using the allocator in mem3.c. 465 } -exclude { 466 autovacuum.test delete3.test manydb.test 467 bigrow.test incrblob2.test memdb.test 468 bitvec.test index2.test memsubsys1.test 469 capi3c.test ioerr.test memsubsys2.test 470 capi3.test join3.test pagesize.test 471 collate5.test limit.test 472 } -initialize { 473 catch {db close} 474 sqlite3_reset_auto_extension 475 sqlite3_shutdown 476 sqlite3_config_heap 25000000 0 477 sqlite3_config_lookaside 0 0 478 install_malloc_faultsim 1 479 sqlite3_initialize 480 autoinstall_test_functions 481 } -shutdown { 482 catch {db close} 483 sqlite3_reset_auto_extension 484 sqlite3_shutdown 485 sqlite3_config_heap 0 0 486 sqlite3_config_lookaside 100 500 487 install_malloc_faultsim 1 488 sqlite3_initialize 489 } 490} 491 492ifcapable mem5 { 493 run_tests "memsys5" -description { 494 Run tests using the allocator in mem5.c. 495 } -exclude { 496 autovacuum.test delete3.test manydb.test 497 bigrow.test incrblob2.test memdb.test 498 bitvec.test index2.test memsubsys1.test 499 capi3c.test ioerr.test memsubsys2.test 500 capi3.test join3.test pagesize.test 501 collate5.test limit.test zeroblob.test 502 } -initialize { 503 catch {db close} 504 sqlite3_reset_auto_extension 505 sqlite3_shutdown 506 sqlite3_config_heap 25000000 64 507 sqlite3_config_lookaside 0 0 508 install_malloc_faultsim 1 509 sqlite3_initialize 510 autoinstall_test_functions 511 } -shutdown { 512 catch {db close} 513 sqlite3_reset_auto_extension 514 sqlite3_shutdown 515 sqlite3_config_heap 0 0 516 sqlite3_config_lookaside 100 500 517 install_malloc_faultsim 1 518 sqlite3_initialize 519 } 520 521 run_tests "memsys5-2" -description { 522 Run tests using the allocator in mem5.c in a different configuration. 523 } -include { 524 select1.test 525 } -initialize { 526 catch {db close} 527 sqlite3_reset_auto_extension 528 sqlite3_shutdown 529 sqlite3_config_heap 40000000 16 530 sqlite3_config_lookaside 0 0 531 install_malloc_faultsim 1 532 sqlite3_initialize 533 autoinstall_test_functions 534 } -shutdown { 535 catch {db close} 536 sqlite3_reset_auto_extension 537 sqlite3_shutdown 538 sqlite3_config_heap 0 0 539 sqlite3_config_lookaside 100 500 540 install_malloc_faultsim 1 541 sqlite3_initialize 542 } 543} 544 545ifcapable threadsafe { 546 run_tests "no_mutex_try" -description { 547 The sqlite3_mutex_try() interface always fails 548 } -exclude [concat $EXCLUDE mutex1.test mutex2.test] \ 549 -initialize { 550 catch {db close} 551 sqlite3_shutdown 552 install_mutex_counters 1 553 set ::disable_mutex_try 1 554 } -shutdown { 555 catch {db close} 556 sqlite3_shutdown 557 install_mutex_counters 0 558 } 559} 560 561# run_tests "crash_safe_append" -description { 562# Run crash.test with persistent journals on a SAFE_APPEND file-system. 563# } -initialize { 564# rename crashsql sa_crashsql 565# proc crashsql {args} { 566# set options [lrange $args 0 [expr {[llength $args]-2}]] 567# lappend options -char safe_append 568# set sql [lindex $args end] 569# lappend options " 570# PRAGMA journal_mode=persistent; 571# $sql 572# " 573# set fd [open test.db-journal w] 574# puts $fd [string repeat 1234567890 100000] 575# close $fd 576# eval sa_crashsql $options 577# } 578# } -shutdown { 579# rename crashsql {} 580# rename sa_crashsql crashsql 581# } -include crash.test 582 583run_tests "safe_append" -description { 584 Run some tests on a SAFE_APPEND file-system. 585} -initialize { 586 rename sqlite3 sqlite3_safeappend 587 proc sqlite3 {args} { 588 if {[string range [lindex $args 0] 0 0] ne "-"} { 589 lappend args -vfs devsym 590 } 591 uplevel [concat sqlite3_safeappend $args] 592 } 593 sqlite3_simulate_device -char safe_append 594} -shutdown { 595 rename sqlite3 {} 596 rename sqlite3_shutdown sqlite3 597} -include [lsort [concat shared_err.test $ALLTESTS]] \ 598 -exclude async3.test 599 600# The set of tests to run on the alternative-pcache 601set perm-alt-pcache-testset { 602 async.test 603 attach.test 604 delete.test delete2.test 605 index.test 606 insert.test insert2.test 607 join.test join2.test 608 rollback.test 609 select1.test select2.test 610 trans.test 611 update.test 612} 613 614run_tests "pcache0" -description { 615 Alternative pcache implementation without random discard 616} -initialize { 617 catch {db close} 618 sqlite3_reset_auto_extension 619 sqlite3_shutdown 620 sqlite3_config_alt_pcache 1 0 1 621 sqlite3_initialize 622 autoinstall_test_functions 623} -shutdown { 624 catch {db close} 625 sqlite3_reset_auto_extension 626 sqlite3_shutdown 627 sqlite3_config_alt_pcache 0 0 0 628 sqlite3_config_lookaside 100 500 629 install_malloc_faultsim 1 630 sqlite3_initialize 631} -include ${perm-alt-pcache-testset} 632 633run_tests "pcache10" -description { 634 Alternative pcache implementation without 10% random discard 635} -initialize { 636 catch {db close} 637 sqlite3_reset_auto_extension 638 sqlite3_shutdown 639 sqlite3_config_alt_pcache 1 50 1 640 sqlite3_initialize 641 autoinstall_test_functions 642} -shutdown { 643 catch {db close} 644 sqlite3_reset_auto_extension 645 sqlite3_shutdown 646 sqlite3_config_alt_pcache 0 0 0 647 sqlite3_initialize 648} -include ${perm-alt-pcache-testset} 649 650run_tests "pcache50" -description { 651 Alternative pcache implementation without 50% random discard 652} -initialize { 653 catch {db close} 654 sqlite3_reset_auto_extension 655 sqlite3_shutdown 656 sqlite3_config_alt_pcache 1 50 1 657 sqlite3_initialize 658 autoinstall_test_functions 659} -shutdown { 660 catch {db close} 661 sqlite3_reset_auto_extension 662 sqlite3_shutdown 663 sqlite3_config_alt_pcache 0 0 0 664 sqlite3_initialize 665} -include ${perm-alt-pcache-testset} 666 667run_tests "pcache90" -description { 668 Alternative pcache implementation without 90% random discard 669} -initialize { 670 catch {db close} 671 sqlite3_reset_auto_extension 672 sqlite3_shutdown 673 sqlite3_config_alt_pcache 1 50 1 674 sqlite3_initialize 675 autoinstall_test_functions 676} -shutdown { 677 catch {db close} 678 sqlite3_reset_auto_extension 679 sqlite3_shutdown 680 sqlite3_config_alt_pcache 0 0 0 681 sqlite3_initialize 682} -include ${perm-alt-pcache-testset} 683 684run_tests "pcache100" -description { 685 Alternative pcache implementation that always discards when unpinning 686} -initialize { 687 catch {db close} 688 sqlite3_reset_auto_extension 689 sqlite3_shutdown 690 sqlite3_config_alt_pcache 1 100 1 691 sqlite3_initialize 692 autoinstall_test_functions 693} -shutdown { 694 catch {db close} 695 sqlite3_reset_auto_extension 696 sqlite3_shutdown 697 sqlite3_config_alt_pcache 0 0 0 698 sqlite3_initialize 699} -include ${perm-alt-pcache-testset} 700 701run_tests "journaltest" -description { 702 Check that pages are synced before being written (test_journal.c). 703} -initialize { 704 set ISQUICK 1 705 catch {db close} 706 register_jt_vfs -default "" 707 #sqlite3_instvfs binarylog -default binarylog ostrace.bin 708} -shutdown { 709 #sqlite3_instvfs destroy binarylog 710 unregister_jt_vfs 711} -include [concat $::ALLTESTS savepoint6.test 712] -exclude { 713 incrvacuum.test 714 ioerr.test 715 corrupt4.test 716 io.test 717 crash8.test 718} 719 720# End of tests 721############################################################################# 722 723if {$::perm::testmode eq "targets"} { puts "" ; exit } 724 725# Restore the [sqlite3] command. 726# 727rename sqlite3 {} 728rename really_sqlite3 sqlite3 729 730# Restore the [finish_test] command. 731# 732rename finish_test "" 733rename really_finish_test2 finish_test 734 735# Restore the [do_test] command. 736# 737rename do_test "" 738rename really_do_test do_test 739 740finish_test 741