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