Annotation of embedaddon/sqlite3/test/sysfault.test, revision 1.1.1.1

1.1       misho       1: # 2011 March 28
                      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: 
                     13: set testdir [file dirname $argv0]
                     14: source $testdir/tester.tcl
                     15: source $testdir/lock_common.tcl
                     16: source $testdir/malloc_common.tcl
                     17: 
                     18: if {[llength [info commands test_syscall]]==0} {
                     19:   finish_test
                     20:   return
                     21: } 
                     22: 
                     23: set testprefix sysfault
                     24: 
                     25: set FAULTSIM(vfsfault-transient) [list             \
                     26:   -injectinstall   vfsfault_install                \
                     27:   -injectstart     vfsfault_injectstart_t          \
                     28:   -injectstop      vfsfault_injectstop             \
                     29:   -injecterrlist   {}                              \
                     30:   -injectuninstall {test_syscall uninstall}        \
                     31: ]
                     32: set FAULTSIM(vfsfault-persistent) [list            \
                     33:   -injectinstall   vfsfault_install                \
                     34:   -injectstart     vfsfault_injectstart_p          \
                     35:   -injectstop      vfsfault_injectstop             \
                     36:   -injecterrlist   {}                              \
                     37:   -injectuninstall {test_syscall uninstall}        \
                     38: ]
                     39: 
                     40: proc vfsfault_injectstart_t {iFail} { test_syscall fault $iFail 0 }
                     41: proc vfsfault_injectstart_p {iFail} { test_syscall fault $iFail 1 }
                     42: proc vfsfault_injectstop    {}      { test_syscall fault }
                     43: 
                     44: faultsim_save_and_close
                     45: 
                     46: 
                     47: set open_and_write_body {
                     48:   sqlite3 db test.db
                     49:   db eval {
                     50:     CREATE TABLE t1(a, b);
                     51:     INSERT INTO t1 VALUES(1, 2);
                     52:     PRAGMA journal_mode = WAL;
                     53:     INSERT INTO t1 VALUES(3, 4);
                     54:     SELECT * FROM t1;
                     55:     CREATE TEMP TABLE t2(x);
                     56:     INSERT INTO t2 VALUES('y');
                     57:   }
                     58: }
                     59: 
                     60: proc vfsfault_install {} { test_syscall install {open getcwd} }
                     61: do_faultsim_test 1 -faults vfsfault-* -prep {
                     62:   faultsim_restore
                     63: } -body $open_and_write_body -test {
                     64:   faultsim_test_result {0 {wal 1 2 3 4}}       \
                     65:     {1 {unable to open database file}}         \
                     66:     {1 {attempt to write a readonly database}}
                     67: }
                     68: 
                     69: #-------------------------------------------------------------------------
                     70: # Errors in the fstat() function when opening and writing a file. Cases
                     71: # where fstat() fails and sets errno to ENOMEM and EOVERFLOW are both
                     72: # tested. EOVERFLOW is interpreted as meaning that a file on disk is
                     73: # too large to be opened by the OS.
                     74: #
                     75: foreach {tn errno errlist} {
                     76:   1 ENOMEM       {{disk I/O error}}
                     77:   2 EOVERFLOW    {{disk I/O error} {large file support is disabled}}
                     78: } {
                     79:   proc vfsfault_install {} { test_syscall install fstat }
                     80:   set errs [list]
                     81:   foreach e $errlist { lappend errs [list 1 $e] }
                     82:   do_faultsim_test 1.2.$tn -faults vfsfault-* -prep {
                     83:     faultsim_restore
                     84:   } -body "
                     85:     test_syscall errno fstat $errno
                     86:     $open_and_write_body 
                     87:   " -test "
                     88:     faultsim_test_result {0 {wal 1 2 3 4}} $errs
                     89:   "
                     90: }
                     91: 
                     92: #-------------------------------------------------------------------------
                     93: # Various errors in locking functions. 
                     94: #
                     95: foreach vfs {unix unix-excl} {
                     96:   foreach {tn errno errlist} {
                     97:     1 EAGAIN       {{database is locked} {disk I/O error}}
                     98:     2 ETIMEDOUT    {{database is locked} {disk I/O error}}
                     99:     3 EBUSY        {{database is locked} {disk I/O error}}
                    100:     4 EINTR        {{database is locked} {disk I/O error}}
                    101:     5 ENOLCK       {{database is locked} {disk I/O error}}
                    102:     6 EACCES       {{database is locked} {disk I/O error}}
                    103:     7 EPERM        {{access permission denied} {disk I/O error}}
                    104:     8 EDEADLK      {{disk I/O error}}
                    105:     9 ENOMEM       {{disk I/O error}}
                    106:   } {
                    107:     proc vfsfault_install {} { test_syscall install fcntl }
                    108:     set errs [list]
                    109:     foreach e $errlist { lappend errs [list 1 $e] }
                    110:   
                    111:     set body [string map [list %VFS% $vfs] {
                    112:       sqlite3 db test.db
                    113:       db eval {
                    114:         CREATE TABLE t1(a, b);
                    115:         INSERT INTO t1 VALUES(1, 2);
                    116:       }
                    117:       set fd [open test.db-journal w]
                    118:       puts $fd "hello world"
                    119:       close $fd
                    120:       sqlite3 db test.db -vfs %VFS%
                    121:       db eval {
                    122:         SELECT * FROM t1;
                    123:       }
                    124:     }]
                    125:   
                    126:     do_faultsim_test 1.3.$vfs.$tn -faults vfsfault-* -prep {
                    127:       faultsim_restore
                    128:     } -body "
                    129:       test_syscall errno fcntl $errno
                    130:       $body
                    131:     " -test "
                    132:       faultsim_test_result {0 {1 2}} $errs
                    133:     "
                    134:   }
                    135: }
                    136: 
                    137: #-------------------------------------------------------------------------
                    138: # Check that a single EINTR error does not affect processing.
                    139: #
                    140: proc vfsfault_install {} { 
                    141:   test_syscall reset
                    142:   test_syscall install {open ftruncate close read pread pread64 write fallocate}
                    143: }
                    144: 
                    145: forcedelete test.db test.db2
                    146: sqlite3 db test.db
                    147: do_test 2.setup {
                    148:   execsql {
                    149:     CREATE TABLE t1(a, b, c, PRIMARY KEY(a));
                    150:     INSERT INTO t1 VALUES('abc', 'def', 'ghi');
                    151:     ATTACH 'test.db2' AS 'aux';
                    152:     CREATE TABLE aux.t2(x);
                    153:     INSERT INTO t2 VALUES(1);
                    154:   }
                    155:   faultsim_save_and_close
                    156: } {}
                    157: 
                    158: do_faultsim_test 2.1 -faults vfsfault-transient -prep {
                    159:   catch { db close }
                    160:   faultsim_restore
                    161: } -body {
                    162:   test_syscall errno open      EINTR
                    163:   test_syscall errno ftruncate EINTR
                    164:   test_syscall errno close     EINTR
                    165:   test_syscall errno read      EINTR
                    166:   test_syscall errno pread     EINTR
                    167:   test_syscall errno pread64   EINTR
                    168:   test_syscall errno write     EINTR
                    169:   test_syscall errno fallocate EINTR
                    170: 
                    171:   sqlite3 db test.db
                    172:   file_control_chunksize_test db main 8192
                    173: 
                    174:   set res [db eval {
                    175:     ATTACH 'test.db2' AS 'aux';
                    176:     SELECT * FROM t1;
                    177:     PRAGMA journal_mode = truncate;
                    178:     BEGIN;
                    179:       INSERT INTO t1 VALUES('jkl', 'mno', 'pqr');
                    180:       INSERT INTO t1 VALUES(randomblob(10000), 0, 0);
                    181:       UPDATE t2 SET x = 2;
                    182:     COMMIT;
                    183:     DELETE FROM t1 WHERE length(a)>3;
                    184:     SELECT * FROM t1;
                    185:     SELECT * FROM t2;
                    186:   }]
                    187:   db close
                    188:   set res
                    189: } -test {
                    190:   faultsim_test_result {0 {abc def ghi truncate abc def ghi jkl mno pqr 2}}
                    191: }
                    192: 
                    193: do_faultsim_test 2.2 -faults vfsfault-* -prep {
                    194:   catch { db close }
                    195:   faultsim_restore
                    196: } -body {
                    197:   sqlite3 db test.db
                    198:   set res [db eval {
                    199:     ATTACH 'test.db2' AS 'aux';
                    200:     SELECT * FROM t1;
                    201:     PRAGMA journal_mode = truncate;
                    202:     BEGIN;
                    203:       INSERT INTO t1 VALUES('jkl', 'mno', 'pqr');
                    204:       UPDATE t2 SET x = 2;
                    205:     COMMIT;
                    206:     SELECT * FROM t1;
                    207:     SELECT * FROM t2;
                    208:   }]
                    209:   db close
                    210:   set res
                    211: } -test {
                    212:   faultsim_test_result {0 {abc def ghi truncate abc def ghi jkl mno pqr 2}} \
                    213:     {1 {unable to open database file}}                                      \
                    214:     {1 {unable to open database: test.db2}}                                 \
                    215:     {1 {attempt to write a readonly database}}                              \
                    216:     {1 {disk I/O error}}                                                  
                    217: }
                    218: 
                    219: #-------------------------------------------------------------------------
                    220: 
                    221: proc vfsfault_install {} { 
                    222:   test_syscall reset
                    223:   test_syscall install {fstat fallocate}
                    224: }
                    225: do_faultsim_test 3 -faults vfsfault-* -prep {
                    226:   faultsim_delete_and_reopen
                    227:   file_control_chunksize_test db main 8192
                    228:   execsql {
                    229:     CREATE TABLE t1(a, b);
                    230:     BEGIN;
                    231:       SELECT * FROM t1;
                    232:   }
                    233: } -body {
                    234:   test_syscall errno fstat     EIO
                    235:   test_syscall errno fallocate EIO
                    236: 
                    237:   execsql {
                    238:     INSERT INTO t1 VALUES(randomblob(10000), randomblob(10000));
                    239:     SELECT length(a) + length(b) FROM t1;
                    240:     COMMIT;
                    241:   }
                    242: } -test {
                    243:   faultsim_test_result {0 20000}
                    244: }
                    245: 
                    246: finish_test
                    247: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>