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