summaryrefslogtreecommitdiffstats
path: root/ext/rbu/rbumisc.test
diff options
context:
space:
mode:
Diffstat (limited to 'ext/rbu/rbumisc.test')
-rw-r--r--ext/rbu/rbumisc.test176
1 files changed, 176 insertions, 0 deletions
diff --git a/ext/rbu/rbumisc.test b/ext/rbu/rbumisc.test
new file mode 100644
index 0000000..1629314
--- /dev/null
+++ b/ext/rbu/rbumisc.test
@@ -0,0 +1,176 @@
+# 2014 August 30
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+
+source [file join [file dirname [info script]] rbu_common.tcl]
+if_no_rbu_support { finish_test ; return }
+set ::testprefix rbumisc
+
+proc populate_rbu_db {} {
+ forcedelete rbu.db
+ sqlite3 rbu rbu.db
+ rbu eval {
+ CREATE TABLE data_x1(a, b, c, rbu_control);
+ INSERT INTO data_x1 VALUES(1, 1, 1, 0);
+ INSERT INTO data_x1 VALUES(2, 2, 2, 0);
+
+ CREATE TABLE dat(a, b, c, rbu_control);
+ CREATE TABLE "data x1"(a, b, c, rbu_control);
+ CREATE TABLE datax1(a, b, c, rbu_control);
+ CREATE TABLE data_(a, b, c, rbu_control);
+
+ INSERT INTO "data x1" VALUES(3, 3, 3, 0);
+ INSERT INTO datax1 VALUES(3, 3, 3, 0);
+ INSERT INTO data_ VALUES(3, 3, 3, 0);
+ INSERT INTO dat VALUES(3, 3, 3, 0);
+ }
+ rbu close
+}
+
+#-------------------------------------------------------------------------
+# Ensure that RBU is not confused by oddly named tables in an RBU
+# database.
+#
+do_execsql_test 1.0 {
+ CREATE TABLE x1(a, b, c INTEGER PRIMARY KEY);
+}
+do_test 1.1 {
+ populate_rbu_db
+} {}
+
+do_test 1.2 {
+ step_rbu test.db rbu.db
+ db eval { SELECT * FROM x1 }
+} {1 1 1 2 2 2}
+
+do_test 1.3 {
+ db eval { DELETE FROM x1 }
+ sqlite3 rbu rbu.db
+ rbu eval { DELETE FROM rbu_state }
+ rbu close
+ step_rbu test.db rbu.db
+ db eval { SELECT * FROM x1 }
+} {1 1 1 2 2 2}
+
+do_test 1.4 {
+ db eval { DELETE FROM x1 }
+ populate_rbu_db
+
+ sqlite3rbu rbu test.db rbu.db
+ rbu step
+ rbu step
+ rbu close
+
+ forcecopy test.db-oal test.db-wal
+ sqlite3rbu rbu test.db rbu.db
+ rbu step
+ list [catch { rbu close } msg] $msg
+} {1 {SQLITE_ERROR - cannot update wal mode database}}
+
+#-------------------------------------------------------------------------
+# Test the effect of a wal file appearing after the target database has
+# been opened, but before it has been locked.
+#
+catch { db close }
+testvfs tvfs -default 1
+
+for {set N 1} {$N < 10} {incr N} {
+ reset_db
+ populate_rbu_db
+ do_execsql_test 2.$N.0 {
+ CREATE TABLE x1(a, b, c INTEGER PRIMARY KEY);
+ }
+
+ set nAccessCnt 0
+ do_test 2.$N.1 {
+ sqlite3rbu rbu test.db rbu.db
+ rbu step
+ rbu step
+ rbu close
+ } {SQLITE_OK}
+
+ tvfs script xAccess
+ tvfs filter xAccess
+ set nAccessCnt 0
+ proc xAccess {method file args} {
+ global nAccessCnt
+ if {[file tail $file]=="test.db-wal"} {
+ incr nAccessCnt -1
+ if {$nAccessCnt==0} {
+ set fd [open test.db-wal w]
+ puts -nonewline $fd [string repeat 0 2000]
+ close $fd
+ }
+ }
+ return SQLITE_OK
+ }
+
+ foreach r {
+ {1 {SQLITE_ERROR - cannot update wal mode database}}
+ {0 SQLITE_OK}
+ {1 {SQLITE_CANTOPEN - unable to open database file}}
+ } {
+ set RES($r) 1
+ }
+ do_test 2.$N.2 {
+ set ::nAccessCnt $N
+ set res [list [catch {
+ sqlite3rbu rbu test.db rbu.db
+ rbu step
+ rbu close
+ } msg ] $msg]
+ set RES($res)
+ } {1}
+ catch {rbu close}
+}
+catch {db close}
+catch {tvfs delete}
+
+#-------------------------------------------------------------------------
+testvfs tvfs -default 1
+reset_db
+populate_rbu_db
+do_execsql_test 3.0 {
+ CREATE TABLE x1(a, b, c INTEGER PRIMARY KEY);
+}
+
+tvfs script xFileControl
+tvfs filter xFileControl
+
+proc xFileControl {method file verb args} {
+ if {$verb=="ZIPVFS" && [info exists ::zipvfs_filecontrol]} {
+ return $::zipvfs_filecontrol
+ }
+ return "SQLITE_NOTFOUND"
+}
+
+breakpoint
+foreach {tn ret err} {
+ 1 SQLITE_OK 0
+ 2 SQLITE_ERROR 1
+ 3 SQLITE_NOTFOUND 0
+ 4 SQLITE_OMIT 1
+} {
+ set ::zipvfs_filecontrol $ret
+ do_test 3.$tn.1 {
+ catch {
+ sqlite3rbu rbu test.db rbu.db
+ rbu step
+ rbu close
+ }
+ } $err
+}
+catch {db close}
+catch {tvfs delete}
+
+#-------------------------------------------------------------------------
+
+finish_test