xref: /linux/tools/testing/selftests/run_kselftest.sh (revision 2b0cfa6e49566c8fa6759734cf821aa6e8271a9e)
1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0
3#
4# Run installed kselftest tests.
5#
6BASE_DIR=$(realpath $(dirname $0))
7cd $BASE_DIR
8TESTS="$BASE_DIR"/kselftest-list.txt
9if [ ! -r "$TESTS" ] ; then
10	echo "$0: Could not find list of tests to run ($TESTS)" >&2
11	available=""
12else
13	available="$(cat "$TESTS")"
14fi
15
16. ./kselftest/runner.sh
17ROOT=$PWD
18
19usage()
20{
21	cat <<EOF
22Usage: $0 [OPTIONS]
23  -s | --summary		Print summary with detailed log in output.log (conflict with -p)
24  -p | --per_test_log		Print test log in /tmp with each test name (conflict with -s)
25  -t | --test COLLECTION:TEST	Run TEST from COLLECTION
26  -c | --collection COLLECTION	Run all tests from COLLECTION
27  -l | --list			List the available collection:test entries
28  -d | --dry-run		Don't actually run any tests
29  -n | --netns			Run each test in namespace
30  -h | --help			Show this usage info
31  -o | --override-timeout	Number of seconds after which we timeout
32EOF
33	exit $1
34}
35
36COLLECTIONS=""
37TESTS=""
38dryrun=""
39kselftest_override_timeout=""
40while true; do
41	case "$1" in
42		-s | --summary)
43			logfile="$BASE_DIR"/output.log
44			cat /dev/null > $logfile
45			shift ;;
46		-p | --per-test-log)
47			per_test_logging=1
48			shift ;;
49		-t | --test)
50			TESTS="$TESTS $2"
51			shift 2 ;;
52		-c | --collection)
53			COLLECTIONS="$COLLECTIONS $2"
54			shift 2 ;;
55		-l | --list)
56			echo "$available"
57			exit 0 ;;
58		-d | --dry-run)
59			dryrun="echo"
60			shift ;;
61		-n | --netns)
62			RUN_IN_NETNS=1
63			shift ;;
64		-o | --override-timeout)
65			kselftest_override_timeout="$2"
66			shift 2 ;;
67		-h | --help)
68			usage 0 ;;
69		"")
70			break ;;
71		*)
72			usage 1 ;;
73	esac
74done
75
76# Add all selected collections to the explicit test list.
77if [ -n "$COLLECTIONS" ]; then
78	for collection in $COLLECTIONS ; do
79		found="$(echo "$available" | grep "^$collection:")"
80		if [ -z "$found" ] ; then
81			echo "No such collection '$collection'" >&2
82			exit 1
83		fi
84		TESTS="$TESTS $found"
85	done
86fi
87# Replace available test list with explicitly selected tests.
88if [ -n "$TESTS" ]; then
89	valid=""
90	for test in $TESTS ; do
91		found="$(echo "$available" | grep "^${test}$")"
92		if [ -z "$found" ] ; then
93			echo "No such test '$test'" >&2
94			exit 1
95		fi
96		valid="$valid $found"
97	done
98	available="$(echo "$valid" | sed -e 's/ /\n/g')"
99fi
100
101collections=$(echo "$available" | cut -d: -f1 | sort | uniq)
102for collection in $collections ; do
103	[ -w /dev/kmsg ] && echo "kselftest: Running tests in $collection" >> /dev/kmsg
104	tests=$(echo "$available" | grep "^$collection:" | cut -d: -f2)
105	($dryrun cd "$collection" && $dryrun run_many $tests)
106done
107