Commit 436f18b6 authored by Pieter Noordhuis's avatar Pieter Noordhuis
Browse files

catch exceptions in the server proc, to be able to kill the entire chain of running servers

parent d55d5c5d
...@@ -27,6 +27,7 @@ proc kill_server config { ...@@ -27,6 +27,7 @@ proc kill_server config {
set pid [dict get $config pid] set pid [dict get $config pid]
# check for leaks # check for leaks
if {![dict exists $config "skipleaks"]} {
catch { catch {
if {[string match {*Darwin*} [exec uname -a]]} { if {[string match {*Darwin*} [exec uname -a]]} {
test "Check for memory leaks (pid $pid)" { test "Check for memory leaks (pid $pid)" {
...@@ -34,6 +35,7 @@ proc kill_server config { ...@@ -34,6 +35,7 @@ proc kill_server config {
} {*0 leaks*} } {*0 leaks*}
} }
} }
}
# kill server and wait for the process to be totally exited # kill server and wait for the process to be totally exited
while {[is_alive $config]} { while {[is_alive $config]} {
...@@ -182,13 +184,27 @@ proc start_server {filename overrides {code undefined}} { ...@@ -182,13 +184,27 @@ proc start_server {filename overrides {code undefined}} {
# pop the server object # pop the server object
set ::servers [lrange $::servers 0 end-1] 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 {$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 kill_server $srv
error "exception"
if {[string length $err] > 0} { } elseif {[string length $err] > 0} {
puts "Error executing the suite, aborting..." puts "Error executing the suite, aborting..."
puts $err puts $err
exit 1 exit 1
} }
kill_server $srv
} else { } else {
set _ $srv set _ $srv
} }
......
...@@ -8,15 +8,9 @@ proc test {name code okpattern} { ...@@ -8,15 +8,9 @@ proc test {name code okpattern} {
puts -nonewline [format "#%03d %-68s " $::testnum $name] puts -nonewline [format "#%03d %-68s " $::testnum $name]
flush stdout flush stdout
if {[catch {set retval [uplevel 1 $code]} error]} { if {[catch {set retval [uplevel 1 $code]} error]} {
puts "ERROR\n\nLogged warnings:" puts "EXCEPTION"
foreach file [glob tests/tmp/server.[pid].*/stdout] { puts "\nCaught error: $error"
set warnings [warnings_from_file $file] error "exception"
if {[string length $warnings] > 0} {
puts $warnings
}
}
puts "Script died with $error"
exit 1
} }
if {$okpattern eq $retval || [string match $okpattern $retval]} { if {$okpattern eq $retval || [string match $okpattern $retval]} {
puts "PASSED" puts "PASSED"
......
...@@ -92,4 +92,12 @@ proc main {} { ...@@ -92,4 +92,12 @@ proc main {} {
cleanup cleanup
} }
main if {[catch { main } err]} {
if {[string length $err] > 0} {
# only display error when not generated by the test suite
if {$err ne "exception"} {
puts $err
}
exit 1
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment