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