blob: 80c78ad2470933983325181fa2cfe57315dc76e4 [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#
danielk19779a6284c2008-07-10 17:52:49 +000012# $Id: permutations.test,v 1.10 2008/07/10 17:52:49 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
danielk19779a6284c2008-07-10 17:52:49 +0000197run_tests "nomutex" -description {
198 Tests run with the SQLITE_OPEN_SINGLETHREADED flag passed to sqlite3_open().
199} -initialize {
200 rename sqlite3 sqlite3_nomutex
201 proc sqlite3 {args} {
202 if {[string range [lindex $args 0] 0 0] ne "-"} {
203 lappend args -nomutex 1
204 }
205 uplevel [concat sqlite3_nomutex $args]
206 }
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 rename sqlite3 {}
213 rename sqlite3_nomutex sqlite3
214}
215
danielk19771077e3f2008-06-21 18:07:37 +0000216# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
217#
218run_tests "multithread" -description {
219 Tests run in SQLITE_CONFIG_MULTITHREAD mode
220} -initialize {
221 do_test mutex2-multithread.0 {
222 catch {db close}
223 sqlite3_shutdown
224 sqlite3_config multithread
225 } SQLITE_OK
226} -include {
227 delete.test delete2.test insert.test rollback.test select1.test
228 select2.test trans.test update.test vacuum.test types.test
229 types2.test types3.test
230} -shutdown {
231 do_test mutex2-X {
232 catch {db close}
233 sqlite3_shutdown
234 sqlite3_config serialized
235 } SQLITE_OK
236}
237
238# Run some tests using the "onefile" demo.
239#
240run_tests "onefile" -description {
241 Run some tests using the "test_onefile.c" demo
242} -initialize {
243 rename sqlite3 sqlite3_onefile
244 proc sqlite3 {args} {
245 if {[string range [lindex $args 0] 0 0] ne "-"} {
246 lappend args -vfs fs
247 }
248 uplevel [concat sqlite3_onefile $args]
249 }
250} -include {
251 conflict.test insert.test insert2.test insert3.test
252 rollback.test select1.test select2.test select3.test
253 temptable.test
254} -shutdown {
255 rename sqlite3 {}
256 rename sqlite3_onefile sqlite3
257}
258
259# Run some tests using UTF-16 databases.
260#
261run_tests "utf16" -description {
262 Run tests using UTF-16 databases
danielk19772dd6d802008-06-21 19:10:27 +0000263} -presql {
danielk19771077e3f2008-06-21 18:07:37 +0000264 pragma encoding = 'UTF-16'
265} -include {
266 alter.test alter3.test
267 auth.test bind.test blob.test capi2.test capi3.test collate1.test
268 collate2.test collate3.test collate4.test collate5.test collate6.test
269 conflict.test date.test delete.test expr.test fkey1.test func.test
270 hook.test index.test insert2.test insert.test interrupt.test in.test
271 intpkey.test ioerr.test join2.test join.test lastinsert.test
272 laststmtchanges.test limit.test lock2.test lock.test main.test
273 memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
274 null.test progress.test quote.test rowid.test select1.test select2.test
275 select3.test select4.test select5.test select6.test sort.test
276 subselect.test tableapi.test table.test temptable.test
277 trace.test trigger1.test trigger2.test trigger3.test
278 trigger4.test types2.test types.test unique.test update.test
279 vacuum.test view.test where.test
280}
281
282# Run some tests in exclusive locking mode.
283#
284run_tests "exclusive" -description {
285 Run tests in exclusive locking mode.
286} -presql {
287 pragma locking_mode = 'exclusive'
288} -include {
289 rollback.test select1.test select2.test
290 malloc.test ioerr.test
291}
292
293# Run some tests in persistent journal mode.
294#
295run_tests "persistent_journal" -description {
296 Run tests in persistent-journal mode.
297} -presql {
298 pragma journal_mode = persist
299} -include {
300 delete.test delete2.test insert.test rollback.test select1.test
301 select2.test trans.test update.test vacuum.test
302}
303
304# Run some error tests in persistent journal mode.
305#
306run_tests "persistent_journal_error" -description {
307 Run malloc.test and ioerr.test in persistent-journal mode.
308} -presql {
309 pragma journal_mode = persist
310} -include {
311 malloc.test ioerr.test
312}
313
314# Run some tests in no journal mode.
315#
316run_tests "no_journal" -description {
317 Run tests in no-journal mode.
318} -presql {
319 pragma journal_mode = persist
320} -include {
321 delete.test delete2.test insert.test rollback.test select1.test
322 select2.test trans.test update.test vacuum.test
323}
324
325# Run some error tests in no journal mode.
326#
327run_tests "no_journal_error" -description {
328 Run malloc.test and ioerr.test in no-journal mode.
329} -presql {
330 pragma journal_mode = persist
331} -include {
332 malloc.test ioerr.test
333}
334
335# Run some crash-tests in autovacuum mode.
336#
337run_tests "autovacuum_crash" -description {
338 Run crash.test in autovacuum mode.
339} -presql {
340 pragma auto_vacuum = 1
341} -include crash.test
342
343# Run some ioerr-tests in autovacuum mode.
344#
345run_tests "autovacuum_ioerr" -description {
346 Run ioerr.test in autovacuum mode.
347} -presql {
348 pragma auto_vacuum = 1
349} -include ioerr.test
350
danielk19776b39c2e2008-06-25 14:57:53 +0000351ifcapable mem3 {
352 run_tests "memsys3" -description {
353 Run tests using the allocator in mem3.c.
354 } -exclude {
355 incrblob2.test manydb.test autovacuum.test bigrow.test
356 collate5.test delete3.test index2.test ioerr.test join3.test
357 pagesize.test bitvec.test capi3.test memsubsys1.test limit.test
358 memdb.test capi3c.test
359 } -initialize {
360 catch {db close}
361 sqlite3_reset_auto_extension
362 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000363 sqlite3_config_heap -memsys3 1000000 0
danielk19776b39c2e2008-06-25 14:57:53 +0000364 install_malloc_faultsim 1
365 sqlite3_initialize
366 autoinstall_test_functions
367 } -shutdown {
368 catch {db close}
369 sqlite3_reset_auto_extension
370 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000371 sqlite3_config_heap 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000372 install_malloc_faultsim 1
373 sqlite3_initialize
374 }
danielk197757e5ea92008-06-24 19:02:55 +0000375}
376
danielk19776b39c2e2008-06-25 14:57:53 +0000377ifcapable mem5 {
378 run_tests "memsys5" -description {
379 Run tests using the allocator in mem5.c.
380 } -exclude {
381 incrblob2.test manydb.test autovacuum.test bigrow.test
382 collate5.test delete3.test index2.test ioerr.test join3.test
383 pagesize.test bitvec.test capi3.test memsubsys1.test limit.test
384 memdb.test capi3c.test func.test
385 } -initialize {
386 catch {db close}
387 sqlite3_reset_auto_extension
388 sqlite3_shutdown
danielk19775099be52008-06-27 13:27:03 +0000389 sqlite3_config_heap 1000000 64
390 install_malloc_faultsim 1
391 sqlite3_initialize
392 autoinstall_test_functions
393 } -shutdown {
394 catch {db close}
395 sqlite3_reset_auto_extension
396 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000397 sqlite3_config_heap 0 0
danielk19775099be52008-06-27 13:27:03 +0000398 install_malloc_faultsim 1
399 sqlite3_initialize
400 }
401
402 run_tests "memsys5-2" -description {
403 Run tests using the allocator in mem5.c in a different configuration.
404 } -include { select1.test
405 } -initialize {
406 catch {db close}
407 sqlite3_reset_auto_extension
408 sqlite3_shutdown
409 sqlite3_config_heap 250000 16
danielk19776b39c2e2008-06-25 14:57:53 +0000410 install_malloc_faultsim 1
411 sqlite3_initialize
412 autoinstall_test_functions
413 } -shutdown {
414 catch {db close}
415 sqlite3_reset_auto_extension
416 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000417 sqlite3_config_heap 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000418 install_malloc_faultsim 1
419 sqlite3_initialize
420 }
danielk1977c66c0e12008-06-25 14:26:07 +0000421}
422
danielk1977b13dee92008-06-23 15:55:52 +0000423# run_tests "crash_safe_append" -description {
424# Run crash.test with persistent journals on a SAFE_APPEND file-system.
425# } -initialize {
426# rename crashsql sa_crashsql
427# proc crashsql {args} {
428# set options [lrange $args 0 [expr {[llength $args]-2}]]
429# lappend options -char safe_append
430# set sql [lindex $args end]
431# lappend options "
432# PRAGMA journal_mode=persistent;
433# $sql
434# "
435# set fd [open test.db-journal w]
436# puts $fd [string repeat 1234567890 100000]
437# close $fd
438# eval sa_crashsql $options
439# }
440# } -shutdown {
441# rename crashsql {}
442# rename sa_crashsql crashsql
443# } -include crash.test
444
445
danielk19771077e3f2008-06-21 18:07:37 +0000446# End of tests
447#############################################################################
448
449if {$::testmode eq "targets"} { puts "" ; exit }
450
451# Restore the [sqlite3] command.
452#
453rename sqlite3 {}
454rename really_sqlite3 sqlite3
455
456# Restore the [finish_test] command.
457#
458rename finish_test ""
459rename really_finish_test2 finish_test
460
461# Restore the [do_test] command.
462#
463rename do_test ""
464rename really_do_test do_test
465
466finish_test
467