# $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 proc oneline { setvar q = ""'"" test $Argc -eq 4 && setvar q = """" setvar v = $( printf '\\%3.3o' $(( $2 & 0xFF )) ) printf "%s" $1 if test $2 != 39 { printf "%sprefix${v}suffix%s" $q $q } elif test $Argc -ne 4 { printf %s prefix'"'''''"'suffix } else { printf %s prefix'''suffix } printf "%s\n" $3 } proc mkdata { setvar quote = '', pfx = '' while [ $# -gt 0 ] { case (1) { -- { shift; break} -q { setvar quote = 'no'; shift; continue} } setvar pfx = ""${pfx}${pfx:+ }${1}"" shift } setvar sfx = '' while [ $# -gt 0 ] { setvar sfx = ""${sfx}${sfx:+ }${1}"" shift } setvar i = '1' # '\0' is not expected to work, anywhere... while [ $i -lt 256 ] { oneline ${pfx} $i ${sfx} $quote setvar i = $(( $i + 1 )) } } atf_test_case aaa proc 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". } proc 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 proc assignment_head { atf_set "descr" "Check that all chars can be assigned to vars" } proc 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 proc cmdline_head { atf_set "descr" "Check vars containing all chars can be used" } proc 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 proc redirect_head { atf_set "descr" "Check vars containing all chars can be used" } proc redirect_body { atf_require_prog ls atf_require_prog wc atf_require_prog rm atf_require_prog mkdir atf_require_prog rmdir setvar 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 proc read_head { atf_set "descr" "Check vars containing all chars can be used" } proc read_body { atf_require_prog ls atf_require_prog wc atf_require_prog rm atf_require_prog mkdir atf_require_prog rmdir setvar 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 } proc 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 }