Annotation of embedaddon/sqlite3/test/lock6.test, revision 1.1
1.1 ! misho 1: # 2008 October 6
! 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: # This file implements regression tests for SQLite library. The
! 12: # focus of this script is database locks.
! 13: #
! 14: # $Id: lock6.test,v 1.3 2009/02/05 16:31:46 drh Exp $
! 15:
! 16:
! 17: set testdir [file dirname $argv0]
! 18: source $testdir/tester.tcl
! 19:
! 20: # Launch another testfixture process to be controlled by this one. A
! 21: # channel name is returned that may be passed as the first argument to proc
! 22: # 'testfixture' to execute a command. The child testfixture process is shut
! 23: # down by closing the channel.
! 24: proc launch_testfixture {} {
! 25: set prg [info nameofexec]
! 26: if {$prg eq ""} {
! 27: set prg [file join . testfixture]
! 28: }
! 29: set chan [open "|$prg tf_main2.tcl" r+]
! 30: fconfigure $chan -buffering line
! 31: return $chan
! 32: }
! 33:
! 34: # Execute a command in a child testfixture process, connected by two-way
! 35: # channel $chan. Return the result of the command, or an error message.
! 36: proc testfixture {chan cmd} {
! 37: puts $chan $cmd
! 38: puts $chan OVER
! 39: set r ""
! 40: while { 1 } {
! 41: set line [gets $chan]
! 42: if { $line == "OVER" } {
! 43: return $r
! 44: }
! 45: append r $line
! 46: }
! 47: }
! 48:
! 49: # Write the main loop for the child testfixture processes into file
! 50: # tf_main2.tcl. The parent (this script) interacts with the child processes
! 51: # via a two way pipe. The parent writes a script to the stdin of the child
! 52: # process, followed by the word "OVER" on a line of its own. The child
! 53: # process evaluates the script and writes the results to stdout, followed
! 54: # by an "OVER" of its own.
! 55: set f [open tf_main2.tcl w]
! 56: puts $f {
! 57: set l [open log w]
! 58: set script ""
! 59: while {![eof stdin]} {
! 60: flush stdout
! 61: set line [gets stdin]
! 62: puts $l "READ $line"
! 63: if { $line == "OVER" } {
! 64: catch {eval $script} result
! 65: puts $result
! 66: puts $l "WRITE $result"
! 67: puts OVER
! 68: puts $l "WRITE OVER"
! 69: flush stdout
! 70: set script ""
! 71: } else {
! 72: append script $line
! 73: append script " ; "
! 74: }
! 75: }
! 76: close $l
! 77: }
! 78: close $f
! 79:
! 80:
! 81: ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
! 82: set sqlite_hostid_num 1
! 83:
! 84: set using_proxy 0
! 85: foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] {
! 86: set using_proxy $value
! 87: }
! 88:
! 89: # Test the lock_proxy_file pragmas.
! 90: #
! 91: set env(SQLITE_FORCE_PROXY_LOCKING) "1"
! 92:
! 93: do_test lock6-1.1 {
! 94: set ::tf1 [launch_testfixture]
! 95: testfixture $::tf1 "sqlite3_test_control_pending_byte $::sqlite_pending_byte"
! 96: testfixture $::tf1 {
! 97: set sqlite_hostid_num 2
! 98: sqlite3 db test.db -key xyzzy
! 99: set lockpath [db eval {
! 100: PRAGMA lock_proxy_file=":auto:";
! 101: select * from sqlite_master;
! 102: PRAGMA lock_proxy_file;
! 103: }]
! 104: string match "*test.db:auto:" $lockpath
! 105: }
! 106: } {1}
! 107:
! 108: set sqlite_hostid_num 3
! 109: do_test lock6-1.2 {
! 110: execsql {pragma lock_status}
! 111: } {main unlocked temp closed}
! 112:
! 113: sqlite3_soft_heap_limit 0
! 114: do_test lock6-1.3 {
! 115: list [catch {
! 116: sqlite3 db test.db
! 117: execsql { select * from sqlite_master }
! 118: } msg] $msg
! 119: } {1 {database is locked}}
! 120:
! 121: do_test lock6-1.4 {
! 122: set lockpath [execsql {
! 123: PRAGMA lock_proxy_file=":auto:";
! 124: PRAGMA lock_proxy_file;
! 125: } db]
! 126: set lockpath
! 127: } {{:auto: (not held)}}
! 128:
! 129: do_test lock6-1.4.1 {
! 130: catchsql {
! 131: PRAGMA lock_proxy_file="notmine";
! 132: select * from sqlite_master;
! 133: } db
! 134: } {1 {database is locked}}
! 135:
! 136: do_test lock6-1.4.2 {
! 137: execsql {
! 138: PRAGMA lock_proxy_file;
! 139: } db
! 140: } {notmine}
! 141:
! 142: do_test lock6-1.5 {
! 143: testfixture $::tf1 {
! 144: db eval {
! 145: BEGIN;
! 146: SELECT * FROM sqlite_master;
! 147: }
! 148: }
! 149: } {}
! 150:
! 151: catch {testfixture $::tf1 {db close}}
! 152:
! 153: do_test lock6-1.6 {
! 154: execsql {
! 155: PRAGMA lock_proxy_file="mine";
! 156: select * from sqlite_master;
! 157: } db
! 158: } {}
! 159:
! 160: catch {close $::tf1}
! 161: set env(SQLITE_FORCE_PROXY_LOCKING) $using_proxy
! 162: set sqlite_hostid_num 0
! 163:
! 164: sqlite3_soft_heap_limit $cmdlinearg(soft-heap-limit)
! 165: }
! 166:
! 167: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>