2007-09-18 18:00:42 +04:00
#!/bin/sh
# Derived from git's t/test-lib.sh, which is Copyright (c) 2005 Junio C Hamano
2007-09-18 18:02:22 +04:00
#
# 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
2007-09-18 18:00:42 +04:00
# 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 " * $* "
}
2007-10-09 17:13:06 +04:00
this_test_( ) { expr " ./ $0 " : '.*/t-\([^/]*\)\.sh$' ; }
2007-09-18 18:00:42 +04:00
test " ${ test_description } " != "" ||
error "Test script did not set test_description."
while test " $# " -ne 0
do
case " $1 " in
-d| --d| --de| --deb| --debu| --debug)
debug = t; shift ; ;
-i| --i| --im| --imm| --imme| --immed| --immedi| --immedia| --immediat| --immediate)
immediate = t; shift ; ;
-h| --h| --he| --hel| --help)
echo " $test_description "
exit 0 ; ;
-v| --v| --ve| --ver| --verb| --verbo| --verbos| --verbose)
verbose = t; shift ; ;
esac
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
2007-10-09 17:13:06 +04:00
test_dir_rand_ = $( $abs_srcdir /mkdtemp $test_dir_ lvm-$this_test .XXXXXXXXXX) \
2007-09-18 18:00:42 +04:00
|| error " failed to create temporary directory in $test_dir_ "
# Run each test from within a temporary sub-directory named after the
# test itself, and arrange to remove it upon exception or normal exit.
2007-10-09 17:13:06 +04:00
trap 'st=$?; cleanup_; d=' " $test_dir_rand_ " ' ;
2007-09-18 18:00:42 +04:00
cd '"$test_dir_"' && chmod -R u+rwx " $d " && rm -rf " $d " && exit $st ' 0
trap '(exit $?); exit $?' 1 2 13 15
2007-10-09 17:13:06 +04:00
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
2007-09-18 18:00:42 +04:00
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