xref: /illumos-gate/usr/src/test/util-tests/tests/mdb/mdbtest (revision 7a58f53801acca2cd594b9ecb75bf926e4fb3eda)
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