1# 2009 February 4 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# This file implements regression tests for SQLite library. The 12# focus of this file is testing the "backup" and "restore" methods 13# of the TCL interface - methods which are based on the 14# sqlite3_backup_XXX API. 15# 16# $Id: backup2.test,v 1.4 2009/04/07 14:14:23 danielk1977 Exp $ 17 18set testdir [file dirname $argv0] 19source $testdir/tester.tcl 20 21ifcapable !trigger||!view { finish_test ; return } 22 23# Fill a database with test data. 24# 25do_test backup2-1 { 26 db eval { 27 CREATE TABLE t1(x); 28 INSERT INTO t1 VALUES(randstr(8000,8000)); 29 INSERT INTO t1 VALUES(randstr(8000,8000)); 30 INSERT INTO t1 VALUES(randstr(8000,8000)); 31 INSERT INTO t1 VALUES(randstr(8000,8000)); 32 INSERT INTO t1 VALUES(randstr(8000,8000)); 33 CREATE VIEW v1 AS SELECT substr(x,10,10) FROM t1; 34 CREATE TABLE t2(a,b); 35 INSERT INTO t2 VALUES(1,2); 36 INSERT INTO t2 VALUES(2,4); 37 INSERT INTO t2 SELECT a+2, (a+2)*2 FROM t2; 38 INSERT INTO t2 SELECT a+4, (a+4)*2 FROM t2; 39 INSERT INTO t2 SELECT a+8, (a+8)*2 FROM t2; 40 INSERT INTO t2 SELECT a+16, (a+16)*2 FROM t2; 41 INSERT INTO t2 SELECT a+32, (a+32)*2 FROM t2; 42 INSERT INTO t2 SELECT a+64, (a+64)*2 FROM t2; 43 INSERT INTO t2 SELECT a+128, (a+128)*2 FROM t2; 44 CREATE INDEX t2i1 ON t2(a,b); 45 CREATE TRIGGER r1 AFTER INSERT ON t2 BEGIN 46 SELECT 'hello'; 47 END; 48 ANALYZE; 49 PRAGMA integrity_check; 50 } 51} {ok} 52 53# Remember a check-sum on the database file. 54# 55unset -nocomplain cksum 56set cksum [dbcksum db main] 57 58# Make a backup of the test data. Verify that the backup copy 59# is identical to the original. 60# 61do_test backup2-2 { 62 file delete -force bu1.db 63 db backup bu1.db 64 sqlite3 db2 bu1.db 65 dbcksum db2 main 66} $cksum 67 68# Delete the original. Restore from backup. Verify the content is 69# unchanged. 70# 71do_test backup2-3.1 { 72 db close 73 file delete -force test.db test.db-journal 74 sqlite3 db test.db 75 db2 eval {BEGIN EXCLUSIVE} 76 set rc [catch {db restore bu1.db} res] 77 lappend rc $res 78 db2 eval {ROLLBACK} 79 set rc 80} {1 {restore failed: source database busy}} 81do_test backup2-3.2 { 82 db close 83 file delete -force test.db test.db-journal 84 sqlite3 db test.db 85 db restore bu1.db 86 dbcksum db main 87} $cksum 88 89# Use alternative databases - other than "main". 90# 91do_test backup2-4 { 92 db restore temp bu1.db 93 dbcksum db temp 94} $cksum 95do_test backup2-5 { 96 db2 close 97 file delete -force bu1.db bu2.db 98 db backup temp bu2.db 99 sqlite3 db2 bu2.db 100 dbcksum db2 main 101} $cksum 102 103# Try to backup to a readonly file. 104# 105do_test backup2-6 { 106 db2 close 107 catch {file attributes bu2.db -permissions r--------} 108 catch {file attributes bu2.db -readonly 1} 109 set rc [catch {db backup temp bu2.db} res] 110 lappend rc $res 111} {1 {backup failed: attempt to write a readonly database}} 112 113# Try to backup to something that is not a database file. 114# 115do_test backup2-7 { 116 catch {file attributes bu2.db -readonly 0} 117 catch {file attributes bu2.db -permissions rw-------} 118 set out [open bu2.db w] 119 puts $out "This is not a valid database file" 120 close $out 121 set rc [catch {db backup temp bu2.db} res] 122 lappend rc $res 123} {1 {backup failed: file is encrypted or is not a database}} 124 125# Try to backup database that does not exist 126# 127do_test backup2-8 { 128 file delete -force bu1.db 129 set rc [catch {db backup aux1 bu1.db} res] 130 lappend rc $res 131} {1 {backup failed: unknown database aux1}} 132 133# Invalid syntax on the backup method 134# 135do_test backup2-9 { 136 set rc [catch {db backup} res] 137 lappend rc $res 138} {1 {wrong # args: should be "db backup ?DATABASE? FILENAME"}} 139 140# Try to restore from an unreadable file. 141# 142if {$tcl_platform(platform)=="windows"} { 143 do_test backup2-10 { 144 file delete -force bu3.db 145 file mkdir bu3.db 146 set rc [catch {db restore temp bu3.db} res] 147 lappend rc $res 148 } {1 {cannot open source database: unable to open database file}} 149} 150if {$tcl_platform(platform)!="windows"} { 151 do_test backup2-10 { 152 file delete -force bu3.db 153 file mkdir bu3.db 154 set rc [catch {db restore temp bu3.db} res] 155 lappend rc $res 156 } {1 {cannot open source database: disk I/O error}} 157} 158 159# Try to restore from something that is not a database file. 160# 161do_test backup2-11 { 162 set rc [catch {db restore temp bu2.db} res] 163 lappend rc $res 164} {1 {restore failed: file is encrypted or is not a database}} 165 166# Try to restore a database that does not exist 167# 168do_test backup2-12 { 169 set rc [catch {db restore aux1 bu2.db} res] 170 lappend rc $res 171} {1 {restore failed: unknown database aux1}} 172do_test backup2-13 { 173 file delete -force bu4.db 174 set rc [catch {db restore bu4.db} res] 175 lappend rc $res 176} {1 {cannot open source database: unable to open database file}} 177 178# Invalid syntax on the restore method 179# 180do_test backup2-14 { 181 set rc [catch {db restore} res] 182 lappend rc $res 183} {1 {wrong # args: should be "db restore ?DATABASE? FILENAME"}} 184 185file delete -force bu1.db bu2.db bu3.db bu4.db 186 187finish_test 188