xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/sysctl/sysctl.sh (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
1*053f45beSAndroid Build Coastguard Worker#!/bin/bash
2*053f45beSAndroid Build Coastguard Worker# Copyright (C) 2017 Luis R. Rodriguez <[email protected]>
3*053f45beSAndroid Build Coastguard Worker#
4*053f45beSAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or modify it
5*053f45beSAndroid Build Coastguard Worker# under the terms of the GNU General Public License as published by the Free
6*053f45beSAndroid Build Coastguard Worker# Software Foundation; either version 2 of the License, or at your option any
7*053f45beSAndroid Build Coastguard Worker# later version; or, when distributed separately from the Linux kernel or
8*053f45beSAndroid Build Coastguard Worker# when incorporated into other software packages, subject to the following
9*053f45beSAndroid Build Coastguard Worker# license:
10*053f45beSAndroid Build Coastguard Worker#
11*053f45beSAndroid Build Coastguard Worker# This program is free software; you can redistribute it and/or modify it
12*053f45beSAndroid Build Coastguard Worker# under the terms of copyleft-next (version 0.3.1 or later) as published
13*053f45beSAndroid Build Coastguard Worker# at http://copyleft-next.org/.
14*053f45beSAndroid Build Coastguard Worker
15*053f45beSAndroid Build Coastguard Worker# This performs a series tests against the proc sysctl interface.
16*053f45beSAndroid Build Coastguard Worker
17*053f45beSAndroid Build Coastguard Worker# Kselftest framework requirement - SKIP code is 4.
18*053f45beSAndroid Build Coastguard Workerksft_skip=4
19*053f45beSAndroid Build Coastguard Worker
20*053f45beSAndroid Build Coastguard WorkerTEST_NAME="sysctl"
21*053f45beSAndroid Build Coastguard WorkerTEST_DRIVER="test_${TEST_NAME}"
22*053f45beSAndroid Build Coastguard WorkerTEST_DIR=$(dirname $0)
23*053f45beSAndroid Build Coastguard WorkerTEST_FILE=$(mktemp)
24*053f45beSAndroid Build Coastguard Worker
25*053f45beSAndroid Build Coastguard Worker# This represents
26*053f45beSAndroid Build Coastguard Worker#
27*053f45beSAndroid Build Coastguard Worker# TEST_ID:TEST_COUNT:ENABLED:TARGET
28*053f45beSAndroid Build Coastguard Worker#
29*053f45beSAndroid Build Coastguard Worker# TEST_ID: is the test id number
30*053f45beSAndroid Build Coastguard Worker# TEST_COUNT: number of times we should run the test
31*053f45beSAndroid Build Coastguard Worker# ENABLED: 1 if enabled, 0 otherwise
32*053f45beSAndroid Build Coastguard Worker# TARGET: test target file required on the test_sysctl module
33*053f45beSAndroid Build Coastguard Worker#
34*053f45beSAndroid Build Coastguard Worker# Once these are enabled please leave them as-is. Write your own test,
35*053f45beSAndroid Build Coastguard Worker# we have tons of space.
36*053f45beSAndroid Build Coastguard WorkerALL_TESTS="0001:1:1:int_0001"
37*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0002:1:1:string_0001"
38*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0003:1:1:int_0002"
39*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0004:1:1:uint_0001"
40*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0005:3:1:int_0003"
41*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0006:50:1:bitmap_0001"
42*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0007:1:1:boot_int"
43*053f45beSAndroid Build Coastguard WorkerALL_TESTS="$ALL_TESTS 0008:1:1:match_int"
44*053f45beSAndroid Build Coastguard Worker
45*053f45beSAndroid Build Coastguard Workerfunction allow_user_defaults()
46*053f45beSAndroid Build Coastguard Worker{
47*053f45beSAndroid Build Coastguard Worker	if [ -z $DIR ]; then
48*053f45beSAndroid Build Coastguard Worker		DIR="/sys/module/test_sysctl/"
49*053f45beSAndroid Build Coastguard Worker	fi
50*053f45beSAndroid Build Coastguard Worker	if [ -z $DEFAULT_NUM_TESTS ]; then
51*053f45beSAndroid Build Coastguard Worker		DEFAULT_NUM_TESTS=50
52*053f45beSAndroid Build Coastguard Worker	fi
53*053f45beSAndroid Build Coastguard Worker	if [ -z $SYSCTL ]; then
54*053f45beSAndroid Build Coastguard Worker		SYSCTL="/proc/sys/debug/test_sysctl"
55*053f45beSAndroid Build Coastguard Worker	fi
56*053f45beSAndroid Build Coastguard Worker	if [ -z $PROD_SYSCTL ]; then
57*053f45beSAndroid Build Coastguard Worker		PROD_SYSCTL="/proc/sys"
58*053f45beSAndroid Build Coastguard Worker	fi
59*053f45beSAndroid Build Coastguard Worker	if [ -z $WRITES_STRICT ]; then
60*053f45beSAndroid Build Coastguard Worker		WRITES_STRICT="${PROD_SYSCTL}/kernel/sysctl_writes_strict"
61*053f45beSAndroid Build Coastguard Worker	fi
62*053f45beSAndroid Build Coastguard Worker}
63*053f45beSAndroid Build Coastguard Worker
64*053f45beSAndroid Build Coastguard Workerfunction check_production_sysctl_writes_strict()
65*053f45beSAndroid Build Coastguard Worker{
66*053f45beSAndroid Build Coastguard Worker	echo -n "Checking production write strict setting ... "
67*053f45beSAndroid Build Coastguard Worker	if [ ! -e ${WRITES_STRICT} ]; then
68*053f45beSAndroid Build Coastguard Worker		echo "FAIL, but skip in case of old kernel" >&2
69*053f45beSAndroid Build Coastguard Worker	else
70*053f45beSAndroid Build Coastguard Worker		old_strict=$(cat ${WRITES_STRICT})
71*053f45beSAndroid Build Coastguard Worker		if [ "$old_strict" = "1" ]; then
72*053f45beSAndroid Build Coastguard Worker			echo "ok"
73*053f45beSAndroid Build Coastguard Worker		else
74*053f45beSAndroid Build Coastguard Worker			echo "FAIL, strict value is 0 but force to 1 to continue" >&2
75*053f45beSAndroid Build Coastguard Worker			echo "1" > ${WRITES_STRICT}
76*053f45beSAndroid Build Coastguard Worker		fi
77*053f45beSAndroid Build Coastguard Worker	fi
78*053f45beSAndroid Build Coastguard Worker
79*053f45beSAndroid Build Coastguard Worker	if [ -z $PAGE_SIZE ]; then
80*053f45beSAndroid Build Coastguard Worker		PAGE_SIZE=$(getconf PAGESIZE)
81*053f45beSAndroid Build Coastguard Worker	fi
82*053f45beSAndroid Build Coastguard Worker	if [ -z $MAX_DIGITS ]; then
83*053f45beSAndroid Build Coastguard Worker		MAX_DIGITS=$(($PAGE_SIZE/8))
84*053f45beSAndroid Build Coastguard Worker	fi
85*053f45beSAndroid Build Coastguard Worker	if [ -z $INT_MAX ]; then
86*053f45beSAndroid Build Coastguard Worker		INT_MAX=$(getconf INT_MAX)
87*053f45beSAndroid Build Coastguard Worker	fi
88*053f45beSAndroid Build Coastguard Worker	if [ -z $UINT_MAX ]; then
89*053f45beSAndroid Build Coastguard Worker		UINT_MAX=$(getconf UINT_MAX)
90*053f45beSAndroid Build Coastguard Worker	fi
91*053f45beSAndroid Build Coastguard Worker}
92*053f45beSAndroid Build Coastguard Worker
93*053f45beSAndroid Build Coastguard Workertest_reqs()
94*053f45beSAndroid Build Coastguard Worker{
95*053f45beSAndroid Build Coastguard Worker	uid=$(id -u)
96*053f45beSAndroid Build Coastguard Worker	if [ $uid -ne 0 ]; then
97*053f45beSAndroid Build Coastguard Worker		echo $msg must be run as root >&2
98*053f45beSAndroid Build Coastguard Worker		exit $ksft_skip
99*053f45beSAndroid Build Coastguard Worker	fi
100*053f45beSAndroid Build Coastguard Worker
101*053f45beSAndroid Build Coastguard Worker	if ! which perl 2> /dev/null > /dev/null; then
102*053f45beSAndroid Build Coastguard Worker		echo "$0: You need perl installed"
103*053f45beSAndroid Build Coastguard Worker		exit $ksft_skip
104*053f45beSAndroid Build Coastguard Worker	fi
105*053f45beSAndroid Build Coastguard Worker	if ! which getconf 2> /dev/null > /dev/null; then
106*053f45beSAndroid Build Coastguard Worker		echo "$0: You need getconf installed"
107*053f45beSAndroid Build Coastguard Worker		exit $ksft_skip
108*053f45beSAndroid Build Coastguard Worker	fi
109*053f45beSAndroid Build Coastguard Worker	if ! which diff 2> /dev/null > /dev/null; then
110*053f45beSAndroid Build Coastguard Worker		echo "$0: You need diff installed"
111*053f45beSAndroid Build Coastguard Worker		exit $ksft_skip
112*053f45beSAndroid Build Coastguard Worker	fi
113*053f45beSAndroid Build Coastguard Worker}
114*053f45beSAndroid Build Coastguard Worker
115*053f45beSAndroid Build Coastguard Workerfunction load_req_mod()
116*053f45beSAndroid Build Coastguard Worker{
117*053f45beSAndroid Build Coastguard Worker	if [ ! -d $SYSCTL ]; then
118*053f45beSAndroid Build Coastguard Worker		if ! modprobe -q -n $TEST_DRIVER; then
119*053f45beSAndroid Build Coastguard Worker			echo "$0: module $TEST_DRIVER not found [SKIP]"
120*053f45beSAndroid Build Coastguard Worker			echo "You must set CONFIG_TEST_SYSCTL=m in your kernel" >&2
121*053f45beSAndroid Build Coastguard Worker			exit $ksft_skip
122*053f45beSAndroid Build Coastguard Worker		fi
123*053f45beSAndroid Build Coastguard Worker		modprobe $TEST_DRIVER
124*053f45beSAndroid Build Coastguard Worker		if [ $? -ne 0 ]; then
125*053f45beSAndroid Build Coastguard Worker			echo "$0: modprobe $TEST_DRIVER failed."
126*053f45beSAndroid Build Coastguard Worker			exit
127*053f45beSAndroid Build Coastguard Worker		fi
128*053f45beSAndroid Build Coastguard Worker	fi
129*053f45beSAndroid Build Coastguard Worker}
130*053f45beSAndroid Build Coastguard Worker
131*053f45beSAndroid Build Coastguard Workerreset_vals()
132*053f45beSAndroid Build Coastguard Worker{
133*053f45beSAndroid Build Coastguard Worker	VAL=""
134*053f45beSAndroid Build Coastguard Worker	TRIGGER=$(basename ${TARGET})
135*053f45beSAndroid Build Coastguard Worker	case "$TRIGGER" in
136*053f45beSAndroid Build Coastguard Worker		int_0001)
137*053f45beSAndroid Build Coastguard Worker			VAL="60"
138*053f45beSAndroid Build Coastguard Worker			;;
139*053f45beSAndroid Build Coastguard Worker		int_0002)
140*053f45beSAndroid Build Coastguard Worker			VAL="1"
141*053f45beSAndroid Build Coastguard Worker			;;
142*053f45beSAndroid Build Coastguard Worker		uint_0001)
143*053f45beSAndroid Build Coastguard Worker			VAL="314"
144*053f45beSAndroid Build Coastguard Worker			;;
145*053f45beSAndroid Build Coastguard Worker		string_0001)
146*053f45beSAndroid Build Coastguard Worker			VAL="(none)"
147*053f45beSAndroid Build Coastguard Worker			;;
148*053f45beSAndroid Build Coastguard Worker		bitmap_0001)
149*053f45beSAndroid Build Coastguard Worker			VAL=""
150*053f45beSAndroid Build Coastguard Worker			;;
151*053f45beSAndroid Build Coastguard Worker		*)
152*053f45beSAndroid Build Coastguard Worker			;;
153*053f45beSAndroid Build Coastguard Worker	esac
154*053f45beSAndroid Build Coastguard Worker	echo -n $VAL > $TARGET
155*053f45beSAndroid Build Coastguard Worker}
156*053f45beSAndroid Build Coastguard Worker
157*053f45beSAndroid Build Coastguard Workerset_orig()
158*053f45beSAndroid Build Coastguard Worker{
159*053f45beSAndroid Build Coastguard Worker	if [ ! -z $TARGET ] && [ ! -z $ORIG ]; then
160*053f45beSAndroid Build Coastguard Worker		if [ -f ${TARGET} ]; then
161*053f45beSAndroid Build Coastguard Worker			echo "${ORIG}" > "${TARGET}"
162*053f45beSAndroid Build Coastguard Worker		fi
163*053f45beSAndroid Build Coastguard Worker	fi
164*053f45beSAndroid Build Coastguard Worker}
165*053f45beSAndroid Build Coastguard Worker
166*053f45beSAndroid Build Coastguard Workerset_test()
167*053f45beSAndroid Build Coastguard Worker{
168*053f45beSAndroid Build Coastguard Worker	echo "${TEST_STR}" > "${TARGET}"
169*053f45beSAndroid Build Coastguard Worker}
170*053f45beSAndroid Build Coastguard Worker
171*053f45beSAndroid Build Coastguard Workerverify()
172*053f45beSAndroid Build Coastguard Worker{
173*053f45beSAndroid Build Coastguard Worker	local seen
174*053f45beSAndroid Build Coastguard Worker	seen=$(cat "$1")
175*053f45beSAndroid Build Coastguard Worker	if [ "${seen}" != "${TEST_STR}" ]; then
176*053f45beSAndroid Build Coastguard Worker		return 1
177*053f45beSAndroid Build Coastguard Worker	fi
178*053f45beSAndroid Build Coastguard Worker	return 0
179*053f45beSAndroid Build Coastguard Worker}
180*053f45beSAndroid Build Coastguard Worker
181*053f45beSAndroid Build Coastguard Worker# proc files get read a page at a time, which can confuse diff,
182*053f45beSAndroid Build Coastguard Worker# and get you incorrect results on proc files with long data. To use
183*053f45beSAndroid Build Coastguard Worker# diff against them you must first extract the output to a file, and
184*053f45beSAndroid Build Coastguard Worker# then compare against that file.
185*053f45beSAndroid Build Coastguard Workerverify_diff_proc_file()
186*053f45beSAndroid Build Coastguard Worker{
187*053f45beSAndroid Build Coastguard Worker	TMP_DUMP_FILE=$(mktemp)
188*053f45beSAndroid Build Coastguard Worker	cat $1 > $TMP_DUMP_FILE
189*053f45beSAndroid Build Coastguard Worker
190*053f45beSAndroid Build Coastguard Worker	if ! diff -w -q $TMP_DUMP_FILE $2; then
191*053f45beSAndroid Build Coastguard Worker		return 1
192*053f45beSAndroid Build Coastguard Worker	else
193*053f45beSAndroid Build Coastguard Worker		return 0
194*053f45beSAndroid Build Coastguard Worker	fi
195*053f45beSAndroid Build Coastguard Worker}
196*053f45beSAndroid Build Coastguard Worker
197*053f45beSAndroid Build Coastguard Workerverify_diff_w()
198*053f45beSAndroid Build Coastguard Worker{
199*053f45beSAndroid Build Coastguard Worker	echo "$TEST_STR" | diff -q -w -u - $1 > /dev/null
200*053f45beSAndroid Build Coastguard Worker	return $?
201*053f45beSAndroid Build Coastguard Worker}
202*053f45beSAndroid Build Coastguard Worker
203*053f45beSAndroid Build Coastguard Workertest_rc()
204*053f45beSAndroid Build Coastguard Worker{
205*053f45beSAndroid Build Coastguard Worker	if [[ $rc != 0 ]]; then
206*053f45beSAndroid Build Coastguard Worker		echo "Failed test, return value: $rc" >&2
207*053f45beSAndroid Build Coastguard Worker		exit $rc
208*053f45beSAndroid Build Coastguard Worker	fi
209*053f45beSAndroid Build Coastguard Worker}
210*053f45beSAndroid Build Coastguard Worker
211*053f45beSAndroid Build Coastguard Workertest_finish()
212*053f45beSAndroid Build Coastguard Worker{
213*053f45beSAndroid Build Coastguard Worker	set_orig
214*053f45beSAndroid Build Coastguard Worker	rm -f "${TEST_FILE}"
215*053f45beSAndroid Build Coastguard Worker
216*053f45beSAndroid Build Coastguard Worker	if [ ! -z ${old_strict} ]; then
217*053f45beSAndroid Build Coastguard Worker		echo ${old_strict} > ${WRITES_STRICT}
218*053f45beSAndroid Build Coastguard Worker	fi
219*053f45beSAndroid Build Coastguard Worker	exit $rc
220*053f45beSAndroid Build Coastguard Worker}
221*053f45beSAndroid Build Coastguard Worker
222*053f45beSAndroid Build Coastguard Workerrun_numerictests()
223*053f45beSAndroid Build Coastguard Worker{
224*053f45beSAndroid Build Coastguard Worker	echo "== Testing sysctl behavior against ${TARGET} =="
225*053f45beSAndroid Build Coastguard Worker
226*053f45beSAndroid Build Coastguard Worker	rc=0
227*053f45beSAndroid Build Coastguard Worker
228*053f45beSAndroid Build Coastguard Worker	echo -n "Writing test file ... "
229*053f45beSAndroid Build Coastguard Worker	echo "${TEST_STR}" > "${TEST_FILE}"
230*053f45beSAndroid Build Coastguard Worker	if ! verify "${TEST_FILE}"; then
231*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
232*053f45beSAndroid Build Coastguard Worker		exit 1
233*053f45beSAndroid Build Coastguard Worker	else
234*053f45beSAndroid Build Coastguard Worker		echo "ok"
235*053f45beSAndroid Build Coastguard Worker	fi
236*053f45beSAndroid Build Coastguard Worker
237*053f45beSAndroid Build Coastguard Worker	echo -n "Checking sysctl is not set to test value ... "
238*053f45beSAndroid Build Coastguard Worker	if verify "${TARGET}"; then
239*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
240*053f45beSAndroid Build Coastguard Worker		exit 1
241*053f45beSAndroid Build Coastguard Worker	else
242*053f45beSAndroid Build Coastguard Worker		echo "ok"
243*053f45beSAndroid Build Coastguard Worker	fi
244*053f45beSAndroid Build Coastguard Worker
245*053f45beSAndroid Build Coastguard Worker	echo -n "Writing sysctl from shell ... "
246*053f45beSAndroid Build Coastguard Worker	set_test
247*053f45beSAndroid Build Coastguard Worker	if ! verify "${TARGET}"; then
248*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
249*053f45beSAndroid Build Coastguard Worker		exit 1
250*053f45beSAndroid Build Coastguard Worker	else
251*053f45beSAndroid Build Coastguard Worker		echo "ok"
252*053f45beSAndroid Build Coastguard Worker	fi
253*053f45beSAndroid Build Coastguard Worker
254*053f45beSAndroid Build Coastguard Worker	echo -n "Resetting sysctl to original value ... "
255*053f45beSAndroid Build Coastguard Worker	set_orig
256*053f45beSAndroid Build Coastguard Worker	if verify "${TARGET}"; then
257*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
258*053f45beSAndroid Build Coastguard Worker		exit 1
259*053f45beSAndroid Build Coastguard Worker	else
260*053f45beSAndroid Build Coastguard Worker		echo "ok"
261*053f45beSAndroid Build Coastguard Worker	fi
262*053f45beSAndroid Build Coastguard Worker
263*053f45beSAndroid Build Coastguard Worker	# Now that we've validated the sanity of "set_test" and "set_orig",
264*053f45beSAndroid Build Coastguard Worker	# we can use those functions to set starting states before running
265*053f45beSAndroid Build Coastguard Worker	# specific behavioral tests.
266*053f45beSAndroid Build Coastguard Worker
267*053f45beSAndroid Build Coastguard Worker	echo -n "Writing entire sysctl in single write ... "
268*053f45beSAndroid Build Coastguard Worker	set_orig
269*053f45beSAndroid Build Coastguard Worker	dd if="${TEST_FILE}" of="${TARGET}" bs=4096 2>/dev/null
270*053f45beSAndroid Build Coastguard Worker	if ! verify "${TARGET}"; then
271*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
272*053f45beSAndroid Build Coastguard Worker		rc=1
273*053f45beSAndroid Build Coastguard Worker	else
274*053f45beSAndroid Build Coastguard Worker		echo "ok"
275*053f45beSAndroid Build Coastguard Worker	fi
276*053f45beSAndroid Build Coastguard Worker
277*053f45beSAndroid Build Coastguard Worker	echo -n "Writing middle of sysctl after synchronized seek ... "
278*053f45beSAndroid Build Coastguard Worker	set_test
279*053f45beSAndroid Build Coastguard Worker	dd if="${TEST_FILE}" of="${TARGET}" bs=1 seek=1 skip=1 2>/dev/null
280*053f45beSAndroid Build Coastguard Worker	if ! verify "${TARGET}"; then
281*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
282*053f45beSAndroid Build Coastguard Worker		rc=1
283*053f45beSAndroid Build Coastguard Worker	else
284*053f45beSAndroid Build Coastguard Worker		echo "ok"
285*053f45beSAndroid Build Coastguard Worker	fi
286*053f45beSAndroid Build Coastguard Worker
287*053f45beSAndroid Build Coastguard Worker	echo -n "Writing beyond end of sysctl ... "
288*053f45beSAndroid Build Coastguard Worker	set_orig
289*053f45beSAndroid Build Coastguard Worker	dd if="${TEST_FILE}" of="${TARGET}" bs=20 seek=2 2>/dev/null
290*053f45beSAndroid Build Coastguard Worker	if verify "${TARGET}"; then
291*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
292*053f45beSAndroid Build Coastguard Worker		rc=1
293*053f45beSAndroid Build Coastguard Worker	else
294*053f45beSAndroid Build Coastguard Worker		echo "ok"
295*053f45beSAndroid Build Coastguard Worker	fi
296*053f45beSAndroid Build Coastguard Worker
297*053f45beSAndroid Build Coastguard Worker	echo -n "Writing sysctl with multiple long writes ... "
298*053f45beSAndroid Build Coastguard Worker	set_orig
299*053f45beSAndroid Build Coastguard Worker	(perl -e 'print "A" x 50;'; echo "${TEST_STR}") | \
300*053f45beSAndroid Build Coastguard Worker		dd of="${TARGET}" bs=50 2>/dev/null
301*053f45beSAndroid Build Coastguard Worker	if verify "${TARGET}"; then
302*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
303*053f45beSAndroid Build Coastguard Worker		rc=1
304*053f45beSAndroid Build Coastguard Worker	else
305*053f45beSAndroid Build Coastguard Worker		echo "ok"
306*053f45beSAndroid Build Coastguard Worker	fi
307*053f45beSAndroid Build Coastguard Worker	test_rc
308*053f45beSAndroid Build Coastguard Worker}
309*053f45beSAndroid Build Coastguard Worker
310*053f45beSAndroid Build Coastguard Workercheck_failure()
311*053f45beSAndroid Build Coastguard Worker{
312*053f45beSAndroid Build Coastguard Worker	echo -n "Testing that $1 fails as expected..."
313*053f45beSAndroid Build Coastguard Worker	reset_vals
314*053f45beSAndroid Build Coastguard Worker	TEST_STR="$1"
315*053f45beSAndroid Build Coastguard Worker	orig="$(cat $TARGET)"
316*053f45beSAndroid Build Coastguard Worker	echo -n "$TEST_STR" > $TARGET 2> /dev/null
317*053f45beSAndroid Build Coastguard Worker
318*053f45beSAndroid Build Coastguard Worker	# write should fail and $TARGET should retain its original value
319*053f45beSAndroid Build Coastguard Worker	if [ $? = 0 ] || [ "$(cat $TARGET)" != "$orig" ]; then
320*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
321*053f45beSAndroid Build Coastguard Worker		rc=1
322*053f45beSAndroid Build Coastguard Worker	else
323*053f45beSAndroid Build Coastguard Worker		echo "ok"
324*053f45beSAndroid Build Coastguard Worker	fi
325*053f45beSAndroid Build Coastguard Worker	test_rc
326*053f45beSAndroid Build Coastguard Worker}
327*053f45beSAndroid Build Coastguard Worker
328*053f45beSAndroid Build Coastguard Workerrun_wideint_tests()
329*053f45beSAndroid Build Coastguard Worker{
330*053f45beSAndroid Build Coastguard Worker	# sysctl conversion functions receive a boolean sign and ulong
331*053f45beSAndroid Build Coastguard Worker	# magnitude; here we list the magnitudes we want to test (each of
332*053f45beSAndroid Build Coastguard Worker	# which will be tested in both positive and negative forms).  Since
333*053f45beSAndroid Build Coastguard Worker	# none of these values fit in 32 bits, writing them to an int- or
334*053f45beSAndroid Build Coastguard Worker	# uint-typed sysctl should fail.
335*053f45beSAndroid Build Coastguard Worker	local magnitudes=(
336*053f45beSAndroid Build Coastguard Worker		# common boundary-condition values (zero, +1, -1, INT_MIN,
337*053f45beSAndroid Build Coastguard Worker		# and INT_MAX respectively) if truncated to lower 32 bits
338*053f45beSAndroid Build Coastguard Worker		# (potential for being falsely deemed in range)
339*053f45beSAndroid Build Coastguard Worker		0x0000000100000000
340*053f45beSAndroid Build Coastguard Worker		0x0000000100000001
341*053f45beSAndroid Build Coastguard Worker		0x00000001ffffffff
342*053f45beSAndroid Build Coastguard Worker		0x0000000180000000
343*053f45beSAndroid Build Coastguard Worker		0x000000017fffffff
344*053f45beSAndroid Build Coastguard Worker
345*053f45beSAndroid Build Coastguard Worker		# these look like negatives, but without a leading '-' are
346*053f45beSAndroid Build Coastguard Worker		# actually large positives (should be rejected as above
347*053f45beSAndroid Build Coastguard Worker		# despite being zero/+1/-1/INT_MIN/INT_MAX in the lower 32)
348*053f45beSAndroid Build Coastguard Worker		0xffffffff00000000
349*053f45beSAndroid Build Coastguard Worker		0xffffffff00000001
350*053f45beSAndroid Build Coastguard Worker		0xffffffffffffffff
351*053f45beSAndroid Build Coastguard Worker		0xffffffff80000000
352*053f45beSAndroid Build Coastguard Worker		0xffffffff7fffffff
353*053f45beSAndroid Build Coastguard Worker	)
354*053f45beSAndroid Build Coastguard Worker
355*053f45beSAndroid Build Coastguard Worker	for sign in '' '-'; do
356*053f45beSAndroid Build Coastguard Worker		for mag in "${magnitudes[@]}"; do
357*053f45beSAndroid Build Coastguard Worker			check_failure "${sign}${mag}"
358*053f45beSAndroid Build Coastguard Worker		done
359*053f45beSAndroid Build Coastguard Worker	done
360*053f45beSAndroid Build Coastguard Worker}
361*053f45beSAndroid Build Coastguard Worker
362*053f45beSAndroid Build Coastguard Worker# Your test must accept digits 3 and 4 to use this
363*053f45beSAndroid Build Coastguard Workerrun_limit_digit()
364*053f45beSAndroid Build Coastguard Worker{
365*053f45beSAndroid Build Coastguard Worker	echo -n "Checking ignoring spaces up to PAGE_SIZE works on write ..."
366*053f45beSAndroid Build Coastguard Worker	reset_vals
367*053f45beSAndroid Build Coastguard Worker
368*053f45beSAndroid Build Coastguard Worker	LIMIT=$((MAX_DIGITS -1))
369*053f45beSAndroid Build Coastguard Worker	TEST_STR="3"
370*053f45beSAndroid Build Coastguard Worker	(perl -e 'print " " x '$LIMIT';'; echo "${TEST_STR}") | \
371*053f45beSAndroid Build Coastguard Worker		dd of="${TARGET}" 2>/dev/null
372*053f45beSAndroid Build Coastguard Worker
373*053f45beSAndroid Build Coastguard Worker	if ! verify "${TARGET}"; then
374*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
375*053f45beSAndroid Build Coastguard Worker		rc=1
376*053f45beSAndroid Build Coastguard Worker	else
377*053f45beSAndroid Build Coastguard Worker		echo "ok"
378*053f45beSAndroid Build Coastguard Worker	fi
379*053f45beSAndroid Build Coastguard Worker	test_rc
380*053f45beSAndroid Build Coastguard Worker
381*053f45beSAndroid Build Coastguard Worker	echo -n "Checking passing PAGE_SIZE of spaces fails on write ..."
382*053f45beSAndroid Build Coastguard Worker	reset_vals
383*053f45beSAndroid Build Coastguard Worker
384*053f45beSAndroid Build Coastguard Worker	LIMIT=$((MAX_DIGITS))
385*053f45beSAndroid Build Coastguard Worker	TEST_STR="4"
386*053f45beSAndroid Build Coastguard Worker	(perl -e 'print " " x '$LIMIT';'; echo "${TEST_STR}") | \
387*053f45beSAndroid Build Coastguard Worker		dd of="${TARGET}" 2>/dev/null
388*053f45beSAndroid Build Coastguard Worker
389*053f45beSAndroid Build Coastguard Worker	if verify "${TARGET}"; then
390*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
391*053f45beSAndroid Build Coastguard Worker		rc=1
392*053f45beSAndroid Build Coastguard Worker	else
393*053f45beSAndroid Build Coastguard Worker		echo "ok"
394*053f45beSAndroid Build Coastguard Worker	fi
395*053f45beSAndroid Build Coastguard Worker	test_rc
396*053f45beSAndroid Build Coastguard Worker}
397*053f45beSAndroid Build Coastguard Worker
398*053f45beSAndroid Build Coastguard Worker# You are using an int
399*053f45beSAndroid Build Coastguard Workerrun_limit_digit_int()
400*053f45beSAndroid Build Coastguard Worker{
401*053f45beSAndroid Build Coastguard Worker	echo -n "Testing INT_MAX works ..."
402*053f45beSAndroid Build Coastguard Worker	reset_vals
403*053f45beSAndroid Build Coastguard Worker	TEST_STR="$INT_MAX"
404*053f45beSAndroid Build Coastguard Worker	echo -n $TEST_STR > $TARGET
405*053f45beSAndroid Build Coastguard Worker
406*053f45beSAndroid Build Coastguard Worker	if ! verify "${TARGET}"; then
407*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
408*053f45beSAndroid Build Coastguard Worker		rc=1
409*053f45beSAndroid Build Coastguard Worker	else
410*053f45beSAndroid Build Coastguard Worker		echo "ok"
411*053f45beSAndroid Build Coastguard Worker	fi
412*053f45beSAndroid Build Coastguard Worker	test_rc
413*053f45beSAndroid Build Coastguard Worker
414*053f45beSAndroid Build Coastguard Worker	echo -n "Testing INT_MAX + 1 will fail as expected..."
415*053f45beSAndroid Build Coastguard Worker	reset_vals
416*053f45beSAndroid Build Coastguard Worker	let TEST_STR=$INT_MAX+1
417*053f45beSAndroid Build Coastguard Worker	echo -n $TEST_STR > $TARGET 2> /dev/null
418*053f45beSAndroid Build Coastguard Worker
419*053f45beSAndroid Build Coastguard Worker	if verify "${TARGET}"; then
420*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
421*053f45beSAndroid Build Coastguard Worker		rc=1
422*053f45beSAndroid Build Coastguard Worker	else
423*053f45beSAndroid Build Coastguard Worker		echo "ok"
424*053f45beSAndroid Build Coastguard Worker	fi
425*053f45beSAndroid Build Coastguard Worker	test_rc
426*053f45beSAndroid Build Coastguard Worker
427*053f45beSAndroid Build Coastguard Worker	echo -n "Testing negative values will work as expected..."
428*053f45beSAndroid Build Coastguard Worker	reset_vals
429*053f45beSAndroid Build Coastguard Worker	TEST_STR="-3"
430*053f45beSAndroid Build Coastguard Worker	echo -n $TEST_STR > $TARGET 2> /dev/null
431*053f45beSAndroid Build Coastguard Worker	if ! verify "${TARGET}"; then
432*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
433*053f45beSAndroid Build Coastguard Worker		rc=1
434*053f45beSAndroid Build Coastguard Worker	else
435*053f45beSAndroid Build Coastguard Worker		echo "ok"
436*053f45beSAndroid Build Coastguard Worker	fi
437*053f45beSAndroid Build Coastguard Worker	test_rc
438*053f45beSAndroid Build Coastguard Worker}
439*053f45beSAndroid Build Coastguard Worker
440*053f45beSAndroid Build Coastguard Worker# You used an int array
441*053f45beSAndroid Build Coastguard Workerrun_limit_digit_int_array()
442*053f45beSAndroid Build Coastguard Worker{
443*053f45beSAndroid Build Coastguard Worker	echo -n "Testing array works as expected ... "
444*053f45beSAndroid Build Coastguard Worker	TEST_STR="4 3 2 1"
445*053f45beSAndroid Build Coastguard Worker	echo -n $TEST_STR > $TARGET
446*053f45beSAndroid Build Coastguard Worker
447*053f45beSAndroid Build Coastguard Worker	if ! verify_diff_w "${TARGET}"; then
448*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
449*053f45beSAndroid Build Coastguard Worker		rc=1
450*053f45beSAndroid Build Coastguard Worker	else
451*053f45beSAndroid Build Coastguard Worker		echo "ok"
452*053f45beSAndroid Build Coastguard Worker	fi
453*053f45beSAndroid Build Coastguard Worker	test_rc
454*053f45beSAndroid Build Coastguard Worker
455*053f45beSAndroid Build Coastguard Worker	echo -n "Testing skipping trailing array elements works ... "
456*053f45beSAndroid Build Coastguard Worker	# Do not reset_vals, carry on the values from the last test.
457*053f45beSAndroid Build Coastguard Worker	# If we only echo in two digits the last two are left intact
458*053f45beSAndroid Build Coastguard Worker	TEST_STR="100 101"
459*053f45beSAndroid Build Coastguard Worker	echo -n $TEST_STR > $TARGET
460*053f45beSAndroid Build Coastguard Worker	# After we echo in, to help diff we need to set on TEST_STR what
461*053f45beSAndroid Build Coastguard Worker	# we expect the result to be.
462*053f45beSAndroid Build Coastguard Worker	TEST_STR="100 101 2 1"
463*053f45beSAndroid Build Coastguard Worker
464*053f45beSAndroid Build Coastguard Worker	if ! verify_diff_w "${TARGET}"; then
465*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
466*053f45beSAndroid Build Coastguard Worker		rc=1
467*053f45beSAndroid Build Coastguard Worker	else
468*053f45beSAndroid Build Coastguard Worker		echo "ok"
469*053f45beSAndroid Build Coastguard Worker	fi
470*053f45beSAndroid Build Coastguard Worker	test_rc
471*053f45beSAndroid Build Coastguard Worker
472*053f45beSAndroid Build Coastguard Worker	echo -n "Testing PAGE_SIZE limit on array works ... "
473*053f45beSAndroid Build Coastguard Worker	# Do not reset_vals, carry on the values from the last test.
474*053f45beSAndroid Build Coastguard Worker	# Even if you use an int array, you are still restricted to
475*053f45beSAndroid Build Coastguard Worker	# MAX_DIGITS, this is a known limitation. Test limit works.
476*053f45beSAndroid Build Coastguard Worker	LIMIT=$((MAX_DIGITS -1))
477*053f45beSAndroid Build Coastguard Worker	TEST_STR="9"
478*053f45beSAndroid Build Coastguard Worker	(perl -e 'print " " x '$LIMIT';'; echo "${TEST_STR}") | \
479*053f45beSAndroid Build Coastguard Worker		dd of="${TARGET}" 2>/dev/null
480*053f45beSAndroid Build Coastguard Worker
481*053f45beSAndroid Build Coastguard Worker	TEST_STR="9 101 2 1"
482*053f45beSAndroid Build Coastguard Worker	if ! verify_diff_w "${TARGET}"; then
483*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
484*053f45beSAndroid Build Coastguard Worker		rc=1
485*053f45beSAndroid Build Coastguard Worker	else
486*053f45beSAndroid Build Coastguard Worker		echo "ok"
487*053f45beSAndroid Build Coastguard Worker	fi
488*053f45beSAndroid Build Coastguard Worker	test_rc
489*053f45beSAndroid Build Coastguard Worker
490*053f45beSAndroid Build Coastguard Worker	echo -n "Testing exceeding PAGE_SIZE limit fails as expected ... "
491*053f45beSAndroid Build Coastguard Worker	# Do not reset_vals, carry on the values from the last test.
492*053f45beSAndroid Build Coastguard Worker	# Now go over limit.
493*053f45beSAndroid Build Coastguard Worker	LIMIT=$((MAX_DIGITS))
494*053f45beSAndroid Build Coastguard Worker	TEST_STR="7"
495*053f45beSAndroid Build Coastguard Worker	(perl -e 'print " " x '$LIMIT';'; echo "${TEST_STR}") | \
496*053f45beSAndroid Build Coastguard Worker		dd of="${TARGET}" 2>/dev/null
497*053f45beSAndroid Build Coastguard Worker
498*053f45beSAndroid Build Coastguard Worker	TEST_STR="7 101 2 1"
499*053f45beSAndroid Build Coastguard Worker	if verify_diff_w "${TARGET}"; then
500*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
501*053f45beSAndroid Build Coastguard Worker		rc=1
502*053f45beSAndroid Build Coastguard Worker	else
503*053f45beSAndroid Build Coastguard Worker		echo "ok"
504*053f45beSAndroid Build Coastguard Worker	fi
505*053f45beSAndroid Build Coastguard Worker	test_rc
506*053f45beSAndroid Build Coastguard Worker}
507*053f45beSAndroid Build Coastguard Worker
508*053f45beSAndroid Build Coastguard Worker# You are using an unsigned int
509*053f45beSAndroid Build Coastguard Workerrun_limit_digit_uint()
510*053f45beSAndroid Build Coastguard Worker{
511*053f45beSAndroid Build Coastguard Worker	echo -n "Testing UINT_MAX works ..."
512*053f45beSAndroid Build Coastguard Worker	reset_vals
513*053f45beSAndroid Build Coastguard Worker	TEST_STR="$UINT_MAX"
514*053f45beSAndroid Build Coastguard Worker	echo -n $TEST_STR > $TARGET
515*053f45beSAndroid Build Coastguard Worker
516*053f45beSAndroid Build Coastguard Worker	if ! verify "${TARGET}"; then
517*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
518*053f45beSAndroid Build Coastguard Worker		rc=1
519*053f45beSAndroid Build Coastguard Worker	else
520*053f45beSAndroid Build Coastguard Worker		echo "ok"
521*053f45beSAndroid Build Coastguard Worker	fi
522*053f45beSAndroid Build Coastguard Worker	test_rc
523*053f45beSAndroid Build Coastguard Worker
524*053f45beSAndroid Build Coastguard Worker	echo -n "Testing UINT_MAX + 1 will fail as expected..."
525*053f45beSAndroid Build Coastguard Worker	reset_vals
526*053f45beSAndroid Build Coastguard Worker	TEST_STR=$(($UINT_MAX+1))
527*053f45beSAndroid Build Coastguard Worker	echo -n $TEST_STR > $TARGET 2> /dev/null
528*053f45beSAndroid Build Coastguard Worker
529*053f45beSAndroid Build Coastguard Worker	if verify "${TARGET}"; then
530*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
531*053f45beSAndroid Build Coastguard Worker		rc=1
532*053f45beSAndroid Build Coastguard Worker	else
533*053f45beSAndroid Build Coastguard Worker		echo "ok"
534*053f45beSAndroid Build Coastguard Worker	fi
535*053f45beSAndroid Build Coastguard Worker	test_rc
536*053f45beSAndroid Build Coastguard Worker
537*053f45beSAndroid Build Coastguard Worker	echo -n "Testing negative values will not work as expected ..."
538*053f45beSAndroid Build Coastguard Worker	reset_vals
539*053f45beSAndroid Build Coastguard Worker	TEST_STR="-3"
540*053f45beSAndroid Build Coastguard Worker	echo -n $TEST_STR > $TARGET 2> /dev/null
541*053f45beSAndroid Build Coastguard Worker
542*053f45beSAndroid Build Coastguard Worker	if verify "${TARGET}"; then
543*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
544*053f45beSAndroid Build Coastguard Worker		rc=1
545*053f45beSAndroid Build Coastguard Worker	else
546*053f45beSAndroid Build Coastguard Worker		echo "ok"
547*053f45beSAndroid Build Coastguard Worker	fi
548*053f45beSAndroid Build Coastguard Worker	test_rc
549*053f45beSAndroid Build Coastguard Worker}
550*053f45beSAndroid Build Coastguard Worker
551*053f45beSAndroid Build Coastguard Workerrun_stringtests()
552*053f45beSAndroid Build Coastguard Worker{
553*053f45beSAndroid Build Coastguard Worker	echo -n "Writing entire sysctl in short writes ... "
554*053f45beSAndroid Build Coastguard Worker	set_orig
555*053f45beSAndroid Build Coastguard Worker	dd if="${TEST_FILE}" of="${TARGET}" bs=1 2>/dev/null
556*053f45beSAndroid Build Coastguard Worker	if ! verify "${TARGET}"; then
557*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
558*053f45beSAndroid Build Coastguard Worker		rc=1
559*053f45beSAndroid Build Coastguard Worker	else
560*053f45beSAndroid Build Coastguard Worker		echo "ok"
561*053f45beSAndroid Build Coastguard Worker	fi
562*053f45beSAndroid Build Coastguard Worker
563*053f45beSAndroid Build Coastguard Worker	echo -n "Writing middle of sysctl after unsynchronized seek ... "
564*053f45beSAndroid Build Coastguard Worker	set_test
565*053f45beSAndroid Build Coastguard Worker	dd if="${TEST_FILE}" of="${TARGET}" bs=1 seek=1 2>/dev/null
566*053f45beSAndroid Build Coastguard Worker	if verify "${TARGET}"; then
567*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
568*053f45beSAndroid Build Coastguard Worker		rc=1
569*053f45beSAndroid Build Coastguard Worker	else
570*053f45beSAndroid Build Coastguard Worker		echo "ok"
571*053f45beSAndroid Build Coastguard Worker	fi
572*053f45beSAndroid Build Coastguard Worker
573*053f45beSAndroid Build Coastguard Worker	echo -n "Checking sysctl maxlen is at least $MAXLEN ... "
574*053f45beSAndroid Build Coastguard Worker	set_orig
575*053f45beSAndroid Build Coastguard Worker	perl -e 'print "A" x ('"${MAXLEN}"'-2), "B";' | \
576*053f45beSAndroid Build Coastguard Worker		dd of="${TARGET}" bs="${MAXLEN}" 2>/dev/null
577*053f45beSAndroid Build Coastguard Worker	if ! grep -q B "${TARGET}"; then
578*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
579*053f45beSAndroid Build Coastguard Worker		rc=1
580*053f45beSAndroid Build Coastguard Worker	else
581*053f45beSAndroid Build Coastguard Worker		echo "ok"
582*053f45beSAndroid Build Coastguard Worker	fi
583*053f45beSAndroid Build Coastguard Worker
584*053f45beSAndroid Build Coastguard Worker	echo -n "Checking sysctl keeps original string on overflow append ... "
585*053f45beSAndroid Build Coastguard Worker	set_orig
586*053f45beSAndroid Build Coastguard Worker	perl -e 'print "A" x ('"${MAXLEN}"'-1), "B";' | \
587*053f45beSAndroid Build Coastguard Worker		dd of="${TARGET}" bs=$(( MAXLEN - 1 )) 2>/dev/null
588*053f45beSAndroid Build Coastguard Worker	if grep -q B "${TARGET}"; then
589*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
590*053f45beSAndroid Build Coastguard Worker		rc=1
591*053f45beSAndroid Build Coastguard Worker	else
592*053f45beSAndroid Build Coastguard Worker		echo "ok"
593*053f45beSAndroid Build Coastguard Worker	fi
594*053f45beSAndroid Build Coastguard Worker
595*053f45beSAndroid Build Coastguard Worker	echo -n "Checking sysctl stays NULL terminated on write ... "
596*053f45beSAndroid Build Coastguard Worker	set_orig
597*053f45beSAndroid Build Coastguard Worker	perl -e 'print "A" x ('"${MAXLEN}"'-1), "B";' | \
598*053f45beSAndroid Build Coastguard Worker		dd of="${TARGET}" bs="${MAXLEN}" 2>/dev/null
599*053f45beSAndroid Build Coastguard Worker	if grep -q B "${TARGET}"; then
600*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
601*053f45beSAndroid Build Coastguard Worker		rc=1
602*053f45beSAndroid Build Coastguard Worker	else
603*053f45beSAndroid Build Coastguard Worker		echo "ok"
604*053f45beSAndroid Build Coastguard Worker	fi
605*053f45beSAndroid Build Coastguard Worker
606*053f45beSAndroid Build Coastguard Worker	echo -n "Checking sysctl stays NULL terminated on overwrite ... "
607*053f45beSAndroid Build Coastguard Worker	set_orig
608*053f45beSAndroid Build Coastguard Worker	perl -e 'print "A" x ('"${MAXLEN}"'-1), "BB";' | \
609*053f45beSAndroid Build Coastguard Worker		dd of="${TARGET}" bs=$(( $MAXLEN + 1 )) 2>/dev/null
610*053f45beSAndroid Build Coastguard Worker	if grep -q B "${TARGET}"; then
611*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
612*053f45beSAndroid Build Coastguard Worker		rc=1
613*053f45beSAndroid Build Coastguard Worker	else
614*053f45beSAndroid Build Coastguard Worker		echo "ok"
615*053f45beSAndroid Build Coastguard Worker	fi
616*053f45beSAndroid Build Coastguard Worker
617*053f45beSAndroid Build Coastguard Worker	test_rc
618*053f45beSAndroid Build Coastguard Worker}
619*053f45beSAndroid Build Coastguard Worker
620*053f45beSAndroid Build Coastguard Workertarget_exists()
621*053f45beSAndroid Build Coastguard Worker{
622*053f45beSAndroid Build Coastguard Worker	TARGET="${SYSCTL}/$1"
623*053f45beSAndroid Build Coastguard Worker	TEST_ID="$2"
624*053f45beSAndroid Build Coastguard Worker
625*053f45beSAndroid Build Coastguard Worker	if [ ! -f ${TARGET} ] ; then
626*053f45beSAndroid Build Coastguard Worker		echo "Target for test $TEST_ID: $TARGET not exist, skipping test ..."
627*053f45beSAndroid Build Coastguard Worker		return 0
628*053f45beSAndroid Build Coastguard Worker	fi
629*053f45beSAndroid Build Coastguard Worker	return 1
630*053f45beSAndroid Build Coastguard Worker}
631*053f45beSAndroid Build Coastguard Worker
632*053f45beSAndroid Build Coastguard Workerrun_bitmaptest() {
633*053f45beSAndroid Build Coastguard Worker	# Total length of bitmaps string to use, a bit under
634*053f45beSAndroid Build Coastguard Worker	# the maximum input size of the test node
635*053f45beSAndroid Build Coastguard Worker	LENGTH=$((RANDOM % 65000))
636*053f45beSAndroid Build Coastguard Worker
637*053f45beSAndroid Build Coastguard Worker	# First bit to set
638*053f45beSAndroid Build Coastguard Worker	BIT=$((RANDOM % 1024))
639*053f45beSAndroid Build Coastguard Worker
640*053f45beSAndroid Build Coastguard Worker	# String containing our list of bits to set
641*053f45beSAndroid Build Coastguard Worker	TEST_STR=$BIT
642*053f45beSAndroid Build Coastguard Worker
643*053f45beSAndroid Build Coastguard Worker	# build up the string
644*053f45beSAndroid Build Coastguard Worker	while [ "${#TEST_STR}" -le "$LENGTH" ]; do
645*053f45beSAndroid Build Coastguard Worker		# Make sure next entry is discontiguous,
646*053f45beSAndroid Build Coastguard Worker		# skip ahead at least 2
647*053f45beSAndroid Build Coastguard Worker		BIT=$((BIT + $((2 + RANDOM % 10))))
648*053f45beSAndroid Build Coastguard Worker
649*053f45beSAndroid Build Coastguard Worker		# Add new bit to the list
650*053f45beSAndroid Build Coastguard Worker		TEST_STR="${TEST_STR},${BIT}"
651*053f45beSAndroid Build Coastguard Worker
652*053f45beSAndroid Build Coastguard Worker		# Randomly make it a range
653*053f45beSAndroid Build Coastguard Worker		if [ "$((RANDOM % 2))" -eq "1" ]; then
654*053f45beSAndroid Build Coastguard Worker			RANGE_END=$((BIT + $((1 + RANDOM % 10))))
655*053f45beSAndroid Build Coastguard Worker			TEST_STR="${TEST_STR}-${RANGE_END}"
656*053f45beSAndroid Build Coastguard Worker			BIT=$RANGE_END
657*053f45beSAndroid Build Coastguard Worker		fi
658*053f45beSAndroid Build Coastguard Worker	done
659*053f45beSAndroid Build Coastguard Worker
660*053f45beSAndroid Build Coastguard Worker	echo -n "Checking bitmap handler... "
661*053f45beSAndroid Build Coastguard Worker	TEST_FILE=$(mktemp)
662*053f45beSAndroid Build Coastguard Worker	echo -n "$TEST_STR" > $TEST_FILE
663*053f45beSAndroid Build Coastguard Worker
664*053f45beSAndroid Build Coastguard Worker	cat $TEST_FILE > $TARGET 2> /dev/null
665*053f45beSAndroid Build Coastguard Worker	if [ $? -ne 0 ]; then
666*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
667*053f45beSAndroid Build Coastguard Worker		rc=1
668*053f45beSAndroid Build Coastguard Worker		test_rc
669*053f45beSAndroid Build Coastguard Worker	fi
670*053f45beSAndroid Build Coastguard Worker
671*053f45beSAndroid Build Coastguard Worker	if ! verify_diff_proc_file "$TARGET" "$TEST_FILE"; then
672*053f45beSAndroid Build Coastguard Worker		echo "FAIL" >&2
673*053f45beSAndroid Build Coastguard Worker		rc=1
674*053f45beSAndroid Build Coastguard Worker	else
675*053f45beSAndroid Build Coastguard Worker		echo "ok"
676*053f45beSAndroid Build Coastguard Worker		rc=0
677*053f45beSAndroid Build Coastguard Worker	fi
678*053f45beSAndroid Build Coastguard Worker	test_rc
679*053f45beSAndroid Build Coastguard Worker}
680*053f45beSAndroid Build Coastguard Worker
681*053f45beSAndroid Build Coastguard Workersysctl_test_0001()
682*053f45beSAndroid Build Coastguard Worker{
683*053f45beSAndroid Build Coastguard Worker	TARGET="${SYSCTL}/$(get_test_target 0001)"
684*053f45beSAndroid Build Coastguard Worker	reset_vals
685*053f45beSAndroid Build Coastguard Worker	ORIG=$(cat "${TARGET}")
686*053f45beSAndroid Build Coastguard Worker	TEST_STR=$(( $ORIG + 1 ))
687*053f45beSAndroid Build Coastguard Worker
688*053f45beSAndroid Build Coastguard Worker	run_numerictests
689*053f45beSAndroid Build Coastguard Worker	run_wideint_tests
690*053f45beSAndroid Build Coastguard Worker	run_limit_digit
691*053f45beSAndroid Build Coastguard Worker}
692*053f45beSAndroid Build Coastguard Worker
693*053f45beSAndroid Build Coastguard Workersysctl_test_0002()
694*053f45beSAndroid Build Coastguard Worker{
695*053f45beSAndroid Build Coastguard Worker	TARGET="${SYSCTL}/$(get_test_target 0002)"
696*053f45beSAndroid Build Coastguard Worker	reset_vals
697*053f45beSAndroid Build Coastguard Worker	ORIG=$(cat "${TARGET}")
698*053f45beSAndroid Build Coastguard Worker	TEST_STR="Testing sysctl"
699*053f45beSAndroid Build Coastguard Worker	# Only string sysctls support seeking/appending.
700*053f45beSAndroid Build Coastguard Worker	MAXLEN=65
701*053f45beSAndroid Build Coastguard Worker
702*053f45beSAndroid Build Coastguard Worker	run_numerictests
703*053f45beSAndroid Build Coastguard Worker	run_stringtests
704*053f45beSAndroid Build Coastguard Worker}
705*053f45beSAndroid Build Coastguard Worker
706*053f45beSAndroid Build Coastguard Workersysctl_test_0003()
707*053f45beSAndroid Build Coastguard Worker{
708*053f45beSAndroid Build Coastguard Worker	TARGET="${SYSCTL}/$(get_test_target 0003)"
709*053f45beSAndroid Build Coastguard Worker	reset_vals
710*053f45beSAndroid Build Coastguard Worker	ORIG=$(cat "${TARGET}")
711*053f45beSAndroid Build Coastguard Worker	TEST_STR=$(( $ORIG + 1 ))
712*053f45beSAndroid Build Coastguard Worker
713*053f45beSAndroid Build Coastguard Worker	run_numerictests
714*053f45beSAndroid Build Coastguard Worker	run_wideint_tests
715*053f45beSAndroid Build Coastguard Worker	run_limit_digit
716*053f45beSAndroid Build Coastguard Worker	run_limit_digit_int
717*053f45beSAndroid Build Coastguard Worker}
718*053f45beSAndroid Build Coastguard Worker
719*053f45beSAndroid Build Coastguard Workersysctl_test_0004()
720*053f45beSAndroid Build Coastguard Worker{
721*053f45beSAndroid Build Coastguard Worker	TARGET="${SYSCTL}/$(get_test_target 0004)"
722*053f45beSAndroid Build Coastguard Worker	reset_vals
723*053f45beSAndroid Build Coastguard Worker	ORIG=$(cat "${TARGET}")
724*053f45beSAndroid Build Coastguard Worker	TEST_STR=$(( $ORIG + 1 ))
725*053f45beSAndroid Build Coastguard Worker
726*053f45beSAndroid Build Coastguard Worker	run_numerictests
727*053f45beSAndroid Build Coastguard Worker	run_wideint_tests
728*053f45beSAndroid Build Coastguard Worker	run_limit_digit
729*053f45beSAndroid Build Coastguard Worker	run_limit_digit_uint
730*053f45beSAndroid Build Coastguard Worker}
731*053f45beSAndroid Build Coastguard Worker
732*053f45beSAndroid Build Coastguard Workersysctl_test_0005()
733*053f45beSAndroid Build Coastguard Worker{
734*053f45beSAndroid Build Coastguard Worker	TARGET="${SYSCTL}/$(get_test_target 0005)"
735*053f45beSAndroid Build Coastguard Worker	reset_vals
736*053f45beSAndroid Build Coastguard Worker	ORIG=$(cat "${TARGET}")
737*053f45beSAndroid Build Coastguard Worker
738*053f45beSAndroid Build Coastguard Worker	run_limit_digit_int_array
739*053f45beSAndroid Build Coastguard Worker}
740*053f45beSAndroid Build Coastguard Worker
741*053f45beSAndroid Build Coastguard Workersysctl_test_0006()
742*053f45beSAndroid Build Coastguard Worker{
743*053f45beSAndroid Build Coastguard Worker	TARGET="${SYSCTL}/bitmap_0001"
744*053f45beSAndroid Build Coastguard Worker	reset_vals
745*053f45beSAndroid Build Coastguard Worker	ORIG=""
746*053f45beSAndroid Build Coastguard Worker	run_bitmaptest
747*053f45beSAndroid Build Coastguard Worker}
748*053f45beSAndroid Build Coastguard Worker
749*053f45beSAndroid Build Coastguard Workersysctl_test_0007()
750*053f45beSAndroid Build Coastguard Worker{
751*053f45beSAndroid Build Coastguard Worker	TARGET="${SYSCTL}/boot_int"
752*053f45beSAndroid Build Coastguard Worker	if [ ! -f $TARGET ]; then
753*053f45beSAndroid Build Coastguard Worker		echo "Skipping test for $TARGET as it is not present ..."
754*053f45beSAndroid Build Coastguard Worker		return $ksft_skip
755*053f45beSAndroid Build Coastguard Worker	fi
756*053f45beSAndroid Build Coastguard Worker
757*053f45beSAndroid Build Coastguard Worker	if [ -d $DIR ]; then
758*053f45beSAndroid Build Coastguard Worker		echo "Boot param test only possible sysctl_test is built-in, not module:"
759*053f45beSAndroid Build Coastguard Worker		cat $TEST_DIR/config >&2
760*053f45beSAndroid Build Coastguard Worker		return $ksft_skip
761*053f45beSAndroid Build Coastguard Worker	fi
762*053f45beSAndroid Build Coastguard Worker
763*053f45beSAndroid Build Coastguard Worker	echo -n "Testing if $TARGET is set to 1 ..."
764*053f45beSAndroid Build Coastguard Worker	ORIG=$(cat "${TARGET}")
765*053f45beSAndroid Build Coastguard Worker
766*053f45beSAndroid Build Coastguard Worker	if [ x$ORIG = "x1" ]; then
767*053f45beSAndroid Build Coastguard Worker		echo "ok"
768*053f45beSAndroid Build Coastguard Worker		return 0
769*053f45beSAndroid Build Coastguard Worker	fi
770*053f45beSAndroid Build Coastguard Worker	echo "FAIL"
771*053f45beSAndroid Build Coastguard Worker	echo "Checking if /proc/cmdline contains setting of the expected parameter ..."
772*053f45beSAndroid Build Coastguard Worker	if [ ! -f /proc/cmdline ]; then
773*053f45beSAndroid Build Coastguard Worker		echo "/proc/cmdline does not exist, test inconclusive"
774*053f45beSAndroid Build Coastguard Worker		return 0
775*053f45beSAndroid Build Coastguard Worker	fi
776*053f45beSAndroid Build Coastguard Worker
777*053f45beSAndroid Build Coastguard Worker	FOUND=$(grep -c "sysctl[./]debug[./]test_sysctl[./]boot_int=1" /proc/cmdline)
778*053f45beSAndroid Build Coastguard Worker	if [ $FOUND = "1" ]; then
779*053f45beSAndroid Build Coastguard Worker		echo "Kernel param found but $TARGET is not 1, TEST FAILED"
780*053f45beSAndroid Build Coastguard Worker		rc=1
781*053f45beSAndroid Build Coastguard Worker		test_rc
782*053f45beSAndroid Build Coastguard Worker	fi
783*053f45beSAndroid Build Coastguard Worker
784*053f45beSAndroid Build Coastguard Worker	echo "Skipping test, expected kernel parameter missing."
785*053f45beSAndroid Build Coastguard Worker	echo "To perform this test, make sure kernel is booted with parameter: sysctl.debug.test_sysctl.boot_int=1"
786*053f45beSAndroid Build Coastguard Worker	return $ksft_skip
787*053f45beSAndroid Build Coastguard Worker}
788*053f45beSAndroid Build Coastguard Worker
789*053f45beSAndroid Build Coastguard Workersysctl_test_0008()
790*053f45beSAndroid Build Coastguard Worker{
791*053f45beSAndroid Build Coastguard Worker	TARGET="${SYSCTL}/match_int"
792*053f45beSAndroid Build Coastguard Worker	if [ ! -f $TARGET ]; then
793*053f45beSAndroid Build Coastguard Worker		echo "Skipping test for $TARGET as it is not present ..."
794*053f45beSAndroid Build Coastguard Worker		return $ksft_skip
795*053f45beSAndroid Build Coastguard Worker	fi
796*053f45beSAndroid Build Coastguard Worker
797*053f45beSAndroid Build Coastguard Worker	echo -n "Testing if $TARGET is matched in kernel"
798*053f45beSAndroid Build Coastguard Worker	ORIG_VALUE=$(cat "${TARGET}")
799*053f45beSAndroid Build Coastguard Worker
800*053f45beSAndroid Build Coastguard Worker	if [ $ORIG_VALUE -ne 1 ]; then
801*053f45beSAndroid Build Coastguard Worker		echo "TEST FAILED"
802*053f45beSAndroid Build Coastguard Worker		rc=1
803*053f45beSAndroid Build Coastguard Worker		test_rc
804*053f45beSAndroid Build Coastguard Worker	fi
805*053f45beSAndroid Build Coastguard Worker
806*053f45beSAndroid Build Coastguard Worker	echo "ok"
807*053f45beSAndroid Build Coastguard Worker	return 0
808*053f45beSAndroid Build Coastguard Worker}
809*053f45beSAndroid Build Coastguard Worker
810*053f45beSAndroid Build Coastguard Workerlist_tests()
811*053f45beSAndroid Build Coastguard Worker{
812*053f45beSAndroid Build Coastguard Worker	echo "Test ID list:"
813*053f45beSAndroid Build Coastguard Worker	echo
814*053f45beSAndroid Build Coastguard Worker	echo "TEST_ID x NUM_TEST"
815*053f45beSAndroid Build Coastguard Worker	echo "TEST_ID:   Test ID"
816*053f45beSAndroid Build Coastguard Worker	echo "NUM_TESTS: Number of recommended times to run the test"
817*053f45beSAndroid Build Coastguard Worker	echo
818*053f45beSAndroid Build Coastguard Worker	echo "0001 x $(get_test_count 0001) - tests proc_dointvec_minmax()"
819*053f45beSAndroid Build Coastguard Worker	echo "0002 x $(get_test_count 0002) - tests proc_dostring()"
820*053f45beSAndroid Build Coastguard Worker	echo "0003 x $(get_test_count 0003) - tests proc_dointvec()"
821*053f45beSAndroid Build Coastguard Worker	echo "0004 x $(get_test_count 0004) - tests proc_douintvec()"
822*053f45beSAndroid Build Coastguard Worker	echo "0005 x $(get_test_count 0005) - tests proc_douintvec() array"
823*053f45beSAndroid Build Coastguard Worker	echo "0006 x $(get_test_count 0006) - tests proc_do_large_bitmap()"
824*053f45beSAndroid Build Coastguard Worker	echo "0007 x $(get_test_count 0007) - tests setting sysctl from kernel boot param"
825*053f45beSAndroid Build Coastguard Worker	echo "0008 x $(get_test_count 0008) - tests sysctl macro values match"
826*053f45beSAndroid Build Coastguard Worker}
827*053f45beSAndroid Build Coastguard Worker
828*053f45beSAndroid Build Coastguard Workerusage()
829*053f45beSAndroid Build Coastguard Worker{
830*053f45beSAndroid Build Coastguard Worker	NUM_TESTS=$(grep -o ' ' <<<"$ALL_TESTS" | grep -c .)
831*053f45beSAndroid Build Coastguard Worker	let NUM_TESTS=$NUM_TESTS+1
832*053f45beSAndroid Build Coastguard Worker	MAX_TEST=$(printf "%04d\n" $NUM_TESTS)
833*053f45beSAndroid Build Coastguard Worker	echo "Usage: $0 [ -t <4-number-digit> ] | [ -w <4-number-digit> ] |"
834*053f45beSAndroid Build Coastguard Worker	echo "		 [ -s <4-number-digit> ] | [ -c <4-number-digit> <test- count>"
835*053f45beSAndroid Build Coastguard Worker	echo "           [ all ] [ -h | --help ] [ -l ]"
836*053f45beSAndroid Build Coastguard Worker	echo ""
837*053f45beSAndroid Build Coastguard Worker	echo "Valid tests: 0001-$MAX_TEST"
838*053f45beSAndroid Build Coastguard Worker	echo ""
839*053f45beSAndroid Build Coastguard Worker	echo "    all     Runs all tests (default)"
840*053f45beSAndroid Build Coastguard Worker	echo "    -t      Run test ID the number amount of times is recommended"
841*053f45beSAndroid Build Coastguard Worker	echo "    -w      Watch test ID run until it runs into an error"
842*053f45beSAndroid Build Coastguard Worker	echo "    -c      Run test ID once"
843*053f45beSAndroid Build Coastguard Worker	echo "    -s      Run test ID x test-count number of times"
844*053f45beSAndroid Build Coastguard Worker	echo "    -l      List all test ID list"
845*053f45beSAndroid Build Coastguard Worker	echo " -h|--help  Help"
846*053f45beSAndroid Build Coastguard Worker	echo
847*053f45beSAndroid Build Coastguard Worker	echo "If an error every occurs execution will immediately terminate."
848*053f45beSAndroid Build Coastguard Worker	echo "If you are adding a new test try using -w <test-ID> first to"
849*053f45beSAndroid Build Coastguard Worker	echo "make sure the test passes a series of tests."
850*053f45beSAndroid Build Coastguard Worker	echo
851*053f45beSAndroid Build Coastguard Worker	echo Example uses:
852*053f45beSAndroid Build Coastguard Worker	echo
853*053f45beSAndroid Build Coastguard Worker	echo "$TEST_NAME.sh            -- executes all tests"
854*053f45beSAndroid Build Coastguard Worker	echo "$TEST_NAME.sh -t 0002    -- Executes test ID 0002 number of times is recomended"
855*053f45beSAndroid Build Coastguard Worker	echo "$TEST_NAME.sh -w 0002    -- Watch test ID 0002 run until an error occurs"
856*053f45beSAndroid Build Coastguard Worker	echo "$TEST_NAME.sh -s 0002    -- Run test ID 0002 once"
857*053f45beSAndroid Build Coastguard Worker	echo "$TEST_NAME.sh -c 0002 3  -- Run test ID 0002 three times"
858*053f45beSAndroid Build Coastguard Worker	echo
859*053f45beSAndroid Build Coastguard Worker	list_tests
860*053f45beSAndroid Build Coastguard Worker	exit 1
861*053f45beSAndroid Build Coastguard Worker}
862*053f45beSAndroid Build Coastguard Worker
863*053f45beSAndroid Build Coastguard Workerfunction test_num()
864*053f45beSAndroid Build Coastguard Worker{
865*053f45beSAndroid Build Coastguard Worker	re='^[0-9]+$'
866*053f45beSAndroid Build Coastguard Worker	if ! [[ $1 =~ $re ]]; then
867*053f45beSAndroid Build Coastguard Worker		usage
868*053f45beSAndroid Build Coastguard Worker	fi
869*053f45beSAndroid Build Coastguard Worker}
870*053f45beSAndroid Build Coastguard Worker
871*053f45beSAndroid Build Coastguard Workerfunction get_test_count()
872*053f45beSAndroid Build Coastguard Worker{
873*053f45beSAndroid Build Coastguard Worker	test_num $1
874*053f45beSAndroid Build Coastguard Worker	TEST_DATA=$(echo $ALL_TESTS | awk '{print $'$1'}')
875*053f45beSAndroid Build Coastguard Worker	echo ${TEST_DATA} | awk -F":" '{print $2}'
876*053f45beSAndroid Build Coastguard Worker}
877*053f45beSAndroid Build Coastguard Worker
878*053f45beSAndroid Build Coastguard Workerfunction get_test_enabled()
879*053f45beSAndroid Build Coastguard Worker{
880*053f45beSAndroid Build Coastguard Worker	test_num $1
881*053f45beSAndroid Build Coastguard Worker	TEST_DATA=$(echo $ALL_TESTS | awk '{print $'$1'}')
882*053f45beSAndroid Build Coastguard Worker	echo ${TEST_DATA} | awk -F":" '{print $3}'
883*053f45beSAndroid Build Coastguard Worker}
884*053f45beSAndroid Build Coastguard Worker
885*053f45beSAndroid Build Coastguard Workerfunction get_test_target()
886*053f45beSAndroid Build Coastguard Worker{
887*053f45beSAndroid Build Coastguard Worker	test_num $1
888*053f45beSAndroid Build Coastguard Worker	TEST_DATA=$(echo $ALL_TESTS | awk '{print $'$1'}')
889*053f45beSAndroid Build Coastguard Worker	echo ${TEST_DATA} | awk -F":" '{print $4}'
890*053f45beSAndroid Build Coastguard Worker}
891*053f45beSAndroid Build Coastguard Worker
892*053f45beSAndroid Build Coastguard Workerfunction run_all_tests()
893*053f45beSAndroid Build Coastguard Worker{
894*053f45beSAndroid Build Coastguard Worker	for i in $ALL_TESTS ; do
895*053f45beSAndroid Build Coastguard Worker		TEST_ID=${i%:*:*:*}
896*053f45beSAndroid Build Coastguard Worker		ENABLED=$(get_test_enabled $TEST_ID)
897*053f45beSAndroid Build Coastguard Worker		TEST_COUNT=$(get_test_count $TEST_ID)
898*053f45beSAndroid Build Coastguard Worker		TEST_TARGET=$(get_test_target $TEST_ID)
899*053f45beSAndroid Build Coastguard Worker		if target_exists $TEST_TARGET $TEST_ID; then
900*053f45beSAndroid Build Coastguard Worker			continue
901*053f45beSAndroid Build Coastguard Worker		fi
902*053f45beSAndroid Build Coastguard Worker		if [[ $ENABLED -eq "1" ]]; then
903*053f45beSAndroid Build Coastguard Worker			test_case $TEST_ID $TEST_COUNT $TEST_TARGET
904*053f45beSAndroid Build Coastguard Worker		fi
905*053f45beSAndroid Build Coastguard Worker	done
906*053f45beSAndroid Build Coastguard Worker}
907*053f45beSAndroid Build Coastguard Worker
908*053f45beSAndroid Build Coastguard Workerfunction watch_log()
909*053f45beSAndroid Build Coastguard Worker{
910*053f45beSAndroid Build Coastguard Worker	if [ $# -ne 3 ]; then
911*053f45beSAndroid Build Coastguard Worker		clear
912*053f45beSAndroid Build Coastguard Worker	fi
913*053f45beSAndroid Build Coastguard Worker	date
914*053f45beSAndroid Build Coastguard Worker	echo "Running test: $2 - run #$1"
915*053f45beSAndroid Build Coastguard Worker}
916*053f45beSAndroid Build Coastguard Worker
917*053f45beSAndroid Build Coastguard Workerfunction watch_case()
918*053f45beSAndroid Build Coastguard Worker{
919*053f45beSAndroid Build Coastguard Worker	i=0
920*053f45beSAndroid Build Coastguard Worker	while [ 1 ]; do
921*053f45beSAndroid Build Coastguard Worker
922*053f45beSAndroid Build Coastguard Worker		if [ $# -eq 1 ]; then
923*053f45beSAndroid Build Coastguard Worker			test_num $1
924*053f45beSAndroid Build Coastguard Worker			watch_log $i ${TEST_NAME}_test_$1
925*053f45beSAndroid Build Coastguard Worker			${TEST_NAME}_test_$1
926*053f45beSAndroid Build Coastguard Worker		else
927*053f45beSAndroid Build Coastguard Worker			watch_log $i all
928*053f45beSAndroid Build Coastguard Worker			run_all_tests
929*053f45beSAndroid Build Coastguard Worker		fi
930*053f45beSAndroid Build Coastguard Worker		let i=$i+1
931*053f45beSAndroid Build Coastguard Worker	done
932*053f45beSAndroid Build Coastguard Worker}
933*053f45beSAndroid Build Coastguard Worker
934*053f45beSAndroid Build Coastguard Workerfunction test_case()
935*053f45beSAndroid Build Coastguard Worker{
936*053f45beSAndroid Build Coastguard Worker	NUM_TESTS=$2
937*053f45beSAndroid Build Coastguard Worker
938*053f45beSAndroid Build Coastguard Worker	i=0
939*053f45beSAndroid Build Coastguard Worker
940*053f45beSAndroid Build Coastguard Worker	if target_exists $3 $1; then
941*053f45beSAndroid Build Coastguard Worker		continue
942*053f45beSAndroid Build Coastguard Worker	fi
943*053f45beSAndroid Build Coastguard Worker
944*053f45beSAndroid Build Coastguard Worker	while [ $i -lt $NUM_TESTS ]; do
945*053f45beSAndroid Build Coastguard Worker		test_num $1
946*053f45beSAndroid Build Coastguard Worker		watch_log $i ${TEST_NAME}_test_$1 noclear
947*053f45beSAndroid Build Coastguard Worker		RUN_TEST=${TEST_NAME}_test_$1
948*053f45beSAndroid Build Coastguard Worker		$RUN_TEST
949*053f45beSAndroid Build Coastguard Worker		let i=$i+1
950*053f45beSAndroid Build Coastguard Worker	done
951*053f45beSAndroid Build Coastguard Worker}
952*053f45beSAndroid Build Coastguard Worker
953*053f45beSAndroid Build Coastguard Workerfunction parse_args()
954*053f45beSAndroid Build Coastguard Worker{
955*053f45beSAndroid Build Coastguard Worker	if [ $# -eq 0 ]; then
956*053f45beSAndroid Build Coastguard Worker		run_all_tests
957*053f45beSAndroid Build Coastguard Worker	else
958*053f45beSAndroid Build Coastguard Worker		if [[ "$1" = "all" ]]; then
959*053f45beSAndroid Build Coastguard Worker			run_all_tests
960*053f45beSAndroid Build Coastguard Worker		elif [[ "$1" = "-w" ]]; then
961*053f45beSAndroid Build Coastguard Worker			shift
962*053f45beSAndroid Build Coastguard Worker			watch_case $@
963*053f45beSAndroid Build Coastguard Worker		elif [[ "$1" = "-t" ]]; then
964*053f45beSAndroid Build Coastguard Worker			shift
965*053f45beSAndroid Build Coastguard Worker			test_num $1
966*053f45beSAndroid Build Coastguard Worker			test_case $1 $(get_test_count $1) $(get_test_target $1)
967*053f45beSAndroid Build Coastguard Worker		elif [[ "$1" = "-c" ]]; then
968*053f45beSAndroid Build Coastguard Worker			shift
969*053f45beSAndroid Build Coastguard Worker			test_num $1
970*053f45beSAndroid Build Coastguard Worker			test_num $2
971*053f45beSAndroid Build Coastguard Worker			test_case $1 $2 $(get_test_target $1)
972*053f45beSAndroid Build Coastguard Worker		elif [[ "$1" = "-s" ]]; then
973*053f45beSAndroid Build Coastguard Worker			shift
974*053f45beSAndroid Build Coastguard Worker			test_case $1 1 $(get_test_target $1)
975*053f45beSAndroid Build Coastguard Worker		elif [[ "$1" = "-l" ]]; then
976*053f45beSAndroid Build Coastguard Worker			list_tests
977*053f45beSAndroid Build Coastguard Worker		elif [[ "$1" = "-h" || "$1" = "--help" ]]; then
978*053f45beSAndroid Build Coastguard Worker			usage
979*053f45beSAndroid Build Coastguard Worker		else
980*053f45beSAndroid Build Coastguard Worker			usage
981*053f45beSAndroid Build Coastguard Worker		fi
982*053f45beSAndroid Build Coastguard Worker	fi
983*053f45beSAndroid Build Coastguard Worker}
984*053f45beSAndroid Build Coastguard Worker
985*053f45beSAndroid Build Coastguard Workertest_reqs
986*053f45beSAndroid Build Coastguard Workerallow_user_defaults
987*053f45beSAndroid Build Coastguard Workercheck_production_sysctl_writes_strict
988*053f45beSAndroid Build Coastguard Workerload_req_mod
989*053f45beSAndroid Build Coastguard Worker
990*053f45beSAndroid Build Coastguard Workertrap "test_finish" EXIT
991*053f45beSAndroid Build Coastguard Worker
992*053f45beSAndroid Build Coastguard Workerparse_args $@
993*053f45beSAndroid Build Coastguard Worker
994*053f45beSAndroid Build Coastguard Workerexit 0
995