xref: /freebsd/cddl/usr.sbin/dtrace/tests/tools/dtest.sh (revision cb6b5e8ab9cfe3938855826fa3de0f58dacd364e)
1288ebd81SLi-Wen Hsu#!/bin/sh
2288ebd81SLi-Wen Hsu
341aeaf2aSMark Johnstonusage()
441aeaf2aSMark Johnston{
541aeaf2aSMark Johnston    cat >&2 <<__EOF__
641aeaf2aSMark JohnstonA harness for test cases in the DTrace test suite.
741aeaf2aSMark Johnston
841aeaf2aSMark Johnstonusage: $(basename $0) <testfile>
941aeaf2aSMark Johnston__EOF__
1041aeaf2aSMark Johnston    exit 1
1141aeaf2aSMark Johnston}
1241aeaf2aSMark Johnston
1341aeaf2aSMark Johnstongettag()
1441aeaf2aSMark Johnston{
1541aeaf2aSMark Johnston    local tag
1641aeaf2aSMark Johnston
1741aeaf2aSMark Johnston    tag=$(basename $1)
1841aeaf2aSMark Johnston    tag=${tag#*.}
1941aeaf2aSMark Johnston    tag=${tag%%[a-z.]*}
2041aeaf2aSMark Johnston    echo $tag
2141aeaf2aSMark Johnston}
2241aeaf2aSMark Johnston
2341aeaf2aSMark Johnstonruntest()
2441aeaf2aSMark Johnston{
2541aeaf2aSMark Johnston    local dflags exe exstatus pid retval status
2641aeaf2aSMark Johnston
2741aeaf2aSMark Johnston    exstatus=0
2841aeaf2aSMark Johnston    retval=0
2941aeaf2aSMark Johnston
3041aeaf2aSMark Johnston    case $TFILE in
3141aeaf2aSMark Johnston    drp.DTRACEDROP_*.d|err.*.d|tst.*.d)
3241aeaf2aSMark Johnston        case $TFILE in
3341aeaf2aSMark Johnston        drp.DTRACEDROP_*.d)
3441aeaf2aSMark Johnston            dflags="-x droptags"
3541aeaf2aSMark Johnston            tag=$(gettag "$TFILE")
3641aeaf2aSMark Johnston            ;;
3741aeaf2aSMark Johnston        err.D_*.d)
3841aeaf2aSMark Johnston            exstatus=1
3941aeaf2aSMark Johnston            dflags="-x errtags"
4041aeaf2aSMark Johnston            tag=$(gettag "$TFILE")
4141aeaf2aSMark Johnston            ;;
4241aeaf2aSMark Johnston        err.*.d)
4341aeaf2aSMark Johnston            exstatus=1
4441aeaf2aSMark Johnston            ;;
4541aeaf2aSMark Johnston        esac
4641aeaf2aSMark Johnston
4741aeaf2aSMark Johnston        exe=${TFILE%.*}.exe
4841aeaf2aSMark Johnston        if [ -f "$exe" -a -x "$exe" ]; then
4941aeaf2aSMark Johnston            ./$exe &
5041aeaf2aSMark Johnston            pid=$!
5141aeaf2aSMark Johnston            dflags="$dflags ${pid}"
5241aeaf2aSMark Johnston        fi
5341aeaf2aSMark Johnston
5441aeaf2aSMark Johnston        dtrace -C -s "${TFILE}" $dflags >$STDOUT 2>$STDERR
5541aeaf2aSMark Johnston        status=$?
5641aeaf2aSMark Johnston
5741aeaf2aSMark Johnston        if [ $status -ne $exstatus ]; then
5841aeaf2aSMark Johnston            ERRMSG="dtrace exited with status ${status}, expected ${exstatus}"
5941aeaf2aSMark Johnston            retval=1
6041aeaf2aSMark Johnston        elif [ -n "${tag}" ] && ! grep -Fq " [${tag}] " ${STDERR}; then
6141aeaf2aSMark Johnston            ERRMSG="dtrace's error output did not contain expected tag ${tag}"
6241aeaf2aSMark Johnston            retval=1
6341aeaf2aSMark Johnston        fi
6441aeaf2aSMark Johnston
6541aeaf2aSMark Johnston        if [ -n "$pid" ]; then
6641aeaf2aSMark Johnston            kill -0 $pid >/dev/null 2>&1 && kill -9 $pid >/dev/null 2>&1
6741aeaf2aSMark Johnston            wait
6841aeaf2aSMark Johnston        fi
6941aeaf2aSMark Johnston        ;;
7041aeaf2aSMark Johnston    err.*.ksh|tst.*.ksh)
7141aeaf2aSMark Johnston        expr "$TFILE" : 'err.*' >/dev/null && exstatus=1
7241aeaf2aSMark Johnston
73e25922b3SMark Johnston        tst=$TFILE ksh -p "$TFILE" /usr/sbin/dtrace >$STDOUT 2>$STDERR
7441aeaf2aSMark Johnston        status=$?
7541aeaf2aSMark Johnston
7641aeaf2aSMark Johnston        if [ $status -ne $exstatus ]; then
7741aeaf2aSMark Johnston            ERRMSG="script exited with status ${status}, expected ${exstatus}"
7841aeaf2aSMark Johnston            retval=1
7941aeaf2aSMark Johnston        fi
8041aeaf2aSMark Johnston        ;;
8141aeaf2aSMark Johnston    *)
8241aeaf2aSMark Johnston        ERRMSG="unexpected test file name $TFILE"
8341aeaf2aSMark Johnston        retval=1
8441aeaf2aSMark Johnston        ;;
8541aeaf2aSMark Johnston    esac
8641aeaf2aSMark Johnston
87288ebd81SLi-Wen Hsu    if [ $retval -eq 0 ] && \
88288ebd81SLi-Wen Hsu        head -n 1 $STDOUT | grep -q -E '^#!/.*ksh$'; then
89e25922b3SMark Johnston        ksh -p $STDOUT
90288ebd81SLi-Wen Hsu        retval=$?
91288ebd81SLi-Wen Hsu    fi
92288ebd81SLi-Wen Hsu
9341aeaf2aSMark Johnston    return $retval
9441aeaf2aSMark Johnston}
9541aeaf2aSMark Johnston
9641aeaf2aSMark Johnston[ $# -eq 1 ] || usage
9741aeaf2aSMark Johnston
9841aeaf2aSMark Johnstonreadonly STDERR=$(mktemp)
9941aeaf2aSMark Johnstonreadonly STDOUT=$(mktemp)
10041aeaf2aSMark Johnstonreadonly TFILE=$(basename $1)
10141aeaf2aSMark Johnstonreadonly EXOUT=${TFILE}.out
10241aeaf2aSMark Johnston
103*cb6b5e8aSMark Johnstonkldload -n dtrace_test
10441aeaf2aSMark Johnstoncd $(dirname $1)
10541aeaf2aSMark Johnstonruntest
10641aeaf2aSMark JohnstonRESULT=$?
10741aeaf2aSMark Johnston
10841aeaf2aSMark Johnstonif [ $RESULT -eq 0 -a -f $EXOUT -a -r $EXOUT ] && \
10941aeaf2aSMark Johnston   ! cmp $STDOUT $EXOUT >/dev/null 2>&1; then
11041aeaf2aSMark Johnston    ERRMSG="test output mismatch"
11141aeaf2aSMark Johnston    RESULT=1
11241aeaf2aSMark Johnstonfi
11341aeaf2aSMark Johnston
11441aeaf2aSMark Johnstonif [ $RESULT -ne 0 ]; then
11541aeaf2aSMark Johnston    echo "test $TFILE failed: $ERRMSG" >&2
11641aeaf2aSMark Johnston    if [ $(stat -f '%z' $STDOUT) -gt 0 ]; then
11741aeaf2aSMark Johnston        cat >&2 <<__EOF__
11841aeaf2aSMark Johnstontest stdout:
11941aeaf2aSMark Johnston--
12041aeaf2aSMark Johnston$(cat $STDOUT)
12141aeaf2aSMark Johnston--
122a61d2c7fSMark Johnstontest stdout diff:
123a61d2c7fSMark Johnston--
124a61d2c7fSMark Johnston$(diff -u $EXOUT $STDOUT)
125a61d2c7fSMark Johnston--
12641aeaf2aSMark Johnston__EOF__
12741aeaf2aSMark Johnston    fi
12841aeaf2aSMark Johnston    if [ $(stat -f '%z' $STDERR) -gt 0 ]; then
12941aeaf2aSMark Johnston        cat >&2 <<__EOF__
13041aeaf2aSMark Johnstontest stderr:
13141aeaf2aSMark Johnston--
13241aeaf2aSMark Johnston$(cat $STDERR)
13341aeaf2aSMark Johnston--
13441aeaf2aSMark Johnston__EOF__
13541aeaf2aSMark Johnston    fi
13641aeaf2aSMark Johnstonfi
13741aeaf2aSMark Johnston
13841aeaf2aSMark Johnstonrm -f $STDERR $STDOUT
13941aeaf2aSMark Johnstonexit $RESULT
140