| #!/bin/bash | |
| # perf script task-analyzer tests (exclusive) | |
| # SPDX-License-Identifier: GPL-2.0 | |
| tmpdir=$(mktemp -d /tmp/perf-script-task-analyzer-XXXXX) | |
| # TODO: perf script report only supports input from the CWD perf.data file, make | |
| # it support input from any file. | |
| perfdata="perf.data" | |
| csv="$tmpdir/csv" | |
| csvsummary="$tmpdir/csvsummary" | |
| err=0 | |
| # set PERF_EXEC_PATH to find scripts in the source directory | |
| perfdir=$(dirname "$0")/../.. | |
| if [ -e "$perfdir/scripts/python/Perf-Trace-Util" ]; then | |
| export PERF_EXEC_PATH=$perfdir | |
| fi | |
| # Disable lsan to avoid warnings about python memory leaks. | |
| export ASAN_OPTIONS=detect_leaks=0 | |
| cleanup() { | |
| rm -f "${perfdata}" | |
| rm -f "${perfdata}".old | |
| rm -rf "$tmpdir" | |
| trap - exit term int | |
| } | |
| trap_cleanup() { | |
| cleanup | |
| exit 1 | |
| } | |
| trap trap_cleanup exit term int | |
| report() { | |
| if [ "$1" = 0 ]; then | |
| echo "PASS: \"$2\"" | |
| else | |
| echo "FAIL: \"$2\" Error message: \"$3\"" | |
| err=1 | |
| fi | |
| } | |
| check_exec_0() { | |
| if [ $? != 0 ]; then | |
| report 1 "invocation of $1 command failed" | |
| fi | |
| } | |
| find_str_or_fail() { | |
| grep -q "$1" "$2" | |
| if [ "$?" != 0 ]; then | |
| report 1 "$3" "Failed to find required string:'${1}'." | |
| else | |
| report 0 "$3" | |
| fi | |
| } | |
| # check if perf is compiled with libtraceevent support | |
| skip_no_probe_record_support() { | |
| perf check feature -q libtraceevent && return 0 | |
| return 2 | |
| } | |
| prepare_perf_data() { | |
| # 1s should be sufficient to catch at least some switches | |
| perf record -e sched:sched_switch -a -o "${perfdata}" -- sleep 1 > /dev/null 2>&1 | |
| # check if perf data file got created in above step. | |
| if [ ! -e "${perfdata}" ]; then | |
| printf "FAIL: perf record failed to create \"${perfdata}\" \n" | |
| return 1 | |
| fi | |
| } | |
| # check standard inkvokation with no arguments | |
| test_basic() { | |
| out="$tmpdir/perf.out" | |
| perf script report task-analyzer > "$out" | |
| check_exec_0 "perf script report task-analyzer" | |
| find_str_or_fail "Comm" "$out" "${FUNCNAME[0]}" | |
| } | |
| test_ns_rename(){ | |
| out="$tmpdir/perf.out" | |
| perf script report task-analyzer --ns --rename-comms-by-tids 0:random > "$out" | |
| check_exec_0 "perf script report task-analyzer --ns --rename-comms-by-tids 0:random" | |
| find_str_or_fail "Comm" "$out" "${FUNCNAME[0]}" | |
| } | |
| test_ms_filtertasks_highlight(){ | |
| out="$tmpdir/perf.out" | |
| perf script report task-analyzer --ms --filter-tasks perf --highlight-tasks perf \ | |
| > "$out" | |
| check_exec_0 "perf script report task-analyzer --ms --filter-tasks perf --highlight-tasks perf" | |
| find_str_or_fail "Comm" "$out" "${FUNCNAME[0]}" | |
| } | |
| test_extended_times_timelimit_limittasks() { | |
| out="$tmpdir/perf.out" | |
| perf script report task-analyzer --extended-times --time-limit :99999 \ | |
| --limit-to-tasks perf > "$out" | |
| check_exec_0 "perf script report task-analyzer --extended-times --time-limit :99999 --limit-to-tasks perf" | |
| find_str_or_fail "Out-Out" "$out" "${FUNCNAME[0]}" | |
| } | |
| test_summary() { | |
| out="$tmpdir/perf.out" | |
| perf script report task-analyzer --summary > "$out" | |
| check_exec_0 "perf script report task-analyzer --summary" | |
| find_str_or_fail "Summary" "$out" "${FUNCNAME[0]}" | |
| } | |
| test_summaryextended() { | |
| out="$tmpdir/perf.out" | |
| perf script report task-analyzer --summary-extended > "$out" | |
| check_exec_0 "perf script report task-analyzer --summary-extended" | |
| find_str_or_fail "Inter Task Times" "$out" "${FUNCNAME[0]}" | |
| } | |
| test_summaryonly() { | |
| out="$tmpdir/perf.out" | |
| perf script report task-analyzer --summary-only > "$out" | |
| check_exec_0 "perf script report task-analyzer --summary-only" | |
| find_str_or_fail "Summary" "$out" "${FUNCNAME[0]}" | |
| } | |
| test_extended_times_summary_ns() { | |
| out="$tmpdir/perf.out" | |
| perf script report task-analyzer --extended-times --summary --ns > "$out" | |
| check_exec_0 "perf script report task-analyzer --extended-times --summary --ns" | |
| find_str_or_fail "Out-Out" "$out" "${FUNCNAME[0]}" | |
| find_str_or_fail "Summary" "$out" "${FUNCNAME[0]}" | |
| } | |
| test_csv() { | |
| perf script report task-analyzer --csv "${csv}" > /dev/null | |
| check_exec_0 "perf script report task-analyzer --csv ${csv}" | |
| find_str_or_fail "Comm;" "${csv}" "${FUNCNAME[0]}" | |
| } | |
| test_csv_extended_times() { | |
| perf script report task-analyzer --csv "${csv}" --extended-times > /dev/null | |
| check_exec_0 "perf script report task-analyzer --csv ${csv} --extended-times" | |
| find_str_or_fail "Out-Out;" "${csv}" "${FUNCNAME[0]}" | |
| } | |
| test_csvsummary() { | |
| perf script report task-analyzer --csv-summary "${csvsummary}" > /dev/null | |
| check_exec_0 "perf script report task-analyzer --csv-summary ${csvsummary}" | |
| find_str_or_fail "Comm;" "${csvsummary}" "${FUNCNAME[0]}" | |
| } | |
| test_csvsummary_extended() { | |
| perf script report task-analyzer --csv-summary "${csvsummary}" --summary-extended \ | |
| >/dev/null | |
| check_exec_0 "perf script report task-analyzer --csv-summary ${csvsummary} --summary-extended" | |
| find_str_or_fail "Out-Out;" "${csvsummary}" "${FUNCNAME[0]}" | |
| } | |
| skip_no_probe_record_support | |
| err=$? | |
| if [ $err -ne 0 ]; then | |
| echo "WARN: Skipping tests. No libtraceevent support" | |
| cleanup | |
| exit $err | |
| fi | |
| prepare_perf_data | |
| test_basic | |
| test_ns_rename | |
| test_ms_filtertasks_highlight | |
| test_extended_times_timelimit_limittasks | |
| test_summary | |
| test_summaryextended | |
| test_summaryonly | |
| test_extended_times_summary_ns | |
| test_csv | |
| test_csvsummary | |
| test_csv_extended_times | |
| test_csvsummary_extended | |
| cleanup | |
| exit $err |