# 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