Annotation of embedaddon/sqlite3/test/walro.test, revision 1.1
1.1 ! misho 1: # 2011 May 09
! 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 using WAL databases in read-only mode.
! 13: #
! 14:
! 15: set testdir [file dirname $argv0]
! 16: source $testdir/tester.tcl
! 17: source $testdir/lock_common.tcl
! 18: set ::testprefix walro
! 19:
! 20: # These tests are only going to work on unix.
! 21: #
! 22: if {$::tcl_platform(platform) != "unix"} {
! 23: finish_test
! 24: return
! 25: }
! 26:
! 27: # And only if the build is WAL-capable.
! 28: #
! 29: ifcapable !wal {
! 30: finish_test
! 31: return
! 32: }
! 33:
! 34: do_multiclient_test tn {
! 35: # Do not run tests with the connections in the same process.
! 36: #
! 37: if {$tn==2} continue
! 38:
! 39: # Close all connections and delete the database.
! 40: #
! 41: code1 { db close }
! 42: code2 { db2 close }
! 43: code3 { db3 close }
! 44: forcedelete test.db
! 45: forcedelete walro
! 46:
! 47: foreach c {code1 code2 code3} {
! 48: $c {
! 49: sqlite3_shutdown
! 50: sqlite3_config_uri 1
! 51: }
! 52: }
! 53:
! 54: file mkdir walro
! 55:
! 56: do_test 1.1.1 {
! 57: code2 { sqlite3 db2 test.db }
! 58: sql2 {
! 59: PRAGMA journal_mode = WAL;
! 60: CREATE TABLE t1(x, y);
! 61: INSERT INTO t1 VALUES('a', 'b');
! 62: }
! 63: file exists test.db-shm
! 64: } {1}
! 65:
! 66: do_test 1.1.2 {
! 67: file attributes test.db-shm -permissions r--r--r--
! 68: code1 { sqlite3 db file:test.db?readonly_shm=1 }
! 69: } {}
! 70:
! 71: do_test 1.1.3 { sql1 "SELECT * FROM t1" } {a b}
! 72: do_test 1.1.4 { sql2 "INSERT INTO t1 VALUES('c', 'd')" } {}
! 73: do_test 1.1.5 { sql1 "SELECT * FROM t1" } {a b c d}
! 74:
! 75: # Check that the read-only connection cannot write or checkpoint the db.
! 76: #
! 77: do_test 1.1.6 {
! 78: csql1 "INSERT INTO t1 VALUES('e', 'f')"
! 79: } {1 {attempt to write a readonly database}}
! 80: do_test 1.1.7 {
! 81: csql1 "PRAGMA wal_checkpoint"
! 82: } {1 {attempt to write a readonly database}}
! 83:
! 84: do_test 1.1.9 { sql2 "INSERT INTO t1 VALUES('e', 'f')" } {}
! 85: do_test 1.1.10 { sql1 "SELECT * FROM t1" } {a b c d e f}
! 86:
! 87: do_test 1.1.11 {
! 88: sql2 {
! 89: INSERT INTO t1 VALUES('g', 'h');
! 90: PRAGMA wal_checkpoint;
! 91: }
! 92: set {} {}
! 93: } {}
! 94: do_test 1.1.12 { sql1 "SELECT * FROM t1" } {a b c d e f g h}
! 95: do_test 1.1.13 { sql2 "INSERT INTO t1 VALUES('i', 'j')" } {}
! 96:
! 97: do_test 1.2.1 {
! 98: code2 { db2 close }
! 99: code1 { db close }
! 100: list [file exists test.db-wal] [file exists test.db-shm]
! 101: } {1 1}
! 102: do_test 1.2.2 {
! 103: code1 { sqlite3 db file:test.db?readonly_shm=1 }
! 104: sql1 { SELECT * FROM t1 }
! 105: } {a b c d e f g h i j}
! 106:
! 107: do_test 1.2.3 {
! 108: code1 { db close }
! 109: file attributes test.db-shm -permissions rw-r--r--
! 110: hexio_write test.db-shm 0 01020304
! 111: file attributes test.db-shm -permissions r--r--r--
! 112: code1 { sqlite3 db file:test.db?readonly_shm=1 }
! 113: csql1 { SELECT * FROM t1 }
! 114: } {1 {attempt to write a readonly database}}
! 115: do_test 1.2.4 {
! 116: code1 { sqlite3_extended_errcode db }
! 117: } {SQLITE_READONLY_RECOVERY}
! 118:
! 119: do_test 1.2.5 {
! 120: file attributes test.db-shm -permissions rw-r--r--
! 121: code2 { sqlite3 db2 test.db }
! 122: sql2 "SELECT * FROM t1"
! 123: } {a b c d e f g h i j}
! 124: file attributes test.db-shm -permissions r--r--r--
! 125: do_test 1.2.6 { sql1 "SELECT * FROM t1" } {a b c d e f g h i j}
! 126:
! 127: do_test 1.2.7 {
! 128: sql2 {
! 129: PRAGMA wal_checkpoint;
! 130: INSERT INTO t1 VALUES('k', 'l');
! 131: }
! 132: set {} {}
! 133: } {}
! 134: do_test 1.2.8 { sql1 "SELECT * FROM t1" } {a b c d e f g h i j k l}
! 135:
! 136: # Now check that if the readonly_shm option is not supplied, or if it
! 137: # is set to zero, it is not possible to connect to the database without
! 138: # read-write access to the shm.
! 139: do_test 1.3.1 {
! 140: code1 { db close }
! 141: code1 { sqlite3 db test.db }
! 142: csql1 { SELECT * FROM t1 }
! 143: } {1 {unable to open database file}}
! 144:
! 145: # Also test that if the -shm file can be opened for read/write access,
! 146: # it is not if readonly_shm=1 is present in the URI.
! 147: do_test 1.3.2.1 {
! 148: code1 { db close }
! 149: code2 { db2 close }
! 150: file exists test.db-shm
! 151: } {0}
! 152: do_test 1.3.2.2 {
! 153: code1 { sqlite3 db file:test.db?readonly_shm=1 }
! 154: csql1 { SELECT * FROM sqlite_master }
! 155: } {1 {unable to open database file}}
! 156: do_test 1.3.2.3 {
! 157: code1 { db close }
! 158: close [open test.db-shm w]
! 159: file attributes test.db-shm -permissions r--r--r--
! 160: code1 { sqlite3 db file:test.db?readonly_shm=1 }
! 161: csql1 { SELECT * FROM t1 }
! 162: } {1 {attempt to write a readonly database}}
! 163: do_test 1.3.2.4 {
! 164: code1 { sqlite3_extended_errcode db }
! 165: } {SQLITE_READONLY_RECOVERY}
! 166: }
! 167:
! 168: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>