xref: /sqlite-3.40.0/test/cffault.test (revision 67330a12)
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