mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 13:41:48 -04:00
Commit2964f6b816("selftests: Use ktap helpers for runner.sh") converted the prints in runner.sh to use the relevant helpers from ktap_helpers.sh, not modifying any of the strings printed in the process. This included converting all the result reports to use the relevant ktap_test_ function. Since the output was originally KTAP compliant the strings reported for test names now include test numbers: ok 59 59 selftests: arm64: syscall-abi instead of the expected format: ok 59 selftests: arm64: syscall-abi which causes result parsers to interpret the second number as part of the test name. Given the use of the helpers the tracking of test numbers by runner.sh is now redundant, remove it entirely to restore the expected output format. Link: https://lore.kernel.org/r/20260417-selftests-fix-double-number-v1-1-1be5d7c36b94@kernel.org Fixes:2964f6b816("selftests: Use ktap helpers for runner.sh") Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
229 lines
5.5 KiB
Bash
229 lines
5.5 KiB
Bash
#!/bin/sh
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
#
|
|
# Runs a set of tests in a given subdirectory.
|
|
|
|
# There isn't a shell-agnostic way to find the path of a sourced file,
|
|
# so we must rely on BASE_DIR being set to find other tools.
|
|
if [ -z "$BASE_DIR" ]; then
|
|
echo "Error: BASE_DIR must be set before sourcing." >&2
|
|
exit 1
|
|
fi
|
|
|
|
. ${BASE_DIR}/kselftest/ktap_helpers.sh
|
|
|
|
export timeout_rc=124
|
|
export logfile=/dev/stdout
|
|
export per_test_logging=
|
|
export per_test_log_dir=/tmp
|
|
export RUN_IN_NETNS=
|
|
|
|
# Defaults for "settings" file fields:
|
|
# "timeout" how many seconds to let each test run before running
|
|
# over our soft timeout limit.
|
|
export kselftest_default_timeout=45
|
|
|
|
TR_CMD=$(command -v tr)
|
|
|
|
# If Perl is unavailable, we must fall back to line-at-a-time prefixing
|
|
# with sed instead of unbuffered output.
|
|
tap_prefix()
|
|
{
|
|
if [ ! -x /usr/bin/perl ]; then
|
|
sed -e 's/^/# /'
|
|
else
|
|
"$BASE_DIR"/kselftest/prefix.pl
|
|
fi
|
|
}
|
|
|
|
tap_timeout()
|
|
{
|
|
# Make sure tests will time out if utility is available.
|
|
if [ -x /usr/bin/timeout ] ; then
|
|
/usr/bin/timeout --foreground "$kselftest_timeout" \
|
|
/usr/bin/timeout "$kselftest_timeout" $1
|
|
else
|
|
$1
|
|
fi
|
|
}
|
|
|
|
run_one()
|
|
{
|
|
DIR="$1"
|
|
TEST="$2"
|
|
|
|
BASENAME_TEST=$(basename $TEST)
|
|
|
|
# Reset any "settings"-file variables.
|
|
export kselftest_timeout="$kselftest_default_timeout"
|
|
|
|
# Safe default if tr not available
|
|
kselftest_cmd_args_ref="KSELFTEST_ARGS"
|
|
|
|
# Optional arguments for this command, possibly defined as an
|
|
# environment variable built using the test executable in all
|
|
# uppercase and sanitized substituting non acceptable shell
|
|
# variable name characters with "_" as in:
|
|
#
|
|
# KSELFTEST_<UPPERCASE_SANITIZED_TESTNAME>_ARGS="<options>"
|
|
#
|
|
# e.g.
|
|
#
|
|
# rtctest --> KSELFTEST_RTCTEST_ARGS="/dev/rtc1"
|
|
#
|
|
# cpu-on-off-test.sh --> KSELFTEST_CPU_ON_OFF_TEST_SH_ARGS="-a -p 10"
|
|
#
|
|
if [ -n "$TR_CMD" ]; then
|
|
BASENAME_SANITIZED=$(echo "$BASENAME_TEST" | \
|
|
$TR_CMD -d "[:blank:][:cntrl:]" | \
|
|
$TR_CMD -c "[:alnum:]_" "_" | \
|
|
$TR_CMD [:lower:] [:upper:])
|
|
kselftest_cmd_args_ref="KSELFTEST_${BASENAME_SANITIZED}_ARGS"
|
|
fi
|
|
|
|
# Load per-test-directory kselftest "settings" file.
|
|
settings="$BASE_DIR/$DIR/settings"
|
|
if [ -r "$settings" ] ; then
|
|
while read line ; do
|
|
# Skip comments.
|
|
if echo "$line" | grep -q '^#'; then
|
|
continue
|
|
fi
|
|
field=$(echo "$line" | cut -d= -f1)
|
|
value=$(echo "$line" | cut -d= -f2-)
|
|
eval "kselftest_$field"="$value"
|
|
done < "$settings"
|
|
fi
|
|
|
|
# Command line timeout overrides the settings file
|
|
if [ -n "$kselftest_override_timeout" ]; then
|
|
kselftest_timeout="$kselftest_override_timeout"
|
|
ktap_print_msg "overriding timeout to $kselftest_timeout" >> "$logfile"
|
|
else
|
|
ktap_print_msg "timeout set to $kselftest_timeout" >> "$logfile"
|
|
fi
|
|
|
|
TEST_HDR_MSG="selftests: $DIR: $BASENAME_TEST"
|
|
echo "# $TEST_HDR_MSG"
|
|
if [ ! -e "$TEST" ]; then
|
|
ktap_print_msg "Warning: file $TEST is missing!"
|
|
ktap_test_fail "$TEST_HDR_MSG"
|
|
rc=$KSFT_FAIL
|
|
else
|
|
if [ -x /usr/bin/stdbuf ]; then
|
|
stdbuf="/usr/bin/stdbuf --output=L "
|
|
fi
|
|
eval kselftest_cmd_args="\$${kselftest_cmd_args_ref:-}"
|
|
if [ -x "$TEST" ]; then
|
|
cmd="$stdbuf ./$BASENAME_TEST $kselftest_cmd_args"
|
|
elif [ -x "./ksft_runner.sh" ]; then
|
|
cmd="$stdbuf ./ksft_runner.sh ./$BASENAME_TEST"
|
|
else
|
|
ktap_print_msg "Warning: file $TEST is not executable"
|
|
|
|
if [ $(head -n 1 "$TEST" | cut -c -2) = "#!" ]
|
|
then
|
|
interpreter=$(head -n 1 "$TEST" | cut -c 3-)
|
|
cmd="$stdbuf $interpreter ./$BASENAME_TEST"
|
|
else
|
|
ktap_test_fail "$TEST_HDR_MSG"
|
|
return $KSFT_FAIL
|
|
fi
|
|
fi
|
|
cd `dirname $TEST` > /dev/null
|
|
(((( tap_timeout "$cmd" 2>&1; echo $? >&3) |
|
|
tap_prefix >&4) 3>&1) |
|
|
(read xs; exit $xs)) 4>>"$logfile"
|
|
rc=$?
|
|
case "$rc" in
|
|
"$KSFT_PASS")
|
|
ktap_test_pass "$TEST_HDR_MSG";;
|
|
"$KSFT_SKIP")
|
|
ktap_test_skip "$TEST_HDR_MSG";;
|
|
"$KSFT_XFAIL")
|
|
ktap_test_xfail "$TEST_HDR_MSG";;
|
|
"$timeout_rc")
|
|
ktap_test_fail "$TEST_HDR_MSG # TIMEOUT $kselftest_timeout seconds";;
|
|
*)
|
|
ktap_test_fail "$TEST_HDR_MSG # exit=$rc";;
|
|
esac
|
|
cd - >/dev/null
|
|
fi
|
|
|
|
return $rc
|
|
}
|
|
|
|
in_netns()
|
|
{
|
|
local name=$1
|
|
ip netns exec $name bash <<-EOF
|
|
BASE_DIR=$BASE_DIR
|
|
source $BASE_DIR/kselftest/runner.sh
|
|
logfile=$logfile
|
|
run_one $DIR $TEST
|
|
EOF
|
|
}
|
|
|
|
run_in_netns()
|
|
{
|
|
local tmplog="/tmp/$(mktemp -u ${BASENAME_TEST}-XXXXXX)"
|
|
local netns=$(mktemp -u ${BASENAME_TEST}-XXXXXX)
|
|
local rc
|
|
|
|
ip netns add $netns
|
|
if [ $? -ne 0 ]; then
|
|
ktap_print_msg "Warning: Create namespace failed for $BASENAME_TEST"
|
|
ktap_test_fail "selftests: $DIR: $BASENAME_TEST # Create NS failed"
|
|
fi
|
|
ip -n $netns link set lo up
|
|
|
|
in_netns $netns &> $tmplog
|
|
rc=$?
|
|
|
|
ip netns del $netns &> /dev/null
|
|
# Cat the log at once to avoid parallel netns logs.
|
|
cat $tmplog
|
|
rm -f $tmplog
|
|
return $rc
|
|
}
|
|
|
|
run_many()
|
|
{
|
|
DIR="${PWD#${BASE_DIR}/}"
|
|
local rc
|
|
pids=
|
|
|
|
for TEST in "$@"; do
|
|
BASENAME_TEST=$(basename $TEST)
|
|
if [ -n "$per_test_logging" ]; then
|
|
logfile="$per_test_log_dir/$BASENAME_TEST"
|
|
cat /dev/null > "$logfile"
|
|
fi
|
|
if [ -n "$RUN_IN_NETNS" ]; then
|
|
run_in_netns &
|
|
pids="$pids $!"
|
|
else
|
|
run_one "$DIR" "$TEST"
|
|
fi
|
|
done
|
|
|
|
# These variables are outputs of ktap_helpers.sh but since we've
|
|
# run the test in a subprocess we need to update them manually
|
|
for pid in $pids; do
|
|
wait "$pid"
|
|
rc=$?
|
|
case "$rc" in
|
|
"$KSFT_PASS")
|
|
KTAP_CNT_PASS=$((KTAP_CNT_PASS + 1));;
|
|
"$KSFT_FAIL")
|
|
KTAP_CNT_FAIL=$((KTAP_CNT_FAIL + 1));;
|
|
"$KSFT_SKIP")
|
|
KTAP_CNT_SKIP=$((KTAP_CNT_SKIP + 1));;
|
|
"$KSFT_XFAIL")
|
|
KTAP_CNT_XFAIL=$((KTAP_CNT_XFAIL + 1));;
|
|
*)
|
|
KTAP_CNT_FAIL=$((KTAP_CNT_FAIL + 1));;
|
|
esac
|
|
done
|
|
}
|