16fa255fdSdan# 2011 November 16 26fa255fdSdan# 36fa255fdSdan# The author disclaims copyright to this source code. In place of 46fa255fdSdan# a legal notice, here is a blessing: 56fa255fdSdan# 66fa255fdSdan# May you do good and not evil. 76fa255fdSdan# May you find forgiveness for yourself and forgive others. 86fa255fdSdan# May you share freely, never taking more than you give. 96fa255fdSdan# 106fa255fdSdan#*********************************************************************** 116fa255fdSdan# 126fa255fdSdan# This file contains fault-injection test cases for the 136fa255fdSdan# sqlite3_db_cacheflush API. 146fa255fdSdan# 156fa255fdSdan 166fa255fdSdanset testdir [file dirname $argv0] 176fa255fdSdansource $testdir/tester.tcl 18*67330a12Sdanset testprefix cffault 196fa255fdSdansource $testdir/malloc_common.tcl 206fa255fdSdan 216fa255fdSdan# Run the supplied SQL on a copy of the database currently stored on 226fa255fdSdan# disk in file $dbfile. 236fa255fdSdanproc diskquery {dbfile sql} { 246fa255fdSdan forcecopy $dbfile dq.db 256fa255fdSdan sqlite3 dq dq.db 266fa255fdSdan set res [execsql $sql dq] 276fa255fdSdan dq close 286fa255fdSdan set res 296fa255fdSdan} 306fa255fdSdan 316fa255fdSdando_execsql_test 1.0 { 326fa255fdSdan CREATE TABLE t1(a PRIMARY KEY, b); 336fa255fdSdan CREATE INDEX i1 ON t1(b); 346fa255fdSdan INSERT INTO t1 VALUES(1, 2); 356fa255fdSdan INSERT INTO t1 VALUES(3, 4); 366fa255fdSdan INSERT INTO t1 VALUES(5, 6); 376fa255fdSdan INSERT INTO t1 VALUES(7, 8); 386fa255fdSdan} 396fa255fdSdanfaultsim_save_and_close 406fa255fdSdan 41dbf6773eSdando_faultsim_test 1.1 -prep { 426fa255fdSdan faultsim_restore_and_reopen 436fa255fdSdan db eval { 446fa255fdSdan BEGIN; 456fa255fdSdan UPDATE t1 SET b=b+1; 466fa255fdSdan } 476fa255fdSdan} -body { 486fa255fdSdan sqlite3_db_cacheflush db 496fa255fdSdan} -test { 50dbf6773eSdan if {[sqlite3_get_autocommit db]} { error "Transaction rolled back!" } 516fa255fdSdan faultsim_test_result {0 {}} {1 {disk I/O error}} 526fa255fdSdan catch { db eval COMMIT } 536fa255fdSdan faultsim_integrity_check 546fa255fdSdan} 556fa255fdSdan 56dbf6773eSdando_faultsim_test 1.2 -prep { 57dbf6773eSdan faultsim_restore_and_reopen 58dbf6773eSdan db eval { 59dbf6773eSdan BEGIN; 60dbf6773eSdan UPDATE t1 SET b=b+1; 61dbf6773eSdan } 62dbf6773eSdan} -body { 63dbf6773eSdan set result [list] 64dbf6773eSdan db eval { SELECT * FROM t1 } { 65dbf6773eSdan if {$a==5} { catch { sqlite3_db_cacheflush db } } 66dbf6773eSdan lappend result $a $b 67dbf6773eSdan } 68dbf6773eSdan set result 69dbf6773eSdan} -test { 70dbf6773eSdan faultsim_test_result {0 {1 3 3 5 5 7 7 9}} {1 {disk I/O error}} 71dbf6773eSdan catch { db eval COMMIT } 72dbf6773eSdan faultsim_integrity_check 73dbf6773eSdan} 74dbf6773eSdan 75dbf6773eSdan#------------------------------------------------------------------------- 76dbf6773eSdanreset_db 77dbf6773eSdando_execsql_test 2.0 { 78dbf6773eSdan CREATE TABLE t1(a PRIMARY KEY, b, c); 79dbf6773eSdan CREATE INDEX i1 ON t1(b); 80dbf6773eSdan CREATE INDEX i2 ON t1(c, b); 81dbf6773eSdan INSERT INTO t1 VALUES(1, 2, randomblob(600)); 82dbf6773eSdan INSERT INTO t1 VALUES(3, 4, randomblob(600)); 83dbf6773eSdan INSERT INTO t1 VALUES(5, 6, randomblob(600)); 84dbf6773eSdan INSERT INTO t1 VALUES(7, 8, randomblob(600)); 85dbf6773eSdan INSERT INTO t1 VALUES(9, 10, randomblob(600)); 86dbf6773eSdan} 87dbf6773eSdanfaultsim_save_and_close 88dbf6773eSdan 89dbf6773eSdando_faultsim_test 2.1 -prep { 90dbf6773eSdan faultsim_restore_and_reopen 91dbf6773eSdan db eval { 92dbf6773eSdan BEGIN; 93dbf6773eSdan UPDATE t1 SET b=b+1; 94dbf6773eSdan } 95dbf6773eSdan} -body { 96dbf6773eSdan set result [list] 97dbf6773eSdan db eval { SELECT * FROM t1 } { 98dbf6773eSdan if {$a==5} { catch { sqlite3_db_cacheflush db } } 99dbf6773eSdan lappend result $a $b 100dbf6773eSdan } 101dbf6773eSdan set result 102dbf6773eSdan} -test { 103dbf6773eSdan faultsim_test_result {0 {1 3 3 5 5 7 7 9 9 11}} {1 {disk I/O error}} 104dbf6773eSdan catch { db eval { INSERT INTO t1 VALUES(11, 12, randomblob(600)) } } 105dbf6773eSdan catch { db eval COMMIT } 106dbf6773eSdan faultsim_integrity_check 107dbf6773eSdan} 108dbf6773eSdan 109dbf6773eSdando_faultsim_test 2.2 -prep { 110dbf6773eSdan faultsim_restore_and_reopen 111dbf6773eSdan db eval { 112dbf6773eSdan BEGIN; 113dbf6773eSdan UPDATE t1 SET b=b+1; 114dbf6773eSdan } 115dbf6773eSdan} -body { 116dbf6773eSdan sqlite3_db_cacheflush db 117dbf6773eSdan} -test { 118dbf6773eSdan if {[sqlite3_get_autocommit db]} { error "Transaction rolled back!" } 119dbf6773eSdan faultsim_test_result {0 {}} {1 {disk I/O error}} 120dbf6773eSdan catch { db eval { SELECT * FROM t1 } } 121dbf6773eSdan catch { db eval COMMIT } 122dbf6773eSdan faultsim_integrity_check 123dbf6773eSdan} 124dbf6773eSdan 125dbf6773eSdando_faultsim_test 2.3 -prep { 126dbf6773eSdan faultsim_restore_and_reopen 127dbf6773eSdan db eval { 128dbf6773eSdan BEGIN; 129dbf6773eSdan UPDATE t1 SET b=b-1; 130dbf6773eSdan } 131dbf6773eSdan} -body { 132dbf6773eSdan sqlite3_db_cacheflush db 133dbf6773eSdan} -test { 134dbf6773eSdan if {[sqlite3_get_autocommit db]} { error "Transaction rolled back!" } 135dbf6773eSdan faultsim_test_result {0 {}} {1 {disk I/O error}} 136dbf6773eSdan catch { db eval { INSERT INTO t1 VALUES(11, 12, randomblob(600)) } } 137dbf6773eSdan catch { db eval COMMIT } 138dbf6773eSdan faultsim_integrity_check 139dbf6773eSdan} 140dbf6773eSdan 141dbf6773eSdando_faultsim_test 2.4 -prep { 142dbf6773eSdan faultsim_restore_and_reopen 143dbf6773eSdan db eval { 144dbf6773eSdan BEGIN; 145dbf6773eSdan UPDATE t1 SET b=b-1; 146dbf6773eSdan } 147dbf6773eSdan} -body { 148dbf6773eSdan catch { sqlite3_db_cacheflush db } 149dbf6773eSdan catch { sqlite3_db_release_memory db } 150dbf6773eSdan catch { sqlite3_db_cacheflush db } 151dbf6773eSdan execsql { SELECT a, b FROM t1 } 152dbf6773eSdan} -test { 153dbf6773eSdan faultsim_test_result {0 {1 1 3 3 5 5 7 7 9 9}} {1 {disk I/O error}} 154dbf6773eSdan catchsql ROLLBACK 155dbf6773eSdan faultsim_integrity_check 156dbf6773eSdan} 1576fa255fdSdan 1586fa255fdSdanfinish_test 159