view usr/src/cmd/mdb/test/mtest.sh @ 14143:42d090a37218

3089 want ::typedef 3690 mdb on x86 should be able to print alternate register names 3688 Want mdb -e 3094 libctf should support removing a dynamic type 3095 libctf does not validate arrays correctly 3096 libctf does not validate function types correctly 3689 Want an mdb test suite driver Reviewed by: Richard Lowe <richlowe@richlowe.net> Reviewed by: Eric Schrock <eric.schrock@delphix.com> Approved by: Gordon Ross <gwr@nexenta.com>
author Robert Mustacchi <rm@joyent.com>
date Wed, 03 Apr 2013 15:25:37 -0700
parents
children
line wrap: on
line source

#!/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 2012 (c), 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
	-a		Runs all tests, ignores tests passed in
	-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 ":ahko:m:" c $@; do
	case "$c" in
	a)
		mt_all="y"
		;;
	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))

[[ -z "$mt_all" && $# == 0 ]] && usage "no tests to run"

[[ -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 ]]