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