Commit 596c8819 authored by Petr Machata's avatar Petr Machata Committed by Jakub Kicinski

selftests: forwarding: Have RET track kselftest framework constants

The variable RET keeps track of whether the test under execution has so far
failed or not. Currently it works in binary fashion: zero means everything
is fine, non-zero means something failed. log_test() then uses the value to
given a human-readable message.

In order to allow log_test() to report skips and xfails, the semantics of
RET need to be more fine-grained. Therefore have RET value be one of
kselftest framework constants: $ksft_fail, $ksft_xfail, etc.

The current logic in check_err() is such that first non-zero value of RET
trumps all those that follow. But that is not right when RET has more
fine-grained value semantics. Different outcomes have different weights.

The results of PASS and XFAIL are mostly the same: they both communicate a
test that did not go wrong. SKIP communicates lack of tooling, which the
user should go and try to fix, and as such should not be overridden by the
passes. So far, the higher-numbered statuses can be considered weightier.
But FAIL should be the weightiest.

Add a helper, ksft_status_merge(), which merges two statuses in a way that
respects the above conditions. Express it in a generic manner, because exit
status merge is subtly different, and we want to reuse the same logic.

Use the new helper when setting RET in check_err().

Re-express check_fail() in terms of check_err() to avoid duplication.
Signed-off-by: default avatarPetr Machata <petrm@nvidia.com>
Link: https://lore.kernel.org/r/7dfff51cc925c7a3ac879b9050a0d6a327c8d21f.1711464583.git.petrm@nvidia.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 51ccf267
......@@ -396,14 +396,24 @@ EXIT_STATUS=0
# Per-test return value. Clear at the beginning of each test.
RET=0
ret_set_ksft_status()
{
local ksft_status=$1; shift
local msg=$1; shift
RET=$(ksft_status_merge $RET $ksft_status)
if (( $? )); then
retmsg=$msg
fi
}
check_err()
{
local err=$1
local msg=$2
if [[ $RET -eq 0 && $err -ne 0 ]]; then
RET=$err
retmsg=$msg
if ((err)); then
ret_set_ksft_status $ksft_fail "$msg"
fi
}
......@@ -412,10 +422,7 @@ check_fail()
local err=$1
local msg=$2
if [[ $RET -eq 0 && $err -eq 0 ]]; then
RET=1
retmsg=$msg
fi
check_err $((!err)) "$msg"
}
check_err_fail()
......
......@@ -19,6 +19,36 @@ NS_LIST=""
##############################################################################
# Helpers
__ksft_status_merge()
{
local a=$1; shift
local b=$1; shift
local -A weights
local weight=0
for i in "$@"; do
weights[$i]=$((weight++))
done
if [[ ${weights[$a]} > ${weights[$b]} ]]; then
echo "$a"
return 0
else
echo "$b"
return 1
fi
}
ksft_status_merge()
{
local a=$1; shift
local b=$1; shift
__ksft_status_merge "$a" "$b" \
$ksft_pass $ksft_xfail $ksft_skip $ksft_fail
}
busywait()
{
local timeout=$1; shift
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment