xref: /freebsd-src/contrib/netbsd-tests/usr.bin/config/t_config.sh (revision d370fd1cd8fc69e87dc63f4f4a82e5a8b4956c93)
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