NetBSD/tests/bin/sh/t_varval.sh

252 lines
6.7 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# $NetBSD: t_varval.sh,v 1.1 2016/03/16 15:49:19 christos Exp $
#
# Copyright (c) 2016 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"}
# Test all kinds of weird values in various ways to use shell $... expansions
oneline()
{
q="'"
test $# -eq 4 && q=""
v=$( printf '\\%3.3o' $(( $2 & 0xFF )) )
printf "%s" "$1"
if [ $2 != 39 ]; then
printf "%sprefix${v}suffix%s" "$q" "$q"
elif [ $# -ne 4 ]; then
printf %s prefix\"\'\"suffix
else
printf %s prefix\'suffix
fi
printf "%s\n" "$3"
}
mkdata() {
quote= pfx=
while [ $# -gt 0 ]
do
case "$1" in
--) shift; break;;
-q) quote=no; shift; continue;;
esac
pfx="${pfx}${pfx:+ }${1}"
shift
done
sfx=
while [ $# -gt 0 ]
do
sfx="${sfx}${sfx:+ }${1}"
shift
done
i=1 # '\0' is not expected to work, anywhere...
while [ $i -lt 256 ]
do
oneline "${pfx}" "$i" "${sfx}" $quote
i=$(( $i + 1 ))
done
}
atf_test_case aaa
aaa_head() {
atf_set "descr" "Check that this test has a hope of working. " \
"Just give up on these tests if the aaa test fails".
}
aaa_body() {
oneline "echo " 9 '' |
atf_check -s exit:0 -o inline:'prefix\tsuffix\n' -e empty \
${TEST_SH}
oneline "VAR=" 65 '; echo "${#VAR}:${VAR}"' |
atf_check -s exit:0 -o inline:'13:prefixAsuffix\n' -e empty \
${TEST_SH}
oneline "VAR=" 1 '; echo "${#VAR}:${VAR}"' |
atf_check -s exit:0 -o inline:'13:prefixsuffix\n' -e empty \
${TEST_SH}
oneline "VAR=" 10 '; echo "${#VAR}:${VAR}"' |
atf_check -s exit:0 -o inline:'13:prefix\nsuffix\n' -e empty \
${TEST_SH}
rm -f prefix* 2>/dev/null || :
oneline "echo hello >" 45 "" |
atf_check -s exit:0 -o empty -e empty ${TEST_SH}
test -f "prefix-suffix" ||
atf_fail "failed to create prefix-suffix (45)"
test -s "prefix-suffix" ||
atf_fail "no data in prefix-suffix (45)"
test "$(cat prefix-suffix)" = "hello" ||
atf_fail "incorrect data in prefix-suffix (45)"
return 0
}
atf_test_case assignment
assignment_head() {
atf_set "descr" "Check that all chars can be assigned to vars"
}
assignment_body() {
atf_require_prog grep
atf_require_prog rm
rm -f results || :
mkdata "VAR=" -- '; echo ${#VAR}' |
atf_check -s exit:0 -o save:results -e empty ${TEST_SH}
test -z $( grep -v "^13$" results ) ||
atf_fail "Incorrect lengths: $(grep -nv '^13$' results)"
return 0
}
atf_test_case cmdline
cmdline_head() {
atf_set "descr" "Check vars containing all chars can be used"
}
cmdline_body() {
atf_require_prog rm
atf_require_prog wc
rm -f results || :
mkdata "VAR=" -- '; echo "${VAR}"' |
atf_check -s exit:0 -o save:results -e empty ${TEST_SH}
# 256 because one output line contains a \n ...
test $( wc -l < results ) -eq 256 ||
atf_fail "incorrect line count in results"
test $(wc -c < results) -eq $(( 255 * 14 )) ||
atf_fail "incorrect character count in results"
return 0
}
atf_test_case redirect
redirect_head() {
atf_set "descr" "Check vars containing all chars can be used"
}
redirect_body() {
atf_require_prog ls
atf_require_prog wc
atf_require_prog rm
atf_require_prog mkdir
atf_require_prog rmdir
nl='
'
rm -f prefix* suffix || :
mkdir prefix # one of the files will be prefix/suffix
mkdata "VAR=" -- '; echo "${VAR}" > "${VAR}"' |
atf_check -s exit:0 -o empty -e empty ${TEST_SH}
test -f "prefix/suffix" ||
atf_fail "Failed to create file in subdirectory"
test $( wc -l < "prefix/suffix" ) -eq 1 ||
atf_fail "Not exactly one line in prefix/suffix file"
atf_check -s exit:0 -o empty -e empty rm "prefix/suffix"
atf_check -s exit:0 -o empty -e empty rmdir "prefix"
test -f "prefix${nl}suffix" ||
atf_fail "Failed to create file with newline in its name"
test $( wc -l < "prefix${nl}suffix" ) -eq 2 ||
atf_fail "NewLine file did not contain embedded newline"
atf_check -s exit:0 -o empty -e empty rm "prefix${nl}suffix"
# Now there should be 253 files left...
test $( ls | wc -l ) -eq 253 ||
atf_fail \
"Did not create all expected files: wanted: 253, found ($( ls | wc -l ))"
# and each of them should have a name that is 13 chars long (+ \n)
test $( ls | wc -c ) -eq $(( 253 * 14 )) ||
atf_fail "File names do not appear to be as expected"
return 0
}
atf_test_case read
read_head() {
atf_set "descr" "Check vars containing all chars can be used"
}
read_body() {
atf_require_prog ls
atf_require_prog wc
atf_require_prog rm
atf_require_prog mkdir
atf_require_prog rmdir
nl='
'
rm -f prefix* suffix || :
mkdir prefix # one of the files will be prefix/suffix
mkdata -q |
atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c '
while read -r VAR
do
# skip the mess made by embedded newline
case "${VAR}" in
(prefix | suffix) continue;;
esac
echo "${VAR}" > "${VAR}"
done'
test -f "prefix/suffix" ||
atf_fail "Failed to create file in subdirectory"
test $( wc -l < "prefix/suffix" ) -eq 1 ||
atf_fail "Not exactly one line in prefix/suffix file"
atf_check -s exit:0 -o empty -e empty rm "prefix/suffix"
atf_check -s exit:0 -o empty -e empty rmdir "prefix"
# Now there should be 253 files left...
test $( ls | wc -l ) -eq 253 ||
atf_fail \
"Did not create all expected files: wanted: 253, found ($( ls | wc -l ))"
# and each of them should have a name that is 13 chars long (+ \n)
test $( ls | wc -c ) -eq $(( 253 * 14 )) ||
atf_fail "File names do not appear to be as expected"
return 0
}
atf_init_test_cases() {
atf_add_test_case aaa
atf_add_test_case assignment
atf_add_test_case cmdline
atf_add_test_case redirect
atf_add_test_case read
}