xref: /dflybsd-src/contrib/lvm2/dist/test/test-lib.sh (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino#!/bin/sh
286d7f5d3SJohn Marino# Derived from git's t/test-lib.sh, which is Copyright (c) 2005 Junio C Hamano
386d7f5d3SJohn Marino#
486d7f5d3SJohn Marino# This copyrighted material is made available to anyone wishing to use,
586d7f5d3SJohn Marino# modify, copy, or redistribute it subject to the terms and conditions
686d7f5d3SJohn Marino# of the GNU General Public License v.2.
786d7f5d3SJohn Marino#
886d7f5d3SJohn Marino# You should have received a copy of the GNU General Public License
986d7f5d3SJohn Marino# along with this program; if not, write to the Free Software Foundation,
1086d7f5d3SJohn Marino# Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1186d7f5d3SJohn Marino
1286d7f5d3SJohn Marino# For repeatability, reset the environment to known value.
1386d7f5d3SJohn MarinoLANG=C
1486d7f5d3SJohn MarinoLC_ALL=C
1586d7f5d3SJohn MarinoTZ=UTC
1686d7f5d3SJohn Marinoexport LANG LC_ALL TZ
1786d7f5d3SJohn Marino
1886d7f5d3SJohn Marino. ./init.sh || { echo >&2 you must run make first; exit 1; }
1986d7f5d3SJohn Marino
2086d7f5d3SJohn Marino# Protect ourselves from common misconfiguration to export
2186d7f5d3SJohn Marino# CDPATH into the environment
2286d7f5d3SJohn Marinounset CDPATH
2386d7f5d3SJohn Marino
2486d7f5d3SJohn Marino# Each test should start with something like this, after copyright notices:
2586d7f5d3SJohn Marino#
2686d7f5d3SJohn Marino# test_description='Description of this test...
2786d7f5d3SJohn Marino# This test checks if command xyzzy does the right thing...
2886d7f5d3SJohn Marino# '
2986d7f5d3SJohn Marino# . ./test-lib.sh
3086d7f5d3SJohn Marino
3186d7f5d3SJohn Marinoerror () {
3286d7f5d3SJohn Marino	echo "* error: $*"
3386d7f5d3SJohn Marino	exit 1
3486d7f5d3SJohn Marino}
3586d7f5d3SJohn Marino
3686d7f5d3SJohn Marinosay () {
3786d7f5d3SJohn Marino	echo "* $*"
3886d7f5d3SJohn Marino}
3986d7f5d3SJohn Marino
4086d7f5d3SJohn Marinothis_test_() { expr "./$0" : '.*/t-\([^/]*\)\.sh$'; }
4186d7f5d3SJohn Marino
4286d7f5d3SJohn Marinotest "${test_description}" != "" ||
4386d7f5d3SJohn Marinoerror "Test script did not set test_description."
4486d7f5d3SJohn Marino
4586d7f5d3SJohn Marinoverboselevel=0
4686d7f5d3SJohn Marinowhile test "$#" -ne 0
4786d7f5d3SJohn Marinodo
4886d7f5d3SJohn Marino	case "$1" in
4986d7f5d3SJohn Marino	-d|--d|--de|--deb|--debu|--debug)
5086d7f5d3SJohn Marino		debug=t ;;
5186d7f5d3SJohn Marino	-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
5286d7f5d3SJohn Marino		immediate=t ;;
5386d7f5d3SJohn Marino	-h|--h|--he|--hel|--help)
5486d7f5d3SJohn Marino		echo "$test_description"
5586d7f5d3SJohn Marino		exit 0 ;;
5686d7f5d3SJohn Marino	-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
5786d7f5d3SJohn Marino		verbose=t ;;
5886d7f5d3SJohn Marino	-vv|-vvv|-vvvv)
5986d7f5d3SJohn Marino		verboselevel=${#1}
6086d7f5d3SJohn Marino		verboselevel=$(($verboselevel - 1))
6186d7f5d3SJohn Marino		verbose=t ;;
6286d7f5d3SJohn Marino	*)
6386d7f5d3SJohn Marino		echo "$0: unsupported option $1"
6486d7f5d3SJohn Marino		exit 0 ;;
6586d7f5d3SJohn Marino	esac
6686d7f5d3SJohn Marino        shift
6786d7f5d3SJohn Marinodone
6886d7f5d3SJohn Marino
6986d7f5d3SJohn Marinoexec 5>&1
7086d7f5d3SJohn Marinoif test "$verbose" = "t"
7186d7f5d3SJohn Marinothen
7286d7f5d3SJohn Marino	exec 4>&2 3>&1
7386d7f5d3SJohn Marinoelse
7486d7f5d3SJohn Marino	exec 4>/dev/null 3>/dev/null
7586d7f5d3SJohn Marinofi
7686d7f5d3SJohn Marino
7786d7f5d3SJohn Marinotest_failure=0
7886d7f5d3SJohn Marinotest_count=0
7986d7f5d3SJohn Marino
8086d7f5d3SJohn Marinotrap 'echo >&5 "FATAL: Unexpected exit with code $?"; exit 1' exit
8186d7f5d3SJohn Marino
8286d7f5d3SJohn Marino# You are not expected to call test_ok_ and test_failure_ directly, use
8386d7f5d3SJohn Marino# the text_expect_* functions instead.
8486d7f5d3SJohn Marino
8586d7f5d3SJohn Marinotest_ok_ () {
8686d7f5d3SJohn Marino	test_count=$(expr "$test_count" + 1)
8786d7f5d3SJohn Marino	say "  ok $test_count: $@"
8886d7f5d3SJohn Marino}
8986d7f5d3SJohn Marino
9086d7f5d3SJohn Marinotest_failure_ () {
9186d7f5d3SJohn Marino	test_count=$(expr "$test_count" + 1)
9286d7f5d3SJohn Marino	test_failure=$(expr "$test_failure" + 1);
9386d7f5d3SJohn Marino	say "FAIL $test_count: $1"
9486d7f5d3SJohn Marino	shift
9586d7f5d3SJohn Marino	echo "$@" | sed -e 's/^/	/'
9686d7f5d3SJohn Marino	test "$immediate" = "" || exit 1
9786d7f5d3SJohn Marino}
9886d7f5d3SJohn Marino
9986d7f5d3SJohn Marinotest_debug () {
10086d7f5d3SJohn Marino	test "$debug" = "" || eval "$1"
10186d7f5d3SJohn Marino}
10286d7f5d3SJohn Marino
10386d7f5d3SJohn Marinotest_run_ () {
10486d7f5d3SJohn Marino	eval >&3 2>&4 "$1"
10586d7f5d3SJohn Marino	eval_ret="$?"
10686d7f5d3SJohn Marino	return 0
10786d7f5d3SJohn Marino}
10886d7f5d3SJohn Marino
10986d7f5d3SJohn Marinotest_skip () {
11086d7f5d3SJohn Marino	this_test=$(this_test_)
11186d7f5d3SJohn Marino	this_test="$this_test.$(expr "$test_count" + 1)"
11286d7f5d3SJohn Marino	to_skip=
11386d7f5d3SJohn Marino	for skp in $SKIP_TESTS
11486d7f5d3SJohn Marino	do
11586d7f5d3SJohn Marino		case "$this_test" in
11686d7f5d3SJohn Marino		$skp)
11786d7f5d3SJohn Marino			to_skip=t
11886d7f5d3SJohn Marino		esac
11986d7f5d3SJohn Marino	done
12086d7f5d3SJohn Marino	case "$to_skip" in
12186d7f5d3SJohn Marino	t)
12286d7f5d3SJohn Marino		say >&3 "skipping test: $@"
12386d7f5d3SJohn Marino		test_count=$(expr "$test_count" + 1)
12486d7f5d3SJohn Marino		say "skip $test_count: $1"
12586d7f5d3SJohn Marino		: true
12686d7f5d3SJohn Marino		;;
12786d7f5d3SJohn Marino	*)
12886d7f5d3SJohn Marino		false
12986d7f5d3SJohn Marino		;;
13086d7f5d3SJohn Marino	esac
13186d7f5d3SJohn Marino}
13286d7f5d3SJohn Marino
13386d7f5d3SJohn Marinotest_expect_failure () {
13486d7f5d3SJohn Marino	test "$#" = 2 ||
13586d7f5d3SJohn Marino	error "bug in the test script: not 2 parameters to test-expect-failure"
13686d7f5d3SJohn Marino	if ! test_skip "$@"
13786d7f5d3SJohn Marino	then
13886d7f5d3SJohn Marino		say >&3 "expecting failure: $2"
13986d7f5d3SJohn Marino		test_run_ "$2"
14086d7f5d3SJohn Marino		if [ "$?" = 0 -a "$eval_ret" != 0 -a "$eval_ret" -lt 129 ]
14186d7f5d3SJohn Marino		then
14286d7f5d3SJohn Marino			test_ok_ "$1"
14386d7f5d3SJohn Marino		else
14486d7f5d3SJohn Marino			test_failure_ "$@"
14586d7f5d3SJohn Marino		fi
14686d7f5d3SJohn Marino	fi
14786d7f5d3SJohn Marino	echo >&3 ""
14886d7f5d3SJohn Marino}
14986d7f5d3SJohn Marino
15086d7f5d3SJohn Marinotest_expect_success () {
15186d7f5d3SJohn Marino	test "$#" = 2 ||
15286d7f5d3SJohn Marino	error "bug in the test script: not 2 parameters to test-expect-success"
15386d7f5d3SJohn Marino	if ! test_skip "$@"
15486d7f5d3SJohn Marino	then
15586d7f5d3SJohn Marino		say >&3 "expecting success: $2"
15686d7f5d3SJohn Marino		test_run_ "$2"
15786d7f5d3SJohn Marino		if [ "$?" = 0 -a "$eval_ret" = 0 ]
15886d7f5d3SJohn Marino		then
15986d7f5d3SJohn Marino			test_ok_ "$1"
16086d7f5d3SJohn Marino		else
16186d7f5d3SJohn Marino			test_failure_ "$@"
16286d7f5d3SJohn Marino		fi
16386d7f5d3SJohn Marino	fi
16486d7f5d3SJohn Marino	echo >&3 ""
16586d7f5d3SJohn Marino}
16686d7f5d3SJohn Marino
16786d7f5d3SJohn Marinotest_expect_code () {
16886d7f5d3SJohn Marino	test "$#" = 3 ||
16986d7f5d3SJohn Marino	error "bug in the test script: not 3 parameters to test-expect-code"
17086d7f5d3SJohn Marino	if ! test_skip "$@"
17186d7f5d3SJohn Marino	then
17286d7f5d3SJohn Marino		say >&3 "expecting exit code $1: $3"
17386d7f5d3SJohn Marino		test_run_ "$3"
17486d7f5d3SJohn Marino		if [ "$?" = 0 -a "$eval_ret" = "$1" ]
17586d7f5d3SJohn Marino		then
17686d7f5d3SJohn Marino			test_ok_ "$2"
17786d7f5d3SJohn Marino		else
17886d7f5d3SJohn Marino			test_failure_ "$@"
17986d7f5d3SJohn Marino		fi
18086d7f5d3SJohn Marino	fi
18186d7f5d3SJohn Marino	echo >&3 ""
18286d7f5d3SJohn Marino}
18386d7f5d3SJohn Marino
18486d7f5d3SJohn Marinotest_done () {
18586d7f5d3SJohn Marino	case "$test_failure" in
18686d7f5d3SJohn Marino	0)
18786d7f5d3SJohn Marino		# We could:
18886d7f5d3SJohn Marino		# cd .. && rm -fr trash
18986d7f5d3SJohn Marino		# but that means we forbid any tests that use their own
19086d7f5d3SJohn Marino		# subdirectory from calling test_done without coming back
19186d7f5d3SJohn Marino		# to where they started from.
19286d7f5d3SJohn Marino		# The Makefile provided will clean this test area so
19386d7f5d3SJohn Marino		# we will leave things as they are.
19486d7f5d3SJohn Marino
19586d7f5d3SJohn Marino		say "passed all $test_count test(s)"
19686d7f5d3SJohn Marino		exit 0 ;;
19786d7f5d3SJohn Marino
19886d7f5d3SJohn Marino	*)
19986d7f5d3SJohn Marino		say "failed $test_failure among $test_count test(s)"
20086d7f5d3SJohn Marino		exit 1 ;;
20186d7f5d3SJohn Marino
20286d7f5d3SJohn Marino	esac
20386d7f5d3SJohn Marino}
20486d7f5d3SJohn Marino
20586d7f5d3SJohn Marinothis_test=$(this_test_)
20686d7f5d3SJohn Marino
20786d7f5d3SJohn Marinoskip_=0
20886d7f5d3SJohn Marino# If $privileges_required_ is nonempty, non-root skips this test.
20986d7f5d3SJohn Marinoif test "$privileges_required_" != ''; then
21086d7f5d3SJohn Marino    uid=`id -u` || error 'failed to run "id -u"'
21186d7f5d3SJohn Marino    if test "$uid" != 0; then
21286d7f5d3SJohn Marino	SKIP_TESTS="$SKIP_TESTS $this_test"
21386d7f5d3SJohn Marino	say "you have insufficient privileges for test $this_test"
21486d7f5d3SJohn Marino	skip_=1
21586d7f5d3SJohn Marino    fi
21686d7f5d3SJohn Marinofi
21786d7f5d3SJohn Marino
21886d7f5d3SJohn Marinopwd_=`pwd`
21986d7f5d3SJohn Marino
22086d7f5d3SJohn Marinotest_dir_=${LVM_TEST_DIR-.}
22186d7f5d3SJohn Marinotest "$test_dir_" = . && test_dir_=$pwd_
22286d7f5d3SJohn Marino
22386d7f5d3SJohn Marino# This is a stub function that is run upon trap (upon regular exit and
22486d7f5d3SJohn Marino# interrupt).  Override it with a per-test function, e.g., to unmount
22586d7f5d3SJohn Marino# a partition, or to undo any other global state changes.
22686d7f5d3SJohn Marinocleanup_() { :; }
22786d7f5d3SJohn Marino
22886d7f5d3SJohn Marinofor skp in $SKIP_TESTS
22986d7f5d3SJohn Marinodo
23086d7f5d3SJohn Marino	to_skip=
23186d7f5d3SJohn Marino	for skp in $SKIP_TESTS
23286d7f5d3SJohn Marino	do
23386d7f5d3SJohn Marino		case "$this_test" in
23486d7f5d3SJohn Marino		$skp)
23586d7f5d3SJohn Marino			to_skip=t
23686d7f5d3SJohn Marino		esac
23786d7f5d3SJohn Marino	done
23886d7f5d3SJohn Marino	case "$to_skip" in
23986d7f5d3SJohn Marino	t)
24086d7f5d3SJohn Marino		say >&3 "skipping test $this_test altogether"
24186d7f5d3SJohn Marino		say "skip all tests in $this_test"
24286d7f5d3SJohn Marino		trap - exit
24386d7f5d3SJohn Marino		test_done
24486d7f5d3SJohn Marino	esac
24586d7f5d3SJohn Marinodone
24686d7f5d3SJohn Marino
24786d7f5d3SJohn Marinotest_dir_rand_=$($abs_srcdir/mkdtemp $test_dir_ lvm-$this_test.XXXXXXXXXX) \
24886d7f5d3SJohn Marino    || error "failed to create temporary directory in $test_dir_"
24986d7f5d3SJohn Marino
25086d7f5d3SJohn Marinotestlib_cleanup_() {
25186d7f5d3SJohn Marino    d="$test_dir_rand_";
25286d7f5d3SJohn Marino    cd "$test_dir_" && chmod -R u+rwx "$d" && rm -rf "$d"
25386d7f5d3SJohn Marino}
25486d7f5d3SJohn Marino
25586d7f5d3SJohn Marino# Run each test from within a temporary sub-directory named after the
25686d7f5d3SJohn Marino# test itself, and arrange to remove it upon exception or normal exit.
25786d7f5d3SJohn Marinotrap 'st=$?; cleanup_; testlib_cleanup_; exit $st' 0
25886d7f5d3SJohn Marinotrap '(exit $?); exit $?' 1 2 13 15
25986d7f5d3SJohn Marino
26086d7f5d3SJohn Marinocd $test_dir_rand_ || error "failed to cd to $test_dir_rand_"
26186d7f5d3SJohn Marino
26286d7f5d3SJohn Marinoif test $skip_ = 0; then
26386d7f5d3SJohn Marino  . $abs_srcdir/lvm-utils.sh || exit 1
26486d7f5d3SJohn Marinofi
26586d7f5d3SJohn Marino
26686d7f5d3SJohn Marinoif ( diff --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
26786d7f5d3SJohn Marino  compare='diff -u'
26886d7f5d3SJohn Marinoelif ( cmp --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
26986d7f5d3SJohn Marino  compare='cmp -s'
27086d7f5d3SJohn Marinoelse
27186d7f5d3SJohn Marino  compare=cmp
27286d7f5d3SJohn Marinofi
273