xref: /sqlite-3.40.0/test/multiplex3.test (revision 4aced72a)
1658dd586Sdrh
2658dd586Sdrh# 2011 December 13
3658dd586Sdrh#
4658dd586Sdrh# The author disclaims copyright to this source code.  In place of
5658dd586Sdrh# a legal notice, here is a blessing:
6658dd586Sdrh#
7658dd586Sdrh#    May you do good and not evil.
8658dd586Sdrh#    May you find forgiveness for yourself and forgive others.
9658dd586Sdrh#    May you share freely, never taking more than you give.
10658dd586Sdrh#
11658dd586Sdrh#***********************************************************************
12658dd586Sdrh#
13658dd586Sdrh# This file contains tests for error (IO, OOM etc.) handling when using
14658dd586Sdrh# the multiplexor extension with 8.3 filenames.
15658dd586Sdrh#
16658dd586Sdrh
171cdf011dSdrhset testdir [file dirname $argv0]
18658dd586Sdrhsource $testdir/tester.tcl
19658dd586Sdrhsource $testdir/malloc_common.tcl
20658dd586Sdrhset ::testprefix multiplex3
21658dd586Sdrh
22658dd586Sdrhifcapable !8_3_names {
23658dd586Sdrh  puts -nonewline "SQLite compiled without SQLITE_ENABLE_8_3_NAMES. "
241cdf011dSdrh  puts            "Skipping tests multiplex3-*."
25658dd586Sdrh  finish_test
26658dd586Sdrh  return
27658dd586Sdrh}
28658dd586Sdrh
29658dd586Sdrhdb close
30658dd586Sdrhsqlite3_shutdown
31658dd586Sdrhsqlite3_config_uri 1
32658dd586Sdrhautoinstall_test_functions
33658dd586Sdrh
34658dd586Sdrhsqlite3_multiplex_initialize "" 1
35658dd586Sdrh
36658dd586Sdrhproc destroy_vfs_stack {} {
37658dd586Sdrh  generic_unregister stack
38658dd586Sdrh  sqlite3_multiplex_shutdown
39658dd586Sdrh}
40658dd586Sdrh
41658dd586Sdrhproc multiplex_delete_db {} {
42658dd586Sdrh  forcedelete test.db
43658dd586Sdrh  for {set i 1} {$i <= 1000} {incr i} {
44658dd586Sdrh    forcedelete test.[format %03d $i]
45658dd586Sdrh  }
46658dd586Sdrh}
47658dd586Sdrh
48658dd586Sdrh# Procs to save and restore the current muliplexed database.
49658dd586Sdrh#
50658dd586Sdrhproc multiplex_save_db {} {
51658dd586Sdrh  foreach f [glob -nocomplain sv_test.*] { forcedelete $f }
52658dd586Sdrh  foreach f [glob -nocomplain test.*]    { forcecopy $f "sv_$f" }
53658dd586Sdrh}
54658dd586Sdrhproc multiplex_restore_db {} {
55658dd586Sdrh  foreach f [glob -nocomplain test.*]    {forcedelete $f}
56658dd586Sdrh  foreach f [glob -nocomplain sv_test.*] {forcecopy $f [string range $f 3 end]} }
57658dd586Sdrh
58add995ccSdanproc setup_and_save_db {} {
59658dd586Sdrh  multiplex_delete_db
60658dd586Sdrh  sqlite3 db file:test.db?8_3_names=1
61658dd586Sdrh  sqlite3_multiplex_control db main chunk_size [expr 256*1024]
62658dd586Sdrh  execsql {
63658dd586Sdrh    CREATE TABLE t1(a PRIMARY KEY, b);
64658dd586Sdrh    INSERT INTO t1 VALUES(randomblob(15), randomblob(2000));
65658dd586Sdrh    INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1;    --   2
66658dd586Sdrh    INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1;    --   4
67658dd586Sdrh    INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1;    --   8
68658dd586Sdrh    INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1;    --  16
69658dd586Sdrh    INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1;    --  32
70658dd586Sdrh    INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1;    --  64
71658dd586Sdrh    INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1;    -- 128
72658dd586Sdrh    INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1;    -- 256
73658dd586Sdrh    INSERT INTO t1 SELECT randomblob(15), randomblob(2000) FROM t1;    -- 512
74658dd586Sdrh  }
75658dd586Sdrh  set ::cksum1 [execsql {SELECT md5sum(a, b) FROM t1 ORDER BY a}]
76658dd586Sdrh  db close
77658dd586Sdrh  multiplex_save_db
78add995ccSdan}
79658dd586Sdrh
80add995ccSdando_test 1.0 { setup_and_save_db } {}
81658dd586Sdrhdo_faultsim_test 1 -prep {
82658dd586Sdrh  multiplex_restore_db
83658dd586Sdrh  sqlite3 db file:test.db?8_3_names=1
84658dd586Sdrh  sqlite3_multiplex_control db main chunk_size [expr 256*1024]
85658dd586Sdrh} -body {
86add995ccSdan  execsql {
87add995ccSdan    UPDATE t1 SET a=randomblob(12), b=randomblob(1500) WHERE (rowid%32)=0
88add995ccSdan  }
89658dd586Sdrh} -test {
90658dd586Sdrh  faultsim_test_result {0 {}}
91658dd586Sdrh  if {$testrc!=0} {
92658dd586Sdrh    set cksum2 [execsql {SELECT md5sum(a, b) FROM t1 ORDER BY a}]
93658dd586Sdrh    if {$cksum2 != $::cksum1} { error "data mismatch" }
94658dd586Sdrh  }
95658dd586Sdrh}
96658dd586Sdrh
97add995ccSdan#-------------------------------------------------------------------------
98add995ccSdan# The following tests verify that hot-journal rollback works. As follows:
99add995ccSdan#
100add995ccSdan#   1. Create a large database.
101add995ccSdan#   2. Set the pager cache to be very small.
102add995ccSdan#   3. Open a transaction.
103add995ccSdan#   4. Run the following 100 times:
104add995ccSdan#      a. Update a row.
105add995ccSdan#      b. Copy all files on disk to a new db location, including the journal.
106add995ccSdan#      c. Verify that the new db can be opened and that the content matches
107add995ccSdan#         the database created in step 1 (proving the journal was rolled
108add995ccSdan#         back).
109658dd586Sdrh
110add995ccSdando_test 2.0 {
111add995ccSdan  setup_and_save_db
112add995ccSdan  multiplex_restore_db
113add995ccSdan  sqlite3 db file:test.db?8_3_names=1
114add995ccSdan  execsql { PRAGMA cache_size = 10 }
115add995ccSdan  execsql { BEGIN }
116add995ccSdan} {}
117add995ccSdan
118add995ccSdanfor {set iTest 1} {$iTest<=100} {incr iTest} {
119add995ccSdan  do_test 2.$iTest {
120add995ccSdan    execsql {
121add995ccSdan      UPDATE t1 SET a=randomblob(12), b=randomblob(1400) WHERE rowid=5*$iTest
122add995ccSdan    }
123add995ccSdan    foreach f [glob -nocomplain test.*] {forcecopy $f "xx_$f"}
124add995ccSdan    sqlite3 db2 file:xx_test.db?8_3_names=1
125add995ccSdan    execsql {SELECT md5sum(a, b) FROM t1 ORDER BY a} db2
126add995ccSdan  } $::cksum1
127add995ccSdan
128add995ccSdan  db2 close
129add995ccSdan}
130*4aced72aSdancatch { db close }
131*4aced72aSdan
132*4aced72aSdan
133*4aced72aSdando_test 3.0 { setup_and_save_db } {}
134*4aced72aSdando_faultsim_test 3 -faults ioerr-trans* -prep {
135*4aced72aSdan
136*4aced72aSdan  forcedelete test2.db
137*4aced72aSdan  set fd [open test2.wal w]
138*4aced72aSdan  seek $fd 4095
139*4aced72aSdan  puts -nonewline $fd x
140*4aced72aSdan  close $fd
141*4aced72aSdan
142*4aced72aSdan  multiplex_restore_db
143*4aced72aSdan  sqlite3 db file:test.db?8_3_names=1
144*4aced72aSdan  sqlite3 db2 file:test2.db?8_3_names=1
145*4aced72aSdan  sqlite3_multiplex_control db main chunk_size [expr 256*1024]
146*4aced72aSdan  sqlite3_multiplex_control db2 main chunk_size [expr 256*1024]
147*4aced72aSdan} -body {
148*4aced72aSdan  sqlite3_backup B db2 main db main
149*4aced72aSdan  B step 100000
150*4aced72aSdan  set rc [B finish]
151*4aced72aSdan  if { [string match SQLITE_IOERR_* $rc] } {error "disk I/O error"}
152*4aced72aSdan  set rc
153*4aced72aSdan} -test {
154*4aced72aSdan  faultsim_test_result {0 SQLITE_OK}
155*4aced72aSdan  if {$testrc==0} {
156*4aced72aSdan    set cksum2 [execsql {SELECT md5sum(a, b) FROM t1 ORDER BY a} db2]
157*4aced72aSdan    if {$cksum2 != $::cksum1} { error "data mismatch" }
158*4aced72aSdan  }
159*4aced72aSdan  catch { B finish }
160*4aced72aSdan  catch { db close }
161*4aced72aSdan  catch { db2 close }
162*4aced72aSdan}
163add995ccSdan
164add995ccSdancatch { db close }
165658dd586Sdrhsqlite3_multiplex_shutdown
166658dd586Sdrhfinish_test
167