Sun Mar 27 14:50:40 2016 UTC ()
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@)


(christos)
diff -r1.6 -r1.7 src/tests/bin/sh/t_wait.sh

cvs diff -r1.6 -r1.7 src/tests/bin/sh/t_wait.sh (expand / switch to unified diff)

--- src/tests/bin/sh/t_wait.sh 2016/03/08 14:24:06 1.6
+++ src/tests/bin/sh/t_wait.sh 2016/03/27 14:50:40 1.7
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1# $NetBSD: t_wait.sh,v 1.6 2016/03/08 14:24:06 christos Exp $ 1# $NetBSD: t_wait.sh,v 1.7 2016/03/27 14:50:40 christos Exp $
2# 2#
3# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc. 3# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc.
4# All rights reserved. 4# All rights reserved.
5# 5#
6# Redistribution and use in source and binary forms, with or without 6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions 7# modification, are permitted provided that the following conditions
8# are met: 8# are met:
9# 1. Redistributions of source code must retain the above copyright 9# 1. Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer. 10# notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright 11# 2. Redistributions in binary form must reproduce the above copyright
12# notice, this list of conditions and the following disclaimer in the 12# notice, this list of conditions and the following disclaimer in the
13# documentation and/or other materials provided with the distribution. 13# documentation and/or other materials provided with the distribution.
14# 14#
@@ -17,84 +17,179 @@ @@ -17,84 +17,179 @@
17# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 18# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 19# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 20# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 22# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 23# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 24# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25# POSSIBILITY OF SUCH DAMAGE. 25# POSSIBILITY OF SUCH DAMAGE.
26# 26#
27# the implementation of "sh" to test 27# the implementation of "sh" to test
28: ${TEST_SH:="/bin/sh"} 28: ${TEST_SH:="/bin/sh"}
29 29
 30atf_test_case basic_wait
 31basic_wait_head() {
 32 atf_set "descr" "Tests simple uses of wait"
 33}
 34basic_wait_body() {
 35 atf_require_prog sleep
 36
 37 atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c \
 38 '(echo nothing >/dev/null) & wait'
 39
 40 atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c \
 41 '(exit 3) & wait $!; S=$?; test $S -eq 3 || {
 42 echo "status: $S"; exit 1; }'
 43
 44 atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c \
 45 'sleep 3 & sleep 2 & sleep 1 & wait'
 46
 47 atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c \
 48 'sleep 3 & (exit 2) & sleep 1 & wait'
 49}
 50
