# See the file LICENSE for redistribution information. # # Copyright (c) 1996, 1997, 1998, 1999, 2000 # Sleepycat Software. All rights reserved. # # $Id: test.tcl,v 11.114 2001/01/09 21:28:52 sue Exp $ source ./include.tcl # Load DB's TCL API. load $tcllib if { [file exists $testdir] != 1 } { file mkdir $testdir } global __debug_print global __debug_on global util_path # # Test if utilities work to figure out the path. Most systems # use ., but QNX has a problem with execvp of shell scripts which # causes it to break. # set stat [catch {exec ./db_printlog -?} ret] if { [string first "exec format error" $ret] != -1 } { set util_path ./.libs } else { set util_path . } set __debug_print 0 set __debug_on 0 # This is where the test numbering and parameters now live. source $test_path/testparams.tcl for { set i 1 } { $i <= $deadtests } {incr i} { set name [format "dead%03d.tcl" $i] source $test_path/$name } for { set i 1 } { $i <= $envtests } {incr i} { set name [format "env%03d.tcl" $i] source $test_path/$name } for { set i 1 } { $i <= $recdtests } {incr i} { set name [format "recd%03d.tcl" $i] source $test_path/$name } for { set i 1 } { $i <= $rpctests } {incr i} { set name [format "rpc%03d.tcl" $i] source $test_path/$name } for { set i 1 } { $i <= $rsrctests } {incr i} { set name [format "rsrc%03d.tcl" $i] source $test_path/$name } for { set i 1 } { $i <= $runtests } {incr i} { set name [format "test%03d.tcl" $i] # Test numbering may be sparse. if { [file exists $test_path/$name] == 1 } { source $test_path/$name } } for { set i 1 } { $i <= $subdbtests } {incr i} { set name [format "sdb%03d.tcl" $i] source $test_path/$name } source $test_path/archive.tcl source $test_path/byteorder.tcl source $test_path/dbm.tcl source $test_path/hsearch.tcl source $test_path/join.tcl source $test_path/lock001.tcl source $test_path/lock002.tcl source $test_path/lock003.tcl source $test_path/log.tcl source $test_path/logtrack.tcl source $test_path/mpool.tcl source $test_path/mutex.tcl source $test_path/ndbm.tcl source $test_path/sdbtest001.tcl source $test_path/sdbtest002.tcl source $test_path/sdbutils.tcl source $test_path/testutils.tcl source $test_path/txn.tcl source $test_path/upgrade.tcl set dict $test_path/wordlist set alphabet "abcdefghijklmnopqrstuvwxyz" # Random number seed. global rand_init set rand_init 1013 # Default record length and padding character for # fixed record length access method(s) set fixed_len 20 set fixed_pad 0 set recd_debug 0 set log_log_record_types 0 set ohandles {} # Set up any OS-specific values global tcl_platform set is_windows_test [is_substr $tcl_platform(os) "Win"] set is_hp_test [is_substr $tcl_platform(os) "HP-UX"] set is_qnx_test [is_substr $tcl_platform(os) "QNX"] # From here on out, test.tcl contains the procs that are used to # run all or part of the test suite. proc run_am { } { global runtests source ./include.tcl fileremove -f ALL.OUT # Access method tests. # # XXX # Broken up into separate tclsh instantiations so we don't require # so much memory. foreach i "btree rbtree hash queue queueext recno frecno rrecno" { puts "Running $i tests" for { set j 1 } { $j <= $runtests } {incr j} { if [catch {exec $tclsh_path \ << "source $test_path/test.tcl; \ run_method -$i $j $j" >>& ALL.OUT } res] { set o [open ALL.OUT a] puts $o "FAIL: [format "test%03d" $j] $i" close $o } } if [catch {exec $tclsh_path \ << "source $test_path/test.tcl; \ subdb -$i 0 1" >>& ALL.OUT } res] { set o [open ALL.OUT a] puts $o "FAIL: subdb -$i test" close $o } } } proc run_std { args } { global runtests global subdbtests source ./include.tcl set exflgs [eval extractflags $args] set args [lindex $exflgs 0] set flags [lindex $exflgs 1] set display 1 set run 1 set am_only 0 set std_only 1 set rflags {--} foreach f $flags { switch $f { A { set std_only 0 } m { set am_only 1 puts "run_std: access method tests only." } n { set display 1 set run 0 set rflags [linsert $rflags 0 "-n"] } } } if { $std_only == 1 } { fileremove -f ALL.OUT set o [open ALL.OUT a] if { $run == 1 } { puts -nonewline "Test suite run started at: " puts [clock format [clock seconds] -format "%H:%M %D"] puts [berkdb version -string] puts -nonewline $o "Test suite run started at: " puts $o [clock format [clock seconds] -format "%H:%M %D"] puts $o [berkdb version -string] } close $o } set test_list { {"environment" "env"} {"archive" "archive"} {"locking" "lock"} {"logging" "log"} {"memory pool" "mpool"} {"mutex" "mutex"} {"transaction" "txn"} {"deadlock detection" "dead"} {"subdatabase" "subdb_gen"} {"byte-order" "byte"} {"recno backing file" "rsrc"} {"DBM interface" "dbm"} {"NDBM interface" "ndbm"} {"Hsearch interface" "hsearch"} } if { $am_only == 0 } { foreach pair $test_list { set msg [lindex $pair 0] set cmd [lindex $pair 1] puts "Running $msg tests" if [catch {exec $tclsh_path \ << "source $test_path/test.tcl; r $rflags $cmd" \ >>& ALL.OUT } res] { set o [open ALL.OUT a] puts $o "FAIL: $cmd test" close $o } } # Run recovery tests. # # XXX These too are broken into separate tclsh instantiations # so we don't require so much memory, but I think it's cleaner # and more useful to do it down inside proc r than here, # since "r recd" gets done a lot and needs to work. puts "Running recovery tests" if [catch {exec $tclsh_path \ << "source $test_path/test.tcl; \ r $rflags recd" >>& ALL.OUT } res] { set o [open ALL.OUT a] puts $o "FAIL: recd test" close $o } # Run join test # # XXX # Broken up into separate tclsh instantiations so we don't # require so much memory. puts "Running join test" foreach i "join1 join2 join3 join4 join5 join6" { if [catch {exec $tclsh_path \ << "source $test_path/test.tcl; r $rflags $i" \ >>& ALL.OUT } res] { set o [open ALL.OUT a] puts $o "FAIL: $i test" close $o } } } # Access method tests. # # XXX # Broken up into separate tclsh instantiations so we don't require # so much memory. foreach i "btree rbtree hash queue queueext recno frecno rrecno" { puts "Running $i tests" for { set j 1 } { $j <= $runtests } {incr j} { if { $run == 0 } { set o [open ALL.OUT a] run_method -$i $j $j $display $run $o close $o } if { $run } { if [catch {exec $tclsh_path \ << "source $test_path/test.tcl; \ run_method -$i $j $j $display $run" \ >>& ALL.OUT } res] { set o [open ALL.OUT a] puts $o \ "FAIL: [format "test%03d" $j] $i" close $o } } } if [catch {exec $tclsh_path \ << "source $test_path/test.tcl; \ subdb -$i $display $run" >>& ALL.OUT } res] { set o [open ALL.OUT a] puts $o "FAIL: subdb -$i test" close $o } } # If not actually running, no need to check for failure. # If running in the context of the larger 'run_all' we don't # check for failure here either. if { $run == 0 || $std_only == 0 } { return } set failed 0 set o [open ALL.OUT r] while { [gets $o line] >= 0 } { if { [regexp {^FAIL} $line] != 0 } { set failed 1 } } close $o set o [open ALL.OUT a] if { $failed == 0 } { puts "Regression Tests Succeeded" puts $o "Regression Tests Succeeded" } else { puts "Regression Tests Failed; see ALL.OUT for log" puts $o "Regression Tests Failed" } puts -nonewline "Test suite run completed at: " puts [clock format [clock seconds] -format "%H:%M %D"] puts -nonewline $o "Test suite run completed at: " puts $o [clock format [clock seconds] -format "%H:%M %D"] close $o } proc r { args } { global envtests global recdtests global subdbtests global deadtests source ./include.tcl set exflgs [eval extractflags $args] set args [lindex $exflgs 0] set flags [lindex $exflgs 1] set display 1 set run 1 set saveflags "--" foreach f $flags { switch $f { n { set display 1 set run 0 set saveflags "-n $saveflags" } } } if {[catch { set l [ lindex $args 0 ] switch $l { archive { if { $display } { puts "eval archive [lrange $args 1 end]" } if { $run } { check_handles eval archive [lrange $args 1 end] } } byte { foreach method \ "-hash -btree -recno -queue -queueext -frecno" { if { $display } { puts "byteorder $method" } if { $run } { check_handles byteorder $method } } } dbm { if { $display } { puts "dbm" } if { $run } { check_handles dbm } } dead { for { set i 1 } { $i <= $deadtests } \ { incr i } { if { $display } { puts "eval dead00$i\ [lrange $args 1 end]" } if { $run } { check_handles eval dead00$i\ [lrange $args 1 end] } } } env { for { set i 1 } { $i <= $envtests } {incr i} { if { $display } { puts "eval env00$i" } if { $run } { check_handles eval env00$i } } } hsearch { if { $display } { puts "hsearch" } if { $run } { check_handles hsearch } } join { eval r $saveflags join1 eval r $saveflags join2 eval r $saveflags join3 eval r $saveflags join4 eval r $saveflags join5 eval r $saveflags join6 } join1 { if { $display } { puts jointest } if { $run } { check_handles jointest } } joinbench { puts "[timestamp]" eval r $saveflags join1 eval r $saveflags join2 puts "[timestamp]" } join2 { if { $display } { puts "jointest 512" } if { $run } { check_handles jointest 512 } } join3 { if { $display } { puts "jointest 8192 0 -join_item" } if { $run } { check_handles jointest 8192 0 -join_item } } join4 { if { $display } { puts "jointest 8192 2" } if { $run } { check_handles jointest 8192 2 } } join5 { if { $display } { puts "jointest 8192 3" } if { $run } { check_handles jointest 8192 3 } } join6 { if { $display } { puts "jointest 512 3" } if { $run } { check_handles jointest 512 3 } } lock { if { $display } { puts \ "eval locktest [lrange $args 1 end]" } if { $run } { check_handles eval locktest [lrange $args 1 end] } } log { if { $display } { puts "eval logtest [lrange $args 1 end]" } if { $run } { check_handles eval logtest [lrange $args 1 end] } } mpool { eval r $saveflags mpool1 eval r $saveflags mpool2 eval r $saveflags mpool3 } mpool1 { if { $display } { puts "eval mpool [lrange $args 1 end]" } if { $run } { check_handles eval mpool [lrange $args 1 end] } } mpool2 { if { $display } { puts "eval mpool\ -mem system [lrange $args 1 end]" } if { $run } { check_handles eval mpool\ -mem system [lrange $args 1 end] } } mpool3 { if { $display } { puts "eval mpool\ -mem private [lrange $args 1 end]" } if { $run } { eval mpool\ -mem private [lrange $args 1 end] } } mutex { if { $display } { puts "eval mutex [lrange $args 1 end]" } if { $run } { check_handles eval mutex [lrange $args 1 end] } } ndbm { if { $display } { puts ndbm } if { $run } { check_handles ndbm } } recd { if { $display } { puts run_recds } if { $run } { check_handles run_recds } } rpc { # RPC must be run as one unit due to server, # so just print "r rpc" in the display case. if { $display } { puts "r rpc" } if { $run } { check_handles eval rpc001 check_handles eval rpc002 if { [catch {run_rpcmethod -txn} ret]\ != 0 } { puts $ret } foreach method \ "hash queue queueext recno frecno rrecno rbtree btree" { if { [catch {run_rpcmethod \ -$method} ret] != 0 } { puts $ret } } } } rsrc { if { $display } { puts "rsrc001\nrsrc002" } if { $run } { check_handles rsrc001 check_handles rsrc002 } } subdb { eval r $saveflags subdb_gen foreach method \ "btree rbtree hash queue queueext recno frecno rrecno" { check_handles eval subdb -$method $display $run } } subdb_gen { if { $display } { puts "subdbtest001 ; verify_dir" puts "subdbtest002 ; verify_dir" } if { $run } { check_handles eval subdbtest001 verify_dir check_handles eval subdbtest002 verify_dir } } txn { if { $display } { puts "txntest [lrange $args 1 end]" } if { $run } { check_handles eval txntest [lrange $args 1 end] } } btree - rbtree - hash - queue - queueext - recno - frecno - rrecno { eval run_method [lindex $args 0] \ 1 0 $display $run [lrange $args 1 end] } default { error \ "FAIL:[timestamp] r: $args: unknown command" } } flush stdout flush stderr } res] != 0} { global errorInfo; set fnl [string first "\n" $errorInfo] set theError [string range $errorInfo 0 [expr $fnl - 1]] if {[string first FAIL $errorInfo] == -1} { error "FAIL:[timestamp] r: $args: $theError" } else { error $theError; } } } proc run_method { method {start 1} {stop 0} {display 0} {run 1} \ { outfile stdout } args } { global __debug_on global __debug_print global parms global runtests source ./include.tcl if { $stop == 0 } { set stop $runtests } if { $run == 1 } { puts $outfile "run_method: $method $start $stop $args" } if {[catch { for { set i $start } { $i <= $stop } {incr i} { set name [format "test%03d" $i] if { [info exists parms($name)] != 1 } { puts "[format Test%03d $i] disabled in\ testparams.tcl; skipping." continue } if { $display } { puts -nonewline $outfile "eval $name $method" puts -nonewline $outfile " $parms($name) $args" puts $outfile " ; verify_dir $testdir \"\" 1" } if { $run } { check_handles $outfile puts $outfile "[timestamp]" eval $name $method $parms($name) $args if { $__debug_print != 0 } { puts $outfile "" } # verify all databases the test leaves behind verify_dir $testdir "" 1 if { $__debug_on != 0 } { debug } } flush stdout flush stderr } } res] != 0} { global errorInfo; set fnl [string first "\n" $errorInfo] set theError [string range $errorInfo 0 [expr $fnl - 1]] if {[string first FAIL $errorInfo] == -1} { error "FAIL:[timestamp]\ run_method: $method $i: $theError" } else { error $theError; } } } proc run_rpcmethod { type {start 1} {stop 0} {largs ""} } { global __debug_on global __debug_print global parms global runtests source ./include.tcl if { $stop == 0 } { set stop $runtests } puts "run_rpcmethod: $type $start $stop $largs" set save_largs $largs if { [string compare $rpc_server "localhost"] == 0 } { set dpid [exec $util_path/berkeley_db_svc -h $rpc_testdir &] } else { set dpid [exec rsh $rpc_server $rpc_path/berkeley_db_svc \ -h $rpc_testdir &] } puts "\tRun_rpcmethod.a: starting server, pid $dpid" tclsleep 2 remote_cleanup $rpc_server $rpc_testdir $testdir set home [file tail $rpc_testdir] set txn "" set use_txn 0 if { [string first "txn" $type] != -1 } { set use_txn 1 } if { $use_txn == 1 } { if { $start == 1 } { set ntxns 32 } else { set ntxns $start } set i 1 check_handles remote_cleanup $rpc_server $rpc_testdir $testdir set env [eval {berkdb env -create -mode 0644 -home $home \ -server $rpc_server -client_timeout 10000} -txn] error_check_good env_open [is_valid_env $env] TRUE set stat [catch {eval txn001_suba $ntxns $env} res] if { $stat == 0 } { set stat [catch {eval txn001_subb $ntxns $env} res] } error_check_good envclose [$env close] 0 } else { set stat [catch { for { set i $start } { $i <= $stop } {incr i} { check_handles set name [format "test%03d" $i] if { [info exists parms($name)] != 1 } { puts "[format Test%03d $i] disabled in\ testparams.tcl; skipping." continue } remote_cleanup $rpc_server $rpc_testdir $testdir # # Set server cachesize to 1Mb. Otherwise some # tests won't fit (like test084 -btree). # set env [eval {berkdb env -create -mode 0644 \ -home $home -server $rpc_server \ -client_timeout 10000 \ -cachesize {0 1048576 1} }] error_check_good env_open \ [is_valid_env $env] TRUE append largs " -env $env " puts "[timestamp]" eval $name $type $parms($name) $largs if { $__debug_print != 0 } { puts "" } if { $__debug_on != 0 } { debug } flush stdout flush stderr set largs $save_largs error_check_good envclose [$env close] 0 } } res] } if { $stat != 0} { global errorInfo; set fnl [string first "\n" $errorInfo] set theError [string range $errorInfo 0 [expr $fnl - 1]] exec $KILL $dpid if {[string first FAIL $errorInfo] == -1} { error "FAIL:[timestamp]\ run_rpcmethod: $type $i: $theError" } else { error $theError; } } exec $KILL $dpid } proc run_rpcnoserver { type {start 1} {stop 0} {largs ""} } { global __debug_on global __debug_print global parms global runtests source ./include.tcl if { $stop == 0 } { set stop $runtests } puts "run_rpcnoserver: $type $start $stop $largs" set save_largs $largs remote_cleanup $rpc_server $rpc_testdir $testdir set home [file tail $rpc_testdir] set txn "" set use_txn 0 if { [string first "txn" $type] != -1 } { set use_txn 1 } if { $use_txn == 1 } { if { $start == 1 } { set ntxns 32 } else { set ntxns $start } set i 1 check_handles remote_cleanup $rpc_server $rpc_testdir $testdir set env [eval {berkdb env -create -mode 0644 -home $home \ -server $rpc_server -client_timeout 10000} -txn] error_check_good env_open [is_valid_env $env] TRUE set stat [catch {eval txn001_suba $ntxns $env} res] if { $stat == 0 } { set stat [catch {eval txn001_subb $ntxns $env} res] } error_check_good envclose [$env close] 0 } else { set stat [catch { for { set i $start } { $i <= $stop } {incr i} { check_handles set name [format "test%03d" $i] if { [info exists parms($name)] != 1 } { puts "[format Test%03d $i] disabled in\ testparams.tcl; skipping." continue } remote_cleanup $rpc_server $rpc_testdir $testdir # # Set server cachesize to 1Mb. Otherwise some # tests won't fit (like test084 -btree). # set env [eval {berkdb env -create -mode 0644 \ -home $home -server $rpc_server \ -client_timeout 10000 \ -cachesize {0 1048576 1} }] error_check_good env_open \ [is_valid_env $env] TRUE append largs " -env $env " puts "[timestamp]" eval $name $type $parms($name) $largs if { $__debug_print != 0 } { puts "" } if { $__debug_on != 0 } { debug } flush stdout flush stderr set largs $save_largs error_check_good envclose [$env close] 0 } } res] } if { $stat != 0} { global errorInfo; set fnl [string first "\n" $errorInfo] set theError [string range $errorInfo 0 [expr $fnl - 1]] if {[string first FAIL $errorInfo] == -1} { error "FAIL:[timestamp]\ run_rpcnoserver: $type $i: $theError" } else { error $theError; } } } # # Run method tests in one environment. (As opposed to run_envmethod1 # which runs each test in its own, new environment.) # proc run_envmethod { type {start 1} {stop 0} {largs ""} } { global __debug_on global __debug_print global parms global runtests source ./include.tcl if { $stop == 0 } { set stop $runtests } puts "run_envmethod: $type $start $stop $largs" set save_largs $largs env_cleanup $testdir set txn "" set stat [catch { for { set i $start } { $i <= $stop } {incr i} { check_handles set env [eval {berkdb env -create -mode 0644 \ -home $testdir}] error_check_good env_open [is_valid_env $env] TRUE append largs " -env $env " puts "[timestamp]" set name [format "test%03d" $i] if { [info exists parms($name)] != 1 } { puts "[format Test%03d $i] disabled in\ testparams.tcl; skipping." continue } eval $name $type $parms($name) $largs if { $__debug_print != 0 } { puts "" } if { $__debug_on != 0 } { debug } flush stdout flush stderr set largs $save_largs error_check_good envclose [$env close] 0 error_check_good envremove [berkdb envremove \ -home $testdir] 0 } } res] if { $stat != 0} { global errorInfo; set fnl [string first "\n" $errorInfo] set theError [string range $errorInfo 0 [expr $fnl - 1]] if {[string first FAIL $errorInfo] == -1} { error "FAIL:[timestamp]\ run_envmethod: $type $i: $theError" } else { error $theError; } } } proc subdb { method display run {outfile stdout} args} { global subdbtests testdir global parms for { set i 1 } {$i <= $subdbtests} {incr i} { set name [format "subdb%03d" $i] if { [info exists parms($name)] != 1 } { puts "[format Subdb%03d $i] disabled in\ testparams.tcl; skipping." continue } if { $display } { puts -nonewline $outfile "eval $name $method" puts -nonewline $outfile " $parms($name) $args;" puts $outfile "verify_dir $testdir \"\" 1" } if { $run } { check_handles $outfile eval $name $method $parms($name) $args verify_dir $testdir "" 1 } flush stdout flush stderr } } proc run_recd { method {start 1} {stop 0} args } { global __debug_on global __debug_print global parms global recdtests global log_log_record_types source ./include.tcl if { $stop == 0 } { set stop $recdtests } puts "run_recd: $method $start $stop $args" if {[catch { for { set i $start } { $i <= $stop } {incr i} { check_handles puts "[timestamp]" set name [format "recd%03d" $i] # By redirecting stdout to stdout, we make exec # print output rather than simply returning it. exec $tclsh_path << "source $test_path/test.tcl; \ set log_log_record_types $log_log_record_types; \ eval $name $method" >@ stdout if { $__debug_print != 0 } { puts "" } if { $__debug_on != 0 } { debug } flush stdout flush stderr } } res] != 0} { global errorInfo; set fnl [string first "\n" $errorInfo] set theError [string range $errorInfo 0 [expr $fnl - 1]] if {[string first FAIL $errorInfo] == -1} { error "FAIL:[timestamp]\ run_recd: $method $i: $theError" } else { error $theError; } } } proc run_recds { } { global log_log_record_types set log_log_record_types 1 logtrack_init foreach method \ "btree rbtree hash queue queueext recno frecno rrecno" { check_handles if { [catch \ {run_recd -$method} ret ] != 0 } { puts $ret } } logtrack_summary set log_log_record_types 0 } proc run_all { args } { global runtests global subdbtests source ./include.tcl fileremove -f ALL.OUT set exflgs [eval extractflags $args] set flags [lindex $exflgs 1] set display 1 set run 1 set am_only 0 set rflags {--} foreach f $flags { switch $f { m { set am_only 1 } n { set display 1 set run 0 set rflags [linsert $rflags 0 "-n"] } } } set o [open ALL.OUT a] if { $run == 1 } { puts -nonewline "Test suite run started at: " puts [clock format [clock seconds] -format "%H:%M %D"] puts [berkdb version -string] puts -nonewline $o "Test suite run started at: " puts $o [clock format [clock seconds] -format "%H:%M %D"] puts $o [berkdb version -string] } close $o # # First run standard tests. Send in a -A to let run_std know # that it is part of the "run_all" run, so that it doesn't # print out start/end times. # lappend args -A eval {run_std} $args set test_pagesizes { 512 8192 65536 } set args [lindex $exflgs 0] set save_args $args foreach pgsz $test_pagesizes { set args $save_args append args " -pagesize $pgsz" if { $am_only == 0 } { # Run recovery tests. # # XXX These too are broken into separate tclsh # instantiations so we don't require so much # memory, but I think it's cleaner # and more useful to do it down inside proc r than here, # since "r recd" gets done a lot and needs to work. puts "Running recovery tests with pagesize $pgsz" if [catch {exec $tclsh_path \ << "source $test_path/test.tcl; \ r $rflags recd $args" >>& ALL.OUT } res] { set o [open ALL.OUT a] puts $o "FAIL: recd test" close $o } } # Access method tests. # # XXX # Broken up into separate tclsh instantiations so # we don't require so much memory. foreach i \ "btree rbtree hash queue queueext recno frecno rrecno" { puts "Running $i tests with pagesize $pgsz" for { set j 1 } { $j <= $runtests } {incr j} { if { $run == 0 } { set o [open ALL.OUT a] run_method -$i $j $j $display \ $run $o $args close $o } if { $run } { if [catch {exec $tclsh_path \ << "source $test_path/test.tcl; \ run_method -$i $j $j $display \ $run stdout $args" \ >>& ALL.OUT } res] { set o [open ALL.OUT a] puts $o \ "FAIL: [format \ "test%03d" $j] $i" close $o } } } # # Run subdb tests with varying pagesizes too. # if { $run == 0 } { set o [open ALL.OUT a] subdb -$i $display $run $o $args close $o } if { $run == 1 } { if [catch {exec $tclsh_path \ << "source $test_path/test.tcl; \ subdb -$i $display $run stdout $args" \ >>& ALL.OUT } res] { set o [open ALL.OUT a] puts $o "FAIL: subdb -$i test" close $o } } } } set args $save_args # # Run access method tests at default page size in one env. # foreach i "btree rbtree hash queue queueext recno frecno rrecno" { puts "Running $i tests in an env" if { $run == 0 } { set o [open ALL.OUT a] run_envmethod1 -$i 1 $runtests $display \ $run $o $args close $o } if { $run } { if [catch {exec $tclsh_path \ << "source $test_path/test.tcl; \ run_envmethod1 -$i 1 $runtests $display \ $run stdout $args" \ >>& ALL.OUT } res] { set o [open ALL.OUT a] puts $o \ "FAIL: run_envmethod1 $i" close $o } } } # If not actually running, no need to check for failure. if { $run == 0 } { return } set failed 0 set o [open ALL.OUT r] while { [gets $o line] >= 0 } { if { [regexp {^FAIL} $line] != 0 } { set failed 1 } } close $o set o [open ALL.OUT a] if { $failed == 0 } { puts "Regression Tests Succeeded" puts $o "Regression Tests Succeeded" } else { puts "Regression Tests Failed; see ALL.OUT for log" puts $o "Regression Tests Failed" } puts -nonewline "Test suite run completed at: " puts [clock format [clock seconds] -format "%H:%M %D"] puts -nonewline $o "Test suite run completed at: " puts $o [clock format [clock seconds] -format "%H:%M %D"] close $o } # # Run method tests in one environment. (As opposed to run_envmethod # which runs each test in its own, new environment.) # proc run_envmethod1 { method {start 1} {stop 0} {display 0} {run 1} \ { outfile stdout } args } { global __debug_on global __debug_print global parms global runtests source ./include.tcl if { $stop == 0 } { set stop $runtests } if { $run == 1 } { puts "run_envmethod1: $method $start $stop $args" } set txn "" if { $run == 1 } { check_handles env_cleanup $testdir error_check_good envremove [berkdb envremove -home $testdir] 0 set env [eval {berkdb env -create -mode 0644 -home $testdir}] error_check_good env_open [is_valid_env $env] TRUE append largs " -env $env " } set stat [catch { for { set i $start } { $i <= $stop } {incr i} { set name [format "test%03d" $i] if { [info exists parms($name)] != 1 } { puts "[format Test%03d $i] disabled in\ testparams.tcl; skipping." continue } if { $display } { puts -nonewline $outfile "eval $name $method" puts -nonewline $outfile " $parms($name) $args" puts $outfile " ; verify_dir $testdir \"\" 1" } if { $run } { check_handles $outfile puts $outfile "[timestamp]" eval $name $method $parms($name) $largs if { $__debug_print != 0 } { puts $outfile "" } if { $__debug_on != 0 } { debug } } flush stdout flush stderr } } res] if { $run == 1 } { error_check_good envclose [$env close] 0 } if { $stat != 0} { global errorInfo; set fnl [string first "\n" $errorInfo] set theError [string range $errorInfo 0 [expr $fnl - 1]] if {[string first FAIL $errorInfo] == -1} { error "FAIL:[timestamp]\ run_envmethod1: $method $i: $theError" } else { error $theError; } } }