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>