|
1 # |
|
2 # May you do good and not evil. |
|
3 # May you find forgiveness for yourself and forgive others. |
|
4 # May you share freely, never taking more than you give. |
|
5 # |
|
6 #*********************************************************************** |
|
7 # |
|
8 # $Id: async2.test,v 1.9 2007/11/05 17:01:08 danielk1977 Exp $ |
|
9 |
|
10 |
|
11 set testdir [file dirname $argv0] |
|
12 source $testdir/tester.tcl |
|
13 |
|
14 if { |
|
15 [info commands sqlite3async_enable]=="" || |
|
16 [info command sqlite3_memdebug_fail]=="" |
|
17 } { |
|
18 # The async logic is not built into this system |
|
19 puts "Skipping async2 tests: not compiled with required features" |
|
20 finish_test |
|
21 return |
|
22 } |
|
23 |
|
24 # Enable asynchronous IO. |
|
25 |
|
26 set setup_script { |
|
27 CREATE TABLE counter(c); |
|
28 INSERT INTO counter(c) VALUES (1); |
|
29 } |
|
30 |
|
31 set sql_script { |
|
32 BEGIN; |
|
33 UPDATE counter SET c = 2; |
|
34 CREATE TABLE t1(a PRIMARY KEY, b, c); |
|
35 CREATE TABLE t2(a PRIMARY KEY, b, c); |
|
36 COMMIT; |
|
37 |
|
38 BEGIN; |
|
39 UPDATE counter SET c = 3; |
|
40 INSERT INTO t1 VALUES('abcdefghij', 'four', 'score'); |
|
41 INSERT INTO t2 VALUES('klmnopqrst', 'and', 'seven'); |
|
42 COMMIT; |
|
43 |
|
44 UPDATE counter SET c = 'FIN'; |
|
45 } |
|
46 |
|
47 db close |
|
48 |
|
49 foreach err [list ioerr malloc-transient malloc-persistent] { |
|
50 set ::go 1 |
|
51 for {set n 1} {$::go} {incr n} { |
|
52 set ::sqlite_io_error_pending 0 |
|
53 sqlite3_memdebug_fail -1 |
|
54 file delete -force test.db test.db-journal |
|
55 sqlite3 db test.db |
|
56 execsql $::setup_script |
|
57 db close |
|
58 |
|
59 sqlite3async_enable 1 |
|
60 sqlite3 db test.db |
|
61 |
|
62 switch -- $err { |
|
63 ioerr { set ::sqlite_io_error_pending $n } |
|
64 malloc-persistent { sqlite3_memdebug_fail $n -repeat 1 } |
|
65 malloc-transient { sqlite3_memdebug_fail $n -repeat 0 } |
|
66 } |
|
67 |
|
68 catchsql $::sql_script |
|
69 db close |
|
70 |
|
71 sqlite3async_halt idle |
|
72 sqlite3async_start |
|
73 sqlite3async_wait |
|
74 sqlite3async_halt never |
|
75 sqlite3async_enable 0 |
|
76 |
|
77 set ::sqlite_io_error_pending 0 |
|
78 sqlite3_memdebug_fail -1 |
|
79 |
|
80 sqlite3 db test.db |
|
81 set c [db eval {SELECT c FROM counter LIMIT 1}] |
|
82 switch -- $c { |
|
83 1 { |
|
84 do_test async-$err-1.1.$n { |
|
85 execsql { |
|
86 SELECT name FROM sqlite_master; |
|
87 } |
|
88 } {counter} |
|
89 } |
|
90 2 { |
|
91 do_test async-$err-1.2.$n.1 { |
|
92 execsql { |
|
93 SELECT * FROM t1; |
|
94 } |
|
95 } {} |
|
96 do_test async-$err-1.2.$n.2 { |
|
97 execsql { |
|
98 SELECT * FROM t2; |
|
99 } |
|
100 } {} |
|
101 } |
|
102 3 { |
|
103 do_test async-$err-1.3.$n.1 { |
|
104 execsql { |
|
105 SELECT * FROM t1; |
|
106 } |
|
107 } {abcdefghij four score} |
|
108 do_test async-$err-1.3.$n.2 { |
|
109 execsql { |
|
110 SELECT * FROM t2; |
|
111 } |
|
112 } {klmnopqrst and seven} |
|
113 } |
|
114 FIN { |
|
115 set ::go 0 |
|
116 } |
|
117 } |
|
118 |
|
119 db close |
|
120 } |
|
121 } |
|
122 |
|
123 catch {db close} |
|
124 sqlite3async_halt idle |
|
125 sqlite3async_start |
|
126 sqlite3async_wait |
|
127 sqlite3async_halt never |
|
128 |
|
129 finish_test |