On Tue, Oct 07, 2025 at 11:06:46AM +0000, Brendan Jackman wrote:
> Parsing KTAP is quite an inconvenience, but most of the time the thing
> you really want to know is "did anything fail"?
>
> Let's give the user the ability to get this information without needing
> to parse anything.
>
> Because of the use of subshells and namespaces, this needs to be
> communicated via a file. Just write arbitrary data into the file and
> treat non-emppty content as a signal that something failed.
>
> Signed-off-by: Brendan Jackman <[email protected]>
> ---
> tools/testing/selftests/kselftest/runner.sh | 14 ++++++++++----
> tools/testing/selftests/run_kselftest.sh | 14 ++++++++++++++
> 2 files changed, 24 insertions(+), 4 deletions(-)
>
> diff --git a/tools/testing/selftests/kselftest/runner.sh
> b/tools/testing/selftests/kselftest/runner.sh
> index
> 2c3c58e65a419f5ee8d7dc51a37671237a07fa0b..fd1e0f9b1cef48c5df1afaaedc0c97bee1c12dc5
> 100644
> --- a/tools/testing/selftests/kselftest/runner.sh
> +++ b/tools/testing/selftests/kselftest/runner.sh
> @@ -44,6 +44,12 @@ tap_timeout()
> fi
> }
>
> +report_failure()
> +{
> + echo "not ok $*" >> "$kselftest_failures_file"
> + echo "$*" >> "$kselftest_failures_file"
Both of these go into the failures file. The first should go to stdout, no?
> +}
> +
> run_one()
> {
> DIR="$1"
> @@ -105,7 +111,7 @@ run_one()
> echo "# $TEST_HDR_MSG"
> if [ ! -e "$TEST" ]; then
> echo "# Warning: file $TEST is missing!"
> - echo "not ok $test_num $TEST_HDR_MSG"
> + report_failure "$test_num $TEST_HDR_MSG"
> else
> if [ -x /usr/bin/stdbuf ]; then
> stdbuf="/usr/bin/stdbuf --output=L "
> @@ -123,7 +129,7 @@ run_one()
> interpreter=$(head -n 1 "$TEST" | cut -c 3-)
> cmd="$stdbuf $interpreter ./$BASENAME_TEST"
> else
> - echo "not ok $test_num $TEST_HDR_MSG"
> + report_failure "$test_num $TEST_HDR_MSG"
> return
> fi
> fi
> @@ -137,9 +143,9 @@ run_one()
> echo "ok $test_num $TEST_HDR_MSG # SKIP"
> elif [ $rc -eq $timeout_rc ]; then \
> echo "#"
> - echo "not ok $test_num $TEST_HDR_MSG # TIMEOUT
> $kselftest_timeout seconds"
> + report_failure "$test_num $TEST_HDR_MSG # TIMEOUT
> $kselftest_timeout seconds"
> else
> - echo "not ok $test_num $TEST_HDR_MSG # exit=$rc"
> + report_failure "$test_num $TEST_HDR_MSG # exit=$rc"
> fi)
> cd - >/dev/null
> fi
> diff --git a/tools/testing/selftests/run_kselftest.sh
> b/tools/testing/selftests/run_kselftest.sh
> index
> 0443beacf3621ae36cb12ffd57f696ddef3526b5..c345f38ad424029bfe50d19b26bdd1d4bda29316
> 100755
> --- a/tools/testing/selftests/run_kselftest.sh
> +++ b/tools/testing/selftests/run_kselftest.sh
> @@ -36,6 +36,7 @@ Usage: $0 [OPTIONS]
> -n | --netns Run each test in namespace
> -h | --help Show this usage info
> -o | --override-timeout Number of seconds after which we timeout
> + -e | --error-on-fail After finishing all tests, exit with code 1 if
> any failed.
To me it looks like the new behavior could be the default,
removing the need for an additional option.
> EOF
> exit $1
> }
> @@ -44,6 +45,7 @@ COLLECTIONS=""
> TESTS=""
> dryrun=""
> kselftest_override_timeout=""
> +ERROR_ON_FAIL=false
> while true; do
> case "$1" in
> -s | --summary)
> @@ -71,6 +73,9 @@ while true; do
> -o | --override-timeout)
> kselftest_override_timeout="$2"
> shift 2 ;;
> + -e | --error-on-fail)
> + ERROR_ON_FAIL="true"
> + shift ;;
> -h | --help)
> usage 0 ;;
> "")
> @@ -105,9 +110,18 @@ if [ -n "$TESTS" ]; then
> available="$(echo "$valid" | sed -e 's/ /\n/g')"
> fi
>
> +kselftest_failures_file=$(mktemp --tmpdir kselftest-failures-XXXXXX)
Quoting?
I'm not a fan of the implementation details, but also can't come up with
something better.
> +export kselftest_failures_file
> +
> collections=$(echo "$available" | cut -d: -f1 | sort | uniq)
> for collection in $collections ; do
> [ -w /dev/kmsg ] && echo "kselftest: Running tests in $collection" >>
> /dev/kmsg
> tests=$(echo "$available" | grep "^$collection:" | cut -d: -f2)
> ($dryrun cd "$collection" && $dryrun run_many $tests)
> done
> +
> +failures="$(cat "$kselftest_failures_file")"
> +rm "$kselftest_failures_file"
> +if "$ERROR_ON_FAIL" && [ "$failures" ]; then
> + exit 1
> +fi
>
> ---
> base-commit: 8f5ae30d69d7543eee0d70083daf4de8fe15d585
> change-id: 20251007-b4-ksft-error-on-fail-0c2cb3246041
>
> Best regards,
> --
> Brendan Jackman <[email protected]>
>