X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/5a9fcb87cac31b70a9721cc88df4a929c14846fe..0a546fc01758f9a9f8b2113764c2cf963df6ef20:/tests/support/server.tcl diff --git a/tests/support/server.tcl b/tests/support/server.tcl index 0c9f48ce..1507088e 100644 --- a/tests/support/server.tcl +++ b/tests/support/server.tcl @@ -25,6 +25,9 @@ proc check_valgrind_errors stderr { } proc kill_server config { + # nothing to kill when running against external server + if {$::external} return + # nevermind if its already dead if {![is_alive $config]} { return } set pid [dict get $config pid] @@ -80,7 +83,9 @@ proc ping_server {host port} { } close $fd } e]} { - puts "Can't PING server at $host:$port... $e" + puts -nonewline "." + } else { + puts -nonewline "ok" } return $retval } @@ -93,6 +98,24 @@ proc tags {tags code} { } proc start_server {options {code undefined}} { + # If we are runnign against an external server, we just push the + # host/port pair in the stack the first time + if {$::external} { + if {[llength $::servers] == 0} { + set srv {} + dict set srv "host" $::host + dict set srv "port" $::port + set client [redis $::host $::port] + dict set srv "client" $client + $client select 9 + + # append the server to the stack + lappend ::servers $srv + } + uplevel 1 $code + return + } + # setup defaults set baseconfig "default.conf" set overrides {} @@ -148,15 +171,34 @@ proc start_server {options {code undefined}} { set stderr [format "%s/%s" [dict get $config "dir"] "stderr"] if {$::valgrind} { - exec valgrind ./redis-server $config_file > $stdout 2> $stderr & - after 2000 + exec valgrind src/redis-server $config_file > $stdout 2> $stderr & } else { - exec ./redis-server $config_file > $stdout 2> $stderr & - after 500 + exec src/redis-server $config_file > $stdout 2> $stderr & } # check that the server actually started - if {$code ne "undefined" && ![ping_server $::host $::port]} { + # ugly but tries to be as fast as possible... + set retrynum 20 + set serverisup 0 + + puts -nonewline "=== ($tags) Starting server ${::host}:${::port} " + after 10 + if {$code ne "undefined"} { + while {[incr retrynum -1]} { + catch { + if {[ping_server $::host $::port]} { + set serverisup 1 + } + } + if {$serverisup} break + after 50 + } + } else { + set serverisup 1 + } + puts {} + + if {!$serverisup} { error_and_quit $config_file [exec cat $stderr] } @@ -173,7 +215,8 @@ proc start_server {options {code undefined}} { if {[dict exists $config port]} { set port [dict get $config port] } # setup config dict - dict set srv "config" $config_file + dict set srv "config_file" $config_file + dict set srv "config" $config dict set srv "pid" $pid dict set srv "host" $host dict set srv "port" $port @@ -196,20 +239,19 @@ proc start_server {options {code undefined}} { after 10 } - set client [redis $host $port] - dict set srv "client" $client - - # select the right db when we don't have to authenticate - if {![dict exists $config requirepass]} { - $client select 9 - } - # append the server to the stack lappend ::servers $srv - + + # connect client (after server dict is put on the stack) + reconnect + # execute provided block set curnum $::testnum - catch { uplevel 1 $code } err + if {![catch { uplevel 1 $code } err]} { + # zero exit status is good + unset err + } + if {$curnum == $::testnum} { # don't check for leaks when no tests were executed dict set srv "skipleaks" 1 @@ -220,22 +262,24 @@ proc start_server {options {code undefined}} { # allow an exception to bubble up the call chain but still kill this # server, because we want to reuse the ports when the tests are re-run - if {$err eq "exception"} { - puts [format "Logged warnings (pid %d):" [dict get $srv "pid"]] - set warnings [warnings_from_file [dict get $srv "stdout"]] - if {[string length $warnings] > 0} { - puts "$warnings" - } else { - puts "(none)" + if {[info exists err]} { + if {$err eq "exception"} { + puts [format "Logged warnings (pid %d):" [dict get $srv "pid"]] + set warnings [warnings_from_file [dict get $srv "stdout"]] + if {[string length $warnings] > 0} { + puts "$warnings" + } else { + puts "(none)" + } + # kill this server without checking for leaks + dict set srv "skipleaks" 1 + kill_server $srv + error "exception" + } elseif {[string length $err] > 0} { + puts "Error executing the suite, aborting..." + puts $err + exit 1 } - # kill this server without checking for leaks - dict set srv "skipleaks" 1 - kill_server $srv - error "exception" - } elseif {[string length $err] > 0} { - puts "Error executing the suite, aborting..." - puts $err - exit 1 } set ::tags [lrange $::tags 0 end-[llength $tags]]