xref: /sqlite-3.40.0/test/multiplex.test (revision e5a6ad6d)
1# 2010 October 29
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
13set testdir [file dirname $argv0]
14source $testdir/tester.tcl
15source $testdir/malloc_common.tcl
16
17proc multiplex_delete {name} {
18  file delete -force $name
19  file delete -force $name-journal
20  file delete -force $name-wal
21  for {set i 1} {$i<=15} {incr i} {
22    file delete -force $name-000$i
23    file delete -force $name-00$i
24  }
25}
26
27db close
28
29#-------------------------------------------------------------------------
30#   multiplex-1.1.*: Test initialize and shutdown.
31
32do_test multiplex-1.1 { sqlite3_multiplex_initialize nosuchvfs 1 } {SQLITE_ERROR}
33do_test multiplex-1.2 { sqlite3_multiplex_initialize "" 1 }        {SQLITE_OK}
34do_test multiplex-1.3 { sqlite3_multiplex_initialize "" 1 }        {SQLITE_MISUSE}
35do_test multiplex-1.4 { sqlite3_multiplex_shutdown }               {SQLITE_OK}
36
37do_test multiplex-1.5 { sqlite3_multiplex_initialize "" 0 }        {SQLITE_OK}
38do_test multiplex-1.6 { sqlite3_multiplex_shutdown }               {SQLITE_OK}
39do_test multiplex-1.7 { sqlite3_multiplex_initialize "" 1 }        {SQLITE_OK}
40do_test multiplex-1.8 { sqlite3_multiplex_shutdown }               {SQLITE_OK}
41
42do_test multiplex-1.9  { sqlite3_multiplex_initialize "" 1 }       {SQLITE_OK}
43do_test multiplex-1.10.1 { sqlite3_multiplex_set 0x8000 16 }       {SQLITE_OK}
44do_test multiplex-1.10.2 { sqlite3_multiplex_set 0x8000 -1 }       {SQLITE_MISUSE}
45do_test multiplex-1.10.3 { sqlite3_multiplex_set -1 16 }           {SQLITE_MISUSE}
46do_test multiplex-1.10.4 { sqlite3_multiplex_set 31 16 }           {SQLITE_MISUSE}
47do_test multiplex-1.10.5 { sqlite3_multiplex_set 0x8000 33 }       {SQLITE_MISUSE}
48do_test multiplex-1.11 { sqlite3_multiplex_shutdown }              {SQLITE_OK}
49
50
51#-------------------------------------------------------------------------
52# Some simple warm-body tests with a single database file in rollback
53# mode:
54#
55#   multiplex-2.1.*: Test simple writing to a multiplex file.
56#
57#   multiplex-2.2.*: More writing.
58#
59#   multiplex-2.3.*: Open and close a second db.
60#
61#   multiplex-2.4.*: Try to shutdown the multiplex system before closing the db
62#                file. Check that this fails and the multiplex system still works
63#                afterwards. Then close the database and successfully shut
64#                down the multiplex system.
65#
66#   multiplex-2.5.*: More reading/writing with small chunk size.
67
68sqlite3_multiplex_initialize "" 1
69sqlite3_multiplex_set 0x8000 16
70
71do_test multiplex-2.1.2 {
72  sqlite3 db test.db
73  execsql {
74    PRAGMA page_size=1024;
75    PRAGMA auto_vacuum=OFF;
76    PRAGMA journal_mode=DELETE;
77  }
78  execsql {
79    CREATE TABLE t1(a, b);
80    INSERT INTO t1 VALUES(1, randomblob(1100));
81    INSERT INTO t1 VALUES(2, randomblob(1100));
82  }
83} {}
84do_test multiplex-2.1.3 { file size test.db } {4096}
85do_test multiplex-2.1.4 {
86  execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) }
87} {}
88
89do_test multiplex-2.2.1 {
90  execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) }
91} {}
92do_test multiplex-2.2.3 { file size test.db } {6144}
93
94do_test multiplex-2.3.1 {
95  sqlite3 db2 bak.db
96  db2 close
97} {}
98
99do_test multiplex-2.4.1 {
100  sqlite3_multiplex_shutdown
101} {SQLITE_MISUSE}
102do_test multiplex-2.4.2 {
103  execsql { INSERT INTO t1 VALUES(3, randomblob(1100)) }
104} {}
105do_test multiplex-2.4.4 { file size test.db } {7168}
106do_test multiplex-2.4.99 {
107  db close
108  sqlite3_multiplex_shutdown
109} {SQLITE_OK}
110
111
112do_test multiplex-2.5.1 {
113  multiplex_delete test.db
114  sqlite3_multiplex_initialize "" 1
115  sqlite3_multiplex_set 0x1000 16
116} {SQLITE_OK}
117
118do_test multiplex-2.5.2 {
119  sqlite3 db test.db
120  execsql {
121    PRAGMA page_size = 1024;
122    PRAGMA journal_mode = delete;
123    PRAGMA auto_vacuum = off;
124    CREATE TABLE t1(a PRIMARY KEY, b);
125  }
126} {delete}
127
128do_test multiplex-2.5.3 {
129  execsql {
130    INSERT INTO t1 VALUES(1, 'one');
131    INSERT INTO t1 VALUES(2, randomblob(4000));
132    INSERT INTO t1 VALUES(3, 'three');
133    INSERT INTO t1 VALUES(4, randomblob(4000));
134    INSERT INTO t1 VALUES(5, 'five')
135  }
136} {}
137
138do_test multiplex-2.5.4 {
139  db eval {SELECT * FROM t1 WHERE a=1}
140} {1 one}
141
142do_test multiplex-2.5.5 {
143  db eval {SELECT * FROM t1 WHERE a=3}
144} {3 three}
145
146do_test multiplex-2.5.6 {
147  db eval {SELECT * FROM t1 WHERE a=5}
148} {5 five}
149
150do_test multiplex-2.5.7 {
151  db eval {SELECT a,length(b) FROM t1 WHERE a=2}
152} {2 4000}
153
154do_test multiplex-2.5.8 {
155  db eval {SELECT a,length(b) FROM t1 WHERE a=4}
156} {4 4000}
157
158do_test multiplex-2.5.99 {
159  db close
160  sqlite3_multiplex_shutdown
161} {SQLITE_OK}
162
163#-------------------------------------------------------------------------
164# Try some tests with more than one connection to a database file. Still
165# in rollback mode.
166#
167#   multiplex-3.1.*: Two connections to a single database file.
168#
169#   multiplex-3.2.*: Two connections to each of several database files (that
170#                are in the same multiplex group).
171#
172do_test multiplex-3.1.1 {
173  multiplex_delete test.db
174  sqlite3_multiplex_initialize "" 1
175  sqlite3_multiplex_set 0x8000 16
176} {SQLITE_OK}
177do_test multiplex-3.1.2 {
178  sqlite3 db test.db
179  execsql {
180    PRAGMA page_size = 1024;
181    PRAGMA journal_mode = delete;
182    PRAGMA auto_vacuum = off;
183    CREATE TABLE t1(a PRIMARY KEY, b);
184    INSERT INTO t1 VALUES(1, 'one');
185  }
186  file size test.db
187} {3072}
188do_test multiplex-3.1.3 {
189  sqlite3 db2 test.db
190  execsql { CREATE TABLE t2(a, b) } db2
191} {}
192do_test multiplex-3.1.4 {
193  execsql { CREATE TABLE t3(a, b) }
194} {}
195do_test multiplex-3.1.5 {
196  catchsql { CREATE TABLE t3(a, b) }
197} {1 {table t3 already exists}}
198do_test multiplex-3.1.6 {
199  db close
200  db2 close
201} {}
202
203do_test multiplex-3.2.1a {
204
205  multiplex_delete test.db
206  multiplex_delete test2.db
207
208  sqlite3 db1a test.db
209  sqlite3 db2a test2.db
210
211  foreach db {db1a db2a} {
212    execsql {
213      PRAGMA page_size = 1024;
214      PRAGMA journal_mode = delete;
215      PRAGMA auto_vacuum = off;
216      CREATE TABLE t1(a, b);
217    } $db
218  }
219
220  list [file size test.db] [file size test2.db]
221} {2048 2048}
222
223do_test multiplex-3.2.1b {
224  sqlite3 db1b test.db
225  sqlite3 db2b test2.db
226} {}
227
228do_test multiplex-3.2.2 { execsql { INSERT INTO t1 VALUES('x', 'y') } db1a } {}
229do_test multiplex-3.2.3 { execsql { INSERT INTO t1 VALUES('v', 'w') } db1b } {}
230do_test multiplex-3.2.4 { execsql { INSERT INTO t1 VALUES('t', 'u') } db2a } {}
231do_test multiplex-3.2.5 { execsql { INSERT INTO t1 VALUES('r', 's') } db2b } {}
232
233do_test multiplex-3.2.6 {
234  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1a
235} {}
236do_test multiplex-3.2.7 {
237  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1b
238} {}
239do_test multiplex-3.2.8 {
240  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2a
241} {}
242do_test multiplex-3.2.9 {
243  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2b
244} {}
245
246do_test multiplex-3.3.1 {
247  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1a
248  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db1b
249  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2a
250  execsql { INSERT INTO t1 VALUES(randomblob(500), randomblob(500)) } db2b
251} {}
252
253do_test multiplex-3.2.X {
254  foreach db {db1a db2a db2b db1b} { catch { $db close } }
255} {}
256
257#-------------------------------------------------------------------------
258#
259
260sqlite3_multiplex_initialize "" 1
261sqlite3_multiplex_set 0x8000 16
262
263# Return a list of all currently defined multiplexs.
264proc multiplex_list {} {
265  set allq {}
266  foreach q [sqlite3_multiplex_dump] {
267    lappend allq [lindex $q 0]
268  }
269  return [lsort $allq]
270}
271
272do_test multiplex-4.1.6 {
273  multiplex_delete test2.db
274  sqlite3 db test2.db
275  db eval {CREATE TABLE t2(x); INSERT INTO t2 VALUES('tab-t2');}
276  set res [multiplex_list]
277  list [regexp {test2.db} $res]
278} {1}
279do_test multiplex-4.1.6a {
280  sqlite3 db2 test2.db
281  db2 eval {SELECT * FROM t2}
282} {tab-t2}
283do_test multiplex-4.1.7 {
284  execsql {INSERT INTO t2 VALUES(zeroblob(200000))}
285} {}
286do_test multiplex-4.1.8 {
287  sqlite3 db2 test2.db
288  db2 eval {SELECT count(*) FROM t2}
289} {2}
290do_test multiplex-4.1.8a {
291   db2 eval { DELETE FROM t2 WHERE x = 'tab-t2' }
292} {}
293do_test multiplex-4.1.8b {
294  sqlite3 db2 test2.db
295  db2 eval {SELECT count(*) FROM t2}
296} {1}
297
298
299do_test multiplex-4.1.9 {
300  execsql {INSERT INTO t2 VALUES(zeroblob(200000))}
301} {}
302do_test multiplex-4.1.10 {
303  set res [multiplex_list]
304  list [regexp {test2.db} $res]
305} {1}
306do_test multiplex-4.1.11 {
307  db2 close
308  set res [multiplex_list]
309  list [regexp {test2.db} $res]
310} {1}
311do_test multiplex-4.1.12 {
312  db close
313  multiplex_list
314} {}
315
316
317#-------------------------------------------------------------------------
318# The following tests test that the multiplex VFS handles malloc and IO
319# errors.
320#
321
322sqlite3_multiplex_initialize "" 1
323sqlite3_multiplex_set 0x8000 16
324
325do_faultsim_test multiplex-5.1 -prep {
326  catch {db close}
327} -body {
328  sqlite3 db test2.db
329}
330do_faultsim_test multiplex-5.2 -prep {
331  catch {db close}
332} -body {
333  sqlite3 db test.db
334}
335
336catch { db close }
337multiplex_delete test.db
338
339do_test multiplex-5.3.prep {
340  sqlite3 db test.db
341  execsql {
342    PRAGMA auto_vacuum = 1;
343    PRAGMA page_size = 1024;
344    CREATE TABLE t1(a, b);
345    INSERT INTO t1 VALUES(10, zeroblob(1200));
346  }
347  faultsim_save_and_close
348} {}
349do_faultsim_test multiplex-5.3 -prep {
350  faultsim_restore_and_reopen
351} -body {
352  execsql { DELETE FROM t1 }
353}
354
355do_test multiplex-5.4.1 {
356  catch { db close }
357  multiplex_delete test.db
358  file mkdir test.db
359  list [catch { sqlite3 db test.db } msg] $msg
360} {1 {unable to open database file}}
361
362do_faultsim_test multiplex-5.5 -prep {
363  catch { sqlite3_multiplex_shutdown }
364} -body {
365  sqlite3_multiplex_initialize "" 1
366  sqlite3_multiplex_set 0x8000 16
367}
368
369catch { sqlite3_multiplex_shutdown }
370finish_test
371