1# 2015-07-31 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# 12# Tests for the [sqldiff --changeset] command. 13# 14# 15if {![info exists testdir]} { 16 set testdir [file join [file dirname [info script]] .. .. test] 17} 18source $testdir/tester.tcl 19set testprefix sessiondiff 20 21set PROG [test_find_sqldiff] 22db close 23 24proc sqlesc {id} { 25 set ret "'[string map {' ''} $id]'" 26 set ret 27} 28 29proc database_cksum {db1} { 30 set txt "" 31 32 sqlite3 dbtmp $db1 33 foreach tbl [dbtmp eval {SELECT name FROM sqlite_master WHERE type='table'}] { 34 set cols [list] 35 dbtmp eval "PRAGMA table_info = [sqlesc $tbl]" { 36 lappend cols "quote( $name )" 37 } 38 append txt [dbtmp eval \ 39 "SELECT [join $cols {||'.'||}] FROM [sqlesc $tbl] ORDER BY 1" 40 ] 41 } 42 dbtmp close 43 44 md5 $txt 45} 46 47proc readfile {filename} { 48 set fd [open $filename] 49 fconfigure $fd -translation binary -encoding binary 50 set data [read $fd] 51 close $fd 52 set data 53} 54 55proc get_changeset {db1 db2} { 56 exec $::PROG --changeset changeset.bin $db1 $db2 57 set bin [readfile changeset.bin] 58 return $bin 59} 60 61proc xConflict {args} { 62 return "" 63} 64 65proc do_changeset_test {tn sql1 sql2} { 66 forcedelete test.db123 test.db124 67 68 sqlite3 db test.db123 69 db eval $sql1 70 db close 71 72 sqlite3 db test.db124 73 db eval $sql2 74 75 set cs [get_changeset test.db124 test.db123] 76 sqlite3changeset_apply db $cs xConflict 77 db close 78 79 set database_cksum1 [database_cksum test.db123] 80 set database_cksum2 [database_cksum test.db124] 81 82 uplevel [list \ 83 do_test $tn [list string compare $database_cksum1 $database_cksum2] 0 84 ] 85} 86 87do_changeset_test 1.0 { 88 CREATE TABLE t1(x PRIMARY KEY); 89} { 90 CREATE TABLE t1(x PRIMARY KEY); 91} 92 93do_changeset_test 1.1 { 94 CREATE TABLE t1(x PRIMARY KEY); 95 CREATE TABLE t2(x PRIMARY KEY, y); 96 INSERT INTO t2 VALUES(1, 2); 97} { 98 CREATE TABLE t1(x PRIMARY KEY); 99 CREATE TABLE t2(x PRIMARY KEY, y); 100 INSERT INTO t2 VALUES(3, 4); 101} 102 103do_changeset_test 1.2 { 104 CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c)); 105 INSERT INTO t2 VALUES(1, 2, 3); 106 INSERT INTO t2 VALUES(4, 5, 6); 107} { 108 CREATE TABLE t2(a, b, c, PRIMARY KEY(b, c)); 109 INSERT INTO t2 VALUES(1, 2, 11); 110 INSERT INTO t2 VALUES(7, 8, 9); 111} 112 113finish_test 114 115