From: Claire Jensen <cjense@google.com>
To: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org,
peterz@infradead.org, mingo@redhat.com, acme@kernel.org,
mark.rutland@arm.com, alexander.shishkin@linux.intel.com,
jolsa@redhat.com, namhyung@kernel.org, irogers@google.com,
eranian@google.com
Cc: Claire Jensen <cjense@google.com>
Subject: [PATCH 1/1] perf test: Add test for CSV output.
Date: Thu, 5 Aug 2021 17:14:31 +0000 [thread overview]
Message-ID: <20210805171431.940897-1-cjense@google.com> (raw)
Add field checking tests for perf stat CSV output. Counts expected
fields for various commands. No testing added for summary mode
since it is broken.
An example of the summary output is:
summary,263831,,instructions:u,1435072,100.0,0.46,insn per cycle
,,,,,1.37,stalled cycles per insn
This should be:
summary,263831,,instructions:u,1435072,100.0,0.46,insn per cycle
summary,,,,,,1.37,stalled cycles per insn
The output has 7 fields when it should have 8. Additionally, the newline
spacing is wrong, so it was excluded from testing until a fix is made.
---
.../tests/shell/lib/perf_csv_output_lint.py | 55 ++++++++
tools/perf/tests/shell/stat+csv_output.sh | 117 ++++++++++++++++++
2 files changed, 172 insertions(+)
create mode 100644 tools/perf/tests/shell/lib/perf_csv_output_lint.py
create mode 100644 tools/perf/tests/shell/stat+csv_output.sh
diff --git a/tools/perf/tests/shell/lib/perf_csv_output_lint.py b/tools/perf/tests/shell/lib/perf_csv_output_lint.py
new file mode 100644
index 000000000000..ef8a32c3523c
--- /dev/null
+++ b/tools/perf/tests/shell/lib/perf_csv_output_lint.py
@@ -0,0 +1,55 @@
+#!/usr/bin/python
+# SPDX-License-Identifier: GPL-2.0
+
+from __future__ import print_function
+import argparse
+import sys
+
+# Basic sanity check of perf CSV output as specified in the man page.
+# Currently just checks the number of fields per line in output.
+
+ap = argparse.ArgumentParser()
+ap.add_argument('--no-args', action='store_true')
+ap.add_argument('--interval', action='store_true')
+ap.add_argument('--all-cpus-no-aggr', action='store_true')
+ap.add_argument('--all-cpus', action='store_true')
+ap.add_argument('--event', action='store_true')
+ap.add_argument('--per-core', action='store_true')
+ap.add_argument('--per-thread', action='store_true')
+ap.add_argument('--per-die', action='store_true')
+ap.add_argument('--per-node', action='store_true')
+ap.add_argument('--per-socket', action='store_true')
+ap.add_argument('--separator', const=',', nargs='?')
+args = ap.parse_args()
+
+Lines = sys.stdin.readlines()
+ch = args.separator
+
+
+def check_csv_output(exp):
+ for line in Lines:
+ if 'failed' not in line:
+ count = 0
+ count = line.count(args.separator)
+ if count != exp:
+ sys.stdout.write(''.join(Lines))
+ raise RuntimeError('wrong number of fields.'
+ ' expected {0} in {1}\n'.format(exp, line))
+
+try:
+ if args.no_args or args.all_cpus or args.event:
+ check_csv_output(6)
+
+ if args.interval or args.per_thread:
+ check_csv_output(7)
+
+ if args.per_core or args.per_socket or args.per_node or args.per_die:
+ check_csv_output(8)
+
+except:
+ sys.stdout.write('Test failed for input: ' + ''.join(Lines))
+ raise
+
+
+
+
diff --git a/tools/perf/tests/shell/stat+csv_output.sh b/tools/perf/tests/shell/stat+csv_output.sh
new file mode 100644
index 000000000000..282f9547e7be
--- /dev/null
+++ b/tools/perf/tests/shell/stat+csv_output.sh
@@ -0,0 +1,117 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+# perf stat csv output test
+# Tests various perf stat CSV output commands for the
+# correct number of fields and the CSV separator set to ','.
+
+set -e
+
+pythonchecker=$(dirname $0)/lib/perf_csv_output_lint.py
+file="/proc/sys/kernel/perf_event_paranoid"
+paranoia=$(cat "$file" | grep -o -E '[0-9]+')
+echo $paranoia
+
+check_no_args()
+{
+ perf stat -x, sleep 1 2>&1 | \
+ python $pythonchecker --no-args --separator
+}
+
+if [ $paranoia -gt 0 ];
+then
+ echo check_all_cpus test skipped because of paranoia level.
+else
+ check_all_cpus()
+ {
+ perf stat -x, -a 2>&1 sleep 1 | \
+ python $pythonchecker --all-cpus --separator
+ }
+ check_all_cpus
+fi
+
+check_interval()
+{
+ perf stat -x, -I 1000 2>&1 sleep 1 | \
+ python $pythonchecker --interval --separator
+}
+
+check_all_cpus_no_aggr()
+{
+ perf stat -x, -A -a --no-merge 2>&1 sleep 1 | \
+ python $pythonchecker --all-cpus-no-aggr --separator
+}
+
+check_event()
+{
+ perf stat -x, -e cpu-clock 2>&1 sleep 1 | \
+ python $pythonchecker --event --separator
+}
+
+if [ $paranoia -gt 0 ];
+then
+ echo check_all_cpus test skipped because of paranoia level.
+else
+ check_per_core()
+ {
+ perf stat -x, --per-core -a 2>&1 sleep 1 | \
+ python $pythonchecker --per-core --separator
+ }
+ check_per_core
+fi
+
+if [ $paranoia -gt 0 ];
+then
+ echo check_all_cpus test skipped because of paranoia level.
+else
+ check_per_thread()
+ {
+ perf stat -x, --per-thread -a 2>&1 sleep 1 | \
+ python $pythonchecker --per-thread --separator
+ }
+ check_per_thread
+fi
+
+if [ $paranoia -gt 0 ];
+then
+ echo check_per_die test skipped because of paranoia level.
+else
+ check_per_die()
+ {
+ perf stat -x, --per-die -a 2>&1 sleep 1 | \
+ python $pythonchecker --per-die --separator
+ }
+ check_per_die
+fi
+
+if [ $paranoia -gt 0 ];
+then
+ echo check_per_node test skipped because of paranoia level.
+else
+ check_per_node()
+ {
+ perf stat -x, --per-node -a 2>&1 sleep 1 | \
+ python $pythonchecker --per-node --separator
+ }
+ check_per_node
+fi
+
+if [ $paranoia -gt 0 ];
+then
+ echo check_per_socket test skipped because of paranoia level.
+else
+ check_per_socket()
+ {
+ perf stat -x, --per-socket -a 2>&1 sleep 1 | \
+ python $pythonchecker --per-socket --separator
+ }
+ check_per_socket
+fi
+
+check_no_args
+check_interval
+check_all_cpus_no_aggr
+check_event
+
+exit 0
+
--
2.32.0.605.g8dce9f2422-goog
next reply other threads:[~2021-08-05 17:14 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-05 17:14 Claire Jensen [this message]
2021-08-06 18:34 ` [PATCH 1/1] perf test: Add test for CSV output Arnaldo Carvalho de Melo
2021-08-09 16:24 Claire Jensen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210805171431.940897-1-cjense@google.com \
--to=cjense@google.com \
--cc=acme@kernel.org \
--cc=alexander.shishkin@linux.intel.com \
--cc=eranian@google.com \
--cc=irogers@google.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).