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. 15fff59a08SRobert 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) 26fff59a08SRobert 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 42fff59a08SRobert 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 101*7a58f538SRobert Mustacchi MDB=$mt_mdb ODIR=$odir $command > "$odir/stdout" \ 102*7a58f538SRobert Mustacchi 2>"$odir/stderr" 103ac2f5fbeSJohn Levon res=$? 104ac2f5fbeSJohn Levon else 105*7a58f538SRobert Mustacchi MDB=$mt_mdb ODIR=$odir $command < $input > "$odir/stdout" \ 106*7a58f538SRobert Mustacchi 2>"$odir/stderr" 107ac2f5fbeSJohn Levon res=$? 108ac2f5fbeSJohn Levon fi 109ac2f5fbeSJohn Levon 110ac2f5fbeSJohn Levon if [[ -f "$name.out" ]] && ! diff "$name.out" "$odir/stdout" >/dev/null; then 111ac2f5fbeSJohn Levon cp $name.out $odir/$base.out 112ac2f5fbeSJohn Levon reason="stdout mismatch" 113ac2f5fbeSJohn Levon elif [[ "$expect" == "tst" && $res -ne 0 ]]; then 114ac2f5fbeSJohn Levon reason="test exited $res, not zero" 115ac2f5fbeSJohn Levon elif [[ "$expect" == "err" && $res -eq 0 ]]; then 116ac2f5fbeSJohn Levon reason="test exited $res, not non-zero" 117ac2f5fbeSJohn Levon fi 118ac2f5fbeSJohn Levon 119ac2f5fbeSJohn Levon if [[ -n "$reason" ]]; then 120ac2f5fbeSJohn Levon echo "$reason" 121ac2f5fbeSJohn Levon ((mt_tfail++)) 122ac2f5fbeSJohn Levon mv "$odir" "$mt_outdir/failure.$mt_tfail" || fatal \ 123ac2f5fbeSJohn Levon "failed to move test output directory" 124ac2f5fbeSJohn Levon cp "$name" "$mt_outdir/failure.$mt_tfail/test" || fatal \ 125ac2f5fbeSJohn Levon "failed to copy test into output directory" 126ac2f5fbeSJohn Levon else 127ac2f5fbeSJohn Levon echo "passed" 128ac2f5fbeSJohn Levon ((mt_tsuc++)) 129ac2f5fbeSJohn Levon mv "$odir" "$mt_outdir/success.$mt_tsuc" || fatal \ 130ac2f5fbeSJohn Levon "failed to move test directory" 131ac2f5fbeSJohn Levon fi 132ac2f5fbeSJohn Levon 133ac2f5fbeSJohn Levon ((mt_tnum++)) 134ac2f5fbeSJohn Levon} 135ac2f5fbeSJohn Levon 136ac2f5fbeSJohn Levonfunction run_all 137ac2f5fbeSJohn Levon{ 138ac2f5fbeSJohn Levon local tests t 139ac2f5fbeSJohn Levon 140ac2f5fbeSJohn Levon tests=$(find . -type f -name '[tst,err]*.*.[ksh,mdb]*') 141ac2f5fbeSJohn Levon for t in $tests; do 142ac2f5fbeSJohn Levon run_single $t 143ac2f5fbeSJohn Levon done 144ac2f5fbeSJohn Levon} 145ac2f5fbeSJohn Levon 146ac2f5fbeSJohn Levonfunction welcome 147ac2f5fbeSJohn Levon{ 148ac2f5fbeSJohn Levon cat <<WELCOME 149ac2f5fbeSJohn LevonStarting tests... 150fff59a08SRobert Mustacchimdbtest target: $mt_mdb 151ac2f5fbeSJohn Levonoutput directory: $mt_outdir 152ac2f5fbeSJohn LevonWELCOME 153ac2f5fbeSJohn Levon} 154ac2f5fbeSJohn Levon 155ac2f5fbeSJohn Levonfunction cleanup 156ac2f5fbeSJohn Levon{ 157ac2f5fbeSJohn Levon [[ -n "$mt_keep" ]] && return 158ac2f5fbeSJohn Levon rm -rf "$mt_outdir"/success.* || fatal \ 159ac2f5fbeSJohn Levon "failed to remove successful test cases" 160ac2f5fbeSJohn Levon if [[ $mt_tfail -eq 0 ]]; then 161ac2f5fbeSJohn Levon rmdir "$mt_outdir" || fatal \ 162ac2f5fbeSJohn Levon "failed to remove test output directory" 163ac2f5fbeSJohn Levon fi 164ac2f5fbeSJohn Levon} 165ac2f5fbeSJohn Levon 166ac2f5fbeSJohn Levonfunction goodbye 167ac2f5fbeSJohn Levon{ 168fff59a08SRobert Mustacchi if [[ $mt_tnum -eq 0 ]]; then 169fff59a08SRobert Mustacchi fatal "no tests were run, are you in the right directory?" 170fff59a08SRobert Mustacchi fi 171fff59a08SRobert Mustacchi 172ac2f5fbeSJohn Levon cat <<EOF 173ac2f5fbeSJohn Levon 174ac2f5fbeSJohn Levon------------- 175ac2f5fbeSJohn LevonResults 176ac2f5fbeSJohn Levon------------- 177ac2f5fbeSJohn Levon 178ac2f5fbeSJohn LevonTests passed: $mt_tsuc 179ac2f5fbeSJohn LevonTests failed: $mt_tfail 180ac2f5fbeSJohn LevonTests ran: $mt_tnum 181ac2f5fbeSJohn Levon 182ac2f5fbeSJohn LevonEOF 183ac2f5fbeSJohn Levon if [[ $mt_tfail -eq 0 ]]; then 184ac2f5fbeSJohn Levon echo "Congrats, mdb isn't completely broken, the tests pass". 185ac2f5fbeSJohn Levon else 186ac2f5fbeSJohn Levon echo "Some tests failed, you have some work to do." 187ac2f5fbeSJohn Levon fi 188ac2f5fbeSJohn Levon} 189ac2f5fbeSJohn Levon 190ac2f5fbeSJohn Levonwhile getopts ":hko:m:" c $@; do 191ac2f5fbeSJohn Levon case "$c" in 192ac2f5fbeSJohn Levon k) 193ac2f5fbeSJohn Levon mt_keep="y" 194ac2f5fbeSJohn Levon ;; 195ac2f5fbeSJohn Levon m) 196ac2f5fbeSJohn Levon mt_mdb="$OPTARG" 197ac2f5fbeSJohn Levon ;; 198ac2f5fbeSJohn Levon o) 199ac2f5fbeSJohn Levon mt_outdir="$OPTARG" 200ac2f5fbeSJohn Levon ;; 201ac2f5fbeSJohn Levon h) 202ac2f5fbeSJohn Levon usage 203ac2f5fbeSJohn Levon ;; 204ac2f5fbeSJohn Levon :) 205ac2f5fbeSJohn Levon usage "option requires an argument -- $OPTARG" 206ac2f5fbeSJohn Levon ;; 207ac2f5fbeSJohn Levon *) 208ac2f5fbeSJohn Levon usage "invalid option -- $OPTARG" 209ac2f5fbeSJohn Levon ;; 210ac2f5fbeSJohn Levon esac 211ac2f5fbeSJohn Levondone 212ac2f5fbeSJohn Levon 213ac2f5fbeSJohn Levonshift $((OPTIND-1)) 214ac2f5fbeSJohn Levon 215ac2f5fbeSJohn Levon[[ $# == 0 ]] && mt_all="y" 216ac2f5fbeSJohn Levon 217ac2f5fbeSJohn Levon[[ -x "$mt_mdb" ]] || fatal "unable to execute mdb binary: $mt_mdb" 218ac2f5fbeSJohn Levon 219ac2f5fbeSJohn Levon[[ -z "$mt_outdir" ]] && mt_outdir=/var/tmp 220ac2f5fbeSJohn Levon 221ac2f5fbeSJohn Levonsetup_outdir 222ac2f5fbeSJohn Levonwelcome 223ac2f5fbeSJohn Levon 224ac2f5fbeSJohn Levonif [[ ! -z "$mt_all" ]]; then 225fff59a08SRobert Mustacchi if ! cd "$mt_root"; then 226fff59a08SRobert Mustacchi fatal "failed to change to test root: $mt_root" 227fff59a08SRobert Mustacchi fi 228ac2f5fbeSJohn Levon run_all 229ac2f5fbeSJohn Levonelse 230ac2f5fbeSJohn Levon for t in $@; do 231ac2f5fbeSJohn Levon [[ -f $t ]] || fatal "cannot find test $t" 232ac2f5fbeSJohn Levon run_single $t 233ac2f5fbeSJohn Levon done 234ac2f5fbeSJohn Levonfi 235ac2f5fbeSJohn Levon 236ac2f5fbeSJohn Levongoodbye 237ac2f5fbeSJohn Levoncleanup 238ac2f5fbeSJohn Levon 239ac2f5fbeSJohn Levon# 240ac2f5fbeSJohn Levon# Exit 1 if we have tests that return non-zero 241ac2f5fbeSJohn Levon# 242fff59a08SRobert Mustacchi[[ $mt_tfail -eq 0 ]] 243