This commit adds a base for a testsuite of perf + its sub-commands.
---
 .../testsuite/common/check_all_lines_matched.pl    |  28 +++++
 .../testsuite/common/check_all_patterns_found.pl   |  30 ++++++
 .../testsuite/common/check_any_pattern_found.pl    |  14 +++
 tools/perf/testsuite/common/init.sh                |  50 +++++++++
 tools/perf/testsuite/common/parametrization.sh     |  18 ++++
 tools/perf/testsuite/common/patterns.sh            |  74 +++++++++++++
 tools/perf/testsuite/common/settings.sh            |  50 +++++++++
 tools/perf/testsuite/test_driver.sh                | 114 +++++++++++++++++++++
 8 files changed, 378 insertions(+)
 create mode 100755 tools/perf/testsuite/common/check_all_lines_matched.pl
 create mode 100755 tools/perf/testsuite/common/check_all_patterns_found.pl
 create mode 100755 tools/perf/testsuite/common/check_any_pattern_found.pl
 create mode 100644 tools/perf/testsuite/common/init.sh
 create mode 100644 tools/perf/testsuite/common/parametrization.sh
 create mode 100644 tools/perf/testsuite/common/patterns.sh
 create mode 100644 tools/perf/testsuite/common/settings.sh
 create mode 100755 tools/perf/testsuite/test_driver.sh

