summaryrefslogtreecommitdiffstats
path: root/test/atomic2.test
diff options
context:
space:
mode:
Diffstat (limited to 'test/atomic2.test')
-rw-r--r--test/atomic2.test95
1 files changed, 95 insertions, 0 deletions
diff --git a/test/atomic2.test b/test/atomic2.test
new file mode 100644
index 0000000..5b78658
--- /dev/null
+++ b/test/atomic2.test
@@ -0,0 +1,95 @@
+# 2018-07-15
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+# This file implements regression tests for SQLite library. The
+# focus of this file is testing that if an IO error is encountered
+# as part of an atomic F2FS commit, an attempt is made to commit the
+# transaction using a legacy journal commit.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+source $testdir/malloc_common.tcl
+set ::testprefix atomic2
+
+db close
+if {[atomic_batch_write test.db]==0} {
+ puts "No f2fs atomic-batch-write support. Skipping tests..."
+ finish_test
+ return
+}
+
+reset_db
+
+do_execsql_test 1.0 {
+ CREATE TABLE t1(x, y);
+ CREATE INDEX i1x ON t1(x);
+ CREATE INDEX i2x ON t1(y);
+
+ WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 )
+ INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s;
+}
+
+set setup [list \
+ -injectstart at_injectstart \
+ -injectstop at_injectstop \
+]
+
+set ::at_fail 0
+set ::at_nfail 0
+
+proc at_injectstart {iFail} {
+ set ::at_fail $iFail
+ set ::at_nfail 0
+}
+proc at_injectstop {} {
+ set ::at_fail 0
+ return $::at_nfail
+}
+
+proc at_vfs_callback {method file z args} {
+ if {$::at_fail>0} {
+ incr ::at_fail -1
+ if {$::at_fail==0} {
+ incr ::at_nfail
+ return SQLITE_IOERR
+ } elseif {$method=="xFileControl" && $z=="COMMIT_ATOMIC_WRITE"} {
+ set ::at_fail 0
+ }
+ }
+ return SQLITE_OK
+}
+
+testvfs tvfs -default 1
+tvfs script at_vfs_callback
+tvfs filter {xFileControl xWrite}
+
+faultsim_save_and_close
+
+do_one_faultsim_test 2.0 {*}$setup -prep {
+ faultsim_restore_and_reopen
+} -body {
+ execsql {
+ WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 )
+ INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s;
+ }
+} -test {
+ faultsim_test_result {0 {}}
+
+ set res [execsql {SELECT count(*) FROM t1; PRAGMA integrity_check}]
+ if {$res!="200 ok"} {
+ error "expected {200 ok}, got $res"
+ }
+}
+
+db close
+tvfs delete
+
+finish_test