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>