blob: 738ab44ae19e5c433be816742dde798ee9ff5901 [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#
drhd63bd752008-07-30 13:15:46 +000012# $Id: permutations.test,v 1.18 2008/07/30 13:15:46 drh 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 {
drhd63bd752008-07-30 13:15:46 +0000144 catch {db close}
danielk19771077e3f2008-06-21 18:07:37 +0000145 sqlite3_shutdown
146 sqlite3_config_pagecache 4096 24
147 sqlite3_config_scratch 25000 1
148 sqlite3_initialize
danielk19771077e3f2008-06-21 18:07:37 +0000149} -shutdown {
150 catch {db close}
151 sqlite3_shutdown
152 sqlite3_config_pagecache 0 0
153 sqlite3_config_scratch 0 0
154 sqlite3_initialize
155}
156
157# Run some tests using pre-allocated page and scratch blocks. This time
158# the allocations are too small to use in most cases.
159#
160run_tests "memsubsys2" -description {
161 Tests using small pre-allocated page and scratch blocks
162} -initialize {
drhd63bd752008-07-30 13:15:46 +0000163 catch {db close}
danielk19771077e3f2008-06-21 18:07:37 +0000164 sqlite3_shutdown
165 sqlite3_config_pagecache 512 5
166 sqlite3_config_scratch 1000 1
167 sqlite3_initialize
danielk19771077e3f2008-06-21 18:07:37 +0000168} -shutdown {
169 catch {db close}
170 sqlite3_shutdown
171 sqlite3_config_pagecache 0 0
172 sqlite3_config_scratch 0 0
173 sqlite3_initialize
174}
175
176# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
177#
178run_tests "singlethread" -description {
179 Tests run in SQLITE_CONFIG_SINGLETHREAD mode
180} -initialize {
181 do_test mutex2-singlethread.0 {
182 catch {db close}
183 sqlite3_shutdown
184 sqlite3_config singlethread
185 } SQLITE_OK
186} -include {
187 delete.test delete2.test insert.test rollback.test select1.test
188 select2.test trans.test update.test vacuum.test types.test
189 types2.test types3.test
190} -shutdown {
191 do_test mutex2-X {
192 catch {db close}
193 sqlite3_shutdown
194 sqlite3_config serialized
195 } SQLITE_OK
196}
197
danielk19779a6284c2008-07-10 17:52:49 +0000198run_tests "nomutex" -description {
199 Tests run with the SQLITE_OPEN_SINGLETHREADED flag passed to sqlite3_open().
200} -initialize {
201 rename sqlite3 sqlite3_nomutex
202 proc sqlite3 {args} {
203 if {[string range [lindex $args 0] 0 0] ne "-"} {
204 lappend args -nomutex 1
205 }
206 uplevel [concat sqlite3_nomutex $args]
207 }
208} -include {
209 delete.test delete2.test insert.test rollback.test select1.test
210 select2.test trans.test update.test vacuum.test types.test
211 types2.test types3.test
212} -shutdown {
213 rename sqlite3 {}
214 rename sqlite3_nomutex sqlite3
215}
216
danielk19771077e3f2008-06-21 18:07:37 +0000217# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
218#
219run_tests "multithread" -description {
220 Tests run in SQLITE_CONFIG_MULTITHREAD mode
221} -initialize {
222 do_test mutex2-multithread.0 {
223 catch {db close}
224 sqlite3_shutdown
225 sqlite3_config multithread
226 } SQLITE_OK
227} -include {
228 delete.test delete2.test insert.test rollback.test select1.test
229 select2.test trans.test update.test vacuum.test types.test
230 types2.test types3.test
231} -shutdown {
232 do_test mutex2-X {
233 catch {db close}
234 sqlite3_shutdown
235 sqlite3_config serialized
236 } SQLITE_OK
237}
238
239# Run some tests using the "onefile" demo.
240#
241run_tests "onefile" -description {
242 Run some tests using the "test_onefile.c" demo
243} -initialize {
244 rename sqlite3 sqlite3_onefile
245 proc sqlite3 {args} {
246 if {[string range [lindex $args 0] 0 0] ne "-"} {
247 lappend args -vfs fs
248 }
249 uplevel [concat sqlite3_onefile $args]
250 }
251} -include {
252 conflict.test insert.test insert2.test insert3.test
253 rollback.test select1.test select2.test select3.test
254 temptable.test
255} -shutdown {
256 rename sqlite3 {}
257 rename sqlite3_onefile sqlite3
258}
259
260# Run some tests using UTF-16 databases.
261#
262run_tests "utf16" -description {
263 Run tests using UTF-16 databases
danielk19772dd6d802008-06-21 19:10:27 +0000264} -presql {
danielk19771077e3f2008-06-21 18:07:37 +0000265 pragma encoding = 'UTF-16'
266} -include {
267 alter.test alter3.test
268 auth.test bind.test blob.test capi2.test capi3.test collate1.test
269 collate2.test collate3.test collate4.test collate5.test collate6.test
270 conflict.test date.test delete.test expr.test fkey1.test func.test
271 hook.test index.test insert2.test insert.test interrupt.test in.test
272 intpkey.test ioerr.test join2.test join.test lastinsert.test
273 laststmtchanges.test limit.test lock2.test lock.test main.test
274 memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
275 null.test progress.test quote.test rowid.test select1.test select2.test
276 select3.test select4.test select5.test select6.test sort.test
277 subselect.test tableapi.test table.test temptable.test
278 trace.test trigger1.test trigger2.test trigger3.test
279 trigger4.test types2.test types.test unique.test update.test
280 vacuum.test view.test where.test
281}
282
283# Run some tests in exclusive locking mode.
284#
285run_tests "exclusive" -description {
286 Run tests in exclusive locking mode.
287} -presql {
288 pragma locking_mode = 'exclusive'
289} -include {
290 rollback.test select1.test select2.test
291 malloc.test ioerr.test
292}
293
294# Run some tests in persistent journal mode.
295#
296run_tests "persistent_journal" -description {
297 Run tests in persistent-journal mode.
298} -presql {
299 pragma journal_mode = persist
300} -include {
301 delete.test delete2.test insert.test rollback.test select1.test
302 select2.test trans.test update.test vacuum.test
303}
304
305# Run some error tests in persistent journal mode.
306#
307run_tests "persistent_journal_error" -description {
308 Run malloc.test and ioerr.test in persistent-journal mode.
309} -presql {
310 pragma journal_mode = persist
311} -include {
312 malloc.test ioerr.test
313}
314
315# Run some tests in no journal mode.
316#
317run_tests "no_journal" -description {
318 Run tests in no-journal mode.
319} -presql {
320 pragma journal_mode = persist
321} -include {
322 delete.test delete2.test insert.test rollback.test select1.test
323 select2.test trans.test update.test vacuum.test
324}
325
326# Run some error tests in no journal mode.
327#
328run_tests "no_journal_error" -description {
329 Run malloc.test and ioerr.test in no-journal mode.
330} -presql {
331 pragma journal_mode = persist
332} -include {
333 malloc.test ioerr.test
334}
335
336# Run some crash-tests in autovacuum mode.
337#
338run_tests "autovacuum_crash" -description {
339 Run crash.test in autovacuum mode.
340} -presql {
341 pragma auto_vacuum = 1
342} -include crash.test
343
344# Run some ioerr-tests in autovacuum mode.
345#
346run_tests "autovacuum_ioerr" -description {
347 Run ioerr.test in autovacuum mode.
348} -presql {
349 pragma auto_vacuum = 1
350} -include ioerr.test
351
danielk19776b39c2e2008-06-25 14:57:53 +0000352ifcapable mem3 {
353 run_tests "memsys3" -description {
354 Run tests using the allocator in mem3.c.
355 } -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000356 autovacuum.test delete3.test manydb.test
357 bigrow.test incrblob2.test memdb.test
358 bitvec.test index2.test memsubsys1.test
359 capi3c.test ioerr.test memsubsys2.test
360 capi3.test join3.test pagesize.test
361 collate5.test limit.test
danielk19776b39c2e2008-06-25 14:57:53 +0000362 } -initialize {
363 catch {db close}
364 sqlite3_reset_auto_extension
365 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000366 sqlite3_config_heap 25000000 0
danielk19776b39c2e2008-06-25 14:57:53 +0000367 install_malloc_faultsim 1
368 sqlite3_initialize
369 autoinstall_test_functions
370 } -shutdown {
371 catch {db close}
372 sqlite3_reset_auto_extension
373 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000374 sqlite3_config_heap 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000375 install_malloc_faultsim 1
376 sqlite3_initialize
377 }
danielk197757e5ea92008-06-24 19:02:55 +0000378}
379
danielk19776b39c2e2008-06-25 14:57:53 +0000380ifcapable mem5 {
381 run_tests "memsys5" -description {
382 Run tests using the allocator in mem5.c.
383 } -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000384 autovacuum.test delete3.test manydb.test
385 bigrow.test incrblob2.test memdb.test
386 bitvec.test index2.test memsubsys1.test
387 capi3c.test ioerr.test memsubsys2.test
388 capi3.test join3.test pagesize.test
389 collate5.test limit.test
danielk19776b39c2e2008-06-25 14:57:53 +0000390 } -initialize {
391 catch {db close}
392 sqlite3_reset_auto_extension
393 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000394 sqlite3_config_heap 25000000 64
danielk19775099be52008-06-27 13:27:03 +0000395 install_malloc_faultsim 1
396 sqlite3_initialize
397 autoinstall_test_functions
398 } -shutdown {
399 catch {db close}
400 sqlite3_reset_auto_extension
401 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000402 sqlite3_config_heap 0 0
danielk19775099be52008-06-27 13:27:03 +0000403 install_malloc_faultsim 1
404 sqlite3_initialize
405 }
406
407 run_tests "memsys5-2" -description {
408 Run tests using the allocator in mem5.c in a different configuration.
drh8a42cbd2008-07-10 18:13:42 +0000409 } -include {
410 select1.test
danielk19775099be52008-06-27 13:27:03 +0000411 } -initialize {
412 catch {db close}
413 sqlite3_reset_auto_extension
414 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000415 sqlite3_config_heap 40000000 16
danielk19776b39c2e2008-06-25 14:57:53 +0000416 install_malloc_faultsim 1
417 sqlite3_initialize
418 autoinstall_test_functions
419 } -shutdown {
420 catch {db close}
421 sqlite3_reset_auto_extension
422 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000423 sqlite3_config_heap 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000424 install_malloc_faultsim 1
425 sqlite3_initialize
426 }
danielk1977c66c0e12008-06-25 14:26:07 +0000427}
428
drh8a42cbd2008-07-10 18:13:42 +0000429ifcapable threadsafe {
430 run_tests "no_mutex_try" -description {
431 The sqlite3_mutex_try() interface always fails
432 } -initialize {
433 catch {db close}
434 sqlite3_shutdown
435 install_mutex_counters 1
436 set ::disable_mutex_try 1
437 } -shutdown {
438 catch {db close}
439 sqlite3_shutdown
440 install_mutex_counters 0
441 }
442}
443
danielk197789697182008-07-24 10:11:27 +0000444run_tests "memsys6" -description {
445 Run tests using the allocator in mem6.c.
danielk1977fae89172008-07-24 10:32:30 +0000446} -exclude {
447 capi3.test capi3c.test
danielk197789697182008-07-24 10:11:27 +0000448} -initialize {
449 catch {db close}
450 sqlite3_reset_auto_extension
451 sqlite3_shutdown
danielk197731fab4f2008-07-25 08:48:59 +0000452 sqlite3_config_chunkalloc 0
danielk197789697182008-07-24 10:11:27 +0000453 install_malloc_faultsim 1
454 sqlite3_initialize
455 autoinstall_test_functions
456} -shutdown {
457 catch {db close}
458 sqlite3_reset_auto_extension
459 sqlite3_shutdown
460 sqlite3_config_heap 0 0
461 install_malloc_faultsim 1
462 sqlite3_initialize
463}
danielk19772d340812008-07-24 08:20:40 +0000464
danielk1977b13dee92008-06-23 15:55:52 +0000465# run_tests "crash_safe_append" -description {
466# Run crash.test with persistent journals on a SAFE_APPEND file-system.
467# } -initialize {
468# rename crashsql sa_crashsql
469# proc crashsql {args} {
470# set options [lrange $args 0 [expr {[llength $args]-2}]]
471# lappend options -char safe_append
472# set sql [lindex $args end]
473# lappend options "
474# PRAGMA journal_mode=persistent;
475# $sql
476# "
477# set fd [open test.db-journal w]
478# puts $fd [string repeat 1234567890 100000]
479# close $fd
480# eval sa_crashsql $options
481# }
482# } -shutdown {
483# rename crashsql {}
484# rename sa_crashsql crashsql
485# } -include crash.test
486
487
danielk19771077e3f2008-06-21 18:07:37 +0000488# End of tests
489#############################################################################
490
491if {$::testmode eq "targets"} { puts "" ; exit }
492
493# Restore the [sqlite3] command.
494#
495rename sqlite3 {}
496rename really_sqlite3 sqlite3
497
498# Restore the [finish_test] command.
499#
500rename finish_test ""
501rename really_finish_test2 finish_test
502
503# Restore the [do_test] command.
504#
505rename do_test ""
506rename really_do_test do_test
507
508finish_test