Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/tests/bin/sh More tests, add protection against shells that ...



details:   https://anonhg.NetBSD.org/src/rev/941738e66927
branches:  trunk
changeset: 344417:941738e66927
user:      christos <christos%NetBSD.org@localhost>
date:      Sun Mar 27 14:50:40 2016 +0000

description:
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@)

diffstat:

 tests/bin/sh/t_wait.sh |  131 ++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 113 insertions(+), 18 deletions(-)

diffs (196 lines):

diff -r e8bbbd48a1b8 -r 941738e66927 tests/bin/sh/t_wait.sh
--- a/tests/bin/sh/t_wait.sh    Sun Mar 27 14:50:01 2016 +0000
+++ b/tests/bin/sh/t_wait.sh    Sun Mar 27 14:50:40 2016 +0000
@@ -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 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"
 }
-individual_body() {
+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}"
-       rm -f individualhelper.sh
+
+       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}"
 }
 
 atf_test_case kill
@@ -62,39 +143,53 @@
        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=
 
-       sed 's!${SH}!'"${TEST_SH}!"  >$s <<\EOF
-#! ${SH}
+       # 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
-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
 }



Home | Main Index | Thread Index | Old Index