diff options
Diffstat (limited to 'contrib/netbsd-tests/bin/sh/t_wait.sh')
-rwxr-xr-x | contrib/netbsd-tests/bin/sh/t_wait.sh | 152 |
1 files changed, 144 insertions, 8 deletions
diff --git a/contrib/netbsd-tests/bin/sh/t_wait.sh b/contrib/netbsd-tests/bin/sh/t_wait.sh index 99b47df..eaad7e0 100755 --- a/contrib/netbsd-tests/bin/sh/t_wait.sh +++ b/contrib/netbsd-tests/bin/sh/t_wait.sh @@ -1,4 +1,4 @@ -# $NetBSD: t_wait.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $ +# $NetBSD: t_wait.sh,v 1.8 2016/03/31 16:22:54 christos Exp $ # # Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc. # All rights reserved. @@ -24,36 +24,172 @@ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # +# the implementation of "sh" to test +: ${TEST_SH:="/bin/sh"} + +atf_test_case basic_wait +basic_wait_head() { + atf_set "descr" "Tests simple uses of wait" +} +basic_wait_body() { + atf_require_prog sleep + + atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c \ + '(echo nothing >/dev/null) & wait' + + atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c \ + '(exit 3) & wait $!; S=$?; test $S -eq 3 || { + echo "status: $S"; exit 1; }' + + atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c \ + 'sleep 3 & sleep 2 & sleep 1 & wait' + + atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c \ + 'sleep 3 & (exit 2) & sleep 1 & wait' +} atf_test_case individual individual_head() { - atf_set "descr" "Tests that waiting for individual jobs works" + atf_set "descr" "Tests that waiting for individual processes works" } individual_body() { + atf_require_prog sleep + + cat >individualhelper.sh <<\EOF +sleep 3 & P1=$! +sleep 1 & P2=$! + +wait ${P1} +S=$? +if [ $S -ne 0 ]; then + echo "Waiting for first process failed: $S" + exit 1 +fi + +wait ${P2} +S=$? +if [ $? -ne 0 ]; then + echo "Waiting for second process failed" + exit 1 +fi + +exit 0 +EOF + output=$(${TEST_SH} individualhelper.sh 2>&1) + [ $? -eq 0 ] || atf_fail "${output}" +} + +atf_test_case jobs +jobs_head() { + atf_set "descr" "Tests that waiting for individual jobs works" +} +jobs_body() { # atf-sh confuses wait for some reason; work it around by creating # a helper script that executes /bin/sh directly. - cat >helper.sh <<EOF + + if ! ${TEST_SH} -c 'sleep 1 & wait %1' 2>/dev/null + then + atf_skip "No job control support in this shell" + fi + + cat >individualhelper.sh <<\EOF sleep 3 & sleep 1 & wait %1 -if [ \$? -ne 0 ]; then - echo "Waiting of first job failed" +if [ $? -ne 0 ]; then + echo "Waiting for first job failed" + exit 1 +fi + +wait %2 +if [ $? -ne 0 ]; then + echo "Waiting for second job failed" + exit 1 +fi + +exit 0 +EOF + output=$(${TEST_SH} individualhelper.sh 2>&1) + [ $? -eq 0 ] || atf_fail "${output}" + + cat >individualhelper.sh <<\EOF +{ sleep 3; exit 3; } & +{ sleep 1; exit 7; } & + +wait %1 +S=$? +if [ $S -ne 3 ]; then + echo "Waiting for first job failed - status: $S != 3 (expected)" exit 1 fi wait %2 -if [ \$? -ne 0 ]; then - echo "Waiting of second job failed" +S=$? +if [ $S -ne 7 ]; then + echo "Waiting for second job failed - status: $S != 7 (expected)" exit 1 fi exit 0 EOF - output=$(/bin/sh helper.sh) + + output=$(${TEST_SH} individualhelper.sh 2>&1) [ $? -eq 0 ] || atf_fail "${output}" } +atf_test_case kill +kill_head() { + atf_set "descr" "Tests that killing the shell while in wait calls trap" +} +kill_body() { + atf_require_prog sleep + atf_require_prog kill + + s=killhelper.sh + z=killhelper.$$ + pid= + + # waiting for a specific process that is not a child + # should return exit status of 127 according to the spec + # This test is here before the next, to avoid that one + # entering an infinite loop should the shell have a bug here. + + atf_check -s exit:127 -o empty -e ignore ${TEST_SH} -c 'wait 1' + + cat > "${s}" <<'EOF' + +trap "echo SIGHUP" 1 +(sleep 5; exit 3) & +sl=$! +wait +S=$? +echo $S +LS=9999 +while [ $S -ne 0 ] && [ $S != 127 ]; do + wait $sl; S=$?; echo $S + test $S = $LS && { echo "wait repeats..."; exit 2; } + LS=$S + done +EOF + + ${TEST_SH} $s > $z & + pid=$! + sleep 1 + + kill -HUP "${pid}" + wait + + output="$(cat $z | tr '\n' ' ')" + + if [ "$output" != "SIGHUP 129 3 127 " ]; then + atf_fail "${output} != 'SIGHUP 129 3 127 '" + fi +} + atf_init_test_cases() { + atf_add_test_case basic_wait atf_add_test_case individual + atf_add_test_case jobs + atf_add_test_case kill } |