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
24  -t | --test COLLECTION:TEST	Run TEST from COLLECTION
25  -c | --collection COLLECTION	Run all tests from COLLECTION
26  -l | --list			List the available collection:test entries
27  -d | --dry-run		Don't actually run any tests
28  -h | --help			Show this usage info
29EOF
30	exit $1
31}
32
33COLLECTIONS=""
34TESTS=""
35dryrun=""
36while true; do
37	case "$1" in
38		-s | --summary)
39			logfile="$BASE_DIR"/output.log
40			cat /dev/null > $logfile
41			shift ;;
42		-t | --test)
43			TESTS="$TESTS $2"
44			shift 2 ;;
45		-c | --collection)
46			COLLECTIONS="$COLLECTIONS $2"
47			shift 2 ;;
48		-l | --list)
49			echo "$available"
50			exit 0 ;;
51		-d | --dry-run)
52			dryrun="echo"
53			shift ;;
54		-h | --help)
55			usage 0 ;;
56		"")
57			break ;;
58		*)
59			usage 1 ;;
60	esac
61done
62
63# Add all selected collections to the explicit test list.
64if [ -n "$COLLECTIONS" ]; then
65	for collection in $COLLECTIONS ; do
66		found="$(echo "$available" | grep "^$collection:")"
67		if [ -z "$found" ] ; then
68			echo "No such collection '$collection'" >&2
69			exit 1
70		fi
71		TESTS="$TESTS $found"
72	done
73fi
74# Replace available test list with explicitly selected tests.
75if [ -n "$TESTS" ]; then
76	valid=""
77	for test in $TESTS ; do
78		found="$(echo "$available" | grep "^${test}$")"
79		if [ -z "$found" ] ; then
80			echo "No such test '$test'" >&2
81			exit 1
82		fi
83		valid="$valid $found"
84	done
85	available="$(echo "$valid" | sed -e 's/ /\n/g')"
86fi
87
88collections=$(echo "$available" | cut -d: -f1 | uniq)
89for collection in $collections ; do
90	[ -w /dev/kmsg ] && echo "kselftest: Running tests in $collection" >> /dev/kmsg
91	tests=$(echo "$available" | grep "^$collection:" | cut -d: -f2)
92	($dryrun cd "$collection" && $dryrun run_many $tests)
93done
94