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