blob: d893a1c3cf2734a9e9b0aa337a17432baba535fd [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#
drhe2a7c6e2008-08-01 15:06:30 +000012# $Id: permutations.test,v 1.19 2008/08/01 15:06:30 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
drhe2a7c6e2008-08-01 15:06:30 +0000176# Run all tests with the lookaside allocator disabled.
177#
178run_tests "memsubsys3" -description {
179 OOM tests with lookaside disabled
180} -include {
181 malloc.test
182 malloc3.test
183 malloc4.test
184 malloc5.test
185 malloc6.test
186 malloc7.test
187 malloc8.test
188 malloc9.test
189 mallocA.test
190 mallocB.test
191 mallocC.test
192 mallocD.test
193 mallocE.test
194 mallocF.test
195 mallocG.test
196} -initialize {
197 catch {db close}
198 sqlite3_shutdown
199 sqlite3_config_lookaside 0 0
200 sqlite3_initialize
201} -shutdown {
202 catch {db close}
203 sqlite3_shutdown
204 sqlite3_config_lookaside 100 500
205 sqlite3_initialize
206}
207
danielk19771077e3f2008-06-21 18:07:37 +0000208# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
209#
210run_tests "singlethread" -description {
211 Tests run in SQLITE_CONFIG_SINGLETHREAD mode
212} -initialize {
213 do_test mutex2-singlethread.0 {
214 catch {db close}
215 sqlite3_shutdown
216 sqlite3_config singlethread
217 } SQLITE_OK
218} -include {
219 delete.test delete2.test insert.test rollback.test select1.test
220 select2.test trans.test update.test vacuum.test types.test
221 types2.test types3.test
222} -shutdown {
223 do_test mutex2-X {
224 catch {db close}
225 sqlite3_shutdown
226 sqlite3_config serialized
227 } SQLITE_OK
228}
229
danielk19779a6284c2008-07-10 17:52:49 +0000230run_tests "nomutex" -description {
231 Tests run with the SQLITE_OPEN_SINGLETHREADED flag passed to sqlite3_open().
232} -initialize {
233 rename sqlite3 sqlite3_nomutex
234 proc sqlite3 {args} {
235 if {[string range [lindex $args 0] 0 0] ne "-"} {
236 lappend args -nomutex 1
237 }
238 uplevel [concat sqlite3_nomutex $args]
239 }
240} -include {
241 delete.test delete2.test insert.test rollback.test select1.test
242 select2.test trans.test update.test vacuum.test types.test
243 types2.test types3.test
244} -shutdown {
245 rename sqlite3 {}
246 rename sqlite3_nomutex sqlite3
247}
248
danielk19771077e3f2008-06-21 18:07:37 +0000249# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
250#
251run_tests "multithread" -description {
252 Tests run in SQLITE_CONFIG_MULTITHREAD mode
253} -initialize {
254 do_test mutex2-multithread.0 {
255 catch {db close}
256 sqlite3_shutdown
257 sqlite3_config multithread
258 } SQLITE_OK
259} -include {
260 delete.test delete2.test insert.test rollback.test select1.test
261 select2.test trans.test update.test vacuum.test types.test
262 types2.test types3.test
263} -shutdown {
264 do_test mutex2-X {
265 catch {db close}
266 sqlite3_shutdown
267 sqlite3_config serialized
268 } SQLITE_OK
269}
270
271# Run some tests using the "onefile" demo.
272#
273run_tests "onefile" -description {
274 Run some tests using the "test_onefile.c" demo
275} -initialize {
276 rename sqlite3 sqlite3_onefile
277 proc sqlite3 {args} {
278 if {[string range [lindex $args 0] 0 0] ne "-"} {
279 lappend args -vfs fs
280 }
281 uplevel [concat sqlite3_onefile $args]
282 }
283} -include {
284 conflict.test insert.test insert2.test insert3.test
285 rollback.test select1.test select2.test select3.test
286 temptable.test
287} -shutdown {
288 rename sqlite3 {}
289 rename sqlite3_onefile sqlite3
290}
291
292# Run some tests using UTF-16 databases.
293#
294run_tests "utf16" -description {
295 Run tests using UTF-16 databases
danielk19772dd6d802008-06-21 19:10:27 +0000296} -presql {
danielk19771077e3f2008-06-21 18:07:37 +0000297 pragma encoding = 'UTF-16'
298} -include {
299 alter.test alter3.test
300 auth.test bind.test blob.test capi2.test capi3.test collate1.test
301 collate2.test collate3.test collate4.test collate5.test collate6.test
302 conflict.test date.test delete.test expr.test fkey1.test func.test
303 hook.test index.test insert2.test insert.test interrupt.test in.test
304 intpkey.test ioerr.test join2.test join.test lastinsert.test
305 laststmtchanges.test limit.test lock2.test lock.test main.test
306 memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
307 null.test progress.test quote.test rowid.test select1.test select2.test
308 select3.test select4.test select5.test select6.test sort.test
309 subselect.test tableapi.test table.test temptable.test
310 trace.test trigger1.test trigger2.test trigger3.test
311 trigger4.test types2.test types.test unique.test update.test
312 vacuum.test view.test where.test
313}
314
315# Run some tests in exclusive locking mode.
316#
317run_tests "exclusive" -description {
318 Run tests in exclusive locking mode.
319} -presql {
320 pragma locking_mode = 'exclusive'
321} -include {
322 rollback.test select1.test select2.test
323 malloc.test ioerr.test
324}
325
326# Run some tests in persistent journal mode.
327#
328run_tests "persistent_journal" -description {
329 Run tests in persistent-journal mode.
330} -presql {
331 pragma journal_mode = persist
332} -include {
333 delete.test delete2.test insert.test rollback.test select1.test
334 select2.test trans.test update.test vacuum.test
335}
336
337# Run some error tests in persistent journal mode.
338#
339run_tests "persistent_journal_error" -description {
340 Run malloc.test and ioerr.test in persistent-journal mode.
341} -presql {
342 pragma journal_mode = persist
343} -include {
344 malloc.test ioerr.test
345}
346
347# Run some tests in no journal mode.
348#
349run_tests "no_journal" -description {
350 Run tests in no-journal mode.
351} -presql {
352 pragma journal_mode = persist
353} -include {
354 delete.test delete2.test insert.test rollback.test select1.test
355 select2.test trans.test update.test vacuum.test
356}
357
358# Run some error tests in no journal mode.
359#
360run_tests "no_journal_error" -description {
361 Run malloc.test and ioerr.test in no-journal mode.
362} -presql {
363 pragma journal_mode = persist
364} -include {
365 malloc.test ioerr.test
366}
367
368# Run some crash-tests in autovacuum mode.
369#
370run_tests "autovacuum_crash" -description {
371 Run crash.test in autovacuum mode.
372} -presql {
373 pragma auto_vacuum = 1
374} -include crash.test
375
376# Run some ioerr-tests in autovacuum mode.
377#
378run_tests "autovacuum_ioerr" -description {
379 Run ioerr.test in autovacuum mode.
380} -presql {
381 pragma auto_vacuum = 1
382} -include ioerr.test
383
danielk19776b39c2e2008-06-25 14:57:53 +0000384ifcapable mem3 {
385 run_tests "memsys3" -description {
386 Run tests using the allocator in mem3.c.
387 } -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000388 autovacuum.test delete3.test manydb.test
389 bigrow.test incrblob2.test memdb.test
390 bitvec.test index2.test memsubsys1.test
391 capi3c.test ioerr.test memsubsys2.test
392 capi3.test join3.test pagesize.test
393 collate5.test limit.test
danielk19776b39c2e2008-06-25 14:57:53 +0000394 } -initialize {
395 catch {db close}
396 sqlite3_reset_auto_extension
397 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000398 sqlite3_config_heap 25000000 0
drhe2a7c6e2008-08-01 15:06:30 +0000399 sqlite3_config_lookaside 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000400 install_malloc_faultsim 1
401 sqlite3_initialize
402 autoinstall_test_functions
403 } -shutdown {
404 catch {db close}
405 sqlite3_reset_auto_extension
406 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000407 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000408 sqlite3_config_lookaside 100 500
danielk19776b39c2e2008-06-25 14:57:53 +0000409 install_malloc_faultsim 1
410 sqlite3_initialize
411 }
danielk197757e5ea92008-06-24 19:02:55 +0000412}
413
danielk19776b39c2e2008-06-25 14:57:53 +0000414ifcapable mem5 {
415 run_tests "memsys5" -description {
416 Run tests using the allocator in mem5.c.
417 } -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000418 autovacuum.test delete3.test manydb.test
419 bigrow.test incrblob2.test memdb.test
420 bitvec.test index2.test memsubsys1.test
421 capi3c.test ioerr.test memsubsys2.test
422 capi3.test join3.test pagesize.test
423 collate5.test limit.test
danielk19776b39c2e2008-06-25 14:57:53 +0000424 } -initialize {
425 catch {db close}
426 sqlite3_reset_auto_extension
427 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000428 sqlite3_config_heap 25000000 64
drhe2a7c6e2008-08-01 15:06:30 +0000429 sqlite3_config_lookaside 0 0
danielk19775099be52008-06-27 13:27:03 +0000430 install_malloc_faultsim 1
431 sqlite3_initialize
432 autoinstall_test_functions
433 } -shutdown {
434 catch {db close}
435 sqlite3_reset_auto_extension
436 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000437 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000438 sqlite3_config_lookaside 100 500
danielk19775099be52008-06-27 13:27:03 +0000439 install_malloc_faultsim 1
440 sqlite3_initialize
441 }
442
443 run_tests "memsys5-2" -description {
444 Run tests using the allocator in mem5.c in a different configuration.
drh8a42cbd2008-07-10 18:13:42 +0000445 } -include {
446 select1.test
danielk19775099be52008-06-27 13:27:03 +0000447 } -initialize {
448 catch {db close}
449 sqlite3_reset_auto_extension
450 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000451 sqlite3_config_heap 40000000 16
drhe2a7c6e2008-08-01 15:06:30 +0000452 sqlite3_config_lookaside 0 0
danielk19776b39c2e2008-06-25 14:57:53 +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
danielk19770d84e5b2008-06-27 14:05:24 +0000460 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000461 sqlite3_config_lookaside 100 500
danielk19776b39c2e2008-06-25 14:57:53 +0000462 install_malloc_faultsim 1
463 sqlite3_initialize
464 }
danielk1977c66c0e12008-06-25 14:26:07 +0000465}
466
drh8a42cbd2008-07-10 18:13:42 +0000467ifcapable threadsafe {
468 run_tests "no_mutex_try" -description {
469 The sqlite3_mutex_try() interface always fails
470 } -initialize {
471 catch {db close}
472 sqlite3_shutdown
473 install_mutex_counters 1
474 set ::disable_mutex_try 1
475 } -shutdown {
476 catch {db close}
477 sqlite3_shutdown
478 install_mutex_counters 0
479 }
480}
481
danielk197789697182008-07-24 10:11:27 +0000482run_tests "memsys6" -description {
483 Run tests using the allocator in mem6.c.
danielk1977fae89172008-07-24 10:32:30 +0000484} -exclude {
485 capi3.test capi3c.test
danielk197789697182008-07-24 10:11:27 +0000486} -initialize {
487 catch {db close}
488 sqlite3_reset_auto_extension
489 sqlite3_shutdown
danielk197731fab4f2008-07-25 08:48:59 +0000490 sqlite3_config_chunkalloc 0
danielk197789697182008-07-24 10:11:27 +0000491 install_malloc_faultsim 1
492 sqlite3_initialize
493 autoinstall_test_functions
494} -shutdown {
495 catch {db close}
496 sqlite3_reset_auto_extension
497 sqlite3_shutdown
498 sqlite3_config_heap 0 0
499 install_malloc_faultsim 1
500 sqlite3_initialize
501}
danielk19772d340812008-07-24 08:20:40 +0000502
danielk1977b13dee92008-06-23 15:55:52 +0000503# run_tests "crash_safe_append" -description {
504# Run crash.test with persistent journals on a SAFE_APPEND file-system.
505# } -initialize {
506# rename crashsql sa_crashsql
507# proc crashsql {args} {
508# set options [lrange $args 0 [expr {[llength $args]-2}]]
509# lappend options -char safe_append
510# set sql [lindex $args end]
511# lappend options "
512# PRAGMA journal_mode=persistent;
513# $sql
514# "
515# set fd [open test.db-journal w]
516# puts $fd [string repeat 1234567890 100000]
517# close $fd
518# eval sa_crashsql $options
519# }
520# } -shutdown {
521# rename crashsql {}
522# rename sa_crashsql crashsql
523# } -include crash.test
524
525
danielk19771077e3f2008-06-21 18:07:37 +0000526# End of tests
527#############################################################################
528
529if {$::testmode eq "targets"} { puts "" ; exit }
530
531# Restore the [sqlite3] command.
532#
533rename sqlite3 {}
534rename really_sqlite3 sqlite3
535
536# Restore the [finish_test] command.
537#
538rename finish_test ""
539rename really_finish_test2 finish_test
540
541# Restore the [do_test] command.
542#
543rename do_test ""
544rename really_do_test do_test
545
546finish_test