summaryrefslogtreecommitdiffstats
path: root/contrib/netbsd-tests/bin/sh/t_exit.sh
blob: 17ed2300c39f1edd6f77b1b6714b04fb4906225b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# $NetBSD: t_exit.sh,v 1.6 2016/05/07 23:51:30 kre Exp $
#
# Copyright (c) 2007 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# 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 background
background_head() {
	atf_set "descr" "Tests that sh(1) sets '$?' properly when running " \
			"a command in the background (PR bin/46327)"
}
background_body() {
	atf_check -o match:0 -e empty ${TEST_SH} -c 'true; true & echo $?'
	# atf_expect_fail "PR bin/46327" (now fixed?)
	atf_check -o match:0 -e empty ${TEST_SH} -c 'false; true & echo $?'
}

atf_test_case function
function_head() {
	atf_set "descr" "Tests that \$? is correctly updated inside " \
			"a function"
}
function_body() {
	atf_check -s exit:0 -o match:STATUS=1-0 -e empty \
		${TEST_SH} -c '
			crud() {
				test yes = no

				cat <<-EOF
				STATUS=$?
				EOF
			}
			foo=$(crud)
			echo "${foo}-$?"
		'
}

atf_test_case readout
readout_head() {
	atf_set "descr" "Tests that \$? is correctly updated in a " \
			"compound expression"
}
readout_body() {
	atf_check -s exit:0 -o match:0 -e empty \
		${TEST_SH} -c 'true && ! true | false; echo $?'
}

atf_test_case trap_subshell
trap_subshell_head() {
	atf_set "descr" "Tests that the trap statement in a subshell " \
			"works when the subshell exits"
}
trap_subshell_body() {
	atf_check -s exit:0 -o inline:'exiting\n' -e empty \
	    ${TEST_SH} -c '( trap "echo exiting" EXIT; /usr/bin/true )'
}

atf_test_case trap_zero__implicit_exit
trap_zero__implicit_exit_head() {
	atf_set "descr" "Tests that the trap statement in a subshell in a " \
		"script works when the subshell simply runs out of commands"
}
trap_zero__implicit_exit_body() {
	# PR bin/6764: sh works but ksh does not
	echo '( trap "echo exiting" 0 )' >helper.sh
	atf_check -s exit:0 -o match:exiting -e empty ${TEST_SH} helper.sh
	# test ksh by setting TEST_SH to /bin/ksh and run the entire set...
	# atf_check -s exit:0 -o match:exiting -e empty /bin/ksh helper.sh
}

atf_test_case trap_zero__explicit_exit
trap_zero__explicit_exit_head() {
	atf_set "descr" "Tests that the trap statement in a subshell in a " \
		"script works when the subshell executes an explicit exit"
}
trap_zero__explicit_exit_body() {
	echo '( trap "echo exiting" 0; exit; echo NO_NO_NO )' >helper.sh
	atf_check -s exit:0 -o match:exiting -o not-match:NO_NO -e empty \
		${TEST_SH} helper.sh
	# test ksh by setting TEST_SH to /bin/ksh and run the entire set...
	# atf_check -s exit:0 -o match:exiting -e empty /bin/ksh helper.sh
}

atf_test_case simple_exit
simple_exit_head() {
	atf_set "descr" "Tests that various values for exit status work"
}
# Note: ATF will not allow tests of exit values > 255, even if they would work
simple_exit_body() {
	for N in 0 1 2 3 4 5 6 42 99 101 125 126 127 128 129 200 254 255
	do
		atf_check -s exit:$N -o empty -e empty \
			${TEST_SH} -c "exit $N; echo FOO; echo BAR >&2"
	done
}

atf_test_case subshell_exit
subshell_exit_head() {
	atf_set "descr" "Tests that subshell exit status works and \$? gets it"
}
# Note: ATF will not allow tests of exit values > 255, even if they would work
subshell_exit_body() {
	for N in 0 1 2 3 4 5 6 42 99 101 125 126 127 128 129 200 254 255
	do
		atf_check -s exit:0 -o empty -e empty \
			${TEST_SH} -c "(exit $N); test \$? -eq $N"
	done
}

atf_test_case subshell_background
subshell_background_head() {
	atf_set "descr" "Tests that sh(1) sets '$?' properly when running " \
			"a subshell in the background"
}
subshell_background_body() {
	atf_check -o match:0 -e empty \
		${TEST_SH} -c 'true; (false || true) & echo $?'
	# atf_expect_fail "PR bin/46327" (now fixed?)
	atf_check -o match:0 -e empty \
		${TEST_SH} -c 'false; (false || true) & echo $?'
}

atf_init_test_cases() {
	atf_add_test_case background
	atf_add_test_case function
	atf_add_test_case readout
	atf_add_test_case trap_subshell
	atf_add_test_case trap_zero__implicit_exit
	atf_add_test_case trap_zero__explicit_exit
	atf_add_test_case simple_exit
	atf_add_test_case subshell_exit
	atf_add_test_case subshell_background
}
OpenPOWER on IntegriCloud