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