0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi#!/bin/bash
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi#
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi# This file and its contents are supplied under the terms of the
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi# Common Development and Distribution License ("CDDL"), version 1.0.
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi# You may only use this file in accordance with the terms of version
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi# 1.0 of the CDDL.
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi#
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi# A full copy of the text of the CDDL should have accompanied this
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi# source. A copy of the CDDL is also available via the Internet at
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi# http://www.illumos.org/license/CDDL.
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi#
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi#
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi# Copyright 2012 (c), Joyent, Inc.
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi#
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi#
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi# mdb test driver
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi#
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchiunalias -a
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchishopt -s xpg_echo
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi#set -o xtrace
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchimt_arg0=$(basename $0)
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchimt_ksh="/usr/bin/ksh"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchimt_mdb="/usr/bin/mdb"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchimt_outdir=
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchimt_keep=
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchimt_all=
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchimt_tests=
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchimt_tnum=0
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchimt_tfail=0
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchimt_tsuc=0
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchifunction usage
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi{
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi local msg="$*"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi [[ -z "$msg" ]] || echo "$msg" 2>&1
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi cat <<USAGE >&2
0a47c91c895e274dd0990009919e30e984364a8bRobert MustacchiUsage: $mt_arg0 [ -o dir ] [ -k ] [ -m executable ] [ -a | test ... ]
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi -o dir Sets 'dir' as the output directory
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi -a Runs all tests, ignores tests passed in
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi -k Keep output from all tests, not just failures
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi -m mdb binary to test
0a47c91c895e274dd0990009919e30e984364a8bRobert MustacchiUSAGE
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi exit 2
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi}
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchifunction fatal
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi{
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi local msg="$*"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi [[ -z "$msg" ]] && msg="failed"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi echo "$mt_arg0: $msg" >&2
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi exit 1
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi}
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchifunction setup_outdir
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi{
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi mt_outdir="$mt_outdir/$mt_arg0.$$"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi mkdir -p $mt_outdir || fatal "failed to make output dir $mt_outdir"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi}
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchifunction run_single
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi{
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi local name=$1
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi local expect base ext exe command odir res reason input
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi [[ -z "$name" ]] && fail "missing test to run"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi base=${name##*/}
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ext=${base##*.}
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi expect=${base%%.*}
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi odir="$mt_outdir/current"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi [[ -z "$ext" ]] && fatal "found test without ext: $name"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi [[ -z "$expect" ]] && fatal "found test without prefix: $name"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi case "$ext" in
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi "ksh")
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi command="$mt_ksh $name"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ;;
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi "mdb")
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi command="$mt_mdb"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi input="$name"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ;;
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi "out")
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi #
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi # This is the file format for checking output against.
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi #
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi return 0
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ;;
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi *)
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi echo "skipping test $name (unknown extensino)"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi return 0
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ;;
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi esac
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi echo "Executing test $name ... \c"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi mkdir -p "$odir" >/dev/null || fatal "can't make output directory"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi if [[ -z "$input" ]]; then
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi MDB=$mt_mdb $command > "$odir/stdout" 2>"$odir/stderr"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi res=$?
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi else
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi MDB=$mt_mdb $command < $input > "$odir/stdout" 2>"$odir/stderr"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi res=$?
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi fi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi if [[ -f "$name.out" ]] && ! diff "$name.out" "$odir/stdout" >/dev/null; then
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi cp $name.out $odir/$base.out
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi reason="stdout mismatch"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi elif [[ "$expect" == "tst" && $res -ne 0 ]]; then
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi reason="test exited $res, not zero"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi elif [[ "$expect" == "err" && $res -eq 0 ]]; then
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi reason="test exited $res, not non-zero"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi fi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi if [[ -n "$reason" ]]; then
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi echo "$reason"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ((mt_tfail++))
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi mv "$odir" "$mt_outdir/failure.$mt_tfail" || fatal \
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi "failed to move test output directory"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi cp "$name" "$mt_outdir/failure.$mt_tfail/test" || fatal \
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi "failed to copy test into output directory"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi else
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi echo "passed"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ((mt_tsuc++))
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi mv "$odir" "$mt_outdir/success.$mt_tsuc" || fatal \
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi "failed to move test directory"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi fi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ((mt_tnum++))
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi}
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchifunction run_all
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi{
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi local tests t
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi tests=$(find . -type f -name '[tst,err]*.*.[ksh,mdb]*')
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi for t in $tests; do
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi run_single $t
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi done
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi}
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchifunction welcome
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi{
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi cat <<WELCOME
0a47c91c895e274dd0990009919e30e984364a8bRobert MustacchiStarting tests...
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchimtest target: $mt_mdb
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchioutput directory: $mt_outdir
0a47c91c895e274dd0990009919e30e984364a8bRobert MustacchiWELCOME
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi}
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchifunction cleanup
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi{
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi [[ -n "$mt_keep" ]] && return
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi rm -rf "$mt_outdir"/success.* || fatal \
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi "failed to remove successful test cases"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi if [[ $mt_tfail -eq 0 ]]; then
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi rmdir "$mt_outdir" || fatal \
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi "failed to remove test output directory"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi fi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi}
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchifunction goodbye
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi{
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi cat <<EOF
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi-------------
0a47c91c895e274dd0990009919e30e984364a8bRobert MustacchiResults
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi-------------
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert MustacchiTests passed: $mt_tsuc
0a47c91c895e274dd0990009919e30e984364a8bRobert MustacchiTests failed: $mt_tfail
0a47c91c895e274dd0990009919e30e984364a8bRobert MustacchiTests ran: $mt_tnum
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert MustacchiEOF
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi if [[ $mt_tfail -eq 0 ]]; then
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi echo "Congrats, mdb isn't completely broken, the tests pass".
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi else
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi echo "Some tests failed, you have some work to do."
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi fi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi}
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchiwhile getopts ":ahko:m:" c $@; do
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi case "$c" in
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi a)
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi mt_all="y"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ;;
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi k)
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi mt_keep="y"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ;;
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi m)
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi mt_mdb="$OPTARG"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ;;
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi o)
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi mt_outdir="$OPTARG"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ;;
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi h)
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi usage
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ;;
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi :)
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi usage "option requires an argument -- $OPTARG"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ;;
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi *)
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi usage "invalid option -- $OPTARG"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi ;;
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi esac
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchidone
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchishift $((OPTIND-1))
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi[[ -z "$mt_all" && $# == 0 ]] && usage "no tests to run"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi[[ -x "$mt_mdb" ]] || fatal "unable to execute mdb binary: $mt_mdb"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi[[ -z "$mt_outdir" ]] && mt_outdir=/var/tmp
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchisetup_outdir
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchiwelcome
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchiif [[ ! -z "$mt_all" ]]; then
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi run_all
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchielse
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi for t in $@; do
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi [[ -f $t ]] || fatal "cannot find test $t"
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi run_single $t
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi done
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchifi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchigoodbye
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchicleanup
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi#
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi# Exit 1 if we have tests that return non-zero
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi#
0a47c91c895e274dd0990009919e30e984364a8bRobert Mustacchi[[ $mt_tfai -eq 0 ]]