summaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2019-10-08 13:49:05 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-10-08 13:49:05 -0400
commitf54e66ae770fe559fb21383f95d739ac74c03ea8 (patch)
tree93c89651f27b07efebcead22e37df0a53cecbe55 /tools/testing/selftests
parenteda57a0e42998d1d403187844faa86c9a3ab2fd0 (diff)
parentce3a677802121e038d2f062e90f96f84e7351da0 (diff)
Merge tag 'linux-kselftest-5.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest
Pull Kselftest fixes from Shuah Khan: "Fixes for existing tests and the framework. Cristian Marussi's patches add the ability to skip targets (tests) and exclude tests that didn't build from run-list. These patches improve the Kselftest results. Ability to skip targets helps avoid running tests that aren't supported in certain environments. As an example, bpf tests from mainline aren't supported on stable kernels and have dependency on bleeding edge llvm. Being able to skip bpf on systems that can't meet this llvm dependency will be helpful. Kselftest can be built and installed from the main Makefile. This change help simplify Kselftest use-cases which addresses request from users. Kees Cook added per test timeout support to limit individual test run-time" * tag 'linux-kselftest-5.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest: selftests: watchdog: Add command line option to show watchdog_info selftests: watchdog: Validate optional file argument selftests/kselftest/runner.sh: Add 45 second timeout per test kselftest: exclude failed TARGETS from runlist kselftest: add capability to skip chosen TARGETS selftests: Add kselftest-all and kselftest-install targets
Diffstat (limited to 'tools/testing/selftests')
-rw-r--r--tools/testing/selftests/Makefile19
-rw-r--r--tools/testing/selftests/kselftest/runner.sh36
-rwxr-xr-xtools/testing/selftests/kselftest_install.sh4
-rw-r--r--tools/testing/selftests/rtc/settings1
-rw-r--r--tools/testing/selftests/watchdog/watchdog-test.c27
5 files changed, 79 insertions, 8 deletions
diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
index c3feccb99ff5..4cdbae6f4e61 100644
--- a/tools/testing/selftests/Makefile
+++ b/tools/testing/selftests/Makefile
@@ -63,6 +63,13 @@ TARGETS += zram
63TARGETS_HOTPLUG = cpu-hotplug 63TARGETS_HOTPLUG = cpu-hotplug
64TARGETS_HOTPLUG += memory-hotplug 64TARGETS_HOTPLUG += memory-hotplug
65 65
66# User can optionally provide a TARGETS skiplist.
67SKIP_TARGETS ?=
68ifneq ($(SKIP_TARGETS),)
69 TMP := $(filter-out $(SKIP_TARGETS), $(TARGETS))
70 override TARGETS := $(TMP)
71endif
72
66# Clear LDFLAGS and MAKEFLAGS if called from main 73# Clear LDFLAGS and MAKEFLAGS if called from main
67# Makefile to avoid test build failures when test 74# Makefile to avoid test build failures when test
68# Makefile doesn't have explicit build rules. 75# Makefile doesn't have explicit build rules.
@@ -171,9 +178,12 @@ run_pstore_crash:
171# 1. output_dir=kernel_src 178# 1. output_dir=kernel_src
172# 2. a separate output directory is specified using O= KBUILD_OUTPUT 179# 2. a separate output directory is specified using O= KBUILD_OUTPUT
173# 3. a separate output directory is specified using KBUILD_OUTPUT 180# 3. a separate output directory is specified using KBUILD_OUTPUT
181# Avoid conflict with INSTALL_PATH set by the main Makefile
174# 182#
175INSTALL_PATH ?= $(BUILD)/install 183KSFT_INSTALL_PATH ?= $(BUILD)/kselftest_install
176INSTALL_PATH := $(abspath $(INSTALL_PATH)) 184KSFT_INSTALL_PATH := $(abspath $(KSFT_INSTALL_PATH))
185# Avoid changing the rest of the logic here and lib.mk.
186INSTALL_PATH := $(KSFT_INSTALL_PATH)
177ALL_SCRIPT := $(INSTALL_PATH)/run_kselftest.sh 187ALL_SCRIPT := $(INSTALL_PATH)/run_kselftest.sh
178 188
179install: all 189install: all
@@ -198,11 +208,16 @@ ifdef INSTALL_PATH
198 echo " cat /dev/null > \$$logfile" >> $(ALL_SCRIPT) 208 echo " cat /dev/null > \$$logfile" >> $(ALL_SCRIPT)
199 echo "fi" >> $(ALL_SCRIPT) 209 echo "fi" >> $(ALL_SCRIPT)
200 210
211 @# While building run_kselftest.sh skip also non-existent TARGET dirs:
212 @# they could be the result of a build failure and should NOT be
213 @# included in the generated runlist.
201 for TARGET in $(TARGETS); do \ 214 for TARGET in $(TARGETS); do \
202 BUILD_TARGET=$$BUILD/$$TARGET; \ 215 BUILD_TARGET=$$BUILD/$$TARGET; \
216 [ ! -d $$INSTALL_PATH/$$TARGET ] && echo "Skipping non-existent dir: $$TARGET" && continue; \
203 echo "[ -w /dev/kmsg ] && echo \"kselftest: Running tests in $$TARGET\" >> /dev/kmsg" >> $(ALL_SCRIPT); \ 217 echo "[ -w /dev/kmsg ] && echo \"kselftest: Running tests in $$TARGET\" >> /dev/kmsg" >> $(ALL_SCRIPT); \
204 echo "cd $$TARGET" >> $(ALL_SCRIPT); \ 218 echo "cd $$TARGET" >> $(ALL_SCRIPT); \
205 echo -n "run_many" >> $(ALL_SCRIPT); \ 219 echo -n "run_many" >> $(ALL_SCRIPT); \
220 echo -n "Emit Tests for $$TARGET\n"; \
206 $(MAKE) -s --no-print-directory OUTPUT=$$BUILD_TARGET -C $$TARGET emit_tests >> $(ALL_SCRIPT); \ 221 $(MAKE) -s --no-print-directory OUTPUT=$$BUILD_TARGET -C $$TARGET emit_tests >> $(ALL_SCRIPT); \
207 echo "" >> $(ALL_SCRIPT); \ 222 echo "" >> $(ALL_SCRIPT); \
208 echo "cd \$$ROOT" >> $(ALL_SCRIPT); \ 223 echo "cd \$$ROOT" >> $(ALL_SCRIPT); \
diff --git a/tools/testing/selftests/kselftest/runner.sh b/tools/testing/selftests/kselftest/runner.sh
index 00c9020bdda8..84de7bc74f2c 100644
--- a/tools/testing/selftests/kselftest/runner.sh
+++ b/tools/testing/selftests/kselftest/runner.sh
@@ -3,9 +3,14 @@
3# 3#
4# Runs a set of tests in a given subdirectory. 4# Runs a set of tests in a given subdirectory.
5export skip_rc=4 5export skip_rc=4
6export timeout_rc=124
6export logfile=/dev/stdout 7export logfile=/dev/stdout
7export per_test_logging= 8export per_test_logging=
8 9
10# Defaults for "settings" file fields:
11# "timeout" how many seconds to let each test run before failing.
12export kselftest_default_timeout=45
13
9# There isn't a shell-agnostic way to find the path of a sourced file, 14# There isn't a shell-agnostic way to find the path of a sourced file,
10# so we must rely on BASE_DIR being set to find other tools. 15# so we must rely on BASE_DIR being set to find other tools.
11if [ -z "$BASE_DIR" ]; then 16if [ -z "$BASE_DIR" ]; then
@@ -24,6 +29,16 @@ tap_prefix()
24 fi 29 fi
25} 30}
26 31
32tap_timeout()
33{
34 # Make sure tests will time out if utility is available.
35 if [ -x /usr/bin/timeout ] ; then
36 /usr/bin/timeout "$kselftest_timeout" "$1"
37 else
38 "$1"
39 fi
40}
41
27run_one() 42run_one()
28{ 43{
29 DIR="$1" 44 DIR="$1"
@@ -32,6 +47,18 @@ run_one()
32 47
33 BASENAME_TEST=$(basename $TEST) 48 BASENAME_TEST=$(basename $TEST)
34 49
50 # Reset any "settings"-file variables.
51 export kselftest_timeout="$kselftest_default_timeout"
52 # Load per-test-directory kselftest "settings" file.
53 settings="$BASE_DIR/$DIR/settings"
54 if [ -r "$settings" ] ; then
55 while read line ; do
56 field=$(echo "$line" | cut -d= -f1)
57 value=$(echo "$line" | cut -d= -f2-)
58 eval "kselftest_$field"="$value"
59 done < "$settings"
60 fi
61
35 TEST_HDR_MSG="selftests: $DIR: $BASENAME_TEST" 62 TEST_HDR_MSG="selftests: $DIR: $BASENAME_TEST"
36 echo "# $TEST_HDR_MSG" 63 echo "# $TEST_HDR_MSG"
37 if [ ! -x "$TEST" ]; then 64 if [ ! -x "$TEST" ]; then
@@ -44,14 +71,17 @@ run_one()
44 echo "not ok $test_num $TEST_HDR_MSG" 71 echo "not ok $test_num $TEST_HDR_MSG"
45 else 72 else
46 cd `dirname $TEST` > /dev/null 73 cd `dirname $TEST` > /dev/null
47 (((((./$BASENAME_TEST 2>&1; echo $? >&3) | 74 ((((( tap_timeout ./$BASENAME_TEST 2>&1; echo $? >&3) |
48 tap_prefix >&4) 3>&1) | 75 tap_prefix >&4) 3>&1) |
49 (read xs; exit $xs)) 4>>"$logfile" && 76 (read xs; exit $xs)) 4>>"$logfile" &&
50 echo "ok $test_num $TEST_HDR_MSG") || 77 echo "ok $test_num $TEST_HDR_MSG") ||
51 (if [ $? -eq $skip_rc ]; then \ 78 (rc=$?; \
79 if [ $rc -eq $skip_rc ]; then \
52 echo "not ok $test_num $TEST_HDR_MSG # SKIP" 80 echo "not ok $test_num $TEST_HDR_MSG # SKIP"
81 elif [ $rc -eq $timeout_rc ]; then \
82 echo "not ok $test_num $TEST_HDR_MSG # TIMEOUT"
53 else 83 else
54 echo "not ok $test_num $TEST_HDR_MSG" 84 echo "not ok $test_num $TEST_HDR_MSG # exit=$rc"
55 fi) 85 fi)
56 cd - >/dev/null 86 cd - >/dev/null
57 fi 87 fi
diff --git a/tools/testing/selftests/kselftest_install.sh b/tools/testing/selftests/kselftest_install.sh
index ec304463883c..e2e1911d62d5 100755
--- a/tools/testing/selftests/kselftest_install.sh
+++ b/tools/testing/selftests/kselftest_install.sh
@@ -24,12 +24,12 @@ main()
24 echo "$0: Installing in specified location - $install_loc ..." 24 echo "$0: Installing in specified location - $install_loc ..."
25 fi 25 fi
26 26
27 install_dir=$install_loc/kselftest 27 install_dir=$install_loc/kselftest_install
28 28
29# Create install directory 29# Create install directory
30 mkdir -p $install_dir 30 mkdir -p $install_dir
31# Build tests 31# Build tests
32 INSTALL_PATH=$install_dir make install 32 KSFT_INSTALL_PATH=$install_dir make install
33} 33}
34 34
35main "$@" 35main "$@"
diff --git a/tools/testing/selftests/rtc/settings b/tools/testing/selftests/rtc/settings
new file mode 100644
index 000000000000..ba4d85f74cd6
--- /dev/null
+++ b/tools/testing/selftests/rtc/settings
@@ -0,0 +1 @@
timeout=90
diff --git a/tools/testing/selftests/watchdog/watchdog-test.c b/tools/testing/selftests/watchdog/watchdog-test.c
index afff120c7be6..f45e510500c0 100644
--- a/tools/testing/selftests/watchdog/watchdog-test.c
+++ b/tools/testing/selftests/watchdog/watchdog-test.c
@@ -19,7 +19,7 @@
19 19
20int fd; 20int fd;
21const char v = 'V'; 21const char v = 'V';
22static const char sopts[] = "bdehp:t:Tn:NLf:"; 22static const char sopts[] = "bdehp:t:Tn:NLf:i";
23static const struct option lopts[] = { 23static const struct option lopts[] = {
24 {"bootstatus", no_argument, NULL, 'b'}, 24 {"bootstatus", no_argument, NULL, 'b'},
25 {"disable", no_argument, NULL, 'd'}, 25 {"disable", no_argument, NULL, 'd'},
@@ -32,6 +32,7 @@ static const struct option lopts[] = {
32 {"getpretimeout", no_argument, NULL, 'N'}, 32 {"getpretimeout", no_argument, NULL, 'N'},
33 {"gettimeleft", no_argument, NULL, 'L'}, 33 {"gettimeleft", no_argument, NULL, 'L'},
34 {"file", required_argument, NULL, 'f'}, 34 {"file", required_argument, NULL, 'f'},
35 {"info", no_argument, NULL, 'i'},
35 {NULL, no_argument, NULL, 0x0} 36 {NULL, no_argument, NULL, 0x0}
36}; 37};
37 38
@@ -72,6 +73,7 @@ static void usage(char *progname)
72 printf("Usage: %s [options]\n", progname); 73 printf("Usage: %s [options]\n", progname);
73 printf(" -f, --file\t\tOpen watchdog device file\n"); 74 printf(" -f, --file\t\tOpen watchdog device file\n");
74 printf("\t\t\tDefault is /dev/watchdog\n"); 75 printf("\t\t\tDefault is /dev/watchdog\n");
76 printf(" -i, --info\t\tShow watchdog_info\n");
75 printf(" -b, --bootstatus\tGet last boot status (Watchdog/POR)\n"); 77 printf(" -b, --bootstatus\tGet last boot status (Watchdog/POR)\n");
76 printf(" -d, --disable\t\tTurn off the watchdog timer\n"); 78 printf(" -d, --disable\t\tTurn off the watchdog timer\n");
77 printf(" -e, --enable\t\tTurn on the watchdog timer\n"); 79 printf(" -e, --enable\t\tTurn on the watchdog timer\n");
@@ -97,6 +99,7 @@ int main(int argc, char *argv[])
97 int c; 99 int c;
98 int oneshot = 0; 100 int oneshot = 0;
99 char *file = "/dev/watchdog"; 101 char *file = "/dev/watchdog";
102 struct watchdog_info info;
100 103
101 setbuf(stdout, NULL); 104 setbuf(stdout, NULL);
102 105
@@ -118,6 +121,16 @@ int main(int argc, char *argv[])
118 exit(-1); 121 exit(-1);
119 } 122 }
120 123
124 /*
125 * Validate that `file` is a watchdog device
126 */
127 ret = ioctl(fd, WDIOC_GETSUPPORT, &info);
128 if (ret) {
129 printf("WDIOC_GETSUPPORT error '%s'\n", strerror(errno));
130 close(fd);
131 exit(ret);
132 }
133
121 optind = 0; 134 optind = 0;
122 135
123 while ((c = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) { 136 while ((c = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) {
@@ -205,6 +218,18 @@ int main(int argc, char *argv[])
205 case 'f': 218 case 'f':
206 /* Handled above */ 219 /* Handled above */
207 break; 220 break;
221 case 'i':
222 /*
223 * watchdog_info was obtained as part of file open
224 * validation. So we just show it here.
225 */
226 oneshot = 1;
227 printf("watchdog_info:\n");
228 printf(" identity:\t\t%s\n", info.identity);
229 printf(" firmware_version:\t%u\n",
230 info.firmware_version);
231 printf(" options:\t\t%08x\n", info.options);
232 break;
208 233
209 default: 234 default:
210 usage(argv[0]); 235 usage(argv[0]);