blob: 2e529fa880dd915c1f85d58b9a9c02656b571bdc [file] [log] [blame]
danielk19771077e3f2008-06-21 18:07:37 +00001# 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#
danielk19771077e3f2008-06-21 18:07:37 +000012
13set testdir [file dirname $argv0]
14source $testdir/tester.tcl
dan13a3cb82010-06-11 19:04:21 +000015db close
danielk19771077e3f2008-06-21 18:07:37 +000016
dan0626dfc2010-06-15 06:56:37 +000017#-------------------------------------------------------------------------
18# test_suite NAME OPTIONS
danielk19771077e3f2008-06-21 18:07:37 +000019#
20# where available options are:
21#
dan430e74c2010-06-07 17:47:26 +000022# -description TITLE (default "")
danielk19771077e3f2008-06-21 18:07:37 +000023# -initialize SCRIPT (default "")
24# -shutdown SCRIPT (default "")
danielk19771077e3f2008-06-21 18:07:37 +000025# -presql SQL (default "")
dan0626dfc2010-06-15 06:56:37 +000026# -files LIST-OF-FILES (default $::ALLTESTS)
dan2fce9ab2010-06-15 18:00:06 +000027# -prefix NAME (default "$::NAME.")
dan1ce1b4a2010-12-07 14:32:28 +000028# -dbconfig SCRIPT (default "")
dan0626dfc2010-06-15 06:56:37 +000029#
30proc test_suite {name args} {
dan430e74c2010-06-07 17:47:26 +000031
dan0626dfc2010-06-15 06:56:37 +000032 set default(-shutdown) ""
33 set default(-initialize) ""
34 set default(-presql) ""
dan430e74c2010-06-07 17:47:26 +000035 set default(-description) "no description supplied (fixme)"
dan2fce9ab2010-06-15 18:00:06 +000036 set default(-files) ""
37 set default(-prefix) "${name}."
dan1ce1b4a2010-12-07 14:32:28 +000038 set default(-dbconfig) ""
dan430e74c2010-06-07 17:47:26 +000039
40 array set options [array get default]
dan0626dfc2010-06-15 06:56:37 +000041 if {[llength $args]%2} {
42 error "uneven number of options/switches passed to test_suite"
dan430e74c2010-06-07 17:47:26 +000043 }
dan0626dfc2010-06-15 06:56:37 +000044 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
drh0a846f92008-08-25 17:23:29 +000049 }
danielk19771077e3f2008-06-21 18:07:37 +000050
dan0626dfc2010-06-15 06:56:37 +000051 set ::testspec($name) [array get options]
52 lappend ::testsuitelist $name
53}
dan430e74c2010-06-07 17:47:26 +000054
dan0626dfc2010-06-15 06:56:37 +000055#-------------------------------------------------------------------------
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 }
danielk1977c1def3e2008-08-30 13:25:10 +000068 }
dan0626dfc2010-06-15 06:56:37 +000069 } elseif {$isExclude == 0} {
70 foreach f $a { set t($f) 1 }
drh0a846f92008-08-25 17:23:29 +000071 } else {
dan0626dfc2010-06-15 06:56:37 +000072 foreach f $a { array unset t $f }
dan897230e2010-08-26 14:15:37 +000073 foreach f $a { array unset t */$f }
danielk19771077e3f2008-06-21 18:07:37 +000074 }
75 }
76
dan0626dfc2010-06-15 06:56:37 +000077 return [array names t]
danielk19771077e3f2008-06-21 18:07:37 +000078}
79
dan0626dfc2010-06-15 06:56:37 +000080#-------------------------------------------------------------------------
81# Set up the following global list variables containing the names of
82# various test scripts:
83#
84# $alltests
dan2fce9ab2010-06-15 18:00:06 +000085# $allquicktests
dan0626dfc2010-06-15 06:56:37 +000086#
dan0626dfc2010-06-15 06:56:37 +000087set alltests [list]
88foreach f [glob $testdir/*.test] { lappend alltests [file tail $f] }
dan897230e2010-08-26 14:15:37 +000089foreach f [glob -nocomplain $testdir/../ext/rtree/*.test] {
90 lappend alltests $f
91}
92
dan0626dfc2010-06-15 06:56:37 +000093if {$::tcl_platform(platform)!="unix"} {
94 set alltests [test_set $alltests -exclude crash.test crash2.test]
danielk1977c1def3e2008-08-30 13:25:10 +000095}
dan0626dfc2010-06-15 06:56:37 +000096set alltests [test_set $alltests -exclude {
97 all.test async.test quick.test veryquick.test
98 memleak.test permutations.test soak.test fts3.test
mistachkinc60941f2012-09-13 01:51:02 +000099 mallocAll.test rtree.test full.test
dan0626dfc2010-06-15 06:56:37 +0000100}]
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
dan273f3f02010-06-26 15:42:33 +0000107 misc7.test mutex2.test notify2.test onefile.test pagerfault2.test
dan0626dfc2010-06-15 06:56:37 +0000108 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
dan533100d2011-12-17 08:10:34 +0000113 vtab_err.test walslow.test walcrash.test walcrash3.test
dan2aba5d92012-08-07 17:41:50 +0000114 walthread.test rtree3.test indexfault.test securedel2.test
dan0626dfc2010-06-15 06:56:37 +0000115}]
dan63109902010-07-05 05:54:55 +0000116if {[info exists ::env(QUICKTEST_INCLUDE)]} {
117 set allquicktests [concat $allquicktests $::env(QUICKTEST_INCLUDE)]
118}
danielk1977c1def3e2008-08-30 13:25:10 +0000119
danielk19771077e3f2008-06-21 18:07:37 +0000120#############################################################################
121# Start of tests
dan0626dfc2010-06-15 06:56:37 +0000122#
123
124#-------------------------------------------------------------------------
125# Define the generic test suites:
126#
127# veryquick
128# quick
129# full
dan0626dfc2010-06-15 06:56:37 +0000130#
dane91a54e2010-06-15 17:44:47 +0000131lappend ::testsuitelist xxx
dan0626dfc2010-06-15 06:56:37 +0000132
dan2fce9ab2010-06-15 18:00:06 +0000133test_suite "veryquick" -prefix "" -description {
dan0626dfc2010-06-15 06:56:37 +0000134 "Very" quick test suite. Runs in less than 5 minutes on a workstation.
135 This test suite is the same as the "quick" tests, except that some files
136 that test malloc and IO errors are omitted.
137} -files [
dan5d8a1372013-03-19 19:28:06 +0000138 test_set $allquicktests -exclude *malloc* *ioerr* *fault*
139]
140
drh0d0614b2013-03-25 23:09:28 +0000141test_suite "no-mmap" -prefix "nomm-" -description {
142 Similar to veryquick. Except with memory mapping disabled.
dan5d8a1372013-03-19 19:28:06 +0000143} -presql {
drh0d0614b2013-03-25 23:09:28 +0000144 pragma mmap_size = 0;
dan5d8a1372013-03-19 19:28:06 +0000145} -files [
dana64d5a12013-03-25 18:25:49 +0000146 test_set $allquicktests -exclude *malloc* *ioerr* *fault* -include malloc.test
dan0626dfc2010-06-15 06:56:37 +0000147]
148
dan25568442010-12-03 10:32:06 +0000149test_suite "valgrind" -prefix "" -description {
150 Run the "veryquick" test suite with a couple of multi-process tests (that
151 fail under valgrind) omitted.
152} -files [
drh373cfbc2012-08-30 20:24:39 +0000153 test_set $allquicktests -exclude *malloc* *ioerr* *fault* wal.test atof1.test
dan25568442010-12-03 10:32:06 +0000154] -initialize {
155 set ::G(valgrind) 1
156} -shutdown {
157 unset -nocomplain ::G(valgrind)
158}
159
dan2fce9ab2010-06-15 18:00:06 +0000160test_suite "quick" -prefix "" -description {
dan0626dfc2010-06-15 06:56:37 +0000161 Quick test suite. Runs in around 10 minutes on a workstation.
162} -files [
163 test_set $allquicktests
164]
165
dan2fce9ab2010-06-15 18:00:06 +0000166test_suite "full" -prefix "" -description {
dan0626dfc2010-06-15 06:56:37 +0000167 Full test suite. Takes a long time.
168} -files [
169 test_set $alltests
170] -initialize {
171 unset -nocomplain ::G(isquick)
172}
173
danea5542d2010-07-06 11:26:15 +0000174test_suite "threads" -prefix "" -description {
175 All multi-threaded tests.
176} -files {
177 notify2.test thread001.test thread002.test thread003.test
178 thread004.test thread005.test walthread.test
179}
180
dana69f7d52010-07-19 11:16:36 +0000181test_suite "fts3" -prefix "" -description {
danddf80eb2010-10-25 12:47:43 +0000182 All FTS3 tests except fts3rnd.test.
dana69f7d52010-07-19 11:16:36 +0000183} -files {
184 fts3aa.test fts3ab.test fts3ac.test fts3ad.test fts3ae.test
185 fts3af.test fts3ag.test fts3ah.test fts3ai.test fts3aj.test
186 fts3ak.test fts3al.test fts3am.test fts3an.test fts3ao.test
187 fts3atoken.test fts3b.test fts3c.test fts3cov.test fts3d.test
danddf80eb2010-10-25 12:47:43 +0000188 fts3defer.test fts3defer2.test fts3e.test fts3expr.test fts3expr2.test
189 fts3near.test fts3query.test fts3shared.test fts3snippet.test
dane4148542011-06-02 19:57:24 +0000190 fts3sort.test
danaf4c2142010-11-02 17:41:52 +0000191 fts3fault.test fts3malloc.test fts3matchinfo.test
dan2cf1a1d2011-06-14 09:00:27 +0000192 fts3aux1.test fts3comp1.test fts3auto.test
dand8e454e2011-10-04 11:22:59 +0000193 fts4aa.test fts4content.test
dancc5b8142011-10-04 16:37:35 +0000194 fts3conf.test fts3prefix.test fts3fault2.test fts3corrupt.test
dan5730ef52012-03-14 20:01:52 +0000195 fts3corrupt2.test fts3first.test fts4langid.test fts4merge.test
dan3d403c72012-05-25 17:50:19 +0000196 fts4check.test fts4unicode.test
dana69f7d52010-07-19 11:16:36 +0000197}
198
dana8793422012-06-07 07:24:04 +0000199test_suite "nofaultsim" -prefix "" -description {
200 "Very" quick test suite. Runs in less than 5 minutes on a workstation.
201 This test suite is the same as the "quick" tests, except that some files
202 that test malloc and IO errors are omitted.
203} -files [
204 test_set $allquicktests -exclude *malloc* *ioerr* *fault*
205] -initialize {
206 catch {db close}
207 sqlite3_shutdown
208 install_malloc_faultsim 0
209 sqlite3_initialize
210 autoinstall_test_functions
211} -shutdown {
212 unset -nocomplain ::G(valgrind)
213}
danea5542d2010-07-06 11:26:15 +0000214
dane91a54e2010-06-15 17:44:47 +0000215lappend ::testsuitelist xxx
dan0626dfc2010-06-15 06:56:37 +0000216#-------------------------------------------------------------------------
217# Define the coverage related test suites:
218#
219# coverage-wal
dan0626dfc2010-06-15 06:56:37 +0000220#
221test_suite "coverage-wal" -description {
222 Coverage tests for file wal.c.
223} -files {
danf43d7fc2010-07-03 10:00:00 +0000224 wal.test wal2.test wal3.test walmode.test
225 walbak.test walhook.test walcrash2.test walcksum.test
dan8c408002010-11-01 17:38:24 +0000226 walfault.test walbig.test walnoshm.test
dan28f9b0b2011-02-07 16:24:39 +0000227 wal5.test
dan0626dfc2010-06-15 06:56:37 +0000228}
229
dane91a54e2010-06-15 17:44:47 +0000230test_suite "coverage-pager" -description {
231 Coverage tests for file pager.c.
232} -files {
danf43d7fc2010-07-03 10:00:00 +0000233 pager1.test pager2.test pagerfault.test pagerfault2.test
234 walfault.test walbak.test journal2.test tkt-9d68c883.test
dane91a54e2010-06-15 17:44:47 +0000235}
dan0626dfc2010-06-15 06:56:37 +0000236
237
dane91a54e2010-06-15 17:44:47 +0000238lappend ::testsuitelist xxx
dan0626dfc2010-06-15 06:56:37 +0000239#-------------------------------------------------------------------------
240# Define the permutation test suites:
241#
danielk19771077e3f2008-06-21 18:07:37 +0000242
243# Run some tests using pre-allocated page and scratch blocks.
244#
dan0626dfc2010-06-15 06:56:37 +0000245test_suite "memsubsys1" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000246 Tests using pre-allocated page and scratch blocks
dan0626dfc2010-06-15 06:56:37 +0000247} -files [
248 test_set $::allquicktests -exclude ioerr5.test malloc5.test
249] -initialize {
drhd63bd752008-07-30 13:15:46 +0000250 catch {db close}
danielk19771077e3f2008-06-21 18:07:37 +0000251 sqlite3_shutdown
252 sqlite3_config_pagecache 4096 24
253 sqlite3_config_scratch 25000 1
254 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000255 autoinstall_test_functions
danielk19771077e3f2008-06-21 18:07:37 +0000256} -shutdown {
257 catch {db close}
258 sqlite3_shutdown
259 sqlite3_config_pagecache 0 0
260 sqlite3_config_scratch 0 0
261 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000262 autoinstall_test_functions
danielk19771077e3f2008-06-21 18:07:37 +0000263}
264
265# Run some tests using pre-allocated page and scratch blocks. This time
266# the allocations are too small to use in most cases.
267#
danielk197734c61e62008-08-29 12:00:20 +0000268# Both ioerr5.test and malloc5.test are excluded because they test the
269# sqlite3_soft_heap_limit() and sqlite3_release_memory() functionality.
270# This functionality is disabled if a pre-allocated page block is provided.
271#
dan0626dfc2010-06-15 06:56:37 +0000272test_suite "memsubsys2" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000273 Tests using small pre-allocated page and scratch blocks
dan0626dfc2010-06-15 06:56:37 +0000274} -files [
275 test_set $::allquicktests -exclude ioerr5.test malloc5.test
276] -initialize {
drhd63bd752008-07-30 13:15:46 +0000277 catch {db close}
danielk19771077e3f2008-06-21 18:07:37 +0000278 sqlite3_shutdown
279 sqlite3_config_pagecache 512 5
280 sqlite3_config_scratch 1000 1
281 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000282 autoinstall_test_functions
danielk19771077e3f2008-06-21 18:07:37 +0000283} -shutdown {
284 catch {db close}
285 sqlite3_shutdown
286 sqlite3_config_pagecache 0 0
287 sqlite3_config_scratch 0 0
288 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000289 autoinstall_test_functions
danielk19771077e3f2008-06-21 18:07:37 +0000290}
291
drhe2a7c6e2008-08-01 15:06:30 +0000292# Run all tests with the lookaside allocator disabled.
293#
dan0626dfc2010-06-15 06:56:37 +0000294test_suite "nolookaside" -description {
drhe2a7c6e2008-08-01 15:06:30 +0000295 OOM tests with lookaside disabled
drhe2a7c6e2008-08-01 15:06:30 +0000296} -initialize {
297 catch {db close}
298 sqlite3_shutdown
299 sqlite3_config_lookaside 0 0
300 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000301 autoinstall_test_functions
drhe2a7c6e2008-08-01 15:06:30 +0000302} -shutdown {
303 catch {db close}
304 sqlite3_shutdown
305 sqlite3_config_lookaside 100 500
306 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000307 autoinstall_test_functions
dan0626dfc2010-06-15 06:56:37 +0000308} -files $::allquicktests
drhe2a7c6e2008-08-01 15:06:30 +0000309
danielk19771077e3f2008-06-21 18:07:37 +0000310# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
311#
dan0626dfc2010-06-15 06:56:37 +0000312test_suite "singlethread" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000313 Tests run in SQLITE_CONFIG_SINGLETHREAD mode
314} -initialize {
drh04df18d2009-01-06 14:50:11 +0000315 catch {db close}
316 sqlite3_shutdown
317 catch {sqlite3_config singlethread}
drhbb77b752009-04-09 01:23:49 +0000318 sqlite3_initialize
319 autoinstall_test_functions
dan0626dfc2010-06-15 06:56:37 +0000320} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000321 delete.test delete2.test insert.test rollback.test select1.test
322 select2.test trans.test update.test vacuum.test types.test
323 types2.test types3.test
324} -shutdown {
drh04df18d2009-01-06 14:50:11 +0000325 catch {db close}
326 sqlite3_shutdown
327 catch {sqlite3_config serialized}
drhbb77b752009-04-09 01:23:49 +0000328 sqlite3_initialize
329 autoinstall_test_functions
danielk19771077e3f2008-06-21 18:07:37 +0000330}
331
dan0626dfc2010-06-15 06:56:37 +0000332test_suite "nomutex" -description {
drh039963a2008-09-03 00:43:15 +0000333 Tests run with the SQLITE_OPEN_MULTITHREADED flag passed to sqlite3_open().
danielk19779a6284c2008-07-10 17:52:49 +0000334} -initialize {
335 rename sqlite3 sqlite3_nomutex
336 proc sqlite3 {args} {
337 if {[string range [lindex $args 0] 0 0] ne "-"} {
drhcc91e7f2008-09-03 01:08:00 +0000338 lappend args -fullmutex 0 -nomutex 1
danielk19779a6284c2008-07-10 17:52:49 +0000339 }
340 uplevel [concat sqlite3_nomutex $args]
341 }
dan0626dfc2010-06-15 06:56:37 +0000342} -files {
danielk19779a6284c2008-07-10 17:52:49 +0000343 delete.test delete2.test insert.test rollback.test select1.test
344 select2.test trans.test update.test vacuum.test types.test
345 types2.test types3.test
346} -shutdown {
347 rename sqlite3 {}
348 rename sqlite3_nomutex sqlite3
349}
350
danielk19771077e3f2008-06-21 18:07:37 +0000351# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
352#
dan0626dfc2010-06-15 06:56:37 +0000353test_suite "multithread" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000354 Tests run in SQLITE_CONFIG_MULTITHREAD mode
355} -initialize {
drh04df18d2009-01-06 14:50:11 +0000356 catch {db close}
357 sqlite3_shutdown
358 catch {sqlite3_config multithread}
drhbb77b752009-04-09 01:23:49 +0000359 sqlite3_initialize
360 autoinstall_test_functions
dan0626dfc2010-06-15 06:56:37 +0000361} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000362 delete.test delete2.test insert.test rollback.test select1.test
363 select2.test trans.test update.test vacuum.test types.test
364 types2.test types3.test
365} -shutdown {
drh04df18d2009-01-06 14:50:11 +0000366 catch {db close}
367 sqlite3_shutdown
368 catch {sqlite3_config serialized}
drhbb77b752009-04-09 01:23:49 +0000369 sqlite3_initialize
370 autoinstall_test_functions
danielk19771077e3f2008-06-21 18:07:37 +0000371}
372
drh039963a2008-09-03 00:43:15 +0000373# Run some tests in SQLITE_OPEN_FULLMUTEX mode.
374#
dan0626dfc2010-06-15 06:56:37 +0000375test_suite "fullmutex" -description {
drh039963a2008-09-03 00:43:15 +0000376 Tests run in SQLITE_OPEN_FULLMUTEX mode
377} -initialize {
378 rename sqlite3 sqlite3_fullmutex
379 proc sqlite3 {args} {
380 if {[string range [lindex $args 0] 0 0] ne "-"} {
drhcc91e7f2008-09-03 01:08:00 +0000381 lappend args -nomutex 0 -fullmutex 1
drh039963a2008-09-03 00:43:15 +0000382 }
383 uplevel [concat sqlite3_fullmutex $args]
384 }
dan0626dfc2010-06-15 06:56:37 +0000385} -files {
drh039963a2008-09-03 00:43:15 +0000386 delete.test delete2.test insert.test rollback.test select1.test
387 select2.test trans.test update.test vacuum.test types.test
388 types2.test types3.test
389} -shutdown {
390 rename sqlite3 {}
391 rename sqlite3_fullmutex sqlite3
392}
393
danielk19771077e3f2008-06-21 18:07:37 +0000394# Run some tests using the "onefile" demo.
395#
dan0626dfc2010-06-15 06:56:37 +0000396test_suite "onefile" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000397 Run some tests using the "test_onefile.c" demo
398} -initialize {
399 rename sqlite3 sqlite3_onefile
400 proc sqlite3 {args} {
401 if {[string range [lindex $args 0] 0 0] ne "-"} {
402 lappend args -vfs fs
403 }
404 uplevel [concat sqlite3_onefile $args]
405 }
dan0626dfc2010-06-15 06:56:37 +0000406} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000407 conflict.test insert.test insert2.test insert3.test
408 rollback.test select1.test select2.test select3.test
danielk19771077e3f2008-06-21 18:07:37 +0000409} -shutdown {
410 rename sqlite3 {}
411 rename sqlite3_onefile sqlite3
412}
413
414# Run some tests using UTF-16 databases.
415#
dan0626dfc2010-06-15 06:56:37 +0000416test_suite "utf16" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000417 Run tests using UTF-16 databases
danielk19772dd6d802008-06-21 19:10:27 +0000418} -presql {
danielk19771077e3f2008-06-21 18:07:37 +0000419 pragma encoding = 'UTF-16'
dan0626dfc2010-06-15 06:56:37 +0000420} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000421 alter.test alter3.test
422 auth.test bind.test blob.test capi2.test capi3.test collate1.test
423 collate2.test collate3.test collate4.test collate5.test collate6.test
424 conflict.test date.test delete.test expr.test fkey1.test func.test
425 hook.test index.test insert2.test insert.test interrupt.test in.test
426 intpkey.test ioerr.test join2.test join.test lastinsert.test
427 laststmtchanges.test limit.test lock2.test lock.test main.test
428 memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
429 null.test progress.test quote.test rowid.test select1.test select2.test
430 select3.test select4.test select5.test select6.test sort.test
431 subselect.test tableapi.test table.test temptable.test
432 trace.test trigger1.test trigger2.test trigger3.test
433 trigger4.test types2.test types.test unique.test update.test
434 vacuum.test view.test where.test
435}
436
437# Run some tests in exclusive locking mode.
438#
dan0626dfc2010-06-15 06:56:37 +0000439test_suite "exclusive" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000440 Run tests in exclusive locking mode.
441} -presql {
442 pragma locking_mode = 'exclusive'
dan0626dfc2010-06-15 06:56:37 +0000443} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000444 rollback.test select1.test select2.test
445 malloc.test ioerr.test
446}
447
drh04335882008-09-26 21:08:08 +0000448# Run some tests in exclusive locking mode with truncated journals.
449#
dan0626dfc2010-06-15 06:56:37 +0000450test_suite "exclusive-truncate" -description {
drh04335882008-09-26 21:08:08 +0000451 Run tests in exclusive locking mode and truncate journal mode.
452} -presql {
453 pragma locking_mode = 'exclusive';
454 pragma journal_mode = TRUNCATE;
dan0626dfc2010-06-15 06:56:37 +0000455} -files {
drh04335882008-09-26 21:08:08 +0000456 delete.test delete2.test insert.test rollback.test select1.test
457 select2.test update.test malloc.test ioerr.test
458}
459
danielk19771077e3f2008-06-21 18:07:37 +0000460# Run some tests in persistent journal mode.
461#
dan0626dfc2010-06-15 06:56:37 +0000462test_suite "persistent_journal" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000463 Run tests in persistent-journal mode.
464} -presql {
465 pragma journal_mode = persist
dan0626dfc2010-06-15 06:56:37 +0000466} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000467 delete.test delete2.test insert.test rollback.test select1.test
468 select2.test trans.test update.test vacuum.test
469}
470
drh04335882008-09-26 21:08:08 +0000471# Run some tests in truncating journal mode.
472#
dan0626dfc2010-06-15 06:56:37 +0000473test_suite "truncate_journal" -description {
drh04335882008-09-26 21:08:08 +0000474 Run tests in persistent-journal mode.
475} -presql {
476 pragma journal_mode = truncate
dan0626dfc2010-06-15 06:56:37 +0000477} -files {
drh04335882008-09-26 21:08:08 +0000478 delete.test delete2.test insert.test rollback.test select1.test
479 select2.test trans.test update.test vacuum.test
480 malloc.test ioerr.test
481}
482
danielk19771077e3f2008-06-21 18:07:37 +0000483# Run some error tests in persistent journal mode.
484#
dan0626dfc2010-06-15 06:56:37 +0000485test_suite "persistent_journal_error" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000486 Run malloc.test and ioerr.test in persistent-journal mode.
487} -presql {
488 pragma journal_mode = persist
dan0626dfc2010-06-15 06:56:37 +0000489} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000490 malloc.test ioerr.test
491}
492
493# Run some tests in no journal mode.
494#
dan0626dfc2010-06-15 06:56:37 +0000495test_suite "no_journal" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000496 Run tests in no-journal mode.
497} -presql {
498 pragma journal_mode = persist
dan0626dfc2010-06-15 06:56:37 +0000499} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000500 delete.test delete2.test insert.test rollback.test select1.test
501 select2.test trans.test update.test vacuum.test
502}
503
504# Run some error tests in no journal mode.
505#
dan0626dfc2010-06-15 06:56:37 +0000506test_suite "no_journal_error" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000507 Run malloc.test and ioerr.test in no-journal mode.
508} -presql {
509 pragma journal_mode = persist
dan0626dfc2010-06-15 06:56:37 +0000510} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000511 malloc.test ioerr.test
512}
513
514# Run some crash-tests in autovacuum mode.
515#
dan0626dfc2010-06-15 06:56:37 +0000516test_suite "autovacuum_crash" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000517 Run crash.test in autovacuum mode.
518} -presql {
519 pragma auto_vacuum = 1
dan0626dfc2010-06-15 06:56:37 +0000520} -files crash.test
danielk19771077e3f2008-06-21 18:07:37 +0000521
522# Run some ioerr-tests in autovacuum mode.
523#
dan0626dfc2010-06-15 06:56:37 +0000524test_suite "autovacuum_ioerr" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000525 Run ioerr.test in autovacuum mode.
526} -presql {
527 pragma auto_vacuum = 1
dan0626dfc2010-06-15 06:56:37 +0000528} -files ioerr.test
danielk19771077e3f2008-06-21 18:07:37 +0000529
danielk1977b3175382008-10-17 18:51:52 +0000530# Run tests with an in-memory journal.
531#
dan0626dfc2010-06-15 06:56:37 +0000532test_suite "inmemory_journal" -description {
danielk1977b3175382008-10-17 18:51:52 +0000533 Run tests with an in-memory journal file.
534} -presql {
535 pragma journal_mode = 'memory'
dan0626dfc2010-06-15 06:56:37 +0000536} -files [test_set $::allquicktests -exclude {
danielk1977b3175382008-10-17 18:51:52 +0000537 # Exclude all tests that simulate IO errors.
538 autovacuum_ioerr2.test incrvacuum_ioerr.test ioerr.test
539 ioerr.test ioerr2.test ioerr3.test ioerr4.test ioerr5.test
drh2206a2b2009-04-01 23:09:43 +0000540 vacuum3.test incrblob_err.test diskfull.test backup_ioerr.test
shanehc3b84832010-07-09 19:32:28 +0000541 e_fts3.test fts3cov.test fts3malloc.test fts3rnd.test
542 fts3snippet.test
danielk1977b3175382008-10-17 18:51:52 +0000543
544 # Exclude test scripts that use tcl IO to access journal files or count
545 # the number of fsync() calls.
546 pager.test exclusive.test jrnlmode.test sync.test misc1.test
danielk1977cb257902009-04-10 18:32:29 +0000547 journal1.test conflict.test crash8.test tkt3457.test io.test
drh8b0228f2011-08-02 20:14:55 +0000548 journal3.test 8_3_names.test
dan01d38562010-03-08 10:32:38 +0000549
dancb354602010-07-08 09:44:42 +0000550 pager1.test async4.test corrupt.test filefmt.test pager2.test
551 corrupt5.test corruptA.test pageropt.test
552
dan01d38562010-03-08 10:32:38 +0000553 # Exclude stmt.test, which expects sub-journals to use temporary files.
554 stmt.test
drh0b944132010-05-24 20:24:38 +0000555
dan6b4e9a82012-01-13 10:51:52 +0000556 zerodamage.test
557
drh0b944132010-05-24 20:24:38 +0000558 # WAL mode is different.
drh82be3b02011-08-02 19:59:39 +0000559 wal* tkt-2d1a5c67d.test backcompat.test
dan0626dfc2010-06-15 06:56:37 +0000560}]
danielk1977b3175382008-10-17 18:51:52 +0000561
danielk19776b39c2e2008-06-25 14:57:53 +0000562ifcapable mem3 {
dan0626dfc2010-06-15 06:56:37 +0000563 test_suite "memsys3" -description {
danielk19776b39c2e2008-06-25 14:57:53 +0000564 Run tests using the allocator in mem3.c.
daneace5272010-07-05 05:31:48 +0000565 } -files [test_set $::allquicktests -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000566 autovacuum.test delete3.test manydb.test
567 bigrow.test incrblob2.test memdb.test
568 bitvec.test index2.test memsubsys1.test
569 capi3c.test ioerr.test memsubsys2.test
570 capi3.test join3.test pagesize.test
danielk19778b322822009-07-01 18:09:01 +0000571 collate5.test limit.test backup_ioerr.test
572 backup_malloc.test
dan0626dfc2010-06-15 06:56:37 +0000573 }] -initialize {
danielk19776b39c2e2008-06-25 14:57:53 +0000574 catch {db close}
575 sqlite3_reset_auto_extension
576 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000577 sqlite3_config_heap 25000000 0
drhe2a7c6e2008-08-01 15:06:30 +0000578 sqlite3_config_lookaside 0 0
danielk19778b322822009-07-01 18:09:01 +0000579 ifcapable mem5 {
580 # If both memsys3 and memsys5 are enabled in the build, the call to
581 # [sqlite3_config_heap] will initialize the system to use memsys5.
582 # The following overrides this preference and installs the memsys3
583 # allocator.
584 sqlite3_install_memsys3
585 }
danielk19776b39c2e2008-06-25 14:57:53 +0000586 install_malloc_faultsim 1
587 sqlite3_initialize
588 autoinstall_test_functions
589 } -shutdown {
590 catch {db close}
danielk19776b39c2e2008-06-25 14:57:53 +0000591 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000592 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000593 sqlite3_config_lookaside 100 500
danielk19776b39c2e2008-06-25 14:57:53 +0000594 install_malloc_faultsim 1
595 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000596 autoinstall_test_functions
danielk19776b39c2e2008-06-25 14:57:53 +0000597 }
danielk197757e5ea92008-06-24 19:02:55 +0000598}
599
danielk19776b39c2e2008-06-25 14:57:53 +0000600ifcapable mem5 {
dan0626dfc2010-06-15 06:56:37 +0000601 test_suite "memsys5" -description {
danielk19776b39c2e2008-06-25 14:57:53 +0000602 Run tests using the allocator in mem5.c.
daneace5272010-07-05 05:31:48 +0000603 } -files [test_set $::allquicktests -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000604 autovacuum.test delete3.test manydb.test
605 bigrow.test incrblob2.test memdb.test
606 bitvec.test index2.test memsubsys1.test
607 capi3c.test ioerr.test memsubsys2.test
608 capi3.test join3.test pagesize.test
danielk1977ac8d7b32008-11-13 16:21:50 +0000609 collate5.test limit.test zeroblob.test
dan0626dfc2010-06-15 06:56:37 +0000610 }] -initialize {
danielk19776b39c2e2008-06-25 14:57:53 +0000611 catch {db close}
danielk19776b39c2e2008-06-25 14:57:53 +0000612 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000613 sqlite3_config_heap 25000000 64
drhe2a7c6e2008-08-01 15:06:30 +0000614 sqlite3_config_lookaside 0 0
danielk19775099be52008-06-27 13:27:03 +0000615 install_malloc_faultsim 1
616 sqlite3_initialize
617 autoinstall_test_functions
618 } -shutdown {
619 catch {db close}
danielk19775099be52008-06-27 13:27:03 +0000620 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000621 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000622 sqlite3_config_lookaside 100 500
danielk19775099be52008-06-27 13:27:03 +0000623 install_malloc_faultsim 1
624 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000625 autoinstall_test_functions
danielk19775099be52008-06-27 13:27:03 +0000626 }
627
dan0626dfc2010-06-15 06:56:37 +0000628 test_suite "memsys5-2" -description {
danielk19775099be52008-06-27 13:27:03 +0000629 Run tests using the allocator in mem5.c in a different configuration.
dan0626dfc2010-06-15 06:56:37 +0000630 } -files {
drh8a42cbd2008-07-10 18:13:42 +0000631 select1.test
danielk19775099be52008-06-27 13:27:03 +0000632 } -initialize {
633 catch {db close}
danielk19775099be52008-06-27 13:27:03 +0000634 sqlite3_shutdown
danb0c6a882010-09-02 10:08:41 +0000635 sqlite3_config_memstatus 0
drh7830cd42008-07-16 12:25:32 +0000636 sqlite3_config_heap 40000000 16
drhe2a7c6e2008-08-01 15:06:30 +0000637 sqlite3_config_lookaside 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000638 install_malloc_faultsim 1
639 sqlite3_initialize
640 autoinstall_test_functions
641 } -shutdown {
642 catch {db close}
danielk19776b39c2e2008-06-25 14:57:53 +0000643 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000644 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000645 sqlite3_config_lookaside 100 500
danielk19776b39c2e2008-06-25 14:57:53 +0000646 install_malloc_faultsim 1
647 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000648 autoinstall_test_functions
danielk19776b39c2e2008-06-25 14:57:53 +0000649 }
danielk1977c66c0e12008-06-25 14:26:07 +0000650}
651
drh8a42cbd2008-07-10 18:13:42 +0000652ifcapable threadsafe {
dan0626dfc2010-06-15 06:56:37 +0000653 test_suite "no_mutex_try" -description {
drh8a42cbd2008-07-10 18:13:42 +0000654 The sqlite3_mutex_try() interface always fails
dan0626dfc2010-06-15 06:56:37 +0000655 } -files [
656 test_set $::allquicktests -exclude mutex1.test mutex2.test
657 ] -initialize {
drh8a42cbd2008-07-10 18:13:42 +0000658 catch {db close}
659 sqlite3_shutdown
660 install_mutex_counters 1
661 set ::disable_mutex_try 1
drhbb77b752009-04-09 01:23:49 +0000662 sqlite3_initialize
663 autoinstall_test_functions
drh8a42cbd2008-07-10 18:13:42 +0000664 } -shutdown {
665 catch {db close}
666 sqlite3_shutdown
667 install_mutex_counters 0
drhbb77b752009-04-09 01:23:49 +0000668 sqlite3_initialize
669 autoinstall_test_functions
drh8a42cbd2008-07-10 18:13:42 +0000670 }
671}
672
danielk1977b13dee92008-06-23 15:55:52 +0000673# run_tests "crash_safe_append" -description {
674# Run crash.test with persistent journals on a SAFE_APPEND file-system.
675# } -initialize {
676# rename crashsql sa_crashsql
677# proc crashsql {args} {
678# set options [lrange $args 0 [expr {[llength $args]-2}]]
679# lappend options -char safe_append
680# set sql [lindex $args end]
681# lappend options "
682# PRAGMA journal_mode=persistent;
683# $sql
684# "
685# set fd [open test.db-journal w]
686# puts $fd [string repeat 1234567890 100000]
687# close $fd
688# eval sa_crashsql $options
689# }
690# } -shutdown {
691# rename crashsql {}
692# rename sa_crashsql crashsql
dan0626dfc2010-06-15 06:56:37 +0000693# } -files crash.test
danielk1977b13dee92008-06-23 15:55:52 +0000694
dan0626dfc2010-06-15 06:56:37 +0000695test_suite "safe_append" -description {
danielk1977755339e2008-09-12 10:22:40 +0000696 Run some tests on a SAFE_APPEND file-system.
697} -initialize {
698 rename sqlite3 sqlite3_safeappend
699 proc sqlite3 {args} {
700 if {[string range [lindex $args 0] 0 0] ne "-"} {
701 lappend args -vfs devsym
702 }
703 uplevel [concat sqlite3_safeappend $args]
704 }
705 sqlite3_simulate_device -char safe_append
706} -shutdown {
707 rename sqlite3 {}
708 rename sqlite3_shutdown sqlite3
dan0626dfc2010-06-15 06:56:37 +0000709} -files [
710 test_set $::allquicktests shared_err.test -exclude async3.test
711]
danielk1977755339e2008-09-12 10:22:40 +0000712
drhb232c232008-11-19 01:20:26 +0000713# The set of tests to run on the alternative-pcache
714set perm-alt-pcache-testset {
715 async.test
716 attach.test
717 delete.test delete2.test
718 index.test
719 insert.test insert2.test
720 join.test join2.test
721 rollback.test
722 select1.test select2.test
723 trans.test
724 update.test
725}
726
dan2acd4c62010-07-13 14:22:39 +0000727foreach discard_rate {0 10 50 90 100} {
728 test_suite "pcache${discard_rate}" -description "
729 Alternative pcache implementation with ${discard_rate}% random discard
730 " -initialize "
731 catch {db close}
732 sqlite3_shutdown
733 sqlite3_config_alt_pcache 1 $discard_rate 1
734 sqlite3_initialize
735 autoinstall_test_functions
736 " -shutdown {
737 catch {db close}
738 sqlite3_shutdown
739 sqlite3_config_alt_pcache 0 0 0
740 sqlite3_config_lookaside 100 500
741 install_malloc_faultsim 1
742 sqlite3_initialize
743 autoinstall_test_functions
744 } -files ${perm-alt-pcache-testset}
745}
danielk1977b13dee92008-06-23 15:55:52 +0000746
dan0626dfc2010-06-15 06:56:37 +0000747test_suite "journaltest" -description {
danielk1977f3107512008-12-22 10:58:46 +0000748 Check that pages are synced before being written (test_journal.c).
749} -initialize {
danielk1977f3107512008-12-22 10:58:46 +0000750 catch {db close}
751 register_jt_vfs -default ""
752} -shutdown {
753 unregister_jt_vfs
dan0626dfc2010-06-15 06:56:37 +0000754} -files [test_set $::allquicktests -exclude {
755 wal* incrvacuum.test ioerr.test corrupt4.test io.test crash8.test
drhd88d1052011-08-02 19:30:20 +0000756 async4.test bigfile.test backcompat.test
drhfb4a6262010-05-06 19:55:57 +0000757}]
danielk1977f3107512008-12-22 10:58:46 +0000758
dan0a7a9152010-04-07 07:57:38 +0000759if {[info commands register_demovfs] != ""} {
dan0626dfc2010-06-15 06:56:37 +0000760 test_suite "demovfs" -description {
dan430e74c2010-06-07 17:47:26 +0000761 Check that the demovfs (code in test_demovfs.c) more or less works.
dan0a7a9152010-04-07 07:57:38 +0000762 } -initialize {
763 register_demovfs
764 } -shutdown {
765 unregister_demovfs
dan0626dfc2010-06-15 06:56:37 +0000766 } -files {
dan0a7a9152010-04-07 07:57:38 +0000767 insert.test insert2.test insert3.test rollback.test
768 select1.test select2.test select3.test
769 }
770}
771
dan0626dfc2010-06-15 06:56:37 +0000772test_suite "wal" -description {
dan71cb5182010-04-26 12:39:03 +0000773 Run tests with journal_mode=WAL
dan31f98fc2010-04-27 05:42:32 +0000774} -initialize {
dan430e74c2010-06-07 17:47:26 +0000775 set ::G(savepoint6_iterations) 100
dan31f98fc2010-04-27 05:42:32 +0000776} -shutdown {
dan430e74c2010-06-07 17:47:26 +0000777 unset -nocomplain ::G(savepoint6_iterations)
dan0626dfc2010-06-15 06:56:37 +0000778} -files {
dane106de62010-04-27 06:49:34 +0000779 savepoint.test savepoint2.test savepoint6.test
780 trans.test avtrans.test
dan60f9da72010-07-07 11:42:59 +0000781
782 fts3aa.test fts3ab.test fts3ac.test fts3ad.test
783 fts3ae.test fts3af.test fts3ag.test fts3ah.test
784 fts3ai.test fts3aj.test fts3ak.test fts3al.test
785 fts3am.test fts3an.test fts3ao.test fts3b.test
786 fts3c.test fts3d.test fts3e.test fts3query.test
dan71cb5182010-04-26 12:39:03 +0000787}
dan897230e2010-08-26 14:15:37 +0000788
789test_suite "rtree" -description {
790 All R-tree related tests. Provides coverage of source file rtree.c.
791} -files [glob -nocomplain $::testdir/../ext/rtree/*.test]
792
dan1ce1b4a2010-12-07 14:32:28 +0000793test_suite "no_optimization" -description {
794 Run test scripts with optimizations disabled using the
795 sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS) interface.
796} -files {
797 where.test where2.test where3.test where4.test where5.test
798 where6.test where7.test where8.test where9.test
799 whereA.test whereB.test wherelimit.test
800 select1.test select2.test select3.test select4.test select5.test
801 select7.test select8.test selectA.test selectC.test
802} -dbconfig {
803 optimization_control $::dbhandle all 0
804}
805
danc431fd52011-06-27 16:55:50 +0000806test_suite "prepare" -description {
807 Run tests with the db connection using sqlite3_prepare() instead of _v2().
808} -dbconfig {
809 db_use_legacy_prepare $::dbhandle 1
810 #$::dbhandle cache size 0
811} -files [
812 test_set $allquicktests -exclude *malloc* *ioerr* *fault*
813]
814
danielk19771077e3f2008-06-21 18:07:37 +0000815# End of tests
816#############################################################################
817
dan0626dfc2010-06-15 06:56:37 +0000818# run_tests NAME OPTIONS
819#
820# where available options are:
821#
dan2fce9ab2010-06-15 18:00:06 +0000822# -description TITLE
823# -initialize SCRIPT
824# -shutdown SCRIPT
825# -presql SQL
826# -files LIST-OF-FILES
827# -prefix NAME
dan0626dfc2010-06-15 06:56:37 +0000828#
829proc run_tests {name args} {
830 array set options $args
danielk19771077e3f2008-06-21 18:07:37 +0000831
dand506de02010-07-03 13:59:01 +0000832 set ::G(perm:name) $name
833 set ::G(perm:prefix) $options(-prefix)
dan0626dfc2010-06-15 06:56:37 +0000834 set ::G(perm:presql) $options(-presql)
835 set ::G(isquick) 1
dan1ce1b4a2010-12-07 14:32:28 +0000836 set ::G(perm:dbconfig) $options(-dbconfig)
dan0626dfc2010-06-15 06:56:37 +0000837
838 uplevel $options(-initialize)
839
840 foreach file [lsort $options(-files)] {
dan897230e2010-08-26 14:15:37 +0000841 if {[file tail $file] == $file} { set file [file join $::testdir $file] }
842 slave_test_file $file
dan0626dfc2010-06-15 06:56:37 +0000843 }
844
845 uplevel $options(-shutdown)
846
847 unset ::G(perm:name)
dand506de02010-07-03 13:59:01 +0000848 unset ::G(perm:prefix)
dan0626dfc2010-06-15 06:56:37 +0000849 unset ::G(perm:presql)
dan1ce1b4a2010-12-07 14:32:28 +0000850 unset ::G(perm:dbconfig)
dan0626dfc2010-06-15 06:56:37 +0000851}
852
853proc run_test_suite {name} {
854 if {[info exists ::testspec($name)]==0} {
855 error "No such test suite: $name"
856 }
857 uplevel run_tests $name $::testspec($name)
858}
859
860proc help {} {
dane91a54e2010-06-15 17:44:47 +0000861 puts "Usage: $::argv0 TESTSUITE ?TESTFILE?"
862 puts ""
863 puts "Available test-suites are:"
dan0626dfc2010-06-15 06:56:37 +0000864 foreach k $::testsuitelist {
dane91a54e2010-06-15 17:44:47 +0000865 if {[info exists ::testspec($k)]==0} {
866 puts " ----------------------------------------"
867 puts ""
868 } else {
869 array set o $::testspec($k)
870 puts "Test suite: \"$k\""
871 set d [string trim $o(-description)]
872 set d [regsub {\n *} $d "\n "]
873 puts " $d"
874 puts ""
875 }
dan0626dfc2010-06-15 06:56:37 +0000876 }
877 exit -1
878}
879
880if {[info script] == $argv0} {
881 proc main {argv} {
882 if {[llength $argv]==0} {
883 help
884 } else {
885 set suite [lindex $argv 0]
886 if {[info exists ::testspec($suite)]==0} help
887 set extra ""
888 if {[llength $argv]>1} { set extra [list -files [lrange $argv 1 end]] }
889 eval run_tests $suite $::testspec($suite) $extra
890 }
891 }
892 main $argv
893 finish_test
894}