blob: 78110c880522429c6eaed95df454a2a9e4ab50f3 [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#
drh0a846f92008-08-25 17:23:29 +000012# $Id: permutations.test,v 1.22 2008/08/25 17:23:29 drh 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 {
21 set testmode [lindex $::argv 0]
22 set testfile [lindex $::argv 1]
23}
danielk19771077e3f2008-06-21 18:07:37 +000024set argv [lrange $argv 2 end]
drh0a846f92008-08-25 17:23:29 +000025#puts "PERM-DEBUG: testmode=$::perm::testmode"
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}
drh0a846f92008-08-25 17:23:29 +000038if {$::perm::testmode eq "all"} {
39 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}
drh0a846f92008-08-25 17:23:29 +000054puts "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#
178run_tests "memsubsys2" -description {
179 Tests using small pre-allocated page and scratch blocks
180} -initialize {
drhd63bd752008-07-30 13:15:46 +0000181 catch {db close}
danielk19771077e3f2008-06-21 18:07:37 +0000182 sqlite3_shutdown
183 sqlite3_config_pagecache 512 5
184 sqlite3_config_scratch 1000 1
185 sqlite3_initialize
danielk19771077e3f2008-06-21 18:07:37 +0000186} -shutdown {
187 catch {db close}
188 sqlite3_shutdown
189 sqlite3_config_pagecache 0 0
190 sqlite3_config_scratch 0 0
191 sqlite3_initialize
192}
193
drhe2a7c6e2008-08-01 15:06:30 +0000194# Run all tests with the lookaside allocator disabled.
195#
196run_tests "memsubsys3" -description {
197 OOM tests with lookaside disabled
198} -include {
199 malloc.test
200 malloc3.test
201 malloc4.test
202 malloc5.test
203 malloc6.test
204 malloc7.test
205 malloc8.test
206 malloc9.test
207 mallocA.test
208 mallocB.test
209 mallocC.test
210 mallocD.test
211 mallocE.test
212 mallocF.test
213 mallocG.test
214} -initialize {
215 catch {db close}
216 sqlite3_shutdown
217 sqlite3_config_lookaside 0 0
218 sqlite3_initialize
219} -shutdown {
220 catch {db close}
221 sqlite3_shutdown
222 sqlite3_config_lookaside 100 500
223 sqlite3_initialize
224}
225
danielk19771077e3f2008-06-21 18:07:37 +0000226# Run some tests in SQLITE_CONFIG_SINGLETHREAD mode.
227#
228run_tests "singlethread" -description {
229 Tests run in SQLITE_CONFIG_SINGLETHREAD mode
230} -initialize {
231 do_test mutex2-singlethread.0 {
232 catch {db close}
233 sqlite3_shutdown
234 sqlite3_config singlethread
235 } SQLITE_OK
236} -include {
237 delete.test delete2.test insert.test rollback.test select1.test
238 select2.test trans.test update.test vacuum.test types.test
239 types2.test types3.test
240} -shutdown {
241 do_test mutex2-X {
242 catch {db close}
243 sqlite3_shutdown
244 sqlite3_config serialized
245 } SQLITE_OK
246}
247
danielk19779a6284c2008-07-10 17:52:49 +0000248run_tests "nomutex" -description {
249 Tests run with the SQLITE_OPEN_SINGLETHREADED flag passed to sqlite3_open().
250} -initialize {
251 rename sqlite3 sqlite3_nomutex
252 proc sqlite3 {args} {
253 if {[string range [lindex $args 0] 0 0] ne "-"} {
254 lappend args -nomutex 1
255 }
256 uplevel [concat sqlite3_nomutex $args]
257 }
258} -include {
259 delete.test delete2.test insert.test rollback.test select1.test
260 select2.test trans.test update.test vacuum.test types.test
261 types2.test types3.test
262} -shutdown {
263 rename sqlite3 {}
264 rename sqlite3_nomutex sqlite3
265}
266
danielk19771077e3f2008-06-21 18:07:37 +0000267# Run some tests in SQLITE_CONFIG_MULTITHREAD mode.
268#
269run_tests "multithread" -description {
270 Tests run in SQLITE_CONFIG_MULTITHREAD mode
271} -initialize {
272 do_test mutex2-multithread.0 {
273 catch {db close}
274 sqlite3_shutdown
275 sqlite3_config multithread
276 } SQLITE_OK
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 do_test mutex2-X {
283 catch {db close}
284 sqlite3_shutdown
285 sqlite3_config serialized
286 } SQLITE_OK
287}
288
289# Run some tests using the "onefile" demo.
290#
291run_tests "onefile" -description {
292 Run some tests using the "test_onefile.c" demo
293} -initialize {
294 rename sqlite3 sqlite3_onefile
295 proc sqlite3 {args} {
296 if {[string range [lindex $args 0] 0 0] ne "-"} {
297 lappend args -vfs fs
298 }
299 uplevel [concat sqlite3_onefile $args]
300 }
301} -include {
302 conflict.test insert.test insert2.test insert3.test
303 rollback.test select1.test select2.test select3.test
304 temptable.test
305} -shutdown {
306 rename sqlite3 {}
307 rename sqlite3_onefile sqlite3
308}
309
310# Run some tests using UTF-16 databases.
311#
312run_tests "utf16" -description {
313 Run tests using UTF-16 databases
danielk19772dd6d802008-06-21 19:10:27 +0000314} -presql {
danielk19771077e3f2008-06-21 18:07:37 +0000315 pragma encoding = 'UTF-16'
316} -include {
317 alter.test alter3.test
318 auth.test bind.test blob.test capi2.test capi3.test collate1.test
319 collate2.test collate3.test collate4.test collate5.test collate6.test
320 conflict.test date.test delete.test expr.test fkey1.test func.test
321 hook.test index.test insert2.test insert.test interrupt.test in.test
322 intpkey.test ioerr.test join2.test join.test lastinsert.test
323 laststmtchanges.test limit.test lock2.test lock.test main.test
324 memdb.test minmax.test misc1.test misc2.test misc3.test notnull.test
325 null.test progress.test quote.test rowid.test select1.test select2.test
326 select3.test select4.test select5.test select6.test sort.test
327 subselect.test tableapi.test table.test temptable.test
328 trace.test trigger1.test trigger2.test trigger3.test
329 trigger4.test types2.test types.test unique.test update.test
330 vacuum.test view.test where.test
331}
332
333# Run some tests in exclusive locking mode.
334#
335run_tests "exclusive" -description {
336 Run tests in exclusive locking mode.
337} -presql {
338 pragma locking_mode = 'exclusive'
339} -include {
340 rollback.test select1.test select2.test
341 malloc.test ioerr.test
342}
343
344# Run some tests in persistent journal mode.
345#
346run_tests "persistent_journal" -description {
347 Run tests in persistent-journal mode.
348} -presql {
349 pragma journal_mode = persist
350} -include {
351 delete.test delete2.test insert.test rollback.test select1.test
352 select2.test trans.test update.test vacuum.test
353}
354
355# Run some error tests in persistent journal mode.
356#
357run_tests "persistent_journal_error" -description {
358 Run malloc.test and ioerr.test in persistent-journal mode.
359} -presql {
360 pragma journal_mode = persist
361} -include {
362 malloc.test ioerr.test
363}
364
365# Run some tests in no journal mode.
366#
367run_tests "no_journal" -description {
368 Run tests in no-journal mode.
369} -presql {
370 pragma journal_mode = persist
371} -include {
372 delete.test delete2.test insert.test rollback.test select1.test
373 select2.test trans.test update.test vacuum.test
374}
375
376# Run some error tests in no journal mode.
377#
378run_tests "no_journal_error" -description {
379 Run malloc.test and ioerr.test in no-journal mode.
380} -presql {
381 pragma journal_mode = persist
382} -include {
383 malloc.test ioerr.test
384}
385
386# Run some crash-tests in autovacuum mode.
387#
388run_tests "autovacuum_crash" -description {
389 Run crash.test in autovacuum mode.
390} -presql {
391 pragma auto_vacuum = 1
392} -include crash.test
393
394# Run some ioerr-tests in autovacuum mode.
395#
396run_tests "autovacuum_ioerr" -description {
397 Run ioerr.test in autovacuum mode.
398} -presql {
399 pragma auto_vacuum = 1
400} -include ioerr.test
401
danielk19776b39c2e2008-06-25 14:57:53 +0000402ifcapable mem3 {
403 run_tests "memsys3" -description {
404 Run tests using the allocator in mem3.c.
405 } -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000406 autovacuum.test delete3.test manydb.test
407 bigrow.test incrblob2.test memdb.test
408 bitvec.test index2.test memsubsys1.test
409 capi3c.test ioerr.test memsubsys2.test
410 capi3.test join3.test pagesize.test
411 collate5.test limit.test
danielk19776b39c2e2008-06-25 14:57:53 +0000412 } -initialize {
413 catch {db close}
414 sqlite3_reset_auto_extension
415 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000416 sqlite3_config_heap 25000000 0
drhe2a7c6e2008-08-01 15:06:30 +0000417 sqlite3_config_lookaside 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000418 install_malloc_faultsim 1
419 sqlite3_initialize
420 autoinstall_test_functions
421 } -shutdown {
422 catch {db close}
423 sqlite3_reset_auto_extension
424 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000425 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000426 sqlite3_config_lookaside 100 500
danielk19776b39c2e2008-06-25 14:57:53 +0000427 install_malloc_faultsim 1
428 sqlite3_initialize
429 }
danielk197757e5ea92008-06-24 19:02:55 +0000430}
431
danielk19776b39c2e2008-06-25 14:57:53 +0000432ifcapable mem5 {
433 run_tests "memsys5" -description {
434 Run tests using the allocator in mem5.c.
435 } -exclude {
drh8a42cbd2008-07-10 18:13:42 +0000436 autovacuum.test delete3.test manydb.test
437 bigrow.test incrblob2.test memdb.test
438 bitvec.test index2.test memsubsys1.test
439 capi3c.test ioerr.test memsubsys2.test
440 capi3.test join3.test pagesize.test
441 collate5.test limit.test
danielk19776b39c2e2008-06-25 14:57:53 +0000442 } -initialize {
443 catch {db close}
444 sqlite3_reset_auto_extension
445 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000446 sqlite3_config_heap 25000000 64
drhe2a7c6e2008-08-01 15:06:30 +0000447 sqlite3_config_lookaside 0 0
danielk19775099be52008-06-27 13:27:03 +0000448 install_malloc_faultsim 1
449 sqlite3_initialize
450 autoinstall_test_functions
451 } -shutdown {
452 catch {db close}
453 sqlite3_reset_auto_extension
454 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000455 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000456 sqlite3_config_lookaside 100 500
danielk19775099be52008-06-27 13:27:03 +0000457 install_malloc_faultsim 1
458 sqlite3_initialize
459 }
460
461 run_tests "memsys5-2" -description {
462 Run tests using the allocator in mem5.c in a different configuration.
drh8a42cbd2008-07-10 18:13:42 +0000463 } -include {
464 select1.test
danielk19775099be52008-06-27 13:27:03 +0000465 } -initialize {
466 catch {db close}
467 sqlite3_reset_auto_extension
468 sqlite3_shutdown
drh7830cd42008-07-16 12:25:32 +0000469 sqlite3_config_heap 40000000 16
drhe2a7c6e2008-08-01 15:06:30 +0000470 sqlite3_config_lookaside 0 0
danielk19776b39c2e2008-06-25 14:57:53 +0000471 install_malloc_faultsim 1
472 sqlite3_initialize
473 autoinstall_test_functions
474 } -shutdown {
475 catch {db close}
476 sqlite3_reset_auto_extension
477 sqlite3_shutdown
danielk19770d84e5b2008-06-27 14:05:24 +0000478 sqlite3_config_heap 0 0
drhe2a7c6e2008-08-01 15:06:30 +0000479 sqlite3_config_lookaside 100 500
danielk19776b39c2e2008-06-25 14:57:53 +0000480 install_malloc_faultsim 1
481 sqlite3_initialize
482 }
danielk1977c66c0e12008-06-25 14:26:07 +0000483}
484
drh8a42cbd2008-07-10 18:13:42 +0000485ifcapable threadsafe {
486 run_tests "no_mutex_try" -description {
487 The sqlite3_mutex_try() interface always fails
drh0a846f92008-08-25 17:23:29 +0000488 } -exclude [concat $EXCLUDE mutex1.test mutex2.test] \
489 -initialize {
drh8a42cbd2008-07-10 18:13:42 +0000490 catch {db close}
491 sqlite3_shutdown
492 install_mutex_counters 1
493 set ::disable_mutex_try 1
494 } -shutdown {
495 catch {db close}
496 sqlite3_shutdown
497 install_mutex_counters 0
498 }
499}
500
danielk197789697182008-07-24 10:11:27 +0000501run_tests "memsys6" -description {
502 Run tests using the allocator in mem6.c.
danielk1977fae89172008-07-24 10:32:30 +0000503} -exclude {
504 capi3.test capi3c.test
danielk197789697182008-07-24 10:11:27 +0000505} -initialize {
506 catch {db close}
507 sqlite3_reset_auto_extension
508 sqlite3_shutdown
danielk197731fab4f2008-07-25 08:48:59 +0000509 sqlite3_config_chunkalloc 0
danielk197789697182008-07-24 10:11:27 +0000510 install_malloc_faultsim 1
511 sqlite3_initialize
512 autoinstall_test_functions
513} -shutdown {
514 catch {db close}
515 sqlite3_reset_auto_extension
516 sqlite3_shutdown
517 sqlite3_config_heap 0 0
518 install_malloc_faultsim 1
519 sqlite3_initialize
520}
danielk19772d340812008-07-24 08:20:40 +0000521
danielk1977b13dee92008-06-23 15:55:52 +0000522# run_tests "crash_safe_append" -description {
523# Run crash.test with persistent journals on a SAFE_APPEND file-system.
524# } -initialize {
525# rename crashsql sa_crashsql
526# proc crashsql {args} {
527# set options [lrange $args 0 [expr {[llength $args]-2}]]
528# lappend options -char safe_append
529# set sql [lindex $args end]
530# lappend options "
531# PRAGMA journal_mode=persistent;
532# $sql
533# "
534# set fd [open test.db-journal w]
535# puts $fd [string repeat 1234567890 100000]
536# close $fd
537# eval sa_crashsql $options
538# }
539# } -shutdown {
540# rename crashsql {}
541# rename sa_crashsql crashsql
542# } -include crash.test
543
544
danielk19771077e3f2008-06-21 18:07:37 +0000545# End of tests
546#############################################################################
547
drh0a846f92008-08-25 17:23:29 +0000548if {$::perm::testmode eq "targets"} { puts "" ; exit }
danielk19771077e3f2008-06-21 18:07:37 +0000549
550# Restore the [sqlite3] command.
551#
552rename sqlite3 {}
553rename really_sqlite3 sqlite3
554
555# Restore the [finish_test] command.
556#
557rename finish_test ""
558rename really_finish_test2 finish_test
559
560# Restore the [do_test] command.
561#
562rename do_test ""
563rename really_do_test do_test
564
565finish_test