modernc.org/cc@v1.0.1/v2/testdata/_sqlite/test/permutations.test (about)

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