1*cdebaff8SEnji Cooper# $NetBSD: t_config.sh,v 1.8 2016/08/27 12:08:14 christos Exp $ 257718be8SEnji Cooper# 357718be8SEnji Cooper# Copyright (c) 2008, 2010 The NetBSD Foundation, Inc. 457718be8SEnji Cooper# All rights reserved. 557718be8SEnji Cooper# 657718be8SEnji Cooper# Redistribution and use in source and binary forms, with or without 757718be8SEnji Cooper# modification, are permitted provided that the following conditions 857718be8SEnji Cooper# are met: 957718be8SEnji Cooper# 1. Redistributions of source code must retain the above copyright 1057718be8SEnji Cooper# notice, this list of conditions and the following disclaimer. 1157718be8SEnji Cooper# 2. Redistributions in binary form must reproduce the above copyright 1257718be8SEnji Cooper# notice, this list of conditions and the following disclaimer in the 1357718be8SEnji Cooper# documentation and/or other materials provided with the distribution. 1457718be8SEnji Cooper# 1557718be8SEnji Cooper# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 1657718be8SEnji Cooper# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 1757718be8SEnji Cooper# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1857718be8SEnji Cooper# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 1957718be8SEnji Cooper# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2057718be8SEnji Cooper# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2157718be8SEnji Cooper# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2257718be8SEnji Cooper# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2357718be8SEnji Cooper# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2457718be8SEnji Cooper# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2557718be8SEnji Cooper# POSSIBILITY OF SUCH DAMAGE. 2657718be8SEnji Cooper# 2757718be8SEnji Cooper 28*cdebaff8SEnji Coopersrcdir=.. 29*cdebaff8SEnji Coopermerge_backslash() 30*cdebaff8SEnji Cooper{ 31*cdebaff8SEnji Cooper sed ' 32*cdebaff8SEnji Cooper: again 33*cdebaff8SEnji Cooper/\\$/ { 34*cdebaff8SEnji Cooper N 35*cdebaff8SEnji Cooper s/\\\n// 36*cdebaff8SEnji Cooper t again 37*cdebaff8SEnji Cooper} 38*cdebaff8SEnji Cooper' "$1" 39*cdebaff8SEnji Cooper} 40640235e2SEnji Cooperrun_and_check_prep() 4157718be8SEnji Cooper{ 4257718be8SEnji Cooper local name="${1}"; shift 4357718be8SEnji Cooper 44*cdebaff8SEnji Cooper mkdir -p compile 45*cdebaff8SEnji Cooper srcdir="$(atf_get_srcdir)" 46*cdebaff8SEnji Cooper if [ ! -d "${srcdir}/support" ]; then 47*cdebaff8SEnji Cooper srcdir="$(dirname "${srcdir}")" 48*cdebaff8SEnji Cooper if [ ! -d "${srcdir}/support" ]; then 49*cdebaff8SEnji Cooper atf_fail "bad source directory ${srcdir}" 50*cdebaff8SEnji Cooper exit 1 51*cdebaff8SEnji Cooper fi 52*cdebaff8SEnji Cooper fi 53*cdebaff8SEnji Cooper supportdir="${srcdir}/support" 5457718be8SEnji Cooper 55640235e2SEnji Cooper local config_str 56640235e2SEnji Cooper eval config_str=\$${name}_config_str 57640235e2SEnji Cooper if [ -n "$config_str" ]; then 58640235e2SEnji Cooper config="d_${name}" 59640235e2SEnji Cooper printf "$config_str" >"${config}" 60640235e2SEnji Cooper else 61*cdebaff8SEnji Cooper config="${srcdir}/d_${name}" 62640235e2SEnji Cooper fi 63640235e2SEnji Cooper} 64640235e2SEnji Cooper 65640235e2SEnji Cooperrun_and_check_pass() 66640235e2SEnji Cooper{ 67640235e2SEnji Cooper local name="${1}"; shift 68640235e2SEnji Cooper 69640235e2SEnji Cooper run_and_check_prep "${name}" 70640235e2SEnji Cooper 71640235e2SEnji Cooper atf_check -o ignore -s eq:0 \ 72640235e2SEnji Cooper config -s "${supportdir}" -b "compile/${name}" "${config}" 73640235e2SEnji Cooper} 74640235e2SEnji Cooper 75640235e2SEnji Cooperrun_and_check_warn() 76640235e2SEnji Cooper{ 77640235e2SEnji Cooper local name="${1}"; shift 78640235e2SEnji Cooper 79640235e2SEnji Cooper run_and_check_prep "${name}" 80640235e2SEnji Cooper 81640235e2SEnji Cooper local stderr 82640235e2SEnji Cooper eval stderr=\$${name}_stderr 83640235e2SEnji Cooper atf_check -o ignore -e "${stderr}" -s eq:0 \ 8457718be8SEnji Cooper config -s "${supportdir}" -b "compile/${name}" "${config}" 8557718be8SEnji Cooper} 8657718be8SEnji Cooper 8757718be8SEnji Cooperrun_and_check_fail() 8857718be8SEnji Cooper{ 8957718be8SEnji Cooper local name="${1}"; shift 9057718be8SEnji Cooper 91640235e2SEnji Cooper run_and_check_prep "${name}" 9257718be8SEnji Cooper 9357718be8SEnji Cooper atf_check -o ignore -e ignore -s ne:0 \ 9457718be8SEnji Cooper config -s "${supportdir}" -b "compile/${name}" "${config}" 9557718be8SEnji Cooper} 9657718be8SEnji Cooper 97640235e2SEnji Coopertest_output() 98640235e2SEnji Cooper{ 99640235e2SEnji Cooper local name="${1}"; shift 100640235e2SEnji Cooper local res=1 101640235e2SEnji Cooper 102640235e2SEnji Cooper run_and_check_prep "${name}" 103640235e2SEnji Cooper 104640235e2SEnji Cooper config -s "${supportdir}" -b compile/"${name}" "${config}" >/dev/null && 105640235e2SEnji Cooper cd compile/"${name}" && 106640235e2SEnji Cooper check_${name} && 107640235e2SEnji Cooper cd $OLDPWD && 108640235e2SEnji Cooper res=0 109640235e2SEnji Cooper 110640235e2SEnji Cooper atf_check test $res -eq 0 111640235e2SEnji Cooper} 112640235e2SEnji Cooper 11357718be8SEnji Cooper# Defines a test case for config(1). 11457718be8SEnji Coopertest_case() 11557718be8SEnji Cooper{ 11657718be8SEnji Cooper local name="${1}"; shift 11757718be8SEnji Cooper local type="${1}"; shift 11857718be8SEnji Cooper local descr="${*}" 11957718be8SEnji Cooper 12057718be8SEnji Cooper atf_test_case "${name}" 12157718be8SEnji Cooper eval "${name}_head() { \ 12257718be8SEnji Cooper atf_set descr \"${descr}\"; \ 12357718be8SEnji Cooper atf_set require.progs \"config\"; \ 12457718be8SEnji Cooper }" 12557718be8SEnji Cooper eval "${name}_body() { \ 12657718be8SEnji Cooper run_and_check_${type} '${name}'; \ 12757718be8SEnji Cooper }" 12857718be8SEnji Cooper} 12957718be8SEnji Cooper 13057718be8SEnji Coopertest_case shadow_instance pass "Checks correct handling of shadowed instances" 13157718be8SEnji Coopertest_case loop pass "Checks correct handling of loops" 13257718be8SEnji Coopertest_case loop2 pass "Checks correct handling of devices that can be their" \ 13357718be8SEnji Cooper "own parents" 13457718be8SEnji Coopertest_case pseudo_parent pass "Checks correct handling of children of pseudo" \ 13557718be8SEnji Cooper "devices (PR/32329)" 13657718be8SEnji Coopertest_case postponed_orphan fail "Checks that config catches adding an" \ 13757718be8SEnji Cooper "instance of a child of a negated instance as error" 13857718be8SEnji Coopertest_case no_pseudo fail "Checks that config catches ommited 'pseudo-device'" \ 13957718be8SEnji Cooper "as error (PR/34111)" 14057718be8SEnji Coopertest_case deffs_redef fail "Checks that config doesn't allow a deffs to use" \ 14157718be8SEnji Cooper "the same name as a previous defflag/defparam" 14257718be8SEnji Cooper 143640235e2SEnji Cooper# Selecting an undefined option. 144*cdebaff8SEnji Cooperundefined_opt_config_str=" 145*cdebaff8SEnji Cooperinclude \"${srcdir}/d_min\" 146640235e2SEnji Cooperoptions UNDEFINED 147*cdebaff8SEnji Cooper" 148640235e2SEnji Coopertest_case undefined_opt pass \ 149640235e2SEnji Cooper "Checks that config allows a selection for an undefined options" 150640235e2SEnji Cooper 151640235e2SEnji Cooper# Negating an undefined option. 152*cdebaff8SEnji Cooperno_undefined_opt_config_str=" 153*cdebaff8SEnji Cooperinclude \"${srcdir}/d_min\" 154640235e2SEnji Cooperno options UNDEFINED 155*cdebaff8SEnji Cooper" 156640235e2SEnji Cooperno_undefined_opt_stderr='match:UNDEFINED' 157640235e2SEnji Coopertest_case no_undefined_opt warn \ 158640235e2SEnji Cooper "Checks that config allows a negation for an undefined options" 159640235e2SEnji Cooper 160640235e2SEnji Cooper# Attribute selection 161640235e2SEnji Coopertest_case select pass "Attribute selection" 162*cdebaff8SEnji Cooperselect_config_str=" 163*cdebaff8SEnji Cooperinclude \"${srcdir}/d_min\" 164640235e2SEnji Cooperselect c 165*cdebaff8SEnji Cooper" 166640235e2SEnji Coopercheck_select() 167640235e2SEnji Cooper{ 168640235e2SEnji Cooper local f=Makefile 169640235e2SEnji Cooper 170640235e2SEnji Cooper grep -q '^ a\.c ' $f && 171640235e2SEnji Cooper grep -q '^ b\.c ' $f && 172640235e2SEnji Cooper grep -q '^ c\.c ' $f && 173640235e2SEnji Cooper : 174640235e2SEnji Cooper} 175640235e2SEnji Cooperselect_body() { 176640235e2SEnji Cooper test_output select 177640235e2SEnji Cooper} 178640235e2SEnji Cooper 179640235e2SEnji Cooper# Attribute negation 180640235e2SEnji Coopertest_case no_select pass "Attribute negation" 181*cdebaff8SEnji Cooperno_select_config_str=" 182*cdebaff8SEnji Cooperinclude \"${srcdir}/d_min\" 183640235e2SEnji Cooperselect c 184640235e2SEnji Cooperno select a 185*cdebaff8SEnji Cooper" 186640235e2SEnji Coopercheck_no_select() 187640235e2SEnji Cooper{ 188640235e2SEnji Cooper local f=Makefile 189640235e2SEnji Cooper 190640235e2SEnji Cooper : >tmp 191640235e2SEnji Cooper grep -q '^a\.o:' $f >>tmp 192640235e2SEnji Cooper grep -q '^b\.o:' $f >>tmp 193640235e2SEnji Cooper grep -q '^c\.o:' $f >>tmp 194640235e2SEnji Cooper 195640235e2SEnji Cooper [ ! -s tmp ] && 196640235e2SEnji Cooper : 197640235e2SEnji Cooper} 198640235e2SEnji Cooperno_select_body() { 199640235e2SEnji Cooper test_output no_select 200640235e2SEnji Cooper} 201640235e2SEnji Cooper 202640235e2SEnji Cooper# Device instance 203640235e2SEnji Coopertest_case devi pass "Device instance" 204*cdebaff8SEnji Cooperdevi_config_str=" 205*cdebaff8SEnji Cooperinclude \"${srcdir}/d_min\" 206640235e2SEnji Cooperd0 at root 207*cdebaff8SEnji Cooper" 208640235e2SEnji Coopercheck_devi() 209640235e2SEnji Cooper{ 210640235e2SEnji Cooper local f=ioconf.c 211640235e2SEnji Cooper 212640235e2SEnji Cooper sed -ne '/^struct cfdriver \* const cfdriver_list_initial\[\]/,/^};/p' $f >tmp.cfdriver 213640235e2SEnji Cooper sed -ne '/^struct cfdata cfdata\[\]/,/^};/p' $f >tmp.cfdata 214640235e2SEnji Cooper 215640235e2SEnji Cooper grep -q '^CFDRIVER_DECL(d, ' $f && 216640235e2SEnji Cooper grep -q '&d_cd,' tmp.cfdriver && 217640235e2SEnji Cooper grep -q '^extern struct cfattach d_ca;$' $f && 218640235e2SEnji Cooper grep -q '^static const struct cfiattrdata \* const d_attrs\[\]' $f && 219640235e2SEnji Cooper grep -q '^static const struct cfiattrdata icf_iattrdata' $f && 220640235e2SEnji Cooper grep -q '{ "d",' tmp.cfdata && 221640235e2SEnji Cooper : 222640235e2SEnji Cooper} 223640235e2SEnji Cooperdevi_body() { 224640235e2SEnji Cooper test_output devi 225640235e2SEnji Cooper} 226640235e2SEnji Cooper 227640235e2SEnji Cooper# Check minimal kernel config(1) output 228640235e2SEnji Coopertest_case min pass "Minimal config" 229640235e2SEnji Coopercheck_min_files() 230640235e2SEnji Cooper{ 231640235e2SEnji Cooper test -e Makefile && 232640235e2SEnji Cooper test -e config_file.h && 233640235e2SEnji Cooper test -e config_time.src && 234640235e2SEnji Cooper test -e ioconf.c && 235640235e2SEnji Cooper test -e ioconf.h && 236640235e2SEnji Cooper test -e locators.h && 237640235e2SEnji Cooper test -e swapregress.c && 238640235e2SEnji Cooper test -h machine && 239640235e2SEnji Cooper test -h regress && 240640235e2SEnji Cooper : 241640235e2SEnji Cooper} 242640235e2SEnji Coopercheck_min_makefile() 243640235e2SEnji Cooper{ 244640235e2SEnji Cooper local f=Makefile 245640235e2SEnji Cooper 246640235e2SEnji Cooper grep -q '^%' $f >tmp.template 247640235e2SEnji Cooper 248640235e2SEnji Cooper grep -q '^MACHINE=regress$' $f && 249*cdebaff8SEnji Cooper (merge_backslash $f | grep -q '^IDENT=[ ]*-DMAXUSERS="4"') && 250640235e2SEnji Cooper [ ! -s tmp.template ] && 251640235e2SEnji Cooper : 252640235e2SEnji Cooper} 253640235e2SEnji Coopercheck_min() 254640235e2SEnji Cooper{ 255640235e2SEnji Cooper check_min_files && 256640235e2SEnji Cooper check_min_makefile && 257640235e2SEnji Cooper : 258640235e2SEnji Cooper} 259640235e2SEnji Coopermin_body() { 260640235e2SEnji Cooper test_output min 261640235e2SEnji Cooper} 262640235e2SEnji Cooper 26357718be8SEnji Cooperatf_init_test_cases() 26457718be8SEnji Cooper{ 26557718be8SEnji Cooper atf_add_test_case shadow_instance 26657718be8SEnji Cooper atf_add_test_case loop 26757718be8SEnji Cooper atf_add_test_case loop2 26857718be8SEnji Cooper atf_add_test_case pseudo_parent 26957718be8SEnji Cooper atf_add_test_case postponed_orphan 27057718be8SEnji Cooper atf_add_test_case no_pseudo 27157718be8SEnji Cooper atf_add_test_case deffs_redef 272640235e2SEnji Cooper atf_add_test_case undefined_opt 273640235e2SEnji Cooper atf_add_test_case no_undefined_opt 274640235e2SEnji Cooper atf_add_test_case select 275640235e2SEnji Cooper atf_add_test_case no_select 276640235e2SEnji Cooper atf_add_test_case devi 277640235e2SEnji Cooper atf_add_test_case min 27857718be8SEnji Cooper} 279