Module Name: src Committed By: christos Date: Sun Mar 27 14:50:40 UTC 2016
Modified Files: src/tests/bin/sh: t_wait.sh Log Message: More tests, add protection against shells that allow wait N to wait for the same process over and over again (forever) (???) This test now takes slightly over 20 seconds to complete (elapsed time) caused by all the waiting on sleep commands being run in the background. (from kre@) To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/tests/bin/sh/t_wait.sh Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/bin/sh/t_wait.sh diff -u src/tests/bin/sh/t_wait.sh:1.6 src/tests/bin/sh/t_wait.sh:1.7 --- src/tests/bin/sh/t_wait.sh:1.6 Tue Mar 8 09:24:06 2016 +++ src/tests/bin/sh/t_wait.sh Sun Mar 27 10:50:40 2016 @@ -1,4 +1,4 @@ -# $NetBSD: t_wait.sh,v 1.6 2016/03/08 14:24:06 christos Exp $ +# $NetBSD: t_wait.sh,v 1.7 2016/03/27 14:50:40 christos Exp $ # # Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc. # All rights reserved. @@ -27,34 +27,115 @@ # 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. + + 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" + echo "Waiting for first job failed" exit 1 fi wait %2 if [ $? -ne 0 ]; then - echo "Waiting of second job failed" + echo "Waiting for second job failed" exit 1 fi exit 0 EOF - output=$("${TEST_SH}" individualhelper.sh) + 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 +S=$? +if [ $S -ne 7 ]; then + echo "Waiting for second job failed - status: $S != 7 (expected)" + exit 1 +fi + +exit 0 +EOF + + output=$(${TEST_SH} individualhelper.sh 2>&1) [ $? -eq 0 ] || atf_fail "${output}" - rm -f individualhelper.sh } atf_test_case kill @@ -62,39 +143,53 @@ kill_head() { atf_set "descr" "Tests that killing the shell while in wait calls trap" } kill_body() { - # atf-sh confuses wait for some reason; work it around by creating - # a helper script that executes /bin/sh directly. - local s=$PWD/killhelper.sh - local z=/tmp/killhelper.$$ - local pid= + atf_require_prog sleep + atf_require_prog kill + + s=killhelper.sh + z=/tmp/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' - sed 's!${SH}!'"${TEST_SH}!" >$s <<\EOF -#! ${SH} trap "echo SIGHUP" 1 (sleep 5; exit 3) & sl=$! wait S=$? echo $S -while [ $S -ne 0 ] && [ $S != 127 ]; do wait $sl; S=$?; echo $S; done +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 - chmod +x $s - $s > $z & + ${TEST_SH} $s > $z & pid=$! sleep 1 - kill -HUP $pid + kill -HUP "${pid}" wait output="$(cat $z | tr '\n' ' ')" - rm -f $s $z + 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 }