blob: d918986b577f13751fd130641421209e28a30703 [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#
danielk19772d340812008-07-24 08:20:40 +000012# $Id: permutations.test,v 1.14 2008/07/24 08:20:40 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
drh8a42cbd2008-07-10 18:13:42 +000038 autovacuum_ioerr no_mutex_try
danielk19771077e3f2008-06-21 18:07:37 +000039 }
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 {
drh8a42cbd2008-07-10 18:13:42 +000052 all.test in2.test onefile.test
53 async2.test incrvacuum_ioerr.test permutations.test
54 async.test jrnlmode2.test quick.test
55 autovacuum_crash.test jrnlmode3.test shared_err.test
56 autovacuum_ioerr.test jrnlmode4.test soak.test
57 btree8.test loadext.test speed1p.test
58 corrupt.test malloc2.test speed1.test
59 crash2.test malloc3.test speed2.test
60 crash3.test malloc4.test speed3.test
61 crash4.test mallocAll.test speed4p.test
62 crash6.test malloc.test speed4.test
63 crash7.test memleak.test sqllimits1.test
64 crash.test memsubsys1.test thread001.test
65 exclusive3.test memsubsys2.test thread002.test
66 fts3.test misc7.test utf16.test
67 fuzz_malloc.test misuse.test veryquick.test
68 fuzz.test mutex2.test vtab_err.test
danielk19771077e3f2008-06-21 18:07:37 +000069}
70set ALLTESTS [list]
71foreach filename [glob $testdir/*.test] {
72 set filename [file tail $filename]
73 if {[lsearch $EXCLUDE $filename] < 0} { lappend ALLTESTS $filename }
74}
75
76rename finish_test really_finish_test2
77proc finish_test {} {}
78
79rename do_test really_do_test
80
81proc do_test {name args} {
82 eval really_do_test [list "perm-$::permutations_test_prefix.$name"] $args
83}
84
85# Overload the [sqlite3] command
86rename sqlite3 really_sqlite3
87proc sqlite3 {args} {
88 set r [eval really_sqlite3 $args]
89 if { [llength $args] == 2 && $::permutations_presql ne "" } {
90 [lindex $args 0] eval $::permutations_presql
91 }
92 set r
93}
94
95# run_tests OPTIONS
96#
97# where available options are:
98#
99# -initialize SCRIPT (default "")
100# -shutdown SCRIPT (default "")
101# -include LIST-OF-FILES (default $::ALLTESTS)
102# -exclude LIST-OF-FILES (default "")
103# -presql SQL (default "")
104# -description TITLE (default "")
105#
106proc run_tests {name args} {
107 set ::permutations_test_prefix $name
108 set options(-shutdown) ""
109 set options(-initialize) ""
110 set options(-exclude) ""
111 set options(-include) $::ALLTESTS
112 set options(-presql) ""
113 set options(-description) "no description supplied (fixme)"
114 array set options $args
115
116 if {$::testmode eq "targets"} {
117 puts [format "% -20s %s" $name [string trim $options(-description)]]
118 return
119 }
120 if {$::testmode ne "" && [lsearch $::testmode $name]<0} return
121
danielk19771077e3f2008-06-21 18:07:37 +0000122 uplevel $options(-initialize)
123 set ::permutations_presql $options(-presql)
124
125 foreach file $options(-include) {
126 if {[lsearch $options(-exclude) $file] < 0 && (
127 $::testfile eq "" || $::testfile eq $file || "$::testfile.test" eq $file
128 ) } {
129 uplevel source $::testdir/$file
130 }
131 }
132
133 uplevel $options(-shutdown)
134}
135
136#############################################################################
137# Start of tests
138
139# Run some tests using pre-allocated page and scratch blocks.
140#
141run_tests "memsubsys1" -description {
142 Tests using pre-allocated page and scratch blocks
143} -initialize {
144 sqlite3_shutdown
145 sqlite3_config_pagecache 4096 24
146 sqlite3_config_scratch 25000 1
147 sqlite3_initialize
danielk19771077e3f2008-06-21 18:07:37 +0000148} -shutdown {
149 catch {db close}
150 sqlite3_shutdown
151 sqlite3_config_pagecache 0 0
152 sqlite3_config_scratch 0 0
153 sqlite3_initialize
154}
155
156# Run some tests using pre-allocated page and scratch blocks. This time
157# the allocations are too small to use in most cases.
158#
159run_tests "memsubsys2" -description {
160 Tests using small pre-allocated page and scratch blocks
161} -initialize {
162 sqlite3_shutdown
163 sqlite3_config_pagecache 512 5
164 sqlite3_config_scratch 1000 1
165 sqlite3_initialize
danielk19771077e3f2008-06-21 18:07:37 +0000166} -shutdown {
167 catch {db close}
168 sqlite3_shutdown
169 sqlite3_config_pagecache 0 0
170 sqlite3_config_scratch 0 0
171 sqlite3_initialize
172}
173
174# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
175#
176run_tests "singlethread" -description {
177 Tests run in SQLITE_CONFIG_SINGLETHREAD mode
178} -initialize {
179 do_test mutex2-singlethread.0 {
180 catch {db close}
181 sqlite3_shutdown
182 sqlite3_config singlethread
183 } SQLITE_OK
184} -include {
185 delete.test delete2.test insert.test rollback.test select1.test
186 select2.test trans.test update.test vacuum.test types.test
187 types2.test types3.test
188} -shutdown {
189 do_test mutex2-X {
190 catch {db close}
191 sqlite3_shutdown
192 sqlite3_config serialized
193 } SQLITE_OK
194}
195
danielk19779a6284c2008-07-10 17:52:49 +0000196run_tests "nomutex" -description {
197 Tests run with the SQLITE_OPEN_SINGLETHREADED flag passed to sqlite3_open().
198} -initialize {
199 rename sqlite3 sqlite3_nomutex
200 proc sqlite3 {args} {
201 if {[string range [lindex $args 0] 0 0] ne "-"} {
202 lappend args -nomutex 1
203 }
204 uplevel [concat sqlite3_nomutex $args]
205 }
206} -include {
207 delete.test delete2.test insert.test rollback.test select1.test
208 select2.test trans.test update.test vacuum.test types.test
209 types2.test types3.test
210} -shutdown {
211 rename sqlite3 {}
212 rename sqlite3_nomutex sqlite3
213}
214
danielk19771077e3f2008-06-21 18:07:37 +0000215# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
216#
217run_tests "multithread" -description {
218 Tests run in SQLITE_CONFIG_MULTITHREAD mode
219} -initialize {
220 do_test mutex2-multithread.0 {
221 catch {db close}
222 sqlite3_shutdown
223 sqlite3_config multithread
224 } SQLITE_OK
225} -include {
226 delete.test delete2.test insert.test rollback.test select1.test
227 select2.test trans.test update.test vacuum.test types.test
228 types2.test types3.test
229} -shutdown {
230 do_test mutex2-X {
231 catch {db close}
232 sqlite3_shutdown
233 sqlite3_config serialized
234 } SQLITE_OK
235}
236
237# Run some tests using the "onefile" demo.
238#
239run_tests "onefile" -description {
240 Run some tests using the "test_onefile.c" demo
241} -initialize {
242 rename sqlite3 sqlite3_onefile
243 proc sqlite3 {args} {
244 if {[string range [lindex $args 0] 0 0] ne "-"} {
245 lappend args -vfs fs
246 }
247 uplevel [concat sqlite3_onefile $args]
248 }
249} -include {
250 conflict.test insert.test insert2.test insert3.test
251 rollback.test select1.test select2.test select3.test
252 temptable.test
253} -shutdown {
254 rename sqlite3 {}
255 rename sqlite3_onefile sqlite3
256}
257
258# Run some tests using UTF-16 databases.
259#
260run_tests "utf16" -description {
261 Run tests using UTF-16 databases
danielk19772dd6d802008-06-21 19:10:27 +0000262} -presql {
danielk19771077e3f2008-06-21 18:07:37 +0000263 pragma encoding = 'UTF-16'
264} -include {
265 alter.test alter3.test
266 auth.test bind.test blob.test capi2.test capi3.test collate1.test
267 collate2.test collate3.test collate4.test collate5.test collate6.test
268 conflict.test date.test delete.test expr.test fkey1.test func.test
269 hook.test index.test insert2.test insert.test interrupt.test in.test
270 intpkey.test ioerr.test join2.test join.test lastinsert.test
271 laststmtchanges.test limit.test lock2.test lock.test main.test
272 memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
273 null.test progress.test quote.test rowid.test select1.test select2.test
274 select3.test select4.test select5.test select6.test sort.test
275 subselect.test tableapi.test table.test temptable.test
276 trace.test trigger1.test trigger2.test trigger3.test
277 trigger4.test types2.test types.test unique.test update.test
278 vacuum.test view.test where.test
279}
280
281# Run some tests in exclusive locking mode.
282#
283run_tests "exclusive" -description {
284 Run tests in exclusive locking mode.
285} -presql {
286 pragma locking_mode = 'exclusive'
287} -include {
288 rollback.test select1.test select2.test
289 malloc.test ioerr.test
290}
291
292# Run some tests in persistent journal mode.
293#
294run_tests "persistent_journal" -description {
295 Run tests in persistent-journal mode.
296} -presql {
297 pragma journal_mode = persist
298} -include {
299 delete.test delete2.test insert.test rollback.test select1.test
300 select2.test trans.test update.test vacuum.test
301}
302
303# Run some error tests in persistent journal mode.
304#
305run_tests "persistent_journal_error" -description {
306 Run malloc.test and ioerr.test in persistent-journal mode.
307} -presql {
308 pragma journal_mode = persist
309} -include {
310 malloc.test ioerr.test
311}
312
313# Run some tests in no journal mode.
314#
315run_tests "no_journal" -description {
316 Run tests in no-journal mode.
317} -presql {
318 pragma journal_mode = persist
319} -include {
320 delete.test delete2.test insert.test rollback.test select1.test
321 select2.test trans.test update.test vacuum.test
322}
323
324# Run some error tests in no journal mode.
325#
326run_tests "no_journal_error" -description {
327 Run malloc.test and ioerr.test in no-journal mode.
328} -presql {
329 pragma journal_mode = persist
330} -include {
331 malloc.test ioerr.test
332}
333
334# Run some crash-tests in autovacuum mode.
335#
336run_tests "autovacuum_crash" -description {
337 Run crash.test in autovacuum mode.
338} -presql {
339 pragma auto_vacuum = 1
340} -include crash.test
341
342# Run some ioerr-tests in autovacuum mode.
343#
344run_tests "autovacuum_ioerr" -description {
345 Run ioerr.test in autovacuum mode.
346} -presql {
347 pragma auto_vacuum = 1
348} -include ioerr.test
349
danielk19776b39c2e2008-06-25 14:57:53 +0000350ifcapable mem3 {
351 run_tests "memsys3" -description {
352 Run tests using the allocator in mem3.c.
353 } -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000354 autovacuum.test delete3.test manydb.test
355 bigrow.test incrblob2.test memdb.test
356 bitvec.test index2.test memsubsys1.test
357 capi3c.test ioerr.test memsubsys2.test
358 capi3.test join3.test pagesize.test
359 collate5.test limit.test
danielk19776b39c2e2008-06-25 14:57:53 +0000360 } -initialize {
361 catch {db close}
362 sqlite3_reset_auto_extension
363 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000364 sqlite3_config_heap 25000000 0
danielk19776b39c2e2008-06-25 14:57:53 +0000365 install_malloc_faultsim 1
366 sqlite3_initialize
367 autoinstall_test_functions
368 } -shutdown {
369 catch {db close}
370 sqlite3_reset_auto_extension
371 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000372 sqlite3_config_heap 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000373 install_malloc_faultsim 1
374 sqlite3_initialize
375 }
danielk197757e5ea92008-06-24 19:02:55 +0000376}
377
danielk19776b39c2e2008-06-25 14:57:53 +0000378ifcapable mem5 {
379 run_tests "memsys5" -description {
380 Run tests using the allocator in mem5.c.
381 } -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000382 autovacuum.test delete3.test manydb.test
383 bigrow.test incrblob2.test memdb.test
384 bitvec.test index2.test memsubsys1.test
385 capi3c.test ioerr.test memsubsys2.test
386 capi3.test join3.test pagesize.test
387 collate5.test limit.test
danielk19776b39c2e2008-06-25 14:57:53 +0000388 } -initialize {
389 catch {db close}
390 sqlite3_reset_auto_extension
391 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000392 sqlite3_config_heap 25000000 64
danielk19775099be52008-06-27 13:27:03 +0000393 install_malloc_faultsim 1
394 sqlite3_initialize
395 autoinstall_test_functions
396 } -shutdown {
397 catch {db close}
398 sqlite3_reset_auto_extension
399 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000400 sqlite3_config_heap 0 0
danielk19775099be52008-06-27 13:27:03 +0000401 install_malloc_faultsim 1
402 sqlite3_initialize
403 }
404
405 run_tests "memsys5-2" -description {
406 Run tests using the allocator in mem5.c in a different configuration.
drh8a42cbd2008-07-10 18:13:42 +0000407 } -include {
408 select1.test
danielk19775099be52008-06-27 13:27:03 +0000409 } -initialize {
410 catch {db close}
411 sqlite3_reset_auto_extension
412 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000413 sqlite3_config_heap 40000000 16
danielk19776b39c2e2008-06-25 14:57:53 +0000414 install_malloc_faultsim 1
415 sqlite3_initialize
416 autoinstall_test_functions
417 } -shutdown {
418 catch {db close}
419 sqlite3_reset_auto_extension
420 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000421 sqlite3_config_heap 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000422 install_malloc_faultsim 1
423 sqlite3_initialize
424 }
danielk1977c66c0e12008-06-25 14:26:07 +0000425}
426
drh8a42cbd2008-07-10 18:13:42 +0000427ifcapable threadsafe {
428 run_tests "no_mutex_try" -description {
429 The sqlite3_mutex_try() interface always fails
430 } -initialize {
431 catch {db close}
432 sqlite3_shutdown
433 install_mutex_counters 1
434 set ::disable_mutex_try 1
435 } -shutdown {
436 catch {db close}
437 sqlite3_shutdown
438 install_mutex_counters 0
439 }
440}
441
danielk19772d340812008-07-24 08:20:40 +0000442 run_tests "memsys6" -description {
443 Run tests using the allocator in mem6.c.
444 } -include {
445 select1.test
446 } -initialize {
447 catch {db close}
448 sqlite3_reset_auto_extension
449 sqlite3_shutdown
450 sqlite3_config_chunkalloc
451 install_malloc_faultsim 1
452 sqlite3_initialize
453 autoinstall_test_functions
454 } -shutdown {
455 catch {db close}
456 sqlite3_reset_auto_extension
457 sqlite3_shutdown
458 sqlite3_config_heap 0 0
459 install_malloc_faultsim 1
460 sqlite3_initialize
461 }
462
danielk1977b13dee92008-06-23 15:55:52 +0000463# run_tests "crash_safe_append" -description {
464# Run crash.test with persistent journals on a SAFE_APPEND file-system.
465# } -initialize {
466# rename crashsql sa_crashsql
467# proc crashsql {args} {
468# set options [lrange $args 0 [expr {[llength $args]-2}]]
469# lappend options -char safe_append
470# set sql [lindex $args end]
471# lappend options "
472# PRAGMA journal_mode=persistent;
473# $sql
474# "
475# set fd [open test.db-journal w]
476# puts $fd [string repeat 1234567890 100000]
477# close $fd
478# eval sa_crashsql $options
479# }
480# } -shutdown {
481# rename crashsql {}
482# rename sa_crashsql crashsql
483# } -include crash.test
484
485
danielk19771077e3f2008-06-21 18:07:37 +0000486# End of tests
487#############################################################################
488
489if {$::testmode eq "targets"} { puts "" ; exit }
490
491# Restore the [sqlite3] command.
492#
493rename sqlite3 {}
494rename really_sqlite3 sqlite3
495
496# Restore the [finish_test] command.
497#
498rename finish_test ""
499rename really_finish_test2 finish_test
500
501# Restore the [do_test] command.
502#
503rename do_test ""
504rename really_do_test do_test
505
506finish_test