1 #!/bin/bash 2 # 3 # This file and its contents are supplied under the terms of the 4 # Common Development and Distribution License ("CDDL"), version 1.0. 5 # You may only use this file in accordance with the terms of version 6 # 1.0 of the CDDL. 7 # 8 # A full copy of the text of the CDDL should have accompanied this 9 # source. A copy of the CDDL is also available via the Internet at 10 # http://www.illumos.org/license/CDDL. 11 # 12 13 # 14 # Copyright 2012 (c), Joyent, Inc. 15 # 16 17 # 18 # mdb test driver 19 # 20 unalias -a 21 shopt -s xpg_echo 22 #set -o xtrace 23 24 mt_arg0=$(basename $0) 25 mt_ksh="/usr/bin/ksh" 26 mt_mdb="/usr/bin/mdb" 27 mt_outdir= 28 mt_keep= 29 mt_all= 30 mt_tests= 31 mt_tnum=0 32 mt_tfail=0 33 mt_tsuc=0 34 35 function usage 36 { 37 local msg="$*" 38 [[ -z "$msg" ]] || echo "$msg" 2>&1 39 cat <<USAGE >&2 40 Usage: $mt_arg0 [ -o dir ] [ -k ] [ -m executable ] [ -a | test ... ] 41 42 -o dir Sets 'dir' as the output directory 43 -a Runs all tests, ignores tests passed in 44 -k Keep output from all tests, not just failures 45 -m mdb binary to test 46 USAGE 47 exit 2 48 } 49 50 function fatal 51 { 52 local msg="$*" 53 [[ -z "$msg" ]] && msg="failed" 54 echo "$mt_arg0: $msg" >&2 55 exit 1 56 } 57 58 function setup_outdir 59 { 60 mt_outdir="$mt_outdir/$mt_arg0.$$" 61 mkdir -p $mt_outdir || fatal "failed to make output dir $mt_outdir" 62 } 63 64 function run_single 65 { 66 local name=$1 67 local expect base ext exe command odir res reason input 68 69 [[ -z "$name" ]] && fail "missing test to run" 70 base=${name##*/} 71 ext=${base##*.} 72 expect=${base%%.*} 73 odir="$mt_outdir/current" 74 [[ -z "$ext" ]] && fatal "found test without ext: $name" 75 [[ -z "$expect" ]] && fatal "found test without prefix: $name" 76 77 case "$ext" in 78 "ksh") 79 command="$mt_ksh $name" 80 ;; 81 "mdb") 82 command="$mt_mdb" 83 input="$name" 84 ;; 85 "out") 86 # 87 # This is the file format for checking output against. 88 # 89 return 0 90 ;; 91 *) 92 echo "skipping test $name (unknown extensino)" 93 return 0 94 ;; 95 esac 96 97 echo "Executing test $name ... \c" 98 mkdir -p "$odir" >/dev/null || fatal "can't make output directory" 99 if [[ -z "$input" ]]; then 100 MDB=$mt_mdb $command > "$odir/stdout" 2>"$odir/stderr" 101 res=$? 102 else 103 MDB=$mt_mdb $command < $input > "$odir/stdout" 2>"$odir/stderr" 104 res=$? 105 fi 106 107 if [[ -f "$name.out" ]] && ! diff "$name.out" "$odir/stdout" >/dev/null; then 108 cp $name.out $odir/$base.out 109 reason="stdout mismatch" 110 elif [[ "$expect" == "tst" && $res -ne 0 ]]; then 111 reason="test exited $res, not zero" 112 elif [[ "$expect" == "err" && $res -eq 0 ]]; then 113 reason="test exited $res, not non-zero" 114 fi 115 116 if [[ -n "$reason" ]]; then 117 echo "$reason" 118 ((mt_tfail++)) 119 mv "$odir" "$mt_outdir/failure.$mt_tfail" || fatal \ 120 "failed to move test output directory" 121 cp "$name" "$mt_outdir/failure.$mt_tfail/test" || fatal \ 122 "failed to copy test into output directory" 123 else 124 echo "passed" 125 ((mt_tsuc++)) 126 mv "$odir" "$mt_outdir/success.$mt_tsuc" || fatal \ 127 "failed to move test directory" 128 fi 129 130 ((mt_tnum++)) 131 } 132 133 function run_all 134 { 135 local tests t 136 137 tests=$(find . -type f -name '[tst,err]*.*.[ksh,mdb]*') 138 for t in $tests; do 139 run_single $t 140 done 141 } 142 143 function welcome 144 { 145 cat <<WELCOME 146 Starting tests... 147 mtest target: $mt_mdb 148 output directory: $mt_outdir 149 WELCOME 150 } 151 152 function cleanup 153 { 154 [[ -n "$mt_keep" ]] && return 155 rm -rf "$mt_outdir"/success.* || fatal \ 156 "failed to remove successful test cases" 157 if [[ $mt_tfail -eq 0 ]]; then 158 rmdir "$mt_outdir" || fatal \ 159 "failed to remove test output directory" 160 fi 161 } 162 163 function goodbye 164 { 165 cat <<EOF 166 167 ------------- 168 Results 169 ------------- 170 171 Tests passed: $mt_tsuc 172 Tests failed: $mt_tfail 173 Tests ran: $mt_tnum 174 175 EOF 176 if [[ $mt_tfail -eq 0 ]]; then 177 echo "Congrats, mdb isn't completely broken, the tests pass". 178 else 179 echo "Some tests failed, you have some work to do." 180 fi 181 } 182 183 while getopts ":ahko:m:" c $@; do 184 case "$c" in 185 a) 186 mt_all="y" 187 ;; 188 k) 189 mt_keep="y" 190 ;; 191 m) 192 mt_mdb="$OPTARG" 193 ;; 194 o) 195 mt_outdir="$OPTARG" 196 ;; 197 h) 198 usage 199 ;; 200 :) 201 usage "option requires an argument -- $OPTARG" 202 ;; 203 *) 204 usage "invalid option -- $OPTARG" 205 ;; 206 esac 207 done 208 209 shift $((OPTIND-1)) 210 211 [[ -z "$mt_all" && $# == 0 ]] && usage "no tests to run" 212 213 [[ -x "$mt_mdb" ]] || fatal "unable to execute mdb binary: $mt_mdb" 214 215 [[ -z "$mt_outdir" ]] && mt_outdir=/var/tmp 216 217 setup_outdir 218 welcome 219 220 if [[ ! -z "$mt_all" ]]; then 221 run_all 222 else 223 for t in $@; do 224 [[ -f $t ]] || fatal "cannot find test $t" 225 run_single $t 226 done 227 fi 228 229 goodbye 230 cleanup 231 232 # 233 # Exit 1 if we have tests that return non-zero 234 # 235 [[ $mt_tfai -eq 0 ]]