blob: fef111e77067d8ee59a7f4ac65e627e2216d9be3 [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.")
dan0626dfc2010-06-15 06:56:37 +000028#
29proc test_suite {name args} {
dan430e74c2010-06-07 17:47:26 +000030
dan0626dfc2010-06-15 06:56:37 +000031 set default(-shutdown) ""
32 set default(-initialize) ""
33 set default(-presql) ""
dan430e74c2010-06-07 17:47:26 +000034 set default(-description) "no description supplied (fixme)"
dan2fce9ab2010-06-15 18:00:06 +000035 set default(-files) ""
36 set default(-prefix) "${name}."
dan430e74c2010-06-07 17:47:26 +000037
38 array set options [array get default]
dan0626dfc2010-06-15 06:56:37 +000039 if {[llength $args]%2} {
40 error "uneven number of options/switches passed to test_suite"
dan430e74c2010-06-07 17:47:26 +000041 }
dan0626dfc2010-06-15 06:56:37 +000042 foreach {k v} $args {
43 set o [array names options ${k}*]
44 if {[llength $o]>1} { error "ambiguous option: $k" }
45 if {[llength $o]==0} { error "unknown option: $k" }
46 set options([lindex $o 0]) $v
drh0a846f92008-08-25 17:23:29 +000047 }
danielk19771077e3f2008-06-21 18:07:37 +000048
dan0626dfc2010-06-15 06:56:37 +000049 set ::testspec($name) [array get options]
50 lappend ::testsuitelist $name
dane91a54e2010-06-15 17:44:47 +000051
dan0626dfc2010-06-15 06:56:37 +000052}
dan430e74c2010-06-07 17:47:26 +000053
dan0626dfc2010-06-15 06:56:37 +000054#-------------------------------------------------------------------------
55# test_set ARGS...
56#
57proc test_set {args} {
58 set isExclude 0
59 foreach a $args {
60 if {[string match -* $a]} {
61 switch -- $a {
62 -include { set isExclude 0 }
63 -exclude { set isExclude 1 }
64 default {
65 error "Unknown switch: $a"
66 }
danielk1977c1def3e2008-08-30 13:25:10 +000067 }
dan0626dfc2010-06-15 06:56:37 +000068 } elseif {$isExclude == 0} {
69 foreach f $a { set t($f) 1 }
drh0a846f92008-08-25 17:23:29 +000070 } else {
dan0626dfc2010-06-15 06:56:37 +000071 foreach f $a { array unset t $f }
danielk19771077e3f2008-06-21 18:07:37 +000072 }
73 }
74
dan0626dfc2010-06-15 06:56:37 +000075 return [array names t]
danielk19771077e3f2008-06-21 18:07:37 +000076}
77
dan0626dfc2010-06-15 06:56:37 +000078#-------------------------------------------------------------------------
79# Set up the following global list variables containing the names of
80# various test scripts:
81#
82# $alltests
dan2fce9ab2010-06-15 18:00:06 +000083# $allquicktests
dan0626dfc2010-06-15 06:56:37 +000084#
dan0626dfc2010-06-15 06:56:37 +000085set alltests [list]
86foreach f [glob $testdir/*.test] { lappend alltests [file tail $f] }
87if {$::tcl_platform(platform)!="unix"} {
88 set alltests [test_set $alltests -exclude crash.test crash2.test]
danielk1977c1def3e2008-08-30 13:25:10 +000089}
dan0626dfc2010-06-15 06:56:37 +000090set alltests [test_set $alltests -exclude {
91 all.test async.test quick.test veryquick.test
92 memleak.test permutations.test soak.test fts3.test
93 mallocAll.test
94}]
95
96set allquicktests [test_set $alltests -exclude {
97 async2.test async3.test backup_ioerr.test corrupt.test
98 corruptC.test crash.test crash2.test crash3.test crash4.test crash5.test
99 crash6.test crash7.test delete3.test e_fts3.test fts3rnd.test
100 fkey_malloc.test fuzz.test fuzz3.test fuzz_malloc.test in2.test loadext.test
101 misc7.test mutex2.test notify2.test onefile.test
102 savepoint4.test savepoint6.test select9.test
103 speed1.test speed1p.test speed2.test speed3.test speed4.test
104 speed4p.test sqllimits1.test tkt2686.test thread001.test thread002.test
105 thread003.test thread004.test thread005.test trans2.test vacuum3.test
106 incrvacuum_ioerr.test autovacuum_crash.test btree8.test shared_err.test
107 vtab_err.test walslow.test walcrash.test
108 walthread.test
109}]
danielk1977c1def3e2008-08-30 13:25:10 +0000110
danielk19771077e3f2008-06-21 18:07:37 +0000111#############################################################################
112# Start of tests
dan0626dfc2010-06-15 06:56:37 +0000113#
114
115#-------------------------------------------------------------------------
116# Define the generic test suites:
117#
118# veryquick
119# quick
120# full
121# veryquick_plus_notify2
122#
dane91a54e2010-06-15 17:44:47 +0000123lappend ::testsuitelist xxx
dan0626dfc2010-06-15 06:56:37 +0000124
dan2fce9ab2010-06-15 18:00:06 +0000125test_suite "veryquick" -prefix "" -description {
dan0626dfc2010-06-15 06:56:37 +0000126 "Very" quick test suite. Runs in less than 5 minutes on a workstation.
127 This test suite is the same as the "quick" tests, except that some files
128 that test malloc and IO errors are omitted.
129} -files [
130 test_set $allquicktests -exclude *malloc* *ioerr* *fault*
131]
132
dan2fce9ab2010-06-15 18:00:06 +0000133test_suite "quick" -prefix "" -description {
dan0626dfc2010-06-15 06:56:37 +0000134 Quick test suite. Runs in around 10 minutes on a workstation.
135} -files [
136 test_set $allquicktests
137]
138
dan2fce9ab2010-06-15 18:00:06 +0000139test_suite "veryquick_plus_notify2" -prefix "" -description {
dan0626dfc2010-06-15 06:56:37 +0000140 Very quick test suite + file notify2.test. This is used by one of the
141 sqlite.org release test configurations.
142} -files [
143 test_set $allquicktests notify2.test -exclude *malloc* *ioerr* *fault*
144]
145
dan2fce9ab2010-06-15 18:00:06 +0000146test_suite "full" -prefix "" -description {
dan0626dfc2010-06-15 06:56:37 +0000147 Full test suite. Takes a long time.
148} -files [
149 test_set $alltests
150] -initialize {
151 unset -nocomplain ::G(isquick)
152}
153
dane91a54e2010-06-15 17:44:47 +0000154lappend ::testsuitelist xxx
dan0626dfc2010-06-15 06:56:37 +0000155#-------------------------------------------------------------------------
156# Define the coverage related test suites:
157#
158# coverage-wal
dan0626dfc2010-06-15 06:56:37 +0000159#
160test_suite "coverage-wal" -description {
161 Coverage tests for file wal.c.
162} -files {
163 wal.test wal2.test wal3.test walmode.test
164 walbak.test walhook.test walcrash2.test walcksum.test
165 walfault.test
166}
167
dane91a54e2010-06-15 17:44:47 +0000168test_suite "coverage-pager" -description {
169 Coverage tests for file pager.c.
170} -files {
171 pager1.test
172}
dan0626dfc2010-06-15 06:56:37 +0000173
174
dane91a54e2010-06-15 17:44:47 +0000175lappend ::testsuitelist xxx
dan0626dfc2010-06-15 06:56:37 +0000176#-------------------------------------------------------------------------
177# Define the permutation test suites:
178#
danielk19771077e3f2008-06-21 18:07:37 +0000179
180# Run some tests using pre-allocated page and scratch blocks.
181#
dan0626dfc2010-06-15 06:56:37 +0000182test_suite "memsubsys1" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000183 Tests using pre-allocated page and scratch blocks
dan0626dfc2010-06-15 06:56:37 +0000184} -files [
185 test_set $::allquicktests -exclude ioerr5.test malloc5.test
186] -initialize {
drhd63bd752008-07-30 13:15:46 +0000187 catch {db close}
danielk19771077e3f2008-06-21 18:07:37 +0000188 sqlite3_shutdown
189 sqlite3_config_pagecache 4096 24
190 sqlite3_config_scratch 25000 1
191 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000192 autoinstall_test_functions
danielk19771077e3f2008-06-21 18:07:37 +0000193} -shutdown {
194 catch {db close}
195 sqlite3_shutdown
196 sqlite3_config_pagecache 0 0
197 sqlite3_config_scratch 0 0
198 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000199 autoinstall_test_functions
danielk19771077e3f2008-06-21 18:07:37 +0000200}
201
202# Run some tests using pre-allocated page and scratch blocks. This time
203# the allocations are too small to use in most cases.
204#
danielk197734c61e62008-08-29 12:00:20 +0000205# Both ioerr5.test and malloc5.test are excluded because they test the
206# sqlite3_soft_heap_limit() and sqlite3_release_memory() functionality.
207# This functionality is disabled if a pre-allocated page block is provided.
208#
dan0626dfc2010-06-15 06:56:37 +0000209test_suite "memsubsys2" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000210 Tests using small pre-allocated page and scratch blocks
dan0626dfc2010-06-15 06:56:37 +0000211} -files [
212 test_set $::allquicktests -exclude ioerr5.test malloc5.test
213] -initialize {
drhd63bd752008-07-30 13:15:46 +0000214 catch {db close}
danielk19771077e3f2008-06-21 18:07:37 +0000215 sqlite3_shutdown
216 sqlite3_config_pagecache 512 5
217 sqlite3_config_scratch 1000 1
218 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000219 autoinstall_test_functions
danielk19771077e3f2008-06-21 18:07:37 +0000220} -shutdown {
221 catch {db close}
222 sqlite3_shutdown
223 sqlite3_config_pagecache 0 0
224 sqlite3_config_scratch 0 0
225 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000226 autoinstall_test_functions
danielk19771077e3f2008-06-21 18:07:37 +0000227}
228
drhe2a7c6e2008-08-01 15:06:30 +0000229# Run all tests with the lookaside allocator disabled.
230#
dan0626dfc2010-06-15 06:56:37 +0000231test_suite "nolookaside" -description {
drhe2a7c6e2008-08-01 15:06:30 +0000232 OOM tests with lookaside disabled
drhe2a7c6e2008-08-01 15:06:30 +0000233} -initialize {
234 catch {db close}
235 sqlite3_shutdown
236 sqlite3_config_lookaside 0 0
237 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000238 autoinstall_test_functions
drhe2a7c6e2008-08-01 15:06:30 +0000239} -shutdown {
240 catch {db close}
241 sqlite3_shutdown
242 sqlite3_config_lookaside 100 500
243 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000244 autoinstall_test_functions
dan0626dfc2010-06-15 06:56:37 +0000245} -files $::allquicktests
drhe2a7c6e2008-08-01 15:06:30 +0000246
danielk19771077e3f2008-06-21 18:07:37 +0000247# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
248#
dan0626dfc2010-06-15 06:56:37 +0000249test_suite "singlethread" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000250 Tests run in SQLITE_CONFIG_SINGLETHREAD mode
251} -initialize {
drh04df18d2009-01-06 14:50:11 +0000252 catch {db close}
253 sqlite3_shutdown
254 catch {sqlite3_config singlethread}
drhbb77b752009-04-09 01:23:49 +0000255 sqlite3_initialize
256 autoinstall_test_functions
dan0626dfc2010-06-15 06:56:37 +0000257} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000258 delete.test delete2.test insert.test rollback.test select1.test
259 select2.test trans.test update.test vacuum.test types.test
260 types2.test types3.test
261} -shutdown {
drh04df18d2009-01-06 14:50:11 +0000262 catch {db close}
263 sqlite3_shutdown
264 catch {sqlite3_config serialized}
drhbb77b752009-04-09 01:23:49 +0000265 sqlite3_initialize
266 autoinstall_test_functions
danielk19771077e3f2008-06-21 18:07:37 +0000267}
268
dan0626dfc2010-06-15 06:56:37 +0000269test_suite "nomutex" -description {
drh039963a2008-09-03 00:43:15 +0000270 Tests run with the SQLITE_OPEN_MULTITHREADED flag passed to sqlite3_open().
danielk19779a6284c2008-07-10 17:52:49 +0000271} -initialize {
272 rename sqlite3 sqlite3_nomutex
273 proc sqlite3 {args} {
274 if {[string range [lindex $args 0] 0 0] ne "-"} {
drhcc91e7f2008-09-03 01:08:00 +0000275 lappend args -fullmutex 0 -nomutex 1
danielk19779a6284c2008-07-10 17:52:49 +0000276 }
277 uplevel [concat sqlite3_nomutex $args]
278 }
dan0626dfc2010-06-15 06:56:37 +0000279} -files {
danielk19779a6284c2008-07-10 17:52:49 +0000280 delete.test delete2.test insert.test rollback.test select1.test
281 select2.test trans.test update.test vacuum.test types.test
282 types2.test types3.test
283} -shutdown {
284 rename sqlite3 {}
285 rename sqlite3_nomutex sqlite3
286}
287
danielk19771077e3f2008-06-21 18:07:37 +0000288# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
289#
dan0626dfc2010-06-15 06:56:37 +0000290test_suite "multithread" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000291 Tests run in SQLITE_CONFIG_MULTITHREAD mode
292} -initialize {
drh04df18d2009-01-06 14:50:11 +0000293 catch {db close}
294 sqlite3_shutdown
295 catch {sqlite3_config multithread}
drhbb77b752009-04-09 01:23:49 +0000296 sqlite3_initialize
297 autoinstall_test_functions
dan0626dfc2010-06-15 06:56:37 +0000298} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000299 delete.test delete2.test insert.test rollback.test select1.test
300 select2.test trans.test update.test vacuum.test types.test
301 types2.test types3.test
302} -shutdown {
drh04df18d2009-01-06 14:50:11 +0000303 catch {db close}
304 sqlite3_shutdown
305 catch {sqlite3_config serialized}
drhbb77b752009-04-09 01:23:49 +0000306 sqlite3_initialize
307 autoinstall_test_functions
danielk19771077e3f2008-06-21 18:07:37 +0000308}
309
drh039963a2008-09-03 00:43:15 +0000310# Run some tests in SQLITE_OPEN_FULLMUTEX mode.
311#
dan0626dfc2010-06-15 06:56:37 +0000312test_suite "fullmutex" -description {
drh039963a2008-09-03 00:43:15 +0000313 Tests run in SQLITE_OPEN_FULLMUTEX mode
314} -initialize {
315 rename sqlite3 sqlite3_fullmutex
316 proc sqlite3 {args} {
317 if {[string range [lindex $args 0] 0 0] ne "-"} {
drhcc91e7f2008-09-03 01:08:00 +0000318 lappend args -nomutex 0 -fullmutex 1
drh039963a2008-09-03 00:43:15 +0000319 }
320 uplevel [concat sqlite3_fullmutex $args]
321 }
dan0626dfc2010-06-15 06:56:37 +0000322} -files {
drh039963a2008-09-03 00:43:15 +0000323 delete.test delete2.test insert.test rollback.test select1.test
324 select2.test trans.test update.test vacuum.test types.test
325 types2.test types3.test
326} -shutdown {
327 rename sqlite3 {}
328 rename sqlite3_fullmutex sqlite3
329}
330
danielk19771077e3f2008-06-21 18:07:37 +0000331# Run some tests using the "onefile" demo.
332#
dan0626dfc2010-06-15 06:56:37 +0000333test_suite "onefile" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000334 Run some tests using the "test_onefile.c" demo
335} -initialize {
336 rename sqlite3 sqlite3_onefile
337 proc sqlite3 {args} {
338 if {[string range [lindex $args 0] 0 0] ne "-"} {
339 lappend args -vfs fs
340 }
341 uplevel [concat sqlite3_onefile $args]
342 }
dan0626dfc2010-06-15 06:56:37 +0000343} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000344 conflict.test insert.test insert2.test insert3.test
345 rollback.test select1.test select2.test select3.test
danielk19771077e3f2008-06-21 18:07:37 +0000346} -shutdown {
347 rename sqlite3 {}
348 rename sqlite3_onefile sqlite3
349}
350
351# Run some tests using UTF-16 databases.
352#
dan0626dfc2010-06-15 06:56:37 +0000353test_suite "utf16" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000354 Run tests using UTF-16 databases
danielk19772dd6d802008-06-21 19:10:27 +0000355} -presql {
danielk19771077e3f2008-06-21 18:07:37 +0000356 pragma encoding = 'UTF-16'
dan0626dfc2010-06-15 06:56:37 +0000357} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000358 alter.test alter3.test
359 auth.test bind.test blob.test capi2.test capi3.test collate1.test
360 collate2.test collate3.test collate4.test collate5.test collate6.test
361 conflict.test date.test delete.test expr.test fkey1.test func.test
362 hook.test index.test insert2.test insert.test interrupt.test in.test
363 intpkey.test ioerr.test join2.test join.test lastinsert.test
364 laststmtchanges.test limit.test lock2.test lock.test main.test
365 memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
366 null.test progress.test quote.test rowid.test select1.test select2.test
367 select3.test select4.test select5.test select6.test sort.test
368 subselect.test tableapi.test table.test temptable.test
369 trace.test trigger1.test trigger2.test trigger3.test
370 trigger4.test types2.test types.test unique.test update.test
371 vacuum.test view.test where.test
372}
373
374# Run some tests in exclusive locking mode.
375#
dan0626dfc2010-06-15 06:56:37 +0000376test_suite "exclusive" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000377 Run tests in exclusive locking mode.
378} -presql {
379 pragma locking_mode = 'exclusive'
dan0626dfc2010-06-15 06:56:37 +0000380} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000381 rollback.test select1.test select2.test
382 malloc.test ioerr.test
383}
384
drh04335882008-09-26 21:08:08 +0000385# Run some tests in exclusive locking mode with truncated journals.
386#
dan0626dfc2010-06-15 06:56:37 +0000387test_suite "exclusive-truncate" -description {
drh04335882008-09-26 21:08:08 +0000388 Run tests in exclusive locking mode and truncate journal mode.
389} -presql {
390 pragma locking_mode = 'exclusive';
391 pragma journal_mode = TRUNCATE;
dan0626dfc2010-06-15 06:56:37 +0000392} -files {
drh04335882008-09-26 21:08:08 +0000393 delete.test delete2.test insert.test rollback.test select1.test
394 select2.test update.test malloc.test ioerr.test
395}
396
danielk19771077e3f2008-06-21 18:07:37 +0000397# Run some tests in persistent journal mode.
398#
dan0626dfc2010-06-15 06:56:37 +0000399test_suite "persistent_journal" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000400 Run tests in persistent-journal mode.
401} -presql {
402 pragma journal_mode = persist
dan0626dfc2010-06-15 06:56:37 +0000403} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000404 delete.test delete2.test insert.test rollback.test select1.test
405 select2.test trans.test update.test vacuum.test
406}
407
drh04335882008-09-26 21:08:08 +0000408# Run some tests in truncating journal mode.
409#
dan0626dfc2010-06-15 06:56:37 +0000410test_suite "truncate_journal" -description {
drh04335882008-09-26 21:08:08 +0000411 Run tests in persistent-journal mode.
412} -presql {
413 pragma journal_mode = truncate
dan0626dfc2010-06-15 06:56:37 +0000414} -files {
drh04335882008-09-26 21:08:08 +0000415 delete.test delete2.test insert.test rollback.test select1.test
416 select2.test trans.test update.test vacuum.test
417 malloc.test ioerr.test
418}
419
danielk19771077e3f2008-06-21 18:07:37 +0000420# Run some error tests in persistent journal mode.
421#
dan0626dfc2010-06-15 06:56:37 +0000422test_suite "persistent_journal_error" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000423 Run malloc.test and ioerr.test in persistent-journal mode.
424} -presql {
425 pragma journal_mode = persist
dan0626dfc2010-06-15 06:56:37 +0000426} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000427 malloc.test ioerr.test
428}
429
430# Run some tests in no journal mode.
431#
dan0626dfc2010-06-15 06:56:37 +0000432test_suite "no_journal" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000433 Run tests in no-journal mode.
434} -presql {
435 pragma journal_mode = persist
dan0626dfc2010-06-15 06:56:37 +0000436} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000437 delete.test delete2.test insert.test rollback.test select1.test
438 select2.test trans.test update.test vacuum.test
439}
440
441# Run some error tests in no journal mode.
442#
dan0626dfc2010-06-15 06:56:37 +0000443test_suite "no_journal_error" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000444 Run malloc.test and ioerr.test in no-journal mode.
445} -presql {
446 pragma journal_mode = persist
dan0626dfc2010-06-15 06:56:37 +0000447} -files {
danielk19771077e3f2008-06-21 18:07:37 +0000448 malloc.test ioerr.test
449}
450
451# Run some crash-tests in autovacuum mode.
452#
dan0626dfc2010-06-15 06:56:37 +0000453test_suite "autovacuum_crash" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000454 Run crash.test in autovacuum mode.
455} -presql {
456 pragma auto_vacuum = 1
dan0626dfc2010-06-15 06:56:37 +0000457} -files crash.test
danielk19771077e3f2008-06-21 18:07:37 +0000458
459# Run some ioerr-tests in autovacuum mode.
460#
dan0626dfc2010-06-15 06:56:37 +0000461test_suite "autovacuum_ioerr" -description {
danielk19771077e3f2008-06-21 18:07:37 +0000462 Run ioerr.test in autovacuum mode.
463} -presql {
464 pragma auto_vacuum = 1
dan0626dfc2010-06-15 06:56:37 +0000465} -files ioerr.test
danielk19771077e3f2008-06-21 18:07:37 +0000466
danielk1977b3175382008-10-17 18:51:52 +0000467# Run tests with an in-memory journal.
468#
dan0626dfc2010-06-15 06:56:37 +0000469test_suite "inmemory_journal" -description {
danielk1977b3175382008-10-17 18:51:52 +0000470 Run tests with an in-memory journal file.
471} -presql {
472 pragma journal_mode = 'memory'
dan0626dfc2010-06-15 06:56:37 +0000473} -files [test_set $::allquicktests -exclude {
danielk1977b3175382008-10-17 18:51:52 +0000474 # Exclude all tests that simulate IO errors.
475 autovacuum_ioerr2.test incrvacuum_ioerr.test ioerr.test
476 ioerr.test ioerr2.test ioerr3.test ioerr4.test ioerr5.test
drh2206a2b2009-04-01 23:09:43 +0000477 vacuum3.test incrblob_err.test diskfull.test backup_ioerr.test
drh08ede1d2010-04-12 20:54:13 +0000478 e_fts3.test
danielk1977b3175382008-10-17 18:51:52 +0000479
480 # Exclude test scripts that use tcl IO to access journal files or count
481 # the number of fsync() calls.
482 pager.test exclusive.test jrnlmode.test sync.test misc1.test
danielk1977cb257902009-04-10 18:32:29 +0000483 journal1.test conflict.test crash8.test tkt3457.test io.test
dan01d38562010-03-08 10:32:38 +0000484
485 # Exclude stmt.test, which expects sub-journals to use temporary files.
486 stmt.test
drh0b944132010-05-24 20:24:38 +0000487
488 # WAL mode is different.
dan0626dfc2010-06-15 06:56:37 +0000489 wal*
490}]
danielk1977b3175382008-10-17 18:51:52 +0000491
danielk19776b39c2e2008-06-25 14:57:53 +0000492ifcapable mem3 {
dan0626dfc2010-06-15 06:56:37 +0000493 test_suite "memsys3" -description {
danielk19776b39c2e2008-06-25 14:57:53 +0000494 Run tests using the allocator in mem3.c.
dan0626dfc2010-06-15 06:56:37 +0000495 } [test_set $::allquicktests -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000496 autovacuum.test delete3.test manydb.test
497 bigrow.test incrblob2.test memdb.test
498 bitvec.test index2.test memsubsys1.test
499 capi3c.test ioerr.test memsubsys2.test
500 capi3.test join3.test pagesize.test
danielk19778b322822009-07-01 18:09:01 +0000501 collate5.test limit.test backup_ioerr.test
502 backup_malloc.test
dan0626dfc2010-06-15 06:56:37 +0000503 }] -initialize {
danielk19776b39c2e2008-06-25 14:57:53 +0000504 catch {db close}
505 sqlite3_reset_auto_extension
506 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000507 sqlite3_config_heap 25000000 0
drhe2a7c6e2008-08-01 15:06:30 +0000508 sqlite3_config_lookaside 0 0
danielk19778b322822009-07-01 18:09:01 +0000509 ifcapable mem5 {
510 # If both memsys3 and memsys5 are enabled in the build, the call to
511 # [sqlite3_config_heap] will initialize the system to use memsys5.
512 # The following overrides this preference and installs the memsys3
513 # allocator.
514 sqlite3_install_memsys3
515 }
danielk19776b39c2e2008-06-25 14:57:53 +0000516 install_malloc_faultsim 1
517 sqlite3_initialize
518 autoinstall_test_functions
519 } -shutdown {
520 catch {db close}
danielk19776b39c2e2008-06-25 14:57:53 +0000521 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000522 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000523 sqlite3_config_lookaside 100 500
danielk19776b39c2e2008-06-25 14:57:53 +0000524 install_malloc_faultsim 1
525 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000526 autoinstall_test_functions
danielk19776b39c2e2008-06-25 14:57:53 +0000527 }
danielk197757e5ea92008-06-24 19:02:55 +0000528}
529
danielk19776b39c2e2008-06-25 14:57:53 +0000530ifcapable mem5 {
dan0626dfc2010-06-15 06:56:37 +0000531 test_suite "memsys5" -description {
danielk19776b39c2e2008-06-25 14:57:53 +0000532 Run tests using the allocator in mem5.c.
dan0626dfc2010-06-15 06:56:37 +0000533 } [test_set $::allquicktests -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000534 autovacuum.test delete3.test manydb.test
535 bigrow.test incrblob2.test memdb.test
536 bitvec.test index2.test memsubsys1.test
537 capi3c.test ioerr.test memsubsys2.test
538 capi3.test join3.test pagesize.test
danielk1977ac8d7b32008-11-13 16:21:50 +0000539 collate5.test limit.test zeroblob.test
dan0626dfc2010-06-15 06:56:37 +0000540 }] -initialize {
danielk19776b39c2e2008-06-25 14:57:53 +0000541 catch {db close}
danielk19776b39c2e2008-06-25 14:57:53 +0000542 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000543 sqlite3_config_heap 25000000 64
drhe2a7c6e2008-08-01 15:06:30 +0000544 sqlite3_config_lookaside 0 0
danielk19775099be52008-06-27 13:27:03 +0000545 install_malloc_faultsim 1
546 sqlite3_initialize
547 autoinstall_test_functions
548 } -shutdown {
549 catch {db close}
danielk19775099be52008-06-27 13:27:03 +0000550 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000551 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000552 sqlite3_config_lookaside 100 500
danielk19775099be52008-06-27 13:27:03 +0000553 install_malloc_faultsim 1
554 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000555 autoinstall_test_functions
danielk19775099be52008-06-27 13:27:03 +0000556 }
557
dan0626dfc2010-06-15 06:56:37 +0000558 test_suite "memsys5-2" -description {
danielk19775099be52008-06-27 13:27:03 +0000559 Run tests using the allocator in mem5.c in a different configuration.
dan0626dfc2010-06-15 06:56:37 +0000560 } -files {
drh8a42cbd2008-07-10 18:13:42 +0000561 select1.test
danielk19775099be52008-06-27 13:27:03 +0000562 } -initialize {
563 catch {db close}
danielk19775099be52008-06-27 13:27:03 +0000564 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000565 sqlite3_config_heap 40000000 16
drhe2a7c6e2008-08-01 15:06:30 +0000566 sqlite3_config_lookaside 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000567 install_malloc_faultsim 1
568 sqlite3_initialize
569 autoinstall_test_functions
570 } -shutdown {
571 catch {db close}
danielk19776b39c2e2008-06-25 14:57:53 +0000572 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000573 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000574 sqlite3_config_lookaside 100 500
danielk19776b39c2e2008-06-25 14:57:53 +0000575 install_malloc_faultsim 1
576 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000577 autoinstall_test_functions
danielk19776b39c2e2008-06-25 14:57:53 +0000578 }
danielk1977c66c0e12008-06-25 14:26:07 +0000579}
580
drh8a42cbd2008-07-10 18:13:42 +0000581ifcapable threadsafe {
dan0626dfc2010-06-15 06:56:37 +0000582 test_suite "no_mutex_try" -description {
drh8a42cbd2008-07-10 18:13:42 +0000583 The sqlite3_mutex_try() interface always fails
dan0626dfc2010-06-15 06:56:37 +0000584 } -files [
585 test_set $::allquicktests -exclude mutex1.test mutex2.test
586 ] -initialize {
drh8a42cbd2008-07-10 18:13:42 +0000587 catch {db close}
588 sqlite3_shutdown
589 install_mutex_counters 1
590 set ::disable_mutex_try 1
drhbb77b752009-04-09 01:23:49 +0000591 sqlite3_initialize
592 autoinstall_test_functions
drh8a42cbd2008-07-10 18:13:42 +0000593 } -shutdown {
594 catch {db close}
595 sqlite3_shutdown
596 install_mutex_counters 0
drhbb77b752009-04-09 01:23:49 +0000597 sqlite3_initialize
598 autoinstall_test_functions
drh8a42cbd2008-07-10 18:13:42 +0000599 }
600}
601
danielk1977b13dee92008-06-23 15:55:52 +0000602# run_tests "crash_safe_append" -description {
603# Run crash.test with persistent journals on a SAFE_APPEND file-system.
604# } -initialize {
605# rename crashsql sa_crashsql
606# proc crashsql {args} {
607# set options [lrange $args 0 [expr {[llength $args]-2}]]
608# lappend options -char safe_append
609# set sql [lindex $args end]
610# lappend options "
611# PRAGMA journal_mode=persistent;
612# $sql
613# "
614# set fd [open test.db-journal w]
615# puts $fd [string repeat 1234567890 100000]
616# close $fd
617# eval sa_crashsql $options
618# }
619# } -shutdown {
620# rename crashsql {}
621# rename sa_crashsql crashsql
dan0626dfc2010-06-15 06:56:37 +0000622# } -files crash.test
danielk1977b13dee92008-06-23 15:55:52 +0000623
dan0626dfc2010-06-15 06:56:37 +0000624test_suite "safe_append" -description {
danielk1977755339e2008-09-12 10:22:40 +0000625 Run some tests on a SAFE_APPEND file-system.
626} -initialize {
627 rename sqlite3 sqlite3_safeappend
628 proc sqlite3 {args} {
629 if {[string range [lindex $args 0] 0 0] ne "-"} {
630 lappend args -vfs devsym
631 }
632 uplevel [concat sqlite3_safeappend $args]
633 }
634 sqlite3_simulate_device -char safe_append
635} -shutdown {
636 rename sqlite3 {}
637 rename sqlite3_shutdown sqlite3
dan0626dfc2010-06-15 06:56:37 +0000638} -files [
639 test_set $::allquicktests shared_err.test -exclude async3.test
640]
danielk1977755339e2008-09-12 10:22:40 +0000641
drhb232c232008-11-19 01:20:26 +0000642# The set of tests to run on the alternative-pcache
643set perm-alt-pcache-testset {
644 async.test
645 attach.test
646 delete.test delete2.test
647 index.test
648 insert.test insert2.test
649 join.test join2.test
650 rollback.test
651 select1.test select2.test
652 trans.test
653 update.test
654}
655
dan0626dfc2010-06-15 06:56:37 +0000656test_suite "pcache0" -description {
drhb232c232008-11-19 01:20:26 +0000657 Alternative pcache implementation without random discard
658} -initialize {
659 catch {db close}
drhb232c232008-11-19 01:20:26 +0000660 sqlite3_shutdown
661 sqlite3_config_alt_pcache 1 0 1
662 sqlite3_initialize
663 autoinstall_test_functions
664} -shutdown {
665 catch {db close}
drhb232c232008-11-19 01:20:26 +0000666 sqlite3_shutdown
667 sqlite3_config_alt_pcache 0 0 0
668 sqlite3_config_lookaside 100 500
669 install_malloc_faultsim 1
670 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000671 autoinstall_test_functions
dan0626dfc2010-06-15 06:56:37 +0000672} -files ${perm-alt-pcache-testset}
drhb232c232008-11-19 01:20:26 +0000673
dan0626dfc2010-06-15 06:56:37 +0000674test_suite "pcache10" -description {
drhb232c232008-11-19 01:20:26 +0000675 Alternative pcache implementation without 10% random discard
676} -initialize {
677 catch {db close}
drhb232c232008-11-19 01:20:26 +0000678 sqlite3_shutdown
679 sqlite3_config_alt_pcache 1 50 1
680 sqlite3_initialize
681 autoinstall_test_functions
682} -shutdown {
683 catch {db close}
drhb232c232008-11-19 01:20:26 +0000684 sqlite3_shutdown
685 sqlite3_config_alt_pcache 0 0 0
686 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000687 autoinstall_test_functions
dan0626dfc2010-06-15 06:56:37 +0000688} -files ${perm-alt-pcache-testset}
drhb232c232008-11-19 01:20:26 +0000689
dan0626dfc2010-06-15 06:56:37 +0000690test_suite "pcache50" -description {
drhb232c232008-11-19 01:20:26 +0000691 Alternative pcache implementation without 50% random discard
692} -initialize {
693 catch {db close}
drhb232c232008-11-19 01:20:26 +0000694 sqlite3_shutdown
695 sqlite3_config_alt_pcache 1 50 1
696 sqlite3_initialize
697 autoinstall_test_functions
698} -shutdown {
699 catch {db close}
drhb232c232008-11-19 01:20:26 +0000700 sqlite3_shutdown
701 sqlite3_config_alt_pcache 0 0 0
702 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000703 autoinstall_test_functions
dan0626dfc2010-06-15 06:56:37 +0000704} -files ${perm-alt-pcache-testset}
drhb232c232008-11-19 01:20:26 +0000705
dan0626dfc2010-06-15 06:56:37 +0000706test_suite "pcache90" -description {
drhb232c232008-11-19 01:20:26 +0000707 Alternative pcache implementation without 90% random discard
708} -initialize {
709 catch {db close}
drhb232c232008-11-19 01:20:26 +0000710 sqlite3_shutdown
711 sqlite3_config_alt_pcache 1 50 1
712 sqlite3_initialize
713 autoinstall_test_functions
714} -shutdown {
715 catch {db close}
drhb232c232008-11-19 01:20:26 +0000716 sqlite3_shutdown
717 sqlite3_config_alt_pcache 0 0 0
718 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000719 autoinstall_test_functions
dan0626dfc2010-06-15 06:56:37 +0000720} -files ${perm-alt-pcache-testset}
drhb232c232008-11-19 01:20:26 +0000721
dan0626dfc2010-06-15 06:56:37 +0000722test_suite "pcache100" -description {
drhb232c232008-11-19 01:20:26 +0000723 Alternative pcache implementation that always discards when unpinning
724} -initialize {
725 catch {db close}
drhb232c232008-11-19 01:20:26 +0000726 sqlite3_shutdown
727 sqlite3_config_alt_pcache 1 100 1
728 sqlite3_initialize
729 autoinstall_test_functions
730} -shutdown {
731 catch {db close}
drhb232c232008-11-19 01:20:26 +0000732 sqlite3_shutdown
733 sqlite3_config_alt_pcache 0 0 0
734 sqlite3_initialize
drhbb77b752009-04-09 01:23:49 +0000735 autoinstall_test_functions
dan0626dfc2010-06-15 06:56:37 +0000736} -files ${perm-alt-pcache-testset}
danielk1977b13dee92008-06-23 15:55:52 +0000737
dan0626dfc2010-06-15 06:56:37 +0000738test_suite "journaltest" -description {
danielk1977f3107512008-12-22 10:58:46 +0000739 Check that pages are synced before being written (test_journal.c).
740} -initialize {
danielk1977f3107512008-12-22 10:58:46 +0000741 catch {db close}
742 register_jt_vfs -default ""
743} -shutdown {
744 unregister_jt_vfs
dan0626dfc2010-06-15 06:56:37 +0000745} -files [test_set $::allquicktests -exclude {
746 wal* incrvacuum.test ioerr.test corrupt4.test io.test crash8.test
747 async4.test bigfile.test
drhfb4a6262010-05-06 19:55:57 +0000748}]
danielk1977f3107512008-12-22 10:58:46 +0000749
dan0a7a9152010-04-07 07:57:38 +0000750if {[info commands register_demovfs] != ""} {
dan0626dfc2010-06-15 06:56:37 +0000751 test_suite "demovfs" -description {
dan430e74c2010-06-07 17:47:26 +0000752 Check that the demovfs (code in test_demovfs.c) more or less works.
dan0a7a9152010-04-07 07:57:38 +0000753 } -initialize {
754 register_demovfs
755 } -shutdown {
756 unregister_demovfs
dan0626dfc2010-06-15 06:56:37 +0000757 } -files {
dan0a7a9152010-04-07 07:57:38 +0000758 insert.test insert2.test insert3.test rollback.test
759 select1.test select2.test select3.test
760 }
761}
762
dan0626dfc2010-06-15 06:56:37 +0000763test_suite "wal" -description {
dan71cb5182010-04-26 12:39:03 +0000764 Run tests with journal_mode=WAL
dan31f98fc2010-04-27 05:42:32 +0000765} -initialize {
dan430e74c2010-06-07 17:47:26 +0000766 set ::G(savepoint6_iterations) 100
dan31f98fc2010-04-27 05:42:32 +0000767} -shutdown {
dan430e74c2010-06-07 17:47:26 +0000768 unset -nocomplain ::G(savepoint6_iterations)
dan0626dfc2010-06-15 06:56:37 +0000769} -files {
dane106de62010-04-27 06:49:34 +0000770 savepoint.test savepoint2.test savepoint6.test
771 trans.test avtrans.test
dan71cb5182010-04-26 12:39:03 +0000772}
danielk19771077e3f2008-06-21 18:07:37 +0000773# End of tests
774#############################################################################
775
dan0626dfc2010-06-15 06:56:37 +0000776# run_tests NAME OPTIONS
777#
778# where available options are:
779#
dan2fce9ab2010-06-15 18:00:06 +0000780# -description TITLE
781# -initialize SCRIPT
782# -shutdown SCRIPT
783# -presql SQL
784# -files LIST-OF-FILES
785# -prefix NAME
dan0626dfc2010-06-15 06:56:37 +0000786#
787proc run_tests {name args} {
788 array set options $args
danielk19771077e3f2008-06-21 18:07:37 +0000789
dan2fce9ab2010-06-15 18:00:06 +0000790 set ::G(perm:name) $options(-prefix)
dan0626dfc2010-06-15 06:56:37 +0000791 set ::G(perm:presql) $options(-presql)
792 set ::G(isquick) 1
793
794 uplevel $options(-initialize)
795
796 foreach file [lsort $options(-files)] {
797 slave_test_file $::testdir/$file
798 }
799
800 uplevel $options(-shutdown)
801
802 unset ::G(perm:name)
803 unset ::G(perm:presql)
804}
805
806proc run_test_suite {name} {
807 if {[info exists ::testspec($name)]==0} {
808 error "No such test suite: $name"
809 }
810 uplevel run_tests $name $::testspec($name)
811}
812
813proc help {} {
dane91a54e2010-06-15 17:44:47 +0000814 puts "Usage: $::argv0 TESTSUITE ?TESTFILE?"
815 puts ""
816 puts "Available test-suites are:"
dan0626dfc2010-06-15 06:56:37 +0000817 foreach k $::testsuitelist {
dane91a54e2010-06-15 17:44:47 +0000818 if {[info exists ::testspec($k)]==0} {
819 puts " ----------------------------------------"
820 puts ""
821 } else {
822 array set o $::testspec($k)
823 puts "Test suite: \"$k\""
824 set d [string trim $o(-description)]
825 set d [regsub {\n *} $d "\n "]
826 puts " $d"
827 puts ""
828 }
dan0626dfc2010-06-15 06:56:37 +0000829 }
830 exit -1
831}
832
833if {[info script] == $argv0} {
834 proc main {argv} {
835 if {[llength $argv]==0} {
836 help
837 } else {
838 set suite [lindex $argv 0]
839 if {[info exists ::testspec($suite)]==0} help
840 set extra ""
841 if {[llength $argv]>1} { set extra [list -files [lrange $argv 1 end]] }
842 eval run_tests $suite $::testspec($suite) $extra
843 }
844 }
845 main $argv
846 finish_test
847}
848