xref: /illumos-gate/usr/src/test/util-tests/tests/mdb/mdbtest (revision ac2f5fbefc05314fcd97b03f2338b39e6efe643f)
1*ac2f5fbeSJohn Levon#!/bin/bash
2*ac2f5fbeSJohn Levon#
3*ac2f5fbeSJohn Levon# This file and its contents are supplied under the terms of the
4*ac2f5fbeSJohn Levon# Common Development and Distribution License ("CDDL"), version 1.0.
5*ac2f5fbeSJohn Levon# You may only use this file in accordance with the terms of version
6*ac2f5fbeSJohn Levon# 1.0 of the CDDL.
7*ac2f5fbeSJohn Levon#
8*ac2f5fbeSJohn Levon# A full copy of the text of the CDDL should have accompanied this
9*ac2f5fbeSJohn Levon# source.  A copy of the CDDL is also available via the Internet at
10*ac2f5fbeSJohn Levon# http://www.illumos.org/license/CDDL.
11*ac2f5fbeSJohn Levon#
12*ac2f5fbeSJohn Levon
13*ac2f5fbeSJohn Levon#
14*ac2f5fbeSJohn Levon# Copyright 2020 Joyent, Inc.
15*ac2f5fbeSJohn Levon#
16*ac2f5fbeSJohn Levon
17*ac2f5fbeSJohn Levon#
18*ac2f5fbeSJohn Levon# mdb test driver
19*ac2f5fbeSJohn Levon#
20*ac2f5fbeSJohn Levonunalias -a
21*ac2f5fbeSJohn Levonshopt -s xpg_echo
22*ac2f5fbeSJohn Levon#set -o xtrace
23*ac2f5fbeSJohn Levon
24*ac2f5fbeSJohn Levonmt_arg0=$(basename $0)
25*ac2f5fbeSJohn Levonmt_ksh="/usr/bin/ksh"
26*ac2f5fbeSJohn Levonmt_mdb="/usr/bin/mdb"
27*ac2f5fbeSJohn Levonmt_outdir=
28*ac2f5fbeSJohn Levonmt_keep=
29*ac2f5fbeSJohn Levonmt_all=
30*ac2f5fbeSJohn Levonmt_tests=
31*ac2f5fbeSJohn Levonmt_tnum=0
32*ac2f5fbeSJohn Levonmt_tfail=0
33*ac2f5fbeSJohn Levonmt_tsuc=0
34*ac2f5fbeSJohn Levon
35*ac2f5fbeSJohn Levonfunction usage
36*ac2f5fbeSJohn Levon{
37*ac2f5fbeSJohn Levon	local msg="$*"
38*ac2f5fbeSJohn Levon	[[ -z "$msg" ]] || echo "$msg" 2>&1
39*ac2f5fbeSJohn Levon	cat <<USAGE >&2
40*ac2f5fbeSJohn LevonUsage: $mt_arg0  [ -o dir ] [ -k ] [ -m executable ] [ -a | test ... ]
41*ac2f5fbeSJohn Levon
42*ac2f5fbeSJohn Levon	-o dir		Sets 'dir' as the output directory
43*ac2f5fbeSJohn Levon	-k		Keep output from all tests, not just failures
44*ac2f5fbeSJohn Levon	-m 		mdb binary to test
45*ac2f5fbeSJohn LevonUSAGE
46*ac2f5fbeSJohn Levon	exit 2
47*ac2f5fbeSJohn Levon}
48*ac2f5fbeSJohn Levon
49*ac2f5fbeSJohn Levonfunction fatal
50*ac2f5fbeSJohn Levon{
51*ac2f5fbeSJohn Levon	local msg="$*"
52*ac2f5fbeSJohn Levon	[[ -z "$msg" ]] && msg="failed"
53*ac2f5fbeSJohn Levon	echo "$mt_arg0: $msg" >&2
54*ac2f5fbeSJohn Levon	exit 1
55*ac2f5fbeSJohn Levon}
56*ac2f5fbeSJohn Levon
57*ac2f5fbeSJohn Levonfunction setup_outdir
58*ac2f5fbeSJohn Levon{
59*ac2f5fbeSJohn Levon	mt_outdir="$mt_outdir/$mt_arg0.$$"
60*ac2f5fbeSJohn Levon	mkdir -p $mt_outdir || fatal "failed to make output dir $mt_outdir"
61*ac2f5fbeSJohn Levon}
62*ac2f5fbeSJohn Levon
63*ac2f5fbeSJohn Levonfunction run_single
64*ac2f5fbeSJohn Levon{
65*ac2f5fbeSJohn Levon	local name=$1
66*ac2f5fbeSJohn Levon	local expect base ext exe command odir res reason input
67*ac2f5fbeSJohn Levon
68*ac2f5fbeSJohn Levon	[[ -z "$name" ]] && fail "missing test to run"
69*ac2f5fbeSJohn Levon	base=${name##*/}
70*ac2f5fbeSJohn Levon	ext=${base##*.}
71*ac2f5fbeSJohn Levon	expect=${base%%.*}
72*ac2f5fbeSJohn Levon	odir="$mt_outdir/current"
73*ac2f5fbeSJohn Levon	[[ -z "$ext" ]] && fatal "found test without ext: $name"
74*ac2f5fbeSJohn Levon	[[ -z "$expect" ]] && fatal "found test without prefix: $name"
75*ac2f5fbeSJohn Levon
76*ac2f5fbeSJohn Levon	case "$ext" in
77*ac2f5fbeSJohn Levon	"ksh")
78*ac2f5fbeSJohn Levon		command="$mt_ksh $name"
79*ac2f5fbeSJohn Levon		;;
80*ac2f5fbeSJohn Levon	"mdb")
81*ac2f5fbeSJohn Levon		command="$mt_mdb"
82*ac2f5fbeSJohn Levon		input="$name"
83*ac2f5fbeSJohn Levon		;;
84*ac2f5fbeSJohn Levon	"out")
85*ac2f5fbeSJohn Levon		#
86*ac2f5fbeSJohn Levon		# This is the file format for checking output against.
87*ac2f5fbeSJohn Levon		#
88*ac2f5fbeSJohn Levon		return 0
89*ac2f5fbeSJohn Levon		;;
90*ac2f5fbeSJohn Levon	*)
91*ac2f5fbeSJohn Levon		echo "skipping test $name (unknown extensino)"
92*ac2f5fbeSJohn Levon		return 0
93*ac2f5fbeSJohn Levon		;;
94*ac2f5fbeSJohn Levon	esac
95*ac2f5fbeSJohn Levon
96*ac2f5fbeSJohn Levon	echo "Executing test $name ... \c"
97*ac2f5fbeSJohn Levon	mkdir -p "$odir" >/dev/null || fatal "can't make output directory"
98*ac2f5fbeSJohn Levon	if [[ -z "$input" ]]; then
99*ac2f5fbeSJohn Levon		MDB=$mt_mdb $command > "$odir/stdout" 2>"$odir/stderr"
100*ac2f5fbeSJohn Levon		res=$?
101*ac2f5fbeSJohn Levon	else
102*ac2f5fbeSJohn Levon		MDB=$mt_mdb $command < $input > "$odir/stdout" 2>"$odir/stderr"
103*ac2f5fbeSJohn Levon		res=$?
104*ac2f5fbeSJohn Levon	fi
105*ac2f5fbeSJohn Levon
106*ac2f5fbeSJohn Levon	if [[ -f "$name.out" ]] && ! diff "$name.out" "$odir/stdout" >/dev/null; then
107*ac2f5fbeSJohn Levon		cp $name.out $odir/$base.out
108*ac2f5fbeSJohn Levon		reason="stdout mismatch"
109*ac2f5fbeSJohn Levon	elif [[ "$expect" == "tst" && $res -ne 0 ]]; then
110*ac2f5fbeSJohn Levon		reason="test exited $res, not zero"
111*ac2f5fbeSJohn Levon	elif [[ "$expect" == "err" && $res -eq 0 ]]; then
112*ac2f5fbeSJohn Levon		reason="test exited $res, not non-zero"
113*ac2f5fbeSJohn Levon	fi
114*ac2f5fbeSJohn Levon
115*ac2f5fbeSJohn Levon	if [[ -n "$reason" ]]; then
116*ac2f5fbeSJohn Levon		echo "$reason"
117*ac2f5fbeSJohn Levon		((mt_tfail++))
118*ac2f5fbeSJohn Levon		mv "$odir" "$mt_outdir/failure.$mt_tfail" || fatal \
119*ac2f5fbeSJohn Levon		    "failed to move test output directory"
120*ac2f5fbeSJohn Levon		cp "$name" "$mt_outdir/failure.$mt_tfail/test" || fatal \
121*ac2f5fbeSJohn Levon		    "failed to copy test into output directory"
122*ac2f5fbeSJohn Levon	else
123*ac2f5fbeSJohn Levon		echo "passed"
124*ac2f5fbeSJohn Levon		((mt_tsuc++))
125*ac2f5fbeSJohn Levon		mv "$odir" "$mt_outdir/success.$mt_tsuc" || fatal \
126*ac2f5fbeSJohn Levon		    "failed to move test directory"
127*ac2f5fbeSJohn Levon	fi
128*ac2f5fbeSJohn Levon
129*ac2f5fbeSJohn Levon	((mt_tnum++))
130*ac2f5fbeSJohn Levon}
131*ac2f5fbeSJohn Levon
132*ac2f5fbeSJohn Levonfunction run_all
133*ac2f5fbeSJohn Levon{
134*ac2f5fbeSJohn Levon	local tests t
135*ac2f5fbeSJohn Levon
136*ac2f5fbeSJohn Levon	tests=$(find . -type f -name '[tst,err]*.*.[ksh,mdb]*')
137*ac2f5fbeSJohn Levon	for t in $tests; do
138*ac2f5fbeSJohn Levon		run_single $t
139*ac2f5fbeSJohn Levon	done
140*ac2f5fbeSJohn Levon}
141*ac2f5fbeSJohn Levon
142*ac2f5fbeSJohn Levonfunction welcome
143*ac2f5fbeSJohn Levon{
144*ac2f5fbeSJohn Levon	cat <<WELCOME
145*ac2f5fbeSJohn LevonStarting tests...
146*ac2f5fbeSJohn Levonmtest target: $mt_mdb
147*ac2f5fbeSJohn Levonoutput directory: $mt_outdir
148*ac2f5fbeSJohn LevonWELCOME
149*ac2f5fbeSJohn Levon}
150*ac2f5fbeSJohn Levon
151*ac2f5fbeSJohn Levonfunction cleanup
152*ac2f5fbeSJohn Levon{
153*ac2f5fbeSJohn Levon	[[ -n "$mt_keep" ]] && return
154*ac2f5fbeSJohn Levon	rm -rf "$mt_outdir"/success.* || fatal \
155*ac2f5fbeSJohn Levon	     "failed to remove successful test cases"
156*ac2f5fbeSJohn Levon	if [[ $mt_tfail -eq 0 ]]; then
157*ac2f5fbeSJohn Levon		rmdir "$mt_outdir" || fatal \
158*ac2f5fbeSJohn Levon		    "failed to remove test output directory"
159*ac2f5fbeSJohn Levon	fi
160*ac2f5fbeSJohn Levon}
161*ac2f5fbeSJohn Levon
162*ac2f5fbeSJohn Levonfunction goodbye
163*ac2f5fbeSJohn Levon{
164*ac2f5fbeSJohn Levon	cat <<EOF
165*ac2f5fbeSJohn Levon
166*ac2f5fbeSJohn Levon-------------
167*ac2f5fbeSJohn LevonResults
168*ac2f5fbeSJohn Levon-------------
169*ac2f5fbeSJohn Levon
170*ac2f5fbeSJohn LevonTests passed: $mt_tsuc
171*ac2f5fbeSJohn LevonTests failed: $mt_tfail
172*ac2f5fbeSJohn LevonTests ran:    $mt_tnum
173*ac2f5fbeSJohn Levon
174*ac2f5fbeSJohn LevonEOF
175*ac2f5fbeSJohn Levon	if [[ $mt_tfail  -eq 0 ]]; then
176*ac2f5fbeSJohn Levon		echo "Congrats, mdb isn't completely broken, the tests pass".
177*ac2f5fbeSJohn Levon	else
178*ac2f5fbeSJohn Levon		echo "Some tests failed, you have some work to do."
179*ac2f5fbeSJohn Levon	fi
180*ac2f5fbeSJohn Levon}
181*ac2f5fbeSJohn Levon
182*ac2f5fbeSJohn Levonwhile getopts ":hko:m:" c $@; do
183*ac2f5fbeSJohn Levon	case "$c" in
184*ac2f5fbeSJohn Levon	k)
185*ac2f5fbeSJohn Levon		mt_keep="y"
186*ac2f5fbeSJohn Levon		;;
187*ac2f5fbeSJohn Levon	m)
188*ac2f5fbeSJohn Levon		mt_mdb="$OPTARG"
189*ac2f5fbeSJohn Levon		;;
190*ac2f5fbeSJohn Levon	o)
191*ac2f5fbeSJohn Levon		mt_outdir="$OPTARG"
192*ac2f5fbeSJohn Levon		;;
193*ac2f5fbeSJohn Levon	h)
194*ac2f5fbeSJohn Levon		usage
195*ac2f5fbeSJohn Levon		;;
196*ac2f5fbeSJohn Levon	:)
197*ac2f5fbeSJohn Levon		usage "option requires an argument -- $OPTARG"
198*ac2f5fbeSJohn Levon		;;
199*ac2f5fbeSJohn Levon	*)
200*ac2f5fbeSJohn Levon		usage "invalid option -- $OPTARG"
201*ac2f5fbeSJohn Levon		;;
202*ac2f5fbeSJohn Levon	esac
203*ac2f5fbeSJohn Levondone
204*ac2f5fbeSJohn Levon
205*ac2f5fbeSJohn Levonshift $((OPTIND-1))
206*ac2f5fbeSJohn Levon
207*ac2f5fbeSJohn Levon[[ $# == 0 ]] && mt_all="y"
208*ac2f5fbeSJohn Levon
209*ac2f5fbeSJohn Levon[[ -x "$mt_mdb" ]] || fatal "unable to execute mdb binary: $mt_mdb"
210*ac2f5fbeSJohn Levon
211*ac2f5fbeSJohn Levon[[ -z "$mt_outdir" ]] && mt_outdir=/var/tmp
212*ac2f5fbeSJohn Levon
213*ac2f5fbeSJohn Levonsetup_outdir
214*ac2f5fbeSJohn Levonwelcome
215*ac2f5fbeSJohn Levon
216*ac2f5fbeSJohn Levonif [[ ! -z "$mt_all" ]]; then
217*ac2f5fbeSJohn Levon	run_all
218*ac2f5fbeSJohn Levonelse
219*ac2f5fbeSJohn Levon	for t in $@; do
220*ac2f5fbeSJohn Levon		[[ -f $t ]] || fatal "cannot find test $t"
221*ac2f5fbeSJohn Levon		run_single $t
222*ac2f5fbeSJohn Levon	done
223*ac2f5fbeSJohn Levonfi
224*ac2f5fbeSJohn Levon
225*ac2f5fbeSJohn Levongoodbye
226*ac2f5fbeSJohn Levoncleanup
227*ac2f5fbeSJohn Levon
228*ac2f5fbeSJohn Levon#
229*ac2f5fbeSJohn Levon# Exit 1 if we have tests that return non-zero
230*ac2f5fbeSJohn Levon#
231*ac2f5fbeSJohn Levon[[ $mt_tfai -eq 0 ]]
232