1*140a5987Sdan# 2018-07-15 2*140a5987Sdan# 3*140a5987Sdan# The author disclaims copyright to this source code. In place of 4*140a5987Sdan# a legal notice, here is a blessing: 5*140a5987Sdan# 6*140a5987Sdan# May you do good and not evil. 7*140a5987Sdan# May you find forgiveness for yourself and forgive others. 8*140a5987Sdan# May you share freely, never taking more than you give. 9*140a5987Sdan# 10*140a5987Sdan#*********************************************************************** 11*140a5987Sdan# This file implements regression tests for SQLite library. The 12*140a5987Sdan# focus of this file is testing that if an IO error is encountered 13*140a5987Sdan# as part of an atomic F2FS commit, an attempt is made to commit the 14*140a5987Sdan# transaction using a legacy journal commit. 15*140a5987Sdan# 16*140a5987Sdan 17*140a5987Sdanset testdir [file dirname $argv0] 18*140a5987Sdansource $testdir/tester.tcl 19*140a5987Sdansource $testdir/malloc_common.tcl 20*140a5987Sdanset ::testprefix atomic2 21*140a5987Sdan 22*140a5987Sdandb close 23*140a5987Sdanif {[atomic_batch_write test.db]==0} { 24*140a5987Sdan puts "No f2fs atomic-batch-write support. Skipping tests..." 25*140a5987Sdan finish_test 26*140a5987Sdan return 27*140a5987Sdan} 28*140a5987Sdan 29*140a5987Sdanreset_db 30*140a5987Sdan 31*140a5987Sdando_execsql_test 1.0 { 32*140a5987Sdan CREATE TABLE t1(x, y); 33*140a5987Sdan CREATE INDEX i1x ON t1(x); 34*140a5987Sdan CREATE INDEX i2x ON t1(y); 35*140a5987Sdan 36*140a5987Sdan WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 ) 37*140a5987Sdan INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; 38*140a5987Sdan} 39*140a5987Sdan 40*140a5987Sdanset setup [list \ 41*140a5987Sdan -injectstart at_injectstart \ 42*140a5987Sdan -injectstop at_injectstop \ 43*140a5987Sdan] 44*140a5987Sdan 45*140a5987Sdanset ::at_fail 0 46*140a5987Sdanset ::at_nfail 0 47*140a5987Sdan 48*140a5987Sdanproc at_injectstart {iFail} { 49*140a5987Sdan set ::at_fail $iFail 50*140a5987Sdan set ::at_nfail 0 51*140a5987Sdan} 52*140a5987Sdanproc at_injectstop {} { 53*140a5987Sdan set ::at_fail 0 54*140a5987Sdan return $::at_nfail 55*140a5987Sdan} 56*140a5987Sdan 57*140a5987Sdanproc at_vfs_callback {method file z args} { 58*140a5987Sdan if {$::at_fail>0} { 59*140a5987Sdan incr ::at_fail -1 60*140a5987Sdan if {$::at_fail==0} { 61*140a5987Sdan incr ::at_nfail 62*140a5987Sdan return SQLITE_IOERR 63*140a5987Sdan } elseif {$method=="xFileControl" && $z=="COMMIT_ATOMIC_WRITE"} { 64*140a5987Sdan set ::at_fail 0 65*140a5987Sdan } 66*140a5987Sdan } 67*140a5987Sdan return SQLITE_OK 68*140a5987Sdan} 69*140a5987Sdan 70*140a5987Sdantestvfs tvfs -default 1 71*140a5987Sdantvfs script at_vfs_callback 72*140a5987Sdantvfs filter {xFileControl xWrite} 73*140a5987Sdan 74*140a5987Sdanfaultsim_save_and_close 75*140a5987Sdan 76*140a5987Sdando_one_faultsim_test 2.0 {*}$setup -prep { 77*140a5987Sdan faultsim_restore_and_reopen 78*140a5987Sdan} -body { 79*140a5987Sdan execsql { 80*140a5987Sdan WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 ) 81*140a5987Sdan INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; 82*140a5987Sdan } 83*140a5987Sdan} -test { 84*140a5987Sdan faultsim_test_result {0 {}} 85*140a5987Sdan 86*140a5987Sdan set res [execsql {SELECT count(*) FROM t1; PRAGMA integrity_check}] 87*140a5987Sdan if {$res!="200 ok"} { 88*140a5987Sdan error "expected {200 ok}, got $res" 89*140a5987Sdan } 90*140a5987Sdan} 91*140a5987Sdan 92*140a5987Sdandb close 93*140a5987Sdantvfs delete 94*140a5987Sdan 95*140a5987Sdanfinish_test 96