Index: third_party/sqlite/sqlite-src-3080704/test/unixexcl.test |
diff --git a/third_party/sqlite/sqlite-src-3080704/test/unixexcl.test b/third_party/sqlite/sqlite-src-3080704/test/unixexcl.test |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d6762178dd2eb90f2c27e8bd9e683c969a1a6cc5 |
--- /dev/null |
+++ b/third_party/sqlite/sqlite-src-3080704/test/unixexcl.test |
@@ -0,0 +1,128 @@ |
+# 2011 March 30 |
+# |
+# The author disclaims copyright to this source code. In place of |
+# a legal notice, here is a blessing: |
+# |
+# May you do good and not evil. |
+# May you find forgiveness for yourself and forgive others. |
+# May you share freely, never taking more than you give. |
+# |
+#*********************************************************************** |
+# |
+# This file contains tests for the "unix-excl" VFS module (part of |
+# os_unix.c). |
+# |
+ |
+set testdir [file dirname $argv0] |
+source $testdir/tester.tcl |
+source $testdir/lock_common.tcl |
+source $testdir/malloc_common.tcl |
+ |
+if {$::tcl_platform(platform)!="unix" || [info commands test_syscall]==""} { |
+ finish_test |
+ return |
+} |
+set testprefix unixexcl |
+ |
+ |
+ |
+# Test that when using VFS "unix-excl", the first time the database is read |
+# a process-wide exclusive lock is taken on it. This means other connections |
+# within the process may still access the db normally, but connections from |
+# outside the process cannot. |
+# |
+do_multiclient_test tn { |
+ do_test unixexcl-1.$tn.1 { |
+ sql1 { |
+ CREATE TABLE t1(a, b); |
+ INSERT INTO t1 VALUES('hello', 'world'); |
+ } |
+ } {} |
+ do_test unixexcl-1.$tn.2 { sql2 { SELECT * FROM t1 } } {hello world} |
+ do_test unixexcl-1.$tn.3 { |
+ code1 { |
+ db close |
+ sqlite3 db test.db -vfs unix-excl |
+ db eval { SELECT * FROM t1 } |
+ } |
+ } {hello world} |
+ if {$tn==1} { |
+ do_test unixexcl-1.$tn.4.multiproc { |
+ csql2 { SELECT * FROM t1 } |
+ } {1 {database is locked}} |
+ } else { |
+ do_test unixexcl-1.$tn.4.singleproc { |
+ csql2 { SELECT * FROM t1 } |
+ } {0 {hello world}} |
+ } |
+} |
+ |
+# Test that when using VFS "unix-excl", if a file is opened in read-only mode |
+# the behaviour is the same as if VFS "unix" were used. |
+# |
+do_multiclient_test tn { |
+ do_test unixexcl-2.$tn.1 { |
+ sql1 { |
+ CREATE TABLE t1(a, b); |
+ INSERT INTO t1 VALUES('hello', 'world'); |
+ } |
+ } {} |
+ do_test unixexcl-2.$tn.2 { sql2 { SELECT * FROM t1 } } {hello world} |
+ do_test unixexcl-2.$tn.3 { |
+ code1 { |
+ db close |
+ sqlite3 db test.db -readonly yes -vfs unix-excl |
+ db eval { SELECT * FROM t1 } |
+ } |
+ } {hello world} |
+ do_test unixexcl-2.$tn.4 { |
+ csql2 { SELECT * FROM t1 } |
+ } {0 {hello world}} |
+} |
+ |
+do_multiclient_test tn { |
+ do_test unixexcl-3.$tn.1 { |
+ code1 { db close; sqlite3 db file:test.db?psow=0 -vfs unix-excl -uri 1 } |
+ code2 { db2 close; sqlite3 db2 file:test.db?psow=0 -vfs unix-excl -uri 1 } |
+ sql1 { |
+ PRAGMA auto_vacuum = 0; |
+ PRAGMA journal_mode = WAL; |
+ CREATE TABLE t1(a, b); |
+ INSERT INTO t1 VALUES(1, 2); |
+ } |
+ } {wal} |
+ |
+ if {$tn==1} { |
+ do_test unixexcl-3.$tn.1.multiproc { |
+ csql2 { SELECT * FROM t1; } |
+ } {1 {database is locked}} |
+ } else { |
+ do_test unixexcl-3.$tn.1.singleproc { |
+ sql2 { SELECT * FROM t1; } |
+ } {1 2} |
+ |
+ do_test unixexcl-3.$tn.2 { |
+ sql2 { |
+ BEGIN; |
+ SELECT * FROM t1; |
+ } |
+ } {1 2} |
+ do_test unixexcl-3.$tn.3 { |
+ sql1 { PRAGMA wal_checkpoint; INSERT INTO t1 VALUES(3, 4); } |
+ } {0 5 5} |
+ do_test unixexcl-3.$tn.4 { |
+ sql2 { SELECT * FROM t1; } |
+ } {1 2} |
+ do_test unixexcl-3.$tn.5 { |
+ sql1 { SELECT * FROM t1; } |
+ } {1 2 3 4} |
+ do_test unixexcl-3.$tn.6 { |
+ sql2 { COMMIT; SELECT * FROM t1; } |
+ } {1 2 3 4} |
+ do_test unixexcl-3.$tn.7 { |
+ sql1 { PRAGMA wal_checkpoint; } |
+ } {0 7 7} |
+ } |
+} |
+ |
+finish_test |