blob: 9254bd5978010a20ee1a1faaf9f0fd05b0f011e8 [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#
danielk19770d84e5b2008-06-27 14:05:24 +000012# $Id: permutations.test,v 1.9 2008/06/27 14:05:25 danielk1977 Exp $
danielk19771077e3f2008-06-21 18:07:37 +000013
14set testdir [file dirname $argv0]
15source $testdir/tester.tcl
16
17# Argument processing.
18#
19set ::testmode [lindex $argv 0]
20set ::testfile [lindex $argv 1]
21set argv [lrange $argv 2 end]
22
23set ::permutations_presql ""
24set ::permutations_test_prefix ""
25
26if {$::testmode eq "veryquick"} {
27 set ::testmode [list persistent_journal no_journal]
28 set ISQUICK 1
29}
30if {$::testmode eq "quick"} {
31 set ::testmode [list persistent_journal no_journal autovacuum_ioerr]
32 set ISQUICK 1
33}
34if {$::testmode eq "all"} {
35 set ::testmode {
36 memsubsys1 memsubsys2 singlethread multithread onefile utf16 exclusive
37 persistent_journal persistent_journal_error no_journal no_journal_error
38 autovacuum_ioerr
39 }
40}
41if {$::testmode eq "targets"} {
42 puts ""
43 puts -nonewline "veryquick "
44 puts "Same as persistent_journal and no_journal"
45 puts -nonewline "quick "
46 puts "Same as persistent_journal, no_journal and autovacuum_ioerr"
47 puts -nonewline "all "
48 puts "Everything except autovacuum_crash"
49}
50
51set EXCLUDE {
52 all.test async.test async2.test corrupt.test
53 crash.test crash2.test crash3.test crash4.test
54 crash6.test crash7.test exclusive3.test fts3.test
55 fuzz.test fuzz_malloc.test in2.test jrnlmode3.test
56 loadext.test mallocAll.test malloc.test malloc2.test
57 malloc3.test malloc4.test memleak.test misc7.test
58 misuse.test mutex2.test onefile.test quick.test
59 soak.test speed1.test speed1p.test speed2.test
60 speed3.test speed4.test speed4p.test sqllimits1.test
61 thread001.test thread002.test btree8.test utf16.test
62 shared_err.test vtab_err.test veryquick.test incrvacuum_ioerr.test
63 autovacuum_crash.test permutations.test
64 autovacuum_ioerr.test jrnlmode2.test jrnlmode4.test
65}
66set ALLTESTS [list]
67foreach filename [glob $testdir/*.test] {
68 set filename [file tail $filename]
69 if {[lsearch $EXCLUDE $filename] < 0} { lappend ALLTESTS $filename }
70}
71
72rename finish_test really_finish_test2
73proc finish_test {} {}
74
75rename do_test really_do_test
76
77proc do_test {name args} {
78 eval really_do_test [list "perm-$::permutations_test_prefix.$name"] $args
79}
80
81# Overload the [sqlite3] command
82rename sqlite3 really_sqlite3
83proc sqlite3 {args} {
84 set r [eval really_sqlite3 $args]
85 if { [llength $args] == 2 && $::permutations_presql ne "" } {
86 [lindex $args 0] eval $::permutations_presql
87 }
88 set r
89}
90
91# run_tests OPTIONS
92#
93# where available options are:
94#
95# -initialize SCRIPT (default "")
96# -shutdown SCRIPT (default "")
97# -include LIST-OF-FILES (default $::ALLTESTS)
98# -exclude LIST-OF-FILES (default "")
99# -presql SQL (default "")
100# -description TITLE (default "")
101#
102proc run_tests {name args} {
103 set ::permutations_test_prefix $name
104 set options(-shutdown) ""
105 set options(-initialize) ""
106 set options(-exclude) ""
107 set options(-include) $::ALLTESTS
108 set options(-presql) ""
109 set options(-description) "no description supplied (fixme)"
110 array set options $args
111
112 if {$::testmode eq "targets"} {
113 puts [format "% -20s %s" $name [string trim $options(-description)]]
114 return
115 }
116 if {$::testmode ne "" && [lsearch $::testmode $name]<0} return
117
118
119 uplevel $options(-initialize)
120 set ::permutations_presql $options(-presql)
121
122 foreach file $options(-include) {
123 if {[lsearch $options(-exclude) $file] < 0 && (
124 $::testfile eq "" || $::testfile eq $file || "$::testfile.test" eq $file
125 ) } {
126 uplevel source $::testdir/$file
127 }
128 }
129
130 uplevel $options(-shutdown)
131}
132
133#############################################################################
134# Start of tests
135
136# Run some tests using pre-allocated page and scratch blocks.
137#
138run_tests "memsubsys1" -description {
139 Tests using pre-allocated page and scratch blocks
140} -initialize {
141 sqlite3_shutdown
142 sqlite3_config_pagecache 4096 24
143 sqlite3_config_scratch 25000 1
144 sqlite3_initialize
145} -exclude {
146 memsubsys1.test
147} -shutdown {
148 catch {db close}
149 sqlite3_shutdown
150 sqlite3_config_pagecache 0 0
151 sqlite3_config_scratch 0 0
152 sqlite3_initialize
153}
154
155# Run some tests using pre-allocated page and scratch blocks. This time
156# the allocations are too small to use in most cases.
157#
158run_tests "memsubsys2" -description {
159 Tests using small pre-allocated page and scratch blocks
160} -initialize {
161 sqlite3_shutdown
162 sqlite3_config_pagecache 512 5
163 sqlite3_config_scratch 1000 1
164 sqlite3_initialize
165} -exclude {
166 memsubsys1.test
167} -shutdown {
168 catch {db close}
169 sqlite3_shutdown
170 sqlite3_config_pagecache 0 0
171 sqlite3_config_scratch 0 0
172 sqlite3_initialize
173}
174
175# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
176#
177run_tests "singlethread" -description {
178 Tests run in SQLITE_CONFIG_SINGLETHREAD mode
179} -initialize {
180 do_test mutex2-singlethread.0 {
181 catch {db close}
182 sqlite3_shutdown
183 sqlite3_config singlethread
184 } SQLITE_OK
185} -include {
186 delete.test delete2.test insert.test rollback.test select1.test
187 select2.test trans.test update.test vacuum.test types.test
188 types2.test types3.test
189} -shutdown {
190 do_test mutex2-X {
191 catch {db close}
192 sqlite3_shutdown
193 sqlite3_config serialized
194 } SQLITE_OK
195}
196
197# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
198#
199run_tests "multithread" -description {
200 Tests run in SQLITE_CONFIG_MULTITHREAD mode
201} -initialize {
202 do_test mutex2-multithread.0 {
203 catch {db close}
204 sqlite3_shutdown
205 sqlite3_config multithread
206 } SQLITE_OK
207} -include {
208 delete.test delete2.test insert.test rollback.test select1.test
209 select2.test trans.test update.test vacuum.test types.test
210 types2.test types3.test
211} -shutdown {
212 do_test mutex2-X {
213 catch {db close}
214 sqlite3_shutdown
215 sqlite3_config serialized
216 } SQLITE_OK
217}
218
219# Run some tests using the "onefile" demo.
220#
221run_tests "onefile" -description {
222 Run some tests using the "test_onefile.c" demo
223} -initialize {
224 rename sqlite3 sqlite3_onefile
225 proc sqlite3 {args} {
226 if {[string range [lindex $args 0] 0 0] ne "-"} {
227 lappend args -vfs fs
228 }
229 uplevel [concat sqlite3_onefile $args]
230 }
231} -include {
232 conflict.test insert.test insert2.test insert3.test
233 rollback.test select1.test select2.test select3.test
234 temptable.test
235} -shutdown {
236 rename sqlite3 {}
237 rename sqlite3_onefile sqlite3
238}
239
240# Run some tests using UTF-16 databases.
241#
242run_tests "utf16" -description {
243 Run tests using UTF-16 databases
danielk19772dd6d802008-06-21 19:10:27 +0000244} -presql {
danielk19771077e3f2008-06-21 18:07:37 +0000245 pragma encoding = 'UTF-16'
246} -include {
247 alter.test alter3.test
248 auth.test bind.test blob.test capi2.test capi3.test collate1.test
249 collate2.test collate3.test collate4.test collate5.test collate6.test
250 conflict.test date.test delete.test expr.test fkey1.test func.test
251 hook.test index.test insert2.test insert.test interrupt.test in.test
252 intpkey.test ioerr.test join2.test join.test lastinsert.test
253 laststmtchanges.test limit.test lock2.test lock.test main.test
254 memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
255 null.test progress.test quote.test rowid.test select1.test select2.test
256 select3.test select4.test select5.test select6.test sort.test
257 subselect.test tableapi.test table.test temptable.test
258 trace.test trigger1.test trigger2.test trigger3.test
259 trigger4.test types2.test types.test unique.test update.test
260 vacuum.test view.test where.test
261}
262
263# Run some tests in exclusive locking mode.
264#
265run_tests "exclusive" -description {
266 Run tests in exclusive locking mode.
267} -presql {
268 pragma locking_mode = 'exclusive'
269} -include {
270 rollback.test select1.test select2.test
271 malloc.test ioerr.test
272}
273
274# Run some tests in persistent journal mode.
275#
276run_tests "persistent_journal" -description {
277 Run tests in persistent-journal mode.
278} -presql {
279 pragma journal_mode = persist
280} -include {
281 delete.test delete2.test insert.test rollback.test select1.test
282 select2.test trans.test update.test vacuum.test
283}
284
285# Run some error tests in persistent journal mode.
286#
287run_tests "persistent_journal_error" -description {
288 Run malloc.test and ioerr.test in persistent-journal mode.
289} -presql {
290 pragma journal_mode = persist
291} -include {
292 malloc.test ioerr.test
293}
294
295# Run some tests in no journal mode.
296#
297run_tests "no_journal" -description {
298 Run tests in no-journal mode.
299} -presql {
300 pragma journal_mode = persist
301} -include {
302 delete.test delete2.test insert.test rollback.test select1.test
303 select2.test trans.test update.test vacuum.test
304}
305
306# Run some error tests in no journal mode.
307#
308run_tests "no_journal_error" -description {
309 Run malloc.test and ioerr.test in no-journal mode.
310} -presql {
311 pragma journal_mode = persist
312} -include {
313 malloc.test ioerr.test
314}
315
316# Run some crash-tests in autovacuum mode.
317#
318run_tests "autovacuum_crash" -description {
319 Run crash.test in autovacuum mode.
320} -presql {
321 pragma auto_vacuum = 1
322} -include crash.test
323
324# Run some ioerr-tests in autovacuum mode.
325#
326run_tests "autovacuum_ioerr" -description {
327 Run ioerr.test in autovacuum mode.
328} -presql {
329 pragma auto_vacuum = 1
330} -include ioerr.test
331
danielk19776b39c2e2008-06-25 14:57:53 +0000332ifcapable mem3 {
333 run_tests "memsys3" -description {
334 Run tests using the allocator in mem3.c.
335 } -exclude {
336 incrblob2.test manydb.test autovacuum.test bigrow.test
337 collate5.test delete3.test index2.test ioerr.test join3.test
338 pagesize.test bitvec.test capi3.test memsubsys1.test limit.test
339 memdb.test capi3c.test
340 } -initialize {
341 catch {db close}
342 sqlite3_reset_auto_extension
343 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000344 sqlite3_config_heap -memsys3 1000000 0
danielk19776b39c2e2008-06-25 14:57:53 +0000345 install_malloc_faultsim 1
346 sqlite3_initialize
347 autoinstall_test_functions
348 } -shutdown {
349 catch {db close}
350 sqlite3_reset_auto_extension
351 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000352 sqlite3_config_heap 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000353 install_malloc_faultsim 1
354 sqlite3_initialize
355 }
danielk197757e5ea92008-06-24 19:02:55 +0000356}
357
danielk19776b39c2e2008-06-25 14:57:53 +0000358ifcapable mem5 {
359 run_tests "memsys5" -description {
360 Run tests using the allocator in mem5.c.
361 } -exclude {
362 incrblob2.test manydb.test autovacuum.test bigrow.test
363 collate5.test delete3.test index2.test ioerr.test join3.test
364 pagesize.test bitvec.test capi3.test memsubsys1.test limit.test
365 memdb.test capi3c.test func.test
366 } -initialize {
367 catch {db close}
368 sqlite3_reset_auto_extension
369 sqlite3_shutdown
danielk19775099be52008-06-27 13:27:03 +0000370 sqlite3_config_heap 1000000 64
371 install_malloc_faultsim 1
372 sqlite3_initialize
373 autoinstall_test_functions
374 } -shutdown {
375 catch {db close}
376 sqlite3_reset_auto_extension
377 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000378 sqlite3_config_heap 0 0
danielk19775099be52008-06-27 13:27:03 +0000379 install_malloc_faultsim 1
380 sqlite3_initialize
381 }
382
383 run_tests "memsys5-2" -description {
384 Run tests using the allocator in mem5.c in a different configuration.
385 } -include { select1.test
386 } -initialize {
387 catch {db close}
388 sqlite3_reset_auto_extension
389 sqlite3_shutdown
390 sqlite3_config_heap 250000 16
danielk19776b39c2e2008-06-25 14:57:53 +0000391 install_malloc_faultsim 1
392 sqlite3_initialize
393 autoinstall_test_functions
394 } -shutdown {
395 catch {db close}
396 sqlite3_reset_auto_extension
397 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000398 sqlite3_config_heap 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000399 install_malloc_faultsim 1
400 sqlite3_initialize
401 }
danielk1977c66c0e12008-06-25 14:26:07 +0000402}
403
danielk1977b13dee92008-06-23 15:55:52 +0000404# run_tests "crash_safe_append" -description {
405# Run crash.test with persistent journals on a SAFE_APPEND file-system.
406# } -initialize {
407# rename crashsql sa_crashsql
408# proc crashsql {args} {
409# set options [lrange $args 0 [expr {[llength $args]-2}]]
410# lappend options -char safe_append
411# set sql [lindex $args end]
412# lappend options "
413# PRAGMA journal_mode=persistent;
414# $sql
415# "
416# set fd [open test.db-journal w]
417# puts $fd [string repeat 1234567890 100000]
418# close $fd
419# eval sa_crashsql $options
420# }
421# } -shutdown {
422# rename crashsql {}
423# rename sa_crashsql crashsql
424# } -include crash.test
425
426
danielk19771077e3f2008-06-21 18:07:37 +0000427# End of tests
428#############################################################################
429
430if {$::testmode eq "targets"} { puts "" ; exit }
431
432# Restore the [sqlite3] command.
433#
434rename sqlite3 {}
435rename really_sqlite3 sqlite3
436
437# Restore the [finish_test] command.
438#
439rename finish_test ""
440rename really_finish_test2 finish_test
441
442# Restore the [do_test] command.
443#
444rename do_test ""
445rename really_do_test do_test
446
447finish_test
448