blob: b149d14033231cedb52b21d56033ebaad96d085e [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#
danielk1977c1def3e2008-08-30 13:25:10 +000012# $Id: permutations.test,v 1.26 2008/08/30 13:25:11 danielk1977 Exp $
danielk19771077e3f2008-06-21 18:07:37 +000013
14set testdir [file dirname $argv0]
15source $testdir/tester.tcl
16
17# Argument processing.
18#
drh0a846f92008-08-25 17:23:29 +000019#puts "PERM-DEBUG: argv=$argv"
20namespace eval ::perm {
drh426c8542008-08-26 23:08:04 +000021 variable testmode [lindex $::argv 0]
22 variable testfile [lindex $::argv 1]
drh0a846f92008-08-25 17:23:29 +000023}
danielk19771077e3f2008-06-21 18:07:37 +000024set argv [lrange $argv 2 end]
drh426c8542008-08-26 23:08:04 +000025#puts "PERM-DEBUG: testmode=$::perm::testmode tstfile=$::perm::testfile"
danielk19771077e3f2008-06-21 18:07:37 +000026
27set ::permutations_presql ""
28set ::permutations_test_prefix ""
29
drh0a846f92008-08-25 17:23:29 +000030if {$::perm::testmode eq "veryquick"} {
31 set ::perm::testmode [list persistent_journal no_journal]
danielk19771077e3f2008-06-21 18:07:37 +000032 set ISQUICK 1
33}
drh0a846f92008-08-25 17:23:29 +000034if {$::perm::testmode eq "quick"} {
35 set ::perm::testmode [list persistent_journal no_journal autovacuum_ioerr]
danielk19771077e3f2008-06-21 18:07:37 +000036 set ISQUICK 1
37}
drhdf81a252008-08-25 19:09:01 +000038if {$::perm::testmode eq "all" || $::perm::testmode eq ""} {
drh0a846f92008-08-25 17:23:29 +000039 set ::perm::testmode {
danielk19771077e3f2008-06-21 18:07:37 +000040 memsubsys1 memsubsys2 singlethread multithread onefile utf16 exclusive
41 persistent_journal persistent_journal_error no_journal no_journal_error
drh8a42cbd2008-07-10 18:13:42 +000042 autovacuum_ioerr no_mutex_try
danielk19771077e3f2008-06-21 18:07:37 +000043 }
44}
drh0a846f92008-08-25 17:23:29 +000045if {$::perm::testmode eq "targets"} {
danielk19771077e3f2008-06-21 18:07:37 +000046 puts ""
47 puts -nonewline "veryquick "
48 puts "Same as persistent_journal and no_journal"
49 puts -nonewline "quick "
50 puts "Same as persistent_journal, no_journal and autovacuum_ioerr"
51 puts -nonewline "all "
52 puts "Everything except autovacuum_crash"
53}
drhdf81a252008-08-25 19:09:01 +000054#puts "PERM-DEBUG: testmode=$::perm::testmode"
danielk19771077e3f2008-06-21 18:07:37 +000055
56set EXCLUDE {
drh8a42cbd2008-07-10 18:13:42 +000057 all.test in2.test onefile.test
58 async2.test incrvacuum_ioerr.test permutations.test
59 async.test jrnlmode2.test quick.test
60 autovacuum_crash.test jrnlmode3.test shared_err.test
61 autovacuum_ioerr.test jrnlmode4.test soak.test
62 btree8.test loadext.test speed1p.test
63 corrupt.test malloc2.test speed1.test
64 crash2.test malloc3.test speed2.test
65 crash3.test malloc4.test speed3.test
66 crash4.test mallocAll.test speed4p.test
67 crash6.test malloc.test speed4.test
68 crash7.test memleak.test sqllimits1.test
69 crash.test memsubsys1.test thread001.test
70 exclusive3.test memsubsys2.test thread002.test
71 fts3.test misc7.test utf16.test
72 fuzz_malloc.test misuse.test veryquick.test
73 fuzz.test mutex2.test vtab_err.test
drh4cfb22f2008-08-01 18:47:01 +000074 lookaside.test
danielk19771077e3f2008-06-21 18:07:37 +000075}
76set ALLTESTS [list]
77foreach filename [glob $testdir/*.test] {
78 set filename [file tail $filename]
79 if {[lsearch $EXCLUDE $filename] < 0} { lappend ALLTESTS $filename }
80}
81
82rename finish_test really_finish_test2
83proc finish_test {} {}
84
85rename do_test really_do_test
86
87proc do_test {name args} {
88 eval really_do_test [list "perm-$::permutations_test_prefix.$name"] $args
89}
90
91# Overload the [sqlite3] command
92rename sqlite3 really_sqlite3
93proc sqlite3 {args} {
94 set r [eval really_sqlite3 $args]
95 if { [llength $args] == 2 && $::permutations_presql ne "" } {
96 [lindex $args 0] eval $::permutations_presql
97 }
98 set r
99}
100
101# run_tests OPTIONS
102#
103# where available options are:
104#
105# -initialize SCRIPT (default "")
106# -shutdown SCRIPT (default "")
107# -include LIST-OF-FILES (default $::ALLTESTS)
108# -exclude LIST-OF-FILES (default "")
109# -presql SQL (default "")
110# -description TITLE (default "")
111#
112proc run_tests {name args} {
113 set ::permutations_test_prefix $name
114 set options(-shutdown) ""
115 set options(-initialize) ""
116 set options(-exclude) ""
117 set options(-include) $::ALLTESTS
118 set options(-presql) ""
119 set options(-description) "no description supplied (fixme)"
120 array set options $args
drh0a846f92008-08-25 17:23:29 +0000121 #puts "PERM-DEBUG: name=$name testfile=$::perm::testfile"
122 #puts "PERM-DEBUG: [array get options]"
danielk19771077e3f2008-06-21 18:07:37 +0000123
drh0a846f92008-08-25 17:23:29 +0000124 if {$::perm::testmode eq "targets"} {
danielk19771077e3f2008-06-21 18:07:37 +0000125 puts [format "% -20s %s" $name [string trim $options(-description)]]
126 return
127 }
drh0a846f92008-08-25 17:23:29 +0000128 if {$::perm::testmode ne "" && [lsearch $::perm::testmode $name]<0} {
129 puts "skipping permutation test $name..."
130 return
131 }
danielk19771077e3f2008-06-21 18:07:37 +0000132
danielk19771077e3f2008-06-21 18:07:37 +0000133 uplevel $options(-initialize)
134 set ::permutations_presql $options(-presql)
135
danielk1977c1def3e2008-08-30 13:25:10 +0000136 foreach file [lsort $options(-include)] {
drh0a846f92008-08-25 17:23:29 +0000137 if {[lsearch $options(-exclude) $file] < 0 &&
138 ( $::perm::testfile eq "" ||
139 $::perm::testfile eq $file ||
140 "$::perm::testfile.test" eq $file )
141 } {
danielk1977c1def3e2008-08-30 13:25:10 +0000142 set ::perm::shared_cache_setting [shared_cache_setting]
danielk19771077e3f2008-06-21 18:07:37 +0000143 uplevel source $::testdir/$file
danielk1977c1def3e2008-08-30 13:25:10 +0000144 if {$::perm::shared_cache_setting ne [shared_cache_setting]} {
145 error "File $::testdir/$file changed the shared cache setting from $::perm::shared_cache_setting to [shared_cache_setting]"
146 }
drh0a846f92008-08-25 17:23:29 +0000147 } else {
148 # puts "skipping file $file"
danielk19771077e3f2008-06-21 18:07:37 +0000149 }
150 }
151
152 uplevel $options(-shutdown)
153}
154
danielk1977c1def3e2008-08-30 13:25:10 +0000155proc shared_cache_setting {} {
156 set ret 0
157 catch {
158 set ret [sqlite3_enable_shared_cache]
159 }
160 return $ret
161}
162
danielk19771077e3f2008-06-21 18:07:37 +0000163#############################################################################
164# Start of tests
165
166# Run some tests using pre-allocated page and scratch blocks.
167#
168run_tests "memsubsys1" -description {
169 Tests using pre-allocated page and scratch blocks
danielk1977801880f2008-08-21 15:54:01 +0000170} -exclude {
171 ioerr5.test
172 malloc5.test
danielk19771077e3f2008-06-21 18:07:37 +0000173} -initialize {
drhd63bd752008-07-30 13:15:46 +0000174 catch {db close}
danielk19771077e3f2008-06-21 18:07:37 +0000175 sqlite3_shutdown
176 sqlite3_config_pagecache 4096 24
177 sqlite3_config_scratch 25000 1
178 sqlite3_initialize
danielk19771077e3f2008-06-21 18:07:37 +0000179} -shutdown {
180 catch {db close}
181 sqlite3_shutdown
182 sqlite3_config_pagecache 0 0
183 sqlite3_config_scratch 0 0
184 sqlite3_initialize
185}
186
187# Run some tests using pre-allocated page and scratch blocks. This time
188# the allocations are too small to use in most cases.
189#
danielk197734c61e62008-08-29 12:00:20 +0000190# Both ioerr5.test and malloc5.test are excluded because they test the
191# sqlite3_soft_heap_limit() and sqlite3_release_memory() functionality.
192# This functionality is disabled if a pre-allocated page block is provided.
193#
danielk19771077e3f2008-06-21 18:07:37 +0000194run_tests "memsubsys2" -description {
195 Tests using small pre-allocated page and scratch blocks
danielk197734c61e62008-08-29 12:00:20 +0000196} -exclude {
197 ioerr5.test
198 malloc5.test
danielk19771077e3f2008-06-21 18:07:37 +0000199} -initialize {
drhd63bd752008-07-30 13:15:46 +0000200 catch {db close}
danielk19771077e3f2008-06-21 18:07:37 +0000201 sqlite3_shutdown
202 sqlite3_config_pagecache 512 5
203 sqlite3_config_scratch 1000 1
204 sqlite3_initialize
danielk19771077e3f2008-06-21 18:07:37 +0000205} -shutdown {
206 catch {db close}
207 sqlite3_shutdown
208 sqlite3_config_pagecache 0 0
209 sqlite3_config_scratch 0 0
210 sqlite3_initialize
211}
212
drhe2a7c6e2008-08-01 15:06:30 +0000213# Run all tests with the lookaside allocator disabled.
214#
215run_tests "memsubsys3" -description {
216 OOM tests with lookaside disabled
217} -include {
218 malloc.test
219 malloc3.test
220 malloc4.test
221 malloc5.test
222 malloc6.test
223 malloc7.test
224 malloc8.test
225 malloc9.test
226 mallocA.test
227 mallocB.test
228 mallocC.test
229 mallocD.test
230 mallocE.test
231 mallocF.test
232 mallocG.test
233} -initialize {
234 catch {db close}
235 sqlite3_shutdown
236 sqlite3_config_lookaside 0 0
237 sqlite3_initialize
238} -shutdown {
239 catch {db close}
240 sqlite3_shutdown
241 sqlite3_config_lookaside 100 500
242 sqlite3_initialize
243}
244
danielk19771077e3f2008-06-21 18:07:37 +0000245# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
246#
247run_tests "singlethread" -description {
248 Tests run in SQLITE_CONFIG_SINGLETHREAD mode
249} -initialize {
250 do_test mutex2-singlethread.0 {
251 catch {db close}
252 sqlite3_shutdown
253 sqlite3_config singlethread
254 } SQLITE_OK
255} -include {
256 delete.test delete2.test insert.test rollback.test select1.test
257 select2.test trans.test update.test vacuum.test types.test
258 types2.test types3.test
259} -shutdown {
260 do_test mutex2-X {
261 catch {db close}
262 sqlite3_shutdown
263 sqlite3_config serialized
264 } SQLITE_OK
265}
266
danielk19779a6284c2008-07-10 17:52:49 +0000267run_tests "nomutex" -description {
268 Tests run with the SQLITE_OPEN_SINGLETHREADED flag passed to sqlite3_open().
269} -initialize {
270 rename sqlite3 sqlite3_nomutex
271 proc sqlite3 {args} {
272 if {[string range [lindex $args 0] 0 0] ne "-"} {
273 lappend args -nomutex 1
274 }
275 uplevel [concat sqlite3_nomutex $args]
276 }
277} -include {
278 delete.test delete2.test insert.test rollback.test select1.test
279 select2.test trans.test update.test vacuum.test types.test
280 types2.test types3.test
281} -shutdown {
282 rename sqlite3 {}
283 rename sqlite3_nomutex sqlite3
284}
285
danielk19771077e3f2008-06-21 18:07:37 +0000286# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
287#
288run_tests "multithread" -description {
289 Tests run in SQLITE_CONFIG_MULTITHREAD mode
290} -initialize {
291 do_test mutex2-multithread.0 {
292 catch {db close}
293 sqlite3_shutdown
294 sqlite3_config multithread
295 } SQLITE_OK
296} -include {
297 delete.test delete2.test insert.test rollback.test select1.test
298 select2.test trans.test update.test vacuum.test types.test
299 types2.test types3.test
300} -shutdown {
301 do_test mutex2-X {
302 catch {db close}
303 sqlite3_shutdown
304 sqlite3_config serialized
305 } SQLITE_OK
306}
307
308# Run some tests using the "onefile" demo.
309#
310run_tests "onefile" -description {
311 Run some tests using the "test_onefile.c" demo
312} -initialize {
313 rename sqlite3 sqlite3_onefile
314 proc sqlite3 {args} {
315 if {[string range [lindex $args 0] 0 0] ne "-"} {
316 lappend args -vfs fs
317 }
318 uplevel [concat sqlite3_onefile $args]
319 }
320} -include {
321 conflict.test insert.test insert2.test insert3.test
322 rollback.test select1.test select2.test select3.test
danielk19771077e3f2008-06-21 18:07:37 +0000323} -shutdown {
324 rename sqlite3 {}
325 rename sqlite3_onefile sqlite3
326}
327
328# Run some tests using UTF-16 databases.
329#
330run_tests "utf16" -description {
331 Run tests using UTF-16 databases
danielk19772dd6d802008-06-21 19:10:27 +0000332} -presql {
danielk19771077e3f2008-06-21 18:07:37 +0000333 pragma encoding = 'UTF-16'
334} -include {
335 alter.test alter3.test
336 auth.test bind.test blob.test capi2.test capi3.test collate1.test
337 collate2.test collate3.test collate4.test collate5.test collate6.test
338 conflict.test date.test delete.test expr.test fkey1.test func.test
339 hook.test index.test insert2.test insert.test interrupt.test in.test
340 intpkey.test ioerr.test join2.test join.test lastinsert.test
341 laststmtchanges.test limit.test lock2.test lock.test main.test
342 memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
343 null.test progress.test quote.test rowid.test select1.test select2.test
344 select3.test select4.test select5.test select6.test sort.test
345 subselect.test tableapi.test table.test temptable.test
346 trace.test trigger1.test trigger2.test trigger3.test
347 trigger4.test types2.test types.test unique.test update.test
348 vacuum.test view.test where.test
349}
350
351# Run some tests in exclusive locking mode.
352#
353run_tests "exclusive" -description {
354 Run tests in exclusive locking mode.
355} -presql {
356 pragma locking_mode = 'exclusive'
357} -include {
358 rollback.test select1.test select2.test
359 malloc.test ioerr.test
360}
361
362# Run some tests in persistent journal mode.
363#
364run_tests "persistent_journal" -description {
365 Run tests in persistent-journal mode.
366} -presql {
367 pragma journal_mode = persist
368} -include {
369 delete.test delete2.test insert.test rollback.test select1.test
370 select2.test trans.test update.test vacuum.test
371}
372
373# Run some error tests in persistent journal mode.
374#
375run_tests "persistent_journal_error" -description {
376 Run malloc.test and ioerr.test in persistent-journal mode.
377} -presql {
378 pragma journal_mode = persist
379} -include {
380 malloc.test ioerr.test
381}
382
383# Run some tests in no journal mode.
384#
385run_tests "no_journal" -description {
386 Run tests in no-journal mode.
387} -presql {
388 pragma journal_mode = persist
389} -include {
390 delete.test delete2.test insert.test rollback.test select1.test
391 select2.test trans.test update.test vacuum.test
392}
393
394# Run some error tests in no journal mode.
395#
396run_tests "no_journal_error" -description {
397 Run malloc.test and ioerr.test in no-journal mode.
398} -presql {
399 pragma journal_mode = persist
400} -include {
401 malloc.test ioerr.test
402}
403
404# Run some crash-tests in autovacuum mode.
405#
406run_tests "autovacuum_crash" -description {
407 Run crash.test in autovacuum mode.
408} -presql {
409 pragma auto_vacuum = 1
410} -include crash.test
411
412# Run some ioerr-tests in autovacuum mode.
413#
414run_tests "autovacuum_ioerr" -description {
415 Run ioerr.test in autovacuum mode.
416} -presql {
417 pragma auto_vacuum = 1
418} -include ioerr.test
419
danielk19776b39c2e2008-06-25 14:57:53 +0000420ifcapable mem3 {
421 run_tests "memsys3" -description {
422 Run tests using the allocator in mem3.c.
423 } -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000424 autovacuum.test delete3.test manydb.test
425 bigrow.test incrblob2.test memdb.test
426 bitvec.test index2.test memsubsys1.test
427 capi3c.test ioerr.test memsubsys2.test
428 capi3.test join3.test pagesize.test
429 collate5.test limit.test
danielk19776b39c2e2008-06-25 14:57:53 +0000430 } -initialize {
431 catch {db close}
432 sqlite3_reset_auto_extension
433 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000434 sqlite3_config_heap 25000000 0
drhe2a7c6e2008-08-01 15:06:30 +0000435 sqlite3_config_lookaside 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000436 install_malloc_faultsim 1
437 sqlite3_initialize
438 autoinstall_test_functions
439 } -shutdown {
440 catch {db close}
441 sqlite3_reset_auto_extension
442 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000443 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000444 sqlite3_config_lookaside 100 500
danielk19776b39c2e2008-06-25 14:57:53 +0000445 install_malloc_faultsim 1
446 sqlite3_initialize
447 }
danielk197757e5ea92008-06-24 19:02:55 +0000448}
449
danielk19776b39c2e2008-06-25 14:57:53 +0000450ifcapable mem5 {
451 run_tests "memsys5" -description {
452 Run tests using the allocator in mem5.c.
453 } -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000454 autovacuum.test delete3.test manydb.test
455 bigrow.test incrblob2.test memdb.test
456 bitvec.test index2.test memsubsys1.test
457 capi3c.test ioerr.test memsubsys2.test
458 capi3.test join3.test pagesize.test
459 collate5.test limit.test
danielk19776b39c2e2008-06-25 14:57:53 +0000460 } -initialize {
461 catch {db close}
462 sqlite3_reset_auto_extension
463 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000464 sqlite3_config_heap 25000000 64
drhe2a7c6e2008-08-01 15:06:30 +0000465 sqlite3_config_lookaside 0 0
danielk19775099be52008-06-27 13:27:03 +0000466 install_malloc_faultsim 1
467 sqlite3_initialize
468 autoinstall_test_functions
469 } -shutdown {
470 catch {db close}
471 sqlite3_reset_auto_extension
472 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000473 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000474 sqlite3_config_lookaside 100 500
danielk19775099be52008-06-27 13:27:03 +0000475 install_malloc_faultsim 1
476 sqlite3_initialize
477 }
478
479 run_tests "memsys5-2" -description {
480 Run tests using the allocator in mem5.c in a different configuration.
drh8a42cbd2008-07-10 18:13:42 +0000481 } -include {
482 select1.test
danielk19775099be52008-06-27 13:27:03 +0000483 } -initialize {
484 catch {db close}
485 sqlite3_reset_auto_extension
486 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000487 sqlite3_config_heap 40000000 16
drhe2a7c6e2008-08-01 15:06:30 +0000488 sqlite3_config_lookaside 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000489 install_malloc_faultsim 1
490 sqlite3_initialize
491 autoinstall_test_functions
492 } -shutdown {
493 catch {db close}
494 sqlite3_reset_auto_extension
495 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000496 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000497 sqlite3_config_lookaside 100 500
danielk19776b39c2e2008-06-25 14:57:53 +0000498 install_malloc_faultsim 1
499 sqlite3_initialize
500 }
danielk1977c66c0e12008-06-25 14:26:07 +0000501}
502
drh8a42cbd2008-07-10 18:13:42 +0000503ifcapable threadsafe {
504 run_tests "no_mutex_try" -description {
505 The sqlite3_mutex_try() interface always fails
drh0a846f92008-08-25 17:23:29 +0000506 } -exclude [concat $EXCLUDE mutex1.test mutex2.test] \
507 -initialize {
drh8a42cbd2008-07-10 18:13:42 +0000508 catch {db close}
509 sqlite3_shutdown
510 install_mutex_counters 1
511 set ::disable_mutex_try 1
512 } -shutdown {
513 catch {db close}
514 sqlite3_shutdown
515 install_mutex_counters 0
516 }
517}
518
danielk197789697182008-07-24 10:11:27 +0000519run_tests "memsys6" -description {
520 Run tests using the allocator in mem6.c.
danielk1977fae89172008-07-24 10:32:30 +0000521} -exclude {
522 capi3.test capi3c.test
danielk197789697182008-07-24 10:11:27 +0000523} -initialize {
524 catch {db close}
525 sqlite3_reset_auto_extension
526 sqlite3_shutdown
danielk197731fab4f2008-07-25 08:48:59 +0000527 sqlite3_config_chunkalloc 0
danielk197789697182008-07-24 10:11:27 +0000528 install_malloc_faultsim 1
529 sqlite3_initialize
530 autoinstall_test_functions
531} -shutdown {
532 catch {db close}
533 sqlite3_reset_auto_extension
534 sqlite3_shutdown
535 sqlite3_config_heap 0 0
536 install_malloc_faultsim 1
537 sqlite3_initialize
538}
danielk19772d340812008-07-24 08:20:40 +0000539
danielk1977b13dee92008-06-23 15:55:52 +0000540# run_tests "crash_safe_append" -description {
541# Run crash.test with persistent journals on a SAFE_APPEND file-system.
542# } -initialize {
543# rename crashsql sa_crashsql
544# proc crashsql {args} {
545# set options [lrange $args 0 [expr {[llength $args]-2}]]
546# lappend options -char safe_append
547# set sql [lindex $args end]
548# lappend options "
549# PRAGMA journal_mode=persistent;
550# $sql
551# "
552# set fd [open test.db-journal w]
553# puts $fd [string repeat 1234567890 100000]
554# close $fd
555# eval sa_crashsql $options
556# }
557# } -shutdown {
558# rename crashsql {}
559# rename sa_crashsql crashsql
560# } -include crash.test
561
562
danielk19771077e3f2008-06-21 18:07:37 +0000563# End of tests
564#############################################################################
565
drh0a846f92008-08-25 17:23:29 +0000566if {$::perm::testmode eq "targets"} { puts "" ; exit }
danielk19771077e3f2008-06-21 18:07:37 +0000567
568# Restore the [sqlite3] command.
569#
570rename sqlite3 {}
571rename really_sqlite3 sqlite3
572
573# Restore the [finish_test] command.
574#
575rename finish_test ""
576rename really_finish_test2 finish_test
577
578# Restore the [do_test] command.
579#
580rename do_test ""
581rename really_do_test do_test
582
583finish_test