162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-or-later OR copyleft-next-0.3.1
362306a36Sopenharmony_ci# Copyright (C) 2017 Luis R. Rodriguez <mcgrof@kernel.org>
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci# This performs a series tests against the proc sysctl interface.
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4.
862306a36Sopenharmony_ciksft_skip=4
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciTEST_NAME="sysctl"
1162306a36Sopenharmony_ciTEST_DRIVER="test_${TEST_NAME}"
1262306a36Sopenharmony_ciTEST_DIR=$(dirname $0)
1362306a36Sopenharmony_ciTEST_FILE=$(mktemp)
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci# This represents
1662306a36Sopenharmony_ci#
1762306a36Sopenharmony_ci# TEST_ID:TEST_COUNT:ENABLED:TARGET:SKIP_NO_TARGET
1862306a36Sopenharmony_ci#
1962306a36Sopenharmony_ci# TEST_ID: is the test id number
2062306a36Sopenharmony_ci# TEST_COUNT: number of times we should run the test
2162306a36Sopenharmony_ci# ENABLED: 1 if enabled, 0 otherwise
2262306a36Sopenharmony_ci# TARGET: test target file required on the test_sysctl module
2362306a36Sopenharmony_ci# SKIP_NO_TARGET: 1 skip if TARGET not there
2462306a36Sopenharmony_ci#                 0 run eventhough TARGET not there
2562306a36Sopenharmony_ci#
2662306a36Sopenharmony_ci# Once these are enabled please leave them as-is. Write your own test,
2762306a36Sopenharmony_ci# we have tons of space.
2862306a36Sopenharmony_ciALL_TESTS="0001:1:1:int_0001:1"
2962306a36Sopenharmony_ciALL_TESTS="$ALL_TESTS 0002:1:1:string_0001:1"
3062306a36Sopenharmony_ciALL_TESTS="$ALL_TESTS 0003:1:1:int_0002:1"
3162306a36Sopenharmony_ciALL_TESTS="$ALL_TESTS 0004:1:1:uint_0001:1"
3262306a36Sopenharmony_ciALL_TESTS="$ALL_TESTS 0005:3:1:int_0003:1"
3362306a36Sopenharmony_ciALL_TESTS="$ALL_TESTS 0006:50:1:bitmap_0001:1"
3462306a36Sopenharmony_ciALL_TESTS="$ALL_TESTS 0007:1:1:boot_int:1"
3562306a36Sopenharmony_ciALL_TESTS="$ALL_TESTS 0008:1:1:match_int:1"
3662306a36Sopenharmony_ciALL_TESTS="$ALL_TESTS 0009:1:1:unregister_error:0"
3762306a36Sopenharmony_ciALL_TESTS="$ALL_TESTS 0010:1:1:mnt/mnt_error:0"
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cifunction allow_user_defaults()
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	if [ -z $DIR ]; then
4262306a36Sopenharmony_ci		DIR="/sys/module/test_sysctl/"
4362306a36Sopenharmony_ci	fi
4462306a36Sopenharmony_ci	if [ -z $DEFAULT_NUM_TESTS ]; then
4562306a36Sopenharmony_ci		DEFAULT_NUM_TESTS=50
4662306a36Sopenharmony_ci	fi
4762306a36Sopenharmony_ci	if [ -z $SYSCTL ]; then
4862306a36Sopenharmony_ci		SYSCTL="/proc/sys/debug/test_sysctl"
4962306a36Sopenharmony_ci	fi
5062306a36Sopenharmony_ci	if [ -z $PROD_SYSCTL ]; then
5162306a36Sopenharmony_ci		PROD_SYSCTL="/proc/sys"
5262306a36Sopenharmony_ci	fi
5362306a36Sopenharmony_ci	if [ -z $WRITES_STRICT ]; then
5462306a36Sopenharmony_ci		WRITES_STRICT="${PROD_SYSCTL}/kernel/sysctl_writes_strict"
5562306a36Sopenharmony_ci	fi
5662306a36Sopenharmony_ci}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cifunction check_production_sysctl_writes_strict()
5962306a36Sopenharmony_ci{
6062306a36Sopenharmony_ci	echo -n "Checking production write strict setting ... "
6162306a36Sopenharmony_ci	if [ ! -e ${WRITES_STRICT} ]; then
6262306a36Sopenharmony_ci		echo "FAIL, but skip in case of old kernel" >&2
6362306a36Sopenharmony_ci	else
6462306a36Sopenharmony_ci		old_strict=$(cat ${WRITES_STRICT})
6562306a36Sopenharmony_ci		if [ "$old_strict" = "1" ]; then
6662306a36Sopenharmony_ci			echo "ok"
6762306a36Sopenharmony_ci		else
6862306a36Sopenharmony_ci			echo "FAIL, strict value is 0 but force to 1 to continue" >&2
6962306a36Sopenharmony_ci			echo "1" > ${WRITES_STRICT}
7062306a36Sopenharmony_ci		fi
7162306a36Sopenharmony_ci	fi
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	if [ -z $PAGE_SIZE ]; then
7462306a36Sopenharmony_ci		PAGE_SIZE=$(getconf PAGESIZE)
7562306a36Sopenharmony_ci	fi
7662306a36Sopenharmony_ci	if [ -z $MAX_DIGITS ]; then
7762306a36Sopenharmony_ci		MAX_DIGITS=$(($PAGE_SIZE/8))
7862306a36Sopenharmony_ci	fi
7962306a36Sopenharmony_ci	if [ -z $INT_MAX ]; then
8062306a36Sopenharmony_ci		INT_MAX=$(getconf INT_MAX)
8162306a36Sopenharmony_ci	fi
8262306a36Sopenharmony_ci	if [ -z $UINT_MAX ]; then
8362306a36Sopenharmony_ci		UINT_MAX=$(getconf UINT_MAX)
8462306a36Sopenharmony_ci	fi
8562306a36Sopenharmony_ci}
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_citest_reqs()
8862306a36Sopenharmony_ci{
8962306a36Sopenharmony_ci	uid=$(id -u)
9062306a36Sopenharmony_ci	if [ $uid -ne 0 ]; then
9162306a36Sopenharmony_ci		echo $msg must be run as root >&2
9262306a36Sopenharmony_ci		exit $ksft_skip
9362306a36Sopenharmony_ci	fi
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	if ! which perl 2> /dev/null > /dev/null; then
9662306a36Sopenharmony_ci		echo "$0: You need perl installed"
9762306a36Sopenharmony_ci		exit $ksft_skip
9862306a36Sopenharmony_ci	fi
9962306a36Sopenharmony_ci	if ! which getconf 2> /dev/null > /dev/null; then
10062306a36Sopenharmony_ci		echo "$0: You need getconf installed"
10162306a36Sopenharmony_ci		exit $ksft_skip
10262306a36Sopenharmony_ci	fi
10362306a36Sopenharmony_ci	if ! which diff 2> /dev/null > /dev/null; then
10462306a36Sopenharmony_ci		echo "$0: You need diff installed"
10562306a36Sopenharmony_ci		exit $ksft_skip
10662306a36Sopenharmony_ci	fi
10762306a36Sopenharmony_ci}
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_cifunction load_req_mod()
11062306a36Sopenharmony_ci{
11162306a36Sopenharmony_ci	if [ ! -d $SYSCTL ]; then
11262306a36Sopenharmony_ci		if ! modprobe -q -n $TEST_DRIVER; then
11362306a36Sopenharmony_ci			echo "$0: module $TEST_DRIVER not found [SKIP]"
11462306a36Sopenharmony_ci			echo "You must set CONFIG_TEST_SYSCTL=m in your kernel" >&2
11562306a36Sopenharmony_ci			exit $ksft_skip
11662306a36Sopenharmony_ci		fi
11762306a36Sopenharmony_ci		modprobe $TEST_DRIVER
11862306a36Sopenharmony_ci		if [ $? -ne 0 ]; then
11962306a36Sopenharmony_ci			echo "$0: modprobe $TEST_DRIVER failed."
12062306a36Sopenharmony_ci			exit
12162306a36Sopenharmony_ci		fi
12262306a36Sopenharmony_ci	fi
12362306a36Sopenharmony_ci}
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_cireset_vals()
12662306a36Sopenharmony_ci{
12762306a36Sopenharmony_ci	VAL=""
12862306a36Sopenharmony_ci	TRIGGER=$(basename ${TARGET})
12962306a36Sopenharmony_ci	case "$TRIGGER" in
13062306a36Sopenharmony_ci		int_0001)
13162306a36Sopenharmony_ci			VAL="60"
13262306a36Sopenharmony_ci			;;
13362306a36Sopenharmony_ci		int_0002)
13462306a36Sopenharmony_ci			VAL="1"
13562306a36Sopenharmony_ci			;;
13662306a36Sopenharmony_ci		uint_0001)
13762306a36Sopenharmony_ci			VAL="314"
13862306a36Sopenharmony_ci			;;
13962306a36Sopenharmony_ci		string_0001)
14062306a36Sopenharmony_ci			VAL="(none)"
14162306a36Sopenharmony_ci			;;
14262306a36Sopenharmony_ci		bitmap_0001)
14362306a36Sopenharmony_ci			VAL=""
14462306a36Sopenharmony_ci			;;
14562306a36Sopenharmony_ci		*)
14662306a36Sopenharmony_ci			;;
14762306a36Sopenharmony_ci	esac
14862306a36Sopenharmony_ci	echo -n $VAL > $TARGET
14962306a36Sopenharmony_ci}
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ciset_orig()
15262306a36Sopenharmony_ci{
15362306a36Sopenharmony_ci	if [ ! -z $TARGET ] && [ ! -z $ORIG ]; then
15462306a36Sopenharmony_ci		if [ -f ${TARGET} ]; then
15562306a36Sopenharmony_ci			echo "${ORIG}" > "${TARGET}"
15662306a36Sopenharmony_ci		fi
15762306a36Sopenharmony_ci	fi
15862306a36Sopenharmony_ci}
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ciset_test()
16162306a36Sopenharmony_ci{
16262306a36Sopenharmony_ci	echo "${TEST_STR}" > "${TARGET}"
16362306a36Sopenharmony_ci}
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_civerify()
16662306a36Sopenharmony_ci{
16762306a36Sopenharmony_ci	local seen
16862306a36Sopenharmony_ci	seen=$(cat "$1")
16962306a36Sopenharmony_ci	if [ "${seen}" != "${TEST_STR}" ]; then
17062306a36Sopenharmony_ci		return 1
17162306a36Sopenharmony_ci	fi
17262306a36Sopenharmony_ci	return 0
17362306a36Sopenharmony_ci}
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci# proc files get read a page at a time, which can confuse diff,
17662306a36Sopenharmony_ci# and get you incorrect results on proc files with long data. To use
17762306a36Sopenharmony_ci# diff against them you must first extract the output to a file, and
17862306a36Sopenharmony_ci# then compare against that file.
17962306a36Sopenharmony_civerify_diff_proc_file()
18062306a36Sopenharmony_ci{
18162306a36Sopenharmony_ci	TMP_DUMP_FILE=$(mktemp)
18262306a36Sopenharmony_ci	cat $1 > $TMP_DUMP_FILE
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci	if ! diff -w -q $TMP_DUMP_FILE $2; then
18562306a36Sopenharmony_ci		return 1
18662306a36Sopenharmony_ci	else
18762306a36Sopenharmony_ci		return 0
18862306a36Sopenharmony_ci	fi
18962306a36Sopenharmony_ci}
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_civerify_diff_w()
19262306a36Sopenharmony_ci{
19362306a36Sopenharmony_ci	echo "$TEST_STR" | diff -q -w -u - $1 > /dev/null
19462306a36Sopenharmony_ci	return $?
19562306a36Sopenharmony_ci}
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_citest_rc()
19862306a36Sopenharmony_ci{
19962306a36Sopenharmony_ci	if [[ $rc != 0 ]]; then
20062306a36Sopenharmony_ci		echo "Failed test, return value: $rc" >&2
20162306a36Sopenharmony_ci		exit $rc
20262306a36Sopenharmony_ci	fi
20362306a36Sopenharmony_ci}
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_citest_finish()
20662306a36Sopenharmony_ci{
20762306a36Sopenharmony_ci	set_orig
20862306a36Sopenharmony_ci	rm -f "${TEST_FILE}"
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	if [ ! -z ${old_strict} ]; then
21162306a36Sopenharmony_ci		echo ${old_strict} > ${WRITES_STRICT}
21262306a36Sopenharmony_ci	fi
21362306a36Sopenharmony_ci	exit $rc
21462306a36Sopenharmony_ci}
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_cirun_numerictests()
21762306a36Sopenharmony_ci{
21862306a36Sopenharmony_ci	echo "== Testing sysctl behavior against ${TARGET} =="
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	rc=0
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci	echo -n "Writing test file ... "
22362306a36Sopenharmony_ci	echo "${TEST_STR}" > "${TEST_FILE}"
22462306a36Sopenharmony_ci	if ! verify "${TEST_FILE}"; then
22562306a36Sopenharmony_ci		echo "FAIL" >&2
22662306a36Sopenharmony_ci		exit 1
22762306a36Sopenharmony_ci	else
22862306a36Sopenharmony_ci		echo "ok"
22962306a36Sopenharmony_ci	fi
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci	echo -n "Checking sysctl is not set to test value ... "
23262306a36Sopenharmony_ci	if verify "${TARGET}"; then
23362306a36Sopenharmony_ci		echo "FAIL" >&2
23462306a36Sopenharmony_ci		exit 1
23562306a36Sopenharmony_ci	else
23662306a36Sopenharmony_ci		echo "ok"
23762306a36Sopenharmony_ci	fi
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci	echo -n "Writing sysctl from shell ... "
24062306a36Sopenharmony_ci	set_test
24162306a36Sopenharmony_ci	if ! verify "${TARGET}"; then
24262306a36Sopenharmony_ci		echo "FAIL" >&2
24362306a36Sopenharmony_ci		exit 1
24462306a36Sopenharmony_ci	else
24562306a36Sopenharmony_ci		echo "ok"
24662306a36Sopenharmony_ci	fi
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci	echo -n "Resetting sysctl to original value ... "
24962306a36Sopenharmony_ci	set_orig
25062306a36Sopenharmony_ci	if verify "${TARGET}"; then
25162306a36Sopenharmony_ci		echo "FAIL" >&2
25262306a36Sopenharmony_ci		exit 1
25362306a36Sopenharmony_ci	else
25462306a36Sopenharmony_ci		echo "ok"
25562306a36Sopenharmony_ci	fi
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	# Now that we've validated the sanity of "set_test" and "set_orig",
25862306a36Sopenharmony_ci	# we can use those functions to set starting states before running
25962306a36Sopenharmony_ci	# specific behavioral tests.
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci	echo -n "Writing entire sysctl in single write ... "
26262306a36Sopenharmony_ci	set_orig
26362306a36Sopenharmony_ci	dd if="${TEST_FILE}" of="${TARGET}" bs=4096 2>/dev/null
26462306a36Sopenharmony_ci	if ! verify "${TARGET}"; then
26562306a36Sopenharmony_ci		echo "FAIL" >&2
26662306a36Sopenharmony_ci		rc=1
26762306a36Sopenharmony_ci	else
26862306a36Sopenharmony_ci		echo "ok"
26962306a36Sopenharmony_ci	fi
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci	echo -n "Writing middle of sysctl after synchronized seek ... "
27262306a36Sopenharmony_ci	set_test
27362306a36Sopenharmony_ci	dd if="${TEST_FILE}" of="${TARGET}" bs=1 seek=1 skip=1 2>/dev/null
27462306a36Sopenharmony_ci	if ! verify "${TARGET}"; then
27562306a36Sopenharmony_ci		echo "FAIL" >&2
27662306a36Sopenharmony_ci		rc=1
27762306a36Sopenharmony_ci	else
27862306a36Sopenharmony_ci		echo "ok"
27962306a36Sopenharmony_ci	fi
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci	echo -n "Writing beyond end of sysctl ... "
28262306a36Sopenharmony_ci	set_orig
28362306a36Sopenharmony_ci	dd if="${TEST_FILE}" of="${TARGET}" bs=20 seek=2 2>/dev/null
28462306a36Sopenharmony_ci	if verify "${TARGET}"; then
28562306a36Sopenharmony_ci		echo "FAIL" >&2
28662306a36Sopenharmony_ci		rc=1
28762306a36Sopenharmony_ci	else
28862306a36Sopenharmony_ci		echo "ok"
28962306a36Sopenharmony_ci	fi
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci	echo -n "Writing sysctl with multiple long writes ... "
29262306a36Sopenharmony_ci	set_orig
29362306a36Sopenharmony_ci	(perl -e 'print "A" x 50;'; echo "${TEST_STR}") | \
29462306a36Sopenharmony_ci		dd of="${TARGET}" bs=50 2>/dev/null
29562306a36Sopenharmony_ci	if verify "${TARGET}"; then
29662306a36Sopenharmony_ci		echo "FAIL" >&2
29762306a36Sopenharmony_ci		rc=1
29862306a36Sopenharmony_ci	else
29962306a36Sopenharmony_ci		echo "ok"
30062306a36Sopenharmony_ci	fi
30162306a36Sopenharmony_ci	test_rc
30262306a36Sopenharmony_ci}
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_cicheck_failure()
30562306a36Sopenharmony_ci{
30662306a36Sopenharmony_ci	echo -n "Testing that $1 fails as expected..."
30762306a36Sopenharmony_ci	reset_vals
30862306a36Sopenharmony_ci	TEST_STR="$1"
30962306a36Sopenharmony_ci	orig="$(cat $TARGET)"
31062306a36Sopenharmony_ci	echo -n "$TEST_STR" > $TARGET 2> /dev/null
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	# write should fail and $TARGET should retain its original value
31362306a36Sopenharmony_ci	if [ $? = 0 ] || [ "$(cat $TARGET)" != "$orig" ]; then
31462306a36Sopenharmony_ci		echo "FAIL" >&2
31562306a36Sopenharmony_ci		rc=1
31662306a36Sopenharmony_ci	else
31762306a36Sopenharmony_ci		echo "ok"
31862306a36Sopenharmony_ci	fi
31962306a36Sopenharmony_ci	test_rc
32062306a36Sopenharmony_ci}
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_cirun_wideint_tests()
32362306a36Sopenharmony_ci{
32462306a36Sopenharmony_ci	# sysctl conversion functions receive a boolean sign and ulong
32562306a36Sopenharmony_ci	# magnitude; here we list the magnitudes we want to test (each of
32662306a36Sopenharmony_ci	# which will be tested in both positive and negative forms).  Since
32762306a36Sopenharmony_ci	# none of these values fit in 32 bits, writing them to an int- or
32862306a36Sopenharmony_ci	# uint-typed sysctl should fail.
32962306a36Sopenharmony_ci	local magnitudes=(
33062306a36Sopenharmony_ci		# common boundary-condition values (zero, +1, -1, INT_MIN,
33162306a36Sopenharmony_ci		# and INT_MAX respectively) if truncated to lower 32 bits
33262306a36Sopenharmony_ci		# (potential for being falsely deemed in range)
33362306a36Sopenharmony_ci		0x0000000100000000
33462306a36Sopenharmony_ci		0x0000000100000001
33562306a36Sopenharmony_ci		0x00000001ffffffff
33662306a36Sopenharmony_ci		0x0000000180000000
33762306a36Sopenharmony_ci		0x000000017fffffff
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci		# these look like negatives, but without a leading '-' are
34062306a36Sopenharmony_ci		# actually large positives (should be rejected as above
34162306a36Sopenharmony_ci		# despite being zero/+1/-1/INT_MIN/INT_MAX in the lower 32)
34262306a36Sopenharmony_ci		0xffffffff00000000
34362306a36Sopenharmony_ci		0xffffffff00000001
34462306a36Sopenharmony_ci		0xffffffffffffffff
34562306a36Sopenharmony_ci		0xffffffff80000000
34662306a36Sopenharmony_ci		0xffffffff7fffffff
34762306a36Sopenharmony_ci	)
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci	for sign in '' '-'; do
35062306a36Sopenharmony_ci		for mag in "${magnitudes[@]}"; do
35162306a36Sopenharmony_ci			check_failure "${sign}${mag}"
35262306a36Sopenharmony_ci		done
35362306a36Sopenharmony_ci	done
35462306a36Sopenharmony_ci}
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci# Your test must accept digits 3 and 4 to use this
35762306a36Sopenharmony_cirun_limit_digit()
35862306a36Sopenharmony_ci{
35962306a36Sopenharmony_ci	echo -n "Checking ignoring spaces up to PAGE_SIZE works on write ..."
36062306a36Sopenharmony_ci	reset_vals
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci	LIMIT=$((MAX_DIGITS -1))
36362306a36Sopenharmony_ci	TEST_STR="3"
36462306a36Sopenharmony_ci	(perl -e 'print " " x '$LIMIT';'; echo "${TEST_STR}") | \
36562306a36Sopenharmony_ci		dd of="${TARGET}" 2>/dev/null
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci	if ! verify "${TARGET}"; then
36862306a36Sopenharmony_ci		echo "FAIL" >&2
36962306a36Sopenharmony_ci		rc=1
37062306a36Sopenharmony_ci	else
37162306a36Sopenharmony_ci		echo "ok"
37262306a36Sopenharmony_ci	fi
37362306a36Sopenharmony_ci	test_rc
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ci	echo -n "Checking passing PAGE_SIZE of spaces fails on write ..."
37662306a36Sopenharmony_ci	reset_vals
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci	LIMIT=$((MAX_DIGITS))
37962306a36Sopenharmony_ci	TEST_STR="4"
38062306a36Sopenharmony_ci	(perl -e 'print " " x '$LIMIT';'; echo "${TEST_STR}") | \
38162306a36Sopenharmony_ci		dd of="${TARGET}" 2>/dev/null
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci	if verify "${TARGET}"; then
38462306a36Sopenharmony_ci		echo "FAIL" >&2
38562306a36Sopenharmony_ci		rc=1
38662306a36Sopenharmony_ci	else
38762306a36Sopenharmony_ci		echo "ok"
38862306a36Sopenharmony_ci	fi
38962306a36Sopenharmony_ci	test_rc
39062306a36Sopenharmony_ci}
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_ci# You are using an int
39362306a36Sopenharmony_cirun_limit_digit_int()
39462306a36Sopenharmony_ci{
39562306a36Sopenharmony_ci	echo -n "Testing INT_MAX works ..."
39662306a36Sopenharmony_ci	reset_vals
39762306a36Sopenharmony_ci	TEST_STR="$INT_MAX"
39862306a36Sopenharmony_ci	echo -n $TEST_STR > $TARGET
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci	if ! verify "${TARGET}"; then
40162306a36Sopenharmony_ci		echo "FAIL" >&2
40262306a36Sopenharmony_ci		rc=1
40362306a36Sopenharmony_ci	else
40462306a36Sopenharmony_ci		echo "ok"
40562306a36Sopenharmony_ci	fi
40662306a36Sopenharmony_ci	test_rc
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci	echo -n "Testing INT_MAX + 1 will fail as expected..."
40962306a36Sopenharmony_ci	reset_vals
41062306a36Sopenharmony_ci	let TEST_STR=$INT_MAX+1
41162306a36Sopenharmony_ci	echo -n $TEST_STR > $TARGET 2> /dev/null
41262306a36Sopenharmony_ci
41362306a36Sopenharmony_ci	if verify "${TARGET}"; then
41462306a36Sopenharmony_ci		echo "FAIL" >&2
41562306a36Sopenharmony_ci		rc=1
41662306a36Sopenharmony_ci	else
41762306a36Sopenharmony_ci		echo "ok"
41862306a36Sopenharmony_ci	fi
41962306a36Sopenharmony_ci	test_rc
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_ci	echo -n "Testing negative values will work as expected..."
42262306a36Sopenharmony_ci	reset_vals
42362306a36Sopenharmony_ci	TEST_STR="-3"
42462306a36Sopenharmony_ci	echo -n $TEST_STR > $TARGET 2> /dev/null
42562306a36Sopenharmony_ci	if ! verify "${TARGET}"; then
42662306a36Sopenharmony_ci		echo "FAIL" >&2
42762306a36Sopenharmony_ci		rc=1
42862306a36Sopenharmony_ci	else
42962306a36Sopenharmony_ci		echo "ok"
43062306a36Sopenharmony_ci	fi
43162306a36Sopenharmony_ci	test_rc
43262306a36Sopenharmony_ci}
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ci# You used an int array
43562306a36Sopenharmony_cirun_limit_digit_int_array()
43662306a36Sopenharmony_ci{
43762306a36Sopenharmony_ci	echo -n "Testing array works as expected ... "
43862306a36Sopenharmony_ci	TEST_STR="4 3 2 1"
43962306a36Sopenharmony_ci	echo -n $TEST_STR > $TARGET
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_ci	if ! verify_diff_w "${TARGET}"; then
44262306a36Sopenharmony_ci		echo "FAIL" >&2
44362306a36Sopenharmony_ci		rc=1
44462306a36Sopenharmony_ci	else
44562306a36Sopenharmony_ci		echo "ok"
44662306a36Sopenharmony_ci	fi
44762306a36Sopenharmony_ci	test_rc
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_ci	echo -n "Testing skipping trailing array elements works ... "
45062306a36Sopenharmony_ci	# Do not reset_vals, carry on the values from the last test.
45162306a36Sopenharmony_ci	# If we only echo in two digits the last two are left intact
45262306a36Sopenharmony_ci	TEST_STR="100 101"
45362306a36Sopenharmony_ci	echo -n $TEST_STR > $TARGET
45462306a36Sopenharmony_ci	# After we echo in, to help diff we need to set on TEST_STR what
45562306a36Sopenharmony_ci	# we expect the result to be.
45662306a36Sopenharmony_ci	TEST_STR="100 101 2 1"
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ci	if ! verify_diff_w "${TARGET}"; then
45962306a36Sopenharmony_ci		echo "FAIL" >&2
46062306a36Sopenharmony_ci		rc=1
46162306a36Sopenharmony_ci	else
46262306a36Sopenharmony_ci		echo "ok"
46362306a36Sopenharmony_ci	fi
46462306a36Sopenharmony_ci	test_rc
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ci	echo -n "Testing PAGE_SIZE limit on array works ... "
46762306a36Sopenharmony_ci	# Do not reset_vals, carry on the values from the last test.
46862306a36Sopenharmony_ci	# Even if you use an int array, you are still restricted to
46962306a36Sopenharmony_ci	# MAX_DIGITS, this is a known limitation. Test limit works.
47062306a36Sopenharmony_ci	LIMIT=$((MAX_DIGITS -1))
47162306a36Sopenharmony_ci	TEST_STR="9"
47262306a36Sopenharmony_ci	(perl -e 'print " " x '$LIMIT';'; echo "${TEST_STR}") | \
47362306a36Sopenharmony_ci		dd of="${TARGET}" 2>/dev/null
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_ci	TEST_STR="9 101 2 1"
47662306a36Sopenharmony_ci	if ! verify_diff_w "${TARGET}"; then
47762306a36Sopenharmony_ci		echo "FAIL" >&2
47862306a36Sopenharmony_ci		rc=1
47962306a36Sopenharmony_ci	else
48062306a36Sopenharmony_ci		echo "ok"
48162306a36Sopenharmony_ci	fi
48262306a36Sopenharmony_ci	test_rc
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ci	echo -n "Testing exceeding PAGE_SIZE limit fails as expected ... "
48562306a36Sopenharmony_ci	# Do not reset_vals, carry on the values from the last test.
48662306a36Sopenharmony_ci	# Now go over limit.
48762306a36Sopenharmony_ci	LIMIT=$((MAX_DIGITS))
48862306a36Sopenharmony_ci	TEST_STR="7"
48962306a36Sopenharmony_ci	(perl -e 'print " " x '$LIMIT';'; echo "${TEST_STR}") | \
49062306a36Sopenharmony_ci		dd of="${TARGET}" 2>/dev/null
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci	TEST_STR="7 101 2 1"
49362306a36Sopenharmony_ci	if verify_diff_w "${TARGET}"; then
49462306a36Sopenharmony_ci		echo "FAIL" >&2
49562306a36Sopenharmony_ci		rc=1
49662306a36Sopenharmony_ci	else
49762306a36Sopenharmony_ci		echo "ok"
49862306a36Sopenharmony_ci	fi
49962306a36Sopenharmony_ci	test_rc
50062306a36Sopenharmony_ci}
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci# You are using an unsigned int
50362306a36Sopenharmony_cirun_limit_digit_uint()
50462306a36Sopenharmony_ci{
50562306a36Sopenharmony_ci	echo -n "Testing UINT_MAX works ..."
50662306a36Sopenharmony_ci	reset_vals
50762306a36Sopenharmony_ci	TEST_STR="$UINT_MAX"
50862306a36Sopenharmony_ci	echo -n $TEST_STR > $TARGET
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci	if ! verify "${TARGET}"; then
51162306a36Sopenharmony_ci		echo "FAIL" >&2
51262306a36Sopenharmony_ci		rc=1
51362306a36Sopenharmony_ci	else
51462306a36Sopenharmony_ci		echo "ok"
51562306a36Sopenharmony_ci	fi
51662306a36Sopenharmony_ci	test_rc
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ci	echo -n "Testing UINT_MAX + 1 will fail as expected..."
51962306a36Sopenharmony_ci	reset_vals
52062306a36Sopenharmony_ci	TEST_STR=$(($UINT_MAX+1))
52162306a36Sopenharmony_ci	echo -n $TEST_STR > $TARGET 2> /dev/null
52262306a36Sopenharmony_ci
52362306a36Sopenharmony_ci	if verify "${TARGET}"; then
52462306a36Sopenharmony_ci		echo "FAIL" >&2
52562306a36Sopenharmony_ci		rc=1
52662306a36Sopenharmony_ci	else
52762306a36Sopenharmony_ci		echo "ok"
52862306a36Sopenharmony_ci	fi
52962306a36Sopenharmony_ci	test_rc
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_ci	echo -n "Testing negative values will not work as expected ..."
53262306a36Sopenharmony_ci	reset_vals
53362306a36Sopenharmony_ci	TEST_STR="-3"
53462306a36Sopenharmony_ci	echo -n $TEST_STR > $TARGET 2> /dev/null
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_ci	if verify "${TARGET}"; then
53762306a36Sopenharmony_ci		echo "FAIL" >&2
53862306a36Sopenharmony_ci		rc=1
53962306a36Sopenharmony_ci	else
54062306a36Sopenharmony_ci		echo "ok"
54162306a36Sopenharmony_ci	fi
54262306a36Sopenharmony_ci	test_rc
54362306a36Sopenharmony_ci}
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_cirun_stringtests()
54662306a36Sopenharmony_ci{
54762306a36Sopenharmony_ci	echo -n "Writing entire sysctl in short writes ... "
54862306a36Sopenharmony_ci	set_orig
54962306a36Sopenharmony_ci	dd if="${TEST_FILE}" of="${TARGET}" bs=1 2>/dev/null
55062306a36Sopenharmony_ci	if ! verify "${TARGET}"; then
55162306a36Sopenharmony_ci		echo "FAIL" >&2
55262306a36Sopenharmony_ci		rc=1
55362306a36Sopenharmony_ci	else
55462306a36Sopenharmony_ci		echo "ok"
55562306a36Sopenharmony_ci	fi
55662306a36Sopenharmony_ci
55762306a36Sopenharmony_ci	echo -n "Writing middle of sysctl after unsynchronized seek ... "
55862306a36Sopenharmony_ci	set_test
55962306a36Sopenharmony_ci	dd if="${TEST_FILE}" of="${TARGET}" bs=1 seek=1 2>/dev/null
56062306a36Sopenharmony_ci	if verify "${TARGET}"; then
56162306a36Sopenharmony_ci		echo "FAIL" >&2
56262306a36Sopenharmony_ci		rc=1
56362306a36Sopenharmony_ci	else
56462306a36Sopenharmony_ci		echo "ok"
56562306a36Sopenharmony_ci	fi
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_ci	echo -n "Checking sysctl maxlen is at least $MAXLEN ... "
56862306a36Sopenharmony_ci	set_orig
56962306a36Sopenharmony_ci	perl -e 'print "A" x ('"${MAXLEN}"'-2), "B";' | \
57062306a36Sopenharmony_ci		dd of="${TARGET}" bs="${MAXLEN}" 2>/dev/null
57162306a36Sopenharmony_ci	if ! grep -q B "${TARGET}"; then
57262306a36Sopenharmony_ci		echo "FAIL" >&2
57362306a36Sopenharmony_ci		rc=1
57462306a36Sopenharmony_ci	else
57562306a36Sopenharmony_ci		echo "ok"
57662306a36Sopenharmony_ci	fi
57762306a36Sopenharmony_ci
57862306a36Sopenharmony_ci	echo -n "Checking sysctl keeps original string on overflow append ... "
57962306a36Sopenharmony_ci	set_orig
58062306a36Sopenharmony_ci	perl -e 'print "A" x ('"${MAXLEN}"'-1), "B";' | \
58162306a36Sopenharmony_ci		dd of="${TARGET}" bs=$(( MAXLEN - 1 )) 2>/dev/null
58262306a36Sopenharmony_ci	if grep -q B "${TARGET}"; then
58362306a36Sopenharmony_ci		echo "FAIL" >&2
58462306a36Sopenharmony_ci		rc=1
58562306a36Sopenharmony_ci	else
58662306a36Sopenharmony_ci		echo "ok"
58762306a36Sopenharmony_ci	fi
58862306a36Sopenharmony_ci
58962306a36Sopenharmony_ci	echo -n "Checking sysctl stays NULL terminated on write ... "
59062306a36Sopenharmony_ci	set_orig
59162306a36Sopenharmony_ci	perl -e 'print "A" x ('"${MAXLEN}"'-1), "B";' | \
59262306a36Sopenharmony_ci		dd of="${TARGET}" bs="${MAXLEN}" 2>/dev/null
59362306a36Sopenharmony_ci	if grep -q B "${TARGET}"; then
59462306a36Sopenharmony_ci		echo "FAIL" >&2
59562306a36Sopenharmony_ci		rc=1
59662306a36Sopenharmony_ci	else
59762306a36Sopenharmony_ci		echo "ok"
59862306a36Sopenharmony_ci	fi
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_ci	echo -n "Checking sysctl stays NULL terminated on overwrite ... "
60162306a36Sopenharmony_ci	set_orig
60262306a36Sopenharmony_ci	perl -e 'print "A" x ('"${MAXLEN}"'-1), "BB";' | \
60362306a36Sopenharmony_ci		dd of="${TARGET}" bs=$(( $MAXLEN + 1 )) 2>/dev/null
60462306a36Sopenharmony_ci	if grep -q B "${TARGET}"; then
60562306a36Sopenharmony_ci		echo "FAIL" >&2
60662306a36Sopenharmony_ci		rc=1
60762306a36Sopenharmony_ci	else
60862306a36Sopenharmony_ci		echo "ok"
60962306a36Sopenharmony_ci	fi
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_ci	test_rc
61262306a36Sopenharmony_ci}
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_citarget_exists()
61562306a36Sopenharmony_ci{
61662306a36Sopenharmony_ci	TARGET="${SYSCTL}/$1"
61762306a36Sopenharmony_ci	TEST_ID="$2"
61862306a36Sopenharmony_ci
61962306a36Sopenharmony_ci	if [ ! -f ${TARGET} ] ; then
62062306a36Sopenharmony_ci		return 0
62162306a36Sopenharmony_ci	fi
62262306a36Sopenharmony_ci	return 1
62362306a36Sopenharmony_ci}
62462306a36Sopenharmony_ci
62562306a36Sopenharmony_cirun_bitmaptest() {
62662306a36Sopenharmony_ci	# Total length of bitmaps string to use, a bit under
62762306a36Sopenharmony_ci	# the maximum input size of the test node
62862306a36Sopenharmony_ci	LENGTH=$((RANDOM % 65000))
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ci	# First bit to set
63162306a36Sopenharmony_ci	BIT=$((RANDOM % 1024))
63262306a36Sopenharmony_ci
63362306a36Sopenharmony_ci	# String containing our list of bits to set
63462306a36Sopenharmony_ci	TEST_STR=$BIT
63562306a36Sopenharmony_ci
63662306a36Sopenharmony_ci	# build up the string
63762306a36Sopenharmony_ci	while [ "${#TEST_STR}" -le "$LENGTH" ]; do
63862306a36Sopenharmony_ci		# Make sure next entry is discontiguous,
63962306a36Sopenharmony_ci		# skip ahead at least 2
64062306a36Sopenharmony_ci		BIT=$((BIT + $((2 + RANDOM % 10))))
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ci		# Add new bit to the list
64362306a36Sopenharmony_ci		TEST_STR="${TEST_STR},${BIT}"
64462306a36Sopenharmony_ci
64562306a36Sopenharmony_ci		# Randomly make it a range
64662306a36Sopenharmony_ci		if [ "$((RANDOM % 2))" -eq "1" ]; then
64762306a36Sopenharmony_ci			RANGE_END=$((BIT + $((1 + RANDOM % 10))))
64862306a36Sopenharmony_ci			TEST_STR="${TEST_STR}-${RANGE_END}"
64962306a36Sopenharmony_ci			BIT=$RANGE_END
65062306a36Sopenharmony_ci		fi
65162306a36Sopenharmony_ci	done
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_ci	echo -n "Checking bitmap handler... "
65462306a36Sopenharmony_ci	TEST_FILE=$(mktemp)
65562306a36Sopenharmony_ci	echo -n "$TEST_STR" > $TEST_FILE
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_ci	cat $TEST_FILE > $TARGET 2> /dev/null
65862306a36Sopenharmony_ci	if [ $? -ne 0 ]; then
65962306a36Sopenharmony_ci		echo "FAIL" >&2
66062306a36Sopenharmony_ci		rc=1
66162306a36Sopenharmony_ci		test_rc
66262306a36Sopenharmony_ci	fi
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_ci	if ! verify_diff_proc_file "$TARGET" "$TEST_FILE"; then
66562306a36Sopenharmony_ci		echo "FAIL" >&2
66662306a36Sopenharmony_ci		rc=1
66762306a36Sopenharmony_ci	else
66862306a36Sopenharmony_ci		echo "ok"
66962306a36Sopenharmony_ci		rc=0
67062306a36Sopenharmony_ci	fi
67162306a36Sopenharmony_ci	test_rc
67262306a36Sopenharmony_ci}
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_cisysctl_test_0001()
67562306a36Sopenharmony_ci{
67662306a36Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0001)"
67762306a36Sopenharmony_ci	reset_vals
67862306a36Sopenharmony_ci	ORIG=$(cat "${TARGET}")
67962306a36Sopenharmony_ci	TEST_STR=$(( $ORIG + 1 ))
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ci	run_numerictests
68262306a36Sopenharmony_ci	run_wideint_tests
68362306a36Sopenharmony_ci	run_limit_digit
68462306a36Sopenharmony_ci}
68562306a36Sopenharmony_ci
68662306a36Sopenharmony_cisysctl_test_0002()
68762306a36Sopenharmony_ci{
68862306a36Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0002)"
68962306a36Sopenharmony_ci	reset_vals
69062306a36Sopenharmony_ci	ORIG=$(cat "${TARGET}")
69162306a36Sopenharmony_ci	TEST_STR="Testing sysctl"
69262306a36Sopenharmony_ci	# Only string sysctls support seeking/appending.
69362306a36Sopenharmony_ci	MAXLEN=65
69462306a36Sopenharmony_ci
69562306a36Sopenharmony_ci	run_numerictests
69662306a36Sopenharmony_ci	run_stringtests
69762306a36Sopenharmony_ci}
69862306a36Sopenharmony_ci
69962306a36Sopenharmony_cisysctl_test_0003()
70062306a36Sopenharmony_ci{
70162306a36Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0003)"
70262306a36Sopenharmony_ci	reset_vals
70362306a36Sopenharmony_ci	ORIG=$(cat "${TARGET}")
70462306a36Sopenharmony_ci	TEST_STR=$(( $ORIG + 1 ))
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_ci	run_numerictests
70762306a36Sopenharmony_ci	run_wideint_tests
70862306a36Sopenharmony_ci	run_limit_digit
70962306a36Sopenharmony_ci	run_limit_digit_int
71062306a36Sopenharmony_ci}
71162306a36Sopenharmony_ci
71262306a36Sopenharmony_cisysctl_test_0004()
71362306a36Sopenharmony_ci{
71462306a36Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0004)"
71562306a36Sopenharmony_ci	reset_vals
71662306a36Sopenharmony_ci	ORIG=$(cat "${TARGET}")
71762306a36Sopenharmony_ci	TEST_STR=$(( $ORIG + 1 ))
71862306a36Sopenharmony_ci
71962306a36Sopenharmony_ci	run_numerictests
72062306a36Sopenharmony_ci	run_wideint_tests
72162306a36Sopenharmony_ci	run_limit_digit
72262306a36Sopenharmony_ci	run_limit_digit_uint
72362306a36Sopenharmony_ci}
72462306a36Sopenharmony_ci
72562306a36Sopenharmony_cisysctl_test_0005()
72662306a36Sopenharmony_ci{
72762306a36Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0005)"
72862306a36Sopenharmony_ci	reset_vals
72962306a36Sopenharmony_ci	ORIG=$(cat "${TARGET}")
73062306a36Sopenharmony_ci
73162306a36Sopenharmony_ci	run_limit_digit_int_array
73262306a36Sopenharmony_ci}
73362306a36Sopenharmony_ci
73462306a36Sopenharmony_cisysctl_test_0006()
73562306a36Sopenharmony_ci{
73662306a36Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0006)"
73762306a36Sopenharmony_ci	reset_vals
73862306a36Sopenharmony_ci	ORIG=""
73962306a36Sopenharmony_ci	run_bitmaptest
74062306a36Sopenharmony_ci}
74162306a36Sopenharmony_ci
74262306a36Sopenharmony_cisysctl_test_0007()
74362306a36Sopenharmony_ci{
74462306a36Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0007)"
74562306a36Sopenharmony_ci	if [ ! -f $TARGET ]; then
74662306a36Sopenharmony_ci		echo "Skipping test for $TARGET as it is not present ..."
74762306a36Sopenharmony_ci		return $ksft_skip
74862306a36Sopenharmony_ci	fi
74962306a36Sopenharmony_ci
75062306a36Sopenharmony_ci	if [ -d $DIR ]; then
75162306a36Sopenharmony_ci		echo "Boot param test only possible sysctl_test is built-in, not module:"
75262306a36Sopenharmony_ci		cat $TEST_DIR/config >&2
75362306a36Sopenharmony_ci		return $ksft_skip
75462306a36Sopenharmony_ci	fi
75562306a36Sopenharmony_ci
75662306a36Sopenharmony_ci	echo -n "Testing if $TARGET is set to 1 ..."
75762306a36Sopenharmony_ci	ORIG=$(cat "${TARGET}")
75862306a36Sopenharmony_ci
75962306a36Sopenharmony_ci	if [ x$ORIG = "x1" ]; then
76062306a36Sopenharmony_ci		echo "ok"
76162306a36Sopenharmony_ci		return 0
76262306a36Sopenharmony_ci	fi
76362306a36Sopenharmony_ci	echo "FAIL"
76462306a36Sopenharmony_ci	echo "Checking if /proc/cmdline contains setting of the expected parameter ..."
76562306a36Sopenharmony_ci	if [ ! -f /proc/cmdline ]; then
76662306a36Sopenharmony_ci		echo "/proc/cmdline does not exist, test inconclusive"
76762306a36Sopenharmony_ci		return 0
76862306a36Sopenharmony_ci	fi
76962306a36Sopenharmony_ci
77062306a36Sopenharmony_ci	FOUND=$(grep -c "sysctl[./]debug[./]test_sysctl[./]boot_int=1" /proc/cmdline)
77162306a36Sopenharmony_ci	if [ $FOUND = "1" ]; then
77262306a36Sopenharmony_ci		echo "Kernel param found but $TARGET is not 1, TEST FAILED"
77362306a36Sopenharmony_ci		rc=1
77462306a36Sopenharmony_ci		test_rc
77562306a36Sopenharmony_ci	fi
77662306a36Sopenharmony_ci
77762306a36Sopenharmony_ci	echo "Skipping test, expected kernel parameter missing."
77862306a36Sopenharmony_ci	echo "To perform this test, make sure kernel is booted with parameter: sysctl.debug.test_sysctl.boot_int=1"
77962306a36Sopenharmony_ci	return $ksft_skip
78062306a36Sopenharmony_ci}
78162306a36Sopenharmony_ci
78262306a36Sopenharmony_cisysctl_test_0008()
78362306a36Sopenharmony_ci{
78462306a36Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0008)"
78562306a36Sopenharmony_ci	if [ ! -f $TARGET ]; then
78662306a36Sopenharmony_ci		echo "Skipping test for $TARGET as it is not present ..."
78762306a36Sopenharmony_ci		return $ksft_skip
78862306a36Sopenharmony_ci	fi
78962306a36Sopenharmony_ci
79062306a36Sopenharmony_ci	echo -n "Testing if $TARGET is matched in kernel"
79162306a36Sopenharmony_ci	ORIG_VALUE=$(cat "${TARGET}")
79262306a36Sopenharmony_ci
79362306a36Sopenharmony_ci	if [ $ORIG_VALUE -ne 1 ]; then
79462306a36Sopenharmony_ci		echo "TEST FAILED"
79562306a36Sopenharmony_ci		rc=1
79662306a36Sopenharmony_ci		test_rc
79762306a36Sopenharmony_ci	fi
79862306a36Sopenharmony_ci
79962306a36Sopenharmony_ci	echo "ok"
80062306a36Sopenharmony_ci	return 0
80162306a36Sopenharmony_ci}
80262306a36Sopenharmony_ci
80362306a36Sopenharmony_cisysctl_test_0009()
80462306a36Sopenharmony_ci{
80562306a36Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0009)"
80662306a36Sopenharmony_ci	echo -n "Testing if $TARGET unregistered correctly ..."
80762306a36Sopenharmony_ci	if [ -d $TARGET ]; then
80862306a36Sopenharmony_ci		echo "TEST FAILED"
80962306a36Sopenharmony_ci		rc=1
81062306a36Sopenharmony_ci		test_rc
81162306a36Sopenharmony_ci	fi
81262306a36Sopenharmony_ci
81362306a36Sopenharmony_ci	echo "ok"
81462306a36Sopenharmony_ci	return 0
81562306a36Sopenharmony_ci}
81662306a36Sopenharmony_ci
81762306a36Sopenharmony_cisysctl_test_0010()
81862306a36Sopenharmony_ci{
81962306a36Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0010)"
82062306a36Sopenharmony_ci	echo -n "Testing that $TARGET was not created  ..."
82162306a36Sopenharmony_ci	if [ -d $TARGET ]; then
82262306a36Sopenharmony_ci		echo "TEST FAILED"
82362306a36Sopenharmony_ci		rc=1
82462306a36Sopenharmony_ci		test_rc
82562306a36Sopenharmony_ci	fi
82662306a36Sopenharmony_ci
82762306a36Sopenharmony_ci	echo "ok"
82862306a36Sopenharmony_ci	return 0
82962306a36Sopenharmony_ci}
83062306a36Sopenharmony_ci
83162306a36Sopenharmony_cilist_tests()
83262306a36Sopenharmony_ci{
83362306a36Sopenharmony_ci	echo "Test ID list:"
83462306a36Sopenharmony_ci	echo
83562306a36Sopenharmony_ci	echo "TEST_ID x NUM_TEST"
83662306a36Sopenharmony_ci	echo "TEST_ID:   Test ID"
83762306a36Sopenharmony_ci	echo "NUM_TESTS: Number of recommended times to run the test"
83862306a36Sopenharmony_ci	echo
83962306a36Sopenharmony_ci	echo "0001 x $(get_test_count 0001) - tests proc_dointvec_minmax()"
84062306a36Sopenharmony_ci	echo "0002 x $(get_test_count 0002) - tests proc_dostring()"
84162306a36Sopenharmony_ci	echo "0003 x $(get_test_count 0003) - tests proc_dointvec()"
84262306a36Sopenharmony_ci	echo "0004 x $(get_test_count 0004) - tests proc_douintvec()"
84362306a36Sopenharmony_ci	echo "0005 x $(get_test_count 0005) - tests proc_douintvec() array"
84462306a36Sopenharmony_ci	echo "0006 x $(get_test_count 0006) - tests proc_do_large_bitmap()"
84562306a36Sopenharmony_ci	echo "0007 x $(get_test_count 0007) - tests setting sysctl from kernel boot param"
84662306a36Sopenharmony_ci	echo "0008 x $(get_test_count 0008) - tests sysctl macro values match"
84762306a36Sopenharmony_ci	echo "0009 x $(get_test_count 0009) - tests sysct unregister"
84862306a36Sopenharmony_ci	echo "0010 x $(get_test_count 0010) - tests sysct mount point"
84962306a36Sopenharmony_ci}
85062306a36Sopenharmony_ci
85162306a36Sopenharmony_ciusage()
85262306a36Sopenharmony_ci{
85362306a36Sopenharmony_ci	NUM_TESTS=$(grep -o ' ' <<<"$ALL_TESTS" | grep -c .)
85462306a36Sopenharmony_ci	let NUM_TESTS=$NUM_TESTS+1
85562306a36Sopenharmony_ci	MAX_TEST=$(printf "%04d\n" $NUM_TESTS)
85662306a36Sopenharmony_ci	echo "Usage: $0 [ -t <4-number-digit> ] | [ -w <4-number-digit> ] |"
85762306a36Sopenharmony_ci	echo "		 [ -s <4-number-digit> ] | [ -c <4-number-digit> <test- count>"
85862306a36Sopenharmony_ci	echo "           [ all ] [ -h | --help ] [ -l ]"
85962306a36Sopenharmony_ci	echo ""
86062306a36Sopenharmony_ci	echo "Valid tests: 0001-$MAX_TEST"
86162306a36Sopenharmony_ci	echo ""
86262306a36Sopenharmony_ci	echo "    all     Runs all tests (default)"
86362306a36Sopenharmony_ci	echo "    -t      Run test ID the number amount of times is recommended"
86462306a36Sopenharmony_ci	echo "    -w      Watch test ID run until it runs into an error"
86562306a36Sopenharmony_ci	echo "    -c      Run test ID once"
86662306a36Sopenharmony_ci	echo "    -s      Run test ID x test-count number of times"
86762306a36Sopenharmony_ci	echo "    -l      List all test ID list"
86862306a36Sopenharmony_ci	echo " -h|--help  Help"
86962306a36Sopenharmony_ci	echo
87062306a36Sopenharmony_ci	echo "If an error every occurs execution will immediately terminate."
87162306a36Sopenharmony_ci	echo "If you are adding a new test try using -w <test-ID> first to"
87262306a36Sopenharmony_ci	echo "make sure the test passes a series of tests."
87362306a36Sopenharmony_ci	echo
87462306a36Sopenharmony_ci	echo Example uses:
87562306a36Sopenharmony_ci	echo
87662306a36Sopenharmony_ci	echo "$TEST_NAME.sh            -- executes all tests"
87762306a36Sopenharmony_ci	echo "$TEST_NAME.sh -t 0002    -- Executes test ID 0002 number of times is recomended"
87862306a36Sopenharmony_ci	echo "$TEST_NAME.sh -w 0002    -- Watch test ID 0002 run until an error occurs"
87962306a36Sopenharmony_ci	echo "$TEST_NAME.sh -s 0002    -- Run test ID 0002 once"
88062306a36Sopenharmony_ci	echo "$TEST_NAME.sh -c 0002 3  -- Run test ID 0002 three times"
88162306a36Sopenharmony_ci	echo
88262306a36Sopenharmony_ci	list_tests
88362306a36Sopenharmony_ci	exit 1
88462306a36Sopenharmony_ci}
88562306a36Sopenharmony_ci
88662306a36Sopenharmony_cifunction test_num()
88762306a36Sopenharmony_ci{
88862306a36Sopenharmony_ci	re='^[0-9]+$'
88962306a36Sopenharmony_ci	if ! [[ $1 =~ $re ]]; then
89062306a36Sopenharmony_ci		usage
89162306a36Sopenharmony_ci	fi
89262306a36Sopenharmony_ci}
89362306a36Sopenharmony_cifunction remove_leading_zeros()
89462306a36Sopenharmony_ci{
89562306a36Sopenharmony_ci	echo $1 | sed 's/^0*//'
89662306a36Sopenharmony_ci}
89762306a36Sopenharmony_ci
89862306a36Sopenharmony_cifunction get_test_count()
89962306a36Sopenharmony_ci{
90062306a36Sopenharmony_ci	test_num $1
90162306a36Sopenharmony_ci	awk_field=$(remove_leading_zeros $1)
90262306a36Sopenharmony_ci	TEST_DATA=$(echo $ALL_TESTS | awk '{print $'$awk_field'}')
90362306a36Sopenharmony_ci	echo ${TEST_DATA} | awk -F":" '{print $2}'
90462306a36Sopenharmony_ci}
90562306a36Sopenharmony_ci
90662306a36Sopenharmony_cifunction get_test_enabled()
90762306a36Sopenharmony_ci{
90862306a36Sopenharmony_ci	test_num $1
90962306a36Sopenharmony_ci	awk_field=$(remove_leading_zeros $1)
91062306a36Sopenharmony_ci	TEST_DATA=$(echo $ALL_TESTS | awk '{print $'$awk_field'}')
91162306a36Sopenharmony_ci	echo ${TEST_DATA} | awk -F":" '{print $3}'
91262306a36Sopenharmony_ci}
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_cifunction get_test_target()
91562306a36Sopenharmony_ci{
91662306a36Sopenharmony_ci	test_num $1
91762306a36Sopenharmony_ci	awk_field=$(remove_leading_zeros $1)
91862306a36Sopenharmony_ci	TEST_DATA=$(echo $ALL_TESTS | awk '{print $'$awk_field'}')
91962306a36Sopenharmony_ci	echo ${TEST_DATA} | awk -F":" '{print $4}'
92062306a36Sopenharmony_ci}
92162306a36Sopenharmony_ci
92262306a36Sopenharmony_cifunction get_test_skip_no_target()
92362306a36Sopenharmony_ci{
92462306a36Sopenharmony_ci	test_num $1
92562306a36Sopenharmony_ci	awk_field=$(remove_leading_zeros $1)
92662306a36Sopenharmony_ci	TEST_DATA=$(echo $ALL_TESTS | awk '{print $'$awk_field'}')
92762306a36Sopenharmony_ci	echo ${TEST_DATA} | awk -F":" '{print $5}'
92862306a36Sopenharmony_ci}
92962306a36Sopenharmony_ci
93062306a36Sopenharmony_cifunction skip_test()
93162306a36Sopenharmony_ci{
93262306a36Sopenharmony_ci	TEST_ID=$1
93362306a36Sopenharmony_ci	TEST_TARGET=$2
93462306a36Sopenharmony_ci	if target_exists $TEST_TARGET $TEST_ID; then
93562306a36Sopenharmony_ci		TEST_SKIP=$(get_test_skip_no_target $TEST_ID)
93662306a36Sopenharmony_ci		if [[ $TEST_SKIP -eq "1" ]]; then
93762306a36Sopenharmony_ci			echo "Target for test $TEST_ID: $TEST_TARGET not exist, skipping test ..."
93862306a36Sopenharmony_ci			return 0
93962306a36Sopenharmony_ci		fi
94062306a36Sopenharmony_ci	fi
94162306a36Sopenharmony_ci	return 1
94262306a36Sopenharmony_ci}
94362306a36Sopenharmony_ci
94462306a36Sopenharmony_cifunction run_all_tests()
94562306a36Sopenharmony_ci{
94662306a36Sopenharmony_ci	for i in $ALL_TESTS ; do
94762306a36Sopenharmony_ci		TEST_ID=${i%:*:*:*:*}
94862306a36Sopenharmony_ci		ENABLED=$(get_test_enabled $TEST_ID)
94962306a36Sopenharmony_ci		TEST_COUNT=$(get_test_count $TEST_ID)
95062306a36Sopenharmony_ci		TEST_TARGET=$(get_test_target $TEST_ID)
95162306a36Sopenharmony_ci
95262306a36Sopenharmony_ci		if [[ $ENABLED -eq "1" ]]; then
95362306a36Sopenharmony_ci			test_case $TEST_ID $TEST_COUNT $TEST_TARGET
95462306a36Sopenharmony_ci		fi
95562306a36Sopenharmony_ci	done
95662306a36Sopenharmony_ci}
95762306a36Sopenharmony_ci
95862306a36Sopenharmony_cifunction watch_log()
95962306a36Sopenharmony_ci{
96062306a36Sopenharmony_ci	if [ $# -ne 3 ]; then
96162306a36Sopenharmony_ci		clear
96262306a36Sopenharmony_ci	fi
96362306a36Sopenharmony_ci	date
96462306a36Sopenharmony_ci	echo "Running test: $2 - run #$1"
96562306a36Sopenharmony_ci}
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_cifunction watch_case()
96862306a36Sopenharmony_ci{
96962306a36Sopenharmony_ci	i=0
97062306a36Sopenharmony_ci	while [ 1 ]; do
97162306a36Sopenharmony_ci
97262306a36Sopenharmony_ci		if [ $# -eq 1 ]; then
97362306a36Sopenharmony_ci			test_num $1
97462306a36Sopenharmony_ci			watch_log $i ${TEST_NAME}_test_$1
97562306a36Sopenharmony_ci			${TEST_NAME}_test_$1
97662306a36Sopenharmony_ci		else
97762306a36Sopenharmony_ci			watch_log $i all
97862306a36Sopenharmony_ci			run_all_tests
97962306a36Sopenharmony_ci		fi
98062306a36Sopenharmony_ci		let i=$i+1
98162306a36Sopenharmony_ci	done
98262306a36Sopenharmony_ci}
98362306a36Sopenharmony_ci
98462306a36Sopenharmony_cifunction test_case()
98562306a36Sopenharmony_ci{
98662306a36Sopenharmony_ci	TEST_ID=$1
98762306a36Sopenharmony_ci	NUM_TESTS=$2
98862306a36Sopenharmony_ci	TARGET=$3
98962306a36Sopenharmony_ci
99062306a36Sopenharmony_ci	if skip_test $TEST_ID $TARGET; then
99162306a36Sopenharmony_ci		return
99262306a36Sopenharmony_ci	fi
99362306a36Sopenharmony_ci
99462306a36Sopenharmony_ci	i=0
99562306a36Sopenharmony_ci	while [ $i -lt $NUM_TESTS ]; do
99662306a36Sopenharmony_ci		test_num $TEST_ID
99762306a36Sopenharmony_ci		watch_log $i ${TEST_NAME}_test_${TEST_ID} noclear
99862306a36Sopenharmony_ci		RUN_TEST=${TEST_NAME}_test_${TEST_ID}
99962306a36Sopenharmony_ci		$RUN_TEST
100062306a36Sopenharmony_ci		let i=$i+1
100162306a36Sopenharmony_ci	done
100262306a36Sopenharmony_ci}
100362306a36Sopenharmony_ci
100462306a36Sopenharmony_cifunction parse_args()
100562306a36Sopenharmony_ci{
100662306a36Sopenharmony_ci	if [ $# -eq 0 ]; then
100762306a36Sopenharmony_ci		run_all_tests
100862306a36Sopenharmony_ci	else
100962306a36Sopenharmony_ci		if [[ "$1" = "all" ]]; then
101062306a36Sopenharmony_ci			run_all_tests
101162306a36Sopenharmony_ci		elif [[ "$1" = "-w" ]]; then
101262306a36Sopenharmony_ci			shift
101362306a36Sopenharmony_ci			watch_case $@
101462306a36Sopenharmony_ci		elif [[ "$1" = "-t" ]]; then
101562306a36Sopenharmony_ci			shift
101662306a36Sopenharmony_ci			test_num $1
101762306a36Sopenharmony_ci			test_case $1 $(get_test_count $1) $(get_test_target $1)
101862306a36Sopenharmony_ci		elif [[ "$1" = "-c" ]]; then
101962306a36Sopenharmony_ci			shift
102062306a36Sopenharmony_ci			test_num $1
102162306a36Sopenharmony_ci			test_num $2
102262306a36Sopenharmony_ci			test_case $1 $2 $(get_test_target $1)
102362306a36Sopenharmony_ci		elif [[ "$1" = "-s" ]]; then
102462306a36Sopenharmony_ci			shift
102562306a36Sopenharmony_ci			test_case $1 1 $(get_test_target $1)
102662306a36Sopenharmony_ci		elif [[ "$1" = "-l" ]]; then
102762306a36Sopenharmony_ci			list_tests
102862306a36Sopenharmony_ci		elif [[ "$1" = "-h" || "$1" = "--help" ]]; then
102962306a36Sopenharmony_ci			usage
103062306a36Sopenharmony_ci		else
103162306a36Sopenharmony_ci			usage
103262306a36Sopenharmony_ci		fi
103362306a36Sopenharmony_ci	fi
103462306a36Sopenharmony_ci}
103562306a36Sopenharmony_ci
103662306a36Sopenharmony_citest_reqs
103762306a36Sopenharmony_ciallow_user_defaults
103862306a36Sopenharmony_cicheck_production_sysctl_writes_strict
103962306a36Sopenharmony_ciload_req_mod
104062306a36Sopenharmony_ci
104162306a36Sopenharmony_citrap "test_finish" EXIT
104262306a36Sopenharmony_ci
104362306a36Sopenharmony_ciparse_args $@
104462306a36Sopenharmony_ci
104562306a36Sopenharmony_ciexit 0
1046