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