xref: /freebsd/contrib/netbsd-tests/bin/sh/t_varval.sh (revision c22165b4f1f5d38b681921797a44b3ba8c13b7e0)
1*640235e2SEnji Cooper# $NetBSD: t_varval.sh,v 1.1 2016/03/16 15:49:19 christos Exp $
2*640235e2SEnji Cooper#
3*640235e2SEnji Cooper# Copyright (c) 2016 The NetBSD Foundation, Inc.
4*640235e2SEnji Cooper# All rights reserved.
5*640235e2SEnji Cooper#
6*640235e2SEnji Cooper# Redistribution and use in source and binary forms, with or without
7*640235e2SEnji Cooper# modification, are permitted provided that the following conditions
8*640235e2SEnji Cooper# are met:
9*640235e2SEnji Cooper# 1. Redistributions of source code must retain the above copyright
10*640235e2SEnji Cooper#    notice, this list of conditions and the following disclaimer.
11*640235e2SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright
12*640235e2SEnji Cooper#    notice, this list of conditions and the following disclaimer in the
13*640235e2SEnji Cooper#    documentation and/or other materials provided with the distribution.
14*640235e2SEnji Cooper#
15*640235e2SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16*640235e2SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17*640235e2SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18*640235e2SEnji Cooper# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19*640235e2SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20*640235e2SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21*640235e2SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*640235e2SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*640235e2SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24*640235e2SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25*640235e2SEnji Cooper# POSSIBILITY OF SUCH DAMAGE.
26*640235e2SEnji Cooper#
27*640235e2SEnji Cooper# the implementation of "sh" to test
28*640235e2SEnji Cooper: ${TEST_SH:="/bin/sh"}
29*640235e2SEnji Cooper
30*640235e2SEnji Cooper# Test all kinds of weird values in various ways to use shell $... expansions
31*640235e2SEnji Cooper
32*640235e2SEnji Cooperoneline()
33*640235e2SEnji Cooper{
34*640235e2SEnji Cooper	q="'"
35*640235e2SEnji Cooper	test $# -eq 4 && q=""
36*640235e2SEnji Cooper
37*640235e2SEnji Cooper	v=$( printf '\\%3.3o' $(( $2 & 0xFF )) )
38*640235e2SEnji Cooper	printf "%s" "$1"
39*640235e2SEnji Cooper	if [ $2 != 39 ]; then
40*640235e2SEnji Cooper		printf "%sprefix${v}suffix%s" "$q" "$q"
41*640235e2SEnji Cooper	elif [ $# -ne 4 ]; then
42*640235e2SEnji Cooper		printf %s prefix\"\'\"suffix
43*640235e2SEnji Cooper	else
44*640235e2SEnji Cooper		printf %s prefix\'suffix
45*640235e2SEnji Cooper	fi
46*640235e2SEnji Cooper	printf "%s\n" "$3"
47*640235e2SEnji Cooper}
48*640235e2SEnji Cooper
49*640235e2SEnji Coopermkdata() {
50*640235e2SEnji Cooper	quote= pfx=
51*640235e2SEnji Cooper	while [ $# -gt 0 ]
52*640235e2SEnji Cooper	do
53*640235e2SEnji Cooper		case "$1" in
54*640235e2SEnji Cooper		--)	shift; break;;
55*640235e2SEnji Cooper		-q)	quote=no; shift; continue;;
56*640235e2SEnji Cooper		esac
57*640235e2SEnji Cooper
58*640235e2SEnji Cooper		pfx="${pfx}${pfx:+ }${1}"
59*640235e2SEnji Cooper		shift
60*640235e2SEnji Cooper	done
61*640235e2SEnji Cooper
62*640235e2SEnji Cooper	sfx=
63*640235e2SEnji Cooper	while [ $# -gt 0 ]
64*640235e2SEnji Cooper	do
65*640235e2SEnji Cooper		sfx="${sfx}${sfx:+ }${1}"
66*640235e2SEnji Cooper		shift
67*640235e2SEnji Cooper	done
68*640235e2SEnji Cooper
69*640235e2SEnji Cooper	i=1		# '\0' is not expected to work, anywhere...
70*640235e2SEnji Cooper	while [ $i -lt 256 ]
71*640235e2SEnji Cooper	do
72*640235e2SEnji Cooper		oneline "${pfx}" "$i" "${sfx}" $quote
73*640235e2SEnji Cooper		i=$(( $i + 1 ))
74*640235e2SEnji Cooper	done
75*640235e2SEnji Cooper}
76*640235e2SEnji Cooper
77*640235e2SEnji Cooperatf_test_case aaa
78*640235e2SEnji Cooperaaa_head() {
79*640235e2SEnji Cooper	atf_set "descr" "Check that this test has a hope of working. " \
80*640235e2SEnji Cooper		"Just give up on these tests if the aaa test fails".
81*640235e2SEnji Cooper}
82*640235e2SEnji Cooperaaa_body() {
83*640235e2SEnji Cooper	oneline "echo " 9 '' |
84*640235e2SEnji Cooper		atf_check -s exit:0 -o inline:'prefix\tsuffix\n' -e empty \
85*640235e2SEnji Cooper			${TEST_SH}
86*640235e2SEnji Cooper
87*640235e2SEnji Cooper	oneline "VAR=" 65 '; echo "${#VAR}:${VAR}"' |
88*640235e2SEnji Cooper		atf_check -s exit:0 -o inline:'13:prefixAsuffix\n' -e empty \
89*640235e2SEnji Cooper			${TEST_SH}
90*640235e2SEnji Cooper
91*640235e2SEnji Cooper	oneline "VAR=" 1 '; echo "${#VAR}:${VAR}"' |
92*640235e2SEnji Cooper		atf_check -s exit:0 -o inline:'13:prefixsuffix\n' -e empty \
93*640235e2SEnji Cooper			${TEST_SH}
94*640235e2SEnji Cooper
95*640235e2SEnji Cooper	oneline "VAR=" 10 '; echo "${#VAR}:${VAR}"' |
96*640235e2SEnji Cooper		atf_check -s exit:0 -o inline:'13:prefix\nsuffix\n' -e empty \
97*640235e2SEnji Cooper			${TEST_SH}
98*640235e2SEnji Cooper
99*640235e2SEnji Cooper	rm -f prefix* 2>/dev/null || :
100*640235e2SEnji Cooper	oneline "echo hello >" 45 "" |
101*640235e2SEnji Cooper		atf_check -s exit:0 -o empty -e empty ${TEST_SH}
102*640235e2SEnji Cooper	test -f "prefix-suffix" ||
103*640235e2SEnji Cooper		atf_fail "failed to create prefix-suffix (45)"
104*640235e2SEnji Cooper	test -s "prefix-suffix" ||
105*640235e2SEnji Cooper		atf_fail "no data in prefix-suffix (45)"
106*640235e2SEnji Cooper	test "$(cat prefix-suffix)" = "hello" ||
107*640235e2SEnji Cooper		atf_fail "incorrect data in prefix-suffix (45)"
108*640235e2SEnji Cooper
109*640235e2SEnji Cooper	return 0
110*640235e2SEnji Cooper}
111*640235e2SEnji Cooper
112*640235e2SEnji Cooperatf_test_case assignment
113*640235e2SEnji Cooperassignment_head() {
114*640235e2SEnji Cooper	atf_set "descr" "Check that all chars can be assigned to vars"
115*640235e2SEnji Cooper}
116*640235e2SEnji Cooperassignment_body() {
117*640235e2SEnji Cooper	atf_require_prog grep
118*640235e2SEnji Cooper	atf_require_prog rm
119*640235e2SEnji Cooper
120*640235e2SEnji Cooper	rm -f results || :
121*640235e2SEnji Cooper	mkdata "VAR=" -- '; echo ${#VAR}' |
122*640235e2SEnji Cooper		atf_check -s exit:0 -o save:results -e empty ${TEST_SH}
123*640235e2SEnji Cooper	test -z $( grep -v "^13$" results ) ||
124*640235e2SEnji Cooper		atf_fail "Incorrect lengths: $(grep -nv '^13$' results)"
125*640235e2SEnji Cooper
126*640235e2SEnji Cooper	return 0
127*640235e2SEnji Cooper}
128*640235e2SEnji Cooper
129*640235e2SEnji Cooperatf_test_case cmdline
130*640235e2SEnji Coopercmdline_head() {
131*640235e2SEnji Cooper	atf_set "descr" "Check vars containing all chars can be used"
132*640235e2SEnji Cooper}
133*640235e2SEnji Coopercmdline_body() {
134*640235e2SEnji Cooper	atf_require_prog rm
135*640235e2SEnji Cooper	atf_require_prog wc
136*640235e2SEnji Cooper
137*640235e2SEnji Cooper	rm -f results || :
138*640235e2SEnji Cooper	mkdata "VAR=" -- '; echo "${VAR}"' |
139*640235e2SEnji Cooper		atf_check -s exit:0 -o save:results -e empty ${TEST_SH}
140*640235e2SEnji Cooper
141*640235e2SEnji Cooper	# 256 because one output line contains a \n ...
142*640235e2SEnji Cooper	test $( wc -l < results ) -eq 256 ||
143*640235e2SEnji Cooper		atf_fail "incorrect line count in results"
144*640235e2SEnji Cooper	test $(wc -c < results) -eq $(( 255 * 14 )) ||
145*640235e2SEnji Cooper		atf_fail "incorrect character count in results"
146*640235e2SEnji Cooper
147*640235e2SEnji Cooper	return 0
148*640235e2SEnji Cooper}
149*640235e2SEnji Cooper
150*640235e2SEnji Cooperatf_test_case redirect
151*640235e2SEnji Cooperredirect_head() {
152*640235e2SEnji Cooper	atf_set "descr" "Check vars containing all chars can be used"
153*640235e2SEnji Cooper}
154*640235e2SEnji Cooperredirect_body() {
155*640235e2SEnji Cooper	atf_require_prog ls
156*640235e2SEnji Cooper	atf_require_prog wc
157*640235e2SEnji Cooper	atf_require_prog rm
158*640235e2SEnji Cooper	atf_require_prog mkdir
159*640235e2SEnji Cooper	atf_require_prog rmdir
160*640235e2SEnji Cooper
161*640235e2SEnji Cooper	nl='
162*640235e2SEnji Cooper'
163*640235e2SEnji Cooper
164*640235e2SEnji Cooper	rm -f prefix* suffix || :
165*640235e2SEnji Cooper
166*640235e2SEnji Cooper	mkdir prefix		# one of the files will be prefix/suffix
167*640235e2SEnji Cooper	mkdata "VAR=" -- '; echo "${VAR}" > "${VAR}"' |
168*640235e2SEnji Cooper		atf_check -s exit:0 -o empty -e empty ${TEST_SH}
169*640235e2SEnji Cooper
170*640235e2SEnji Cooper	test -f "prefix/suffix" ||
171*640235e2SEnji Cooper		atf_fail "Failed to create file in subdirectory"
172*640235e2SEnji Cooper	test $( wc -l < "prefix/suffix" ) -eq 1 ||
173*640235e2SEnji Cooper		atf_fail "Not exactly one line in prefix/suffix file"
174*640235e2SEnji Cooper
175*640235e2SEnji Cooper	atf_check -s exit:0 -o empty -e empty rm "prefix/suffix"
176*640235e2SEnji Cooper	atf_check -s exit:0 -o empty -e empty rmdir "prefix"
177*640235e2SEnji Cooper
178*640235e2SEnji Cooper	test -f "prefix${nl}suffix" ||
179*640235e2SEnji Cooper		atf_fail "Failed to create file with newline in its name"
180*640235e2SEnji Cooper	test $( wc -l < "prefix${nl}suffix" ) -eq 2 ||
181*640235e2SEnji Cooper		atf_fail "NewLine file did not contain embedded newline"
182*640235e2SEnji Cooper
183*640235e2SEnji Cooper	atf_check -s exit:0 -o empty -e empty rm "prefix${nl}suffix"
184*640235e2SEnji Cooper
185*640235e2SEnji Cooper	# Now there should be 253 files left...
186*640235e2SEnji Cooper	test $( ls | wc -l ) -eq 253 ||
187*640235e2SEnji Cooper		atf_fail \
188*640235e2SEnji Cooper   "Did not create all expected files: wanted: 253, found ($( ls | wc -l ))"
189*640235e2SEnji Cooper
190*640235e2SEnji Cooper	# and each of them should have a name that is 13 chars long (+ \n)
191*640235e2SEnji Cooper	test $( ls | wc -c ) -eq $(( 253 * 14 )) ||
192*640235e2SEnji Cooper		atf_fail "File names do not appear to be as expected"
193*640235e2SEnji Cooper
194*640235e2SEnji Cooper	return 0
195*640235e2SEnji Cooper}
196*640235e2SEnji Cooper
197*640235e2SEnji Cooperatf_test_case read
198*640235e2SEnji Cooperread_head() {
199*640235e2SEnji Cooper	atf_set "descr" "Check vars containing all chars can be used"
200*640235e2SEnji Cooper}
201*640235e2SEnji Cooperread_body() {
202*640235e2SEnji Cooper	atf_require_prog ls
203*640235e2SEnji Cooper	atf_require_prog wc
204*640235e2SEnji Cooper	atf_require_prog rm
205*640235e2SEnji Cooper	atf_require_prog mkdir
206*640235e2SEnji Cooper	atf_require_prog rmdir
207*640235e2SEnji Cooper
208*640235e2SEnji Cooper	nl='
209*640235e2SEnji Cooper'
210*640235e2SEnji Cooper
211*640235e2SEnji Cooper	rm -f prefix* suffix || :
212*640235e2SEnji Cooper
213*640235e2SEnji Cooper	mkdir prefix		# one of the files will be prefix/suffix
214*640235e2SEnji Cooper	mkdata -q |
215*640235e2SEnji Cooper		atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c '
216*640235e2SEnji Cooper			while read -r VAR
217*640235e2SEnji Cooper			do
218*640235e2SEnji Cooper				# skip the mess made by embedded newline
219*640235e2SEnji Cooper				case "${VAR}" in
220*640235e2SEnji Cooper				(prefix | suffix)	continue;;
221*640235e2SEnji Cooper				esac
222*640235e2SEnji Cooper				echo "${VAR}" > "${VAR}"
223*640235e2SEnji Cooper			done'
224*640235e2SEnji Cooper
225*640235e2SEnji Cooper	test -f "prefix/suffix" ||
226*640235e2SEnji Cooper		atf_fail "Failed to create file in subdirectory"
227*640235e2SEnji Cooper	test $( wc -l < "prefix/suffix" ) -eq 1 ||
228*640235e2SEnji Cooper		atf_fail "Not exactly one line in prefix/suffix file"
229*640235e2SEnji Cooper
230*640235e2SEnji Cooper	atf_check -s exit:0 -o empty -e empty rm "prefix/suffix"
231*640235e2SEnji Cooper	atf_check -s exit:0 -o empty -e empty rmdir "prefix"
232*640235e2SEnji Cooper
233*640235e2SEnji Cooper	# Now there should be 253 files left...
234*640235e2SEnji Cooper	test $( ls | wc -l ) -eq 253 ||
235*640235e2SEnji Cooper		atf_fail \
236*640235e2SEnji Cooper   "Did not create all expected files: wanted: 253, found ($( ls | wc -l ))"
237*640235e2SEnji Cooper
238*640235e2SEnji Cooper	# and each of them should have a name that is 13 chars long (+ \n)
239*640235e2SEnji Cooper	test $( ls | wc -c ) -eq $(( 253 * 14 )) ||
240*640235e2SEnji Cooper		atf_fail "File names do not appear to be as expected"
241*640235e2SEnji Cooper
242*640235e2SEnji Cooper	return 0
243*640235e2SEnji Cooper}
244*640235e2SEnji Cooper
245*640235e2SEnji Cooperatf_init_test_cases() {
246*640235e2SEnji Cooper	atf_add_test_case aaa
247*640235e2SEnji Cooper	atf_add_test_case assignment
248*640235e2SEnji Cooper	atf_add_test_case cmdline
249*640235e2SEnji Cooper	atf_add_test_case redirect
250*640235e2SEnji Cooper	atf_add_test_case read
251*640235e2SEnji Cooper}
252