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 13set testdir [file dirname $argv0] 14source $testdir/tester.tcl 15db close 16 17#------------------------------------------------------------------------- 18# test_suite NAME OPTIONS 19# 20# where available options are: 21# 22# -description TITLE (default "") 23# -initialize SCRIPT (default "") 24# -shutdown SCRIPT (default "") 25# -presql SQL (default "") 26# -files LIST-OF-FILES (default $::ALLTESTS) 27# -prefix NAME (default "$::NAME.") 28# -dbconfig SCRIPT (default "") 29# 30proc test_suite {name args} { 31 32 set default(-shutdown) "" 33 set default(-initialize) "" 34 set default(-presql) "" 35 set default(-description) "no description supplied (fixme)" 36 set default(-files) "" 37 set default(-prefix) "${name}." 38 set default(-dbconfig) "" 39 40 array set options [array get default] 41 if {[llength $args]%2} { 42 error "uneven number of options/switches passed to test_suite" 43 } 44 foreach {k v} $args { 45 set o [array names options ${k}*] 46 if {[llength $o]>1} { error "ambiguous option: $k" } 47 if {[llength $o]==0} { error "unknown option: $k" } 48 set options([lindex $o 0]) $v 49 } 50 51 set ::testspec($name) [array get options] 52 lappend ::testsuitelist $name 53} 54 55#------------------------------------------------------------------------- 56# test_set ARGS... 57# 58proc test_set {args} { 59 set isExclude 0 60 foreach a $args { 61 if {[string match -* $a]} { 62 switch -- $a { 63 -include { set isExclude 0 } 64 -exclude { set isExclude 1 } 65 default { 66 error "Unknown switch: $a" 67 } 68 } 69 } elseif {$isExclude == 0} { 70 foreach f $a { set t($f) 1 } 71 } else { 72 foreach f $a { array unset t $f } 73 foreach f $a { array unset t */$f } 74 } 75 } 76 77 return [array names t] 78} 79 80#------------------------------------------------------------------------- 81# Set up the following global list variables containing the names of 82# various test scripts: 83# 84# $alltests 85# $allquicktests 86# 87set alltests [list] 88foreach f [glob $testdir/*.test] { lappend alltests [file tail $f] } 89foreach f [glob -nocomplain $testdir/../ext/rtree/*.test] { 90 lappend alltests $f 91} 92 93if {$::tcl_platform(platform)!="unix"} { 94 set alltests [test_set $alltests -exclude crash.test crash2.test] 95} 96set alltests [test_set $alltests -exclude { 97 all.test async.test quick.test veryquick.test 98 memleak.test permutations.test soak.test fts3.test 99 mallocAll.test rtree.test full.test extraquick.test 100}] 101 102set allquicktests [test_set $alltests -exclude { 103 async2.test async3.test backup_ioerr.test corrupt.test 104 corruptC.test crash.test crash2.test crash3.test crash4.test crash5.test 105 crash6.test crash7.test delete3.test e_fts3.test fts3rnd.test 106 fkey_malloc.test fuzz.test fuzz3.test fuzz_malloc.test in2.test loadext.test 107 misc7.test mutex2.test notify2.test onefile.test pagerfault2.test 108 savepoint4.test savepoint6.test select9.test 109 speed1.test speed1p.test speed2.test speed3.test speed4.test 110 speed4p.test sqllimits1.test tkt2686.test thread001.test thread002.test 111 thread003.test thread004.test thread005.test trans2.test vacuum3.test 112 incrvacuum_ioerr.test autovacuum_crash.test btree8.test shared_err.test 113 vtab_err.test walslow.test walcrash.test walcrash3.test 114 walthread.test rtree3.test indexfault.test securedel2.test 115 sort3.test sort4.test fts4growth.test fts4growth2.test 116 bigsort.test ota.test 117}] 118if {[info exists ::env(QUICKTEST_INCLUDE)]} { 119 set allquicktests [concat $allquicktests $::env(QUICKTEST_INCLUDE)] 120} 121if {[info exists ::env(QUICKTEST_OMIT)]} { 122 foreach x [split $::env(QUICKTEST_OMIT) ,] { 123 regsub -all \\y$x\\y $allquicktests {} allquicktests 124 } 125} 126 127# If the TEST_FAILURE environment variable is set, it means that we what to 128# deliberately provoke test failures in order to test the test infrastructure. 129# Only the main.test module is needed for this. 130# 131if {[info exists ::env(TEST_FAILURE)]} { 132 set allquicktests main.test 133} 134 135############################################################################# 136# Start of tests 137# 138 139#------------------------------------------------------------------------- 140# Define the generic test suites: 141# 142# veryquick 143# quick 144# full 145# 146lappend ::testsuitelist xxx 147 148test_suite "veryquick" -prefix "" -description { 149 "Very" quick test suite. Runs in minutes on a workstation. 150 This test suite is the same as the "quick" tests, except that some files 151 that test malloc and IO errors are omitted. 152} -files [ 153 test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* 154] 155 156test_suite "extraquick" -prefix "" -description { 157 "Extra" quick test suite. Runs in a few minutes on a workstation. 158 This test suite is the same as the "veryquick" tests, except that 159 slower tests are omitted. 160} -files [ 161 test_set $allquicktests -exclude *malloc* *ioerr* *fault* *bigfile* \ 162 wal3.test fts4merge* sort2.test mmap1.test walcrash* \ 163 percentile.test where8m.test walcksum.test savepoint3.test \ 164 fuzzer1.test fuzzer3.test fts3expr3.test 165] 166 167test_suite "mmap" -prefix "mm-" -description { 168 Similar to veryquick. Except with memory mapping enabled. 169} -presql { 170 pragma mmap_size = 268435456; 171} -files [ 172 test_set $allquicktests -exclude *malloc* *ioerr* *fault* -include malloc.test 173] 174 175test_suite "valgrind" -prefix "" -description { 176 Run the "veryquick" test suite with a couple of multi-process tests (that 177 fail under valgrind) omitted. 178} -files [ 179 test_set $allquicktests -exclude *malloc* *ioerr* *fault* wal.test \ 180 shell*.test crash8.test atof1.test selectG.test \ 181 tkt-fc62af4523.test 182] -initialize { 183 set ::G(valgrind) 1 184} -shutdown { 185 unset -nocomplain ::G(valgrind) 186} 187 188test_suite "valgrind-nolookaside" -prefix "" -description { 189 Run the "veryquick" test suite with a couple of multi-process tests (that 190 fail under valgrind) omitted. 191} -files [ 192 test_set $allquicktests -exclude *malloc* *ioerr* *fault* wal.test atof1.test 193] -initialize { 194 set ::G(valgrind) 1 195 catch {db close} 196 sqlite3_shutdown 197 sqlite3_config_lookaside 0 0 198 sqlite3_initialize 199 autoinstall_test_functions 200} -shutdown { 201 catch {db close} 202 sqlite3_shutdown 203 sqlite3_config_lookaside 100 500 204 sqlite3_initialize 205 autoinstall_test_functions 206 unset -nocomplain ::G(valgrind) 207} 208 209 210test_suite "quick" -prefix "" -description { 211 Quick test suite. Runs in around 10 minutes on a workstation. 212} -files [ 213 test_set $allquicktests 214] 215 216test_suite "full" -prefix "" -description { 217 Full test suite. Takes a long time. 218} -files [ 219 test_set $alltests 220] -initialize { 221 unset -nocomplain ::G(isquick) 222} 223 224test_suite "threads" -prefix "" -description { 225 All multi-threaded tests. 226} -files { 227 notify2.test thread001.test thread002.test thread003.test 228 thread004.test thread005.test walthread.test 229} 230 231test_suite "fts3" -prefix "" -description { 232 All FTS3 tests except fts3rnd.test. 233} -files { 234 fts3aa.test fts3ab.test fts3ac.test fts3ad.test fts3ae.test 235 fts3af.test fts3ag.test fts3ah.test fts3ai.test fts3aj.test 236 fts3ak.test fts3al.test fts3am.test fts3an.test fts3ao.test 237 fts3atoken.test fts3b.test fts3c.test fts3cov.test fts3d.test 238 fts3defer.test fts3defer2.test fts3e.test fts3expr.test fts3expr2.test 239 fts3expr3.test 240 fts3near.test fts3query.test fts3shared.test fts3snippet.test 241 fts3sort.test 242 fts3fault.test fts3malloc.test fts3matchinfo.test 243 fts3aux1.test fts3comp1.test fts3auto.test 244 fts4aa.test fts4content.test 245 fts3conf.test fts3prefix.test fts3fault2.test fts3corrupt.test 246 fts3corrupt2.test fts3first.test fts4langid.test fts4merge.test 247 fts4check.test fts4unicode.test fts4noti.test 248 fts3varint.test 249 fts4growth.test fts4growth2.test 250} 251 252test_suite "nofaultsim" -prefix "" -description { 253 "Very" quick test suite. Runs in less than 5 minutes on a workstation. 254 This test suite is the same as the "quick" tests, except that some files 255 that test malloc and IO errors are omitted. 256} -files [ 257 test_set $allquicktests -exclude *malloc* *ioerr* *fault* 258] -initialize { 259 catch {db close} 260 sqlite3_shutdown 261 install_malloc_faultsim 0 262 sqlite3_initialize 263 autoinstall_test_functions 264} -shutdown { 265 unset -nocomplain ::G(valgrind) 266} 267 268test_suite "queryplanner" -prefix "" -description { 269 Tests of the query planner and query optimizer 270} -files { 271 alter2.test alter3.test alter4.test alter.test analyze3.test 272 analyze4.test analyze5.test analyze6.test analyze7.test analyze8.test 273 analyze.test attach2.test attach3.test attach4.test 274 attach.test autoinc.test autoindex1.test between.test cast.test 275 check.test closure01.test coalesce.test collate1.test collate2.test 276 collate3.test collate4.test collate5.test collate6.test collate7.test 277 collate8.test collate9.test collateA.test colmeta.test colname.test 278 conflict.test count.test coveridxscan.test createtab.test cse.test 279 date.test dbstatus2.test dbstatus.test default.test delete2.test 280 delete3.test delete.test descidx1.test descidx2.test descidx3.test 281 distinctagg.test distinct.test e_createtable.test e_delete.test 282 e_droptrigger.test e_dropview.test e_expr.test e_insert.test 283 eqp.test e_reindex.test e_resolve.test e_select2.test e_select.test 284 e_update.test exists.test expr.test fkey1.test fkey2.test fkey3.test 285 fkey4.test fkey5.test func2.test func3.test func.test 286 in3.test in4.test in5.test index2.test index3.test 287 index4.test index5.test indexedby.test index.test 288 insert2.test insert3.test insert4.test insert5.test insert.test 289 instr.test in.test intpkey.test join2.test join3.test join4.test 290 join5.test join6.test join.test like2.test like.test limit.test 291 minmax2.test minmax3.test minmax4.test minmax.test misc1.test misc2.test 292 misc3.test misc4.test misc5.test misc6.test misc7.test orderby1.test 293 orderby2.test orderby3.test orderby4.test randexpr1.test regexp1.test 294 reindex.test rowhash.test rowid.test schema2.test schema3.test 295 schema4.test schema5.test schema.test 296 select1.test select2.test select3.test select4.test select5.test 297 select6.test select7.test select8.test select9.test selectA.test 298 selectB.test selectC.test selectD.test selectE.test sidedelete.test 299 sort.test spellfix.test subquery2.test subquery.test subselect.test 300 substr.test tkt-02a8e81d44.test tkt1435.test tkt1443.test tkt1444.test 301 tkt1449.test tkt1473.test tkt1501.test tkt1512.test tkt1514.test 302 tkt1536.test tkt1537.test tkt1567.test tkt1644.test tkt1667.test 303 tkt1873.test tkt2141.test tkt2192.test tkt2213.test tkt2251.test 304 tkt2285.test tkt2332.test tkt2339.test tkt2391.test tkt2409.test 305 tkt2450.test tkt2565.test tkt2640.test tkt2643.test tkt2686.test 306 tkt-26ff0c2d1e.test tkt2767.test tkt2817.test tkt2820.test tkt2822.test 307 tkt2832.test tkt2854.test tkt2920.test tkt2927.test tkt2942.test 308 tkt-2a5629202f.test tkt-2d1a5c67d.test tkt-2ea2425d34.test tkt3080.test 309 tkt3093.test tkt3121.test tkt-31338dca7e.test tkt-313723c356.test 310 tkt3201.test tkt3292.test tkt3298.test tkt3334.test tkt3346.test 311 tkt3357.test tkt3419.test tkt3424.test tkt3442.test tkt3457.test 312 tkt3461.test tkt3493.test tkt3508.test tkt3522.test tkt3527.test 313 tkt3541.test tkt3554.test tkt3581.test tkt35xx.test tkt3630.test 314 tkt3718.test tkt3731.test tkt3757.test tkt3761.test tkt3762.test 315 tkt3773.test tkt3791.test tkt3793.test tkt3810.test tkt3824.test 316 tkt3832.test tkt3838.test tkt3841.test tkt-385a5b56b9.test tkt3871.test 317 tkt3879.test tkt-38cb5df375.test tkt3911.test tkt3918.test tkt3922.test 318 tkt3929.test tkt3935.test tkt3992.test tkt3997.test tkt-3998683a16.test 319 tkt-3a77c9714e.test tkt-3fe897352e.test tkt4018.test tkt-4a03edc4c8.test 320 tkt-4dd95f6943.test tkt-54844eea3f.test tkt-5d863f876e.test 321 tkt-5e10420e8d.test tkt-5ee23731f.test tkt-6bfb98dfc0.test 322 tkt-752e1646fc.test tkt-78e04e52ea.test tkt-7a31705a7e6.test 323 tkt-7bbfb7d442.test tkt-80ba201079.test tkt-80e031a00f.test 324 tkt-8454a207b9.test tkt-91e2e8ba6f.test tkt-94c04eaadb.test 325 tkt-9d68c883.test tkt-a7b7803e.test tkt-b1d3a2e531.test 326 tkt-b351d95f9.test tkt-b72787b1.test tkt-bd484a090c.test 327 tkt-bdc6bbbb38.test tkt-c48d99d690.test tkt-cbd054fa6b.test 328 tkt-d11f09d36e.test tkt-d635236375.test tkt-d82e3f3721.test 329 tkt-f3e5abed55.test tkt-f777251dc7a.test tkt-f7b4edec.test 330 tkt-f973c7ac31.test tkt-fa7bf5ec.test tkt-fc62af4523.test 331 tkt-fc7bd6358f.test trigger1.test trigger2.test trigger3.test 332 trigger4.test trigger5.test trigger6.test trigger7.test trigger8.test 333 trigger9.test triggerA.test triggerB.test triggerC.test triggerD.test 334 types2.test types3.test types.test unique.test unordered.test 335 update.test view.test vtab1.test vtab2.test vtab3.test vtab4.test 336 vtab5.test vtab6.test vtab7.test vtab8.test vtab9.test vtab_alter.test 337 vtabA.test vtabB.test vtabC.test vtabD.test vtabE.test 338 vtabF.test where2.test where3.test where4.test where5.test where6.test 339 where7.test where8m.test where8.test where9.test whereA.test whereB.test 340 whereC.test whereD.test whereE.test whereF.test wherelimit.test 341 where.test 342} 343 344test_suite "vfslog" -prefix "" -description { 345 "Vfslog" quick test suite. Like "veryquick" except does not omits 346 a few tests that do not work with a version 1 VFS. And the quota* tests, 347 which do not work with a VFS that uses the pVfs argument passed to 348 sqlite3_vfs methods. 349} -files [ 350 test_set $allquicktests -exclude *malloc* *ioerr* *fault* oserror.test \ 351 pager1.test syscall.test sysfault.test tkt3457.test quota* superlock* \ 352 wal* mmap* 353] 354 355lappend ::testsuitelist xxx 356#------------------------------------------------------------------------- 357# Define the coverage related test suites: 358# 359# coverage-wal 360# 361test_suite "coverage-wal" -description { 362 Coverage tests for file wal.c. 363} -files { 364 wal.test wal2.test wal3.test walmode.test 365 walbak.test walhook.test walcrash2.test walcksum.test 366 walfault.test walbig.test walnoshm.test 367 wal5.test 368} 369 370test_suite "coverage-pager" -description { 371 Coverage tests for file pager.c. 372} -files { 373 pager1.test pager2.test pagerfault.test pagerfault2.test 374 walfault.test walbak.test journal2.test tkt-9d68c883.test 375} 376 377test_suite "coverage-analyze" -description { 378 Coverage tests for file analyze.c. 379} -files { 380 analyze3.test analyze4.test analyze5.test analyze6.test 381 analyze7.test analyze8.test analyze9.test analyzeA.test 382 analyze.test analyzeB.test mallocA.test 383} 384 385test_suite "coverage-sorter" -description { 386 Coverage tests for file vdbesort.c. 387} -files { 388 sort.test sortfault.test 389} 390 391 392lappend ::testsuitelist xxx 393#------------------------------------------------------------------------- 394# Define the permutation test suites: 395# 396 397# Run some tests using pre-allocated page and scratch blocks. 398# 399# mmap1.test is excluded because a good number of its tests depend on 400# the page-cache being larger than the database. But this permutation 401# causes the effective limit on the page-cache to be just 24 pages. 402# 403test_suite "memsubsys1" -description { 404 Tests using pre-allocated page and scratch blocks 405} -files [ 406 test_set $::allquicktests -exclude ioerr5.test malloc5.test mmap1.test 407] -initialize { 408 catch {db close} 409 sqlite3_shutdown 410 sqlite3_config_pagecache 4096 24 411 sqlite3_config_scratch 25000 1 412 sqlite3_initialize 413 autoinstall_test_functions 414} -shutdown { 415 catch {db close} 416 sqlite3_shutdown 417 sqlite3_config_pagecache 0 0 418 sqlite3_config_scratch 0 0 419 sqlite3_initialize 420 autoinstall_test_functions 421} 422 423# Run some tests using pre-allocated page and scratch blocks. This time 424# the allocations are too small to use in most cases. 425# 426# Both ioerr5.test and malloc5.test are excluded because they test the 427# sqlite3_soft_heap_limit() and sqlite3_release_memory() functionality. 428# This functionality is disabled if a pre-allocated page block is provided. 429# 430test_suite "memsubsys2" -description { 431 Tests using small pre-allocated page and scratch blocks 432} -files [ 433 test_set $::allquicktests -exclude ioerr5.test malloc5.test 434] -initialize { 435 catch {db close} 436 sqlite3_shutdown 437 sqlite3_config_pagecache 512 5 438 sqlite3_config_scratch 1000 1 439 sqlite3_initialize 440 autoinstall_test_functions 441} -shutdown { 442 catch {db close} 443 sqlite3_shutdown 444 sqlite3_config_pagecache 0 0 445 sqlite3_config_scratch 0 0 446 sqlite3_initialize 447 autoinstall_test_functions 448} 449 450# Run all tests with the lookaside allocator disabled. 451# 452test_suite "nolookaside" -description { 453 OOM tests with lookaside disabled 454} -initialize { 455 catch {db close} 456 sqlite3_shutdown 457 sqlite3_config_lookaside 0 0 458 sqlite3_initialize 459 autoinstall_test_functions 460} -shutdown { 461 catch {db close} 462 sqlite3_shutdown 463 sqlite3_config_lookaside 100 500 464 sqlite3_initialize 465 autoinstall_test_functions 466} -files $::allquicktests 467 468# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode. 469# 470test_suite "singlethread" -description { 471 Tests run in SQLITE_CONFIG_SINGLETHREAD mode 472} -initialize { 473 catch {db close} 474 sqlite3_shutdown 475 catch {sqlite3_config singlethread} 476 sqlite3_initialize 477 autoinstall_test_functions 478} -files { 479 delete.test delete2.test insert.test rollback.test select1.test 480 select2.test trans.test update.test vacuum.test types.test 481 types2.test types3.test 482} -shutdown { 483 catch {db close} 484 sqlite3_shutdown 485 catch {sqlite3_config serialized} 486 sqlite3_initialize 487 autoinstall_test_functions 488} 489 490test_suite "nomutex" -description { 491 Tests run with the SQLITE_OPEN_MULTITHREADED flag passed to sqlite3_open(). 492} -initialize { 493 rename sqlite3 sqlite3_nomutex 494 proc sqlite3 {args} { 495 if {[string range [lindex $args 0] 0 0] ne "-"} { 496 lappend args -fullmutex 0 -nomutex 1 497 } 498 uplevel [concat sqlite3_nomutex $args] 499 } 500} -files { 501 delete.test delete2.test insert.test rollback.test select1.test 502 select2.test trans.test update.test vacuum.test types.test 503 types2.test types3.test 504} -shutdown { 505 rename sqlite3 {} 506 rename sqlite3_nomutex sqlite3 507} 508 509# Run some tests in SQLITE_CONFIG_MULTITHREAD mode. 510# 511test_suite "multithread" -description { 512 Tests run in SQLITE_CONFIG_MULTITHREAD mode 513} -initialize { 514 catch {db close} 515 sqlite3_shutdown 516 catch {sqlite3_config multithread} 517 sqlite3_initialize 518 autoinstall_test_functions 519} -files { 520 delete.test delete2.test insert.test rollback.test select1.test 521 select2.test trans.test update.test vacuum.test types.test 522 types2.test types3.test sort4.test 523} -shutdown { 524 catch {db close} 525 sqlite3_shutdown 526 catch {sqlite3_config serialized} 527 sqlite3_initialize 528 autoinstall_test_functions 529} 530 531# Run some tests in SQLITE_OPEN_FULLMUTEX mode. 532# 533test_suite "fullmutex" -description { 534 Tests run in SQLITE_OPEN_FULLMUTEX mode 535} -initialize { 536 rename sqlite3 sqlite3_fullmutex 537 proc sqlite3 {args} { 538 if {[string range [lindex $args 0] 0 0] ne "-"} { 539 lappend args -nomutex 0 -fullmutex 1 540 } 541 uplevel [concat sqlite3_fullmutex $args] 542 } 543} -files { 544 delete.test delete2.test insert.test rollback.test select1.test 545 select2.test trans.test update.test vacuum.test types.test 546 types2.test types3.test 547} -shutdown { 548 rename sqlite3 {} 549 rename sqlite3_fullmutex sqlite3 550} 551 552# Run some tests using the "onefile" demo. 553# 554test_suite "onefile" -description { 555 Run some tests using the "test_onefile.c" demo 556} -initialize { 557 rename sqlite3 sqlite3_onefile 558 proc sqlite3 {args} { 559 if {[string range [lindex $args 0] 0 0] ne "-"} { 560 lappend args -vfs fs 561 } 562 uplevel [concat sqlite3_onefile $args] 563 } 564} -files { 565 conflict.test insert.test insert2.test insert3.test 566 rollback.test select1.test select2.test select3.test 567} -shutdown { 568 rename sqlite3 {} 569 rename sqlite3_onefile sqlite3 570} 571 572# Run some tests using UTF-16 databases. 573# 574test_suite "utf16" -description { 575 Run tests using UTF-16 databases 576} -presql { 577 pragma encoding = 'UTF-16' 578} -files { 579 alter.test alter3.test 580 analyze.test analyze3.test analyze4.test analyze5.test analyze6.test 581 analyze7.test analyze8.test analyze9.test analyzeA.test analyzeB.test 582 auth.test bind.test blob.test capi2.test capi3.test collate1.test 583 collate2.test collate3.test collate4.test collate5.test collate6.test 584 conflict.test date.test delete.test expr.test fkey1.test func.test 585 hook.test index.test insert2.test insert.test interrupt.test in.test 586 intpkey.test ioerr.test join2.test join.test lastinsert.test 587 laststmtchanges.test limit.test lock2.test lock.test main.test 588 memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test 589 null.test progress.test quote.test rowid.test select1.test select2.test 590 select3.test select4.test select5.test select6.test sort.test 591 subselect.test tableapi.test table.test temptable.test 592 trace.test trigger1.test trigger2.test trigger3.test 593 trigger4.test types2.test types.test unique.test update.test 594 vacuum.test view.test where.test 595} 596 597# Run some tests in exclusive locking mode. 598# 599test_suite "exclusive" -description { 600 Run tests in exclusive locking mode. 601} -presql { 602 pragma locking_mode = 'exclusive' 603} -files { 604 rollback.test select1.test select2.test 605 malloc.test ioerr.test 606} 607 608# Run some tests in exclusive locking mode with truncated journals. 609# 610test_suite "exclusive-truncate" -description { 611 Run tests in exclusive locking mode and truncate journal mode. 612} -presql { 613 pragma locking_mode = 'exclusive'; 614 pragma journal_mode = TRUNCATE; 615} -files { 616 delete.test delete2.test insert.test rollback.test select1.test 617 select2.test update.test malloc.test ioerr.test 618} 619 620# Run some tests in persistent journal mode. 621# 622test_suite "persistent_journal" -description { 623 Run tests in persistent-journal mode. 624} -presql { 625 pragma journal_mode = persist 626} -files { 627 delete.test delete2.test insert.test rollback.test select1.test 628 select2.test trans.test update.test vacuum.test 629} 630 631# Run some tests in truncating journal mode. 632# 633test_suite "truncate_journal" -description { 634 Run tests in persistent-journal mode. 635} -presql { 636 pragma journal_mode = truncate 637} -files { 638 delete.test delete2.test insert.test rollback.test select1.test 639 select2.test trans.test update.test vacuum.test 640 malloc.test ioerr.test 641} 642 643# Run some error tests in persistent journal mode. 644# 645test_suite "persistent_journal_error" -description { 646 Run malloc.test and ioerr.test in persistent-journal mode. 647} -presql { 648 pragma journal_mode = persist 649} -files { 650 malloc.test ioerr.test 651} 652 653# Run some tests in no journal mode. 654# 655test_suite "no_journal" -description { 656 Run tests in no-journal mode. 657} -presql { 658 pragma journal_mode = persist 659} -files { 660 delete.test delete2.test insert.test rollback.test select1.test 661 select2.test trans.test update.test vacuum.test 662} 663 664# Run some error tests in no journal mode. 665# 666test_suite "no_journal_error" -description { 667 Run malloc.test and ioerr.test in no-journal mode. 668} -presql { 669 pragma journal_mode = persist 670} -files { 671 malloc.test ioerr.test 672} 673 674# Run some crash-tests in autovacuum mode. 675# 676test_suite "autovacuum_crash" -description { 677 Run crash.test in autovacuum mode. 678} -presql { 679 pragma auto_vacuum = 1 680} -files crash.test 681 682# Run some ioerr-tests in autovacuum mode. 683# 684test_suite "autovacuum_ioerr" -description { 685 Run ioerr.test in autovacuum mode. 686} -presql { 687 pragma auto_vacuum = 1 688} -files ioerr.test 689 690# Run tests with an in-memory journal. 691# 692test_suite "inmemory_journal" -description { 693 Run tests with an in-memory journal file. 694} -presql { 695 pragma journal_mode = 'memory' 696} -files [test_set $::allquicktests -exclude { 697 # Exclude all tests that simulate IO errors. 698 autovacuum_ioerr2.test incrvacuum_ioerr.test ioerr.test 699 ioerr.test ioerr2.test ioerr3.test ioerr4.test ioerr5.test 700 vacuum3.test incrblob_err.test diskfull.test backup_ioerr.test 701 e_fts3.test fts3cov.test fts3malloc.test fts3rnd.test 702 fts3snippet.test mmapfault.test 703 704 # Exclude test scripts that use tcl IO to access journal files or count 705 # the number of fsync() calls. 706 pager.test exclusive.test jrnlmode.test sync.test misc1.test 707 journal1.test conflict.test crash8.test tkt3457.test io.test 708 journal3.test 8_3_names.test 709 710 pager1.test async4.test corrupt.test filefmt.test pager2.test 711 corrupt5.test corruptA.test pageropt.test 712 713 # Exclude stmt.test, which expects sub-journals to use temporary files. 714 stmt.test 715 716 zerodamage.test 717 718 # WAL mode is different. 719 wal* tkt-2d1a5c67d.test backcompat.test e_wal* rowallock.test 720}] 721 722ifcapable mem3 { 723 test_suite "memsys3" -description { 724 Run tests using the allocator in mem3.c. 725 } -files [test_set $::allquicktests -exclude { 726 autovacuum.test delete3.test manydb.test 727 bigrow.test incrblob2.test memdb.test 728 bitvec.test index2.test memsubsys1.test 729 capi3c.test ioerr.test memsubsys2.test 730 capi3.test join3.test pagesize.test 731 collate5.test limit.test backup_ioerr.test 732 backup_malloc.test 733 }] -initialize { 734 catch {db close} 735 sqlite3_reset_auto_extension 736 sqlite3_shutdown 737 sqlite3_config_heap 25000000 0 738 sqlite3_config_lookaside 0 0 739 ifcapable mem5 { 740 # If both memsys3 and memsys5 are enabled in the build, the call to 741 # [sqlite3_config_heap] will initialize the system to use memsys5. 742 # The following overrides this preference and installs the memsys3 743 # allocator. 744 sqlite3_install_memsys3 745 } 746 install_malloc_faultsim 1 747 sqlite3_initialize 748 autoinstall_test_functions 749 } -shutdown { 750 catch {db close} 751 sqlite3_shutdown 752 sqlite3_config_heap 0 0 753 sqlite3_config_lookaside 100 500 754 install_malloc_faultsim 1 755 sqlite3_initialize 756 autoinstall_test_functions 757 } 758} 759 760ifcapable mem5 { 761 test_suite "memsys5" -description { 762 Run tests using the allocator in mem5.c. 763 } -files [test_set $::allquicktests -exclude { 764 autovacuum.test delete3.test manydb.test 765 bigrow.test incrblob2.test memdb.test 766 bitvec.test index2.test memsubsys1.test 767 capi3c.test ioerr.test memsubsys2.test 768 capi3.test join3.test pagesize.test 769 collate5.test limit.test zeroblob.test 770 }] -initialize { 771 catch {db close} 772 sqlite3_shutdown 773 sqlite3_config_heap 25000000 64 774 sqlite3_config_lookaside 0 0 775 install_malloc_faultsim 1 776 sqlite3_initialize 777 autoinstall_test_functions 778 } -shutdown { 779 catch {db close} 780 sqlite3_shutdown 781 sqlite3_config_heap 0 0 782 sqlite3_config_lookaside 100 500 783 install_malloc_faultsim 1 784 sqlite3_initialize 785 autoinstall_test_functions 786 } 787 788 test_suite "memsys5-2" -description { 789 Run tests using the allocator in mem5.c in a different configuration. 790 } -files { 791 select1.test 792 } -initialize { 793 catch {db close} 794 sqlite3_shutdown 795 sqlite3_config_memstatus 0 796 sqlite3_config_heap 40000000 16 797 sqlite3_config_lookaside 0 0 798 install_malloc_faultsim 1 799 sqlite3_initialize 800 autoinstall_test_functions 801 } -shutdown { 802 catch {db close} 803 sqlite3_shutdown 804 sqlite3_config_heap 0 0 805 sqlite3_config_lookaside 100 500 806 install_malloc_faultsim 1 807 sqlite3_initialize 808 autoinstall_test_functions 809 } 810} 811 812ifcapable threadsafe { 813 test_suite "no_mutex_try" -description { 814 The sqlite3_mutex_try() interface always fails 815 } -files [ 816 test_set $::allquicktests -exclude mutex1.test mutex2.test 817 ] -initialize { 818 catch {db close} 819 sqlite3_shutdown 820 install_mutex_counters 1 821 set ::disable_mutex_try 1 822 sqlite3_initialize 823 autoinstall_test_functions 824 } -shutdown { 825 catch {db close} 826 sqlite3_shutdown 827 install_mutex_counters 0 828 sqlite3_initialize 829 autoinstall_test_functions 830 } 831} 832 833# run_tests "crash_safe_append" -description { 834# Run crash.test with persistent journals on a SAFE_APPEND file-system. 835# } -initialize { 836# rename crashsql sa_crashsql 837# proc crashsql {args} { 838# set options [lrange $args 0 [expr {[llength $args]-2}]] 839# lappend options -char safe_append 840# set sql [lindex $args end] 841# lappend options " 842# PRAGMA journal_mode=persistent; 843# $sql 844# " 845# set fd [open test.db-journal w] 846# puts $fd [string repeat 1234567890 100000] 847# close $fd 848# eval sa_crashsql $options 849# } 850# } -shutdown { 851# rename crashsql {} 852# rename sa_crashsql crashsql 853# } -files crash.test 854 855test_suite "safe_append" -description { 856 Run some tests on a SAFE_APPEND file-system. 857} -initialize { 858 rename sqlite3 sqlite3_safeappend 859 proc sqlite3 {args} { 860 if {[string range [lindex $args 0] 0 0] ne "-"} { 861 lappend args -vfs devsym 862 } 863 uplevel [concat sqlite3_safeappend $args] 864 } 865 sqlite3_simulate_device -char safe_append 866} -shutdown { 867 rename sqlite3 {} 868 rename sqlite3_shutdown sqlite3 869} -files [ 870 test_set $::allquicktests shared_err.test -exclude async3.test 871] 872 873# The set of tests to run on the alternative-pcache 874set perm-alt-pcache-testset { 875 async.test 876 attach.test 877 delete.test delete2.test 878 index.test 879 insert.test insert2.test 880 join.test join2.test 881 rollback.test 882 select1.test select2.test 883 trans.test 884 update.test 885} 886 887foreach discard_rate {0 10 50 90 100} { 888 test_suite "pcache${discard_rate}" -description " 889 Alternative pcache implementation with ${discard_rate}% random discard 890 " -initialize " 891 catch {db close} 892 sqlite3_shutdown 893 sqlite3_config_alt_pcache 1 $discard_rate 1 894 sqlite3_initialize 895 autoinstall_test_functions 896 " -shutdown { 897 catch {db close} 898 sqlite3_shutdown 899 sqlite3_config_alt_pcache 0 0 0 900 sqlite3_config_lookaside 100 500 901 install_malloc_faultsim 1 902 sqlite3_initialize 903 autoinstall_test_functions 904 } -files ${perm-alt-pcache-testset} 905} 906 907test_suite "journaltest" -description { 908 Check that pages are synced before being written (test_journal.c). 909} -initialize { 910 catch {db close} 911 register_jt_vfs -default "" 912} -shutdown { 913 unregister_jt_vfs 914} -files [test_set $::allquicktests -exclude { 915 wal* incrvacuum.test ioerr.test corrupt4.test io.test crash8.test 916 async4.test bigfile.test backcompat.test 917}] 918 919if {[info commands register_demovfs] != ""} { 920 test_suite "demovfs" -description { 921 Check that the demovfs (code in test_demovfs.c) more or less works. 922 } -initialize { 923 register_demovfs 924 } -shutdown { 925 unregister_demovfs 926 } -files { 927 insert.test insert2.test insert3.test rollback.test 928 select1.test select2.test select3.test 929 } 930} 931 932test_suite "wal" -description { 933 Run tests with journal_mode=WAL 934} -initialize { 935 set ::G(savepoint6_iterations) 100 936} -shutdown { 937 unset -nocomplain ::G(savepoint6_iterations) 938} -files { 939 savepoint.test savepoint2.test savepoint6.test 940 trans.test avtrans.test 941 942 fts3aa.test fts3ab.test fts3ac.test fts3ad.test 943 fts3ae.test fts3af.test fts3ag.test fts3ah.test 944 fts3ai.test fts3aj.test fts3ak.test fts3al.test 945 fts3am.test fts3an.test fts3ao.test fts3b.test 946 fts3c.test fts3d.test fts3e.test fts3query.test 947} 948 949test_suite "rtree" -description { 950 All R-tree related tests. Provides coverage of source file rtree.c. 951} -files [glob -nocomplain $::testdir/../ext/rtree/*.test] 952 953test_suite "ota" -description { 954 OTA tests. 955} -files [ 956 test_set [glob -nocomplain $::testdir/../ext/ota/*.test] -exclude ota.test 957] 958 959test_suite "no_optimization" -description { 960 Run test scripts with optimizations disabled using the 961 sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS) interface. 962} -files { 963 where.test where2.test where3.test where4.test where5.test 964 where6.test where7.test where8.test where9.test 965 whereA.test whereB.test wherelimit.test 966 select1.test select2.test select3.test select4.test select5.test 967 select7.test select8.test selectA.test selectC.test 968} -dbconfig { 969 optimization_control $::dbhandle all 0 970} 971 972test_suite "prepare" -description { 973 Run tests with the db connection using sqlite3_prepare() instead of _v2(). 974} -dbconfig { 975 db_use_legacy_prepare $::dbhandle 1 976 #$::dbhandle cache size 0 977} -files [ 978 test_set $allquicktests -exclude *malloc* *ioerr* *fault* 979] 980 981# End of tests 982############################################################################# 983 984# run_tests NAME OPTIONS 985# 986# where available options are: 987# 988# -description TITLE 989# -initialize SCRIPT 990# -shutdown SCRIPT 991# -presql SQL 992# -files LIST-OF-FILES 993# -prefix NAME 994# 995proc run_tests {name args} { 996 array set options $args 997 998 set ::G(perm:name) $name 999 set ::G(perm:prefix) $options(-prefix) 1000 set ::G(perm:presql) $options(-presql) 1001 set ::G(isquick) 1 1002 set ::G(perm:dbconfig) $options(-dbconfig) 1003 1004 uplevel $options(-initialize) 1005 1006 foreach file [lsort $options(-files)] { 1007 if {[file tail $file] == $file} { set file [file join $::testdir $file] } 1008 slave_test_file $file 1009 } 1010 1011 uplevel $options(-shutdown) 1012 1013 unset ::G(perm:name) 1014 unset ::G(perm:prefix) 1015 unset ::G(perm:presql) 1016 unset ::G(perm:dbconfig) 1017} 1018 1019proc run_test_suite {name} { 1020 if {[info exists ::testspec($name)]==0} { 1021 error "No such test suite: $name" 1022 } 1023 uplevel run_tests $name $::testspec($name) 1024} 1025 1026proc help {} { 1027 puts "Usage: $::argv0 TESTSUITE ?TESTFILE?" 1028 puts "" 1029 puts "Available test-suites are:" 1030 foreach k $::testsuitelist { 1031 if {[info exists ::testspec($k)]==0} { 1032 puts " ----------------------------------------" 1033 puts "" 1034 } else { 1035 array set o $::testspec($k) 1036 puts "Test suite: \"$k\"" 1037 set d [string trim $o(-description)] 1038 set d [regsub {\n *} $d "\n "] 1039 puts " $d" 1040 puts "" 1041 } 1042 } 1043 exit -1 1044} 1045 1046if {[info script] == $argv0} { 1047 proc main {argv} { 1048 if {[llength $argv]==0} { 1049 help 1050 } else { 1051 set suite [lindex $argv 0] 1052 if {[info exists ::testspec($suite)]==0} help 1053 set extra "" 1054 if {[llength $argv]>1} { set extra [list -files [lrange $argv 1 end]] } 1055 eval run_tests $suite $::testspec($suite) $extra 1056 } 1057 } 1058 main $argv 1059 finish_test 1060} 1061