1# $NetBSD: t_config.sh,v 1.7 2015/10/04 07:59:47 uebayasi Exp $ 2# 3# Copyright (c) 2008, 2010 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 28run_and_check_prep() 29{ 30 local name="${1}"; shift 31 32 mkdir compile 33 supportdir="$(atf_get_srcdir)/support" 34 35 local config_str 36 eval config_str=\$${name}_config_str 37 if [ -n "$config_str" ]; then 38 config="d_${name}" 39 printf "$config_str" >"${config}" 40 else 41 config="$(atf_get_srcdir)/d_${name}" 42 fi 43} 44 45run_and_check_pass() 46{ 47 local name="${1}"; shift 48 49 run_and_check_prep "${name}" 50 51 atf_check -o ignore -s eq:0 \ 52 config -s "${supportdir}" -b "compile/${name}" "${config}" 53} 54 55run_and_check_warn() 56{ 57 local name="${1}"; shift 58 59 run_and_check_prep "${name}" 60 61 local stderr 62 eval stderr=\$${name}_stderr 63 atf_check -o ignore -e "${stderr}" -s eq:0 \ 64 config -s "${supportdir}" -b "compile/${name}" "${config}" 65} 66 67run_and_check_fail() 68{ 69 local name="${1}"; shift 70 71 run_and_check_prep "${name}" 72 73 atf_check -o ignore -e ignore -s ne:0 \ 74 config -s "${supportdir}" -b "compile/${name}" "${config}" 75} 76 77test_output() 78{ 79 local name="${1}"; shift 80 local res=1 81 82 run_and_check_prep "${name}" 83 84 config -s "${supportdir}" -b compile/"${name}" "${config}" >/dev/null && 85 cd compile/"${name}" && 86 check_${name} && 87 cd $OLDPWD && 88 res=0 89 90 atf_check test $res -eq 0 91} 92 93# Defines a test case for config(1). 94test_case() 95{ 96 local name="${1}"; shift 97 local type="${1}"; shift 98 local descr="${*}" 99 100 atf_test_case "${name}" 101 eval "${name}_head() { \ 102 atf_set descr \"${descr}\"; \ 103 atf_set require.progs \"config\"; \ 104 }" 105 eval "${name}_body() { \ 106 run_and_check_${type} '${name}'; \ 107 }" 108} 109 110test_case shadow_instance pass "Checks correct handling of shadowed instances" 111test_case loop pass "Checks correct handling of loops" 112test_case loop2 pass "Checks correct handling of devices that can be their" \ 113 "own parents" 114test_case pseudo_parent pass "Checks correct handling of children of pseudo" \ 115 "devices (PR/32329)" 116test_case postponed_orphan fail "Checks that config catches adding an" \ 117 "instance of a child of a negated instance as error" 118test_case no_pseudo fail "Checks that config catches ommited 'pseudo-device'" \ 119 "as error (PR/34111)" 120test_case deffs_redef fail "Checks that config doesn't allow a deffs to use" \ 121 "the same name as a previous defflag/defparam" 122 123# Selecting an undefined option. 124undefined_opt_config_str=' 125include "../d_min" 126options UNDEFINED 127' 128test_case undefined_opt pass \ 129 "Checks that config allows a selection for an undefined options" 130 131# Negating an undefined option. 132no_undefined_opt_config_str=' 133include "../d_min" 134no options UNDEFINED 135' 136no_undefined_opt_stderr='match:UNDEFINED' 137test_case no_undefined_opt warn \ 138 "Checks that config allows a negation for an undefined options" 139 140# Attribute selection 141test_case select pass "Attribute selection" 142select_config_str=' 143include "../d_min" 144select c 145' 146check_select() 147{ 148 local f=Makefile 149 150 grep -q '^ a\.c ' $f && 151 grep -q '^ b\.c ' $f && 152 grep -q '^ c\.c ' $f && 153 : 154} 155select_body() { 156 test_output select 157} 158 159# Attribute negation 160test_case no_select pass "Attribute negation" 161no_select_config_str=' 162include "../d_min" 163select c 164no select a 165' 166check_no_select() 167{ 168 local f=Makefile 169 170 : >tmp 171 grep -q '^a\.o:' $f >>tmp 172 grep -q '^b\.o:' $f >>tmp 173 grep -q '^c\.o:' $f >>tmp 174 175 [ ! -s tmp ] && 176 : 177} 178no_select_body() { 179 test_output no_select 180} 181 182# Device instance 183test_case devi pass "Device instance" 184devi_config_str=' 185include "../d_min" 186d0 at root 187' 188check_devi() 189{ 190 local f=ioconf.c 191 192 sed -ne '/^struct cfdriver \* const cfdriver_list_initial\[\]/,/^};/p' $f >tmp.cfdriver 193 sed -ne '/^struct cfdata cfdata\[\]/,/^};/p' $f >tmp.cfdata 194 195 grep -q '^CFDRIVER_DECL(d, ' $f && 196 grep -q '&d_cd,' tmp.cfdriver && 197 grep -q '^extern struct cfattach d_ca;$' $f && 198 grep -q '^static const struct cfiattrdata \* const d_attrs\[\]' $f && 199 grep -q '^static const struct cfiattrdata icf_iattrdata' $f && 200 grep -q '{ "d",' tmp.cfdata && 201 : 202} 203devi_body() { 204 test_output devi 205} 206 207# Check minimal kernel config(1) output 208test_case min pass "Minimal config" 209check_min_files() 210{ 211 test -e Makefile && 212 test -e config_file.h && 213 test -e config_time.src && 214 test -e ioconf.c && 215 test -e ioconf.h && 216 test -e locators.h && 217 test -e swapregress.c && 218 test -h machine && 219 test -h regress && 220 : 221} 222check_min_makefile() 223{ 224 local f=Makefile 225 226 grep -q '^%' $f >tmp.template 227 228 grep -q '^MACHINE=regress$' $f && 229 grep -q '^PARAM=-DMAXUSERS=4$' $f && 230 grep -q '^all: regress$' $f && 231 grep -q '^regress:' $f && 232 [ ! -s tmp.template ] && 233 : 234} 235check_min() 236{ 237 check_min_files && 238 check_min_makefile && 239 : 240} 241min_body() { 242 test_output min 243} 244 245atf_init_test_cases() 246{ 247 atf_add_test_case shadow_instance 248 atf_add_test_case loop 249 atf_add_test_case loop2 250 atf_add_test_case pseudo_parent 251 atf_add_test_case postponed_orphan 252 atf_add_test_case no_pseudo 253 atf_add_test_case deffs_redef 254 atf_add_test_case undefined_opt 255 atf_add_test_case no_undefined_opt 256 atf_add_test_case select 257 atf_add_test_case no_select 258 atf_add_test_case devi 259 atf_add_test_case min 260} 261