diff options
Diffstat (limited to 'ext/rbu/rbu6.test')
-rw-r--r-- | ext/rbu/rbu6.test | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/ext/rbu/rbu6.test b/ext/rbu/rbu6.test new file mode 100644 index 0000000..bb5b17f --- /dev/null +++ b/ext/rbu/rbu6.test @@ -0,0 +1,102 @@ +# 2014 October 21 +# +# 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. +# +#*********************************************************************** +# +# This file contains tests for the RBU module. Specifically, it tests the +# outcome of some other client writing to the database while an RBU update +# is being applied. + +if {![info exists testdir]} { + set testdir [file join [file dirname [info script]] .. .. test] +} +source $testdir/tester.tcl +set ::testprefix rbu6 + +proc setup_test {} { + reset_db + execsql { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE); + CREATE TABLE t2(a INTEGER PRIMARY KEY, b UNIQUE); + CREATE TABLE t3(a INTEGER PRIMARY KEY, b UNIQUE); + } + db close + + forcedelete rbu.db + sqlite3 rbu rbu.db + rbu eval { + CREATE TABLE data_t1(a, b, rbu_control); + CREATE TABLE data_t2(a, b, rbu_control); + CREATE TABLE data_t3(a, b, rbu_control); + INSERT INTO data_t1 VALUES(1, 't1', 0); + INSERT INTO data_t2 VALUES(2, 't2', 0); + INSERT INTO data_t3 VALUES(3, 't3', 0); + } + rbu close +} + +# Test the outcome of some other client writing the db while the *-oal +# file is being generated. Once this has happened, the update cannot be +# progressed. +# +for {set nStep 1} {$nStep < 8} {incr nStep} { + do_test 1.$nStep.1 { + setup_test + sqlite3rbu rbu test.db rbu.db + for {set i 0} {$i<$nStep} {incr i} {rbu step} + + rbu close + sqlite3 db test.db + execsql { INSERT INTO t1 VALUES(5, 'hello') } + sqlite3rbu rbu test.db rbu.db + rbu step + } {SQLITE_BUSY} + do_test 1.$nStep.2 { + rbu step + } {SQLITE_BUSY} + do_test 1.$nStep.3 { + list [file exists test.db-oal] [file exists test.db-wal] + } {1 0} + do_test 1.$nStep.4 { + list [catch { rbu close } msg] $msg + } {1 {SQLITE_BUSY - database modified during rbu update}} +} + +# Test the outcome of some other client writing the db after the *-oal +# file has been copied to the *-wal path. Once this has happened, any +# other client writing to the db causes RBU to consider its job finished. +# +for {set nStep 8} {$nStep < 20} {incr nStep} { + do_test 1.$nStep.1 { + setup_test + sqlite3rbu rbu test.db rbu.db + for {set i 0} {$i<$nStep} {incr i} {rbu step} + rbu close + sqlite3 db test.db + execsql { INSERT INTO t1 VALUES(5, 'hello') } + sqlite3rbu rbu test.db rbu.db + rbu step + } {SQLITE_DONE} + do_test 1.$nStep.2 { + rbu step + } {SQLITE_DONE} + do_test 1.$nStep.3 { + file exists test.db-oal + } {0} + do_test 1.$nStep.4 { + list [catch { rbu close } msg] $msg + } {0 SQLITE_DONE} + + do_execsql_test 1.$nStep.5 { + SELECT * FROM t1; + } {1 t1 5 hello} +} + + +finish_test |