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
 }

Reply via email to