xref: /dragonfly/contrib/lvm2/dist/test/test-lib.sh (revision 86d7f5d3)
1*86d7f5d3SJohn Marino#!/bin/sh
2*86d7f5d3SJohn Marino# Derived from git's t/test-lib.sh, which is Copyright (c) 2005 Junio C Hamano
3*86d7f5d3SJohn Marino#
4*86d7f5d3SJohn Marino# This copyrighted material is made available to anyone wishing to use,
5*86d7f5d3SJohn Marino# modify, copy, or redistribute it subject to the terms and conditions
6*86d7f5d3SJohn Marino# of the GNU General Public License v.2.
7*86d7f5d3SJohn Marino#
8*86d7f5d3SJohn Marino# You should have received a copy of the GNU General Public License
9*86d7f5d3SJohn Marino# along with this program; if not, write to the Free Software Foundation,
10*86d7f5d3SJohn Marino# Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
11*86d7f5d3SJohn Marino
12*86d7f5d3SJohn Marino# For repeatability, reset the environment to known value.
13*86d7f5d3SJohn MarinoLANG=C
14*86d7f5d3SJohn MarinoLC_ALL=C
15*86d7f5d3SJohn MarinoTZ=UTC
16*86d7f5d3SJohn Marinoexport LANG LC_ALL TZ
17*86d7f5d3SJohn Marino
18*86d7f5d3SJohn Marino. ./init.sh || { echo >&2 you must run make first; exit 1; }
19*86d7f5d3SJohn Marino
20*86d7f5d3SJohn Marino# Protect ourselves from common misconfiguration to export
21*86d7f5d3SJohn Marino# CDPATH into the environment
22*86d7f5d3SJohn Marinounset CDPATH
23*86d7f5d3SJohn Marino
24*86d7f5d3SJohn Marino# Each test should start with something like this, after copyright notices:
25*86d7f5d3SJohn Marino#
26*86d7f5d3SJohn Marino# test_description='Description of this test...
27*86d7f5d3SJohn Marino# This test checks if command xyzzy does the right thing...
28*86d7f5d3SJohn Marino# '
29*86d7f5d3SJohn Marino# . ./test-lib.sh
30*86d7f5d3SJohn Marino
31*86d7f5d3SJohn Marinoerror () {
32*86d7f5d3SJohn Marino	echo "* error: $*"
33*86d7f5d3SJohn Marino	exit 1
34*86d7f5d3SJohn Marino}
35*86d7f5d3SJohn Marino
36*86d7f5d3SJohn Marinosay () {
37*86d7f5d3SJohn Marino	echo "* $*"
38*86d7f5d3SJohn Marino}
39*86d7f5d3SJohn Marino
40*86d7f5d3SJohn Marinothis_test_() { expr "./$0" : '.*/t-\([^/]*\)\.sh$'; }
41*86d7f5d3SJohn Marino
42*86d7f5d3SJohn Marinotest "${test_description}" != "" ||
43*86d7f5d3SJohn Marinoerror "Test script did not set test_description."
44*86d7f5d3SJohn Marino
45*86d7f5d3SJohn Marinoverboselevel=0
46*86d7f5d3SJohn Marinowhile test "$#" -ne 0
47*86d7f5d3SJohn Marinodo
48*86d7f5d3SJohn Marino	case "$1" in
49*86d7f5d3SJohn Marino	-d|--d|--de|--deb|--debu|--debug)
50*86d7f5d3SJohn Marino		debug=t ;;
51*86d7f5d3SJohn Marino	-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
52*86d7f5d3SJohn Marino		immediate=t ;;
53*86d7f5d3SJohn Marino	-h|--h|--he|--hel|--help)
54*86d7f5d3SJohn Marino		echo "$test_description"
55*86d7f5d3SJohn Marino		exit 0 ;;
56*86d7f5d3SJohn Marino	-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
57*86d7f5d3SJohn Marino		verbose=t ;;
58*86d7f5d3SJohn Marino	-vv|-vvv|-vvvv)
59*86d7f5d3SJohn Marino		verboselevel=${#1}
60*86d7f5d3SJohn Marino		verboselevel=$(($verboselevel - 1))
61*86d7f5d3SJohn Marino		verbose=t ;;
62*86d7f5d3SJohn Marino	*)
63*86d7f5d3SJohn Marino		echo "$0: unsupported option $1"
64*86d7f5d3SJohn Marino		exit 0 ;;
65*86d7f5d3SJohn Marino	esac
66*86d7f5d3SJohn Marino        shift
67*86d7f5d3SJohn Marinodone
68*86d7f5d3SJohn Marino
69*86d7f5d3SJohn Marinoexec 5>&1
70*86d7f5d3SJohn Marinoif test "$verbose" = "t"
71*86d7f5d3SJohn Marinothen
72*86d7f5d3SJohn Marino	exec 4>&2 3>&1
73*86d7f5d3SJohn Marinoelse
74*86d7f5d3SJohn Marino	exec 4>/dev/null 3>/dev/null
75*86d7f5d3SJohn Marinofi
76*86d7f5d3SJohn Marino
77*86d7f5d3SJohn Marinotest_failure=0
78*86d7f5d3SJohn Marinotest_count=0
79*86d7f5d3SJohn Marino
80*86d7f5d3SJohn Marinotrap 'echo >&5 "FATAL: Unexpected exit with code $?"; exit 1' exit
81*86d7f5d3SJohn Marino
82*86d7f5d3SJohn Marino# You are not expected to call test_ok_ and test_failure_ directly, use
83*86d7f5d3SJohn Marino# the text_expect_* functions instead.
84*86d7f5d3SJohn Marino
85*86d7f5d3SJohn Marinotest_ok_ () {
86*86d7f5d3SJohn Marino	test_count=$(expr "$test_count" + 1)
87*86d7f5d3SJohn Marino	say "  ok $test_count: $@"
88*86d7f5d3SJohn Marino}
89*86d7f5d3SJohn Marino
90*86d7f5d3SJohn Marinotest_failure_ () {
91*86d7f5d3SJohn Marino	test_count=$(expr "$test_count" + 1)
92*86d7f5d3SJohn Marino	test_failure=$(expr "$test_failure" + 1);
93*86d7f5d3SJohn Marino	say "FAIL $test_count: $1"
94*86d7f5d3SJohn Marino	shift
95*86d7f5d3SJohn Marino	echo "$@" | sed -e 's/^/	/'
96*86d7f5d3SJohn Marino	test "$immediate" = "" || exit 1
97*86d7f5d3SJohn Marino}
98*86d7f5d3SJohn Marino
99*86d7f5d3SJohn Marinotest_debug () {
100*86d7f5d3SJohn Marino	test "$debug" = "" || eval "$1"
101*86d7f5d3SJohn Marino}
102*86d7f5d3SJohn Marino
103*86d7f5d3SJohn Marinotest_run_ () {
104*86d7f5d3SJohn Marino	eval >&3 2>&4 "$1"
105*86d7f5d3SJohn Marino	eval_ret="$?"
106*86d7f5d3SJohn Marino	return 0
107*86d7f5d3SJohn Marino}
108*86d7f5d3SJohn Marino
109*86d7f5d3SJohn Marinotest_skip () {
110*86d7f5d3SJohn Marino	this_test=$(this_test_)
111*86d7f5d3SJohn Marino	this_test="$this_test.$(expr "$test_count" + 1)"
112*86d7f5d3SJohn Marino	to_skip=
113*86d7f5d3SJohn Marino	for skp in $SKIP_TESTS
114*86d7f5d3SJohn Marino	do
115*86d7f5d3SJohn Marino		case "$this_test" in
116*86d7f5d3SJohn Marino		$skp)
117*86d7f5d3SJohn Marino			to_skip=t
118*86d7f5d3SJohn Marino		esac
119*86d7f5d3SJohn Marino	done
120*86d7f5d3SJohn Marino	case "$to_skip" in
121*86d7f5d3SJohn Marino	t)
122*86d7f5d3SJohn Marino		say >&3 "skipping test: $@"
123*86d7f5d3SJohn Marino		test_count=$(expr "$test_count" + 1)
124*86d7f5d3SJohn Marino		say "skip $test_count: $1"
125*86d7f5d3SJohn Marino		: true
126*86d7f5d3SJohn Marino		;;
127*86d7f5d3SJohn Marino	*)
128*86d7f5d3SJohn Marino		false
129*86d7f5d3SJohn Marino		;;
130*86d7f5d3SJohn Marino	esac
131*86d7f5d3SJohn Marino}
132*86d7f5d3SJohn Marino
133*86d7f5d3SJohn Marinotest_expect_failure () {
134*86d7f5d3SJohn Marino	test "$#" = 2 ||
135*86d7f5d3SJohn Marino	error "bug in the test script: not 2 parameters to test-expect-failure"
136*86d7f5d3SJohn Marino	if ! test_skip "$@"
137*86d7f5d3SJohn Marino	then
138*86d7f5d3SJohn Marino		say >&3 "expecting failure: $2"
139*86d7f5d3SJohn Marino		test_run_ "$2"
140*86d7f5d3SJohn Marino		if [ "$?" = 0 -a "$eval_ret" != 0 -a "$eval_ret" -lt 129 ]
141*86d7f5d3SJohn Marino		then
142*86d7f5d3SJohn Marino			test_ok_ "$1"
143*86d7f5d3SJohn Marino		else
144*86d7f5d3SJohn Marino			test_failure_ "$@"
145*86d7f5d3SJohn Marino		fi
146*86d7f5d3SJohn Marino	fi
147*86d7f5d3SJohn Marino	echo >&3 ""
148*86d7f5d3SJohn Marino}
149*86d7f5d3SJohn Marino
150*86d7f5d3SJohn Marinotest_expect_success () {
151*86d7f5d3SJohn Marino	test "$#" = 2 ||
152*86d7f5d3SJohn Marino	error "bug in the test script: not 2 parameters to test-expect-success"
153*86d7f5d3SJohn Marino	if ! test_skip "$@"
154*86d7f5d3SJohn Marino	then
155*86d7f5d3SJohn Marino		say >&3 "expecting success: $2"
156*86d7f5d3SJohn Marino		test_run_ "$2"
157*86d7f5d3SJohn Marino		if [ "$?" = 0 -a "$eval_ret" = 0 ]
158*86d7f5d3SJohn Marino		then
159*86d7f5d3SJohn Marino			test_ok_ "$1"
160*86d7f5d3SJohn Marino		else
161*86d7f5d3SJohn Marino			test_failure_ "$@"
162*86d7f5d3SJohn Marino		fi
163*86d7f5d3SJohn Marino	fi
164*86d7f5d3SJohn Marino	echo >&3 ""
165*86d7f5d3SJohn Marino}
166*86d7f5d3SJohn Marino
167*86d7f5d3SJohn Marinotest_expect_code () {
168*86d7f5d3SJohn Marino	test "$#" = 3 ||
169*86d7f5d3SJohn Marino	error "bug in the test script: not 3 parameters to test-expect-code"
170*86d7f5d3SJohn Marino	if ! test_skip "$@"
171*86d7f5d3SJohn Marino	then
172*86d7f5d3SJohn Marino		say >&3 "expecting exit code $1: $3"
173*86d7f5d3SJohn Marino		test_run_ "$3"
174*86d7f5d3SJohn Marino		if [ "$?" = 0 -a "$eval_ret" = "$1" ]
175*86d7f5d3SJohn Marino		then
176*86d7f5d3SJohn Marino			test_ok_ "$2"
177*86d7f5d3SJohn Marino		else
178*86d7f5d3SJohn Marino			test_failure_ "$@"
179*86d7f5d3SJohn Marino		fi
180*86d7f5d3SJohn Marino	fi
181*86d7f5d3SJohn Marino	echo >&3 ""
182*86d7f5d3SJohn Marino}
183*86d7f5d3SJohn Marino
184*86d7f5d3SJohn Marinotest_done () {
185*86d7f5d3SJohn Marino	case "$test_failure" in
186*86d7f5d3SJohn Marino	0)
187*86d7f5d3SJohn Marino		# We could:
188*86d7f5d3SJohn Marino		# cd .. && rm -fr trash
189*86d7f5d3SJohn Marino		# but that means we forbid any tests that use their own
190*86d7f5d3SJohn Marino		# subdirectory from calling test_done without coming back
191*86d7f5d3SJohn Marino		# to where they started from.
192*86d7f5d3SJohn Marino		# The Makefile provided will clean this test area so
193*86d7f5d3SJohn Marino		# we will leave things as they are.
194*86d7f5d3SJohn Marino
195*86d7f5d3SJohn Marino		say "passed all $test_count test(s)"
196*86d7f5d3SJohn Marino		exit 0 ;;
197*86d7f5d3SJohn Marino
198*86d7f5d3SJohn Marino	*)
199*86d7f5d3SJohn Marino		say "failed $test_failure among $test_count test(s)"
200*86d7f5d3SJohn Marino		exit 1 ;;
201*86d7f5d3SJohn Marino
202*86d7f5d3SJohn Marino	esac
203*86d7f5d3SJohn Marino}
204*86d7f5d3SJohn Marino
205*86d7f5d3SJohn Marinothis_test=$(this_test_)
206*86d7f5d3SJohn Marino
207*86d7f5d3SJohn Marinoskip_=0
208*86d7f5d3SJohn Marino# If $privileges_required_ is nonempty, non-root skips this test.
209*86d7f5d3SJohn Marinoif test "$privileges_required_" != ''; then
210*86d7f5d3SJohn Marino    uid=`id -u` || error 'failed to run "id -u"'
211*86d7f5d3SJohn Marino    if test "$uid" != 0; then
212*86d7f5d3SJohn Marino	SKIP_TESTS="$SKIP_TESTS $this_test"
213*86d7f5d3SJohn Marino	say "you have insufficient privileges for test $this_test"
214*86d7f5d3SJohn Marino	skip_=1
215*86d7f5d3SJohn Marino    fi
216*86d7f5d3SJohn Marinofi
217*86d7f5d3SJohn Marino
218*86d7f5d3SJohn Marinopwd_=`pwd`
219*86d7f5d3SJohn Marino
220*86d7f5d3SJohn Marinotest_dir_=${LVM_TEST_DIR-.}
221*86d7f5d3SJohn Marinotest "$test_dir_" = . && test_dir_=$pwd_
222*86d7f5d3SJohn Marino
223*86d7f5d3SJohn Marino# This is a stub function that is run upon trap (upon regular exit and
224*86d7f5d3SJohn Marino# interrupt).  Override it with a per-test function, e.g., to unmount
225*86d7f5d3SJohn Marino# a partition, or to undo any other global state changes.
226*86d7f5d3SJohn Marinocleanup_() { :; }
227*86d7f5d3SJohn Marino
228*86d7f5d3SJohn Marinofor skp in $SKIP_TESTS
229*86d7f5d3SJohn Marinodo
230*86d7f5d3SJohn Marino	to_skip=
231*86d7f5d3SJohn Marino	for skp in $SKIP_TESTS
232*86d7f5d3SJohn Marino	do
233*86d7f5d3SJohn Marino		case "$this_test" in
234*86d7f5d3SJohn Marino		$skp)
235*86d7f5d3SJohn Marino			to_skip=t
236*86d7f5d3SJohn Marino		esac
237*86d7f5d3SJohn Marino	done
238*86d7f5d3SJohn Marino	case "$to_skip" in
239*86d7f5d3SJohn Marino	t)
240*86d7f5d3SJohn Marino		say >&3 "skipping test $this_test altogether"
241*86d7f5d3SJohn Marino		say "skip all tests in $this_test"
242*86d7f5d3SJohn Marino		trap - exit
243*86d7f5d3SJohn Marino		test_done
244*86d7f5d3SJohn Marino	esac
245*86d7f5d3SJohn Marinodone
246*86d7f5d3SJohn Marino
247*86d7f5d3SJohn Marinotest_dir_rand_=$($abs_srcdir/mkdtemp $test_dir_ lvm-$this_test.XXXXXXXXXX) \
248*86d7f5d3SJohn Marino    || error "failed to create temporary directory in $test_dir_"
249*86d7f5d3SJohn Marino
250*86d7f5d3SJohn Marinotestlib_cleanup_() {
251*86d7f5d3SJohn Marino    d="$test_dir_rand_";
252*86d7f5d3SJohn Marino    cd "$test_dir_" && chmod -R u+rwx "$d" && rm -rf "$d"
253*86d7f5d3SJohn Marino}
254*86d7f5d3SJohn Marino
255*86d7f5d3SJohn Marino# Run each test from within a temporary sub-directory named after the
256*86d7f5d3SJohn Marino# test itself, and arrange to remove it upon exception or normal exit.
257*86d7f5d3SJohn Marinotrap 'st=$?; cleanup_; testlib_cleanup_; exit $st' 0
258*86d7f5d3SJohn Marinotrap '(exit $?); exit $?' 1 2 13 15
259*86d7f5d3SJohn Marino
260*86d7f5d3SJohn Marinocd $test_dir_rand_ || error "failed to cd to $test_dir_rand_"
261*86d7f5d3SJohn Marino
262*86d7f5d3SJohn Marinoif test $skip_ = 0; then
263*86d7f5d3SJohn Marino  . $abs_srcdir/lvm-utils.sh || exit 1
264*86d7f5d3SJohn Marinofi
265*86d7f5d3SJohn Marino
266*86d7f5d3SJohn Marinoif ( diff --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
267*86d7f5d3SJohn Marino  compare='diff -u'
268*86d7f5d3SJohn Marinoelif ( cmp --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
269*86d7f5d3SJohn Marino  compare='cmp -s'
270*86d7f5d3SJohn Marinoelse
271*86d7f5d3SJohn Marino  compare=cmp
272*86d7f5d3SJohn Marinofi
273