CI Gating: Add the python-probing testcase
Add tests/Regression/python-probing covering rhbz2027683. Also do minor updates to help the other tests behave correctly. Related: #2027683
This commit is contained in:
parent
6405633026
commit
4dfa7981ab
@ -2,6 +2,8 @@ summary: Setup task
|
|||||||
prepare:
|
prepare:
|
||||||
script: ./plans/ci/prepare/prepare.sh
|
script: ./plans/ci/prepare/prepare.sh
|
||||||
recommend:
|
recommend:
|
||||||
- koji
|
|
||||||
- bind-utils
|
- bind-utils
|
||||||
- avahi-tools
|
- avahi-tools
|
||||||
|
- systemtap
|
||||||
|
- kernel-devel
|
||||||
|
- kernel-debuginfo
|
||||||
|
@ -1,27 +1,9 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
export DEBUGINFOD_URLS="https://debuginfod.fedoraproject.org/ $DEBUGINFOD_URLS"
|
|
||||||
export DEBUGINFOD_TIMEOUT=300
|
|
||||||
|
|
||||||
# On Rawhide, the running kernel packages won't probably be avail in
|
|
||||||
# configured repos. Debuginfo isn't a problem, we access that using
|
|
||||||
# the debuginfod.
|
|
||||||
__install_deps ()
|
|
||||||
{
|
|
||||||
TMPD=$(mktemp -d)
|
|
||||||
pushd $TMPD
|
|
||||||
koji download-build --rpm kernel-`uname -r` --arch `uname -i`
|
|
||||||
koji download-build --rpm kernel-devel-`uname -r` --arch `uname -i`
|
|
||||||
koji download-build --rpm kernel-modules-`uname -r` --arch `uname -i`
|
|
||||||
dnf -y install kernel{,-devel,-modules}-`uname -r`.rpm
|
|
||||||
popd
|
|
||||||
rm -rf $TMPD
|
|
||||||
}
|
|
||||||
|
|
||||||
set -xe
|
set -xe
|
||||||
|
|
||||||
# Install needed packages
|
# Install needed packages
|
||||||
stap-prep || __install_deps
|
dnf -y install /usr/bin/stap-prep
|
||||||
stap-prep
|
stap-prep
|
||||||
|
|
||||||
# Report installed packages
|
# Report installed packages
|
||||||
|
20
tests/Regression/python-probing/list.stp
Executable file
20
tests/Regression/python-probing/list.stp
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/stap -v
|
||||||
|
/*
|
||||||
|
Example usage of the Python systemtap tapset to show a nested view of all
|
||||||
|
Python function calls (and returns) across the whole system.
|
||||||
|
|
||||||
|
Run this using
|
||||||
|
stap systemtap-example.stp
|
||||||
|
to instrument all Python processes on the system, or (for example) using
|
||||||
|
stap systemtap-example.stp -c COMMAND
|
||||||
|
to instrument a specific program (implemented in Python)
|
||||||
|
*/
|
||||||
|
probe python.function.entry
|
||||||
|
{
|
||||||
|
printf("%s => %s in %s:%d\n", thread_indent(1), funcname, filename, lineno);
|
||||||
|
}
|
||||||
|
|
||||||
|
probe python.function.return
|
||||||
|
{
|
||||||
|
printf("%s <= %s in %s:%d\n", thread_indent(-1), funcname, filename, lineno);
|
||||||
|
}
|
23
tests/Regression/python-probing/main.fmf
Normal file
23
tests/Regression/python-probing/main.fmf
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
summary: Systemtap static probes test
|
||||||
|
description: |
|
||||||
|
This test checks basic functionality of Python's systemtap static
|
||||||
|
probes. It runs list & top systemtap scripts (examples from the
|
||||||
|
python rpm) and then a python script using the "random" module.
|
||||||
|
Finally it checks that the "random" module is correctly listed in
|
||||||
|
the output of both systemtap scripts.
|
||||||
|
contact: Petr Splichal <psplicha@redhat.com>
|
||||||
|
component:
|
||||||
|
- python
|
||||||
|
- systemtap
|
||||||
|
test: ./runtest.sh
|
||||||
|
framework: beakerlib
|
||||||
|
recommend:
|
||||||
|
- python
|
||||||
|
- python-debuginfo
|
||||||
|
- systemtap
|
||||||
|
- python2
|
||||||
|
- python3
|
||||||
|
- elfutils
|
||||||
|
duration: 15m
|
||||||
|
extra-summary: /CoreOS/python/Sanity/systemtap
|
||||||
|
extra-task: /CoreOS/python/Sanity/systemtap
|
81
tests/Regression/python-probing/runtest.sh
Executable file
81
tests/Regression/python-probing/runtest.sh
Executable file
@ -0,0 +1,81 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
#
|
||||||
|
# runtest.sh of /CoreOS/python/Sanity/systemtap
|
||||||
|
# Description: Systemtap static probes test
|
||||||
|
# Author: Petr Splichal <psplicha@redhat.com>
|
||||||
|
#
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
#
|
||||||
|
# Copyright (c) 2011 Red Hat, Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# This copyrighted material is made available to anyone wishing
|
||||||
|
# to use, modify, copy, or redistribute it subject to the terms
|
||||||
|
# and conditions of the GNU General Public License version 2.
|
||||||
|
#
|
||||||
|
# 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, write to the Free
|
||||||
|
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
# Boston, MA 02110-1301, USA.
|
||||||
|
#
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
# Include rhts environment
|
||||||
|
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
||||||
|
|
||||||
|
# Packages to be tested
|
||||||
|
PACKAGES="${PACKAGES:-python3}"
|
||||||
|
# Other required packages
|
||||||
|
REQUIRES=${REQUIRES:-}
|
||||||
|
# Binary name parametrized
|
||||||
|
PYTHON="${PYTHON:-python3}"
|
||||||
|
|
||||||
|
package=$(rpm -qf --queryformat '%{name}\n' $(which $PYTHON))
|
||||||
|
collection_path=$(which python | sed 's/\/usr\/bin\/python//')
|
||||||
|
|
||||||
|
rlJournalStart
|
||||||
|
rlPhaseStartSetup
|
||||||
|
rlAssertRpm --all
|
||||||
|
rlAssertRpm "systemtap"
|
||||||
|
rlLogInfo "Running on kernel: $(uname -r)"
|
||||||
|
rlRun "rpm -qa 'systemtap*'" 0 "Checking systemtap packages"
|
||||||
|
rlRun "TmpDir=\`mktemp -d\`" 0 "Creating tmp directory"
|
||||||
|
rlRun "cp list.stp top.stp test.py $TmpDir" 0 "Copying scripts"
|
||||||
|
rlRun "pushd $TmpDir"
|
||||||
|
rlPhaseEnd
|
||||||
|
|
||||||
|
rlPhaseStartTest "Verifying ELF file for presence of .probes section"
|
||||||
|
for lib in ${collection_path}/usr/lib*/libpython*.so.* ; do
|
||||||
|
rlRun "eu-readelf -x .probes $lib" \
|
||||||
|
0 "Checking for .probes section within $lib"
|
||||||
|
done
|
||||||
|
rlPhaseEnd
|
||||||
|
|
||||||
|
# Note that typically you need to be root to run "stap" (or be within
|
||||||
|
# an appropriate group)
|
||||||
|
for script in list top; do
|
||||||
|
rlPhaseStartTest "Test $script"
|
||||||
|
rlRun "rm -rf ~/.systemtap/cache" 0 "Cleaning cache"
|
||||||
|
rlRun "stap $script.stp -v -c \"$PYTHON test.py\" > $script" \
|
||||||
|
0 "Testing with $script.stp"
|
||||||
|
rlRun "tail -100 $script | col -b" 0 "Inspecting output"
|
||||||
|
if ! rlRun "grep '/usr/lib.*python.*random.py' '$script'" \
|
||||||
|
0 "Checking for random in the $script output"; then
|
||||||
|
rlRun "stap $script.stp -vvv -c \"$PYTHON test.py\" > $script" \
|
||||||
|
0 "Running $script.stp once more in verbose mode"
|
||||||
|
fi
|
||||||
|
rlPhaseEnd
|
||||||
|
done
|
||||||
|
|
||||||
|
rlPhaseStartCleanup
|
||||||
|
rlRun "popd"
|
||||||
|
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
||||||
|
rlPhaseEnd
|
||||||
|
rlJournalPrintText
|
||||||
|
rlJournalEnd
|
3
tests/Regression/python-probing/test.py
Executable file
3
tests/Regression/python-probing/test.py
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
import random, time
|
||||||
|
print(random.random())
|
||||||
|
time.sleep(3)
|
21
tests/Regression/python-probing/top.stp
Executable file
21
tests/Regression/python-probing/top.stp
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/stap -v
|
||||||
|
|
||||||
|
global fn_calls;
|
||||||
|
|
||||||
|
probe python.function.entry
|
||||||
|
{
|
||||||
|
fn_calls[pid(), filename, funcname, lineno] += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
probe timer.ms(1000) {
|
||||||
|
printf("\033[2J\033[1;1H") /* clear screen */
|
||||||
|
printf("%6s %80s %6s %30s %6s\n",
|
||||||
|
"PID", "FILENAME", "LINE", "FUNCTION", "CALLS")
|
||||||
|
foreach ([pid, filename, funcname, lineno] in fn_calls- limit 1000) {
|
||||||
|
printf("%6d %80s %6d %30s %6d\n",
|
||||||
|
pid, filename, lineno, funcname,
|
||||||
|
fn_calls[pid, filename, funcname, lineno]);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete fn_calls;
|
||||||
|
}
|
@ -7,7 +7,6 @@ component:
|
|||||||
test: ./runtest.sh
|
test: ./runtest.sh
|
||||||
framework: beakerlib
|
framework: beakerlib
|
||||||
recommend:
|
recommend:
|
||||||
- koji
|
|
||||||
- systemtap
|
- systemtap
|
||||||
- kernel-devel
|
- kernel-devel
|
||||||
duration: 1h
|
duration: 1h
|
||||||
|
@ -4,11 +4,6 @@
|
|||||||
|
|
||||||
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
||||||
|
|
||||||
export DEBUGINFOD_URLS="https://debuginfod.fedoraproject.org/ $DEBUGINFOD_URLS"
|
|
||||||
export DEBUGINFOD_TIMEOUT=300
|
|
||||||
# export DEBUGINFOD_PROGRESS=1
|
|
||||||
|
|
||||||
|
|
||||||
rlJournalStart
|
rlJournalStart
|
||||||
rlPhaseStartTest
|
rlPhaseStartTest
|
||||||
rlRun "rpm -qa | egrep '^(kernel|systemtap)' | sort"
|
rlRun "rpm -qa | egrep '^(kernel|systemtap)' | sort"
|
||||||
|
Loading…
Reference in New Issue
Block a user