162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# perf stat CSV output linter
362306a36Sopenharmony_ci# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
462306a36Sopenharmony_ci# Tests various perf stat CSV output commands for the
562306a36Sopenharmony_ci# correct number of fields and the CSV separator set to ','.
662306a36Sopenharmony_ci
762306a36Sopenharmony_ciset -e
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci. "$(dirname $0)"/lib/stat_output.sh
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cicsv_sep=@
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistat_output=$(mktemp /tmp/__perf_test.stat_output.csv.XXXXX)
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cicleanup() {
1662306a36Sopenharmony_ci  rm -f "${stat_output}"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci  trap - EXIT TERM INT
1962306a36Sopenharmony_ci}
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_citrap_cleanup() {
2262306a36Sopenharmony_ci  cleanup
2362306a36Sopenharmony_ci  exit 1
2462306a36Sopenharmony_ci}
2562306a36Sopenharmony_citrap trap_cleanup EXIT TERM INT
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cifunction commachecker()
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	local -i cnt=0
3062306a36Sopenharmony_ci	local exp=0
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	case "$1"
3362306a36Sopenharmony_ci	in "--no-args")		exp=6
3462306a36Sopenharmony_ci	;; "--system-wide")	exp=6
3562306a36Sopenharmony_ci	;; "--event")		exp=6
3662306a36Sopenharmony_ci	;; "--interval")	exp=7
3762306a36Sopenharmony_ci	;; "--per-thread")	exp=7
3862306a36Sopenharmony_ci	;; "--system-wide-no-aggr")	exp=7
3962306a36Sopenharmony_ci				[ "$(uname -m)" = "s390x" ] && exp='^[6-7]$'
4062306a36Sopenharmony_ci	;; "--per-core")	exp=8
4162306a36Sopenharmony_ci	;; "--per-socket")	exp=8
4262306a36Sopenharmony_ci	;; "--per-node")	exp=8
4362306a36Sopenharmony_ci	;; "--per-die")		exp=8
4462306a36Sopenharmony_ci	;; "--per-cache")	exp=8
4562306a36Sopenharmony_ci	esac
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	while read line
4862306a36Sopenharmony_ci	do
4962306a36Sopenharmony_ci		# Ignore initial "started on" comment.
5062306a36Sopenharmony_ci		x=${line:0:1}
5162306a36Sopenharmony_ci		[ "$x" = "#" ] && continue
5262306a36Sopenharmony_ci		# Ignore initial blank line.
5362306a36Sopenharmony_ci		[ "$line" = "" ] && continue
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci		# Count the number of commas
5662306a36Sopenharmony_ci		x=$(echo $line | tr -d -c $csv_sep)
5762306a36Sopenharmony_ci		cnt="${#x}"
5862306a36Sopenharmony_ci		# echo $line $cnt
5962306a36Sopenharmony_ci		[[ ! "$cnt" =~ $exp ]] && {
6062306a36Sopenharmony_ci			echo "wrong number of fields. expected $exp in $line" 1>&2
6162306a36Sopenharmony_ci			exit 1;
6262306a36Sopenharmony_ci		}
6362306a36Sopenharmony_ci	done < "${stat_output}"
6462306a36Sopenharmony_ci	return 0
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ciperf_cmd="-x$csv_sep -o ${stat_output}"
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ciskip_test=$(check_for_topology)
7062306a36Sopenharmony_cicheck_no_args "CSV" "$perf_cmd"
7162306a36Sopenharmony_cicheck_system_wide "CSV" "$perf_cmd"
7262306a36Sopenharmony_cicheck_interval "CSV" "$perf_cmd"
7362306a36Sopenharmony_cicheck_event "CSV" "$perf_cmd"
7462306a36Sopenharmony_cicheck_per_thread "CSV" "$perf_cmd"
7562306a36Sopenharmony_cicheck_per_node "CSV" "$perf_cmd"
7662306a36Sopenharmony_ciif [ $skip_test -ne 1 ]
7762306a36Sopenharmony_cithen
7862306a36Sopenharmony_ci	check_system_wide_no_aggr "CSV" "$perf_cmd"
7962306a36Sopenharmony_ci	check_per_core "CSV" "$perf_cmd"
8062306a36Sopenharmony_ci	check_per_cache_instance "CSV" "$perf_cmd"
8162306a36Sopenharmony_ci	check_per_die "CSV" "$perf_cmd"
8262306a36Sopenharmony_ci	check_per_socket "CSV" "$perf_cmd"
8362306a36Sopenharmony_cielse
8462306a36Sopenharmony_ci	echo "[Skip] Skipping tests for system_wide_no_aggr, per_core, per_die and per_socket since socket id exposed via topology is invalid"
8562306a36Sopenharmony_cifi
8662306a36Sopenharmony_cicleanup
8762306a36Sopenharmony_ciexit 0
88