blob: 5b786586bf4462e00d2d2c5dbe7b4e1ba990fcdd [file] [log] [blame]
dan140a5982018-07-14 20:25:13 +00001# 2018-07-15
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# This file implements regression tests for SQLite library. The
12# focus of this file is testing that if an IO error is encountered
13# as part of an atomic F2FS commit, an attempt is made to commit the
14# transaction using a legacy journal commit.
15#
16
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19source $testdir/malloc_common.tcl
20set ::testprefix atomic2
21
22db close
23if {[atomic_batch_write test.db]==0} {
24 puts "No f2fs atomic-batch-write support. Skipping tests..."
25 finish_test
26 return
27}
28
29reset_db
30
31do_execsql_test 1.0 {
32 CREATE TABLE t1(x, y);
33 CREATE INDEX i1x ON t1(x);
34 CREATE INDEX i2x ON t1(y);
35
36 WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 )
37 INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s;
38}
39
40set setup [list \
41 -injectstart at_injectstart \
42 -injectstop at_injectstop \
43]
44
45set ::at_fail 0
46set ::at_nfail 0
47
48proc at_injectstart {iFail} {
49 set ::at_fail $iFail
50 set ::at_nfail 0
51}
52proc at_injectstop {} {
53 set ::at_fail 0
54 return $::at_nfail
55}
56
57proc at_vfs_callback {method file z args} {
58 if {$::at_fail>0} {
59 incr ::at_fail -1
60 if {$::at_fail==0} {
61 incr ::at_nfail
62 return SQLITE_IOERR
63 } elseif {$method=="xFileControl" && $z=="COMMIT_ATOMIC_WRITE"} {
64 set ::at_fail 0
65 }
66 }
67 return SQLITE_OK
68}
69
70testvfs tvfs -default 1
71tvfs script at_vfs_callback
72tvfs filter {xFileControl xWrite}
73
74faultsim_save_and_close
75
76do_one_faultsim_test 2.0 {*}$setup -prep {
77 faultsim_restore_and_reopen
78} -body {
79 execsql {
80 WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 )
81 INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s;
82 }
83} -test {
84 faultsim_test_result {0 {}}
85
86 set res [execsql {SELECT count(*) FROM t1; PRAGMA integrity_check}]
87 if {$res!="200 ok"} {
88 error "expected {200 ok}, got $res"
89 }
90}
91
92db close
93tvfs delete
94
95finish_test