X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/21dbc6499a538af07f52a41742cf1683f3fc9c23..bf758397a1ea243aec67083b31dd3005092ad495:/tests/support/server.tcl diff --git a/tests/support/server.tcl b/tests/support/server.tcl index 1507088e..c2d7132d 100644 --- a/tests/support/server.tcl +++ b/tests/support/server.tcl @@ -1,5 +1,6 @@ set ::global_overrides {} set ::tags {} +set ::valgrind_errors {} proc error_and_quit {config_file error} { puts "!!COULD NOT START REDIS-SERVER\n" @@ -16,11 +17,9 @@ proc check_valgrind_errors stderr { close $fd if {![regexp -- {ERROR SUMMARY: 0 errors} $buf] || - ![regexp -- {definitely lost: 0 bytes} $buf]} { - puts "*** VALGRIND ERRORS ***" - puts $buf - puts "--- press enter to continue ---" - gets stdin + (![regexp -- {definitely lost: 0 bytes} $buf] && + ![regexp -- {no leaks are possible} $buf])} { + send_data_packet $::test_server_fd err "Valgrind error: $buf\n" } } @@ -83,9 +82,13 @@ proc ping_server {host port} { } close $fd } e]} { - puts -nonewline "." + if {$::verbose} { + puts -nonewline "." + } } else { - puts -nonewline "ok" + if {$::verbose} { + puts -nonewline "ok" + } } return $retval } @@ -151,7 +154,8 @@ proc start_server {options {code undefined}} { dict set config dir [tmpdir server] # start every server on a different port - dict set config port [incr ::port] + set ::port [find_available_port [expr {$::port+1}]] + dict set config port $::port # apply overrides from global space and arguments foreach {directive arguments} [concat $::global_overrides $overrides] { @@ -171,17 +175,20 @@ proc start_server {options {code undefined}} { set stderr [format "%s/%s" [dict get $config "dir"] "stderr"] if {$::valgrind} { - exec valgrind src/redis-server $config_file > $stdout 2> $stderr & + exec valgrind --suppressions=src/valgrind.sup src/redis-server $config_file > $stdout 2> $stderr & } else { exec src/redis-server $config_file > $stdout 2> $stderr & } # check that the server actually started # ugly but tries to be as fast as possible... - set retrynum 20 + set retrynum 100 set serverisup 0 - puts -nonewline "=== ($tags) Starting server ${::host}:${::port} " + if {$::verbose} { + puts -nonewline "=== ($tags) Starting server ${::host}:${::port} " + } + after 10 if {$code ne "undefined"} { while {[incr retrynum -1]} { @@ -196,7 +203,10 @@ proc start_server {options {code undefined}} { } else { set serverisup 1 } - puts {} + + if {$::verbose} { + puts "" + } if {!$serverisup} { error_and_quit $config_file [exec cat $stderr] @@ -204,7 +214,7 @@ proc start_server {options {code undefined}} { # find out the pid while {![info exists pid]} { - regexp {^\[(\d+)\]} [exec head -n1 $stdout] _ pid + regexp {\[(\d+)\]} [exec cat $stdout] _ pid after 100 } @@ -246,41 +256,34 @@ proc start_server {options {code undefined}} { reconnect # execute provided block - set curnum $::testnum - if {![catch { uplevel 1 $code } err]} { - # zero exit status is good - unset err + set num_tests $::num_tests + if {[catch { uplevel 1 $code } error]} { + set backtrace $::errorInfo + + # Kill the server without checking for leaks + dict set srv "skipleaks" 1 + kill_server $srv + + # Print warnings from log + puts [format "\nLogged 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)" + } + puts "" + + error $error $backtrace } - if {$curnum == $::testnum} { - # don't check for leaks when no tests were executed + # Don't do the leak check when no tests were run + if {$num_tests == $::num_tests} { dict set srv "skipleaks" 1 } # pop the server object set ::servers [lrange $::servers 0 end-1] - - # 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 {[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 - } - } set ::tags [lrange $::tags 0 end-[llength $tags]] kill_server $srv