systemtap/tests/Regression/testsuite-upstream-raw/runtest.sh

283 lines
12 KiB
Bash
Raw Normal View History

#!/bin/bash
# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# runtest.sh of /tools/systemtap/Regression/testsuite-upstream-raw
# Description: testsuite-upstream-raw
# Author: Martin Cermak <mcermak@redhat.com>
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
# Copyright (c) 2014 Red Hat, Inc.
#
# This program is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
# PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see http://www.gnu.org/licenses/.
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Include Beaker environment
. /usr/share/beakerlib/beakerlib.sh || exit 1
# What part of the testsuite should we run (and then check for errors)?
_WHAT=${_WHAT:-DEFAULT}
export AVC_ERROR='+no_avc_check'
touch /tmp/disable-qe-abrt
unset DEBUGINFOD_PROGRESS
if test $(rpm --eval "0%{rhel}") -ge 9; then
# Allow use of debuginfod
export DEBUGINFOD_URLS=http://debuginfod.usersys.redhat.com:3632/
# export DEBUGINFOD_PROGRESS=1
else
unset DEBUGINFOD_URLS
fi
trap '' SIGHUP SIGINT SIGQUIT SIGABRT
ORIGPWD=$( pwd )
PKGMGR="yum --skip-broken --nogpgcheck"
rpm -q dnf && PKGMGR="dnf --setopt=strict=0 --nogpgcheck"
STARTDATE=$(date +%Y-%m-%d-%H-%M-%S)
STAPSRPM=$(rpm -qif `which stap` | awk '/Source RPM/ {print $NF}' | sort -u | sed 's/\.src\.rpm//')
SUITERPM=$(rpm --queryformat '%{name}\n' -qf `which stap` | grep -o '.*systemtap' | sort -u)-testsuite
SUITELOC=$(rpm -ql $SUITERPM | grep -o '.*systemtap\/testsuite/' | sort -u)
test_primary_arch_only ()
{
echo "=== TESTING PRIMARY ARCH ONLY ==="
sed -i '/^proc arch_compile_flags/,/^}/d' $SUITELOC/lib/compile_flags.exp
echo 'proc arch_compile_flags {} { return 1 }' >> $SUITELOC/lib/compile_flags.exp
}
# For devtoolset, compat arch support was dropped for non-x86_64 arches. Ref: bz1493500
if echo $SUITELOC | grep -q toolset && arch | egrep -q '^(ppc64|s390x)$'; then
test_primary_arch_only
elif test $(rpm -E '0%{rhel}') -ge 8 -a "$(arch)" != "x86_64"; then
test_primary_arch_only
fi
# Currently the Makefile overrides what was set in the env via
# http://pkgs.devel.redhat.com/cgit/rpms/devtoolset-7/commit/?h=devtoolset-7.1-rhel-7&id=e305f5912a13bd2ca04ac319afca50bfab6f4aea
# And actually if the base rhel dyninst is installed, the dts testsuite runs against it rather than agains
# the dts-stap - producing irrelevant test results.
#
# A real fix on the stap side might be:
# -LD_LIBRARY_PATH=$(DESTDIR)$(libdir)/systemtap
# +LD_LIBRARY_PATH=$(DESTDIR)$(libdir)/systemtap:$(DESTDIR)$(libdir)/dyninst
# in the Makefile.am etc, but let's work this around for now in a way that we simply use the
# LD_LIBRARY_PATH taken directly from the env:
if echo $SUITELOC | grep -q toolset; then
sed -i 's/^LD_LIBRARY_PATH/# LD_LIBRARY_PATH/' $SUITELOC/Makefile
fi
rlJournalStart
rlPhaseStartSetup
rlLogInfo "SUITERPM=$SUITERPM"
rlLogInfo "SUITELOC=$SUITELOC"
rlRun "pushd $SUITELOC"
rlServiceStop firewalld
rlServiceStop iptables
rlServiceStop ip6tables
rlServiceStart avahi-daemon
rlRun "rpm -qa | grep ^kernel | grep -v `uname -r` | xargs rpm -e --nodeps" 0-255
# if ! (uname -r | fgrep -q '.rt'); then
# rlRun "$ORIGPWD/stap-prep" 0,127 || \
# rlRun "stap-prep" 0,127
# fi
rlRun "sysctl -w kernel.panic=1"
rlRun "sysctl -w kernel.panic_on_oops=1"
rlRun "$PKGMGR -y install --setopt=multilib_policy=all libstdc++ dejagnu elfutils-devel gettext libgcc glibc-devel gcc-c++ libstdc++-devel dyninst dyninst-devel"
rlPhaseEnd
MYDMESGDIR=/root/mydmesg
mkdir -p $MYDMESGDIR
if strings $(which dmesg) | fgrep -q -- '-w'; then
rlPhaseStart FAIL "Run dmesg recorder."
MYTIMESTAMP=$(date +%s)
dmesg -wH > $MYDMESGDIR/dmesg$MYTIMESTAMP &
MYDMESGPID=$!
rlLogInfo "Dmesg recorder file: $MYDMESGDIR/dmesg$MYTIMESTAMP"
rlLogInfo "Dmesg PID: $MYDMESGPID"
rlPhaseEnd
fi
rlPhaseStart FAIL "sanity check"
rlRun "stap -vve 'probe kernel.function(\"vfs_read\"){ log(\"hey!\"); exit() } probe timer.s(60){log(\"timeout\"); exit()}'"
rlRun "stap -vvl 'process(\"/usr/sbin/fdisk\").function(\"main\")'" 0-255
rlPhaseEnd
if ! test -f $SUITELOC/systemtap.log; then
rlPhaseStart WARN "Apply blacklist"
# === RHEL7 ===
if rlIsRHEL 7; then
if arch | grep -q s390; then
true
# PR17270
#rlRun "rm -f systemtap.onthefly/hrtimer_onthefly.exp"
#rlRun "rm -f systemtap.onthefly/uprobes_onthefly.exp"
#rlRun "rm -f systemtap.onthefly/kprobes_onthefly.exp"
# PR17140
#rlRun "rm -f systemtap.examples/profiling/functioncallcount.stp"
elif arch | grep -q ppc; then
true
# PR17270
#rlRun "rm -f systemtap.onthefly/hrtimer_onthefly.exp"
#rlRun "rm -f systemtap.onthefly/uprobes_onthefly.exp"
#rlRun "rm -f systemtap.onthefly/kprobes_onthefly.exp"
# PR17126
#rlRun "rm -f systemtap.base/tracepoints.exp"
# BZ1153082
#rlRun "rm -f systemtap.clone/main_quiesce.exp"
#elif rpm -q systemtap | grep -q '2.4-16.el7_0'; then
# BZ1145958
#rlRun "rm -f systemtap.base/process_resume.exp"
fi
# === FEDORA ===
elif grep -qi fedora /etc/redhat-release; then
# BZ1153082
rlRun "rm -f systemtap.clone/main_quiesce.exp"
fi
# Work around problem fixed in https://sourceware.org/git/gitweb.cgi?p=systemtap.git;a=commitdiff;h=a9b0aa4dbd1aa7a1c36eba8102e1445e8f2eb8b8
rlRun "sed -i 's/exit\ 0/return/' $(fgrep -ril 'exit 0' $(find . -type f -name '*.exp')) ||:"
rlPhaseEnd
else
rlPhaseStart FAIL "Post-process anticipated reboot"
# Sometimes the testsuite crashes the kernel or causes stall.
# In case --ignore-panic is set, the box gets rebooted (bz1155644).
# This shouldn't happen. It'd be nice to report it as FAIL, but that
# appears to be too pedantic. We'll need this bell to ring when
# too many unexpected failures get reported by the upstream test driver.
# rlRun "false"
# Remove testcases that have already been run
for tc in $( awk '/^Running.*exp\ \.\.\.$/ {print $2}' *systemtap.log ); do
echo $tc | grep -q 'systemtap/notest.exp' && continue
test -f $tc && rm -f $tc && rlLog "Removed $tc"
done
#generate random hash
HASH=$(date | md5sum | cut -c 1-32 -)
# save existing logs before creating new ones
rlRun "mv systemtap.log ${HASH}-systemtap.log"
rlRun "mv systemtap.sum ${HASH}-systemtap.sum"
# clean up garbage incl. systemtap.log
rlRun "make clean"
rlPhaseEnd
fi
rlPhaseStartTest
# Start internal watchdog if running in beaker
if test -n $JOBID; then
rlLogInfo "Starting internal watchdog ..."
$ORIGPWD/internal-watchdog.sh "$SUITELOC/systemtap.sum" &
__WATCHDOG_PID=$!
sleep 3
if ps -p $__WATCHDOG_PID; then
rlLogInfo "Internal watchdog running (pid $__WATCHDOG_PID)."
else
rlFail "Problem starting the internal watchdog."
fi
fi
# The _WHAT env var allows the test to only run selected subset of all
# the tests and perform specific checks on the resulting logs.
#
# Accepted values: BPF
# run the testsuite (grab the list of testcases from the respective check* file)
TESTCASES=$(bash ${ORIGPWD}/check_${_WHAT}.sh TCLIST)
rlRun "make RUNTESTFLAGS='$TESTCASES' installcheck 2>&1"
# Kill internal watchdog if running in beaker
if ! test -z $JOBID; then
rlLogInfo "Killing internal watchdog ..."
kill -s TERM $__WATCHDOG_PID
fi
rlPhaseEnd
rlPhaseStart FAIL "Put all the log fragments together"
rlRun "$ORIGPWD/dg-extract-results.sh *systemtap.sum > big-systemtap.sum"
rlRun "$ORIGPWD/dg-extract-results.sh -L *systemtap.log > big-systemtap.log"
rlRun "mv --force big-systemtap.sum systemtap.sum"
rlRun "mv --force big-systemtap.log systemtap.log"
# remove the hash-prefixed fragments
# these are needed for the resume mode, but since we got to this point,
# we most likely processed all the testcases somehow, put all the pieces
# together and can start cleaning up and reporting
rlRun "rm -f *-systemtap.{log,sum}"
rlPhaseEnd
rlPhaseStart FAIL "rlFileSubmit logs"
rlRun "xz --keep --force systemtap.log"
rlFileSubmit "systemtap.log.xz"
rlRun "xz --keep --force systemtap.sum"
rlFileSubmit "systemtap.sum.xz"
rlRun "rm systemtap.log.xz systemtap.sum.xz"
rlPhaseEnd
if [[ "$_WHAT" == "DEFAULT" ]]; then
rlPhaseStart FAIL "save logs to /mnt/scratch"
MP=$( mktemp -d )
# Refer to /tools/systemtap/Install/upstream-head
SD=rhpkg; rpm -q systemtap | grep -q mcermak && SD=upstream
rlRun "echo ${BEAKER}jobs/${JOBID} > job.txt"
rlRun "tar cf mydmesg.tar $MYDMESGDIR"
rlRun "xz mydmesg.tar"
rlRun "mount -o rw,nolock nfs.englab.brq.redhat.com:/scratch/mcermak $MP"
if test $(rpm --eval '0%{rhel}') -eq 8 && (! echo ${STAPSRPM} | grep '\.el8'); then
rlRun "LOGNAME=${MP}/testlogs/systemtap.${SD}/${STAPSRPM}.el8.$(uname -m)-${STARTDATE}"
else
rlRun "LOGNAME=${MP}/testlogs/systemtap.${SD}/${STAPSRPM}.$(uname -m)-${STARTDATE}"
fi
rlRun "mkdir -p $( dirname $LOGNAME )"
rlRun "tar cJf ${LOGNAME}.tar.xz systemtap.log systemtap.sum job.txt mydmesg.tar.xz"
# Upload logs to bunsen instance on tofan if running in beaker
if ! test -z $JOBID; then
LOGFULLNAME="${LOGNAME}.tar.xz"
LOGBASENAME="$(basename $LOGFULLNAME)"
rlLogInfo "Uploading test log to bunsen..."
rlRun "cat $LOGFULLNAME | \
curl -X POST -F project=systemtap-qe \
-F tarballname=$LOGBASENAME \
-F 'tar=@-' \
http://tofan.yyz.redhat.com:8013/bunsen-upload.py"
fi
rlRun "umount -l $MP && sleep 3 && rm -rf $MP"
rlPhaseEnd
fi
rlPhaseStart FAIL "Log checks ($_WHAT)"
rlRun "bash ${ORIGPWD}/check_${_WHAT}.sh"
rlPhaseEnd
rlPhaseStartCleanup
rlServiceRestore firewalld
rlServiceRestore iptables
rlServiceRestore ip6tables
rlServiceRestore avahi-daemon
rlRun popd
kill -9 $MYDMESGPID ||:
rlPhaseEnd
rlJournalPrintText
rlJournalEnd
rm -f /tmp/disable-qe-abrt