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