xref: /sqlite-3.40.0/test/walfault2.test (revision 9c5f7343)
1# 2010 May 03
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 the operation of the library in
13# "PRAGMA journal_mode=WAL" mode.
14#
15
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18source $testdir/malloc_common.tcl
19source $testdir/lock_common.tcl
20
21ifcapable !wal {finish_test ; return }
22set testprefix walfault2
23
24#-------------------------------------------------------------------------
25# Inject faults while truncating the wal file.
26#
27do_execsql_test 1.0 {
28  PRAGMA auto_vacuum = 0;
29  CREATE TABLE t1(a, b);
30  PRAGMA journal_mode = wal;
31  WITH s(i) AS (
32    SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 30
33  )
34  INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s;
35} {wal}
36faultsim_save_and_close
37
38do_faultsim_test 1 -prep {
39  catch { db close }
40  faultsim_restore
41  sqlite3 db file:test.db?psow=0 -uri 1
42  file_control_powersafe_overwrite db 0
43  execsql {
44    PRAGMA wal_checkpoint;
45    PRAGMA journal_size_limit = 10000;
46    PRAGMA synchronous = full;
47  }
48} -body {
49  execsql { INSERT INTO t1 VALUES(1,1) }
50} -test {
51  faultsim_test_result {0 {}}
52}
53
54#-------------------------------------------------------------------------
55# Inject faults while rewriting checksums.
56#
57reset_db
58do_execsql_test 2.0 {
59  PRAGMA auto_vacuum = 0;
60  CREATE TABLE t1(a, b);
61  PRAGMA journal_mode = wal;
62  WITH s(i) AS (
63    SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 30
64  )
65  INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s;
66} {wal}
67faultsim_save_and_close
68
69do_faultsim_test 2 -prep {
70  faultsim_restore_and_reopen
71  execsql {
72    PRAGMA cache_size = 2;
73    BEGIN;
74    UPDATE t1 SET a=randomblob(400);
75    UPDATE t1 SET b=randomblob(400);
76    UPDATE t1 SET a=randomblob(400);
77    UPDATE t1 SET b=randomblob(400);
78    UPDATE t1 SET a=randomblob(400);
79    UPDATE t1 SET b=randomblob(400);
80    UPDATE t1 SET a=randomblob(400);
81    UPDATE t1 SET b=randomblob(400);
82  }
83} -body {
84  execsql COMMIT
85} -test {
86  faultsim_test_result {0 {}}
87}
88
89
90
91finish_test
92