aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/testing/selftests/Makefile1
-rw-r--r--tools/testing/selftests/kselftest.h2
-rwxr-xr-xtools/testing/selftests/kselftest/prefix.pl23
-rw-r--r--tools/testing/selftests/kselftest/runner.sh37
-rw-r--r--tools/testing/selftests/lib.mk3
5 files changed, 60 insertions, 6 deletions
diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
index 4ac1d1c7ce5b..64699f59b95f 100644
--- a/tools/testing/selftests/Makefile
+++ b/tools/testing/selftests/Makefile
@@ -178,6 +178,7 @@ ifdef INSTALL_PATH
178 @# Ask all targets to install their files 178 @# Ask all targets to install their files
179 mkdir -p $(INSTALL_PATH)/kselftest 179 mkdir -p $(INSTALL_PATH)/kselftest
180 install -m 744 kselftest/runner.sh $(INSTALL_PATH)/kselftest/ 180 install -m 744 kselftest/runner.sh $(INSTALL_PATH)/kselftest/
181 install -m 744 kselftest/prefix.pl $(INSTALL_PATH)/kselftest/
181 @for TARGET in $(TARGETS); do \ 182 @for TARGET in $(TARGETS); do \
182 BUILD_TARGET=$$BUILD/$$TARGET; \ 183 BUILD_TARGET=$$BUILD/$$TARGET; \
183 make OUTPUT=$$BUILD_TARGET -C $$TARGET INSTALL_PATH=$(INSTALL_PATH)/$$TARGET install; \ 184 make OUTPUT=$$BUILD_TARGET -C $$TARGET INSTALL_PATH=$(INSTALL_PATH)/$$TARGET install; \
diff --git a/tools/testing/selftests/kselftest.h b/tools/testing/selftests/kselftest.h
index 9f4147a6fdbc..7f078e79a9fa 100644
--- a/tools/testing/selftests/kselftest.h
+++ b/tools/testing/selftests/kselftest.h
@@ -63,7 +63,7 @@ static inline void ksft_print_header(void)
63 63
64static inline void ksft_print_cnts(void) 64static inline void ksft_print_cnts(void)
65{ 65{
66 printf("Pass %d Fail %d Xfail %d Xpass %d Skip %d Error %d\n", 66 printf("# Pass %d Fail %d Xfail %d Xpass %d Skip %d Error %d\n",
67 ksft_cnt.ksft_pass, ksft_cnt.ksft_fail, 67 ksft_cnt.ksft_pass, ksft_cnt.ksft_fail,
68 ksft_cnt.ksft_xfail, ksft_cnt.ksft_xpass, 68 ksft_cnt.ksft_xfail, ksft_cnt.ksft_xpass,
69 ksft_cnt.ksft_xskip, ksft_cnt.ksft_error); 69 ksft_cnt.ksft_xskip, ksft_cnt.ksft_error);
diff --git a/tools/testing/selftests/kselftest/prefix.pl b/tools/testing/selftests/kselftest/prefix.pl
new file mode 100755
index 000000000000..ec7e48118183
--- /dev/null
+++ b/tools/testing/selftests/kselftest/prefix.pl
@@ -0,0 +1,23 @@
1#!/usr/bin/perl
2# SPDX-License-Identifier: GPL-2.0
3# Prefix all lines with "# ", unbuffered. Command being piped in may need
4# to have unbuffering forced with "stdbuf -i0 -o0 -e0 $cmd".
5use strict;
6
7binmode STDIN;
8binmode STDOUT;
9
10STDOUT->autoflush(1);
11
12my $needed = 1;
13while (1) {
14 my $char;
15 my $bytes = sysread(STDIN, $char, 1);
16 exit 0 if ($bytes == 0);
17 if ($needed) {
18 print "# ";
19 $needed = 0;
20 }
21 print $char;
22 $needed = 1 if ($char eq "\n");
23}
diff --git a/tools/testing/selftests/kselftest/runner.sh b/tools/testing/selftests/kselftest/runner.sh
index a66fb64e61e9..b9f74e5a2ee5 100644
--- a/tools/testing/selftests/kselftest/runner.sh
+++ b/tools/testing/selftests/kselftest/runner.sh
@@ -7,6 +7,34 @@ export skip_rc=4
7export logfile=/dev/stdout 7export logfile=/dev/stdout
8export per_test_logging= 8export per_test_logging=
9 9
10# There isn't a shell-agnostic way to find the path of a sourced file,
11# so we must rely on BASE_DIR being set to find other tools.
12if [ -z "$BASE_DIR" ]; then
13 echo "Error: BASE_DIR must be set before sourcing." >&2
14 exit 1
15fi
16
17# If Perl is unavailable, we must fall back to line-at-a-time prefixing
18# with sed instead of unbuffered output.
19tap_prefix()
20{
21 if [ ! -x /usr/bin/perl ]; then
22 sed -e 's/^/# /'
23 else
24 "$BASE_DIR"/kselftest/prefix.pl
25 fi
26}
27
28# If stdbuf is unavailable, we must fall back to line-at-a-time piping.
29tap_unbuffer()
30{
31 if ! which stdbuf >/dev/null ; then
32 "$@"
33 else
34 stdbuf -i0 -o0 -e0 "$@"
35 fi
36}
37
10run_one() 38run_one()
11{ 39{
12 DIR="$1" 40 DIR="$1"
@@ -16,10 +44,9 @@ run_one()
16 BASENAME_TEST=$(basename $TEST) 44 BASENAME_TEST=$(basename $TEST)
17 45
18 TEST_HDR_MSG="selftests: $DIR: $BASENAME_TEST" 46 TEST_HDR_MSG="selftests: $DIR: $BASENAME_TEST"
19 echo "$TEST_HDR_MSG" 47 echo "# $TEST_HDR_MSG"
20 echo "========================================"
21 if [ ! -x "$TEST" ]; then 48 if [ ! -x "$TEST" ]; then
22 echo -n "$TEST_HDR_MSG: Warning: file $TEST is " 49 echo -n "# Warning: file $TEST is "
23 if [ ! -e "$TEST" ]; then 50 if [ ! -e "$TEST" ]; then
24 echo "missing!" 51 echo "missing!"
25 else 52 else
@@ -28,7 +55,9 @@ run_one()
28 echo "not ok $test_num $TEST_HDR_MSG" 55 echo "not ok $test_num $TEST_HDR_MSG"
29 else 56 else
30 cd `dirname $TEST` > /dev/null 57 cd `dirname $TEST` > /dev/null
31 (./$BASENAME_TEST >> "$logfile" 2>&1 && 58 (((((tap_unbuffer ./$BASENAME_TEST 2>&1; echo $? >&3) |
59 tap_prefix >&4) 3>&1) |
60 (read xs; exit $xs)) 4>>"$logfile" &&
32 echo "ok $test_num $TEST_HDR_MSG") || 61 echo "ok $test_num $TEST_HDR_MSG") ||
33 (if [ $? -eq $skip_rc ]; then \ 62 (if [ $? -eq $skip_rc ]; then \
34 echo "not ok $test_num $TEST_HDR_MSG # SKIP" 63 echo "not ok $test_num $TEST_HDR_MSG # SKIP"
diff --git a/tools/testing/selftests/lib.mk b/tools/testing/selftests/lib.mk
index 28b8ffedfdf1..098dd0065fb1 100644
--- a/tools/testing/selftests/lib.mk
+++ b/tools/testing/selftests/lib.mk
@@ -67,7 +67,8 @@ endif
67 67
68.ONESHELL: 68.ONESHELL:
69define RUN_TESTS 69define RUN_TESTS
70 @. $(selfdir)/kselftest/runner.sh; \ 70 @BASE_DIR="$(selfdir)"; \
71 . $(selfdir)/kselftest/runner.sh; \
71 if [ "X$(summary)" != "X" ]; then \ 72 if [ "X$(summary)" != "X" ]; then \
72 per_test_logging=1; \ 73 per_test_logging=1; \
73 fi; \ 74 fi; \