mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-22 17:35:59 +03:00
b68d755f77
be able to call proper EXIT traps.
273 lines
5.7 KiB
Bash
Executable File
273 lines
5.7 KiB
Bash
Executable File
#!/bin/sh
|
|
# Derived from git's t/test-lib.sh, which is Copyright (c) 2005 Junio C Hamano
|
|
#
|
|
# This copyrighted material is made available to anyone wishing to use,
|
|
# modify, copy, or redistribute it subject to the terms and conditions
|
|
# of the GNU General Public License v.2.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
# For repeatability, reset the environment to known value.
|
|
LANG=C
|
|
LC_ALL=C
|
|
TZ=UTC
|
|
export LANG LC_ALL TZ
|
|
|
|
. ./init.sh || { echo >&2 you must run make first; exit 1; }
|
|
|
|
# Protect ourselves from common misconfiguration to export
|
|
# CDPATH into the environment
|
|
unset CDPATH
|
|
|
|
# Each test should start with something like this, after copyright notices:
|
|
#
|
|
# test_description='Description of this test...
|
|
# This test checks if command xyzzy does the right thing...
|
|
# '
|
|
# . ./test-lib.sh
|
|
|
|
error () {
|
|
echo "* error: $*"
|
|
exit 1
|
|
}
|
|
|
|
say () {
|
|
echo "* $*"
|
|
}
|
|
|
|
this_test_() { expr "./$0" : '.*/t-\([^/]*\)\.sh$'; }
|
|
|
|
test "${test_description}" != "" ||
|
|
error "Test script did not set test_description."
|
|
|
|
verboselevel=0
|
|
while test "$#" -ne 0
|
|
do
|
|
case "$1" in
|
|
-d|--d|--de|--deb|--debu|--debug)
|
|
debug=t ;;
|
|
-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
|
|
immediate=t ;;
|
|
-h|--h|--he|--hel|--help)
|
|
echo "$test_description"
|
|
exit 0 ;;
|
|
-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
|
|
verbose=t ;;
|
|
-vv|-vvv|-vvvv)
|
|
verboselevel=${#1}
|
|
verboselevel=$(($verboselevel - 1))
|
|
verbose=t ;;
|
|
*)
|
|
echo "$0: unsupported option $1"
|
|
exit 0 ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
exec 5>&1
|
|
if test "$verbose" = "t"
|
|
then
|
|
exec 4>&2 3>&1
|
|
else
|
|
exec 4>/dev/null 3>/dev/null
|
|
fi
|
|
|
|
test_failure=0
|
|
test_count=0
|
|
|
|
trap 'echo >&5 "FATAL: Unexpected exit with code $?"; exit 1' exit
|
|
|
|
# You are not expected to call test_ok_ and test_failure_ directly, use
|
|
# the text_expect_* functions instead.
|
|
|
|
test_ok_ () {
|
|
test_count=$(expr "$test_count" + 1)
|
|
say " ok $test_count: $@"
|
|
}
|
|
|
|
test_failure_ () {
|
|
test_count=$(expr "$test_count" + 1)
|
|
test_failure=$(expr "$test_failure" + 1);
|
|
say "FAIL $test_count: $1"
|
|
shift
|
|
echo "$@" | sed -e 's/^/ /'
|
|
test "$immediate" = "" || exit 1
|
|
}
|
|
|
|
test_debug () {
|
|
test "$debug" = "" || eval "$1"
|
|
}
|
|
|
|
test_run_ () {
|
|
eval >&3 2>&4 "$1"
|
|
eval_ret="$?"
|
|
return 0
|
|
}
|
|
|
|
test_skip () {
|
|
this_test=$(this_test_)
|
|
this_test="$this_test.$(expr "$test_count" + 1)"
|
|
to_skip=
|
|
for skp in $SKIP_TESTS
|
|
do
|
|
case "$this_test" in
|
|
$skp)
|
|
to_skip=t
|
|
esac
|
|
done
|
|
case "$to_skip" in
|
|
t)
|
|
say >&3 "skipping test: $@"
|
|
test_count=$(expr "$test_count" + 1)
|
|
say "skip $test_count: $1"
|
|
: true
|
|
;;
|
|
*)
|
|
false
|
|
;;
|
|
esac
|
|
}
|
|
|
|
test_expect_failure () {
|
|
test "$#" = 2 ||
|
|
error "bug in the test script: not 2 parameters to test-expect-failure"
|
|
if ! test_skip "$@"
|
|
then
|
|
say >&3 "expecting failure: $2"
|
|
test_run_ "$2"
|
|
if [ "$?" = 0 -a "$eval_ret" != 0 -a "$eval_ret" -lt 129 ]
|
|
then
|
|
test_ok_ "$1"
|
|
else
|
|
test_failure_ "$@"
|
|
fi
|
|
fi
|
|
echo >&3 ""
|
|
}
|
|
|
|
test_expect_success () {
|
|
test "$#" = 2 ||
|
|
error "bug in the test script: not 2 parameters to test-expect-success"
|
|
if ! test_skip "$@"
|
|
then
|
|
say >&3 "expecting success: $2"
|
|
test_run_ "$2"
|
|
if [ "$?" = 0 -a "$eval_ret" = 0 ]
|
|
then
|
|
test_ok_ "$1"
|
|
else
|
|
test_failure_ "$@"
|
|
fi
|
|
fi
|
|
echo >&3 ""
|
|
}
|
|
|
|
test_expect_code () {
|
|
test "$#" = 3 ||
|
|
error "bug in the test script: not 3 parameters to test-expect-code"
|
|
if ! test_skip "$@"
|
|
then
|
|
say >&3 "expecting exit code $1: $3"
|
|
test_run_ "$3"
|
|
if [ "$?" = 0 -a "$eval_ret" = "$1" ]
|
|
then
|
|
test_ok_ "$2"
|
|
else
|
|
test_failure_ "$@"
|
|
fi
|
|
fi
|
|
echo >&3 ""
|
|
}
|
|
|
|
test_done () {
|
|
case "$test_failure" in
|
|
0)
|
|
# We could:
|
|
# cd .. && rm -fr trash
|
|
# but that means we forbid any tests that use their own
|
|
# subdirectory from calling test_done without coming back
|
|
# to where they started from.
|
|
# The Makefile provided will clean this test area so
|
|
# we will leave things as they are.
|
|
|
|
say "passed all $test_count test(s)"
|
|
exit 0 ;;
|
|
|
|
*)
|
|
say "failed $test_failure among $test_count test(s)"
|
|
exit 1 ;;
|
|
|
|
esac
|
|
}
|
|
|
|
this_test=$(this_test_)
|
|
|
|
skip_=0
|
|
# If $privileges_required_ is nonempty, non-root skips this test.
|
|
if test "$privileges_required_" != ''; then
|
|
uid=`id -u` || error 'failed to run "id -u"'
|
|
if test "$uid" != 0; then
|
|
SKIP_TESTS="$SKIP_TESTS $this_test"
|
|
say "you have insufficient privileges for test $this_test"
|
|
skip_=1
|
|
fi
|
|
fi
|
|
|
|
pwd_=`pwd`
|
|
|
|
test_dir_=${LVM_TEST_DIR-.}
|
|
test "$test_dir_" = . && test_dir_=$pwd_
|
|
|
|
# This is a stub function that is run upon trap (upon regular exit and
|
|
# interrupt). Override it with a per-test function, e.g., to unmount
|
|
# a partition, or to undo any other global state changes.
|
|
cleanup_() { :; }
|
|
|
|
for skp in $SKIP_TESTS
|
|
do
|
|
to_skip=
|
|
for skp in $SKIP_TESTS
|
|
do
|
|
case "$this_test" in
|
|
$skp)
|
|
to_skip=t
|
|
esac
|
|
done
|
|
case "$to_skip" in
|
|
t)
|
|
say >&3 "skipping test $this_test altogether"
|
|
say "skip all tests in $this_test"
|
|
trap - exit
|
|
test_done
|
|
esac
|
|
done
|
|
|
|
test_dir_rand_=$($abs_srcdir/mkdtemp $test_dir_ lvm-$this_test.XXXXXXXXXX) \
|
|
|| error "failed to create temporary directory in $test_dir_"
|
|
|
|
testlib_cleanup_() {
|
|
d="$test_dir_rand_";
|
|
cd "$test_dir_" && chmod -R u+rwx "$d" && rm -rf "$d"
|
|
}
|
|
|
|
# Run each test from within a temporary sub-directory named after the
|
|
# test itself, and arrange to remove it upon exception or normal exit.
|
|
trap 'st=$?; cleanup_; testlib_cleanup_; exit $st' 0
|
|
trap '(exit $?); exit $?' 1 2 13 15
|
|
|
|
cd $test_dir_rand_ || error "failed to cd to $test_dir_rand_"
|
|
|
|
if test $skip_ = 0; then
|
|
. $abs_srcdir/lvm-utils.sh || exit 1
|
|
fi
|
|
|
|
if ( diff --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
|
|
compare='diff -u'
|
|
elif ( cmp --version < /dev/null 2>&1 | grep GNU ) 2>&1 > /dev/null; then
|
|
compare='cmp -s'
|
|
else
|
|
compare=cmp
|
|
fi
|