1#!/bin/sh
2
3# $FreeBSD$
4
5usage()
6{
7    cat >&2 <<__EOF__
8A harness for test cases in the DTrace test suite.
9
10usage: $(basename $0) <testfile>
11__EOF__
12    exit 1
13}
14
15gettag()
16{
17    local tag
18
19    tag=$(basename $1)
20    tag=${tag#*.}
21    tag=${tag%%[a-z.]*}
22    echo $tag
23}
24
25runtest()
26{
27    local dflags exe exstatus pid retval status
28
29    exstatus=0
30    retval=0
31
32    case $TFILE in
33    drp.DTRACEDROP_*.d|err.*.d|tst.*.d)
34        case $TFILE in
35        drp.DTRACEDROP_*.d)
36            dflags="-x droptags"
37            tag=$(gettag "$TFILE")
38            ;;
39        err.D_*.d)
40            exstatus=1
41            dflags="-x errtags"
42            tag=$(gettag "$TFILE")
43            ;;
44        err.*.d)
45            exstatus=1
46            ;;
47        esac
48
49        exe=${TFILE%.*}.exe
50        if [ -f "$exe" -a -x "$exe" ]; then
51            ./$exe &
52            pid=$!
53            dflags="$dflags ${pid}"
54        fi
55
56        dtrace -C -s "${TFILE}" $dflags >$STDOUT 2>$STDERR
57        status=$?
58
59        if [ $status -ne $exstatus ]; then
60            ERRMSG="dtrace exited with status ${status}, expected ${exstatus}"
61            retval=1
62        elif [ -n "${tag}" ] && ! grep -Fq " [${tag}] " ${STDERR}; then
63            ERRMSG="dtrace's error output did not contain expected tag ${tag}"
64            retval=1
65        fi
66
67        if [ -n "$pid" ]; then
68            kill -0 $pid >/dev/null 2>&1 && kill -9 $pid >/dev/null 2>&1
69            wait
70        fi
71        ;;
72    err.*.ksh|tst.*.ksh)
73        expr "$TFILE" : 'err.*' >/dev/null && exstatus=1
74
75        tst=$TFILE ksh "$TFILE" /usr/sbin/dtrace >$STDOUT 2>$STDERR
76        status=$?
77
78        if [ $status -ne $exstatus ]; then
79            ERRMSG="script exited with status ${status}, expected ${exstatus}"
80            retval=1
81        fi
82        ;;
83    *)
84        ERRMSG="unexpected test file name $TFILE"
85        retval=1
86        ;;
87    esac
88
89    if [ $retval -eq 0 ] && \
90        head -n 1 $STDOUT | grep -q -E '^#!/.*ksh$'; then
91        ksh $STDOUT
92        retval=$?
93    fi
94
95    return $retval
96}
97
98[ $# -eq 1 ] || usage
99
100readonly STDERR=$(mktemp)
101readonly STDOUT=$(mktemp)
102readonly TFILE=$(basename $1)
103readonly EXOUT=${TFILE}.out
104
105kldstat -q -m dtrace_test || kldload dtrace_test
106cd $(dirname $1)
107runtest
108RESULT=$?
109
110if [ $RESULT -eq 0 -a -f $EXOUT -a -r $EXOUT ] && \
111   ! cmp $STDOUT $EXOUT >/dev/null 2>&1; then
112    ERRMSG="test output mismatch"
113    RESULT=1
114fi
115
116if [ $RESULT -ne 0 ]; then
117    echo "test $TFILE failed: $ERRMSG" >&2
118    if [ $(stat -f '%z' $STDOUT) -gt 0 ]; then
119        cat >&2 <<__EOF__
120test stdout:
121--
122$(cat $STDOUT)
123--
124__EOF__
125    fi
126    if [ $(stat -f '%z' $STDERR) -gt 0 ]; then
127        cat >&2 <<__EOF__
128test stderr:
129--
130$(cat $STDERR)
131--
132__EOF__
133    fi
134fi
135
136rm -f $STDERR $STDOUT
137exit $RESULT
138