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