xref: /sqlite-3.40.0/test/unixexcl.test (revision e243de5c)
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
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18source $testdir/lock_common.tcl
19source $testdir/malloc_common.tcl
20
21if {$::tcl_platform(platform)!="unix" || [info commands test_syscall]==""} {
22  finish_test
23  return
24}
25set 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#
34do_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#
63do_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
83do_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      PRAGMA synchronous = FULL;
91      CREATE TABLE t1(a, b);
92      INSERT INTO t1 VALUES(1, 2);
93    }
94  } {wal}
95
96  if {$tn==1} {
97    do_test unixexcl-3.$tn.1.multiproc {
98      csql2 { SELECT * FROM t1; }
99    } {1 {database is locked}}
100  } else {
101    do_test unixexcl-3.$tn.1.singleproc {
102      sql2 { SELECT * FROM t1; }
103    } {1 2}
104
105    do_test unixexcl-3.$tn.2 {
106      sql2 {
107        BEGIN;
108          SELECT * FROM t1;
109      }
110    } {1 2}
111    do_test unixexcl-3.$tn.3 {
112      sql1 { PRAGMA wal_checkpoint; INSERT INTO t1 VALUES(3, 4); }
113    } {0 5 5}
114    do_test unixexcl-3.$tn.4 {
115      sql2 { SELECT * FROM t1; }
116    } {1 2}
117    do_test unixexcl-3.$tn.5 {
118      sql1 { SELECT * FROM t1; }
119    } {1 2 3 4}
120    do_test unixexcl-3.$tn.6 {
121      sql2 { COMMIT; SELECT * FROM t1; }
122    } {1 2 3 4}
123    do_test unixexcl-3.$tn.7 {
124      sql1 { PRAGMA wal_checkpoint; }
125    } {0 7 7}
126  }
127}
128
129finish_test
130