Annotation of embedaddon/sqlite3/test/win32lock.test, revision 1.1

1.1     ! misho       1: # 2011 July 11
        !             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: # This file implements regression tests for SQLite library.  The
        !            12: # focus of this script is recovery from transient manditory locks
        !            13: # that sometimes appear on database files due to anti-virus software.
        !            14: #
        !            15: 
        !            16: if {$tcl_platform(platform)!="windows"} return
        !            17: 
        !            18: set testdir [file dirname $argv0]
        !            19: source $testdir/tester.tcl
        !            20: 
        !            21: set testprefix win32lock
        !            22: 
        !            23: db close
        !            24: sqlite3_shutdown
        !            25: test_sqlite3_log xLog
        !            26: proc xLog {error_code msg} {
        !            27:   lappend ::log $msg 
        !            28: }
        !            29: sqlite3 db test.db
        !            30: 
        !            31: do_test win32lock-1.1 {
        !            32:   db eval {
        !            33:     PRAGMA cache_size=10;
        !            34:     CREATE TABLE t1(x,y);
        !            35:     INSERT INTO t1 VALUES(1,randomblob(100000));
        !            36:     INSERT INTO t1 VALUES(2,randomblob(50000));
        !            37:     INSERT INTO t1 VALUES(3,randomblob(25000));
        !            38:     INSERT INTO t1 VALUES(4,randomblob(12500));
        !            39:     SELECT x, length(y) FROM t1 ORDER BY rowid;
        !            40:   }
        !            41: } {1 100000 2 50000 3 25000 4 12500}
        !            42: 
        !            43: unset -nocomplain delay1 rc msg
        !            44: set old_pending_byte [sqlite3_test_control_pending_byte 0x40000000]
        !            45: 
        !            46: set win32_lock_ok [list]
        !            47: set win32_lock_error [list]
        !            48: set delay1 25
        !            49: while {1} {
        !            50:   lock_win32_file test.db 0 $::delay1
        !            51:   set ::log {}
        !            52:   set rc [catch {db eval {SELECT x, length(y) FROM t1 ORDER BY rowid}} msg]
        !            53:   if {$rc} {
        !            54:     lappend win32_lock_error $::delay1
        !            55:     do_test win32lock-1.2-$delay1-error {
        !            56:        set ::msg
        !            57:     } {disk I/O error}
        !            58:   } else {
        !            59:     lappend win32_lock_ok $::delay1
        !            60:     do_test win32lock-1.2-$delay1-ok {
        !            61:        set ::msg
        !            62:     } {1 100000 2 50000 3 25000 4 12500}
        !            63:     if {[info exists ::log] && $::log!=""} {
        !            64:       do_test win32lock-1.2-$delay1-log1 {
        !            65:         regsub {\d+} $::log # x
        !            66:         set x
        !            67:       } {{delayed #ms for lock/sharing conflict}}
        !            68:     }
        !            69:   }
        !            70:   if {[llength $win32_lock_ok] && [llength $win32_lock_error]} break
        !            71:   incr delay1 25
        !            72:   if {$delay1 > 12500} {
        !            73:     puts "Timed out waiting for \"ok\" and \"error\" results."
        !            74:     break
        !            75:   }
        !            76:   sqlite3_sleep 10
        !            77: }
        !            78: 
        !            79: do_test win32lock-2.0 {
        !            80:   file_control_win32_av_retry db -1 -1
        !            81: } {0 10 25}
        !            82: do_test win32lock-2.1 {
        !            83:   file_control_win32_av_retry db 1 1
        !            84: } {0 1 1}
        !            85: 
        !            86: #
        !            87: # NOTE: It is known that the win32lock-2.2-* tests may fail if the system is
        !            88: #       experiencing heavy load (i.e. they are very timing sensitive).  This is
        !            89: #       primarily due to the AV retry delay being set to 1 millisecond in the
        !            90: #       win32lock-2.1 test (above).  While it is important to test this corner
        !            91: #       case for the AV retry logic, a failure of this test should probably not
        !            92: #       be interpreted as a bug in SQLite or these test cases.
        !            93: #
        !            94: set win32_lock_ok [list]
        !            95: set win32_lock_error [list]
        !            96: set delay1 1
        !            97: while {1} {
        !            98:   lock_win32_file test.db 0 $::delay1
        !            99:   set ::log {}
        !           100:   set rc [catch {db eval {SELECT x, length(y) FROM t1 ORDER BY rowid}} msg]
        !           101:   if {$rc} {
        !           102:     lappend win32_lock_error $::delay1
        !           103:     do_test win32lock-2.2-$delay1-error {
        !           104:        set ::msg
        !           105:     } {disk I/O error}
        !           106:   } else {
        !           107:     lappend win32_lock_ok $::delay1
        !           108:     do_test win32lock-2.2-$delay1-ok {
        !           109:        set ::msg
        !           110:     } {1 100000 2 50000 3 25000 4 12500}
        !           111:     if {[info exists ::log] && $::log!=""} {
        !           112:       do_test win32lock-2.2-$delay1-log1 {
        !           113:         regsub {\d+} $::log # x
        !           114:         set x
        !           115:       } {{delayed #ms for lock/sharing conflict}}
        !           116:     }
        !           117:   }
        !           118:   if {[llength $win32_lock_ok] && [llength $win32_lock_error]} break
        !           119:   incr delay1 1
        !           120:   if {$delay1 > 500} {
        !           121:     puts "Timed out waiting for \"ok\" and \"error\" results."
        !           122:     break
        !           123:   }
        !           124:   sqlite3_sleep 10
        !           125: }
        !           126: 
        !           127: file_control_win32_av_retry db 10 25
        !           128: sqlite3_test_control_pending_byte $old_pending_byte
        !           129: db close
        !           130: sqlite3_shutdown
        !           131: test_sqlite3_log 
        !           132: sqlite3_initialize
        !           133: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>