1272343Sngie# $NetBSD: t_modload.sh,v 1.13 2012/04/20 05:41:25 jruoho Exp $
2272343Sngie#
3272343Sngie# Copyright (c) 2008 The NetBSD Foundation, Inc.
4272343Sngie# All rights reserved.
5272343Sngie#
6272343Sngie# Redistribution and use in source and binary forms, with or without
7272343Sngie# modification, are permitted provided that the following conditions
8272343Sngie# are met:
9272343Sngie# 1. Redistributions of source code must retain the above copyright
10272343Sngie#    notice, this list of conditions and the following disclaimer.
11272343Sngie# 2. Redistributions in binary form must reproduce the above copyright
12272343Sngie#    notice, this list of conditions and the following disclaimer in the
13272343Sngie#    documentation and/or other materials provided with the distribution.
14272343Sngie#
15272343Sngie# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16272343Sngie# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17272343Sngie# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18272343Sngie# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19272343Sngie# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20272343Sngie# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21272343Sngie# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22272343Sngie# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23272343Sngie# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24272343Sngie# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25272343Sngie# POSSIBILITY OF SUCH DAMAGE.
26272343Sngie#
27272343Sngie
28272343Sngiecheck_sysctl() {
29272343Sngie	echo "${1} = ${2}" >expout
30272343Sngie	atf_check -s eq:0 -o file:expout -e empty sysctl ${1}
31272343Sngie}
32272343Sngie
33272343Sngieatf_test_case plain cleanup
34272343Sngieplain_head() {
35272343Sngie	atf_set "descr" "Test load without arguments"
36272343Sngie	atf_set "require.user" "root"
37272343Sngie}
38272343Sngieplain_body() {
39272343Sngie
40272343Sngie	# XXX: Adjust when modctl(8) fails consistently.
41272343Sngie	#
42272343Sngie	$(atf_get_srcdir)/k_helper3 \
43272343Sngie		"%s/k_helper/k_helper.kmod" $(atf_get_srcdir)
44272343Sngie
45272343Sngie	if [ $? -eq 1 ] || [ $? -eq 78 ]; then
46272343Sngie		atf_skip "host does not support modules"
47272343Sngie	fi
48272343Sngie
49272343Sngie	cat >experr <<EOF
50272343Sngiemodload: No such file or directory
51272343SngieEOF
52272343Sngie	atf_check -s eq:1 -o empty -e ignore modload non-existent.o
53272343Sngie
54272343Sngie	atf_check -s eq:0 -o empty -e empty \
55272343Sngie	    modload $(atf_get_srcdir)/k_helper/k_helper.kmod
56272343Sngie	check_sysctl vendor.k_helper.present 1
57272343Sngie	check_sysctl vendor.k_helper.prop_int_ok 0
58272343Sngie	check_sysctl vendor.k_helper.prop_str_ok 0
59272343Sngie	atf_check -s eq:0 -o empty -e empty modunload k_helper
60272343Sngie	touch done
61272343Sngie}
62272343Sngieplain_cleanup() {
63272343Sngie	test -f done || modunload k_helper >/dev/null 2>&1
64272343Sngie}
65272343Sngie
66272343Sngieatf_test_case bflag cleanup
67272343Sngiebflag_head() {
68272343Sngie	atf_set "descr" "Test the -b flag"
69272343Sngie	atf_set "require.user" "root"
70272343Sngie}
71272343Sngiebflag_body() {
72272343Sngie	echo "Checking error conditions"
73272343Sngie
74272343Sngie	atf_check -s eq:1 -o empty -e save:stderr \
75272343Sngie	    modload -b foo k_helper.kmod
76272343Sngie	atf_check -s eq:0 -o ignore -e empty \
77272343Sngie	    grep 'Invalid parameter.*foo' stderr
78272343Sngie
79272343Sngie	atf_check -s eq:1 -o empty -e save:stderr \
80272343Sngie	    modload -b foo= k_helper.kmod
81272343Sngie	atf_check -s eq:0 -o ignore -e empty \
82272343Sngie	    grep 'Invalid boolean value' stderr
83272343Sngie
84272343Sngie	atf_check -s eq:1 -o empty -e save:stderr \
85272343Sngie	    modload -b foo=bar k_helper.kmod
86272343Sngie	atf_check -s eq:0 -o ignore -e empty \
87272343Sngie	    grep 'Invalid boolean value.*bar' stderr
88272343Sngie
89272343Sngie	atf_check -s eq:1 -o empty -e save:stderr \
90272343Sngie	    modload -b foo=falsea k_helper.kmod
91272343Sngie	atf_check -s eq:0 -o ignore -e empty \
92272343Sngie	    grep 'Invalid boolean value.*falsea' stderr
93272343Sngie
94272343Sngie	atf_check -s eq:1 -o empty -e save:stderr \
95272343Sngie	    modload -b foo=truea k_helper.kmod
96272343Sngie	atf_check -s eq:0 -o ignore -e empty \
97272343Sngie	    grep 'Invalid boolean value.*truea' stderr
98272343Sngie
99272343Sngie	# TODO Once sysctl(8) supports CTLTYPE_BOOL nodes.
100272343Sngie	#echo "Checking valid values"
101272343Sngie}
102272343Sngiebflag_cleanup() {
103272343Sngie	modunload k_helper >/dev/null 2>&1 || true
104272343Sngie}
105272343Sngie
106272343Sngieatf_test_case iflag cleanup
107272343Sngieiflag_head() {
108272343Sngie	atf_set "descr" "Test the -i flag"
109272343Sngie	atf_set "require.user" "root"
110272343Sngie}
111272343Sngieiflag_body() {
112272343Sngie
113272343Sngie	# XXX: Adjust when modctl(8) fails consistently.
114272343Sngie	#
115272343Sngie	$(atf_get_srcdir)/k_helper3 \
116272343Sngie		"%s/k_helper/k_helper.kmod" $(atf_get_srcdir)
117272343Sngie
118272343Sngie	if [ $? -eq 1 ] || [ $? -eq 78 ]; then
119272343Sngie		atf_skip "host does not support modules"
120272343Sngie	fi
121272343Sngie
122272343Sngie	echo "Checking error conditions"
123272343Sngie
124272343Sngie	atf_check -s eq:1 -o empty -e save:stderr modload -i foo \
125272343Sngie	    k_helper/k_helper.kmod
126272343Sngie	atf_check -s eq:0 -o ignore -e empty \
127272343Sngie	    grep 'Invalid parameter.*foo' stderr
128272343Sngie
129272343Sngie	atf_check -s eq:1 -o empty -e save:stderr modload -i foo= \
130272343Sngie	    k_helper/k_helper.kmod
131272343Sngie	atf_check -s eq:0 -o ignore -e empty \
132272343Sngie	    grep 'Invalid integer value' stderr
133272343Sngie
134272343Sngie	atf_check -s eq:1 -o empty -e save:stderr \
135272343Sngie	    modload -i foo=bar k_helper/k_helper.kmod
136272343Sngie	atf_check -s eq:0 -o ignore -e empty \
137272343Sngie	    grep 'Invalid integer value.*bar' stderr
138272343Sngie
139272343Sngie	atf_check -s eq:1 -o empty -e save:stderr \
140272343Sngie	    modload -i foo=123a k_helper/k_helper.kmod
141272343Sngie	atf_check -s eq:0 -o ignore -e empty \
142272343Sngie	    grep 'Invalid integer value.*123a' stderr
143272343Sngie
144272343Sngie	echo "Checking valid values"
145272343Sngie
146272343Sngie	for v in 5 10; do
147272343Sngie		atf_check -s eq:0 -o empty -e empty \
148272343Sngie		    modload -i prop_int="${v}" \
149272343Sngie		    $(atf_get_srcdir)/k_helper/k_helper.kmod
150272343Sngie		check_sysctl vendor.k_helper.prop_int_ok 1
151272343Sngie		check_sysctl vendor.k_helper.prop_int_val "${v}"
152272343Sngie		atf_check -s eq:0 -o empty -e empty modunload k_helper
153272343Sngie	done
154272343Sngie	touch done
155272343Sngie}
156272343Sngieiflag_cleanup() {
157272343Sngie	test -f done || modunload k_helper >/dev/null 2>&1
158272343Sngie}
159272343Sngie
160272343Sngieatf_test_case sflag cleanup
161272343Sngiesflag_head() {
162272343Sngie	atf_set "descr" "Test the -s flag"
163272343Sngie	atf_set "require.user" "root"
164272343Sngie}
165272343Sngiesflag_body() {
166272343Sngie
167272343Sngie	# XXX: Adjust when modctl(8) fails consistently.
168272343Sngie	#
169272343Sngie	$(atf_get_srcdir)/k_helper3 \
170272343Sngie		"%s/k_helper/k_helper.kmod" $(atf_get_srcdir)
171272343Sngie
172272343Sngie	if [ $? -eq 1 ] || [ $? -eq 78 ]; then
173272343Sngie		atf_skip "host does not support modules"
174272343Sngie	fi
175272343Sngie
176272343Sngie	echo "Checking error conditions"
177272343Sngie
178272343Sngie	atf_check -s eq:1 -o empty -e save:stderr modload -s foo \
179272343Sngie	    k_helper/k_helper.kmod
180272343Sngie	atf_check -s eq:0 -o ignore -e empty \
181272343Sngie	    grep 'Invalid parameter.*foo' stderr
182272343Sngie
183272343Sngie	echo "Checking valid values"
184272343Sngie
185272343Sngie	for v in '1st string' '2nd string'; do
186272343Sngie		atf_check -s eq:0 -o empty -e empty \
187272343Sngie		    modload -s prop_str="${v}" \
188272343Sngie		    $(atf_get_srcdir)/k_helper/k_helper.kmod
189272343Sngie		check_sysctl vendor.k_helper.prop_str_ok 1
190272343Sngie		check_sysctl vendor.k_helper.prop_str_val "${v}"
191272343Sngie		atf_check -s eq:0 -o empty -e empty modunload k_helper
192272343Sngie	done
193272343Sngie	touch done
194272343Sngie}
195272343Sngiesflag_cleanup() {
196272343Sngie	test -f done || modunload k_helper >/dev/null 2>&1
197272343Sngie}
198272343Sngie
199272343Sngieatf_init_test_cases()
200272343Sngie{
201272343Sngie	atf_add_test_case plain
202272343Sngie	atf_add_test_case bflag
203272343Sngie	atf_add_test_case iflag
204272343Sngie	atf_add_test_case sflag
205272343Sngie}
206