Roll src/third_party/WebKit a3b4a2e:7441784 (svn 202551:202552)
[chromium-blink-merge.git] / third_party / sqlite / src / test / unixexcl.test
blobd6762178dd2eb90f2c27e8bd9e683c969a1a6cc5
1 # 2011 March 30
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
12 # This file contains tests for the "unix-excl" VFS module (part of 
13 # os_unix.c).
16 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl
18 source $testdir/lock_common.tcl
19 source $testdir/malloc_common.tcl
21 if {$::tcl_platform(platform)!="unix" || [info commands test_syscall]==""} {
22   finish_test
23   return
24
25 set testprefix unixexcl
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.
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   }
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.
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}}
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}
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}
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   }
128 finish_test