diff options
Diffstat (limited to 'cddl/usr.sbin/dtrace/tests/tools')
-rwxr-xr-x | cddl/usr.sbin/dtrace/tests/tools/dtest.sh | 129 | ||||
-rwxr-xr-x | cddl/usr.sbin/dtrace/tests/tools/exclude.sh | 194 | ||||
-rwxr-xr-x | cddl/usr.sbin/dtrace/tests/tools/genmakefiles.sh | 85 | ||||
-rwxr-xr-x | cddl/usr.sbin/dtrace/tests/tools/gentest.sh | 110 |
4 files changed, 518 insertions, 0 deletions
diff --git a/cddl/usr.sbin/dtrace/tests/tools/dtest.sh b/cddl/usr.sbin/dtrace/tests/tools/dtest.sh new file mode 100755 index 0000000..e60837b --- /dev/null +++ b/cddl/usr.sbin/dtrace/tests/tools/dtest.sh @@ -0,0 +1,129 @@ +# $FreeBSD$ + +usage() +{ + cat >&2 <<__EOF__ +A harness for test cases in the DTrace test suite. + +usage: $(basename $0) <testfile> +__EOF__ + exit 1 +} + +gettag() +{ + local tag + + tag=$(basename $1) + tag=${tag#*.} + tag=${tag%%[a-z.]*} + echo $tag +} + +runtest() +{ + local dflags exe exstatus pid retval status + + exstatus=0 + retval=0 + + case $TFILE in + drp.DTRACEDROP_*.d|err.*.d|tst.*.d) + case $TFILE in + drp.DTRACEDROP_*.d) + dflags="-x droptags" + tag=$(gettag "$TFILE") + ;; + err.D_*.d) + exstatus=1 + dflags="-x errtags" + tag=$(gettag "$TFILE") + ;; + err.*.d) + exstatus=1 + ;; + esac + + exe=${TFILE%.*}.exe + if [ -f "$exe" -a -x "$exe" ]; then + ./$exe & + pid=$! + dflags="$dflags ${pid}" + fi + + dtrace -C -s "${TFILE}" $dflags >$STDOUT 2>$STDERR + status=$? + + if [ $status -ne $exstatus ]; then + ERRMSG="dtrace exited with status ${status}, expected ${exstatus}" + retval=1 + elif [ -n "${tag}" ] && ! grep -Fq " [${tag}] " ${STDERR}; then + ERRMSG="dtrace's error output did not contain expected tag ${tag}" + retval=1 + fi + + if [ -n "$pid" ]; then + kill -0 $pid >/dev/null 2>&1 && kill -9 $pid >/dev/null 2>&1 + wait + fi + ;; + err.*.ksh|tst.*.ksh) + expr "$TFILE" : 'err.*' >/dev/null && exstatus=1 + + ksh "$TFILE" /usr/sbin/dtrace >$STDOUT 2>$STDERR + status=$? + + if [ $status -ne $exstatus ]; then + ERRMSG="script exited with status ${status}, expected ${exstatus}" + retval=1 + fi + ;; + *) + ERRMSG="unexpected test file name $TFILE" + retval=1 + ;; + esac + + return $retval +} + +[ $# -eq 1 ] || usage + +readonly STDERR=$(mktemp) +readonly STDOUT=$(mktemp) +readonly TFILE=$(basename $1) +readonly EXOUT=${TFILE}.out + +kldstat -q -m dtrace_test || kldload dtrace_test +cd $(dirname $1) +runtest +RESULT=$? + +if [ $RESULT -eq 0 -a -f $EXOUT -a -r $EXOUT ] && \ + ! cmp $STDOUT $EXOUT >/dev/null 2>&1; then + ERRMSG="test output mismatch" + RESULT=1 +fi + +if [ $RESULT -ne 0 ]; then + echo "test $TFILE failed: $ERRMSG" >&2 + if [ $(stat -f '%z' $STDOUT) -gt 0 ]; then + cat >&2 <<__EOF__ +test stdout: +-- +$(cat $STDOUT) +-- +__EOF__ + fi + if [ $(stat -f '%z' $STDERR) -gt 0 ]; then + cat >&2 <<__EOF__ +test stderr: +-- +$(cat $STDERR) +-- +__EOF__ + fi +fi + +rm -f $STDERR $STDOUT +exit $RESULT diff --git a/cddl/usr.sbin/dtrace/tests/tools/exclude.sh b/cddl/usr.sbin/dtrace/tests/tools/exclude.sh new file mode 100755 index 0000000..a42773d --- /dev/null +++ b/cddl/usr.sbin/dtrace/tests/tools/exclude.sh @@ -0,0 +1,194 @@ +# $FreeBSD$ + +# This file lists DTrace tests which are known to fail or hang/crash the +# system. They were pulled from the legacy DTrace test infrastructure in +# tools/tests/dtrace and may be out of date. +# +# Tests are listed here generally because one or more of the following is true: +# +# 1) The test is broken (usually because it assumes it's running on Solaris and +# the test encodes some sort of Solarisism). +# 2) The functionality being tested is buggy (often but not always the result +# of a FreeBSD-specific bug). +# 3) The test relies on DTrace functionality that's not yet available in FreeBSD +# (e.g. tests for a specific SDT provider that we don't have). +# +# An end goal is to remove this file, concentrating first on instances of +# 1) and 2). +# +# The SKIP variable contains tests that should not be executed at all. The +# EXFAIL variable contains tests that are expected to fail when run. Please +# avoid adding tests to SKIP unless it really is necessary; with EXFAIL, tests +# that begin passing as the result of a change are visible in the test summary. + +exclude() +{ + eval $1=\"\$$1\\n$2\" +} + +exclude EXFAIL common/aggs/tst.subr.d +exclude EXFAIL common/dtraceUtil/tst.DataModel32.d.ksh +exclude EXFAIL common/dtraceUtil/tst.ELFGenerationOut.d.ksh +exclude EXFAIL common/dtraceUtil/tst.ELFGenerationWithO.d.ksh +exclude EXFAIL common/funcs/tst.copyin.d +exclude EXFAIL common/funcs/tst.copyinto.d +exclude EXFAIL common/funcs/tst.ddi_pathname.d +exclude EXFAIL common/io/tst.fds.d +exclude EXFAIL common/ip/tst.ipv4localudp.ksh +exclude EXFAIL common/mdb/tst.dtracedcmd.ksh +exclude EXFAIL common/misc/tst.dofmax.ksh +exclude EXFAIL common/misc/tst.include.ksh +exclude EXFAIL common/pragma/tst.libchain.ksh +exclude EXFAIL common/safety/tst.copyin2.d +exclude EXFAIL common/safety/tst.msgdsize.d +exclude EXFAIL common/safety/tst.msgsize.d +exclude EXFAIL common/safety/tst.zonename.d +exclude EXFAIL common/scalars/tst.misc.d +exclude EXFAIL common/scalars/tst.selfarray2.d +exclude EXFAIL common/sched/tst.enqueue.d +exclude EXFAIL common/speculation/tst.SpecSizeVariations3.d +exclude EXFAIL common/tracemem/err.D_TRACEMEM_ADDR.badaddr.d +exclude EXFAIL common/translators/tst.TestTransStability2.ksh +exclude EXFAIL common/types/tst.struct.d +exclude EXFAIL common/types/tst.typedef.d + +# We don't have a cpc provider. +exclude SKIP common/cpc/err.D_PDESC_ZERO.lowfrequency.d +exclude SKIP common/cpc/err.D_PDESC_ZERO.malformedoverflow.d +exclude SKIP common/cpc/err.D_PDESC_ZERO.nonexistentevent.d +exclude SKIP common/cpc/err.cpcvscpustatpart1.ksh +exclude SKIP common/cpc/err.cpcvscpustatpart2.ksh +exclude SKIP common/cpc/err.cputrackfailtostart.ksh +exclude SKIP common/cpc/err.cputrackterminates.ksh +exclude SKIP common/cpc/err.toomanyenablings.d +exclude SKIP common/cpc/tst.allcpus.ksh +exclude SKIP common/cpc/tst.genericevent.d +exclude SKIP common/cpc/tst.platformevent.ksh + +# We don't have a mib provider. +exclude EXFAIL common/mib/tst.icmp.ksh +exclude EXFAIL common/mib/tst.tcp.ksh +exclude EXFAIL common/mib/tst.udp.ksh + +# At the moment dtrace(1) always needs to run as root. +exclude SKIP common/privs/tst.fds.ksh +exclude SKIP common/privs/tst.func_access.ksh +exclude SKIP common/privs/tst.getf.ksh +exclude SKIP common/privs/tst.op_access.ksh +exclude SKIP common/privs/tst.procpriv.ksh +exclude SKIP common/privs/tst.providers.ksh +exclude SKIP common/privs/tst.unpriv_funcs.ksh + +# These tests hang for reasons unknown. +exclude SKIP common/buffering/tst.ring3.d +exclude SKIP common/funcs/tst.chill.ksh +exclude SKIP common/funcs/tst.index.d + +# No Java support at the moment. +exclude EXFAIL common/java_api/tst.Abort.ksh +exclude EXFAIL common/java_api/tst.Bean.ksh +exclude EXFAIL common/java_api/tst.Close.ksh +exclude EXFAIL common/java_api/tst.Drop.ksh +exclude EXFAIL common/java_api/tst.Enable.ksh +exclude EXFAIL common/java_api/tst.FunctionLookup.ksh +exclude EXFAIL common/java_api/tst.GetAggregate.ksh +exclude EXFAIL common/java_api/tst.MaxConsumers.ksh +exclude EXFAIL common/java_api/tst.MultiAggPrinta.ksh +exclude EXFAIL common/java_api/tst.ProbeData.ksh +exclude EXFAIL common/java_api/tst.ProbeDescription.ksh +exclude EXFAIL common/java_api/tst.StateMachine.ksh +exclude EXFAIL common/java_api/tst.StopLock.ksh + +# Expects specific formatting from banner(6). +exclude EXFAIL common/aggs/tst.aggpackbanner.ksh + +# Test assumes we're running on a Solaris kernel. +exclude EXFAIL common/misc/tst.roch.d +exclude EXFAIL common/predicates/tst.argsnotcached.d +exclude EXFAIL common/safety/tst.vahole.d + +# Tests that depend on the plockstat provider. +exclude EXFAIL common/plockstat/tst.available.d +exclude EXFAIL common/plockstat/tst.libmap.d +exclude EXFAIL common/usdt/tst.andpid.ksh + +# Depends on java. +exclude SKIP common/drops/drp.DTRACEDROP_STKSTROVERFLOW.d + +# Interrupt priority isn't relevant on FreeBSD. +exclude SKIP common/builtinvar/tst.ipl.d +exclude SKIP common/builtinvar/tst.ipl1.d + +# These tests rely on being able to find a host via broadcast pings. +exclude EXFAIL common/ip/tst.ipv4remotetcp.ksh +exclude EXFAIL common/ip/tst.ipv4remoteudp.ksh +exclude EXFAIL common/ip/tst.ipv6remoteicmp.ksh +exclude EXFAIL common/ip/tst.ipv4remoteicmp.ksh + +# FreeBSD never places tcpcbs in the TIME_WAIT state, so the probe never fires. +exclude EXFAIL common/ip/tst.localtcpstate.ksh +exclude EXFAIL common/ip/tst.remotetcpstate.ksh + +# Depends on the number of probes in /bin/sh and the current DOF limit. +exclude EXFAIL common/pid/err.D_PROC_CREATEFAIL.many.d + +# Tries to enable pid$target:libc::entry, though there's no "libc" module. +# Currently unsure as to whether this might be a libproc bug. +exclude EXFAIL common/pid/tst.probemod.ksh + +# Assumes date(1) has a pid$target::main:return probe. +exclude EXFAIL common/pid/tst.newprobes.ksh + +# libproc+librtld_db don't handle dlopen(2) yet. +exclude EXFAIL common/pid/tst.provregex2.ksh +exclude EXFAIL common/pid/tst.provregex4.ksh + +# libproc doesn't properly handle probe sites that correspond to multiple +# symbols. +exclude EXFAIL common/pid/tst.weak1.d +exclude EXFAIL common/pid/tst.weak2.d + +# This test checks for a leading tab on a line before #define. That is illegal +# on Solaris, but the clang pre-processor on FreeBSD is happy with code like +# that. +exclude EXFAIL common/preprocessor/err.D_PRAGCTL_INVAL.tabdefine.d + +# This test uses proc:::signal-handle, which we don't appear to have. +exclude EXFAIL common/proc/tst.signal.ksh + +# This test uses proc:::lwp-start, which we don't appear to have. +exclude EXFAIL common/proc/tst.startexit.ksh + +# This test causes a panic at the moment because fbt instruments the lock class' +# lc_owned method. +exclude SKIP common/safety/tst.rw.d + +# Depends on some implementation details of the runtime linker. +exclude EXFAIL common/vars/tst.ucaller.ksh + +# These rely on process attributes that FreeBSD doesn't carry. +exclude EXFAIL common/scripting/tst.projid.ksh +exclude EXFAIL common/scripting/tst.taskid.ksh + +# This test expects its test program to be installed without CTF data, but +# the rest of the programs for this feature need CTF data. Not yet sure how +# to build that. +exclude EXFAIL common/uctf/tst.libtype.ksh + +# libproc doesn't have linkmap support yet. +exclude EXFAIL common/uctf/tst.linkmap.ksh + +# Uses Sun-specific compiler options. +exclude EXFAIL common/usdt/tst.badguess.ksh +exclude EXFAIL common/usdt/tst.guess32.ksh +exclude EXFAIL common/usdt/tst.guess64.ksh + +# Generated headers include <sys/sdt.h>, so _DTRACE_VERSION is always defined. +exclude EXFAIL common/usdt/tst.nodtrace.ksh + +# The second dtrace -G invocation returns an error with "no probes found," which +# makes sense to me. Not yet sure what the expected behaviour is here. +exclude EXFAIL common/usdt/tst.static2.ksh + +# Uses the Solaris-specific ppriv(1). +exclude EXFAIL common/usdt/tst.user.ksh diff --git a/cddl/usr.sbin/dtrace/tests/tools/genmakefiles.sh b/cddl/usr.sbin/dtrace/tests/tools/genmakefiles.sh new file mode 100755 index 0000000..bf0e181 --- /dev/null +++ b/cddl/usr.sbin/dtrace/tests/tools/genmakefiles.sh @@ -0,0 +1,85 @@ +# $FreeBSD$ + +usage() +{ + cat <<__EOF__ >&2 +usage: $(basename $0) + +This script regenerates the DTrace test suite makefiles. It should be run +whenever \$srcdir/cddl/contrib/opensolaris/cmd/dtrace/test/tst is modified. +__EOF__ + exit 1 +} + +# Format a file list for use in a make(1) variable assignment: take the +# basename of each input file and append " \" to it. +fmtflist() +{ + awk 'function bn(f) { + sub(".*/", "", f) + return f + } + {print " ", bn($1), " \\"}' +} + +genmakefile() +{ + local basedir=$1 + + local tdir=${CONTRIB_TESTDIR}/${basedir} + local tfiles=$(find $tdir -type f -a \ + \( -name \*.d -o -name \*.ksh -o -name \*.out \) | sort | fmtflist) + local tcfiles=$(find $tdir -type f -a -name \*.c | sort | fmtflist) + local texes=$(find $tdir -type f -a -name \*.exe | sort | fmtflist) + + # One-off variable definitions. + local special + if [ "$basedir" = proc ]; then + special=" +LDADD.tst.sigwait.exe+= -lrt +DPADD.tst.sigwait.exe+= \${LIBRT} +" + elif [ "$basedir" = uctf ]; then + special=" +WITH_CTF=YES +" + fi + + local makefile=$(mktemp) + cat <<__EOF__ > $makefile +# \$FreeBSD$ + +# +# This Makefile was generated by \$srcdir${ORIGINDIR#${TOPDIR}}/genmakefiles.sh. +# + +TESTFILES= \\ +$tfiles + +TESTEXES= \\ +$texes + +CFILES= \\ +$tcfiles + +$special +.include "../../Makefile.inc1" +__EOF__ + + mv -f $makefile ${ORIGINDIR}/../common/${basedir}/Makefile +} + +set -e + +if [ $# -ne 0 ]; then + usage +fi + +readonly ORIGINDIR=$(realpath $(dirname $0)) +readonly TOPDIR=$(realpath ${ORIGINDIR}/../../../../..) +readonly CONTRIB_TESTDIR=${TOPDIR}/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common + +# Generate a Makefile for each test group under common/. +for dir in $(find ${CONTRIB_TESTDIR} -mindepth 1 -maxdepth 1 -type d); do + genmakefile $(basename $dir) +done diff --git a/cddl/usr.sbin/dtrace/tests/tools/gentest.sh b/cddl/usr.sbin/dtrace/tests/tools/gentest.sh new file mode 100755 index 0000000..9c34b79 --- /dev/null +++ b/cddl/usr.sbin/dtrace/tests/tools/gentest.sh @@ -0,0 +1,110 @@ +# $FreeBSD$ + +usage() +{ + cat <<__EOF__ >&2 +Generate ATF test cases from a set of DTrace tests. + +usage: sh $(basename $0) [-e <excludes>] <category> [<testfiles>] + + excludes: A shell script which defines test cases that are to be skipped, + or aren't expected to pass. + category: The test category, in the form of <arch>/<feature>. For example, + "common/aggs" is the test category for D aggregations. + testfiles: The test files for the tests in the specified category. +__EOF__ + exit 1 +} + +gentestcase() +{ + local mod tcase tfile + + tfile=$1 + tcase=$2 + mod=$3 + + cat <<__EOF__ +atf_test_case $tcase +${tcase}_head() +{ + atf_set 'descr' 'DTrace test ${CATEGORY}/${tfile}' +} +${tcase}_body() +{ + $mod + atf_check -s exit:0 -o empty -e empty \\ + "\$(atf_get_srcdir)/../../dtest" "\$(atf_get_srcdir)/${tfile}" +} +__EOF__ +} + +gentestcases() +{ + local mod tcase tfile tfiles + + eval tfiles=\$$1 + mod=$2 + + for tfile in ${tfiles}; do + case $tfile in + drp.*.d|err.*.d|tst.*.d|*.ksh) + # Test names need to be mangled for ATF. + tcase=$(echo "$tfile" | tr '.-' '_') + gentestcase "$tfile" "$tcase" "$mod" + TCASES="$TCASES $tcase" + ;; + esac + done +} + +set -e + +# +# Parse arguments. +# +case $1 in +-e) + shift; EXCLUDES=$1; shift + ;; +esac + +CATEGORY=$1 +shift +if ! expr "$CATEGORY" : '[^/]*/[^/]*' >/dev/null 2>&1; then + usage +fi +FEATURE=$(basename ${CATEGORY}) +ARCH=$(dirname ${CATEGORY}) + +# +# Remove skipped tests and expected failures from the main test list. +# +. $EXCLUDES +EXFAILS=$(echo -e "$EXFAIL" | grep "^${CATEGORY}/" | xargs basename -a) +SKIPS=$(echo -e "$SKIP" | grep "^${CATEGORY}/" | xargs basename -a) + +FILELIST=$(mktemp) +trap 'rm -f $FILELIST' EXIT + +echo "$@" | tr ' ' '\n' | xargs basename -a | sort > ${FILELIST} +TFILES=$(printf '%s\n%s' "$EXFAILS" "$SKIPS" | sort | comm -13 /dev/stdin $FILELIST) + +# +# Generate test cases. +# +gentestcases SKIPS "atf_skip \"test may hang or cause system instability\"" +gentestcases EXFAILS "atf_expect_fail \"test is known to fail\"" +gentestcases TFILES + +# +# Generate the test init function. +# +cat <<__EOF__ +atf_init_test_cases() +{ +$(for tcase in ${TCASES}; do echo " atf_add_test_case $tcase"; done) +} +__EOF__ + +rm -f $FILELIST |