#!/usr/bin/env ruby
# This script tests that hydra gives the correct output and error codes when
# child programs exit in various ways. If hydra's output format ever changes
# then this test will need to be updated.
require 'test/unit'
class TestExitStatus < Test::Unit::TestCase
def test_exit0
output = `mpiexec -n 1 sh -c 'exit 0'`
assert $?.exitstatus == 0
assert output =~ /^$/;
end
def test_exit1
errcode = 1
output = `mpiexec -n 1 sh -c 'exit #{errcode}'`
assert($?.exitstatus == errcode)
assert(output =~ /EXIT CODE: #{errcode}$/, "actual error code (#{errcode}) not reported")
# also test the exact output format in this test and assume it is OK for now
# in most other cases
expected = <<-EOS
=====================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= EXIT CODE: #{errcode}
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
=====================================================================================
EOS
assert(expected.strip == output.strip)
end
def test_exit254
errcode = 254
output = `mpiexec -n 1 sh -c 'exit #{errcode}'`
assert($?.exitstatus == errcode)
assert(output =~ /EXIT CODE: #{errcode}$/, "actual error code (#{errcode}) not reported")
end
def test_exit255
errcode = 255
output = `mpiexec -n 1 sh -c 'exit #{errcode}'`
assert($?.exitstatus == errcode)
assert(output =~ /EXIT CODE: #{errcode}$/, "actual error code (#{errcode}) not reported")
end
def test_segfault
# fake a segfault by sending SIGSEGV to ourself
output = `mpiexec -n 1 perl -e 'kill 11, $$'`
# arguably this should really be 139 (128+11) to match up with regular shell
# behavior, although I don't know what the clearest way is to express this
# to the user
errcode = 11
assert($?.exitstatus == errcode)
assert(output =~ /EXIT CODE: #{errcode}$/, "actual error code (#{errcode}) not reported")
# the "Segmentation fault: 11" string is probably platform-specific, we
# should compare accordingly
expected = <<-EOS
=====================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= EXIT CODE: #{errcode}
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
=====================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault: 11 (signal 11)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions
EOS
# strip whitespace to be a little less sensitive
assert(expected.strip == output.strip)
end
# TODO:
# - libc abort()
# - MPI_Abort()
# - something with more than one process
end