xref: /sqlite-3.40.0/test/unixexcl.test (revision 38d69855)
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      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 5 5}
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 7 7}
125  }
126}
127
128finish_test
129