| OLD | NEW |
| 1 # 2007 May 05 | 1 # 2007 May 05 |
| 2 # | 2 # |
| 3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
| 4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
| 5 # | 5 # |
| 6 # May you do good and not evil. | 6 # May you do good and not evil. |
| 7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
| 8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
| 9 # | 9 # |
| 10 #*********************************************************************** | 10 #*********************************************************************** |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 -injectuninstall cantopen_injectuninstall \ | 86 -injectuninstall cantopen_injectuninstall \ |
| 87 ] | 87 ] |
| 88 set FAULTSIM(cantopen-persistent) [list \ | 88 set FAULTSIM(cantopen-persistent) [list \ |
| 89 -injectinstall cantopen_injectinstall \ | 89 -injectinstall cantopen_injectinstall \ |
| 90 -injectstart {cantopen_injectstart 1} \ | 90 -injectstart {cantopen_injectstart 1} \ |
| 91 -injectstop cantopen_injectstop \ | 91 -injectstop cantopen_injectstop \ |
| 92 -injecterrlist {{1 {unable to open database file}}} \ | 92 -injecterrlist {{1 {unable to open database file}}} \ |
| 93 -injectuninstall cantopen_injectuninstall \ | 93 -injectuninstall cantopen_injectuninstall \ |
| 94 ] | 94 ] |
| 95 | 95 |
| 96 set FAULTSIM(interrupt) [list \ |
| 97 -injectinstall interrupt_injectinstall \ |
| 98 -injectstart interrupt_injectstart \ |
| 99 -injectstop interrupt_injectstop \ |
| 100 -injecterrlist {{1 interrupted} {1 interrupt}} \ |
| 101 -injectuninstall interrupt_injectuninstall \ |
| 102 ] |
| 103 |
| 96 | 104 |
| 97 | 105 |
| 98 #-------------------------------------------------------------------------- | 106 #-------------------------------------------------------------------------- |
| 99 # Usage do_faultsim_test NAME ?OPTIONS...? | 107 # Usage do_faultsim_test NAME ?OPTIONS...? |
| 100 # | 108 # |
| 101 # -faults List of fault types to simulate. | 109 # -faults List of fault types to simulate. |
| 102 # | 110 # |
| 103 # -prep Script to execute before -body. | 111 # -prep Script to execute before -body. |
| 104 # | 112 # |
| 105 # -body Script to execute (with fault injection). | 113 # -body Script to execute (with fault injection). |
| 106 # | 114 # |
| 107 # -test Script to execute after -body. | 115 # -test Script to execute after -body. |
| 108 # | 116 # |
| 109 # -install Script to execute after faultsim -injectinstall | 117 # -install Script to execute after faultsim -injectinstall |
| 110 # | 118 # |
| 111 # -uninstall Script to execute after faultsim -uninjectinstall | 119 # -uninstall Script to execute after faultsim -uninjectinstall |
| 112 # | 120 # |
| 113 proc do_faultsim_test {name args} { | 121 proc do_faultsim_test {name args} { |
| 114 global FAULTSIM | 122 global FAULTSIM |
| 115 | 123 |
| 116 set DEFAULT(-faults) [array names FAULTSIM] | 124 foreach n [array names FAULTSIM] { |
| 125 if {$n != "interrupt"} {lappend DEFAULT(-faults) $n} |
| 126 } |
| 117 set DEFAULT(-prep) "" | 127 set DEFAULT(-prep) "" |
| 118 set DEFAULT(-body) "" | 128 set DEFAULT(-body) "" |
| 119 set DEFAULT(-test) "" | 129 set DEFAULT(-test) "" |
| 120 set DEFAULT(-install) "" | 130 set DEFAULT(-install) "" |
| 121 set DEFAULT(-uninstall) "" | 131 set DEFAULT(-uninstall) "" |
| 122 | 132 |
| 123 fix_testname name | 133 fix_testname name |
| 124 | 134 |
| 125 array set O [array get DEFAULT] | 135 array set O [array get DEFAULT] |
| 126 array set O $args | 136 array set O $args |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 catch {db2 close} | 258 catch {db2 close} |
| 249 shmfault delete | 259 shmfault delete |
| 250 } | 260 } |
| 251 proc cantopen_injectstart {persist iFail} { | 261 proc cantopen_injectstart {persist iFail} { |
| 252 shmfault cantopen $iFail $persist | 262 shmfault cantopen $iFail $persist |
| 253 } | 263 } |
| 254 proc cantopen_injectstop {} { | 264 proc cantopen_injectstop {} { |
| 255 shmfault cantopen | 265 shmfault cantopen |
| 256 } | 266 } |
| 257 | 267 |
| 268 # The following procs are used as [do_one_faultsim_test] callbacks |
| 269 # when injecting SQLITE_INTERRUPT error faults into test cases. |
| 270 # |
| 271 proc interrupt_injectinstall {} { |
| 272 } |
| 273 proc interrupt_injectuninstall {} { |
| 274 } |
| 275 proc interrupt_injectstart {iFail} { |
| 276 set ::sqlite_interrupt_count $iFail |
| 277 } |
| 278 proc interrupt_injectstop {} { |
| 279 set res [expr $::sqlite_interrupt_count<=0] |
| 280 set ::sqlite_interrupt_count 0 |
| 281 set res |
| 282 } |
| 283 |
| 258 # This command is not called directly. It is used by the | 284 # This command is not called directly. It is used by the |
| 259 # [faultsim_test_result] command created by [do_faultsim_test] and used | 285 # [faultsim_test_result] command created by [do_faultsim_test] and used |
| 260 # by -test scripts. | 286 # by -test scripts. |
| 261 # | 287 # |
| 262 proc faultsim_test_result_int {args} { | 288 proc faultsim_test_result_int {args} { |
| 263 upvar testrc testrc testresult testresult testnfail testnfail | 289 upvar testrc testrc testresult testresult testnfail testnfail |
| 264 set t [list $testrc $testresult] | 290 set t [list $testrc $testresult] |
| 265 set r $args | 291 set r $args |
| 266 if { ($testnfail==0 && $t != [lindex $r 0]) || [lsearch $r $t]<0 } { | 292 if { ($testnfail==0 && $t != [lindex $r 0]) || [lsearch $r $t]<0 } { |
| 267 error "nfail=$testnfail rc=$testrc result=$testresult" | 293 error "nfail=$testnfail rc=$testrc result=$testresult list=$r" |
| 268 } | 294 } |
| 269 } | 295 } |
| 270 | 296 |
| 271 #-------------------------------------------------------------------------- | 297 #-------------------------------------------------------------------------- |
| 272 # Usage do_one_faultsim_test NAME ?OPTIONS...? | 298 # Usage do_one_faultsim_test NAME ?OPTIONS...? |
| 273 # | 299 # |
| 274 # The first argument, <test number>, is used as a prefix of the test names | 300 # The first argument, <test number>, is used as a prefix of the test names |
| 275 # taken by tests executed by this command. Options are as follows. All | 301 # taken by tests executed by this command. Options are as follows. All |
| 276 # options take a single argument. | 302 # options take a single argument. |
| 277 # | 303 # |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 # Nth call to sqliteMalloc() is made to fail, where N is increased | 402 # Nth call to sqliteMalloc() is made to fail, where N is increased |
| 377 # each time the loop runs starting from 1. When all commands execute | 403 # each time the loop runs starting from 1. When all commands execute |
| 378 # successfully, the loop ends. | 404 # successfully, the loop ends. |
| 379 # | 405 # |
| 380 proc do_malloc_test {tn args} { | 406 proc do_malloc_test {tn args} { |
| 381 array unset ::mallocopts | 407 array unset ::mallocopts |
| 382 array set ::mallocopts $args | 408 array set ::mallocopts $args |
| 383 | 409 |
| 384 if {[string is integer $tn]} { | 410 if {[string is integer $tn]} { |
| 385 set tn malloc-$tn | 411 set tn malloc-$tn |
| 412 catch { set tn $::testprefix-$tn } |
| 386 } | 413 } |
| 387 if {[info exists ::mallocopts(-start)]} { | 414 if {[info exists ::mallocopts(-start)]} { |
| 388 set start $::mallocopts(-start) | 415 set start $::mallocopts(-start) |
| 389 } else { | 416 } else { |
| 390 set start 0 | 417 set start 0 |
| 391 } | 418 } |
| 392 if {[info exists ::mallocopts(-end)]} { | 419 if {[info exists ::mallocopts(-end)]} { |
| 393 set end $::mallocopts(-end) | 420 set end $::mallocopts(-end) |
| 394 } else { | 421 } else { |
| 395 set end 50000 | 422 set end 50000 |
| 396 } | 423 } |
| 397 save_prng_state | 424 save_prng_state |
| 398 | 425 |
| 399 foreach ::iRepeat {0 10000000} { | 426 foreach ::iRepeat {0 10000000} { |
| 400 set ::go 1 | 427 set ::go 1 |
| 401 for {set ::n $start} {$::go && $::n <= $end} {incr ::n} { | 428 for {set ::n $start} {$::go && $::n <= $end} {incr ::n} { |
| 402 | 429 |
| 403 # If $::iRepeat is 0, then the malloc() failure is transient - it | 430 # If $::iRepeat is 0, then the malloc() failure is transient - it |
| 404 # fails and then subsequent calls succeed. If $::iRepeat is 1, | 431 # fails and then subsequent calls succeed. If $::iRepeat is 1, |
| 405 # then the failure is persistent - once malloc() fails it keeps | 432 # then the failure is persistent - once malloc() fails it keeps |
| 406 # failing. | 433 # failing. |
| 407 # | 434 # |
| 408 set zRepeat "transient" | 435 set zRepeat "transient" |
| 409 if {$::iRepeat} {set zRepeat "persistent"} | 436 if {$::iRepeat} {set zRepeat "persistent"} |
| 410 restore_prng_state | 437 restore_prng_state |
| 411 foreach file [glob -nocomplain test.db-mj*] {file delete -force $file} | 438 foreach file [glob -nocomplain test.db-mj*] {forcedelete $file} |
| 412 | 439 |
| 413 do_test ${tn}.${zRepeat}.${::n} { | 440 do_test ${tn}.${zRepeat}.${::n} { |
| 414 | 441 |
| 415 # Remove all traces of database files test.db and test2.db | 442 # Remove all traces of database files test.db and test2.db |
| 416 # from the file-system. Then open (empty database) "test.db" | 443 # from the file-system. Then open (empty database) "test.db" |
| 417 # with the handle [db]. | 444 # with the handle [db]. |
| 418 # | 445 # |
| 419 catch {db close} | 446 catch {db close} |
| 420 catch {db2 close} | 447 catch {db2 close} |
| 421 forcedelete test.db | 448 forcedelete test.db |
| 422 forcedelete test.db-journal | 449 forcedelete test.db-journal |
| 423 forcedelete test.db-wal | 450 forcedelete test.db-wal |
| 424 forcedelete test2.db | 451 forcedelete test2.db |
| 425 forcedelete test2.db-journal | 452 forcedelete test2.db-journal |
| 426 forcedelete test2.db-wal | 453 forcedelete test2.db-wal |
| 427 if {[info exists ::mallocopts(-testdb)]} { | 454 if {[info exists ::mallocopts(-testdb)]} { |
| 428 file copy $::mallocopts(-testdb) test.db | 455 copy_file $::mallocopts(-testdb) test.db |
| 429 } | 456 } |
| 430 catch { sqlite3 db test.db } | 457 catch { sqlite3 db test.db } |
| 431 if {[info commands db] ne ""} { | 458 if {[info commands db] ne ""} { |
| 432 sqlite3_extended_result_codes db 1 | 459 sqlite3_extended_result_codes db 1 |
| 433 } | 460 } |
| 434 sqlite3_db_config_lookaside db 0 0 0 | 461 sqlite3_db_config_lookaside db 0 0 0 |
| 435 | 462 |
| 436 # Execute any -tclprep and -sqlprep scripts. | 463 # Execute any -tclprep and -sqlprep scripts. |
| 437 # | 464 # |
| 438 if {[info exists ::mallocopts(-tclprep)]} { | 465 if {[info exists ::mallocopts(-tclprep)]} { |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 if {[lsearch $answers $res]>=0} { | 678 if {[lsearch $answers $res]>=0} { |
| 652 set res $str | 679 set res $str |
| 653 } | 680 } |
| 654 do_test $name.$zName.$iFail [list set {} $res] $str | 681 do_test $name.$zName.$iFail [list set {} $res] $str |
| 655 set cksum2 [db one $cksumsql] | 682 set cksum2 [db one $cksumsql] |
| 656 if {$cksum1 != $cksum2} return | 683 if {$cksum1 != $cksum2} return |
| 657 } | 684 } |
| 658 } | 685 } |
| 659 } | 686 } |
| 660 } | 687 } |
| OLD | NEW |