Annotation of embedaddon/sqlite3/test/lock6.test, revision 1.1.1.1
1.1 misho 1: # 2008 October 6
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 database locks.
13: #
14: # $Id: lock6.test,v 1.3 2009/02/05 16:31:46 drh Exp $
15:
16:
17: set testdir [file dirname $argv0]
18: source $testdir/tester.tcl
19:
20: # Launch another testfixture process to be controlled by this one. A
21: # channel name is returned that may be passed as the first argument to proc
22: # 'testfixture' to execute a command. The child testfixture process is shut
23: # down by closing the channel.
24: proc launch_testfixture {} {
25: set prg [info nameofexec]
26: if {$prg eq ""} {
27: set prg [file join . testfixture]
28: }
29: set chan [open "|$prg tf_main2.tcl" r+]
30: fconfigure $chan -buffering line
31: return $chan
32: }
33:
34: # Execute a command in a child testfixture process, connected by two-way
35: # channel $chan. Return the result of the command, or an error message.
36: proc testfixture {chan cmd} {
37: puts $chan $cmd
38: puts $chan OVER
39: set r ""
40: while { 1 } {
41: set line [gets $chan]
42: if { $line == "OVER" } {
43: return $r
44: }
45: append r $line
46: }
47: }
48:
49: # Write the main loop for the child testfixture processes into file
50: # tf_main2.tcl. The parent (this script) interacts with the child processes
51: # via a two way pipe. The parent writes a script to the stdin of the child
52: # process, followed by the word "OVER" on a line of its own. The child
53: # process evaluates the script and writes the results to stdout, followed
54: # by an "OVER" of its own.
55: set f [open tf_main2.tcl w]
56: puts $f {
57: set l [open log w]
58: set script ""
59: while {![eof stdin]} {
60: flush stdout
61: set line [gets stdin]
62: puts $l "READ $line"
63: if { $line == "OVER" } {
64: catch {eval $script} result
65: puts $result
66: puts $l "WRITE $result"
67: puts OVER
68: puts $l "WRITE OVER"
69: flush stdout
70: set script ""
71: } else {
72: append script $line
73: append script " ; "
74: }
75: }
76: close $l
77: }
78: close $f
79:
80:
81: ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
82: set sqlite_hostid_num 1
83:
84: set using_proxy 0
85: foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] {
86: set using_proxy $value
87: }
88:
89: # Test the lock_proxy_file pragmas.
90: #
91: set env(SQLITE_FORCE_PROXY_LOCKING) "1"
92:
93: do_test lock6-1.1 {
94: set ::tf1 [launch_testfixture]
95: testfixture $::tf1 "sqlite3_test_control_pending_byte $::sqlite_pending_byte"
96: testfixture $::tf1 {
97: set sqlite_hostid_num 2
98: sqlite3 db test.db -key xyzzy
99: set lockpath [db eval {
100: PRAGMA lock_proxy_file=":auto:";
101: select * from sqlite_master;
102: PRAGMA lock_proxy_file;
103: }]
104: string match "*test.db:auto:" $lockpath
105: }
106: } {1}
107:
108: set sqlite_hostid_num 3
109: do_test lock6-1.2 {
110: execsql {pragma lock_status}
111: } {main unlocked temp closed}
112:
113: sqlite3_soft_heap_limit 0
114: do_test lock6-1.3 {
115: list [catch {
116: sqlite3 db test.db
117: execsql { select * from sqlite_master }
118: } msg] $msg
119: } {1 {database is locked}}
120:
121: do_test lock6-1.4 {
122: set lockpath [execsql {
123: PRAGMA lock_proxy_file=":auto:";
124: PRAGMA lock_proxy_file;
125: } db]
126: set lockpath
127: } {{:auto: (not held)}}
128:
129: do_test lock6-1.4.1 {
130: catchsql {
131: PRAGMA lock_proxy_file="notmine";
132: select * from sqlite_master;
133: } db
134: } {1 {database is locked}}
135:
136: do_test lock6-1.4.2 {
137: execsql {
138: PRAGMA lock_proxy_file;
139: } db
140: } {notmine}
141:
142: do_test lock6-1.5 {
143: testfixture $::tf1 {
144: db eval {
145: BEGIN;
146: SELECT * FROM sqlite_master;
147: }
148: }
149: } {}
150:
151: catch {testfixture $::tf1 {db close}}
152:
153: do_test lock6-1.6 {
154: execsql {
155: PRAGMA lock_proxy_file="mine";
156: select * from sqlite_master;
157: } db
158: } {}
159:
160: catch {close $::tf1}
161: set env(SQLITE_FORCE_PROXY_LOCKING) $using_proxy
162: set sqlite_hostid_num 0
163:
164: sqlite3_soft_heap_limit $cmdlinearg(soft-heap-limit)
165: }
166:
167: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>