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