diff --git a/tools/perf/testsuite/common/check_all_lines_matched.pl 
b/tools/perf/testsuite/common/check_all_lines_matched.pl
new file mode 100755
index 0000000..d127d20
--- /dev/null
+++ b/tools/perf/testsuite/common/check_all_lines_matched.pl
@@ -0,0 +1,28 @@
+#!/usr/bin/perl
+
+@regexps = @ARGV;
+
+$passed = 1;
+
+while (<STDIN>)
+{
+       s/\n//;
+
+       $line_matched = 0;
+       for $r (@regexps)
+       {
+               if (/$r/)
+               {
+                       $line_matched = 1;
+                       last;
+               }
+       }
+
+       unless ($line_matched)
+       {
+               print "Line did not match any pattern: \"$_\"\n";
+               $passed = 0;
+       }
+}
+
+exit ($passed == 0);
diff --git a/tools/perf/testsuite/common/check_all_patterns_found.pl 
b/tools/perf/testsuite/common/check_all_patterns_found.pl
new file mode 100755
index 0000000..b828c8d
--- /dev/null
+++ b/tools/perf/testsuite/common/check_all_patterns_found.pl
@@ -0,0 +1,30 @@
+#!/usr/bin/perl
+
+@regexps = @ARGV;
+
+%found = ();
+$passed = 1;
+
+while (<STDIN>)
+{
+       s/\n//;
+
+       for $r (@regexps)
+       {
+               if (/$r/)
+               {
+                       $found{$r} = 1; # FIXME: maybe add counters -- how many 
times was the regexp matched
+               }
+       }
+}
+
+for $r (@regexps)
+{
+       unless (exists $found{$r})
+       {
+               print "Regexp not found: \"$r\"\n";
+               $passed = 0;
+       }
+}
+
+exit ($passed == 0);
diff --git a/tools/perf/testsuite/common/check_any_pattern_found.pl 
b/tools/perf/testsuite/common/check_any_pattern_found.pl
new file mode 100755
index 0000000..215c65a0c
--- /dev/null
+++ b/tools/perf/testsuite/common/check_any_pattern_found.pl
@@ -0,0 +1,14 @@
+#!/usr/bin/perl
+
+@regexps = @ARGV;
+
+while (<STDIN>)
+{
+       s/\n//;
+       for $r (@regexps)
+       {
+               exit 0 if (/$r/);
+       }
+}
+
+exit 1;
diff --git a/tools/perf/testsuite/common/init.sh 
b/tools/perf/testsuite/common/init.sh
new file mode 100644
index 0000000..ba2038d
--- /dev/null
+++ b/tools/perf/testsuite/common/init.sh
@@ -0,0 +1,50 @@
+#
+#      init.sh
+#      Author: Michael Petlan <mpet...@redhat.com>
+#
+#      Description:
+#
+#              This file should be used for initialization of basic functions
+#      for checking, reporting results etc.
+#
+#
+
+THIS_TEST_NAME=`basename $0`
+
+print_results()
+{
+       PERF_RETVAL="$1"; shift
+       CHECK_RETVAL="$1"; shift
+       FAILURE_REASON=""
+       TASK_COMMENT="$@"
+       if [ $PERF_RETVAL -eq 0 -a $CHECK_RETVAL -eq 0 ]; then
+               echo -e "$MPASS-- [ PASS ] --$MEND $TEST_NAME :: 
$THIS_TEST_NAME :: $TASK_COMMENT"
+               return 0
+       else
+               if [ $PERF_RETVAL -ne 0 ]; then
+                       FAILURE_REASON="command exitcode"
+               fi
+               if [ $CHECK_RETVAL -ne 0 ]; then
+                       test -n "$FAILURE_REASON" && 
FAILURE_REASON="$FAILURE_REASON + "
+                       FAILURE_REASON="$FAILURE_REASON""output regexp parsing"
+               fi
+               echo -e "$MFAIL-- [ FAIL ] --$MEND $TEST_NAME :: 
$THIS_TEST_NAME :: $TASK_COMMENT ($FAILURE_REASON)"
+               return 1
+       fi
+}
+
+print_overall_results()
+{
+       RETVAL="$1"; shift
+       if [ $RETVAL -eq 0 ]; then
+               echo -e "$MALLPASS## [ PASS ] ##$MEND $TEST_NAME :: 
$THIS_TEST_NAME"
+       else
+               echo -e "$MALLFAIL## [ FAIL ] ##$MEND $TEST_NAME :: 
$THIS_TEST_NAME :: $RETVAL failures found"
+       fi
+       return $RETVAL
+}
+
+print_testcase_skipped()
+{
+       echo -e "$MSKIP## [ SKIP ] ##$MEND $TEST_NAME :: $THIS_TEST_NAME :: 
testcase skipped"
+}
diff --git a/tools/perf/testsuite/common/parametrization.sh 
b/tools/perf/testsuite/common/parametrization.sh
new file mode 100644
index 0000000..9375999
--- /dev/null
+++ b/tools/perf/testsuite/common/parametrization.sh
@@ -0,0 +1,18 @@
+#
+#      parametrization.sh
+#      Author: Michael Petlan <mpet...@redhat.com>
+#
+#      Description:
+#
+#              This file configures the testcases how deeply they should
+#      look at things. The parametrization allows you to use the suite
+#      for both smoke testing and deeper testing.
+#
+
+#### perf_stat
+
+# If set, the 24x7 events will be tested on all available cores.
+# That might make it 'nproc' times longer. Basically it should be
+# enough to run each event on one core only.
+# Note: POWER8 only
+export PARAM_STAT_24x7_ALL_CORES=n
diff --git a/tools/perf/testsuite/common/patterns.sh 
b/tools/perf/testsuite/common/patterns.sh
new file mode 100644
index 0000000..08462f0
--- /dev/null
+++ b/tools/perf/testsuite/common/patterns.sh
@@ -0,0 +1,74 @@
+export RE_NUMBER="[0-9\.]+"
+# Number
+# Examples:
+#    123.456
+
+
+export RE_NUMBER_HEX="[0-9A-Fa-f]+"
+# Hexadecimal number
+# Examples:
+#    1234
+#    a58d
+#    aBcD
+#    deadbeef
+
+
+export RE_EVENT_ANY="[\w\-\:\/_=,]+"
+# Name of any event (universal)
+# Examples:
+#    cpu-cycles
+#    cpu/event=12,umask=34/
+#    r41e1
+#    nfs:nfs_getattr_enter
+
+
+export RE_EVENT="[\w\-:_]+"
+# Name of an usual event
+# Examples:
+#    cpu-cycles
+
+
+export RE_EVENT_RAW="r$RE_NUMBER_HEX"
+# Specification of a raw event
+# Examples:
+#    r41e1
+#    r1a
+
+
+export RE_EVENT_CPU="cpu/(\w=""$RE_NUMBER_HEX"",?)+/p*" # FIXME
+# Specification of a CPU event
+# Examples:
+#    cpu/event=12,umask=34/pp
+
+
+export RE_EVENT_UNCORE="uncore/[\w_]+/"
+# Specification of an uncore event
+# Examples:
+#    uncore/qhl_request_local_reads/
+
+
+export RE_EVENT_SUBSYSTEM="[\w\-]+:[\w\-]+"
+# Name of an event from subsystem
+# Examples:
+#    ext4:ext4_ordered_write_end
+#    sched:sched_switch
+
+export RE_LINE_COMMENT="^#.*"
+# A comment line
+# Examples:
+#    # Started on Thu Sep 10 11:43:00 2015
+
+export RE_LINE_EMPTY="^\s*$"
+# An empty line with possible whitespaces
+# Examples:
+#
+
+export RE_LINE_RECORD1="^\[\s+perf\s+record:\s+Woken up $RE_NUMBER times? to 
write data\s+\].*$"
+# The first line of perf-record "OK" output
+# Examples:
+#    [ perf record: Woken up 1 times to write data ]
+
+export RE_LINE_RECORD2="^\[\s+perf\s+record:\s+Captured and wrote 
$RE_NUMBER\s*MB\s+perf.data\s*\(~?$RE_NUMBER samples\)\s+\].*$"
+# The second line of perf-record "OK" output
+# Examples:
+#    [ perf record: Captured and wrote 0.405 MB perf.data (109 samples) ]
diff --git a/tools/perf/testsuite/common/settings.sh 
b/tools/perf/testsuite/common/settings.sh
new file mode 100644
index 0000000..bd7b2fb
--- /dev/null
+++ b/tools/perf/testsuite/common/settings.sh
@@ -0,0 +1,50 @@
+#
+#      settings.sh
+#      Author: Michael Petlan <mpet...@redhat.com>
+#
+#      Description:
+#
+#              This file contains global settings for the whole testsuite.
+#      Its purpose is to make it easier when it is necessary i.e. to
+#      change the usual sample command which is used in all of the tests
+#      in many files.
+#
+#              This file is intended to be sourced in the tests.
+#
+
+#### which perf to use in the testing
+export CMD_PERF=`which perf`
+
+#### basic programs examinated by perf
+export CMD_BASIC_SLEEP="sleep 0.1"
+export CMD_QUICK_SLEEP="sleep 0.01"
+export CMD_LONGER_SLEEP="sleep 2"
+export CMD_SIMPLE="true"
+
+#### colors
+if [ -t 1 ]; then
+       export MPASS="\e[32m"
+       export MALLPASS="\e[1;32m"
+       export MFAIL="\e[31m"
+       export MALLFAIL="\e[1;31m"
+       export MWARN="\e[1;35m"
+       export MSKIP="\e[33m"
+       export MHIGH="\e[1;33m"
+       export MEND="\e[m"
+else
+       export MPASS=""
+       export MALLPASS=""
+       export MFAIL=""
+       export MALLFAIL=""
+       export MWARN=""
+       export MSKIP=""
+       export MHIGH=""
+       export MEND=""
+fi
+
+
+#### test parametrization
+if [ ! -d ./common ]; then
+       # FIXME nasty hack
+       . ../common/parametrization.sh
+fi
diff --git a/tools/perf/testsuite/test_driver.sh 
b/tools/perf/testsuite/test_driver.sh
new file mode 100755
index 0000000..1c36002
--- /dev/null
+++ b/tools/perf/testsuite/test_driver.sh
@@ -0,0 +1,114 @@
+#
+#      test_driver.sh
+#      Author: Michael Petlan <mpet...@redhat.com>
+#
+#      Description:
+#              The test_driver runs all the tests.
+#
+#
+
+. common/settings.sh
+
+# FIXME :: add arguments for logging, test depth, etc
+export PERFTEST_LOGGING=${PERFTEST_LOGGING:-n}
+export VERBOSE=n
+
+#### specifies the sets of test per architecture
+declare -A TESTING_SET
+
+TESTING_SET['aarch64']="stat"
+TESTING_SET['ppc64']="stat"
+TESTING_SET['ppc64le']="stat"
+TESTING_SET['s390x']="stat"
+TESTING_SET['x86_64']="stat"
+TESTING_SET['i686']="stat"
+
+
+#### show something about the environment
+export ARCH=`arch`
+export KERNEL=`uname -r`
+export NPROC=`nproc`
+echo "======================================================"
+echo "Kernel: $KERNEL"
+echo "Architecture: $ARCH"
+if [ "$VERBOSE" = "y" ]; then
+       echo "CPU Info:"
+       head -n 25 /proc/cpuinfo | while read line; do echo -e "\t$line"; done; 
unset line
+       echo "AT_PLATFORM:"
+       LD_SHOW_AUXV=1 /bin/true | grep PLATFORM | while read line; do echo -e 
"\t$line"; done; unset line
+else
+       echo "CPU Info:"
+       FAMILY=`grep family /proc/cpuinfo | head -n 1 | awk -F':' '{print $2}'`
+       MODEL=`grep model /proc/cpuinfo | head -n 1 | awk -F':' '{print $2}'`
+       STEPPING=`grep stepping /proc/cpuinfo | head -n 1 | awk -F':' '{print 
$2}'`
+       VENDOR_ID=`grep vendor_id /proc/cpuinfo | head -n 1 | awk -F':' '{print 
$2}'`
+       echo -e "\t$VENDOR_ID\tFamily:$FAMILY Model:$MODEL Stepping:$STEPPING"
+fi
+if [[ $ARCH =~ ppc64.* ]]; then
+       export VIRTUALIZATION=`systemd-detect-virt -q && echo PowerKVM || ( 
test -e /proc/ppc64/lparcfg && echo PowerVM || echo none )`
+else
+       VIRTUALIZATION=`systemd-detect-virt`
+       export VIRTUALIZATION=${VIRTUALIZATION:-none}
+fi
+echo "Virtualization: $VIRTUALIZATION"
+echo "PERF: $CMD_PERF"
+echo "======================================================"; echo; echo
+
+#### init
+SUBTESTS_TO_RUN="${TESTING_SET[$ARCH]}"
+if [ "$PERFTEST_LOGGING" = "y" ]; then
+       test -d LOGS && rm -rf LOGS
+       mkdir LOGS
+       export LOGS_DIR=`pwd`/LOGS
+
+       # print header
+       echo "============= Running tests ============="
+fi
+
+FAILED_COUNT=0
+PASSED_COUNT=0
+
+#### run the tests
+for subtest in $SUBTESTS_TO_RUN; do
+       SUBTEST_RESULT=0
+       cd base_$subtest
+       if [ "$PERFTEST_LOGGING" = "y" ]; then
+               mkdir $LOGS_DIR/$subtest
+               export LOGGING="> $LOGS_DIR/$subtest/"
+       else
+               # print header
+               echo "========================= $subtest 
========================="
+       fi
+
+
+       # setup, if necessary
+       test -e setup.sh && eval ./setup.sh $LOGGING/setup.log || true
+       (( SUBTEST_RESULT += $?))
+
+       # run all the available testcases
+       for testcase in test_*sh; do
+               eval ./$testcase $LOGGING/`basename $testcase .sh`.log
+               (( SUBTEST_RESULT += $?))
+       done
+
+       # cleanup, if necessary
+       test -e cleanup.sh && eval ./cleanup.sh $LOGGING/cleanup.log || true
+       (( SUBTEST_RESULT += $?))
+
+       cd ..
+
+       # print result
+       if [ "$PERFTEST_LOGGING" = "y" ]; then
+               if [ $SUBTEST_RESULT -eq 0 ]; then
+                       echo -e "$MALLPASS## [ PASS ] ##$MEND $subtest"
+                       (( PASSED_COUNT += 1 ))
+               else
+                       echo -e "$MALLFAIL## [ FAIL ] ##$MEND $subtest"
+                       (( FAILED_COUNT += 1 ))
+               fi
+       else
+               echo; echo
+       fi
+done
+
+exit $FAILED_COUNT
-- 
1.8.3.1




--
To unsubscribe from this list: send the line "unsubscribe linux-perf-users" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to