Commit d6ea9f40 authored by Ricardo B. Marlière's avatar Ricardo B. Marlière Committed by Shuah Khan
Browse files

selftests/run_kselftest.sh: Allow choosing per-test log directory



The --per-test-log option currently hard-codes /tmp. However, the system
under test will most likely have tmpfs mounted there. Since it's not clear
which filenames the log files will have, the user should be able to specify
a persistent directory to store the logs. Keeping those logs are important
because the run_kselftest.sh runner will only yield KTAP output, trimming
information that is otherwise available through running individual tests
directly.

Allow --per-test-log to take an optional directory argument. Keep the
existing behaviour when the option is passed without an argument, but if
a directory is provided, create it if needed, reject non-directory paths
and non-writable directories, canonicalize it, and have runner.sh write
per-test logs there instead of /tmp.

This also makes relative paths safe by resolving them before the runner
changes into a collection directory.

Signed-off-by: default avatarRicardo B. Marlière <rbm@suse.com>
Link: https://lore.kernel.org/r/20260320-selftests-fixes-v1-4-79144f76be01@suse.com


Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent a82e076f
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
export timeout_rc=124
export logfile=/dev/stdout
export per_test_logging=
export per_test_log_dir=/tmp
export RUN_IN_NETNS=

# Defaults for "settings" file fields:
@@ -196,7 +197,7 @@ run_many()
		BASENAME_TEST=$(basename $TEST)
		test_num=$(( test_num + 1 ))
		if [ -n "$per_test_logging" ]; then
			logfile="/tmp/$BASENAME_TEST"
			logfile="$per_test_log_dir/$BASENAME_TEST"
			cat /dev/null > "$logfile"
		fi
		if [ -n "$RUN_IN_NETNS" ]; then
+28 −2
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ usage()
	cat <<EOF
Usage: $0 [OPTIONS]
  -s | --summary		Print summary with detailed log in output.log (conflict with -p)
  -p | --per-test-log		Print test log in /tmp with each test name (conflict with -s)
  -p | --per-test-log [DIR]	Print test log in /tmp or DIR with each test name (conflict with -s)
  -t | --test COLLECTION:TEST	Run TEST from COLLECTION
  -S | --skip COLLECTION:TEST	Skip TEST from COLLECTION
  -c | --collection COLLECTION	Run all tests from COLLECTION
@@ -50,7 +50,33 @@ while true; do
			shift ;;
		-p | --per-test-log)
			per_test_logging=1
			shift ;;
			if [ -n "$2" ] && [ "${2#-}" = "$2" ]; then
				per_test_log_dir="$2"
				if [ -e "$per_test_log_dir" ] && [ ! -d "$per_test_log_dir" ]; then
					echo "Per-test log path is not a dir:" \
					     "$per_test_log_dir" >&2
					exit 1
				fi
				if [ ! -d "$per_test_log_dir" ] && \
				   ! mkdir -p "$per_test_log_dir"; then
					echo "Could not create log dir:" \
					     "$per_test_log_dir" >&2
					exit 1
				fi
				per_test_log_dir=$(cd "$per_test_log_dir" && pwd -P)
				if [ -z "$per_test_log_dir" ]; then
					echo "Could not resolve per-test log directory" >&2
					exit 1
				fi
				if [ ! -w "$per_test_log_dir" ]; then
					echo "Per-test log dir is not writable:" \
					     "$per_test_log_dir" >&2
					exit 1
				fi
				shift 2
			else
				shift
			fi ;;
		-t | --test)
			TESTS="$TESTS $2"
			shift 2 ;;