blob: d2f3dc4ed8df7aa077a18840ca34994f7d9a0acf (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
#!/bin/sh
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
tst=$TFILE ksh -p "$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
if [ $retval -eq 0 ] && \
head -n 1 $STDOUT | grep -q -E '^#!/.*ksh$'; then
ksh -p $STDOUT
retval=$?
fi
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)
--
test stdout diff:
--
$(diff -u $EXOUT $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
|