From: dan Date: Tue, 7 Mar 2017 20:03:25 +0000 (+0000) Subject: Add test script ext/rbu/rbu_round_trip.tcl. Uses "dbselftest" to test that X-Git-Tag: version-3.18.0~74 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5cc95ebf37cc7b307e02fd6471d7342af5b24226;p=thirdparty%2Fsqlite.git Add test script ext/rbu/rbu_round_trip.tcl. Uses "dbselftest" to test that "rbu" and "sqldiff" work together. FossilOrigin-Name: 961e79da73b4550b3e5b0f9a617133a76485db67 --- diff --git a/ext/rbu/rbu_round_trip.tcl b/ext/rbu/rbu_round_trip.tcl new file mode 100644 index 0000000000..a4f5d579a1 --- /dev/null +++ b/ext/rbu/rbu_round_trip.tcl @@ -0,0 +1,205 @@ +########################################################################## +# 2016 Mar 8 +# +# 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. +# +proc process_cmdline {} { + cmdline::process ::A $::argv { + {make "try to build missing tools"} + {verbose "make more noise"} + database + database2 + } { + This script uses/tests the following tools: + + dbselftest + rbu + sqldiff + sqlite3 + + The user passes the names of two database files - a.db and b.db below - as + arguments. This program: + + 1. Runs [dbselftest --init] against both databases. + 2. Runs [sqldiff --rbu --vtab a.db b.db | sqlite3 .db] to create an + RBU database. + 3. Runs [rbu b.db .db] to patch b.db to a.db. + 4. Runs [sqldiff --table selftest a.db b.db] to check that the selftest + tables are now identical. + 5. Runs [dbselftest] against both databases. + } +} + +########################################################################### +########################################################################### +# Command line options processor. This is generic code that can be copied +# between scripts. +# +namespace eval cmdline { + proc cmdline_error {O E {msg ""}} { + if {$msg != ""} { + puts stderr "Error: $msg" + puts stderr "" + } + + set L [list] + foreach o $O { + if {[llength $o]==1} { + lappend L [string toupper $o] + } + } + + puts stderr "Usage: $::argv0 ?SWITCHES? $L" + puts stderr "" + puts stderr "Switches are:" + foreach o $O { + if {[llength $o]==3} { + foreach {a b c} $o {} + puts stderr [format " -%-15s %s (default \"%s\")" "$a VAL" $c $b] + } elseif {[llength $o]==2} { + foreach {a b} $o {} + puts stderr [format " -%-15s %s" $a $b] + } + } + puts stderr "" + puts stderr $E + exit -1 + } + + proc process {avar lArgs O E} { + upvar $avar A + set zTrailing "" ;# True if ... is present in $O + set lPosargs [list] + + # Populate A() with default values. Also, for each switch in the command + # line spec, set an entry in the idx() array as follows: + # + # {tblname t1 "table name to use"} + # -> [set idx(-tblname) {tblname t1 "table name to use"} + # + # For each position parameter, append its name to $lPosargs. If the ... + # specifier is present, set $zTrailing to the name of the prefix. + # + foreach o $O { + set nm [lindex $o 0] + set nArg [llength $o] + switch -- $nArg { + 1 { + if {[string range $nm end-2 end]=="..."} { + set zTrailing [string range $nm 0 end-3] + } else { + lappend lPosargs $nm + } + } + 2 { + set A($nm) 0 + set idx(-$nm) $o + } + 3 { + set A($nm) [lindex $o 1] + set idx(-$nm) $o + } + default { + error "Error in command line specification" + } + } + } + + # Set explicitly specified option values + # + set nArg [llength $lArgs] + for {set i 0} {$i < $nArg} {incr i} { + set opt [lindex $lArgs $i] + if {[string range $opt 0 0]!="-" || $opt=="--"} break + set c [array names idx "${opt}*"] + if {[llength $c]==0} { cmdline_error $O $E "Unrecognized option: $opt"} + if {[llength $c]>1} { cmdline_error $O $E "Ambiguous option: $opt"} + + if {[llength $idx($c)]==3} { + if {$i==[llength $lArgs]-1} { + cmdline_error $O $E "Option requires argument: $c" + } + incr i + set A([lindex $idx($c) 0]) [lindex $lArgs $i] + } else { + set A([lindex $idx($c) 0]) 1 + } + } + + # Deal with position arguments. + # + set nPosarg [llength $lPosargs] + set nRem [expr $nArg - $i] + if {$nRem < $nPosarg || ($zTrailing=="" && $nRem > $nPosarg)} { + cmdline_error $O $E + } + for {set j 0} {$j < $nPosarg} {incr j} { + set A([lindex $lPosargs $j]) [lindex $lArgs [expr $j+$i]] + } + if {$zTrailing!=""} { + set A($zTrailing) [lrange $lArgs [expr $j+$i] end] + } + } +} ;# namespace eval cmdline +# End of command line options processor. +########################################################################### +########################################################################### + +process_cmdline + +# Check that the specified tool is present. +# +proc check_for_tool {tool} { + if {[file exists $tool]==0 || [file executable $tool]==0} { + puts stderr "Missing $tool... exiting. (run \[make $tool\])" + exit -1 + } +} + +if {$A(make)} { + if {$A(verbose)} { puts "building tools..." } + exec make dbselftest rbu sqlite3 sqldiff +} + +check_for_tool dbselftest +check_for_tool rbu +check_for_tool sqlite3 +check_for_tool sqldiff + +exec ./sqlite3 $A(database) "DROP TABLE selftest;" +exec ./sqlite3 $A(database2) "DROP TABLE selftest;" + +# Run [dbselftest --init] on both databases +if {$A(verbose)} { puts "Running \[dbselftest --init\]" } +exec ./dbselftest --init $A(database) +exec ./dbselftest --init $A(database2) + +# Create an RBU patch. +set tmpname "./rrt-[format %x [expr int(rand()*0x7FFFFFFF)]].db" +if {$A(verbose)} { puts "rbu database is $tmpname" } +exec ./sqldiff --rbu --vtab $A(database2) $A(database) | ./sqlite3 $tmpname + +# Run the [rbu] patch. +if {$A(verbose)} { puts "Running \[rbu]" } +exec ./rbu $A(database2) $tmpname + +set selftest_diff [exec ./sqldiff --table selftest $A(database) $A(database2)] +if {$selftest_diff != ""} { + puts stderr "patching table \"selftest\" failed: $selftest_diff" + exit -1 +} + +# Run [dbselftest] on both databases +if {$A(verbose)} { puts "Running \[dbselftest]" } +exec ./dbselftest $A(database) +exec ./dbselftest $A(database2) + +# Remove the RBU database +file delete $tmpname +puts "round trip test successful." + diff --git a/manifest b/manifest index 11e8d7020b..a3944b0665 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization\sin\sthe\stokenizer/parser\sloop. -D 2017-03-07T14:38:52.463 +C Add\stest\sscript\sext/rbu/rbu_round_trip.tcl.\sUses\s"dbselftest"\sto\stest\sthat\n"rbu"\sand\s"sqldiff"\swork\stogether. +D 2017-03-07T20:03:25.030 F Makefile.in edb6bcdd37748d2b1c3422ff727c748df7ffe918 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc a89ea37ab5928026001569f056973b9059492fe2 @@ -249,6 +249,7 @@ F ext/rbu/rbuA.test c1a7b3e2d926b8f8448bb3b4ae787e314ee4b2b3 F ext/rbu/rbuB.test c25bc325b8072a766e56bb76c001866b405925c2 F ext/rbu/rbuC.test efe47db508a0269b683cb2a1913a425ffd39a831 F ext/rbu/rbu_common.tcl a38e8e2d4a50fd6aaf151633714c1b1d2fae3ead +F ext/rbu/rbu_round_trip.tcl f3216836bbaeb10d76a2c70b89c13f59eabbd117 F ext/rbu/rbucrash.test 8d2ed5d4b05fef6c00c2a6b5f7ead71fa172a695 F ext/rbu/rbucrash2.test b2ecbdd7bb72c88bd217c65bd00dafa07f7f2d4d F ext/rbu/rbudiff.test 3e605cf624d00d04d0fb1316a3acec4fbe3b3ac5 @@ -1562,7 +1563,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 01cd9fb176cde30658233e36aad44e4a5519612e -R 71cd7c04663535bedf446cdfbe42cd2c -U drh -Z ad71d7ac120da8173e9f5ee4d75c7bc4 +P 2cb71583d631cd417acbeebbb4ee950573a9deef +R ee3baff0fd57ede16b35b4777ef32cf9 +U dan +Z 9c10ed94bada1b1224e7c4aff135f1d6 diff --git a/manifest.uuid b/manifest.uuid index 8791cf4146..744c25a1e5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2cb71583d631cd417acbeebbb4ee950573a9deef \ No newline at end of file +961e79da73b4550b3e5b0f9a617133a76485db67 \ No newline at end of file