Annotation of embedaddon/sqlite3/test/walro.test, revision 1.1.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>