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