123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- # 2011 July 11
- #
- # The author disclaims copyright to this source code. In place of
- # a legal notice, here is a blessing:
- #
- # May you do good and not evil.
- # May you find forgiveness for yourself and forgive others.
- # May you share freely, never taking more than you give.
- #
- #***********************************************************************
- # This file implements regression tests for SQLite library. The
- # focus of this script is recovery from transient manditory locks
- # that sometimes appear on database files due to anti-virus software.
- #
- if {$tcl_platform(platform)!="windows"} return
- set testdir [file dirname $argv0]
- source $testdir/tester.tcl
- set testprefix win32lock
- db close
- sqlite3_shutdown
- test_sqlite3_log xLog
- proc xLog {error_code msg} {
- lappend ::log $msg
- }
- sqlite3 db test.db
- db eval {PRAGMA mmap_size=0}
- do_test win32lock-1.1 {
- db eval {
- PRAGMA cache_size=10;
- CREATE TABLE t1(x,y);
- INSERT INTO t1 VALUES(1,randomblob(100000));
- INSERT INTO t1 VALUES(2,randomblob(50000));
- INSERT INTO t1 VALUES(3,randomblob(25000));
- INSERT INTO t1 VALUES(4,randomblob(12500));
- SELECT x, length(y) FROM t1 ORDER BY rowid;
- }
- } {1 100000 2 50000 3 25000 4 12500}
- unset -nocomplain delay1 rc msg
- set old_pending_byte [sqlite3_test_control_pending_byte 0x40000000]
- set win32_lock_ok [list]
- set win32_lock_error [list]
- set delay1 25
- while {1} {
- lock_win32_file test.db 0 $::delay1
- set ::log {}
- set rc [catch {db eval {SELECT x, length(y) FROM t1 ORDER BY rowid}} msg]
- if {$rc} {
- lappend win32_lock_error $::delay1
- do_test win32lock-1.2-$delay1-error {
- set ::msg
- } {disk I/O error}
- } else {
- lappend win32_lock_ok $::delay1
- do_test win32lock-1.2-$delay1-ok {
- set ::msg
- } {1 100000 2 50000 3 25000 4 12500}
- if {[info exists ::log] && $::log!=""} {
- do_test win32lock-1.2-$delay1-log1 {
- regsub {\d+} $::log # x
- set x
- } {{delayed #ms for lock/sharing conflict}}
- }
- }
- if {[llength $win32_lock_ok] && [llength $win32_lock_error]} break
- incr delay1 25
- if {$delay1 > 12500} {
- puts "Timed out waiting for \"ok\" and \"error\" results."
- break
- }
- sqlite3_sleep 10
- }
- do_test win32lock-2.0 {
- file_control_win32_av_retry db -1 -1
- } {0 10 25}
- do_test win32lock-2.1 {
- file_control_win32_av_retry db 1 1
- } {0 1 1}
- #
- # NOTE: It is known that the win32lock-2.2-* tests may fail if the system is
- # experiencing heavy load (i.e. they are very timing sensitive). This is
- # primarily due to the AV retry delay being set to 1 millisecond in the
- # win32lock-2.1 test (above). While it is important to test this corner
- # case for the AV retry logic, a failure of this test should probably not
- # be interpreted as a bug in SQLite or these test cases.
- #
- set win32_lock_ok [list]
- set win32_lock_error [list]
- set delay1 1
- while {1} {
- lock_win32_file test.db 0 $::delay1
- set ::log {}
- set rc [catch {db eval {SELECT x, length(y) FROM t1 ORDER BY rowid}} msg]
- if {$rc} {
- lappend win32_lock_error $::delay1
- do_test win32lock-2.2-$delay1-error {
- set ::msg
- } {disk I/O error}
- } else {
- lappend win32_lock_ok $::delay1
- do_test win32lock-2.2-$delay1-ok {
- set ::msg
- } {1 100000 2 50000 3 25000 4 12500}
- if {[info exists ::log] && $::log!=""} {
- do_test win32lock-2.2-$delay1-log1 {
- regsub {\d+} $::log # x
- set x
- } {{delayed #ms for lock/sharing conflict}}
- }
- }
- if {[llength $win32_lock_ok] && [llength $win32_lock_error]} break
- incr delay1 1
- if {$delay1 > 500} {
- puts "Timed out waiting for \"ok\" and \"error\" results."
- break
- }
- sqlite3_sleep 10
- }
- file_control_win32_av_retry db 10 25
- sqlite3_test_control_pending_byte $old_pending_byte
- db close
- sqlite3_shutdown
- test_sqlite3_log
- sqlite3_initialize
- finish_test
|