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