1 1.12 rillig # $NetBSD: t_config.sh,v 1.12 2024/04/28 07:27:42 rillig Exp $ 2 1.1 jruoho # 3 1.1 jruoho # Copyright (c) 2008, 2010 The NetBSD Foundation, Inc. 4 1.1 jruoho # All rights reserved. 5 1.1 jruoho # 6 1.1 jruoho # Redistribution and use in source and binary forms, with or without 7 1.1 jruoho # modification, are permitted provided that the following conditions 8 1.1 jruoho # are met: 9 1.1 jruoho # 1. Redistributions of source code must retain the above copyright 10 1.1 jruoho # notice, this list of conditions and the following disclaimer. 11 1.1 jruoho # 2. Redistributions in binary form must reproduce the above copyright 12 1.1 jruoho # notice, this list of conditions and the following disclaimer in the 13 1.1 jruoho # documentation and/or other materials provided with the distribution. 14 1.1 jruoho # 15 1.1 jruoho # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16 1.1 jruoho # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17 1.1 jruoho # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18 1.1 jruoho # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19 1.1 jruoho # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20 1.1 jruoho # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21 1.1 jruoho # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22 1.1 jruoho # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23 1.1 jruoho # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24 1.1 jruoho # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 1.1 jruoho # POSSIBILITY OF SUCH DAMAGE. 26 1.1 jruoho # 27 1.1 jruoho 28 1.8 christos srcdir=.. 29 1.8 christos merge_backslash() 30 1.8 christos { 31 1.8 christos sed ' 32 1.8 christos : again 33 1.8 christos /\\$/ { 34 1.8 christos N 35 1.8 christos s/\\\n// 36 1.8 christos t again 37 1.8 christos } 38 1.8 christos ' "$1" 39 1.8 christos } 40 1.2 uebayasi run_and_check_prep() 41 1.1 jruoho { 42 1.1 jruoho local name="${1}"; shift 43 1.1 jruoho 44 1.8 christos mkdir -p compile 45 1.8 christos srcdir="$(atf_get_srcdir)" 46 1.8 christos if [ ! -d "${srcdir}/support" ]; then 47 1.8 christos srcdir="$(dirname "${srcdir}")" 48 1.8 christos if [ ! -d "${srcdir}/support" ]; then 49 1.8 christos atf_fail "bad source directory ${srcdir}" 50 1.8 christos exit 1 51 1.8 christos fi 52 1.8 christos fi 53 1.8 christos supportdir="${srcdir}/support" 54 1.3 uebayasi 55 1.3 uebayasi local config_str 56 1.3 uebayasi eval config_str=\$${name}_config_str 57 1.3 uebayasi if [ -n "$config_str" ]; then 58 1.3 uebayasi config="d_${name}" 59 1.3 uebayasi printf "$config_str" >"${config}" 60 1.3 uebayasi else 61 1.8 christos config="${srcdir}/d_${name}" 62 1.3 uebayasi fi 63 1.2 uebayasi } 64 1.2 uebayasi 65 1.2 uebayasi run_and_check_pass() 66 1.2 uebayasi { 67 1.2 uebayasi local name="${1}"; shift 68 1.2 uebayasi 69 1.2 uebayasi run_and_check_prep "${name}" 70 1.1 jruoho 71 1.12 rillig atf_check -o ignore -s exit:0 \ 72 1.6 uebayasi config -s "${supportdir}" -b "compile/${name}" "${config}" 73 1.6 uebayasi } 74 1.6 uebayasi 75 1.6 uebayasi run_and_check_warn() 76 1.6 uebayasi { 77 1.6 uebayasi local name="${1}"; shift 78 1.6 uebayasi 79 1.6 uebayasi run_and_check_prep "${name}" 80 1.6 uebayasi 81 1.6 uebayasi local stderr 82 1.6 uebayasi eval stderr=\$${name}_stderr 83 1.12 rillig atf_check -o ignore -e "${stderr}" -s exit:0 \ 84 1.1 jruoho config -s "${supportdir}" -b "compile/${name}" "${config}" 85 1.1 jruoho } 86 1.1 jruoho 87 1.1 jruoho run_and_check_fail() 88 1.1 jruoho { 89 1.1 jruoho local name="${1}"; shift 90 1.1 jruoho 91 1.2 uebayasi run_and_check_prep "${name}" 92 1.1 jruoho 93 1.1 jruoho atf_check -o ignore -e ignore -s ne:0 \ 94 1.1 jruoho config -s "${supportdir}" -b "compile/${name}" "${config}" 95 1.1 jruoho } 96 1.1 jruoho 97 1.4 uebayasi test_output() 98 1.4 uebayasi { 99 1.4 uebayasi local name="${1}"; shift 100 1.4 uebayasi local res=1 101 1.4 uebayasi 102 1.4 uebayasi run_and_check_prep "${name}" 103 1.4 uebayasi 104 1.4 uebayasi config -s "${supportdir}" -b compile/"${name}" "${config}" >/dev/null && 105 1.4 uebayasi cd compile/"${name}" && 106 1.4 uebayasi check_${name} && 107 1.4 uebayasi cd $OLDPWD && 108 1.4 uebayasi res=0 109 1.4 uebayasi 110 1.4 uebayasi atf_check test $res -eq 0 111 1.4 uebayasi } 112 1.4 uebayasi 113 1.1 jruoho # Defines a test case for config(1). 114 1.1 jruoho test_case() 115 1.1 jruoho { 116 1.1 jruoho local name="${1}"; shift 117 1.1 jruoho local type="${1}"; shift 118 1.1 jruoho local descr="${*}" 119 1.1 jruoho 120 1.1 jruoho atf_test_case "${name}" 121 1.1 jruoho eval "${name}_head() { \ 122 1.1 jruoho atf_set descr \"${descr}\"; \ 123 1.1 jruoho atf_set require.progs \"config\"; \ 124 1.1 jruoho }" 125 1.1 jruoho eval "${name}_body() { \ 126 1.1 jruoho run_and_check_${type} '${name}'; \ 127 1.1 jruoho }" 128 1.1 jruoho } 129 1.1 jruoho 130 1.1 jruoho test_case shadow_instance pass "Checks correct handling of shadowed instances" 131 1.1 jruoho test_case loop pass "Checks correct handling of loops" 132 1.1 jruoho test_case loop2 pass "Checks correct handling of devices that can be their" \ 133 1.1 jruoho "own parents" 134 1.1 jruoho test_case pseudo_parent pass "Checks correct handling of children of pseudo" \ 135 1.1 jruoho "devices (PR/32329)" 136 1.1 jruoho test_case postponed_orphan fail "Checks that config catches adding an" \ 137 1.1 jruoho "instance of a child of a negated instance as error" 138 1.11 andvar test_case no_pseudo fail "Checks that config catches omitted 'pseudo-device'" \ 139 1.1 jruoho "as error (PR/34111)" 140 1.1 jruoho test_case deffs_redef fail "Checks that config doesn't allow a deffs to use" \ 141 1.1 jruoho "the same name as a previous defflag/defparam" 142 1.1 jruoho 143 1.3 uebayasi # Selecting an undefined option. 144 1.8 christos undefined_opt_config_str=" 145 1.8 christos include \"${srcdir}/d_min\" 146 1.3 uebayasi options UNDEFINED 147 1.8 christos " 148 1.3 uebayasi test_case undefined_opt pass \ 149 1.3 uebayasi "Checks that config allows a selection for an undefined options" 150 1.3 uebayasi 151 1.3 uebayasi # Negating an undefined option. 152 1.8 christos no_undefined_opt_config_str=" 153 1.8 christos include \"${srcdir}/d_min\" 154 1.3 uebayasi no options UNDEFINED 155 1.8 christos " 156 1.6 uebayasi no_undefined_opt_stderr='match:UNDEFINED' 157 1.6 uebayasi test_case no_undefined_opt warn \ 158 1.3 uebayasi "Checks that config allows a negation for an undefined options" 159 1.3 uebayasi 160 1.4 uebayasi # Attribute selection 161 1.4 uebayasi test_case select pass "Attribute selection" 162 1.8 christos select_config_str=" 163 1.8 christos include \"${srcdir}/d_min\" 164 1.4 uebayasi select c 165 1.8 christos " 166 1.4 uebayasi check_select() 167 1.4 uebayasi { 168 1.4 uebayasi local f=Makefile 169 1.4 uebayasi 170 1.7 uebayasi grep -q '^ a\.c ' $f && 171 1.7 uebayasi grep -q '^ b\.c ' $f && 172 1.7 uebayasi grep -q '^ c\.c ' $f && 173 1.4 uebayasi : 174 1.4 uebayasi } 175 1.4 uebayasi select_body() { 176 1.4 uebayasi test_output select 177 1.4 uebayasi } 178 1.4 uebayasi 179 1.4 uebayasi # Attribute negation 180 1.4 uebayasi test_case no_select pass "Attribute negation" 181 1.8 christos no_select_config_str=" 182 1.8 christos include \"${srcdir}/d_min\" 183 1.4 uebayasi select c 184 1.4 uebayasi no select a 185 1.8 christos " 186 1.4 uebayasi check_no_select() 187 1.4 uebayasi { 188 1.4 uebayasi local f=Makefile 189 1.4 uebayasi 190 1.4 uebayasi : >tmp 191 1.4 uebayasi grep -q '^a\.o:' $f >>tmp 192 1.4 uebayasi grep -q '^b\.o:' $f >>tmp 193 1.4 uebayasi grep -q '^c\.o:' $f >>tmp 194 1.4 uebayasi 195 1.4 uebayasi [ ! -s tmp ] && 196 1.4 uebayasi : 197 1.4 uebayasi } 198 1.4 uebayasi no_select_body() { 199 1.4 uebayasi test_output no_select 200 1.4 uebayasi } 201 1.4 uebayasi 202 1.5 uebayasi # Device instance 203 1.5 uebayasi test_case devi pass "Device instance" 204 1.8 christos devi_config_str=" 205 1.8 christos include \"${srcdir}/d_min\" 206 1.5 uebayasi d0 at root 207 1.8 christos " 208 1.5 uebayasi check_devi() 209 1.5 uebayasi { 210 1.5 uebayasi local f=ioconf.c 211 1.5 uebayasi 212 1.5 uebayasi sed -ne '/^struct cfdriver \* const cfdriver_list_initial\[\]/,/^};/p' $f >tmp.cfdriver 213 1.5 uebayasi sed -ne '/^struct cfdata cfdata\[\]/,/^};/p' $f >tmp.cfdata 214 1.5 uebayasi 215 1.5 uebayasi grep -q '^CFDRIVER_DECL(d, ' $f && 216 1.5 uebayasi grep -q '&d_cd,' tmp.cfdriver && 217 1.5 uebayasi grep -q '^extern struct cfattach d_ca;$' $f && 218 1.5 uebayasi grep -q '^static const struct cfiattrdata \* const d_attrs\[\]' $f && 219 1.5 uebayasi grep -q '^static const struct cfiattrdata icf_iattrdata' $f && 220 1.5 uebayasi grep -q '{ "d",' tmp.cfdata && 221 1.5 uebayasi : 222 1.5 uebayasi } 223 1.5 uebayasi devi_body() { 224 1.5 uebayasi test_output devi 225 1.5 uebayasi } 226 1.5 uebayasi 227 1.2 uebayasi # Check minimal kernel config(1) output 228 1.4 uebayasi test_case min pass "Minimal config" 229 1.2 uebayasi check_min_files() 230 1.2 uebayasi { 231 1.2 uebayasi test -e Makefile && 232 1.2 uebayasi test -e config_file.h && 233 1.2 uebayasi test -e config_time.src && 234 1.2 uebayasi test -e ioconf.c && 235 1.2 uebayasi test -e ioconf.h && 236 1.2 uebayasi test -e locators.h && 237 1.2 uebayasi test -e swapregress.c && 238 1.2 uebayasi test -h machine && 239 1.2 uebayasi test -h regress && 240 1.2 uebayasi : 241 1.2 uebayasi } 242 1.2 uebayasi check_min_makefile() 243 1.2 uebayasi { 244 1.3 uebayasi local f=Makefile 245 1.3 uebayasi 246 1.3 uebayasi grep -q '^%' $f >tmp.template 247 1.2 uebayasi 248 1.3 uebayasi grep -q '^MACHINE=regress$' $f && 249 1.8 christos (merge_backslash $f | grep -q '^IDENT=[ ]*-DMAXUSERS="4"') && 250 1.2 uebayasi [ ! -s tmp.template ] && 251 1.2 uebayasi : 252 1.2 uebayasi } 253 1.4 uebayasi check_min() 254 1.2 uebayasi { 255 1.2 uebayasi check_min_files && 256 1.2 uebayasi check_min_makefile && 257 1.4 uebayasi : 258 1.2 uebayasi } 259 1.2 uebayasi min_body() { 260 1.4 uebayasi test_output min 261 1.2 uebayasi } 262 1.2 uebayasi 263 1.9 christos # Check ifdef supper 264 1.9 christos test_case ifdef pass "ifdef config" 265 1.9 christos check_ifdef_files() 266 1.9 christos { 267 1.9 christos test -e Makefile && 268 1.9 christos test -e config_file.h && 269 1.9 christos test -e config_time.src && 270 1.9 christos test -e ioconf.c && 271 1.9 christos test -e ioconf.h && 272 1.9 christos test -e locators.h && 273 1.9 christos test -e swapregress.c && 274 1.9 christos test -h machine && 275 1.9 christos test -h regress && 276 1.9 christos : 277 1.9 christos } 278 1.9 christos 279 1.9 christos check_ifdef_makefile() 280 1.9 christos { 281 1.9 christos local f=Makefile 282 1.10 christos local e='-DOK1_1 -DOK2_1 -DOK2_2 -DOK3_1 -DOK3_2 -DOK3_3 -DOK3_4 -DOK3_5 -DOK4_1 -DMAXUSERS="4"' 283 1.9 christos local r 284 1.9 christos r=$(make -f Makefile -V IDENT) 285 1.9 christos if [ "$r" != "$e" ]; then 286 1.9 christos echo "Expected: '$e'" 287 1.9 christos echo "Result: '$r'" 288 1.9 christos return 1 289 1.9 christos fi 290 1.9 christos } 291 1.9 christos 292 1.9 christos check_ifdef() 293 1.9 christos { 294 1.9 christos check_ifdef_files && 295 1.9 christos check_ifdef_makefile && 296 1.9 christos : 297 1.9 christos } 298 1.9 christos ifdef_body() { 299 1.9 christos test_output ifdef 300 1.9 christos } 301 1.9 christos 302 1.1 jruoho atf_init_test_cases() 303 1.1 jruoho { 304 1.1 jruoho atf_add_test_case shadow_instance 305 1.1 jruoho atf_add_test_case loop 306 1.1 jruoho atf_add_test_case loop2 307 1.1 jruoho atf_add_test_case pseudo_parent 308 1.1 jruoho atf_add_test_case postponed_orphan 309 1.1 jruoho atf_add_test_case no_pseudo 310 1.1 jruoho atf_add_test_case deffs_redef 311 1.3 uebayasi atf_add_test_case undefined_opt 312 1.3 uebayasi atf_add_test_case no_undefined_opt 313 1.4 uebayasi atf_add_test_case select 314 1.4 uebayasi atf_add_test_case no_select 315 1.5 uebayasi atf_add_test_case devi 316 1.2 uebayasi atf_add_test_case min 317 1.9 christos atf_add_test_case ifdef 318 1.1 jruoho } 319