blob: 775f0eea05df9896f115b7201374979413f13d2d [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#
danielk197734c61e62008-08-29 12:00:20 +000012# $Id: permutations.test,v 1.25 2008/08/29 12:00:20 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
136 foreach file $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 } {
danielk19771077e3f2008-06-21 18:07:37 +0000142 uplevel source $::testdir/$file
drh0a846f92008-08-25 17:23:29 +0000143 } else {
144 # puts "skipping file $file"
danielk19771077e3f2008-06-21 18:07:37 +0000145 }
146 }
147
148 uplevel $options(-shutdown)
149}
150
151#############################################################################
152# Start of tests
153
154# Run some tests using pre-allocated page and scratch blocks.
155#
156run_tests "memsubsys1" -description {
157 Tests using pre-allocated page and scratch blocks
danielk1977801880f2008-08-21 15:54:01 +0000158} -exclude {
159 ioerr5.test
160 malloc5.test
danielk19771077e3f2008-06-21 18:07:37 +0000161} -initialize {
drhd63bd752008-07-30 13:15:46 +0000162 catch {db close}
danielk19771077e3f2008-06-21 18:07:37 +0000163 sqlite3_shutdown
164 sqlite3_config_pagecache 4096 24
165 sqlite3_config_scratch 25000 1
166 sqlite3_initialize
danielk19771077e3f2008-06-21 18:07:37 +0000167} -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 using pre-allocated page and scratch blocks. This time
176# the allocations are too small to use in most cases.
177#
danielk197734c61e62008-08-29 12:00:20 +0000178# Both ioerr5.test and malloc5.test are excluded because they test the
179# sqlite3_soft_heap_limit() and sqlite3_release_memory() functionality.
180# This functionality is disabled if a pre-allocated page block is provided.
181#
danielk19771077e3f2008-06-21 18:07:37 +0000182run_tests "memsubsys2" -description {
183 Tests using small pre-allocated page and scratch blocks
danielk197734c61e62008-08-29 12:00:20 +0000184} -exclude {
185 ioerr5.test
186 malloc5.test
danielk19771077e3f2008-06-21 18:07:37 +0000187} -initialize {
drhd63bd752008-07-30 13:15:46 +0000188 catch {db close}
danielk19771077e3f2008-06-21 18:07:37 +0000189 sqlite3_shutdown
190 sqlite3_config_pagecache 512 5
191 sqlite3_config_scratch 1000 1
192 sqlite3_initialize
danielk19771077e3f2008-06-21 18:07:37 +0000193} -shutdown {
194 catch {db close}
195 sqlite3_shutdown
196 sqlite3_config_pagecache 0 0
197 sqlite3_config_scratch 0 0
198 sqlite3_initialize
199}
200
drhe2a7c6e2008-08-01 15:06:30 +0000201# Run all tests with the lookaside allocator disabled.
202#
203run_tests "memsubsys3" -description {
204 OOM tests with lookaside disabled
205} -include {
206 malloc.test
207 malloc3.test
208 malloc4.test
209 malloc5.test
210 malloc6.test
211 malloc7.test
212 malloc8.test
213 malloc9.test
214 mallocA.test
215 mallocB.test
216 mallocC.test
217 mallocD.test
218 mallocE.test
219 mallocF.test
220 mallocG.test
221} -initialize {
222 catch {db close}
223 sqlite3_shutdown
224 sqlite3_config_lookaside 0 0
225 sqlite3_initialize
226} -shutdown {
227 catch {db close}
228 sqlite3_shutdown
229 sqlite3_config_lookaside 100 500
230 sqlite3_initialize
231}
232
danielk19771077e3f2008-06-21 18:07:37 +0000233# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
234#
235run_tests "singlethread" -description {
236 Tests run in SQLITE_CONFIG_SINGLETHREAD mode
237} -initialize {
238 do_test mutex2-singlethread.0 {
239 catch {db close}
240 sqlite3_shutdown
241 sqlite3_config singlethread
242 } SQLITE_OK
243} -include {
244 delete.test delete2.test insert.test rollback.test select1.test
245 select2.test trans.test update.test vacuum.test types.test
246 types2.test types3.test
247} -shutdown {
248 do_test mutex2-X {
249 catch {db close}
250 sqlite3_shutdown
251 sqlite3_config serialized
252 } SQLITE_OK
253}
254
danielk19779a6284c2008-07-10 17:52:49 +0000255run_tests "nomutex" -description {
256 Tests run with the SQLITE_OPEN_SINGLETHREADED flag passed to sqlite3_open().
257} -initialize {
258 rename sqlite3 sqlite3_nomutex
259 proc sqlite3 {args} {
260 if {[string range [lindex $args 0] 0 0] ne "-"} {
261 lappend args -nomutex 1
262 }
263 uplevel [concat sqlite3_nomutex $args]
264 }
265} -include {
266 delete.test delete2.test insert.test rollback.test select1.test
267 select2.test trans.test update.test vacuum.test types.test
268 types2.test types3.test
269} -shutdown {
270 rename sqlite3 {}
271 rename sqlite3_nomutex sqlite3
272}
273
danielk19771077e3f2008-06-21 18:07:37 +0000274# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
275#
276run_tests "multithread" -description {
277 Tests run in SQLITE_CONFIG_MULTITHREAD mode
278} -initialize {
279 do_test mutex2-multithread.0 {
280 catch {db close}
281 sqlite3_shutdown
282 sqlite3_config multithread
283 } SQLITE_OK
284} -include {
285 delete.test delete2.test insert.test rollback.test select1.test
286 select2.test trans.test update.test vacuum.test types.test
287 types2.test types3.test
288} -shutdown {
289 do_test mutex2-X {
290 catch {db close}
291 sqlite3_shutdown
292 sqlite3_config serialized
293 } SQLITE_OK
294}
295
296# Run some tests using the "onefile" demo.
297#
298run_tests "onefile" -description {
299 Run some tests using the "test_onefile.c" demo
300} -initialize {
301 rename sqlite3 sqlite3_onefile
302 proc sqlite3 {args} {
303 if {[string range [lindex $args 0] 0 0] ne "-"} {
304 lappend args -vfs fs
305 }
306 uplevel [concat sqlite3_onefile $args]
307 }
308} -include {
309 conflict.test insert.test insert2.test insert3.test
310 rollback.test select1.test select2.test select3.test
danielk19771077e3f2008-06-21 18:07:37 +0000311} -shutdown {
312 rename sqlite3 {}
313 rename sqlite3_onefile sqlite3
314}
315
316# Run some tests using UTF-16 databases.
317#
318run_tests "utf16" -description {
319 Run tests using UTF-16 databases
danielk19772dd6d802008-06-21 19:10:27 +0000320} -presql {
danielk19771077e3f2008-06-21 18:07:37 +0000321 pragma encoding = 'UTF-16'
322} -include {
323 alter.test alter3.test
324 auth.test bind.test blob.test capi2.test capi3.test collate1.test
325 collate2.test collate3.test collate4.test collate5.test collate6.test
326 conflict.test date.test delete.test expr.test fkey1.test func.test
327 hook.test index.test insert2.test insert.test interrupt.test in.test
328 intpkey.test ioerr.test join2.test join.test lastinsert.test
329 laststmtchanges.test limit.test lock2.test lock.test main.test
330 memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
331 null.test progress.test quote.test rowid.test select1.test select2.test
332 select3.test select4.test select5.test select6.test sort.test
333 subselect.test tableapi.test table.test temptable.test
334 trace.test trigger1.test trigger2.test trigger3.test
335 trigger4.test types2.test types.test unique.test update.test
336 vacuum.test view.test where.test
337}
338
339# Run some tests in exclusive locking mode.
340#
341run_tests "exclusive" -description {
342 Run tests in exclusive locking mode.
343} -presql {
344 pragma locking_mode = 'exclusive'
345} -include {
346 rollback.test select1.test select2.test
347 malloc.test ioerr.test
348}
349
350# Run some tests in persistent journal mode.
351#
352run_tests "persistent_journal" -description {
353 Run tests in persistent-journal mode.
354} -presql {
355 pragma journal_mode = persist
356} -include {
357 delete.test delete2.test insert.test rollback.test select1.test
358 select2.test trans.test update.test vacuum.test
359}
360
361# Run some error tests in persistent journal mode.
362#
363run_tests "persistent_journal_error" -description {
364 Run malloc.test and ioerr.test in persistent-journal mode.
365} -presql {
366 pragma journal_mode = persist
367} -include {
368 malloc.test ioerr.test
369}
370
371# Run some tests in no journal mode.
372#
373run_tests "no_journal" -description {
374 Run tests in no-journal mode.
375} -presql {
376 pragma journal_mode = persist
377} -include {
378 delete.test delete2.test insert.test rollback.test select1.test
379 select2.test trans.test update.test vacuum.test
380}
381
382# Run some error tests in no journal mode.
383#
384run_tests "no_journal_error" -description {
385 Run malloc.test and ioerr.test in no-journal mode.
386} -presql {
387 pragma journal_mode = persist
388} -include {
389 malloc.test ioerr.test
390}
391
392# Run some crash-tests in autovacuum mode.
393#
394run_tests "autovacuum_crash" -description {
395 Run crash.test in autovacuum mode.
396} -presql {
397 pragma auto_vacuum = 1
398} -include crash.test
399
400# Run some ioerr-tests in autovacuum mode.
401#
402run_tests "autovacuum_ioerr" -description {
403 Run ioerr.test in autovacuum mode.
404} -presql {
405 pragma auto_vacuum = 1
406} -include ioerr.test
407
danielk19776b39c2e2008-06-25 14:57:53 +0000408ifcapable mem3 {
409 run_tests "memsys3" -description {
410 Run tests using the allocator in mem3.c.
411 } -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000412 autovacuum.test delete3.test manydb.test
413 bigrow.test incrblob2.test memdb.test
414 bitvec.test index2.test memsubsys1.test
415 capi3c.test ioerr.test memsubsys2.test
416 capi3.test join3.test pagesize.test
417 collate5.test limit.test
danielk19776b39c2e2008-06-25 14:57:53 +0000418 } -initialize {
419 catch {db close}
420 sqlite3_reset_auto_extension
421 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000422 sqlite3_config_heap 25000000 0
drhe2a7c6e2008-08-01 15:06:30 +0000423 sqlite3_config_lookaside 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000424 install_malloc_faultsim 1
425 sqlite3_initialize
426 autoinstall_test_functions
427 } -shutdown {
428 catch {db close}
429 sqlite3_reset_auto_extension
430 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000431 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000432 sqlite3_config_lookaside 100 500
danielk19776b39c2e2008-06-25 14:57:53 +0000433 install_malloc_faultsim 1
434 sqlite3_initialize
435 }
danielk197757e5ea92008-06-24 19:02:55 +0000436}
437
danielk19776b39c2e2008-06-25 14:57:53 +0000438ifcapable mem5 {
439 run_tests "memsys5" -description {
440 Run tests using the allocator in mem5.c.
441 } -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000442 autovacuum.test delete3.test manydb.test
443 bigrow.test incrblob2.test memdb.test
444 bitvec.test index2.test memsubsys1.test
445 capi3c.test ioerr.test memsubsys2.test
446 capi3.test join3.test pagesize.test
447 collate5.test limit.test
danielk19776b39c2e2008-06-25 14:57:53 +0000448 } -initialize {
449 catch {db close}
450 sqlite3_reset_auto_extension
451 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000452 sqlite3_config_heap 25000000 64
drhe2a7c6e2008-08-01 15:06:30 +0000453 sqlite3_config_lookaside 0 0
danielk19775099be52008-06-27 13:27:03 +0000454 install_malloc_faultsim 1
455 sqlite3_initialize
456 autoinstall_test_functions
457 } -shutdown {
458 catch {db close}
459 sqlite3_reset_auto_extension
460 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000461 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000462 sqlite3_config_lookaside 100 500
danielk19775099be52008-06-27 13:27:03 +0000463 install_malloc_faultsim 1
464 sqlite3_initialize
465 }
466
467 run_tests "memsys5-2" -description {
468 Run tests using the allocator in mem5.c in a different configuration.
drh8a42cbd2008-07-10 18:13:42 +0000469 } -include {
470 select1.test
danielk19775099be52008-06-27 13:27:03 +0000471 } -initialize {
472 catch {db close}
473 sqlite3_reset_auto_extension
474 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000475 sqlite3_config_heap 40000000 16
drhe2a7c6e2008-08-01 15:06:30 +0000476 sqlite3_config_lookaside 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000477 install_malloc_faultsim 1
478 sqlite3_initialize
479 autoinstall_test_functions
480 } -shutdown {
481 catch {db close}
482 sqlite3_reset_auto_extension
483 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000484 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000485 sqlite3_config_lookaside 100 500
danielk19776b39c2e2008-06-25 14:57:53 +0000486 install_malloc_faultsim 1
487 sqlite3_initialize
488 }
danielk1977c66c0e12008-06-25 14:26:07 +0000489}
490
drh8a42cbd2008-07-10 18:13:42 +0000491ifcapable threadsafe {
492 run_tests "no_mutex_try" -description {
493 The sqlite3_mutex_try() interface always fails
drh0a846f92008-08-25 17:23:29 +0000494 } -exclude [concat $EXCLUDE mutex1.test mutex2.test] \
495 -initialize {
drh8a42cbd2008-07-10 18:13:42 +0000496 catch {db close}
497 sqlite3_shutdown
498 install_mutex_counters 1
499 set ::disable_mutex_try 1
500 } -shutdown {
501 catch {db close}
502 sqlite3_shutdown
503 install_mutex_counters 0
504 }
505}
506
danielk197789697182008-07-24 10:11:27 +0000507run_tests "memsys6" -description {
508 Run tests using the allocator in mem6.c.
danielk1977fae89172008-07-24 10:32:30 +0000509} -exclude {
510 capi3.test capi3c.test
danielk197789697182008-07-24 10:11:27 +0000511} -initialize {
512 catch {db close}
513 sqlite3_reset_auto_extension
514 sqlite3_shutdown
danielk197731fab4f2008-07-25 08:48:59 +0000515 sqlite3_config_chunkalloc 0
danielk197789697182008-07-24 10:11:27 +0000516 install_malloc_faultsim 1
517 sqlite3_initialize
518 autoinstall_test_functions
519} -shutdown {
520 catch {db close}
521 sqlite3_reset_auto_extension
522 sqlite3_shutdown
523 sqlite3_config_heap 0 0
524 install_malloc_faultsim 1
525 sqlite3_initialize
526}
danielk19772d340812008-07-24 08:20:40 +0000527
danielk1977b13dee92008-06-23 15:55:52 +0000528# run_tests "crash_safe_append" -description {
529# Run crash.test with persistent journals on a SAFE_APPEND file-system.
530# } -initialize {
531# rename crashsql sa_crashsql
532# proc crashsql {args} {
533# set options [lrange $args 0 [expr {[llength $args]-2}]]
534# lappend options -char safe_append
535# set sql [lindex $args end]
536# lappend options "
537# PRAGMA journal_mode=persistent;
538# $sql
539# "
540# set fd [open test.db-journal w]
541# puts $fd [string repeat 1234567890 100000]
542# close $fd
543# eval sa_crashsql $options
544# }
545# } -shutdown {
546# rename crashsql {}
547# rename sa_crashsql crashsql
548# } -include crash.test
549
550
danielk19771077e3f2008-06-21 18:07:37 +0000551# End of tests
552#############################################################################
553
drh0a846f92008-08-25 17:23:29 +0000554if {$::perm::testmode eq "targets"} { puts "" ; exit }
danielk19771077e3f2008-06-21 18:07:37 +0000555
556# Restore the [sqlite3] command.
557#
558rename sqlite3 {}
559rename really_sqlite3 sqlite3
560
561# Restore the [finish_test] command.
562#
563rename finish_test ""
564rename really_finish_test2 finish_test
565
566# Restore the [do_test] command.
567#
568rename do_test ""
569rename really_do_test do_test
570
571finish_test