1280835Smarkj# $FreeBSD: stable/10/cddl/usr.sbin/dtrace/tests/tools/dtest.sh 313485 2017-02-09 21:54:18Z ngie $
2280835Smarkj
3280835Smarkjusage()
4280835Smarkj{
5280835Smarkj    cat >&2 <<__EOF__
6280835SmarkjA harness for test cases in the DTrace test suite.
7280835Smarkj
8280835Smarkjusage: $(basename $0) <testfile>
9280835Smarkj__EOF__
10280835Smarkj    exit 1
11280835Smarkj}
12280835Smarkj
13280835Smarkjgettag()
14280835Smarkj{
15280835Smarkj    local tag
16280835Smarkj
17280835Smarkj    tag=$(basename $1)
18280835Smarkj    tag=${tag#*.}
19280835Smarkj    tag=${tag%%[a-z.]*}
20280835Smarkj    echo $tag
21280835Smarkj}
22280835Smarkj
23280835Smarkjruntest()
24280835Smarkj{
25280835Smarkj    local dflags exe exstatus pid retval status
26280835Smarkj
27280835Smarkj    exstatus=0
28280835Smarkj    retval=0
29280835Smarkj
30280835Smarkj    case $TFILE in
31280835Smarkj    drp.DTRACEDROP_*.d|err.*.d|tst.*.d)
32280835Smarkj        case $TFILE in
33280835Smarkj        drp.DTRACEDROP_*.d)
34280835Smarkj            dflags="-x droptags"
35280835Smarkj            tag=$(gettag "$TFILE")
36280835Smarkj            ;;
37280835Smarkj        err.D_*.d)
38280835Smarkj            exstatus=1
39280835Smarkj            dflags="-x errtags"
40280835Smarkj            tag=$(gettag "$TFILE")
41280835Smarkj            ;;
42280835Smarkj        err.*.d)
43280835Smarkj            exstatus=1
44280835Smarkj            ;;
45280835Smarkj        esac
46280835Smarkj
47280835Smarkj        exe=${TFILE%.*}.exe
48280835Smarkj        if [ -f "$exe" -a -x "$exe" ]; then
49280835Smarkj            ./$exe &
50280835Smarkj            pid=$!
51280835Smarkj            dflags="$dflags ${pid}"
52280835Smarkj        fi
53280835Smarkj
54280835Smarkj        dtrace -C -s "${TFILE}" $dflags >$STDOUT 2>$STDERR
55280835Smarkj        status=$?
56280835Smarkj
57280835Smarkj        if [ $status -ne $exstatus ]; then
58280835Smarkj            ERRMSG="dtrace exited with status ${status}, expected ${exstatus}"
59280835Smarkj            retval=1
60280835Smarkj        elif [ -n "${tag}" ] && ! grep -Fq " [${tag}] " ${STDERR}; then
61280835Smarkj            ERRMSG="dtrace's error output did not contain expected tag ${tag}"
62280835Smarkj            retval=1
63280835Smarkj        fi
64280835Smarkj
65280835Smarkj        if [ -n "$pid" ]; then
66280835Smarkj            kill -0 $pid >/dev/null 2>&1 && kill -9 $pid >/dev/null 2>&1
67280835Smarkj            wait
68280835Smarkj        fi
69280835Smarkj        ;;
70280835Smarkj    err.*.ksh|tst.*.ksh)
71280835Smarkj        expr "$TFILE" : 'err.*' >/dev/null && exstatus=1
72280835Smarkj
73280835Smarkj        ksh "$TFILE" /usr/sbin/dtrace >$STDOUT 2>$STDERR
74280835Smarkj        status=$?
75280835Smarkj
76280835Smarkj        if [ $status -ne $exstatus ]; then
77280835Smarkj            ERRMSG="script exited with status ${status}, expected ${exstatus}"
78280835Smarkj            retval=1
79280835Smarkj        fi
80280835Smarkj        ;;
81280835Smarkj    *)
82280835Smarkj        ERRMSG="unexpected test file name $TFILE"
83280835Smarkj        retval=1
84280835Smarkj        ;;
85280835Smarkj    esac
86280835Smarkj
87280835Smarkj    return $retval
88280835Smarkj}
89280835Smarkj
90280835Smarkj[ $# -eq 1 ] || usage
91280835Smarkj
92280835Smarkjreadonly STDERR=$(mktemp)
93280835Smarkjreadonly STDOUT=$(mktemp)
94280835Smarkjreadonly TFILE=$(basename $1)
95280835Smarkjreadonly EXOUT=${TFILE}.out
96280835Smarkj
97280835Smarkjkldstat -q -m dtrace_test || kldload dtrace_test
98280835Smarkjcd $(dirname $1)
99280835Smarkjruntest
100280835SmarkjRESULT=$?
101280835Smarkj
102280835Smarkjif [ $RESULT -eq 0 -a -f $EXOUT -a -r $EXOUT ] && \
103280835Smarkj   ! cmp $STDOUT $EXOUT >/dev/null 2>&1; then
104280835Smarkj    ERRMSG="test output mismatch"
105280835Smarkj    RESULT=1
106280835Smarkjfi
107280835Smarkj
108280835Smarkjif [ $RESULT -ne 0 ]; then
109280835Smarkj    echo "test $TFILE failed: $ERRMSG" >&2
110280835Smarkj    if [ $(stat -f '%z' $STDOUT) -gt 0 ]; then
111280835Smarkj        cat >&2 <<__EOF__
112280835Smarkjtest stdout:
113280835Smarkj--
114280835Smarkj$(cat $STDOUT)
115280835Smarkj--
116280835Smarkj__EOF__
117280835Smarkj    fi
118280835Smarkj    if [ $(stat -f '%z' $STDERR) -gt 0 ]; then
119280835Smarkj        cat >&2 <<__EOF__
120280835Smarkjtest stderr:
121280835Smarkj--
122280835Smarkj$(cat $STDERR)
123280835Smarkj--
124280835Smarkj__EOF__
125280835Smarkj    fi
126280835Smarkjfi
127280835Smarkj
128280835Smarkjrm -f $STDERR $STDOUT
129280835Smarkjexit $RESULT
130