]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf tests top: Add basic perf top coverage test
authorIan Rogers <irogers@google.com>
Sat, 22 Nov 2025 08:19:24 +0000 (00:19 -0800)
committerNamhyung Kim <namhyung@kernel.org>
Wed, 3 Dec 2025 19:07:47 +0000 (11:07 -0800)
The test starts a backgroup thloop workload and monitors it using
cpu-clock ensuring test_loop appears in the output.

Signed-off-by: Ian Rogers <irogers@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
tools/perf/tests/shell/top.sh [new file with mode: 0755]

diff --git a/tools/perf/tests/shell/top.sh b/tools/perf/tests/shell/top.sh
new file mode 100755 (executable)
index 0000000..768ebcf
--- /dev/null
@@ -0,0 +1,74 @@
+#!/bin/bash
+# perf top tests
+# SPDX-License-Identifier: GPL-2.0
+
+set -e
+
+err=0
+log_file=$(mktemp /tmp/perf.top.log.XXXXX)
+
+cleanup() {
+       rm -f "${log_file}"
+       trap - EXIT TERM INT
+}
+
+trap_cleanup() {
+       echo "Unexpected signal in ${FUNCNAME[1]}"
+       cleanup
+       exit 1
+}
+trap trap_cleanup EXIT TERM INT
+
+test_basic_perf_top() {
+       echo "Basic perf top test"
+
+       # Start a workload that spins to generate samples
+       # thloop runs for the specified number of seconds
+       perf test -w thloop 20 &
+       PID=$!
+
+       # Allow it to start
+       sleep 0.1
+
+       # Run perf top for 5 seconds, monitoring that PID
+       # Use --stdio to avoid TUI and redirect output
+       # Use -d 1 to avoid flooding output
+       # Use -e cpu-clock to ensure we get samples
+       # Use sleep to keep stdin open but silent, preventing EOF loop or interactive spam
+       if ! sleep 10 | timeout 5s perf top --stdio -d 1 -e cpu-clock -p $PID > "${log_file}" 2>&1; then
+               retval=$?
+               if [ $retval -ne 124 ] && [ $retval -ne 0 ]; then
+                       echo "Basic perf top test [Failed: perf top failed to start or run (ret=$retval)]"
+                       head -n 50 "${log_file}"
+                       kill $PID
+                       wait $PID 2>/dev/null || true
+                       err=1
+                       return
+               fi
+       fi
+
+       kill $PID
+       wait $PID 2>/dev/null || true
+
+       # Check for some sample data (percentage)
+       if ! grep -E -q "[0-9]+\.[0-9]+%" "${log_file}"; then
+               echo "Basic perf top test [Failed: no sample percentage found]"
+               head -n 50 "${log_file}"
+               err=1
+               return
+       fi
+
+       # Check for the symbol
+       if ! grep -q "test_loop" "${log_file}"; then
+               echo "Basic perf top test [Failed: test_loop symbol not found]"
+               head -n 50 "${log_file}"
+               err=1
+               return
+       fi
+
+       echo "Basic perf top test [Success]"
+}
+
+test_basic_perf_top
+cleanup
+exit $err