blob: b47d18f7a9acfb294a93d0dd5b3232d8c851894e [file] [log] [blame]
aswiftaebf4132008-11-21 00:10:35 +00001# 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#
drhc7a3bb92009-02-05 16:31:45 +000014# $Id: lock6.test,v 1.3 2009/02/05 16:31:46 drh Exp $
aswiftaebf4132008-11-21 00:10:35 +000015
16
17set testdir [file dirname $argv0]
18source $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.
24proc 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.
36proc 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.
55set f [open tf_main2.tcl w]
56puts $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}
78close $f
79
80
danielk1977838cce42009-01-12 14:01:45 +000081ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
aswiftaebf4132008-11-21 00:10:35 +000082 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]
drhc7a3bb92009-02-05 16:31:45 +000095 testfixture $::tf1 "sqlite3_test_control_pending_byte $::sqlite_pending_byte"
aswiftaebf4132008-11-21 00:10:35 +000096 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 {
dan14d14602010-10-06 16:42:52 +0000115 list [catch {
116 sqlite3 db test.db
117 execsql { select * from sqlite_master }
118 } msg] $msg
aswiftaebf4132008-11-21 00:10:35 +0000119 } {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
danc1a60c52010-06-07 14:28:16 +0000164 sqlite3_soft_heap_limit $cmdlinearg(soft-heap-limit)
aswiftaebf4132008-11-21 00:10:35 +0000165}
166
167finish_test