xref: /linux/tools/perf/tests/shell/test_task_analyzer.sh (revision e2683c8868d03382da7e1ce8453b543a043066d1)
1#!/bin/bash
2# perf script task-analyzer tests (exclusive)
3# SPDX-License-Identifier: GPL-2.0
4
5tmpdir=$(mktemp -d /tmp/perf-script-task-analyzer-XXXXX)
6# TODO: perf script report only supports input from the CWD perf.data file, make
7# it support input from any file.
8perfdata="perf.data"
9csv="$tmpdir/csv"
10csvsummary="$tmpdir/csvsummary"
11err=0
12
13# set PERF_EXEC_PATH to find scripts in the source directory
14perfdir=$(dirname "$0")/../..
15if [ -e "$perfdir/scripts/python/Perf-Trace-Util" ]; then
16  export PERF_EXEC_PATH=$perfdir
17fi
18
19# Disable lsan to avoid warnings about python memory leaks.
20export ASAN_OPTIONS=detect_leaks=0
21
22cleanup() {
23  rm -f "${perfdata}"
24  rm -f "${perfdata}".old
25  rm -rf "$tmpdir"
26
27  trap - exit term int
28}
29
30trap_cleanup() {
31  cleanup
32  exit 1
33}
34trap trap_cleanup exit term int
35
36report() {
37	if [ "$1" = 0 ]; then
38		echo "PASS: \"$2\""
39	else
40		echo "FAIL: \"$2\" Error message: \"$3\""
41		err=1
42	fi
43}
44
45check_exec_0() {
46	if [ $? != 0 ]; then
47		report 1 "invocation of $1 command failed"
48	fi
49}
50
51find_str_or_fail() {
52	grep -q "$1" "$2"
53	if [ "$?" != 0 ]; then
54		report 1 "$3" "Failed to find required string:'${1}'."
55	else
56		report 0 "$3"
57	fi
58}
59
60# check if perf is compiled with libtraceevent support
61skip_no_probe_record_support() {
62	perf check feature -q libtraceevent && return 0
63	return 2
64}
65
66prepare_perf_data() {
67	# 1s should be sufficient to catch at least some switches
68	perf record -e sched:sched_switch -a -o "${perfdata}" -- sleep 1 > /dev/null 2>&1
69	# check if perf data file got created in above step.
70	if [ ! -e "${perfdata}" ]; then
71		printf "FAIL: perf record failed to create \"${perfdata}\" \n"
72		return 1
73	fi
74}
75
76# check standard inkvokation with no arguments
77test_basic() {
78	out="$tmpdir/perf.out"
79	perf script report task-analyzer > "$out"
80	check_exec_0 "perf script report task-analyzer"
81	find_str_or_fail "Comm" "$out" "${FUNCNAME[0]}"
82}
83
84test_ns_rename(){
85	out="$tmpdir/perf.out"
86	perf script report task-analyzer --ns --rename-comms-by-tids 0:random > "$out"
87	check_exec_0 "perf script report task-analyzer --ns --rename-comms-by-tids 0:random"
88	find_str_or_fail "Comm" "$out" "${FUNCNAME[0]}"
89}
90
91test_ms_filtertasks_highlight(){
92	out="$tmpdir/perf.out"
93	perf script report task-analyzer --ms --filter-tasks perf --highlight-tasks perf \
94	> "$out"
95	check_exec_0 "perf script report task-analyzer --ms --filter-tasks perf --highlight-tasks perf"
96	find_str_or_fail "Comm" "$out" "${FUNCNAME[0]}"
97}
98
99test_extended_times_timelimit_limittasks() {
100	out="$tmpdir/perf.out"
101	perf script report task-analyzer --extended-times --time-limit :99999 \
102	--limit-to-tasks perf > "$out"
103	check_exec_0 "perf script report task-analyzer --extended-times --time-limit :99999 --limit-to-tasks perf"
104	find_str_or_fail "Out-Out" "$out" "${FUNCNAME[0]}"
105}
106
107test_summary() {
108	out="$tmpdir/perf.out"
109	perf script report task-analyzer --summary > "$out"
110	check_exec_0 "perf script report task-analyzer --summary"
111	find_str_or_fail "Summary" "$out" "${FUNCNAME[0]}"
112}
113
114test_summaryextended() {
115	out="$tmpdir/perf.out"
116	perf script report task-analyzer --summary-extended > "$out"
117	check_exec_0 "perf script report task-analyzer --summary-extended"
118	find_str_or_fail "Inter Task Times" "$out" "${FUNCNAME[0]}"
119}
120
121test_summaryonly() {
122	out="$tmpdir/perf.out"
123	perf script report task-analyzer --summary-only > "$out"
124	check_exec_0 "perf script report task-analyzer --summary-only"
125	find_str_or_fail "Summary" "$out" "${FUNCNAME[0]}"
126}
127
128test_extended_times_summary_ns() {
129	out="$tmpdir/perf.out"
130	perf script report task-analyzer --extended-times --summary --ns > "$out"
131	check_exec_0 "perf script report task-analyzer --extended-times --summary --ns"
132	find_str_or_fail "Out-Out" "$out" "${FUNCNAME[0]}"
133	find_str_or_fail "Summary" "$out" "${FUNCNAME[0]}"
134}
135
136test_csv() {
137	perf script report task-analyzer --csv "${csv}" > /dev/null
138	check_exec_0 "perf script report task-analyzer --csv ${csv}"
139	find_str_or_fail "Comm;" "${csv}" "${FUNCNAME[0]}"
140}
141
142test_csv_extended_times() {
143	perf script report task-analyzer --csv "${csv}" --extended-times > /dev/null
144	check_exec_0 "perf script report task-analyzer --csv ${csv} --extended-times"
145	find_str_or_fail "Out-Out;" "${csv}" "${FUNCNAME[0]}"
146}
147
148test_csvsummary() {
149	perf script report task-analyzer --csv-summary "${csvsummary}" > /dev/null
150	check_exec_0 "perf script report task-analyzer --csv-summary ${csvsummary}"
151	find_str_or_fail "Comm;" "${csvsummary}" "${FUNCNAME[0]}"
152}
153
154test_csvsummary_extended() {
155	perf script report task-analyzer --csv-summary "${csvsummary}" --summary-extended \
156	>/dev/null
157	check_exec_0 "perf script report task-analyzer --csv-summary ${csvsummary} --summary-extended"
158	find_str_or_fail "Out-Out;" "${csvsummary}" "${FUNCNAME[0]}"
159}
160
161skip_no_probe_record_support
162err=$?
163if [ $err -ne 0 ]; then
164	echo "WARN: Skipping tests. No libtraceevent support"
165	cleanup
166	exit $err
167fi
168prepare_perf_data
169test_basic
170test_ns_rename
171test_ms_filtertasks_highlight
172test_extended_times_timelimit_limittasks
173test_summary
174test_summaryextended
175test_summaryonly
176test_extended_times_summary_ns
177test_csv
178test_csvsummary
179test_csv_extended_times
180test_csvsummary_extended
181cleanup
182exit $err
183