1658dd586Sdrh 2658dd586Sdrh# 2011 December 13 3658dd586Sdrh# 4658dd586Sdrh# The author disclaims copyright to this source code. In place of 5658dd586Sdrh# a legal notice, here is a blessing: 6658dd586Sdrh# 7658dd586Sdrh# May you do good and not evil. 8658dd586Sdrh# May you find forgiveness for yourself and forgive others. 9658dd586Sdrh# May you share freely, never taking more than you give. 10658dd586Sdrh# 11658dd586Sdrh#*********************************************************************** 12658dd586Sdrh# 13658dd586Sdrh# This file contains tests for error (IO, OOM etc.) handling when using 14658dd586Sdrh# the multiplexor extension with 8.3 filenames. 15658dd586Sdrh# 16658dd586Sdrh 171cdf011dSdrhset testdir [file dirname $argv0] 18658dd586Sdrhsource $testdir/tester.tcl 19658dd586Sdrhsource $testdir/malloc_common.tcl 20658dd586Sdrhset ::testprefix multiplex3 21658dd586Sdrh 22658dd586Sdrhifcapable !8_3_names { 23658dd586Sdrh puts -nonewline "SQLite compiled without SQLITE_ENABLE_8_3_NAMES. " 241cdf011dSdrh puts "Skipping tests multiplex3-*." 25658dd586Sdrh finish_test 26658dd586Sdrh return 27658dd586Sdrh} 28658dd586Sdrh 29658dd586Sdrhdb close 30658dd586Sdrhsqlite3_shutdown 31658dd586Sdrhsqlite3_config_uri 1 32658dd586Sdrhautoinstall_test_functions 33658dd586Sdrh 34658dd586Sdrhsqlite3_multiplex_initialize "" 1 35658dd586Sdrh 36658dd586Sdrhproc destroy_vfs_stack {} { 37658dd586Sdrh generic_unregister stack 38658dd586Sdrh sqlite3_multiplex_shutdown 39658dd586Sdrh} 40658dd586Sdrh 41658dd586Sdrhproc multiplex_delete_db {} { 42658dd586Sdrh forcedelete test.db 43658dd586Sdrh for {set i 1} {$i <= 1000} {incr i} { 44658dd586Sdrh forcedelete test.[format %03d $i] 45658dd586Sdrh } 46658dd586Sdrh} 47658dd586Sdrh 48658dd586Sdrh# Procs to save and restore the current muliplexed database. 49658dd586Sdrh# 50658dd586Sdrhproc multiplex_save_db {} { 51658dd586Sdrh foreach f [glob -nocomplain sv_test.*] { forcedelete $f } 52658dd586Sdrh foreach f [glob -nocomplain test.*] { forcecopy $f "sv_$f" } 53658dd586Sdrh} 54658dd586Sdrhproc multiplex_restore_db {} { 55658dd586Sdrh foreach f [glob -nocomplain test.*] {forcedelete $f} 56658dd586Sdrh foreach f [glob -nocomplain sv_test.*] {forcecopy $f [string range $f 3 end]} } 57658dd586Sdrh 58add995ccSdanproc setup_and_save_db {} { 59658dd586Sdrh multiplex_delete_db 60658dd586Sdrh sqlite3 db file:test.db?8_3_names=1 61658dd586Sdrh sqlite3_multiplex_control db main chunk_size [expr 256*1024] 62658dd586Sdrh execsql { 63658dd586Sdrh CREATE TABLE t1(a PRIMARY KEY, b); 64658dd586Sdrh INSERT INTO t1 VALUES(randomblob(15), randomblob(2000)); 65658dd586Sdrh INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1; -- 2 66658dd586Sdrh INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1; -- 4 67658dd586Sdrh INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1; -- 8 68658dd586Sdrh INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1; -- 16 69658dd586Sdrh INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1; -- 32 70658dd586Sdrh INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1; -- 64 71658dd586Sdrh INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1; -- 128 72658dd586Sdrh INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1; -- 256 73658dd586Sdrh INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1; -- 512 74658dd586Sdrh } 75658dd586Sdrh set ::cksum1 [execsql {SELECT md5sum(a, b) FROM t1 ORDER BY a}] 76658dd586Sdrh db close 77658dd586Sdrh multiplex_save_db 78add995ccSdan} 79658dd586Sdrh 80add995ccSdando_test 1.0 { setup_and_save_db } {} 81658dd586Sdrhdo_faultsim_test 1 -prep { 82658dd586Sdrh multiplex_restore_db 83658dd586Sdrh sqlite3 db file:test.db?8_3_names=1 84658dd586Sdrh sqlite3_multiplex_control db main chunk_size [expr 256*1024] 85658dd586Sdrh} -body { 86add995ccSdan execsql { 87add995ccSdan UPDATE t1 SET a=randomblob(12), b=randomblob(1500) WHERE (rowid%32)=0 88add995ccSdan } 89658dd586Sdrh} -test { 90658dd586Sdrh faultsim_test_result {0 {}} 91658dd586Sdrh if {$testrc!=0} { 92658dd586Sdrh set cksum2 [execsql {SELECT md5sum(a, b) FROM t1 ORDER BY a}] 93658dd586Sdrh if {$cksum2 != $::cksum1} { error "data mismatch" } 94658dd586Sdrh } 95658dd586Sdrh} 96658dd586Sdrh 97add995ccSdan#------------------------------------------------------------------------- 98add995ccSdan# The following tests verify that hot-journal rollback works. As follows: 99add995ccSdan# 100add995ccSdan# 1. Create a large database. 101add995ccSdan# 2. Set the pager cache to be very small. 102add995ccSdan# 3. Open a transaction. 103add995ccSdan# 4. Run the following 100 times: 104add995ccSdan# a. Update a row. 105add995ccSdan# b. Copy all files on disk to a new db location, including the journal. 106add995ccSdan# c. Verify that the new db can be opened and that the content matches 107add995ccSdan# the database created in step 1 (proving the journal was rolled 108add995ccSdan# back). 109658dd586Sdrh 110add995ccSdando_test 2.0 { 111add995ccSdan setup_and_save_db 112add995ccSdan multiplex_restore_db 113add995ccSdan sqlite3 db file:test.db?8_3_names=1 114add995ccSdan execsql { PRAGMA cache_size = 10 } 115add995ccSdan execsql { BEGIN } 116add995ccSdan} {} 117add995ccSdan 118add995ccSdanfor {set iTest 1} {$iTest<=100} {incr iTest} { 119add995ccSdan do_test 2.$iTest { 120add995ccSdan execsql { 121add995ccSdan UPDATE t1 SET a=randomblob(12), b=randomblob(1400) WHERE rowid=5*$iTest 122add995ccSdan } 123add995ccSdan foreach f [glob -nocomplain test.*] {forcecopy $f "xx_$f"} 124add995ccSdan sqlite3 db2 file:xx_test.db?8_3_names=1 125add995ccSdan execsql {SELECT md5sum(a, b) FROM t1 ORDER BY a} db2 126add995ccSdan } $::cksum1 127add995ccSdan 128add995ccSdan db2 close 129add995ccSdan} 130*4aced72aSdancatch { db close } 131*4aced72aSdan 132*4aced72aSdan 133*4aced72aSdando_test 3.0 { setup_and_save_db } {} 134*4aced72aSdando_faultsim_test 3 -faults ioerr-trans* -prep { 135*4aced72aSdan 136*4aced72aSdan forcedelete test2.db 137*4aced72aSdan set fd [open test2.wal w] 138*4aced72aSdan seek $fd 4095 139*4aced72aSdan puts -nonewline $fd x 140*4aced72aSdan close $fd 141*4aced72aSdan 142*4aced72aSdan multiplex_restore_db 143*4aced72aSdan sqlite3 db file:test.db?8_3_names=1 144*4aced72aSdan sqlite3 db2 file:test2.db?8_3_names=1 145*4aced72aSdan sqlite3_multiplex_control db main chunk_size [expr 256*1024] 146*4aced72aSdan sqlite3_multiplex_control db2 main chunk_size [expr 256*1024] 147*4aced72aSdan} -body { 148*4aced72aSdan sqlite3_backup B db2 main db main 149*4aced72aSdan B step 100000 150*4aced72aSdan set rc [B finish] 151*4aced72aSdan if { [string match SQLITE_IOERR_* $rc] } {error "disk I/O error"} 152*4aced72aSdan set rc 153*4aced72aSdan} -test { 154*4aced72aSdan faultsim_test_result {0 SQLITE_OK} 155*4aced72aSdan if {$testrc==0} { 156*4aced72aSdan set cksum2 [execsql {SELECT md5sum(a, b) FROM t1 ORDER BY a} db2] 157*4aced72aSdan if {$cksum2 != $::cksum1} { error "data mismatch" } 158*4aced72aSdan } 159*4aced72aSdan catch { B finish } 160*4aced72aSdan catch { db close } 161*4aced72aSdan catch { db2 close } 162*4aced72aSdan} 163add995ccSdan 164add995ccSdancatch { db close } 165658dd586Sdrhsqlite3_multiplex_shutdown 166658dd586Sdrhfinish_test 167