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