summaryrefslogtreecommitdiff
path: root/usr/src/test/util-tests/tests/mdb/mdbtest
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/test/util-tests/tests/mdb/mdbtest')
-rwxr-xr-xusr/src/test/util-tests/tests/mdb/mdbtest231
1 files changed, 231 insertions, 0 deletions
diff --git a/usr/src/test/util-tests/tests/mdb/mdbtest b/usr/src/test/util-tests/tests/mdb/mdbtest
new file mode 100755
index 0000000000..96ffdc4c2d
--- /dev/null
+++ b/usr/src/test/util-tests/tests/mdb/mdbtest
@@ -0,0 +1,231 @@
+#!/bin/bash
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source. A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+
+#
+# Copyright 2020 Joyent, Inc.
+#
+
+#
+# mdb test driver
+#
+unalias -a
+shopt -s xpg_echo
+#set -o xtrace
+
+mt_arg0=$(basename $0)
+mt_ksh="/usr/bin/ksh"
+mt_mdb="/usr/bin/mdb"
+mt_outdir=
+mt_keep=
+mt_all=
+mt_tests=
+mt_tnum=0
+mt_tfail=0
+mt_tsuc=0
+
+function usage
+{
+ local msg="$*"
+ [[ -z "$msg" ]] || echo "$msg" 2>&1
+ cat <<USAGE >&2
+Usage: $mt_arg0 [ -o dir ] [ -k ] [ -m executable ] [ -a | test ... ]
+
+ -o dir Sets 'dir' as the output directory
+ -k Keep output from all tests, not just failures
+ -m mdb binary to test
+USAGE
+ exit 2
+}
+
+function fatal
+{
+ local msg="$*"
+ [[ -z "$msg" ]] && msg="failed"
+ echo "$mt_arg0: $msg" >&2
+ exit 1
+}
+
+function setup_outdir
+{
+ mt_outdir="$mt_outdir/$mt_arg0.$$"
+ mkdir -p $mt_outdir || fatal "failed to make output dir $mt_outdir"
+}
+
+function run_single
+{
+ local name=$1
+ local expect base ext exe command odir res reason input
+
+ [[ -z "$name" ]] && fail "missing test to run"
+ base=${name##*/}
+ ext=${base##*.}
+ expect=${base%%.*}
+ odir="$mt_outdir/current"
+ [[ -z "$ext" ]] && fatal "found test without ext: $name"
+ [[ -z "$expect" ]] && fatal "found test without prefix: $name"
+
+ case "$ext" in
+ "ksh")
+ command="$mt_ksh $name"
+ ;;
+ "mdb")
+ command="$mt_mdb"
+ input="$name"
+ ;;
+ "out")
+ #
+ # This is the file format for checking output against.
+ #
+ return 0
+ ;;
+ *)
+ echo "skipping test $name (unknown extensino)"
+ return 0
+ ;;
+ esac
+
+ echo "Executing test $name ... \c"
+ mkdir -p "$odir" >/dev/null || fatal "can't make output directory"
+ if [[ -z "$input" ]]; then
+ MDB=$mt_mdb $command > "$odir/stdout" 2>"$odir/stderr"
+ res=$?
+ else
+ MDB=$mt_mdb $command < $input > "$odir/stdout" 2>"$odir/stderr"
+ res=$?
+ fi
+
+ if [[ -f "$name.out" ]] && ! diff "$name.out" "$odir/stdout" >/dev/null; then
+ cp $name.out $odir/$base.out
+ reason="stdout mismatch"
+ elif [[ "$expect" == "tst" && $res -ne 0 ]]; then
+ reason="test exited $res, not zero"
+ elif [[ "$expect" == "err" && $res -eq 0 ]]; then
+ reason="test exited $res, not non-zero"
+ fi
+
+ if [[ -n "$reason" ]]; then
+ echo "$reason"
+ ((mt_tfail++))
+ mv "$odir" "$mt_outdir/failure.$mt_tfail" || fatal \
+ "failed to move test output directory"
+ cp "$name" "$mt_outdir/failure.$mt_tfail/test" || fatal \
+ "failed to copy test into output directory"
+ else
+ echo "passed"
+ ((mt_tsuc++))
+ mv "$odir" "$mt_outdir/success.$mt_tsuc" || fatal \
+ "failed to move test directory"
+ fi
+
+ ((mt_tnum++))
+}
+
+function run_all
+{
+ local tests t
+
+ tests=$(find . -type f -name '[tst,err]*.*.[ksh,mdb]*')
+ for t in $tests; do
+ run_single $t
+ done
+}
+
+function welcome
+{
+ cat <<WELCOME
+Starting tests...
+mtest target: $mt_mdb
+output directory: $mt_outdir
+WELCOME
+}
+
+function cleanup
+{
+ [[ -n "$mt_keep" ]] && return
+ rm -rf "$mt_outdir"/success.* || fatal \
+ "failed to remove successful test cases"
+ if [[ $mt_tfail -eq 0 ]]; then
+ rmdir "$mt_outdir" || fatal \
+ "failed to remove test output directory"
+ fi
+}
+
+function goodbye
+{
+ cat <<EOF
+
+-------------
+Results
+-------------
+
+Tests passed: $mt_tsuc
+Tests failed: $mt_tfail
+Tests ran: $mt_tnum
+
+EOF
+ if [[ $mt_tfail -eq 0 ]]; then
+ echo "Congrats, mdb isn't completely broken, the tests pass".
+ else
+ echo "Some tests failed, you have some work to do."
+ fi
+}
+
+while getopts ":hko:m:" c $@; do
+ case "$c" in
+ k)
+ mt_keep="y"
+ ;;
+ m)
+ mt_mdb="$OPTARG"
+ ;;
+ o)
+ mt_outdir="$OPTARG"
+ ;;
+ h)
+ usage
+ ;;
+ :)
+ usage "option requires an argument -- $OPTARG"
+ ;;
+ *)
+ usage "invalid option -- $OPTARG"
+ ;;
+ esac
+done
+
+shift $((OPTIND-1))
+
+[[ $# == 0 ]] && mt_all="y"
+
+[[ -x "$mt_mdb" ]] || fatal "unable to execute mdb binary: $mt_mdb"
+
+[[ -z "$mt_outdir" ]] && mt_outdir=/var/tmp
+
+setup_outdir
+welcome
+
+if [[ ! -z "$mt_all" ]]; then
+ run_all
+else
+ for t in $@; do
+ [[ -f $t ]] || fatal "cannot find test $t"
+ run_single $t
+ done
+fi
+
+goodbye
+cleanup
+
+#
+# Exit 1 if we have tests that return non-zero
+#
+[[ $mt_tfai -eq 0 ]]