# 2008 June 28 # # 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 implements regression tests for SQLite library. The # focus of this script is database proxy locks. # # $Id$ set testdir [file dirname $argv0] source $testdir/tester.tcl # This file is only run if using the unix backend compiled with the # SQLITE_ENABLE_LOCKING_STYLE macro. db close if {[catch {sqlite3 db test.db -vfs unix-none} msg]} { finish_test return } db close file delete -force test.db.lock ##################################################################### ifcapable lock_proxy_pragmas&&prefer_proxy_locking { set ::using_proxy 0 foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] { set ::using_proxy $value } # enable the proxy locking for these tests set env(SQLITE_FORCE_PROXY_LOCKING) "1" # test conch file creation # catch { file delete lock_proxy_test.db } catch { file delete .lock_proxy_test.db-conch } # test that proxy locking mode creates conch files do_test lock_proxy1.0 { sqlite3 db2 lock_proxy_test.db catchsql { create table x(y); } db2 file exists .lock_proxy_test.db-conch } {1} catch { db2 close } # test proxy locking readonly file system handling # if {[file exists /usr/bin/hdiutil]} { puts "Creating readonly file system for proxy locking tests..." if {[file exists /Volumes/readonly]} { exec hdiutil detach /Volumes/readonly } if {[file exists readonly.dmg]} { file delete readonly.dmg } exec hdiutil create -megabytes 1 -fs HFS+ readonly.dmg -volname readonly exec hdiutil attach readonly.dmg # create test1.db and a .test1.db-conch for host4 set sqlite_hostid_num 4 sqlite3 db2 /Volumes/readonly/test1.db execsql { create table x(y); } db2 db2 close # create test2.db and a .test2.db-conch for host5 set sqlite_hostid_num 5 sqlite3 db2 /Volumes/readonly/test2.db execsql { create table x(y); } db2 db2 close # create test3.db without a conch file set env(SQLITE_FORCE_PROXY_LOCKING) "0" sqlite3 db2 /Volumes/readonly/test3.db execsql { create table x(y); } db2 db2 close exec hdiutil detach /Volumes/readonly exec hdiutil attach -readonly readonly.dmg # test that an unwritable, host-mismatched conch file prevents # read only proxy-locking mode database access set env(SQLITE_FORCE_PROXY_LOCKING) "1" do_test lock_proxy2.0 { sqlite3 db2 /Volumes/readonly/test1.db catchsql { select * from sqlite_master; } db2 } {1 {database is locked}} catch { db2 close } # test that an unwritable, host-matching conch file allows # read only proxy-locking mode database access do_test lock_proxy2.1 { sqlite3 db2 /Volumes/readonly/test2.db catchsql { select * from sqlite_master; } db2 } {0 {table x x 2 {CREATE TABLE x(y)}}} catch { db2 close } # test that an unwritable, nonexistant conch file allows # read only proxy-locking mode database access do_test lock_proxy2.2 { sqlite3 db2 /Volumes/readonly/test3.db catchsql { select * from sqlite_master; } db2 } {0 {table x x 2 {CREATE TABLE x(y)}}} catch { db2 close } exec hdiutil detach /Volumes/readonly file delete readonly.dmg } set env(SQLITE_FORCE_PROXY_LOCKING) "0" set sqlite_hostid_num 0 } ##################################################################### file delete -force test.db ifcapable lock_proxy_pragmas&&prefer_proxy_locking { set env(SQLITE_FORCE_PROXY_LOCKING) $::using_proxy } finish_test