30atf_test_case individual 51atf_test_case individual
31individual_head() { 52individual_head() {
32 atf_set "descr" "Tests that waiting for individual jobs works" 53 atf_set "descr" "Tests that waiting for individual processes works"
33} 54}
34individual_body() { 55individual_body() {
 56 atf_require_prog sleep
 57
 58 cat >individualhelper.sh <<\EOF
 59sleep 3 & P1=$!
 60sleep 1 & P2=$!
 61
 62wait ${P1}
 63S=$?
 64if [ $S -ne 0 ]; then
 65 echo "Waiting for first process failed: $S"
 66 exit 1
 67fi
 68
 69wait ${P2}
 70S=$?
 71if [ $? -ne 0 ]; then
 72 echo "Waiting for second process failed"
 73 exit 1
 74fi
 75
 76exit 0
 77EOF
 78 output=$(${TEST_SH} individualhelper.sh 2>&1)
 79 [ $? -eq 0 ] || atf_fail "${output}"
 80}
 81
 82atf_test_case jobs
 83jobs_head() {
 84 atf_set "descr" "Tests that waiting for individual jobs works"
 85}
 86jobs_body() {
35 # atf-sh confuses wait for some reason; work it around by creating 87 # atf-sh confuses wait for some reason; work it around by creating
36 # a helper script that executes /bin/sh directly. 88 # a helper script that executes /bin/sh directly.
 89
 90 if ! ${TEST_SH} -c 'sleep 1 & wait %1' 2>/dev/null
 91 then
 92 atf_skip "No job control support in this shell"
 93 fi
 94
37 cat >individualhelper.sh <<\EOF 95 cat >individualhelper.sh <<\EOF
38sleep 3 & 96sleep 3 &
39sleep 1 & 97sleep 1 &
40 98
41wait %1 99wait %1
42if [ $? -ne 0 ]; then 100if [ $? -ne 0 ]; then
43 echo "Waiting of first job failed" 101 echo "Waiting for first job failed"
44 exit 1 102 exit 1
45fi 103fi
46 104
47wait %2 105wait %2
48if [ $? -ne 0 ]; then 106if [ $? -ne 0 ]; then
49 echo "Waiting of second job failed" 107 echo "Waiting for second job failed"
50 exit 1 108 exit 1
51fi 109fi
52 110
53exit 0 111exit 0
54EOF 112EOF
55 output=$("${TEST_SH}" individualhelper.sh) 113 output=$(${TEST_SH} individualhelper.sh 2>&1)
 114 [ $? -eq 0 ] || atf_fail "${output}"
 115
 116 cat >individualhelper.sh <<\EOF
 117{ sleep 3; exit 3; } &
 118{ sleep 1; exit 7; } &
 119
 120wait %1
 121S=$?
 122if [ $S -ne 3 ]; then
 123 echo "Waiting for first job failed - status: $S != 3 (expected)"
 124 exit 1
 125fi
 126
 127wait %2
 128S=$?
 129if [ $S -ne 7 ]; then
 130 echo "Waiting for second job failed - status: $S != 7 (expected)"
 131 exit 1
 132fi
 133
 134exit 0
 135EOF
 136
 137 output=$(${TEST_SH} individualhelper.sh 2>&1)
56 [ $? -eq 0 ] || atf_fail "${output}" 138 [ $? -eq 0 ] || atf_fail "${output}"
57 rm -f individualhelper.sh 
58} 139}
59 140
60atf_test_case kill 141atf_test_case kill
61kill_head() { 142kill_head() {
62 atf_set "descr" "Tests that killing the shell while in wait calls trap" 143 atf_set "descr" "Tests that killing the shell while in wait calls trap"
63} 144}
64kill_body() { 145kill_body() {
65 # atf-sh confuses wait for some reason; work it around by creating 146 atf_require_prog sleep
66 # a helper script that executes /bin/sh directly. 147 atf_require_prog kill
67 local s=$PWD/killhelper.sh 148
68 local z=/tmp/killhelper.$$  149 s=killhelper.sh
69 local pid= 150 z=/tmp/killhelper.$$
 151 pid=
 152
 153 # waiting for a specific process that is not a child
 154 # should return exit status of 127 according to the spec
 155 # This test is here before the next, to avoid that one
 156 # entering an infinite loop should the shell have a bug here.
 157
 158 atf_check -s exit:127 -o empty -e ignore ${TEST_SH} -c 'wait 1'
 159
 160 cat > "${s}" <<'EOF'
70 161
71 sed 's!${SH}!'"${TEST_SH}!" >$s <<\EOF 
72#! ${SH} 
73trap "echo SIGHUP" 1 162trap "echo SIGHUP" 1
74(sleep 5; exit 3) & 163(sleep 5; exit 3) &
75sl=$! 164sl=$!
76wait 165wait
77S=$? 166S=$?
78echo $S 167echo $S
79while [ $S -ne 0 ] && [ $S != 127 ]; do wait $sl; S=$?; echo $S; done 168LS=9999
 169while [ $S -ne 0 ] && [ $S != 127 ]; do
 170 wait $sl; S=$?; echo $S
 171 test $S = $LS && { echo "wait repeats..."; exit 2; }
 172 LS=$S
 173 done
80EOF 174EOF
81 chmod +x $s 
82 175
83 $s > $z & 176 ${TEST_SH} $s > $z &
84 pid=$! 177 pid=$!
85 sleep 1 178 sleep 1
86 179
87 kill -HUP $pid 180 kill -HUP "${pid}"
88 wait 181 wait
89 182
90 output="$(cat $z | tr '\n' ' ')" 183 output="$(cat $z | tr '\n' ' ')"
91 rm -f $s $z 184
92 if [ "$output" != "SIGHUP 129 3 127 " ]; then 185 if [ "$output" != "SIGHUP 129 3 127 " ]; then
93 atf_fail "${output} != 'SIGHUP 129 3 127 '" 186 atf_fail "${output} != 'SIGHUP 129 3 127 '"
94 fi 187 fi
95} 188}
96 189
97atf_init_test_cases() { 190atf_init_test_cases() {
 191 atf_add_test_case basic_wait
98 atf_add_test_case individual 192 atf_add_test_case individual
 193 atf_add_test_case jobs
99 atf_add_test_case kill 194 atf_add_test_case kill
100} 195}