xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/kmod/kmod.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker#!/bin/bash
2*053f45beSAndroid Build Coastguard Worker#
3*053f45beSAndroid Build Coastguard Worker# Copyright (C) 2017 Luis R. Rodriguez <[email protected]>
4*053f45beSAndroid Build Coastguard Worker#
5*053f45beSAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or modify it
6*053f45beSAndroid Build Coastguard Worker# under the terms of the GNU General Public License as published by the Free
7*053f45beSAndroid Build Coastguard Worker# Software Foundation; either version 2 of the License, or at your option any
8*053f45beSAndroid Build Coastguard Worker# later version; or, when distributed separately from the Linux kernel or
9*053f45beSAndroid Build Coastguard Worker# when incorporated into other software packages, subject to the following
10*053f45beSAndroid Build Coastguard Worker# license:
11*053f45beSAndroid Build Coastguard Worker#
12*053f45beSAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or modify it
13*053f45beSAndroid Build Coastguard Worker# under the terms of copyleft-next (version 0.3.1 or later) as published
14*053f45beSAndroid Build Coastguard Worker# at http://copyleft-next.org/.
15*053f45beSAndroid Build Coastguard Worker
16*053f45beSAndroid Build Coastguard Worker# This is a stress test script for kmod, the kernel module loader. It uses
17*053f45beSAndroid Build Coastguard Worker# test_kmod which exposes a series of knobs for the API for us so we can
18*053f45beSAndroid Build Coastguard Worker# tweak each test in userspace rather than in kernelspace.
19*053f45beSAndroid Build Coastguard Worker#
20*053f45beSAndroid Build Coastguard Worker# The way kmod works is it uses the kernel's usermode helper API to eventually
21*053f45beSAndroid Build Coastguard Worker# call /sbin/modprobe. It has a limit of the number of concurrent calls
22*053f45beSAndroid Build Coastguard Worker# possible. The kernel interface to load modules is request_module(), however
23*053f45beSAndroid Build Coastguard Worker# mount uses get_fs_type(). Both behave slightly differently, but the
24*053f45beSAndroid Build Coastguard Worker# differences are important enough to test each call separately. For this
25*053f45beSAndroid Build Coastguard Worker# reason test_kmod starts by providing tests for both calls.
26*053f45beSAndroid Build Coastguard Worker#
27*053f45beSAndroid Build Coastguard Worker# The test driver test_kmod assumes a series of defaults which you can
28*053f45beSAndroid Build Coastguard Worker# override by exporting to your environment prior running this script.
29*053f45beSAndroid Build Coastguard Worker# For instance this script assumes you do not have xfs loaded upon boot.
30*053f45beSAndroid Build Coastguard Worker# If this is false, export DEFAULT_KMOD_FS="ext4" prior to running this
31*053f45beSAndroid Build Coastguard Worker# script if the filesystem module you don't have loaded upon bootup
32*053f45beSAndroid Build Coastguard Worker# is ext4 instead. Refer to allow_user_defaults() for a list of user
33*053f45beSAndroid Build Coastguard Worker# override variables possible.
34*053f45beSAndroid Build Coastguard Worker#
35*053f45beSAndroid Build Coastguard Worker# You'll want at least 4 GiB of RAM to expect to run these tests
36*053f45beSAndroid Build Coastguard Worker# without running out of memory on them. For other requirements refer
37*053f45beSAndroid Build Coastguard Worker# to test_reqs()
38*053f45beSAndroid Build Coastguard Worker
39*053f45beSAndroid Build Coastguard Workerset -e
40*053f45beSAndroid Build Coastguard Worker
41*053f45beSAndroid Build Coastguard WorkerTEST_NAME="kmod"
42*053f45beSAndroid Build Coastguard WorkerTEST_DRIVER="test_${TEST_NAME}"
43*053f45beSAndroid Build Coastguard WorkerTEST_DIR=$(dirname $0)
44*053f45beSAndroid Build Coastguard Worker
45*053f45beSAndroid Build Coastguard Worker# This represents
46*053f45beSAndroid Build Coastguard Worker#
47*053f45beSAndroid Build Coastguard Worker# TEST_ID:TEST_COUNT:ENABLED
48*053f45beSAndroid Build Coastguard Worker#
49*053f45beSAndroid Build Coastguard Worker# TEST_ID: is the test id number
50*053f45beSAndroid Build Coastguard Worker# TEST_COUNT: number of times we should run the test
51*053f45beSAndroid Build Coastguard Worker# ENABLED: 1 if enabled, 0 otherwise
52*053f45beSAndroid Build Coastguard Worker#
53*053f45beSAndroid Build Coastguard Worker# Once these are enabled please leave them as-is. Write your own test,
54*053f45beSAndroid Build Coastguard Worker# we have tons of space.
55*053f45beSAndroid Build Coastguard WorkerALL_TESTS="0001:3:1"
56*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0002:3:1"
57*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0003:1:1"
58*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0004:1:1"
59*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0005:10:1"
60*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0006:10:1"
61*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0007:5:1"
62*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0008:150:1"
63*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0009:150:1"
64*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0010:1:1"
65*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0011:1:1"
66*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0012:1:1"
67*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0013:1:1"
68*053f45beSAndroid Build Coastguard Worker
69*053f45beSAndroid Build Coastguard Worker# Kselftest framework requirement - SKIP code is 4.
70*053f45beSAndroid Build Coastguard Workerksft_skip=4
71*053f45beSAndroid Build Coastguard Worker
72*053f45beSAndroid Build Coastguard Workertest_modprobe()
73*053f45beSAndroid Build Coastguard Worker{
74*053f45beSAndroid Build Coastguard Worker       if [ ! -d $DIR ]; then
75*053f45beSAndroid Build Coastguard Worker               echo "$0: $DIR not present" >&2
76*053f45beSAndroid Build Coastguard Worker               echo "You must have the following enabled in your kernel:" >&2
77*053f45beSAndroid Build Coastguard Worker               cat $TEST_DIR/config >&2
78*053f45beSAndroid Build Coastguard Worker               exit $ksft_skip
79*053f45beSAndroid Build Coastguard Worker       fi
80*053f45beSAndroid Build Coastguard Worker}
81*053f45beSAndroid Build Coastguard Worker
82*053f45beSAndroid Build Coastguard Workerfunction allow_user_defaults()
83*053f45beSAndroid Build Coastguard Worker{
84*053f45beSAndroid Build Coastguard Worker	if [ -z $DEFAULT_KMOD_DRIVER ]; then
85*053f45beSAndroid Build Coastguard Worker		DEFAULT_KMOD_DRIVER="test_module"
86*053f45beSAndroid Build Coastguard Worker	fi
87*053f45beSAndroid Build Coastguard Worker
88*053f45beSAndroid Build Coastguard Worker	if [ -z $DEFAULT_KMOD_FS ]; then
89*053f45beSAndroid Build Coastguard Worker		DEFAULT_KMOD_FS="xfs"
90*053f45beSAndroid Build Coastguard Worker	fi
91*053f45beSAndroid Build Coastguard Worker
92*053f45beSAndroid Build Coastguard Worker	if [ -z $PROC_DIR ]; then
93*053f45beSAndroid Build Coastguard Worker		PROC_DIR="/proc/sys/kernel/"
94*053f45beSAndroid Build Coastguard Worker	fi
95*053f45beSAndroid Build Coastguard Worker
96*053f45beSAndroid Build Coastguard Worker	if [ -z $MODPROBE_LIMIT ]; then
97*053f45beSAndroid Build Coastguard Worker		MODPROBE_LIMIT=50
98*053f45beSAndroid Build Coastguard Worker	fi
99*053f45beSAndroid Build Coastguard Worker
100*053f45beSAndroid Build Coastguard Worker	if [ -z $DIR ]; then
101*053f45beSAndroid Build Coastguard Worker		DIR="/sys/devices/virtual/misc/${TEST_DRIVER}0/"
102*053f45beSAndroid Build Coastguard Worker	fi
103*053f45beSAndroid Build Coastguard Worker
104*053f45beSAndroid Build Coastguard Worker	if [ -z $DEFAULT_NUM_TESTS ]; then
105*053f45beSAndroid Build Coastguard Worker		DEFAULT_NUM_TESTS=150
106*053f45beSAndroid Build Coastguard Worker	fi
107*053f45beSAndroid Build Coastguard Worker
108*053f45beSAndroid Build Coastguard Worker	MODPROBE_LIMIT_FILE="${PROC_DIR}/kmod-limit"
109*053f45beSAndroid Build Coastguard Worker}
110*053f45beSAndroid Build Coastguard Worker
111*053f45beSAndroid Build Coastguard Workertest_reqs()
112*053f45beSAndroid Build Coastguard Worker{
113*053f45beSAndroid Build Coastguard Worker	if ! which modprobe 2> /dev/null > /dev/null; then
114*053f45beSAndroid Build Coastguard Worker		echo "$0: You need modprobe installed" >&2
115*053f45beSAndroid Build Coastguard Worker		exit $ksft_skip
116*053f45beSAndroid Build Coastguard Worker	fi
117*053f45beSAndroid Build Coastguard Worker
118*053f45beSAndroid Build Coastguard Worker	if ! which kmod 2> /dev/null > /dev/null; then
119*053f45beSAndroid Build Coastguard Worker		echo "$0: You need kmod installed" >&2
120*053f45beSAndroid Build Coastguard Worker		exit $ksft_skip
121*053f45beSAndroid Build Coastguard Worker	fi
122*053f45beSAndroid Build Coastguard Worker
123*053f45beSAndroid Build Coastguard Worker	# kmod 19 has a bad bug where it returns 0 when modprobe
124*053f45beSAndroid Build Coastguard Worker	# gets called *even* if the module was not loaded due to
125*053f45beSAndroid Build Coastguard Worker	# some bad heuristics. For details see:
126*053f45beSAndroid Build Coastguard Worker	#
127*053f45beSAndroid Build Coastguard Worker	# A work around is possible in-kernel but its rather
128*053f45beSAndroid Build Coastguard Worker	# complex.
129*053f45beSAndroid Build Coastguard Worker	KMOD_VERSION=$(kmod --version | awk '{print $3}')
130*053f45beSAndroid Build Coastguard Worker	if [[ $KMOD_VERSION  -le 19 ]]; then
131*053f45beSAndroid Build Coastguard Worker		echo "$0: You need at least kmod 20" >&2
132*053f45beSAndroid Build Coastguard Worker		echo "kmod <= 19 is buggy, for details see:" >&2
133*053f45beSAndroid Build Coastguard Worker		echo "https://git.kernel.org/cgit/utils/kernel/kmod/kmod.git/commit/libkmod/libkmod-module.c?id=fd44a98ae2eb5eb32161088954ab21e58e19dfc4" >&2
134*053f45beSAndroid Build Coastguard Worker		exit $ksft_skip
135*053f45beSAndroid Build Coastguard Worker	fi
136*053f45beSAndroid Build Coastguard Worker
137*053f45beSAndroid Build Coastguard Worker	uid=$(id -u)
138*053f45beSAndroid Build Coastguard Worker	if [ $uid -ne 0 ]; then
139*053f45beSAndroid Build Coastguard Worker		echo $msg must be run as root >&2
140*053f45beSAndroid Build Coastguard Worker		exit $ksft_skip
141*053f45beSAndroid Build Coastguard Worker	fi
142*053f45beSAndroid Build Coastguard Worker}
143*053f45beSAndroid Build Coastguard Worker
144*053f45beSAndroid Build Coastguard Workerfunction load_req_mod()
145*053f45beSAndroid Build Coastguard Worker{
146*053f45beSAndroid Build Coastguard Worker	trap "test_modprobe" EXIT
147*053f45beSAndroid Build Coastguard Worker
148*053f45beSAndroid Build Coastguard Worker	if [ ! -d $DIR ]; then
149*053f45beSAndroid Build Coastguard Worker		# Alanis: "Oh isn't it ironic?"
150*053f45beSAndroid Build Coastguard Worker		modprobe $TEST_DRIVER
151*053f45beSAndroid Build Coastguard Worker	fi
152*053f45beSAndroid Build Coastguard Worker}
153*053f45beSAndroid Build Coastguard Worker
154*053f45beSAndroid Build Coastguard Workertest_finish()
155*053f45beSAndroid Build Coastguard Worker{
156*053f45beSAndroid Build Coastguard Worker	echo "$MODPROBE" > /proc/sys/kernel/modprobe
157*053f45beSAndroid Build Coastguard Worker	echo "Test completed"
158*053f45beSAndroid Build Coastguard Worker}
159*053f45beSAndroid Build Coastguard Worker
160*053f45beSAndroid Build Coastguard Workererrno_name_to_val()
161*053f45beSAndroid Build Coastguard Worker{
162*053f45beSAndroid Build Coastguard Worker	case "$1" in
163*053f45beSAndroid Build Coastguard Worker	# kmod calls modprobe and upon of a module not found
164*053f45beSAndroid Build Coastguard Worker	# modprobe returns just 1... However in the kernel we
165*053f45beSAndroid Build Coastguard Worker	# *sometimes* see 256...
166*053f45beSAndroid Build Coastguard Worker	MODULE_NOT_FOUND)
167*053f45beSAndroid Build Coastguard Worker		echo 256;;
168*053f45beSAndroid Build Coastguard Worker	SUCCESS)
169*053f45beSAndroid Build Coastguard Worker		echo 0;;
170*053f45beSAndroid Build Coastguard Worker	-EPERM)
171*053f45beSAndroid Build Coastguard Worker		echo -1;;
172*053f45beSAndroid Build Coastguard Worker	-ENOENT)
173*053f45beSAndroid Build Coastguard Worker		echo -2;;
174*053f45beSAndroid Build Coastguard Worker	-EINVAL)
175*053f45beSAndroid Build Coastguard Worker		echo -22;;
176*053f45beSAndroid Build Coastguard Worker	-ERR_ANY)
177*053f45beSAndroid Build Coastguard Worker		echo -123456;;
178*053f45beSAndroid Build Coastguard Worker	*)
179*053f45beSAndroid Build Coastguard Worker		echo invalid;;
180*053f45beSAndroid Build Coastguard Worker	esac
181*053f45beSAndroid Build Coastguard Worker}
182*053f45beSAndroid Build Coastguard Worker
183*053f45beSAndroid Build Coastguard Workererrno_val_to_name()
184*053f45beSAndroid Build Coastguard Worker	case "$1" in
185*053f45beSAndroid Build Coastguard Worker	256)
186*053f45beSAndroid Build Coastguard Worker		echo MODULE_NOT_FOUND;;
187*053f45beSAndroid Build Coastguard Worker	0)
188*053f45beSAndroid Build Coastguard Worker		echo SUCCESS;;
189*053f45beSAndroid Build Coastguard Worker	-1)
190*053f45beSAndroid Build Coastguard Worker		echo -EPERM;;
191*053f45beSAndroid Build Coastguard Worker	-2)
192*053f45beSAndroid Build Coastguard Worker		echo -ENOENT;;
193*053f45beSAndroid Build Coastguard Worker	-22)
194*053f45beSAndroid Build Coastguard Worker		echo -EINVAL;;
195*053f45beSAndroid Build Coastguard Worker	-123456)
196*053f45beSAndroid Build Coastguard Worker		echo -ERR_ANY;;
197*053f45beSAndroid Build Coastguard Worker	*)
198*053f45beSAndroid Build Coastguard Worker		echo invalid;;
199*053f45beSAndroid Build Coastguard Worker	esac
200*053f45beSAndroid Build Coastguard Worker
201*053f45beSAndroid Build Coastguard Workerconfig_set_test_case_driver()
202*053f45beSAndroid Build Coastguard Worker{
203*053f45beSAndroid Build Coastguard Worker	if ! echo -n 1 >$DIR/config_test_case; then
204*053f45beSAndroid Build Coastguard Worker		echo "$0: Unable to set to test case to driver" >&2
205*053f45beSAndroid Build Coastguard Worker		exit 1
206*053f45beSAndroid Build Coastguard Worker	fi
207*053f45beSAndroid Build Coastguard Worker}
208*053f45beSAndroid Build Coastguard Worker
209*053f45beSAndroid Build Coastguard Workerconfig_set_test_case_fs()
210*053f45beSAndroid Build Coastguard Worker{
211*053f45beSAndroid Build Coastguard Worker	if ! echo -n 2 >$DIR/config_test_case; then
212*053f45beSAndroid Build Coastguard Worker		echo "$0: Unable to set to test case to fs" >&2
213*053f45beSAndroid Build Coastguard Worker		exit 1
214*053f45beSAndroid Build Coastguard Worker	fi
215*053f45beSAndroid Build Coastguard Worker}
216*053f45beSAndroid Build Coastguard Worker
217*053f45beSAndroid Build Coastguard Workerconfig_num_threads()
218*053f45beSAndroid Build Coastguard Worker{
219*053f45beSAndroid Build Coastguard Worker	if ! echo -n $1 >$DIR/config_num_threads; then
220*053f45beSAndroid Build Coastguard Worker		echo "$0: Unable to set to number of threads" >&2
221*053f45beSAndroid Build Coastguard Worker		exit 1
222*053f45beSAndroid Build Coastguard Worker	fi
223*053f45beSAndroid Build Coastguard Worker}
224*053f45beSAndroid Build Coastguard Worker
225*053f45beSAndroid Build Coastguard Workerconfig_get_modprobe_limit()
226*053f45beSAndroid Build Coastguard Worker{
227*053f45beSAndroid Build Coastguard Worker	if [[ -f ${MODPROBE_LIMIT_FILE} ]] ; then
228*053f45beSAndroid Build Coastguard Worker		MODPROBE_LIMIT=$(cat $MODPROBE_LIMIT_FILE)
229*053f45beSAndroid Build Coastguard Worker	fi
230*053f45beSAndroid Build Coastguard Worker	echo $MODPROBE_LIMIT
231*053f45beSAndroid Build Coastguard Worker}
232*053f45beSAndroid Build Coastguard Worker
233*053f45beSAndroid Build Coastguard Workerconfig_num_thread_limit_extra()
234*053f45beSAndroid Build Coastguard Worker{
235*053f45beSAndroid Build Coastguard Worker	MODPROBE_LIMIT=$(config_get_modprobe_limit)
236*053f45beSAndroid Build Coastguard Worker	let EXTRA_LIMIT=$MODPROBE_LIMIT+$1
237*053f45beSAndroid Build Coastguard Worker	config_num_threads $EXTRA_LIMIT
238*053f45beSAndroid Build Coastguard Worker}
239*053f45beSAndroid Build Coastguard Worker
240*053f45beSAndroid Build Coastguard Worker# For special characters use printf directly,
241*053f45beSAndroid Build Coastguard Worker# refer to kmod_test_0001
242*053f45beSAndroid Build Coastguard Workerconfig_set_driver()
243*053f45beSAndroid Build Coastguard Worker{
244*053f45beSAndroid Build Coastguard Worker	if ! echo -n $1 >$DIR/config_test_driver; then
245*053f45beSAndroid Build Coastguard Worker		echo "$0: Unable to set driver" >&2
246*053f45beSAndroid Build Coastguard Worker		exit 1
247*053f45beSAndroid Build Coastguard Worker	fi
248*053f45beSAndroid Build Coastguard Worker}
249*053f45beSAndroid Build Coastguard Worker
250*053f45beSAndroid Build Coastguard Workerconfig_set_fs()
251*053f45beSAndroid Build Coastguard Worker{
252*053f45beSAndroid Build Coastguard Worker	if ! echo -n $1 >$DIR/config_test_fs; then
253*053f45beSAndroid Build Coastguard Worker		echo "$0: Unable to set driver" >&2
254*053f45beSAndroid Build Coastguard Worker		exit 1
255*053f45beSAndroid Build Coastguard Worker	fi
256*053f45beSAndroid Build Coastguard Worker}
257*053f45beSAndroid Build Coastguard Worker
258*053f45beSAndroid Build Coastguard Workerconfig_get_driver()
259*053f45beSAndroid Build Coastguard Worker{
260*053f45beSAndroid Build Coastguard Worker	cat $DIR/config_test_driver
261*053f45beSAndroid Build Coastguard Worker}
262*053f45beSAndroid Build Coastguard Worker
263*053f45beSAndroid Build Coastguard Workerconfig_get_test_result()
264*053f45beSAndroid Build Coastguard Worker{
265*053f45beSAndroid Build Coastguard Worker	cat $DIR/test_result
266*053f45beSAndroid Build Coastguard Worker}
267*053f45beSAndroid Build Coastguard Worker
268*053f45beSAndroid Build Coastguard Workerconfig_reset()
269*053f45beSAndroid Build Coastguard Worker{
270*053f45beSAndroid Build Coastguard Worker	if ! echo -n "1" >"$DIR"/reset; then
271*053f45beSAndroid Build Coastguard Worker		echo "$0: reset should have worked" >&2
272*053f45beSAndroid Build Coastguard Worker		exit 1
273*053f45beSAndroid Build Coastguard Worker	fi
274*053f45beSAndroid Build Coastguard Worker}
275*053f45beSAndroid Build Coastguard Worker
276*053f45beSAndroid Build Coastguard Workerconfig_show_config()
277*053f45beSAndroid Build Coastguard Worker{
278*053f45beSAndroid Build Coastguard Worker	echo "----------------------------------------------------"
279*053f45beSAndroid Build Coastguard Worker	cat "$DIR"/config
280*053f45beSAndroid Build Coastguard Worker	echo "----------------------------------------------------"
281*053f45beSAndroid Build Coastguard Worker}
282*053f45beSAndroid Build Coastguard Worker
283*053f45beSAndroid Build Coastguard Workerconfig_trigger()
284*053f45beSAndroid Build Coastguard Worker{
285*053f45beSAndroid Build Coastguard Worker	if ! echo -n "1" >"$DIR"/trigger_config 2>/dev/null; then
286*053f45beSAndroid Build Coastguard Worker		echo "$1: FAIL - loading should have worked"
287*053f45beSAndroid Build Coastguard Worker		config_show_config
288*053f45beSAndroid Build Coastguard Worker		exit 1
289*053f45beSAndroid Build Coastguard Worker	fi
290*053f45beSAndroid Build Coastguard Worker	echo "$1: OK! - loading kmod test"
291*053f45beSAndroid Build Coastguard Worker}
292*053f45beSAndroid Build Coastguard Worker
293*053f45beSAndroid Build Coastguard Workerconfig_trigger_want_fail()
294*053f45beSAndroid Build Coastguard Worker{
295*053f45beSAndroid Build Coastguard Worker	if echo "1" > $DIR/trigger_config 2>/dev/null; then
296*053f45beSAndroid Build Coastguard Worker		echo "$1: FAIL - test case was expected to fail"
297*053f45beSAndroid Build Coastguard Worker		config_show_config
298*053f45beSAndroid Build Coastguard Worker		exit 1
299*053f45beSAndroid Build Coastguard Worker	fi
300*053f45beSAndroid Build Coastguard Worker	echo "$1: OK! - kmod test case failed as expected"
301*053f45beSAndroid Build Coastguard Worker}
302*053f45beSAndroid Build Coastguard Worker
303*053f45beSAndroid Build Coastguard Workerconfig_expect_result()
304*053f45beSAndroid Build Coastguard Worker{
305*053f45beSAndroid Build Coastguard Worker	RC=$(config_get_test_result)
306*053f45beSAndroid Build Coastguard Worker	RC_NAME=$(errno_val_to_name $RC)
307*053f45beSAndroid Build Coastguard Worker
308*053f45beSAndroid Build Coastguard Worker	ERRNO_NAME=$2
309*053f45beSAndroid Build Coastguard Worker	ERRNO=$(errno_name_to_val $ERRNO_NAME)
310*053f45beSAndroid Build Coastguard Worker
311*053f45beSAndroid Build Coastguard Worker	if [[ $ERRNO_NAME = "-ERR_ANY" ]]; then
312*053f45beSAndroid Build Coastguard Worker		if [[ $RC -ge 0 ]]; then
313*053f45beSAndroid Build Coastguard Worker			echo "$1: FAIL, test expects $ERRNO_NAME - got $RC_NAME ($RC)" >&2
314*053f45beSAndroid Build Coastguard Worker			config_show_config
315*053f45beSAndroid Build Coastguard Worker			exit 1
316*053f45beSAndroid Build Coastguard Worker		fi
317*053f45beSAndroid Build Coastguard Worker	elif [[ $RC != $ERRNO ]]; then
318*053f45beSAndroid Build Coastguard Worker		echo "$1: FAIL, test expects $ERRNO_NAME ($ERRNO) - got $RC_NAME ($RC)" >&2
319*053f45beSAndroid Build Coastguard Worker		config_show_config
320*053f45beSAndroid Build Coastguard Worker		exit 1
321*053f45beSAndroid Build Coastguard Worker	fi
322*053f45beSAndroid Build Coastguard Worker	echo "$1: OK! - Return value: $RC ($RC_NAME), expected $ERRNO_NAME"
323*053f45beSAndroid Build Coastguard Worker}
324*053f45beSAndroid Build Coastguard Worker
325*053f45beSAndroid Build Coastguard Workerkmod_defaults_driver()
326*053f45beSAndroid Build Coastguard Worker{
327*053f45beSAndroid Build Coastguard Worker	config_reset
328*053f45beSAndroid Build Coastguard Worker	modprobe -r $DEFAULT_KMOD_DRIVER
329*053f45beSAndroid Build Coastguard Worker	config_set_driver $DEFAULT_KMOD_DRIVER
330*053f45beSAndroid Build Coastguard Worker}
331*053f45beSAndroid Build Coastguard Worker
332*053f45beSAndroid Build Coastguard Workerkmod_defaults_fs()
333*053f45beSAndroid Build Coastguard Worker{
334*053f45beSAndroid Build Coastguard Worker	config_reset
335*053f45beSAndroid Build Coastguard Worker	modprobe -r $DEFAULT_KMOD_FS
336*053f45beSAndroid Build Coastguard Worker	config_set_fs $DEFAULT_KMOD_FS
337*053f45beSAndroid Build Coastguard Worker	config_set_test_case_fs
338*053f45beSAndroid Build Coastguard Worker}
339*053f45beSAndroid Build Coastguard Worker
340*053f45beSAndroid Build Coastguard Workerkmod_test_0001_driver()
341*053f45beSAndroid Build Coastguard Worker{
342*053f45beSAndroid Build Coastguard Worker	NAME='\000'
343*053f45beSAndroid Build Coastguard Worker
344*053f45beSAndroid Build Coastguard Worker	kmod_defaults_driver
345*053f45beSAndroid Build Coastguard Worker	config_num_threads 1
346*053f45beSAndroid Build Coastguard Worker	printf $NAME >"$DIR"/config_test_driver
347*053f45beSAndroid Build Coastguard Worker	config_trigger ${FUNCNAME[0]}
348*053f45beSAndroid Build Coastguard Worker	config_expect_result ${FUNCNAME[0]} MODULE_NOT_FOUND
349*053f45beSAndroid Build Coastguard Worker}
350*053f45beSAndroid Build Coastguard Worker
351*053f45beSAndroid Build Coastguard Workerkmod_test_0001_fs()
352*053f45beSAndroid Build Coastguard Worker{
353*053f45beSAndroid Build Coastguard Worker	NAME='\000'
354*053f45beSAndroid Build Coastguard Worker
355*053f45beSAndroid Build Coastguard Worker	kmod_defaults_fs
356*053f45beSAndroid Build Coastguard Worker	config_num_threads 1
357*053f45beSAndroid Build Coastguard Worker	printf $NAME >"$DIR"/config_test_fs
358*053f45beSAndroid Build Coastguard Worker	config_trigger ${FUNCNAME[0]}
359*053f45beSAndroid Build Coastguard Worker	config_expect_result ${FUNCNAME[0]} -EINVAL
360*053f45beSAndroid Build Coastguard Worker}
361*053f45beSAndroid Build Coastguard Worker
362*053f45beSAndroid Build Coastguard Workerkmod_test_0001()
363*053f45beSAndroid Build Coastguard Worker{
364*053f45beSAndroid Build Coastguard Worker	kmod_test_0001_driver
365*053f45beSAndroid Build Coastguard Worker	kmod_test_0001_fs
366*053f45beSAndroid Build Coastguard Worker}
367*053f45beSAndroid Build Coastguard Worker
368*053f45beSAndroid Build Coastguard Workerkmod_test_0002_driver()
369*053f45beSAndroid Build Coastguard Worker{
370*053f45beSAndroid Build Coastguard Worker	NAME="nope-$DEFAULT_KMOD_DRIVER"
371*053f45beSAndroid Build Coastguard Worker
372*053f45beSAndroid Build Coastguard Worker	kmod_defaults_driver
373*053f45beSAndroid Build Coastguard Worker	config_set_driver $NAME
374*053f45beSAndroid Build Coastguard Worker	config_num_threads 1
375*053f45beSAndroid Build Coastguard Worker	config_trigger ${FUNCNAME[0]}
376*053f45beSAndroid Build Coastguard Worker	config_expect_result ${FUNCNAME[0]} MODULE_NOT_FOUND
377*053f45beSAndroid Build Coastguard Worker}
378*053f45beSAndroid Build Coastguard Worker
379*053f45beSAndroid Build Coastguard Workerkmod_test_0002_fs()
380*053f45beSAndroid Build Coastguard Worker{
381*053f45beSAndroid Build Coastguard Worker	NAME="nope-$DEFAULT_KMOD_FS"
382*053f45beSAndroid Build Coastguard Worker
383*053f45beSAndroid Build Coastguard Worker	kmod_defaults_fs
384*053f45beSAndroid Build Coastguard Worker	config_set_fs $NAME
385*053f45beSAndroid Build Coastguard Worker	config_trigger ${FUNCNAME[0]}
386*053f45beSAndroid Build Coastguard Worker	config_expect_result ${FUNCNAME[0]} -EINVAL
387*053f45beSAndroid Build Coastguard Worker}
388*053f45beSAndroid Build Coastguard Worker
389*053f45beSAndroid Build Coastguard Workerkmod_test_0002()
390*053f45beSAndroid Build Coastguard Worker{
391*053f45beSAndroid Build Coastguard Worker	kmod_test_0002_driver
392*053f45beSAndroid Build Coastguard Worker	kmod_test_0002_fs
393*053f45beSAndroid Build Coastguard Worker}
394*053f45beSAndroid Build Coastguard Worker
395*053f45beSAndroid Build Coastguard Workerkmod_test_0003()
396*053f45beSAndroid Build Coastguard Worker{
397*053f45beSAndroid Build Coastguard Worker	kmod_defaults_fs
398*053f45beSAndroid Build Coastguard Worker	config_num_threads 1
399*053f45beSAndroid Build Coastguard Worker	config_trigger ${FUNCNAME[0]}
400*053f45beSAndroid Build Coastguard Worker	config_expect_result ${FUNCNAME[0]} SUCCESS
401*053f45beSAndroid Build Coastguard Worker}
402*053f45beSAndroid Build Coastguard Worker
403*053f45beSAndroid Build Coastguard Workerkmod_test_0004()
404*053f45beSAndroid Build Coastguard Worker{
405*053f45beSAndroid Build Coastguard Worker	kmod_defaults_fs
406*053f45beSAndroid Build Coastguard Worker	config_num_threads 2
407*053f45beSAndroid Build Coastguard Worker	config_trigger ${FUNCNAME[0]}
408*053f45beSAndroid Build Coastguard Worker	config_expect_result ${FUNCNAME[0]} SUCCESS
409*053f45beSAndroid Build Coastguard Worker}
410*053f45beSAndroid Build Coastguard Worker
411*053f45beSAndroid Build Coastguard Workerkmod_test_0005()
412*053f45beSAndroid Build Coastguard Worker{
413*053f45beSAndroid Build Coastguard Worker	kmod_defaults_driver
414*053f45beSAndroid Build Coastguard Worker	config_trigger ${FUNCNAME[0]}
415*053f45beSAndroid Build Coastguard Worker	config_expect_result ${FUNCNAME[0]} SUCCESS
416*053f45beSAndroid Build Coastguard Worker}
417*053f45beSAndroid Build Coastguard Worker
418*053f45beSAndroid Build Coastguard Workerkmod_test_0006()
419*053f45beSAndroid Build Coastguard Worker{
420*053f45beSAndroid Build Coastguard Worker	kmod_defaults_fs
421*053f45beSAndroid Build Coastguard Worker	config_trigger ${FUNCNAME[0]}
422*053f45beSAndroid Build Coastguard Worker	config_expect_result ${FUNCNAME[0]} SUCCESS
423*053f45beSAndroid Build Coastguard Worker}
424*053f45beSAndroid Build Coastguard Worker
425*053f45beSAndroid Build Coastguard Workerkmod_test_0007()
426*053f45beSAndroid Build Coastguard Worker{
427*053f45beSAndroid Build Coastguard Worker	kmod_test_0005
428*053f45beSAndroid Build Coastguard Worker	kmod_test_0006
429*053f45beSAndroid Build Coastguard Worker}
430*053f45beSAndroid Build Coastguard Worker
431*053f45beSAndroid Build Coastguard Workerkmod_test_0008()
432*053f45beSAndroid Build Coastguard Worker{
433*053f45beSAndroid Build Coastguard Worker	kmod_defaults_driver
434*053f45beSAndroid Build Coastguard Worker	MODPROBE_LIMIT=$(config_get_modprobe_limit)
435*053f45beSAndroid Build Coastguard Worker	let EXTRA=$MODPROBE_LIMIT/6
436*053f45beSAndroid Build Coastguard Worker	config_num_thread_limit_extra $EXTRA
437*053f45beSAndroid Build Coastguard Worker	config_trigger ${FUNCNAME[0]}
438*053f45beSAndroid Build Coastguard Worker	config_expect_result ${FUNCNAME[0]} SUCCESS
439*053f45beSAndroid Build Coastguard Worker}
440*053f45beSAndroid Build Coastguard Worker
441*053f45beSAndroid Build Coastguard Workerkmod_test_0009()
442*053f45beSAndroid Build Coastguard Worker{
443*053f45beSAndroid Build Coastguard Worker	kmod_defaults_fs
444*053f45beSAndroid Build Coastguard Worker	MODPROBE_LIMIT=$(config_get_modprobe_limit)
445*053f45beSAndroid Build Coastguard Worker	let EXTRA=$MODPROBE_LIMIT/4
446*053f45beSAndroid Build Coastguard Worker	config_num_thread_limit_extra $EXTRA
447*053f45beSAndroid Build Coastguard Worker	config_trigger ${FUNCNAME[0]}
448*053f45beSAndroid Build Coastguard Worker	config_expect_result ${FUNCNAME[0]} SUCCESS
449*053f45beSAndroid Build Coastguard Worker}
450*053f45beSAndroid Build Coastguard Worker
451*053f45beSAndroid Build Coastguard Workerkmod_test_0010()
452*053f45beSAndroid Build Coastguard Worker{
453*053f45beSAndroid Build Coastguard Worker	kmod_defaults_driver
454*053f45beSAndroid Build Coastguard Worker	config_num_threads 1
455*053f45beSAndroid Build Coastguard Worker	echo "/KMOD_TEST_NONEXISTENT" > /proc/sys/kernel/modprobe
456*053f45beSAndroid Build Coastguard Worker	config_trigger ${FUNCNAME[0]}
457*053f45beSAndroid Build Coastguard Worker	config_expect_result ${FUNCNAME[0]} -ENOENT
458*053f45beSAndroid Build Coastguard Worker	echo "$MODPROBE" > /proc/sys/kernel/modprobe
459*053f45beSAndroid Build Coastguard Worker}
460*053f45beSAndroid Build Coastguard Worker
461*053f45beSAndroid Build Coastguard Workerkmod_test_0011()
462*053f45beSAndroid Build Coastguard Worker{
463*053f45beSAndroid Build Coastguard Worker	kmod_defaults_driver
464*053f45beSAndroid Build Coastguard Worker	config_num_threads 1
465*053f45beSAndroid Build Coastguard Worker	# This causes the kernel to not even try executing modprobe.  The error
466*053f45beSAndroid Build Coastguard Worker	# code is still -ENOENT like when modprobe doesn't exist, so we can't
467*053f45beSAndroid Build Coastguard Worker	# easily test for the exact difference.  But this still is a useful test
468*053f45beSAndroid Build Coastguard Worker	# since there was a bug where request_module() returned 0 in this case.
469*053f45beSAndroid Build Coastguard Worker	echo > /proc/sys/kernel/modprobe
470*053f45beSAndroid Build Coastguard Worker	config_trigger ${FUNCNAME[0]}
471*053f45beSAndroid Build Coastguard Worker	config_expect_result ${FUNCNAME[0]} -ENOENT
472*053f45beSAndroid Build Coastguard Worker	echo "$MODPROBE" > /proc/sys/kernel/modprobe
473*053f45beSAndroid Build Coastguard Worker}
474*053f45beSAndroid Build Coastguard Worker
475*053f45beSAndroid Build Coastguard Workerkmod_check_visibility()
476*053f45beSAndroid Build Coastguard Worker{
477*053f45beSAndroid Build Coastguard Worker	local name="$1"
478*053f45beSAndroid Build Coastguard Worker	local cmd="$2"
479*053f45beSAndroid Build Coastguard Worker
480*053f45beSAndroid Build Coastguard Worker	modprobe $DEFAULT_KMOD_DRIVER
481*053f45beSAndroid Build Coastguard Worker
482*053f45beSAndroid Build Coastguard Worker	local priv=$(eval $cmd)
483*053f45beSAndroid Build Coastguard Worker	local unpriv=$(capsh --drop=CAP_SYSLOG -- -c "$cmd")
484*053f45beSAndroid Build Coastguard Worker
485*053f45beSAndroid Build Coastguard Worker	if [ "$priv" = "$unpriv" ] || \
486*053f45beSAndroid Build Coastguard Worker	   [ "${priv:0:3}" = "0x0" ] || \
487*053f45beSAndroid Build Coastguard Worker	   [ "${unpriv:0:3}" != "0x0" ] ; then
488*053f45beSAndroid Build Coastguard Worker		echo "${FUNCNAME[0]}: FAIL, $name visible to unpriv: '$priv' vs '$unpriv'" >&2
489*053f45beSAndroid Build Coastguard Worker		exit 1
490*053f45beSAndroid Build Coastguard Worker	else
491*053f45beSAndroid Build Coastguard Worker		echo "${FUNCNAME[0]}: OK!"
492*053f45beSAndroid Build Coastguard Worker	fi
493*053f45beSAndroid Build Coastguard Worker}
494*053f45beSAndroid Build Coastguard Worker
495*053f45beSAndroid Build Coastguard Workerkmod_test_0012()
496*053f45beSAndroid Build Coastguard Worker{
497*053f45beSAndroid Build Coastguard Worker	kmod_check_visibility /proc/modules \
498*053f45beSAndroid Build Coastguard Worker		"grep '^${DEFAULT_KMOD_DRIVER}\b' /proc/modules | awk '{print \$NF}'"
499*053f45beSAndroid Build Coastguard Worker}
500*053f45beSAndroid Build Coastguard Worker
501*053f45beSAndroid Build Coastguard Workerkmod_test_0013()
502*053f45beSAndroid Build Coastguard Worker{
503*053f45beSAndroid Build Coastguard Worker	kmod_check_visibility '/sys/module/*/sections/*' \
504*053f45beSAndroid Build Coastguard Worker		"cat /sys/module/${DEFAULT_KMOD_DRIVER}/sections/.*text | head -n1"
505*053f45beSAndroid Build Coastguard Worker}
506*053f45beSAndroid Build Coastguard Worker
507*053f45beSAndroid Build Coastguard Workerlist_tests()
508*053f45beSAndroid Build Coastguard Worker{
509*053f45beSAndroid Build Coastguard Worker	echo "Test ID list:"
510*053f45beSAndroid Build Coastguard Worker	echo
511*053f45beSAndroid Build Coastguard Worker	echo "TEST_ID x NUM_TEST"
512*053f45beSAndroid Build Coastguard Worker	echo "TEST_ID:   Test ID"
513*053f45beSAndroid Build Coastguard Worker	echo "NUM_TESTS: Number of recommended times to run the test"
514*053f45beSAndroid Build Coastguard Worker	echo
515*053f45beSAndroid Build Coastguard Worker	echo "0001 x $(get_test_count 0001) - Simple test - 1 thread  for empty string"
516*053f45beSAndroid Build Coastguard Worker	echo "0002 x $(get_test_count 0002) - Simple test - 1 thread  for modules/filesystems that do not exist"
517*053f45beSAndroid Build Coastguard Worker	echo "0003 x $(get_test_count 0003) - Simple test - 1 thread  for get_fs_type() only"
518*053f45beSAndroid Build Coastguard Worker	echo "0004 x $(get_test_count 0004) - Simple test - 2 threads for get_fs_type() only"
519*053f45beSAndroid Build Coastguard Worker	echo "0005 x $(get_test_count 0005) - multithreaded tests with default setup - request_module() only"
520*053f45beSAndroid Build Coastguard Worker	echo "0006 x $(get_test_count 0006) - multithreaded tests with default setup - get_fs_type() only"
521*053f45beSAndroid Build Coastguard Worker	echo "0007 x $(get_test_count 0007) - multithreaded tests with default setup test request_module() and get_fs_type()"
522*053f45beSAndroid Build Coastguard Worker	echo "0008 x $(get_test_count 0008) - multithreaded - push kmod_concurrent over max_modprobes for request_module()"
523*053f45beSAndroid Build Coastguard Worker	echo "0009 x $(get_test_count 0009) - multithreaded - push kmod_concurrent over max_modprobes for get_fs_type()"
524*053f45beSAndroid Build Coastguard Worker	echo "0010 x $(get_test_count 0010) - test nonexistent modprobe path"
525*053f45beSAndroid Build Coastguard Worker	echo "0011 x $(get_test_count 0011) - test completely disabling module autoloading"
526*053f45beSAndroid Build Coastguard Worker	echo "0012 x $(get_test_count 0012) - test /proc/modules address visibility under CAP_SYSLOG"
527*053f45beSAndroid Build Coastguard Worker	echo "0013 x $(get_test_count 0013) - test /sys/module/*/sections/* visibility under CAP_SYSLOG"
528*053f45beSAndroid Build Coastguard Worker}
529*053f45beSAndroid Build Coastguard Worker
530*053f45beSAndroid Build Coastguard Workerusage()
531*053f45beSAndroid Build Coastguard Worker{
532*053f45beSAndroid Build Coastguard Worker	NUM_TESTS=$(grep -o ' ' <<<"$ALL_TESTS" | grep -c .)
533*053f45beSAndroid Build Coastguard Worker	let NUM_TESTS=$NUM_TESTS+1
534*053f45beSAndroid Build Coastguard Worker	MAX_TEST=$(printf "%04d\n" $NUM_TESTS)
535*053f45beSAndroid Build Coastguard Worker	echo "Usage: $0 [ -t <4-number-digit> ] | [ -w <4-number-digit> ] |"
536*053f45beSAndroid Build Coastguard Worker	echo "		 [ -s <4-number-digit> ] | [ -c <4-number-digit> <test- count>"
537*053f45beSAndroid Build Coastguard Worker	echo "           [ all ] [ -h | --help ] [ -l ]"
538*053f45beSAndroid Build Coastguard Worker	echo ""
539*053f45beSAndroid Build Coastguard Worker	echo "Valid tests: 0001-$MAX_TEST"
540*053f45beSAndroid Build Coastguard Worker	echo ""
541*053f45beSAndroid Build Coastguard Worker	echo "    all     Runs all tests (default)"
542*053f45beSAndroid Build Coastguard Worker	echo "    -t      Run test ID the number amount of times is recommended"
543*053f45beSAndroid Build Coastguard Worker	echo "    -w      Watch test ID run until it runs into an error"
544*053f45beSAndroid Build Coastguard Worker	echo "    -s      Run test ID once"
545*053f45beSAndroid Build Coastguard Worker	echo "    -c      Run test ID x test-count number of times"
546*053f45beSAndroid Build Coastguard Worker	echo "    -l      List all test ID list"
547*053f45beSAndroid Build Coastguard Worker	echo " -h|--help  Help"
548*053f45beSAndroid Build Coastguard Worker	echo
549*053f45beSAndroid Build Coastguard Worker	echo "If an error every occurs execution will immediately terminate."
550*053f45beSAndroid Build Coastguard Worker	echo "If you are adding a new test try using -w <test-ID> first to"
551*053f45beSAndroid Build Coastguard Worker	echo "make sure the test passes a series of tests."
552*053f45beSAndroid Build Coastguard Worker	echo
553*053f45beSAndroid Build Coastguard Worker	echo Example uses:
554*053f45beSAndroid Build Coastguard Worker	echo
555*053f45beSAndroid Build Coastguard Worker	echo "${TEST_NAME}.sh		-- executes all tests"
556*053f45beSAndroid Build Coastguard Worker	echo "${TEST_NAME}.sh -t 0008	-- Executes test ID 0008 number of times is recommended"
557*053f45beSAndroid Build Coastguard Worker	echo "${TEST_NAME}.sh -w 0008	-- Watch test ID 0008 run until an error occurs"
558*053f45beSAndroid Build Coastguard Worker	echo "${TEST_NAME}.sh -s 0008	-- Run test ID 0008 once"
559*053f45beSAndroid Build Coastguard Worker	echo "${TEST_NAME}.sh -c 0008 3	-- Run test ID 0008 three times"
560*053f45beSAndroid Build Coastguard Worker	echo
561*053f45beSAndroid Build Coastguard Worker	list_tests
562*053f45beSAndroid Build Coastguard Worker	exit 1
563*053f45beSAndroid Build Coastguard Worker}
564*053f45beSAndroid Build Coastguard Worker
565*053f45beSAndroid Build Coastguard Workerfunction test_num()
566*053f45beSAndroid Build Coastguard Worker{
567*053f45beSAndroid Build Coastguard Worker	re='^[0-9]+$'
568*053f45beSAndroid Build Coastguard Worker	if ! [[ $1 =~ $re ]]; then
569*053f45beSAndroid Build Coastguard Worker		usage
570*053f45beSAndroid Build Coastguard Worker	fi
571*053f45beSAndroid Build Coastguard Worker}
572*053f45beSAndroid Build Coastguard Worker
573*053f45beSAndroid Build Coastguard Workerfunction get_test_data()
574*053f45beSAndroid Build Coastguard Worker{
575*053f45beSAndroid Build Coastguard Worker	test_num $1
576*053f45beSAndroid Build Coastguard Worker	local field_num=$(echo $1 | sed 's/^0*//')
577*053f45beSAndroid Build Coastguard Worker	echo $ALL_TESTS | awk '{print $'$field_num'}'
578*053f45beSAndroid Build Coastguard Worker}
579*053f45beSAndroid Build Coastguard Worker
580*053f45beSAndroid Build Coastguard Workerfunction get_test_count()
581*053f45beSAndroid Build Coastguard Worker{
582*053f45beSAndroid Build Coastguard Worker	TEST_DATA=$(get_test_data $1)
583*053f45beSAndroid Build Coastguard Worker	LAST_TWO=${TEST_DATA#*:*}
584*053f45beSAndroid Build Coastguard Worker	echo ${LAST_TWO%:*}
585*053f45beSAndroid Build Coastguard Worker}
586*053f45beSAndroid Build Coastguard Worker
587*053f45beSAndroid Build Coastguard Workerfunction get_test_enabled()
588*053f45beSAndroid Build Coastguard Worker{
589*053f45beSAndroid Build Coastguard Worker	TEST_DATA=$(get_test_data $1)
590*053f45beSAndroid Build Coastguard Worker	echo ${TEST_DATA#*:*:}
591*053f45beSAndroid Build Coastguard Worker}
592*053f45beSAndroid Build Coastguard Worker
593*053f45beSAndroid Build Coastguard Workerfunction run_all_tests()
594*053f45beSAndroid Build Coastguard Worker{
595*053f45beSAndroid Build Coastguard Worker	for i in $ALL_TESTS ; do
596*053f45beSAndroid Build Coastguard Worker		TEST_ID=${i%:*:*}
597*053f45beSAndroid Build Coastguard Worker		ENABLED=$(get_test_enabled $TEST_ID)
598*053f45beSAndroid Build Coastguard Worker		TEST_COUNT=$(get_test_count $TEST_ID)
599*053f45beSAndroid Build Coastguard Worker		if [[ $ENABLED -eq "1" ]]; then
600*053f45beSAndroid Build Coastguard Worker			test_case $TEST_ID $TEST_COUNT
601*053f45beSAndroid Build Coastguard Worker		fi
602*053f45beSAndroid Build Coastguard Worker	done
603*053f45beSAndroid Build Coastguard Worker}
604*053f45beSAndroid Build Coastguard Worker
605*053f45beSAndroid Build Coastguard Workerfunction watch_log()
606*053f45beSAndroid Build Coastguard Worker{
607*053f45beSAndroid Build Coastguard Worker	if [ $# -ne 3 ]; then
608*053f45beSAndroid Build Coastguard Worker		clear
609*053f45beSAndroid Build Coastguard Worker	fi
610*053f45beSAndroid Build Coastguard Worker	date
611*053f45beSAndroid Build Coastguard Worker	echo "Running test: $2 - run #$1"
612*053f45beSAndroid Build Coastguard Worker}
613*053f45beSAndroid Build Coastguard Worker
614*053f45beSAndroid Build Coastguard Workerfunction watch_case()
615*053f45beSAndroid Build Coastguard Worker{
616*053f45beSAndroid Build Coastguard Worker	i=0
617*053f45beSAndroid Build Coastguard Worker	while [ 1 ]; do
618*053f45beSAndroid Build Coastguard Worker
619*053f45beSAndroid Build Coastguard Worker		if [ $# -eq 1 ]; then
620*053f45beSAndroid Build Coastguard Worker			test_num $1
621*053f45beSAndroid Build Coastguard Worker			watch_log $i ${TEST_NAME}_test_$1
622*053f45beSAndroid Build Coastguard Worker			${TEST_NAME}_test_$1
623*053f45beSAndroid Build Coastguard Worker		else
624*053f45beSAndroid Build Coastguard Worker			watch_log $i all
625*053f45beSAndroid Build Coastguard Worker			run_all_tests
626*053f45beSAndroid Build Coastguard Worker		fi
627*053f45beSAndroid Build Coastguard Worker		let i=$i+1
628*053f45beSAndroid Build Coastguard Worker	done
629*053f45beSAndroid Build Coastguard Worker}
630*053f45beSAndroid Build Coastguard Worker
631*053f45beSAndroid Build Coastguard Workerfunction test_case()
632*053f45beSAndroid Build Coastguard Worker{
633*053f45beSAndroid Build Coastguard Worker	NUM_TESTS=$DEFAULT_NUM_TESTS
634*053f45beSAndroid Build Coastguard Worker	if [ $# -eq 2 ]; then
635*053f45beSAndroid Build Coastguard Worker		NUM_TESTS=$2
636*053f45beSAndroid Build Coastguard Worker	fi
637*053f45beSAndroid Build Coastguard Worker
638*053f45beSAndroid Build Coastguard Worker	i=0
639*053f45beSAndroid Build Coastguard Worker	while [ $i -lt $NUM_TESTS ]; do
640*053f45beSAndroid Build Coastguard Worker		test_num $1
641*053f45beSAndroid Build Coastguard Worker		watch_log $i ${TEST_NAME}_test_$1 noclear
642*053f45beSAndroid Build Coastguard Worker		RUN_TEST=${TEST_NAME}_test_$1
643*053f45beSAndroid Build Coastguard Worker		$RUN_TEST
644*053f45beSAndroid Build Coastguard Worker		let i=$i+1
645*053f45beSAndroid Build Coastguard Worker	done
646*053f45beSAndroid Build Coastguard Worker}
647*053f45beSAndroid Build Coastguard Worker
648*053f45beSAndroid Build Coastguard Workerfunction parse_args()
649*053f45beSAndroid Build Coastguard Worker{
650*053f45beSAndroid Build Coastguard Worker	if [ $# -eq 0 ]; then
651*053f45beSAndroid Build Coastguard Worker		run_all_tests
652*053f45beSAndroid Build Coastguard Worker	else
653*053f45beSAndroid Build Coastguard Worker		if [[ "$1" = "all" ]]; then
654*053f45beSAndroid Build Coastguard Worker			run_all_tests
655*053f45beSAndroid Build Coastguard Worker		elif [[ "$1" = "-w" ]]; then
656*053f45beSAndroid Build Coastguard Worker			shift
657*053f45beSAndroid Build Coastguard Worker			watch_case $@
658*053f45beSAndroid Build Coastguard Worker		elif [[ "$1" = "-t" ]]; then
659*053f45beSAndroid Build Coastguard Worker			shift
660*053f45beSAndroid Build Coastguard Worker			test_num $1
661*053f45beSAndroid Build Coastguard Worker			test_case $1 $(get_test_count $1)
662*053f45beSAndroid Build Coastguard Worker		elif [[ "$1" = "-c" ]]; then
663*053f45beSAndroid Build Coastguard Worker			shift
664*053f45beSAndroid Build Coastguard Worker			test_num $1
665*053f45beSAndroid Build Coastguard Worker			test_num $2
666*053f45beSAndroid Build Coastguard Worker			test_case $1 $2
667*053f45beSAndroid Build Coastguard Worker		elif [[ "$1" = "-s" ]]; then
668*053f45beSAndroid Build Coastguard Worker			shift
669*053f45beSAndroid Build Coastguard Worker			test_case $1 1
670*053f45beSAndroid Build Coastguard Worker		elif [[ "$1" = "-l" ]]; then
671*053f45beSAndroid Build Coastguard Worker			list_tests
672*053f45beSAndroid Build Coastguard Worker		elif [[ "$1" = "-h" || "$1" = "--help" ]]; then
673*053f45beSAndroid Build Coastguard Worker			usage
674*053f45beSAndroid Build Coastguard Worker		else
675*053f45beSAndroid Build Coastguard Worker			usage
676*053f45beSAndroid Build Coastguard Worker		fi
677*053f45beSAndroid Build Coastguard Worker	fi
678*053f45beSAndroid Build Coastguard Worker}
679*053f45beSAndroid Build Coastguard Worker
680*053f45beSAndroid Build Coastguard Workertest_reqs
681*053f45beSAndroid Build Coastguard Workerallow_user_defaults
682*053f45beSAndroid Build Coastguard Workerload_req_mod
683*053f45beSAndroid Build Coastguard Worker
684*053f45beSAndroid Build Coastguard WorkerMODPROBE=$(</proc/sys/kernel/modprobe)
685*053f45beSAndroid Build Coastguard Workertrap "test_finish" EXIT
686*053f45beSAndroid Build Coastguard Worker
687*053f45beSAndroid Build Coastguard Workerparse_args $@
688*053f45beSAndroid Build Coastguard Worker
689*053f45beSAndroid Build Coastguard Workerexit 0
690