gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/cffault.test (about) 1 # 2011 November 16 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 fault-injection test cases for the 13 # sqlite3_db_cacheflush API. 14 # 15 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 set testprefix cffault 19 source $testdir/malloc_common.tcl 20 21 # Run the supplied SQL on a copy of the database currently stored on 22 # disk in file $dbfile. 23 proc diskquery {dbfile sql} { 24 forcecopy $dbfile dq.db 25 sqlite3 dq dq.db 26 set res [execsql $sql dq] 27 dq close 28 set res 29 } 30 31 do_execsql_test 1.0 { 32 CREATE TABLE t1(a PRIMARY KEY, b); 33 CREATE INDEX i1 ON t1(b); 34 INSERT INTO t1 VALUES(1, 2); 35 INSERT INTO t1 VALUES(3, 4); 36 INSERT INTO t1 VALUES(5, 6); 37 INSERT INTO t1 VALUES(7, 8); 38 } 39 faultsim_save_and_close 40 41 do_faultsim_test 1.1 -prep { 42 faultsim_restore_and_reopen 43 db eval { 44 BEGIN; 45 UPDATE t1 SET b=b+1; 46 } 47 } -body { 48 sqlite3_db_cacheflush db 49 } -test { 50 if {[sqlite3_get_autocommit db]} { error "Transaction rolled back!" } 51 faultsim_test_result {0 {}} {1 {disk I/O error}} 52 catch { db eval COMMIT } 53 faultsim_integrity_check 54 } 55 56 do_faultsim_test 1.2 -prep { 57 faultsim_restore_and_reopen 58 db eval { 59 BEGIN; 60 UPDATE t1 SET b=b+1; 61 } 62 } -body { 63 set result [list] 64 db eval { SELECT * FROM t1 } { 65 if {$a==5} { catch { sqlite3_db_cacheflush db } } 66 lappend result $a $b 67 } 68 set result 69 } -test { 70 faultsim_test_result {0 {1 3 3 5 5 7 7 9}} {1 {disk I/O error}} 71 catch { db eval COMMIT } 72 faultsim_integrity_check 73 } 74 75 #------------------------------------------------------------------------- 76 reset_db 77 do_execsql_test 2.0 { 78 CREATE TABLE t1(a PRIMARY KEY, b, c); 79 CREATE INDEX i1 ON t1(b); 80 CREATE INDEX i2 ON t1(c, b); 81 INSERT INTO t1 VALUES(1, 2, randomblob(600)); 82 INSERT INTO t1 VALUES(3, 4, randomblob(600)); 83 INSERT INTO t1 VALUES(5, 6, randomblob(600)); 84 INSERT INTO t1 VALUES(7, 8, randomblob(600)); 85 INSERT INTO t1 VALUES(9, 10, randomblob(600)); 86 } 87 faultsim_save_and_close 88 89 do_faultsim_test 2.1 -prep { 90 faultsim_restore_and_reopen 91 db eval { 92 BEGIN; 93 UPDATE t1 SET b=b+1; 94 } 95 } -body { 96 set result [list] 97 db eval { SELECT * FROM t1 } { 98 if {$a==5} { catch { sqlite3_db_cacheflush db } } 99 lappend result $a $b 100 } 101 set result 102 } -test { 103 faultsim_test_result {0 {1 3 3 5 5 7 7 9 9 11}} {1 {disk I/O error}} 104 catch { db eval { INSERT INTO t1 VALUES(11, 12, randomblob(600)) } } 105 catch { db eval COMMIT } 106 faultsim_integrity_check 107 } 108 109 do_faultsim_test 2.2 -prep { 110 faultsim_restore_and_reopen 111 db eval { 112 BEGIN; 113 UPDATE t1 SET b=b+1; 114 } 115 } -body { 116 sqlite3_db_cacheflush db 117 } -test { 118 if {[sqlite3_get_autocommit db]} { error "Transaction rolled back!" } 119 faultsim_test_result {0 {}} {1 {disk I/O error}} 120 catch { db eval { SELECT * FROM t1 } } 121 catch { db eval COMMIT } 122 faultsim_integrity_check 123 } 124 125 do_faultsim_test 2.3 -prep { 126 faultsim_restore_and_reopen 127 db eval { 128 BEGIN; 129 UPDATE t1 SET b=b-1; 130 } 131 } -body { 132 sqlite3_db_cacheflush db 133 } -test { 134 if {[sqlite3_get_autocommit db]} { error "Transaction rolled back!" } 135 faultsim_test_result {0 {}} {1 {disk I/O error}} 136 catch { db eval { INSERT INTO t1 VALUES(11, 12, randomblob(600)) } } 137 catch { db eval COMMIT } 138 faultsim_integrity_check 139 } 140 141 do_faultsim_test 2.4 -prep { 142 faultsim_restore_and_reopen 143 db eval { 144 BEGIN; 145 UPDATE t1 SET b=b-1; 146 } 147 } -body { 148 catch { sqlite3_db_cacheflush db } 149 catch { sqlite3_db_release_memory db } 150 catch { sqlite3_db_cacheflush db } 151 execsql { SELECT a, b FROM t1 } 152 } -test { 153 faultsim_test_result {0 {1 1 3 3 5 5 7 7 9 9}} {1 {disk I/O error}} 154 catchsql ROLLBACK 155 faultsim_integrity_check 156 } 157 158 finish_test