1: # 2011 March 30
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: #
12: # This file contains tests for the "unix-excl" VFS module (part of
13: # os_unix.c).
14: #
15:
16: set testdir [file dirname $argv0]
17: source $testdir/tester.tcl
18: source $testdir/lock_common.tcl
19: source $testdir/malloc_common.tcl
20:
21: if {$::tcl_platform(platform)!="unix" || [info commands test_syscall]==""} {
22: finish_test
23: return
24: }
25: set testprefix unixexcl
26:
27:
28:
29: # Test that when using VFS "unix-excl", the first time the database is read
30: # a process-wide exclusive lock is taken on it. This means other connections
31: # within the process may still access the db normally, but connections from
32: # outside the process cannot.
33: #
34: do_multiclient_test tn {
35: do_test unixexcl-1.$tn.1 {
36: sql1 {
37: CREATE TABLE t1(a, b);
38: INSERT INTO t1 VALUES('hello', 'world');
39: }
40: } {}
41: do_test unixexcl-1.$tn.2 { sql2 { SELECT * FROM t1 } } {hello world}
42: do_test unixexcl-1.$tn.3 {
43: code1 {
44: db close
45: sqlite3 db test.db -vfs unix-excl
46: db eval { SELECT * FROM t1 }
47: }
48: } {hello world}
49: if {$tn==1} {
50: do_test unixexcl-1.$tn.4.multiproc {
51: csql2 { SELECT * FROM t1 }
52: } {1 {database is locked}}
53: } else {
54: do_test unixexcl-1.$tn.4.singleproc {
55: csql2 { SELECT * FROM t1 }
56: } {0 {hello world}}
57: }
58: }
59:
60: # Test that when using VFS "unix-excl", if a file is opened in read-only mode
61: # the behaviour is the same as if VFS "unix" were used.
62: #
63: do_multiclient_test tn {
64: do_test unixexcl-2.$tn.1 {
65: sql1 {
66: CREATE TABLE t1(a, b);
67: INSERT INTO t1 VALUES('hello', 'world');
68: }
69: } {}
70: do_test unixexcl-2.$tn.2 { sql2 { SELECT * FROM t1 } } {hello world}
71: do_test unixexcl-2.$tn.3 {
72: code1 {
73: db close
74: sqlite3 db test.db -readonly yes -vfs unix-excl
75: db eval { SELECT * FROM t1 }
76: }
77: } {hello world}
78: do_test unixexcl-2.$tn.4 {
79: csql2 { SELECT * FROM t1 }
80: } {0 {hello world}}
81: }
82:
83: do_multiclient_test tn {
84: do_test unixexcl-3.$tn.1 {
85: code1 { db close; sqlite3 db file:test.db?psow=0 -vfs unix-excl -uri 1 }
86: code2 { db2 close; sqlite3 db2 file:test.db?psow=0 -vfs unix-excl -uri 1 }
87: sql1 {
88: PRAGMA auto_vacuum = 0;
89: PRAGMA journal_mode = WAL;
90: CREATE TABLE t1(a, b);
91: INSERT INTO t1 VALUES(1, 2);
92: }
93: } {wal}
94:
95: if {$tn==1} {
96: do_test unixexcl-3.$tn.1.multiproc {
97: csql2 { SELECT * FROM t1; }
98: } {1 {database is locked}}
99: } else {
100: do_test unixexcl-3.$tn.1.singleproc {
101: sql2 { SELECT * FROM t1; }
102: } {1 2}
103:
104: do_test unixexcl-3.$tn.2 {
105: sql2 {
106: BEGIN;
107: SELECT * FROM t1;
108: }
109: } {1 2}
110: do_test unixexcl-3.$tn.3 {
111: sql1 { PRAGMA wal_checkpoint; INSERT INTO t1 VALUES(3, 4); }
112: } {0 3 3}
113: do_test unixexcl-3.$tn.4 {
114: sql2 { SELECT * FROM t1; }
115: } {1 2}
116: do_test unixexcl-3.$tn.5 {
117: sql1 { SELECT * FROM t1; }
118: } {1 2 3 4}
119: do_test unixexcl-3.$tn.6 {
120: sql2 { COMMIT; SELECT * FROM t1; }
121: } {1 2 3 4}
122: do_test unixexcl-3.$tn.7 {
123: sql1 { PRAGMA wal_checkpoint; }
124: } {0 4 4}
125: }
126: }
127:
128: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>