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