18c2ecf20Sopenharmony_ci#!/bin/bash
28c2ecf20Sopenharmony_ci# Copyright (C) 2017 Luis R. Rodriguez <mcgrof@kernel.org>
38c2ecf20Sopenharmony_ci#
48c2ecf20Sopenharmony_ci# This program is free software; you can redistribute it and/or modify it
58c2ecf20Sopenharmony_ci# under the terms of the GNU General Public License as published by the Free
68c2ecf20Sopenharmony_ci# Software Foundation; either version 2 of the License, or at your option any
78c2ecf20Sopenharmony_ci# later version; or, when distributed separately from the Linux kernel or
88c2ecf20Sopenharmony_ci# when incorporated into other software packages, subject to the following
98c2ecf20Sopenharmony_ci# license:
108c2ecf20Sopenharmony_ci#
118c2ecf20Sopenharmony_ci# This program is free software; you can redistribute it and/or modify it
128c2ecf20Sopenharmony_ci# under the terms of copyleft-next (version 0.3.1 or later) as published
138c2ecf20Sopenharmony_ci# at http://copyleft-next.org/.
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci# This performs a series tests against the proc sysctl interface.
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4.
188c2ecf20Sopenharmony_ciksft_skip=4
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ciTEST_NAME="sysctl"
218c2ecf20Sopenharmony_ciTEST_DRIVER="test_${TEST_NAME}"
228c2ecf20Sopenharmony_ciTEST_DIR=$(dirname $0)
238c2ecf20Sopenharmony_ciTEST_FILE=$(mktemp)
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci# This represents
268c2ecf20Sopenharmony_ci#
278c2ecf20Sopenharmony_ci# TEST_ID:TEST_COUNT:ENABLED:TARGET
288c2ecf20Sopenharmony_ci#
298c2ecf20Sopenharmony_ci# TEST_ID: is the test id number
308c2ecf20Sopenharmony_ci# TEST_COUNT: number of times we should run the test
318c2ecf20Sopenharmony_ci# ENABLED: 1 if enabled, 0 otherwise
328c2ecf20Sopenharmony_ci# TARGET: test target file required on the test_sysctl module
338c2ecf20Sopenharmony_ci#
348c2ecf20Sopenharmony_ci# Once these are enabled please leave them as-is. Write your own test,
358c2ecf20Sopenharmony_ci# we have tons of space.
368c2ecf20Sopenharmony_ciALL_TESTS="0001:1:1:int_0001"
378c2ecf20Sopenharmony_ciALL_TESTS="$ALL_TESTS 0002:1:1:string_0001"
388c2ecf20Sopenharmony_ciALL_TESTS="$ALL_TESTS 0003:1:1:int_0002"
398c2ecf20Sopenharmony_ciALL_TESTS="$ALL_TESTS 0004:1:1:uint_0001"
408c2ecf20Sopenharmony_ciALL_TESTS="$ALL_TESTS 0005:3:1:int_0003"
418c2ecf20Sopenharmony_ciALL_TESTS="$ALL_TESTS 0006:50:1:bitmap_0001"
428c2ecf20Sopenharmony_ciALL_TESTS="$ALL_TESTS 0007:1:1:boot_int"
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cifunction allow_user_defaults()
458c2ecf20Sopenharmony_ci{
468c2ecf20Sopenharmony_ci	if [ -z $DIR ]; then
478c2ecf20Sopenharmony_ci		DIR="/sys/module/test_sysctl/"
488c2ecf20Sopenharmony_ci	fi
498c2ecf20Sopenharmony_ci	if [ -z $DEFAULT_NUM_TESTS ]; then
508c2ecf20Sopenharmony_ci		DEFAULT_NUM_TESTS=50
518c2ecf20Sopenharmony_ci	fi
528c2ecf20Sopenharmony_ci	if [ -z $SYSCTL ]; then
538c2ecf20Sopenharmony_ci		SYSCTL="/proc/sys/debug/test_sysctl"
548c2ecf20Sopenharmony_ci	fi
558c2ecf20Sopenharmony_ci	if [ -z $PROD_SYSCTL ]; then
568c2ecf20Sopenharmony_ci		PROD_SYSCTL="/proc/sys"
578c2ecf20Sopenharmony_ci	fi
588c2ecf20Sopenharmony_ci	if [ -z $WRITES_STRICT ]; then
598c2ecf20Sopenharmony_ci		WRITES_STRICT="${PROD_SYSCTL}/kernel/sysctl_writes_strict"
608c2ecf20Sopenharmony_ci	fi
618c2ecf20Sopenharmony_ci}
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_cifunction check_production_sysctl_writes_strict()
648c2ecf20Sopenharmony_ci{
658c2ecf20Sopenharmony_ci	echo -n "Checking production write strict setting ... "
668c2ecf20Sopenharmony_ci	if [ ! -e ${WRITES_STRICT} ]; then
678c2ecf20Sopenharmony_ci		echo "FAIL, but skip in case of old kernel" >&2
688c2ecf20Sopenharmony_ci	else
698c2ecf20Sopenharmony_ci		old_strict=$(cat ${WRITES_STRICT})
708c2ecf20Sopenharmony_ci		if [ "$old_strict" = "1" ]; then
718c2ecf20Sopenharmony_ci			echo "ok"
728c2ecf20Sopenharmony_ci		else
738c2ecf20Sopenharmony_ci			echo "FAIL, strict value is 0 but force to 1 to continue" >&2
748c2ecf20Sopenharmony_ci			echo "1" > ${WRITES_STRICT}
758c2ecf20Sopenharmony_ci		fi
768c2ecf20Sopenharmony_ci	fi
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci	if [ -z $PAGE_SIZE ]; then
798c2ecf20Sopenharmony_ci		PAGE_SIZE=$(getconf PAGESIZE)
808c2ecf20Sopenharmony_ci	fi
818c2ecf20Sopenharmony_ci	if [ -z $MAX_DIGITS ]; then
828c2ecf20Sopenharmony_ci		MAX_DIGITS=$(($PAGE_SIZE/8))
838c2ecf20Sopenharmony_ci	fi
848c2ecf20Sopenharmony_ci	if [ -z $INT_MAX ]; then
858c2ecf20Sopenharmony_ci		INT_MAX=$(getconf INT_MAX)
868c2ecf20Sopenharmony_ci	fi
878c2ecf20Sopenharmony_ci	if [ -z $UINT_MAX ]; then
888c2ecf20Sopenharmony_ci		UINT_MAX=$(getconf UINT_MAX)
898c2ecf20Sopenharmony_ci	fi
908c2ecf20Sopenharmony_ci}
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_citest_reqs()
938c2ecf20Sopenharmony_ci{
948c2ecf20Sopenharmony_ci	uid=$(id -u)
958c2ecf20Sopenharmony_ci	if [ $uid -ne 0 ]; then
968c2ecf20Sopenharmony_ci		echo $msg must be run as root >&2
978c2ecf20Sopenharmony_ci		exit $ksft_skip
988c2ecf20Sopenharmony_ci	fi
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci	if ! which perl 2> /dev/null > /dev/null; then
1018c2ecf20Sopenharmony_ci		echo "$0: You need perl installed"
1028c2ecf20Sopenharmony_ci		exit $ksft_skip
1038c2ecf20Sopenharmony_ci	fi
1048c2ecf20Sopenharmony_ci	if ! which getconf 2> /dev/null > /dev/null; then
1058c2ecf20Sopenharmony_ci		echo "$0: You need getconf installed"
1068c2ecf20Sopenharmony_ci		exit $ksft_skip
1078c2ecf20Sopenharmony_ci	fi
1088c2ecf20Sopenharmony_ci	if ! which diff 2> /dev/null > /dev/null; then
1098c2ecf20Sopenharmony_ci		echo "$0: You need diff installed"
1108c2ecf20Sopenharmony_ci		exit $ksft_skip
1118c2ecf20Sopenharmony_ci	fi
1128c2ecf20Sopenharmony_ci}
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_cifunction load_req_mod()
1158c2ecf20Sopenharmony_ci{
1168c2ecf20Sopenharmony_ci	if [ ! -d $SYSCTL ]; then
1178c2ecf20Sopenharmony_ci		if ! modprobe -q -n $TEST_DRIVER; then
1188c2ecf20Sopenharmony_ci			echo "$0: module $TEST_DRIVER not found [SKIP]"
1198c2ecf20Sopenharmony_ci			echo "You must set CONFIG_TEST_SYSCTL=m in your kernel" >&2
1208c2ecf20Sopenharmony_ci			exit $ksft_skip
1218c2ecf20Sopenharmony_ci		fi
1228c2ecf20Sopenharmony_ci		modprobe $TEST_DRIVER
1238c2ecf20Sopenharmony_ci		if [ $? -ne 0 ]; then
1248c2ecf20Sopenharmony_ci			echo "$0: modprobe $TEST_DRIVER failed."
1258c2ecf20Sopenharmony_ci			exit
1268c2ecf20Sopenharmony_ci		fi
1278c2ecf20Sopenharmony_ci	fi
1288c2ecf20Sopenharmony_ci}
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_cireset_vals()
1318c2ecf20Sopenharmony_ci{
1328c2ecf20Sopenharmony_ci	VAL=""
1338c2ecf20Sopenharmony_ci	TRIGGER=$(basename ${TARGET})
1348c2ecf20Sopenharmony_ci	case "$TRIGGER" in
1358c2ecf20Sopenharmony_ci		int_0001)
1368c2ecf20Sopenharmony_ci			VAL="60"
1378c2ecf20Sopenharmony_ci			;;
1388c2ecf20Sopenharmony_ci		int_0002)
1398c2ecf20Sopenharmony_ci			VAL="1"
1408c2ecf20Sopenharmony_ci			;;
1418c2ecf20Sopenharmony_ci		uint_0001)
1428c2ecf20Sopenharmony_ci			VAL="314"
1438c2ecf20Sopenharmony_ci			;;
1448c2ecf20Sopenharmony_ci		string_0001)
1458c2ecf20Sopenharmony_ci			VAL="(none)"
1468c2ecf20Sopenharmony_ci			;;
1478c2ecf20Sopenharmony_ci		bitmap_0001)
1488c2ecf20Sopenharmony_ci			VAL=""
1498c2ecf20Sopenharmony_ci			;;
1508c2ecf20Sopenharmony_ci		*)
1518c2ecf20Sopenharmony_ci			;;
1528c2ecf20Sopenharmony_ci	esac
1538c2ecf20Sopenharmony_ci	echo -n $VAL > $TARGET
1548c2ecf20Sopenharmony_ci}
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_ciset_orig()
1578c2ecf20Sopenharmony_ci{
1588c2ecf20Sopenharmony_ci	if [ ! -z $TARGET ] && [ ! -z $ORIG ]; then
1598c2ecf20Sopenharmony_ci		if [ -f ${TARGET} ]; then
1608c2ecf20Sopenharmony_ci			echo "${ORIG}" > "${TARGET}"
1618c2ecf20Sopenharmony_ci		fi
1628c2ecf20Sopenharmony_ci	fi
1638c2ecf20Sopenharmony_ci}
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ciset_test()
1668c2ecf20Sopenharmony_ci{
1678c2ecf20Sopenharmony_ci	echo "${TEST_STR}" > "${TARGET}"
1688c2ecf20Sopenharmony_ci}
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_civerify()
1718c2ecf20Sopenharmony_ci{
1728c2ecf20Sopenharmony_ci	local seen
1738c2ecf20Sopenharmony_ci	seen=$(cat "$1")
1748c2ecf20Sopenharmony_ci	if [ "${seen}" != "${TEST_STR}" ]; then
1758c2ecf20Sopenharmony_ci		return 1
1768c2ecf20Sopenharmony_ci	fi
1778c2ecf20Sopenharmony_ci	return 0
1788c2ecf20Sopenharmony_ci}
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_ci# proc files get read a page at a time, which can confuse diff,
1818c2ecf20Sopenharmony_ci# and get you incorrect results on proc files with long data. To use
1828c2ecf20Sopenharmony_ci# diff against them you must first extract the output to a file, and
1838c2ecf20Sopenharmony_ci# then compare against that file.
1848c2ecf20Sopenharmony_civerify_diff_proc_file()
1858c2ecf20Sopenharmony_ci{
1868c2ecf20Sopenharmony_ci	TMP_DUMP_FILE=$(mktemp)
1878c2ecf20Sopenharmony_ci	cat $1 > $TMP_DUMP_FILE
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci	if ! diff -w -q $TMP_DUMP_FILE $2; then
1908c2ecf20Sopenharmony_ci		return 1
1918c2ecf20Sopenharmony_ci	else
1928c2ecf20Sopenharmony_ci		return 0
1938c2ecf20Sopenharmony_ci	fi
1948c2ecf20Sopenharmony_ci}
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_civerify_diff_w()
1978c2ecf20Sopenharmony_ci{
1988c2ecf20Sopenharmony_ci	echo "$TEST_STR" | diff -q -w -u - $1 > /dev/null
1998c2ecf20Sopenharmony_ci	return $?
2008c2ecf20Sopenharmony_ci}
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_citest_rc()
2038c2ecf20Sopenharmony_ci{
2048c2ecf20Sopenharmony_ci	if [[ $rc != 0 ]]; then
2058c2ecf20Sopenharmony_ci		echo "Failed test, return value: $rc" >&2
2068c2ecf20Sopenharmony_ci		exit $rc
2078c2ecf20Sopenharmony_ci	fi
2088c2ecf20Sopenharmony_ci}
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_citest_finish()
2118c2ecf20Sopenharmony_ci{
2128c2ecf20Sopenharmony_ci	set_orig
2138c2ecf20Sopenharmony_ci	rm -f "${TEST_FILE}"
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_ci	if [ ! -z ${old_strict} ]; then
2168c2ecf20Sopenharmony_ci		echo ${old_strict} > ${WRITES_STRICT}
2178c2ecf20Sopenharmony_ci	fi
2188c2ecf20Sopenharmony_ci	exit $rc
2198c2ecf20Sopenharmony_ci}
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_cirun_numerictests()
2228c2ecf20Sopenharmony_ci{
2238c2ecf20Sopenharmony_ci	echo "== Testing sysctl behavior against ${TARGET} =="
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci	rc=0
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_ci	echo -n "Writing test file ... "
2288c2ecf20Sopenharmony_ci	echo "${TEST_STR}" > "${TEST_FILE}"
2298c2ecf20Sopenharmony_ci	if ! verify "${TEST_FILE}"; then
2308c2ecf20Sopenharmony_ci		echo "FAIL" >&2
2318c2ecf20Sopenharmony_ci		exit 1
2328c2ecf20Sopenharmony_ci	else
2338c2ecf20Sopenharmony_ci		echo "ok"
2348c2ecf20Sopenharmony_ci	fi
2358c2ecf20Sopenharmony_ci
2368c2ecf20Sopenharmony_ci	echo -n "Checking sysctl is not set to test value ... "
2378c2ecf20Sopenharmony_ci	if verify "${TARGET}"; then
2388c2ecf20Sopenharmony_ci		echo "FAIL" >&2
2398c2ecf20Sopenharmony_ci		exit 1
2408c2ecf20Sopenharmony_ci	else
2418c2ecf20Sopenharmony_ci		echo "ok"
2428c2ecf20Sopenharmony_ci	fi
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ci	echo -n "Writing sysctl from shell ... "
2458c2ecf20Sopenharmony_ci	set_test
2468c2ecf20Sopenharmony_ci	if ! verify "${TARGET}"; then
2478c2ecf20Sopenharmony_ci		echo "FAIL" >&2
2488c2ecf20Sopenharmony_ci		exit 1
2498c2ecf20Sopenharmony_ci	else
2508c2ecf20Sopenharmony_ci		echo "ok"
2518c2ecf20Sopenharmony_ci	fi
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci	echo -n "Resetting sysctl to original value ... "
2548c2ecf20Sopenharmony_ci	set_orig
2558c2ecf20Sopenharmony_ci	if verify "${TARGET}"; then
2568c2ecf20Sopenharmony_ci		echo "FAIL" >&2
2578c2ecf20Sopenharmony_ci		exit 1
2588c2ecf20Sopenharmony_ci	else
2598c2ecf20Sopenharmony_ci		echo "ok"
2608c2ecf20Sopenharmony_ci	fi
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_ci	# Now that we've validated the sanity of "set_test" and "set_orig",
2638c2ecf20Sopenharmony_ci	# we can use those functions to set starting states before running
2648c2ecf20Sopenharmony_ci	# specific behavioral tests.
2658c2ecf20Sopenharmony_ci
2668c2ecf20Sopenharmony_ci	echo -n "Writing entire sysctl in single write ... "
2678c2ecf20Sopenharmony_ci	set_orig
2688c2ecf20Sopenharmony_ci	dd if="${TEST_FILE}" of="${TARGET}" bs=4096 2>/dev/null
2698c2ecf20Sopenharmony_ci	if ! verify "${TARGET}"; then
2708c2ecf20Sopenharmony_ci		echo "FAIL" >&2
2718c2ecf20Sopenharmony_ci		rc=1
2728c2ecf20Sopenharmony_ci	else
2738c2ecf20Sopenharmony_ci		echo "ok"
2748c2ecf20Sopenharmony_ci	fi
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci	echo -n "Writing middle of sysctl after synchronized seek ... "
2778c2ecf20Sopenharmony_ci	set_test
2788c2ecf20Sopenharmony_ci	dd if="${TEST_FILE}" of="${TARGET}" bs=1 seek=1 skip=1 2>/dev/null
2798c2ecf20Sopenharmony_ci	if ! verify "${TARGET}"; then
2808c2ecf20Sopenharmony_ci		echo "FAIL" >&2
2818c2ecf20Sopenharmony_ci		rc=1
2828c2ecf20Sopenharmony_ci	else
2838c2ecf20Sopenharmony_ci		echo "ok"
2848c2ecf20Sopenharmony_ci	fi
2858c2ecf20Sopenharmony_ci
2868c2ecf20Sopenharmony_ci	echo -n "Writing beyond end of sysctl ... "
2878c2ecf20Sopenharmony_ci	set_orig
2888c2ecf20Sopenharmony_ci	dd if="${TEST_FILE}" of="${TARGET}" bs=20 seek=2 2>/dev/null
2898c2ecf20Sopenharmony_ci	if verify "${TARGET}"; then
2908c2ecf20Sopenharmony_ci		echo "FAIL" >&2
2918c2ecf20Sopenharmony_ci		rc=1
2928c2ecf20Sopenharmony_ci	else
2938c2ecf20Sopenharmony_ci		echo "ok"
2948c2ecf20Sopenharmony_ci	fi
2958c2ecf20Sopenharmony_ci
2968c2ecf20Sopenharmony_ci	echo -n "Writing sysctl with multiple long writes ... "
2978c2ecf20Sopenharmony_ci	set_orig
2988c2ecf20Sopenharmony_ci	(perl -e 'print "A" x 50;'; echo "${TEST_STR}") | \
2998c2ecf20Sopenharmony_ci		dd of="${TARGET}" bs=50 2>/dev/null
3008c2ecf20Sopenharmony_ci	if verify "${TARGET}"; then
3018c2ecf20Sopenharmony_ci		echo "FAIL" >&2
3028c2ecf20Sopenharmony_ci		rc=1
3038c2ecf20Sopenharmony_ci	else
3048c2ecf20Sopenharmony_ci		echo "ok"
3058c2ecf20Sopenharmony_ci	fi
3068c2ecf20Sopenharmony_ci	test_rc
3078c2ecf20Sopenharmony_ci}
3088c2ecf20Sopenharmony_ci
3098c2ecf20Sopenharmony_cicheck_failure()
3108c2ecf20Sopenharmony_ci{
3118c2ecf20Sopenharmony_ci	echo -n "Testing that $1 fails as expected..."
3128c2ecf20Sopenharmony_ci	reset_vals
3138c2ecf20Sopenharmony_ci	TEST_STR="$1"
3148c2ecf20Sopenharmony_ci	orig="$(cat $TARGET)"
3158c2ecf20Sopenharmony_ci	echo -n "$TEST_STR" > $TARGET 2> /dev/null
3168c2ecf20Sopenharmony_ci
3178c2ecf20Sopenharmony_ci	# write should fail and $TARGET should retain its original value
3188c2ecf20Sopenharmony_ci	if [ $? = 0 ] || [ "$(cat $TARGET)" != "$orig" ]; then
3198c2ecf20Sopenharmony_ci		echo "FAIL" >&2
3208c2ecf20Sopenharmony_ci		rc=1
3218c2ecf20Sopenharmony_ci	else
3228c2ecf20Sopenharmony_ci		echo "ok"
3238c2ecf20Sopenharmony_ci	fi
3248c2ecf20Sopenharmony_ci	test_rc
3258c2ecf20Sopenharmony_ci}
3268c2ecf20Sopenharmony_ci
3278c2ecf20Sopenharmony_cirun_wideint_tests()
3288c2ecf20Sopenharmony_ci{
3298c2ecf20Sopenharmony_ci	# sysctl conversion functions receive a boolean sign and ulong
3308c2ecf20Sopenharmony_ci	# magnitude; here we list the magnitudes we want to test (each of
3318c2ecf20Sopenharmony_ci	# which will be tested in both positive and negative forms).  Since
3328c2ecf20Sopenharmony_ci	# none of these values fit in 32 bits, writing them to an int- or
3338c2ecf20Sopenharmony_ci	# uint-typed sysctl should fail.
3348c2ecf20Sopenharmony_ci	local magnitudes=(
3358c2ecf20Sopenharmony_ci		# common boundary-condition values (zero, +1, -1, INT_MIN,
3368c2ecf20Sopenharmony_ci		# and INT_MAX respectively) if truncated to lower 32 bits
3378c2ecf20Sopenharmony_ci		# (potential for being falsely deemed in range)
3388c2ecf20Sopenharmony_ci		0x0000000100000000
3398c2ecf20Sopenharmony_ci		0x0000000100000001
3408c2ecf20Sopenharmony_ci		0x00000001ffffffff
3418c2ecf20Sopenharmony_ci		0x0000000180000000
3428c2ecf20Sopenharmony_ci		0x000000017fffffff
3438c2ecf20Sopenharmony_ci
3448c2ecf20Sopenharmony_ci		# these look like negatives, but without a leading '-' are
3458c2ecf20Sopenharmony_ci		# actually large positives (should be rejected as above
3468c2ecf20Sopenharmony_ci		# despite being zero/+1/-1/INT_MIN/INT_MAX in the lower 32)
3478c2ecf20Sopenharmony_ci		0xffffffff00000000
3488c2ecf20Sopenharmony_ci		0xffffffff00000001
3498c2ecf20Sopenharmony_ci		0xffffffffffffffff
3508c2ecf20Sopenharmony_ci		0xffffffff80000000
3518c2ecf20Sopenharmony_ci		0xffffffff7fffffff
3528c2ecf20Sopenharmony_ci	)
3538c2ecf20Sopenharmony_ci
3548c2ecf20Sopenharmony_ci	for sign in '' '-'; do
3558c2ecf20Sopenharmony_ci		for mag in "${magnitudes[@]}"; do
3568c2ecf20Sopenharmony_ci			check_failure "${sign}${mag}"
3578c2ecf20Sopenharmony_ci		done
3588c2ecf20Sopenharmony_ci	done
3598c2ecf20Sopenharmony_ci}
3608c2ecf20Sopenharmony_ci
3618c2ecf20Sopenharmony_ci# Your test must accept digits 3 and 4 to use this
3628c2ecf20Sopenharmony_cirun_limit_digit()
3638c2ecf20Sopenharmony_ci{
3648c2ecf20Sopenharmony_ci	echo -n "Checking ignoring spaces up to PAGE_SIZE works on write ..."
3658c2ecf20Sopenharmony_ci	reset_vals
3668c2ecf20Sopenharmony_ci
3678c2ecf20Sopenharmony_ci	LIMIT=$((MAX_DIGITS -1))
3688c2ecf20Sopenharmony_ci	TEST_STR="3"
3698c2ecf20Sopenharmony_ci	(perl -e 'print " " x '$LIMIT';'; echo "${TEST_STR}") | \
3708c2ecf20Sopenharmony_ci		dd of="${TARGET}" 2>/dev/null
3718c2ecf20Sopenharmony_ci
3728c2ecf20Sopenharmony_ci	if ! verify "${TARGET}"; then
3738c2ecf20Sopenharmony_ci		echo "FAIL" >&2
3748c2ecf20Sopenharmony_ci		rc=1
3758c2ecf20Sopenharmony_ci	else
3768c2ecf20Sopenharmony_ci		echo "ok"
3778c2ecf20Sopenharmony_ci	fi
3788c2ecf20Sopenharmony_ci	test_rc
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci	echo -n "Checking passing PAGE_SIZE of spaces fails on write ..."
3818c2ecf20Sopenharmony_ci	reset_vals
3828c2ecf20Sopenharmony_ci
3838c2ecf20Sopenharmony_ci	LIMIT=$((MAX_DIGITS))
3848c2ecf20Sopenharmony_ci	TEST_STR="4"
3858c2ecf20Sopenharmony_ci	(perl -e 'print " " x '$LIMIT';'; echo "${TEST_STR}") | \
3868c2ecf20Sopenharmony_ci		dd of="${TARGET}" 2>/dev/null
3878c2ecf20Sopenharmony_ci
3888c2ecf20Sopenharmony_ci	if verify "${TARGET}"; then
3898c2ecf20Sopenharmony_ci		echo "FAIL" >&2
3908c2ecf20Sopenharmony_ci		rc=1
3918c2ecf20Sopenharmony_ci	else
3928c2ecf20Sopenharmony_ci		echo "ok"
3938c2ecf20Sopenharmony_ci	fi
3948c2ecf20Sopenharmony_ci	test_rc
3958c2ecf20Sopenharmony_ci}
3968c2ecf20Sopenharmony_ci
3978c2ecf20Sopenharmony_ci# You are using an int
3988c2ecf20Sopenharmony_cirun_limit_digit_int()
3998c2ecf20Sopenharmony_ci{
4008c2ecf20Sopenharmony_ci	echo -n "Testing INT_MAX works ..."
4018c2ecf20Sopenharmony_ci	reset_vals
4028c2ecf20Sopenharmony_ci	TEST_STR="$INT_MAX"
4038c2ecf20Sopenharmony_ci	echo -n $TEST_STR > $TARGET
4048c2ecf20Sopenharmony_ci
4058c2ecf20Sopenharmony_ci	if ! verify "${TARGET}"; then
4068c2ecf20Sopenharmony_ci		echo "FAIL" >&2
4078c2ecf20Sopenharmony_ci		rc=1
4088c2ecf20Sopenharmony_ci	else
4098c2ecf20Sopenharmony_ci		echo "ok"
4108c2ecf20Sopenharmony_ci	fi
4118c2ecf20Sopenharmony_ci	test_rc
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ci	echo -n "Testing INT_MAX + 1 will fail as expected..."
4148c2ecf20Sopenharmony_ci	reset_vals
4158c2ecf20Sopenharmony_ci	let TEST_STR=$INT_MAX+1
4168c2ecf20Sopenharmony_ci	echo -n $TEST_STR > $TARGET 2> /dev/null
4178c2ecf20Sopenharmony_ci
4188c2ecf20Sopenharmony_ci	if verify "${TARGET}"; then
4198c2ecf20Sopenharmony_ci		echo "FAIL" >&2
4208c2ecf20Sopenharmony_ci		rc=1
4218c2ecf20Sopenharmony_ci	else
4228c2ecf20Sopenharmony_ci		echo "ok"
4238c2ecf20Sopenharmony_ci	fi
4248c2ecf20Sopenharmony_ci	test_rc
4258c2ecf20Sopenharmony_ci
4268c2ecf20Sopenharmony_ci	echo -n "Testing negative values will work as expected..."
4278c2ecf20Sopenharmony_ci	reset_vals
4288c2ecf20Sopenharmony_ci	TEST_STR="-3"
4298c2ecf20Sopenharmony_ci	echo -n $TEST_STR > $TARGET 2> /dev/null
4308c2ecf20Sopenharmony_ci	if ! verify "${TARGET}"; then
4318c2ecf20Sopenharmony_ci		echo "FAIL" >&2
4328c2ecf20Sopenharmony_ci		rc=1
4338c2ecf20Sopenharmony_ci	else
4348c2ecf20Sopenharmony_ci		echo "ok"
4358c2ecf20Sopenharmony_ci	fi
4368c2ecf20Sopenharmony_ci	test_rc
4378c2ecf20Sopenharmony_ci}
4388c2ecf20Sopenharmony_ci
4398c2ecf20Sopenharmony_ci# You used an int array
4408c2ecf20Sopenharmony_cirun_limit_digit_int_array()
4418c2ecf20Sopenharmony_ci{
4428c2ecf20Sopenharmony_ci	echo -n "Testing array works as expected ... "
4438c2ecf20Sopenharmony_ci	TEST_STR="4 3 2 1"
4448c2ecf20Sopenharmony_ci	echo -n $TEST_STR > $TARGET
4458c2ecf20Sopenharmony_ci
4468c2ecf20Sopenharmony_ci	if ! verify_diff_w "${TARGET}"; then
4478c2ecf20Sopenharmony_ci		echo "FAIL" >&2
4488c2ecf20Sopenharmony_ci		rc=1
4498c2ecf20Sopenharmony_ci	else
4508c2ecf20Sopenharmony_ci		echo "ok"
4518c2ecf20Sopenharmony_ci	fi
4528c2ecf20Sopenharmony_ci	test_rc
4538c2ecf20Sopenharmony_ci
4548c2ecf20Sopenharmony_ci	echo -n "Testing skipping trailing array elements works ... "
4558c2ecf20Sopenharmony_ci	# Do not reset_vals, carry on the values from the last test.
4568c2ecf20Sopenharmony_ci	# If we only echo in two digits the last two are left intact
4578c2ecf20Sopenharmony_ci	TEST_STR="100 101"
4588c2ecf20Sopenharmony_ci	echo -n $TEST_STR > $TARGET
4598c2ecf20Sopenharmony_ci	# After we echo in, to help diff we need to set on TEST_STR what
4608c2ecf20Sopenharmony_ci	# we expect the result to be.
4618c2ecf20Sopenharmony_ci	TEST_STR="100 101 2 1"
4628c2ecf20Sopenharmony_ci
4638c2ecf20Sopenharmony_ci	if ! verify_diff_w "${TARGET}"; then
4648c2ecf20Sopenharmony_ci		echo "FAIL" >&2
4658c2ecf20Sopenharmony_ci		rc=1
4668c2ecf20Sopenharmony_ci	else
4678c2ecf20Sopenharmony_ci		echo "ok"
4688c2ecf20Sopenharmony_ci	fi
4698c2ecf20Sopenharmony_ci	test_rc
4708c2ecf20Sopenharmony_ci
4718c2ecf20Sopenharmony_ci	echo -n "Testing PAGE_SIZE limit on array works ... "
4728c2ecf20Sopenharmony_ci	# Do not reset_vals, carry on the values from the last test.
4738c2ecf20Sopenharmony_ci	# Even if you use an int array, you are still restricted to
4748c2ecf20Sopenharmony_ci	# MAX_DIGITS, this is a known limitation. Test limit works.
4758c2ecf20Sopenharmony_ci	LIMIT=$((MAX_DIGITS -1))
4768c2ecf20Sopenharmony_ci	TEST_STR="9"
4778c2ecf20Sopenharmony_ci	(perl -e 'print " " x '$LIMIT';'; echo "${TEST_STR}") | \
4788c2ecf20Sopenharmony_ci		dd of="${TARGET}" 2>/dev/null
4798c2ecf20Sopenharmony_ci
4808c2ecf20Sopenharmony_ci	TEST_STR="9 101 2 1"
4818c2ecf20Sopenharmony_ci	if ! verify_diff_w "${TARGET}"; then
4828c2ecf20Sopenharmony_ci		echo "FAIL" >&2
4838c2ecf20Sopenharmony_ci		rc=1
4848c2ecf20Sopenharmony_ci	else
4858c2ecf20Sopenharmony_ci		echo "ok"
4868c2ecf20Sopenharmony_ci	fi
4878c2ecf20Sopenharmony_ci	test_rc
4888c2ecf20Sopenharmony_ci
4898c2ecf20Sopenharmony_ci	echo -n "Testing exceeding PAGE_SIZE limit fails as expected ... "
4908c2ecf20Sopenharmony_ci	# Do not reset_vals, carry on the values from the last test.
4918c2ecf20Sopenharmony_ci	# Now go over limit.
4928c2ecf20Sopenharmony_ci	LIMIT=$((MAX_DIGITS))
4938c2ecf20Sopenharmony_ci	TEST_STR="7"
4948c2ecf20Sopenharmony_ci	(perl -e 'print " " x '$LIMIT';'; echo "${TEST_STR}") | \
4958c2ecf20Sopenharmony_ci		dd of="${TARGET}" 2>/dev/null
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_ci	TEST_STR="7 101 2 1"
4988c2ecf20Sopenharmony_ci	if verify_diff_w "${TARGET}"; then
4998c2ecf20Sopenharmony_ci		echo "FAIL" >&2
5008c2ecf20Sopenharmony_ci		rc=1
5018c2ecf20Sopenharmony_ci	else
5028c2ecf20Sopenharmony_ci		echo "ok"
5038c2ecf20Sopenharmony_ci	fi
5048c2ecf20Sopenharmony_ci	test_rc
5058c2ecf20Sopenharmony_ci}
5068c2ecf20Sopenharmony_ci
5078c2ecf20Sopenharmony_ci# You are using an unsigned int
5088c2ecf20Sopenharmony_cirun_limit_digit_uint()
5098c2ecf20Sopenharmony_ci{
5108c2ecf20Sopenharmony_ci	echo -n "Testing UINT_MAX works ..."
5118c2ecf20Sopenharmony_ci	reset_vals
5128c2ecf20Sopenharmony_ci	TEST_STR="$UINT_MAX"
5138c2ecf20Sopenharmony_ci	echo -n $TEST_STR > $TARGET
5148c2ecf20Sopenharmony_ci
5158c2ecf20Sopenharmony_ci	if ! verify "${TARGET}"; then
5168c2ecf20Sopenharmony_ci		echo "FAIL" >&2
5178c2ecf20Sopenharmony_ci		rc=1
5188c2ecf20Sopenharmony_ci	else
5198c2ecf20Sopenharmony_ci		echo "ok"
5208c2ecf20Sopenharmony_ci	fi
5218c2ecf20Sopenharmony_ci	test_rc
5228c2ecf20Sopenharmony_ci
5238c2ecf20Sopenharmony_ci	echo -n "Testing UINT_MAX + 1 will fail as expected..."
5248c2ecf20Sopenharmony_ci	reset_vals
5258c2ecf20Sopenharmony_ci	TEST_STR=$(($UINT_MAX+1))
5268c2ecf20Sopenharmony_ci	echo -n $TEST_STR > $TARGET 2> /dev/null
5278c2ecf20Sopenharmony_ci
5288c2ecf20Sopenharmony_ci	if verify "${TARGET}"; then
5298c2ecf20Sopenharmony_ci		echo "FAIL" >&2
5308c2ecf20Sopenharmony_ci		rc=1
5318c2ecf20Sopenharmony_ci	else
5328c2ecf20Sopenharmony_ci		echo "ok"
5338c2ecf20Sopenharmony_ci	fi
5348c2ecf20Sopenharmony_ci	test_rc
5358c2ecf20Sopenharmony_ci
5368c2ecf20Sopenharmony_ci	echo -n "Testing negative values will not work as expected ..."
5378c2ecf20Sopenharmony_ci	reset_vals
5388c2ecf20Sopenharmony_ci	TEST_STR="-3"
5398c2ecf20Sopenharmony_ci	echo -n $TEST_STR > $TARGET 2> /dev/null
5408c2ecf20Sopenharmony_ci
5418c2ecf20Sopenharmony_ci	if verify "${TARGET}"; then
5428c2ecf20Sopenharmony_ci		echo "FAIL" >&2
5438c2ecf20Sopenharmony_ci		rc=1
5448c2ecf20Sopenharmony_ci	else
5458c2ecf20Sopenharmony_ci		echo "ok"
5468c2ecf20Sopenharmony_ci	fi
5478c2ecf20Sopenharmony_ci	test_rc
5488c2ecf20Sopenharmony_ci}
5498c2ecf20Sopenharmony_ci
5508c2ecf20Sopenharmony_cirun_stringtests()
5518c2ecf20Sopenharmony_ci{
5528c2ecf20Sopenharmony_ci	echo -n "Writing entire sysctl in short writes ... "
5538c2ecf20Sopenharmony_ci	set_orig
5548c2ecf20Sopenharmony_ci	dd if="${TEST_FILE}" of="${TARGET}" bs=1 2>/dev/null
5558c2ecf20Sopenharmony_ci	if ! verify "${TARGET}"; then
5568c2ecf20Sopenharmony_ci		echo "FAIL" >&2
5578c2ecf20Sopenharmony_ci		rc=1
5588c2ecf20Sopenharmony_ci	else
5598c2ecf20Sopenharmony_ci		echo "ok"
5608c2ecf20Sopenharmony_ci	fi
5618c2ecf20Sopenharmony_ci
5628c2ecf20Sopenharmony_ci	echo -n "Writing middle of sysctl after unsynchronized seek ... "
5638c2ecf20Sopenharmony_ci	set_test
5648c2ecf20Sopenharmony_ci	dd if="${TEST_FILE}" of="${TARGET}" bs=1 seek=1 2>/dev/null
5658c2ecf20Sopenharmony_ci	if verify "${TARGET}"; then
5668c2ecf20Sopenharmony_ci		echo "FAIL" >&2
5678c2ecf20Sopenharmony_ci		rc=1
5688c2ecf20Sopenharmony_ci	else
5698c2ecf20Sopenharmony_ci		echo "ok"
5708c2ecf20Sopenharmony_ci	fi
5718c2ecf20Sopenharmony_ci
5728c2ecf20Sopenharmony_ci	echo -n "Checking sysctl maxlen is at least $MAXLEN ... "
5738c2ecf20Sopenharmony_ci	set_orig
5748c2ecf20Sopenharmony_ci	perl -e 'print "A" x ('"${MAXLEN}"'-2), "B";' | \
5758c2ecf20Sopenharmony_ci		dd of="${TARGET}" bs="${MAXLEN}" 2>/dev/null
5768c2ecf20Sopenharmony_ci	if ! grep -q B "${TARGET}"; then
5778c2ecf20Sopenharmony_ci		echo "FAIL" >&2
5788c2ecf20Sopenharmony_ci		rc=1
5798c2ecf20Sopenharmony_ci	else
5808c2ecf20Sopenharmony_ci		echo "ok"
5818c2ecf20Sopenharmony_ci	fi
5828c2ecf20Sopenharmony_ci
5838c2ecf20Sopenharmony_ci	echo -n "Checking sysctl keeps original string on overflow append ... "
5848c2ecf20Sopenharmony_ci	set_orig
5858c2ecf20Sopenharmony_ci	perl -e 'print "A" x ('"${MAXLEN}"'-1), "B";' | \
5868c2ecf20Sopenharmony_ci		dd of="${TARGET}" bs=$(( MAXLEN - 1 )) 2>/dev/null
5878c2ecf20Sopenharmony_ci	if grep -q B "${TARGET}"; then
5888c2ecf20Sopenharmony_ci		echo "FAIL" >&2
5898c2ecf20Sopenharmony_ci		rc=1
5908c2ecf20Sopenharmony_ci	else
5918c2ecf20Sopenharmony_ci		echo "ok"
5928c2ecf20Sopenharmony_ci	fi
5938c2ecf20Sopenharmony_ci
5948c2ecf20Sopenharmony_ci	echo -n "Checking sysctl stays NULL terminated on write ... "
5958c2ecf20Sopenharmony_ci	set_orig
5968c2ecf20Sopenharmony_ci	perl -e 'print "A" x ('"${MAXLEN}"'-1), "B";' | \
5978c2ecf20Sopenharmony_ci		dd of="${TARGET}" bs="${MAXLEN}" 2>/dev/null
5988c2ecf20Sopenharmony_ci	if grep -q B "${TARGET}"; then
5998c2ecf20Sopenharmony_ci		echo "FAIL" >&2
6008c2ecf20Sopenharmony_ci		rc=1
6018c2ecf20Sopenharmony_ci	else
6028c2ecf20Sopenharmony_ci		echo "ok"
6038c2ecf20Sopenharmony_ci	fi
6048c2ecf20Sopenharmony_ci
6058c2ecf20Sopenharmony_ci	echo -n "Checking sysctl stays NULL terminated on overwrite ... "
6068c2ecf20Sopenharmony_ci	set_orig
6078c2ecf20Sopenharmony_ci	perl -e 'print "A" x ('"${MAXLEN}"'-1), "BB";' | \
6088c2ecf20Sopenharmony_ci		dd of="${TARGET}" bs=$(( $MAXLEN + 1 )) 2>/dev/null
6098c2ecf20Sopenharmony_ci	if grep -q B "${TARGET}"; then
6108c2ecf20Sopenharmony_ci		echo "FAIL" >&2
6118c2ecf20Sopenharmony_ci		rc=1
6128c2ecf20Sopenharmony_ci	else
6138c2ecf20Sopenharmony_ci		echo "ok"
6148c2ecf20Sopenharmony_ci	fi
6158c2ecf20Sopenharmony_ci
6168c2ecf20Sopenharmony_ci	test_rc
6178c2ecf20Sopenharmony_ci}
6188c2ecf20Sopenharmony_ci
6198c2ecf20Sopenharmony_citarget_exists()
6208c2ecf20Sopenharmony_ci{
6218c2ecf20Sopenharmony_ci	TARGET="${SYSCTL}/$1"
6228c2ecf20Sopenharmony_ci	TEST_ID="$2"
6238c2ecf20Sopenharmony_ci
6248c2ecf20Sopenharmony_ci	if [ ! -f ${TARGET} ] ; then
6258c2ecf20Sopenharmony_ci		echo "Target for test $TEST_ID: $TARGET not exist, skipping test ..."
6268c2ecf20Sopenharmony_ci		return 0
6278c2ecf20Sopenharmony_ci	fi
6288c2ecf20Sopenharmony_ci	return 1
6298c2ecf20Sopenharmony_ci}
6308c2ecf20Sopenharmony_ci
6318c2ecf20Sopenharmony_cirun_bitmaptest() {
6328c2ecf20Sopenharmony_ci	# Total length of bitmaps string to use, a bit under
6338c2ecf20Sopenharmony_ci	# the maximum input size of the test node
6348c2ecf20Sopenharmony_ci	LENGTH=$((RANDOM % 65000))
6358c2ecf20Sopenharmony_ci
6368c2ecf20Sopenharmony_ci	# First bit to set
6378c2ecf20Sopenharmony_ci	BIT=$((RANDOM % 1024))
6388c2ecf20Sopenharmony_ci
6398c2ecf20Sopenharmony_ci	# String containing our list of bits to set
6408c2ecf20Sopenharmony_ci	TEST_STR=$BIT
6418c2ecf20Sopenharmony_ci
6428c2ecf20Sopenharmony_ci	# build up the string
6438c2ecf20Sopenharmony_ci	while [ "${#TEST_STR}" -le "$LENGTH" ]; do
6448c2ecf20Sopenharmony_ci		# Make sure next entry is discontiguous,
6458c2ecf20Sopenharmony_ci		# skip ahead at least 2
6468c2ecf20Sopenharmony_ci		BIT=$((BIT + $((2 + RANDOM % 10))))
6478c2ecf20Sopenharmony_ci
6488c2ecf20Sopenharmony_ci		# Add new bit to the list
6498c2ecf20Sopenharmony_ci		TEST_STR="${TEST_STR},${BIT}"
6508c2ecf20Sopenharmony_ci
6518c2ecf20Sopenharmony_ci		# Randomly make it a range
6528c2ecf20Sopenharmony_ci		if [ "$((RANDOM % 2))" -eq "1" ]; then
6538c2ecf20Sopenharmony_ci			RANGE_END=$((BIT + $((1 + RANDOM % 10))))
6548c2ecf20Sopenharmony_ci			TEST_STR="${TEST_STR}-${RANGE_END}"
6558c2ecf20Sopenharmony_ci			BIT=$RANGE_END
6568c2ecf20Sopenharmony_ci		fi
6578c2ecf20Sopenharmony_ci	done
6588c2ecf20Sopenharmony_ci
6598c2ecf20Sopenharmony_ci	echo -n "Checking bitmap handler... "
6608c2ecf20Sopenharmony_ci	TEST_FILE=$(mktemp)
6618c2ecf20Sopenharmony_ci	echo -n "$TEST_STR" > $TEST_FILE
6628c2ecf20Sopenharmony_ci
6638c2ecf20Sopenharmony_ci	cat $TEST_FILE > $TARGET 2> /dev/null
6648c2ecf20Sopenharmony_ci	if [ $? -ne 0 ]; then
6658c2ecf20Sopenharmony_ci		echo "FAIL" >&2
6668c2ecf20Sopenharmony_ci		rc=1
6678c2ecf20Sopenharmony_ci		test_rc
6688c2ecf20Sopenharmony_ci	fi
6698c2ecf20Sopenharmony_ci
6708c2ecf20Sopenharmony_ci	if ! verify_diff_proc_file "$TARGET" "$TEST_FILE"; then
6718c2ecf20Sopenharmony_ci		echo "FAIL" >&2
6728c2ecf20Sopenharmony_ci		rc=1
6738c2ecf20Sopenharmony_ci	else
6748c2ecf20Sopenharmony_ci		echo "ok"
6758c2ecf20Sopenharmony_ci		rc=0
6768c2ecf20Sopenharmony_ci	fi
6778c2ecf20Sopenharmony_ci	test_rc
6788c2ecf20Sopenharmony_ci}
6798c2ecf20Sopenharmony_ci
6808c2ecf20Sopenharmony_cisysctl_test_0001()
6818c2ecf20Sopenharmony_ci{
6828c2ecf20Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0001)"
6838c2ecf20Sopenharmony_ci	reset_vals
6848c2ecf20Sopenharmony_ci	ORIG=$(cat "${TARGET}")
6858c2ecf20Sopenharmony_ci	TEST_STR=$(( $ORIG + 1 ))
6868c2ecf20Sopenharmony_ci
6878c2ecf20Sopenharmony_ci	run_numerictests
6888c2ecf20Sopenharmony_ci	run_wideint_tests
6898c2ecf20Sopenharmony_ci	run_limit_digit
6908c2ecf20Sopenharmony_ci}
6918c2ecf20Sopenharmony_ci
6928c2ecf20Sopenharmony_cisysctl_test_0002()
6938c2ecf20Sopenharmony_ci{
6948c2ecf20Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0002)"
6958c2ecf20Sopenharmony_ci	reset_vals
6968c2ecf20Sopenharmony_ci	ORIG=$(cat "${TARGET}")
6978c2ecf20Sopenharmony_ci	TEST_STR="Testing sysctl"
6988c2ecf20Sopenharmony_ci	# Only string sysctls support seeking/appending.
6998c2ecf20Sopenharmony_ci	MAXLEN=65
7008c2ecf20Sopenharmony_ci
7018c2ecf20Sopenharmony_ci	run_numerictests
7028c2ecf20Sopenharmony_ci	run_stringtests
7038c2ecf20Sopenharmony_ci}
7048c2ecf20Sopenharmony_ci
7058c2ecf20Sopenharmony_cisysctl_test_0003()
7068c2ecf20Sopenharmony_ci{
7078c2ecf20Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0003)"
7088c2ecf20Sopenharmony_ci	reset_vals
7098c2ecf20Sopenharmony_ci	ORIG=$(cat "${TARGET}")
7108c2ecf20Sopenharmony_ci	TEST_STR=$(( $ORIG + 1 ))
7118c2ecf20Sopenharmony_ci
7128c2ecf20Sopenharmony_ci	run_numerictests
7138c2ecf20Sopenharmony_ci	run_wideint_tests
7148c2ecf20Sopenharmony_ci	run_limit_digit
7158c2ecf20Sopenharmony_ci	run_limit_digit_int
7168c2ecf20Sopenharmony_ci}
7178c2ecf20Sopenharmony_ci
7188c2ecf20Sopenharmony_cisysctl_test_0004()
7198c2ecf20Sopenharmony_ci{
7208c2ecf20Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0004)"
7218c2ecf20Sopenharmony_ci	reset_vals
7228c2ecf20Sopenharmony_ci	ORIG=$(cat "${TARGET}")
7238c2ecf20Sopenharmony_ci	TEST_STR=$(( $ORIG + 1 ))
7248c2ecf20Sopenharmony_ci
7258c2ecf20Sopenharmony_ci	run_numerictests
7268c2ecf20Sopenharmony_ci	run_wideint_tests
7278c2ecf20Sopenharmony_ci	run_limit_digit
7288c2ecf20Sopenharmony_ci	run_limit_digit_uint
7298c2ecf20Sopenharmony_ci}
7308c2ecf20Sopenharmony_ci
7318c2ecf20Sopenharmony_cisysctl_test_0005()
7328c2ecf20Sopenharmony_ci{
7338c2ecf20Sopenharmony_ci	TARGET="${SYSCTL}/$(get_test_target 0005)"
7348c2ecf20Sopenharmony_ci	reset_vals
7358c2ecf20Sopenharmony_ci	ORIG=$(cat "${TARGET}")
7368c2ecf20Sopenharmony_ci
7378c2ecf20Sopenharmony_ci	run_limit_digit_int_array
7388c2ecf20Sopenharmony_ci}
7398c2ecf20Sopenharmony_ci
7408c2ecf20Sopenharmony_cisysctl_test_0006()
7418c2ecf20Sopenharmony_ci{
7428c2ecf20Sopenharmony_ci	TARGET="${SYSCTL}/bitmap_0001"
7438c2ecf20Sopenharmony_ci	reset_vals
7448c2ecf20Sopenharmony_ci	ORIG=""
7458c2ecf20Sopenharmony_ci	run_bitmaptest
7468c2ecf20Sopenharmony_ci}
7478c2ecf20Sopenharmony_ci
7488c2ecf20Sopenharmony_cisysctl_test_0007()
7498c2ecf20Sopenharmony_ci{
7508c2ecf20Sopenharmony_ci	TARGET="${SYSCTL}/boot_int"
7518c2ecf20Sopenharmony_ci	if [ ! -f $TARGET ]; then
7528c2ecf20Sopenharmony_ci		echo "Skipping test for $TARGET as it is not present ..."
7538c2ecf20Sopenharmony_ci		return $ksft_skip
7548c2ecf20Sopenharmony_ci	fi
7558c2ecf20Sopenharmony_ci
7568c2ecf20Sopenharmony_ci	if [ -d $DIR ]; then
7578c2ecf20Sopenharmony_ci		echo "Boot param test only possible sysctl_test is built-in, not module:"
7588c2ecf20Sopenharmony_ci		cat $TEST_DIR/config >&2
7598c2ecf20Sopenharmony_ci		return $ksft_skip
7608c2ecf20Sopenharmony_ci	fi
7618c2ecf20Sopenharmony_ci
7628c2ecf20Sopenharmony_ci	echo -n "Testing if $TARGET is set to 1 ..."
7638c2ecf20Sopenharmony_ci	ORIG=$(cat "${TARGET}")
7648c2ecf20Sopenharmony_ci
7658c2ecf20Sopenharmony_ci	if [ x$ORIG = "x1" ]; then
7668c2ecf20Sopenharmony_ci		echo "ok"
7678c2ecf20Sopenharmony_ci		return 0
7688c2ecf20Sopenharmony_ci	fi
7698c2ecf20Sopenharmony_ci	echo "FAIL"
7708c2ecf20Sopenharmony_ci	echo "Checking if /proc/cmdline contains setting of the expected parameter ..."
7718c2ecf20Sopenharmony_ci	if [ ! -f /proc/cmdline ]; then
7728c2ecf20Sopenharmony_ci		echo "/proc/cmdline does not exist, test inconclusive"
7738c2ecf20Sopenharmony_ci		return 0
7748c2ecf20Sopenharmony_ci	fi
7758c2ecf20Sopenharmony_ci
7768c2ecf20Sopenharmony_ci	FOUND=$(grep -c "sysctl[./]debug[./]test_sysctl[./]boot_int=1" /proc/cmdline)
7778c2ecf20Sopenharmony_ci	if [ $FOUND = "1" ]; then
7788c2ecf20Sopenharmony_ci		echo "Kernel param found but $TARGET is not 1, TEST FAILED"
7798c2ecf20Sopenharmony_ci		rc=1
7808c2ecf20Sopenharmony_ci		test_rc
7818c2ecf20Sopenharmony_ci	fi
7828c2ecf20Sopenharmony_ci
7838c2ecf20Sopenharmony_ci	echo "Skipping test, expected kernel parameter missing."
7848c2ecf20Sopenharmony_ci	echo "To perform this test, make sure kernel is booted with parameter: sysctl.debug.test_sysctl.boot_int=1"
7858c2ecf20Sopenharmony_ci	return $ksft_skip
7868c2ecf20Sopenharmony_ci}
7878c2ecf20Sopenharmony_ci
7888c2ecf20Sopenharmony_cilist_tests()
7898c2ecf20Sopenharmony_ci{
7908c2ecf20Sopenharmony_ci	echo "Test ID list:"
7918c2ecf20Sopenharmony_ci	echo
7928c2ecf20Sopenharmony_ci	echo "TEST_ID x NUM_TEST"
7938c2ecf20Sopenharmony_ci	echo "TEST_ID:   Test ID"
7948c2ecf20Sopenharmony_ci	echo "NUM_TESTS: Number of recommended times to run the test"
7958c2ecf20Sopenharmony_ci	echo
7968c2ecf20Sopenharmony_ci	echo "0001 x $(get_test_count 0001) - tests proc_dointvec_minmax()"
7978c2ecf20Sopenharmony_ci	echo "0002 x $(get_test_count 0002) - tests proc_dostring()"
7988c2ecf20Sopenharmony_ci	echo "0003 x $(get_test_count 0003) - tests proc_dointvec()"
7998c2ecf20Sopenharmony_ci	echo "0004 x $(get_test_count 0004) - tests proc_douintvec()"
8008c2ecf20Sopenharmony_ci	echo "0005 x $(get_test_count 0005) - tests proc_douintvec() array"
8018c2ecf20Sopenharmony_ci	echo "0006 x $(get_test_count 0006) - tests proc_do_large_bitmap()"
8028c2ecf20Sopenharmony_ci	echo "0007 x $(get_test_count 0007) - tests setting sysctl from kernel boot param"
8038c2ecf20Sopenharmony_ci}
8048c2ecf20Sopenharmony_ci
8058c2ecf20Sopenharmony_ciusage()
8068c2ecf20Sopenharmony_ci{
8078c2ecf20Sopenharmony_ci	NUM_TESTS=$(grep -o ' ' <<<"$ALL_TESTS" | grep -c .)
8088c2ecf20Sopenharmony_ci	let NUM_TESTS=$NUM_TESTS+1
8098c2ecf20Sopenharmony_ci	MAX_TEST=$(printf "%04d\n" $NUM_TESTS)
8108c2ecf20Sopenharmony_ci	echo "Usage: $0 [ -t <4-number-digit> ] | [ -w <4-number-digit> ] |"
8118c2ecf20Sopenharmony_ci	echo "		 [ -s <4-number-digit> ] | [ -c <4-number-digit> <test- count>"
8128c2ecf20Sopenharmony_ci	echo "           [ all ] [ -h | --help ] [ -l ]"
8138c2ecf20Sopenharmony_ci	echo ""
8148c2ecf20Sopenharmony_ci	echo "Valid tests: 0001-$MAX_TEST"
8158c2ecf20Sopenharmony_ci	echo ""
8168c2ecf20Sopenharmony_ci	echo "    all     Runs all tests (default)"
8178c2ecf20Sopenharmony_ci	echo "    -t      Run test ID the number amount of times is recommended"
8188c2ecf20Sopenharmony_ci	echo "    -w      Watch test ID run until it runs into an error"
8198c2ecf20Sopenharmony_ci	echo "    -c      Run test ID once"
8208c2ecf20Sopenharmony_ci	echo "    -s      Run test ID x test-count number of times"
8218c2ecf20Sopenharmony_ci	echo "    -l      List all test ID list"
8228c2ecf20Sopenharmony_ci	echo " -h|--help  Help"
8238c2ecf20Sopenharmony_ci	echo
8248c2ecf20Sopenharmony_ci	echo "If an error every occurs execution will immediately terminate."
8258c2ecf20Sopenharmony_ci	echo "If you are adding a new test try using -w <test-ID> first to"
8268c2ecf20Sopenharmony_ci	echo "make sure the test passes a series of tests."
8278c2ecf20Sopenharmony_ci	echo
8288c2ecf20Sopenharmony_ci	echo Example uses:
8298c2ecf20Sopenharmony_ci	echo
8308c2ecf20Sopenharmony_ci	echo "$TEST_NAME.sh            -- executes all tests"
8318c2ecf20Sopenharmony_ci	echo "$TEST_NAME.sh -t 0002    -- Executes test ID 0002 number of times is recomended"
8328c2ecf20Sopenharmony_ci	echo "$TEST_NAME.sh -w 0002    -- Watch test ID 0002 run until an error occurs"
8338c2ecf20Sopenharmony_ci	echo "$TEST_NAME.sh -s 0002    -- Run test ID 0002 once"
8348c2ecf20Sopenharmony_ci	echo "$TEST_NAME.sh -c 0002 3  -- Run test ID 0002 three times"
8358c2ecf20Sopenharmony_ci	echo
8368c2ecf20Sopenharmony_ci	list_tests
8378c2ecf20Sopenharmony_ci	exit 1
8388c2ecf20Sopenharmony_ci}
8398c2ecf20Sopenharmony_ci
8408c2ecf20Sopenharmony_cifunction test_num()
8418c2ecf20Sopenharmony_ci{
8428c2ecf20Sopenharmony_ci	re='^[0-9]+$'
8438c2ecf20Sopenharmony_ci	if ! [[ $1 =~ $re ]]; then
8448c2ecf20Sopenharmony_ci		usage
8458c2ecf20Sopenharmony_ci	fi
8468c2ecf20Sopenharmony_ci}
8478c2ecf20Sopenharmony_ci
8488c2ecf20Sopenharmony_cifunction get_test_count()
8498c2ecf20Sopenharmony_ci{
8508c2ecf20Sopenharmony_ci	test_num $1
8518c2ecf20Sopenharmony_ci	TEST_DATA=$(echo $ALL_TESTS | awk '{print $'$1'}')
8528c2ecf20Sopenharmony_ci	echo ${TEST_DATA} | awk -F":" '{print $2}'
8538c2ecf20Sopenharmony_ci}
8548c2ecf20Sopenharmony_ci
8558c2ecf20Sopenharmony_cifunction get_test_enabled()
8568c2ecf20Sopenharmony_ci{
8578c2ecf20Sopenharmony_ci	test_num $1
8588c2ecf20Sopenharmony_ci	TEST_DATA=$(echo $ALL_TESTS | awk '{print $'$1'}')
8598c2ecf20Sopenharmony_ci	echo ${TEST_DATA} | awk -F":" '{print $3}'
8608c2ecf20Sopenharmony_ci}
8618c2ecf20Sopenharmony_ci
8628c2ecf20Sopenharmony_cifunction get_test_target()
8638c2ecf20Sopenharmony_ci{
8648c2ecf20Sopenharmony_ci	test_num $1
8658c2ecf20Sopenharmony_ci	TEST_DATA=$(echo $ALL_TESTS | awk '{print $'$1'}')
8668c2ecf20Sopenharmony_ci	echo ${TEST_DATA} | awk -F":" '{print $4}'
8678c2ecf20Sopenharmony_ci}
8688c2ecf20Sopenharmony_ci
8698c2ecf20Sopenharmony_cifunction run_all_tests()
8708c2ecf20Sopenharmony_ci{
8718c2ecf20Sopenharmony_ci	for i in $ALL_TESTS ; do
8728c2ecf20Sopenharmony_ci		TEST_ID=${i%:*:*:*}
8738c2ecf20Sopenharmony_ci		ENABLED=$(get_test_enabled $TEST_ID)
8748c2ecf20Sopenharmony_ci		TEST_COUNT=$(get_test_count $TEST_ID)
8758c2ecf20Sopenharmony_ci		TEST_TARGET=$(get_test_target $TEST_ID)
8768c2ecf20Sopenharmony_ci		if target_exists $TEST_TARGET $TEST_ID; then
8778c2ecf20Sopenharmony_ci			continue
8788c2ecf20Sopenharmony_ci		fi
8798c2ecf20Sopenharmony_ci		if [[ $ENABLED -eq "1" ]]; then
8808c2ecf20Sopenharmony_ci			test_case $TEST_ID $TEST_COUNT $TEST_TARGET
8818c2ecf20Sopenharmony_ci		fi
8828c2ecf20Sopenharmony_ci	done
8838c2ecf20Sopenharmony_ci}
8848c2ecf20Sopenharmony_ci
8858c2ecf20Sopenharmony_cifunction watch_log()
8868c2ecf20Sopenharmony_ci{
8878c2ecf20Sopenharmony_ci	if [ $# -ne 3 ]; then
8888c2ecf20Sopenharmony_ci		clear
8898c2ecf20Sopenharmony_ci	fi
8908c2ecf20Sopenharmony_ci	date
8918c2ecf20Sopenharmony_ci	echo "Running test: $2 - run #$1"
8928c2ecf20Sopenharmony_ci}
8938c2ecf20Sopenharmony_ci
8948c2ecf20Sopenharmony_cifunction watch_case()
8958c2ecf20Sopenharmony_ci{
8968c2ecf20Sopenharmony_ci	i=0
8978c2ecf20Sopenharmony_ci	while [ 1 ]; do
8988c2ecf20Sopenharmony_ci
8998c2ecf20Sopenharmony_ci		if [ $# -eq 1 ]; then
9008c2ecf20Sopenharmony_ci			test_num $1
9018c2ecf20Sopenharmony_ci			watch_log $i ${TEST_NAME}_test_$1
9028c2ecf20Sopenharmony_ci			${TEST_NAME}_test_$1
9038c2ecf20Sopenharmony_ci		else
9048c2ecf20Sopenharmony_ci			watch_log $i all
9058c2ecf20Sopenharmony_ci			run_all_tests
9068c2ecf20Sopenharmony_ci		fi
9078c2ecf20Sopenharmony_ci		let i=$i+1
9088c2ecf20Sopenharmony_ci	done
9098c2ecf20Sopenharmony_ci}
9108c2ecf20Sopenharmony_ci
9118c2ecf20Sopenharmony_cifunction test_case()
9128c2ecf20Sopenharmony_ci{
9138c2ecf20Sopenharmony_ci	NUM_TESTS=$2
9148c2ecf20Sopenharmony_ci
9158c2ecf20Sopenharmony_ci	i=0
9168c2ecf20Sopenharmony_ci
9178c2ecf20Sopenharmony_ci	if target_exists $3 $1; then
9188c2ecf20Sopenharmony_ci		continue
9198c2ecf20Sopenharmony_ci	fi
9208c2ecf20Sopenharmony_ci
9218c2ecf20Sopenharmony_ci	while [ $i -lt $NUM_TESTS ]; do
9228c2ecf20Sopenharmony_ci		test_num $1
9238c2ecf20Sopenharmony_ci		watch_log $i ${TEST_NAME}_test_$1 noclear
9248c2ecf20Sopenharmony_ci		RUN_TEST=${TEST_NAME}_test_$1
9258c2ecf20Sopenharmony_ci		$RUN_TEST
9268c2ecf20Sopenharmony_ci		let i=$i+1
9278c2ecf20Sopenharmony_ci	done
9288c2ecf20Sopenharmony_ci}
9298c2ecf20Sopenharmony_ci
9308c2ecf20Sopenharmony_cifunction parse_args()
9318c2ecf20Sopenharmony_ci{
9328c2ecf20Sopenharmony_ci	if [ $# -eq 0 ]; then
9338c2ecf20Sopenharmony_ci		run_all_tests
9348c2ecf20Sopenharmony_ci	else
9358c2ecf20Sopenharmony_ci		if [[ "$1" = "all" ]]; then
9368c2ecf20Sopenharmony_ci			run_all_tests
9378c2ecf20Sopenharmony_ci		elif [[ "$1" = "-w" ]]; then
9388c2ecf20Sopenharmony_ci			shift
9398c2ecf20Sopenharmony_ci			watch_case $@
9408c2ecf20Sopenharmony_ci		elif [[ "$1" = "-t" ]]; then
9418c2ecf20Sopenharmony_ci			shift
9428c2ecf20Sopenharmony_ci			test_num $1
9438c2ecf20Sopenharmony_ci			test_case $1 $(get_test_count $1) $(get_test_target $1)
9448c2ecf20Sopenharmony_ci		elif [[ "$1" = "-c" ]]; then
9458c2ecf20Sopenharmony_ci			shift
9468c2ecf20Sopenharmony_ci			test_num $1
9478c2ecf20Sopenharmony_ci			test_num $2
9488c2ecf20Sopenharmony_ci			test_case $1 $2 $(get_test_target $1)
9498c2ecf20Sopenharmony_ci		elif [[ "$1" = "-s" ]]; then
9508c2ecf20Sopenharmony_ci			shift
9518c2ecf20Sopenharmony_ci			test_case $1 1 $(get_test_target $1)
9528c2ecf20Sopenharmony_ci		elif [[ "$1" = "-l" ]]; then
9538c2ecf20Sopenharmony_ci			list_tests
9548c2ecf20Sopenharmony_ci		elif [[ "$1" = "-h" || "$1" = "--help" ]]; then
9558c2ecf20Sopenharmony_ci			usage
9568c2ecf20Sopenharmony_ci		else
9578c2ecf20Sopenharmony_ci			usage
9588c2ecf20Sopenharmony_ci		fi
9598c2ecf20Sopenharmony_ci	fi
9608c2ecf20Sopenharmony_ci}
9618c2ecf20Sopenharmony_ci
9628c2ecf20Sopenharmony_citest_reqs
9638c2ecf20Sopenharmony_ciallow_user_defaults
9648c2ecf20Sopenharmony_cicheck_production_sysctl_writes_strict
9658c2ecf20Sopenharmony_ciload_req_mod
9668c2ecf20Sopenharmony_ci
9678c2ecf20Sopenharmony_citrap "test_finish" EXIT
9688c2ecf20Sopenharmony_ci
9698c2ecf20Sopenharmony_ciparse_args $@
9708c2ecf20Sopenharmony_ci
9718c2ecf20Sopenharmony_ciexit 0
972