2013-08-21 00:50:41 -07:00
#!/bin/bash
2014-03-06 16:53:50 +00:00
# Copyright (c) 2013-2014 Red Hat, Inc. <http://www.redhat.com>
2013-08-21 00:50:41 -07:00
#
2014-05-20 19:18:31 +05:30
export TZ = UTC
2014-03-06 16:53:50 +00:00
function check_dependencies( )
{
## Check all dependencies are present
MISSING = ""
# Check for dbench
2014-08-08 01:56:23 -07:00
env dbench --usage > /dev/null 2>& 1
if [ $? -ne 0 ] ; then
2014-03-06 16:53:50 +00:00
MISSING = " $MISSING dbench "
fi
# Check for git
env git --version > /dev/null 2>& 1
if [ $? -ne 0 ] ; then
MISSING = " $MISSING git "
fi
2014-10-09 09:08:57 +02:00
# Check for nfs-utils (Linux-only: built-in NetBSD with different name)
if [ "x`uname -s`" = "xLinux" ] ; then
env mount.nfs -V > /dev/null 2>& 1
if [ $? -ne 0 ] ; then
MISSING = " $MISSING nfs-utils "
fi
2014-03-06 16:53:50 +00:00
fi
# Check for the Perl Test Harness
env prove --version > /dev/null 2>& 1
if [ $? -ne 0 ] ; then
MISSING = " $MISSING perl-Test-Harness "
fi
2014-08-08 01:56:23 -07:00
which json_verify > /dev/null
if [ $? -ne 0 ] ; then
MISSING = " $MISSING json_verify "
2014-06-13 03:33:51 +01:00
fi
2014-10-09 09:08:57 +02:00
# Check for XFS programs (Linux Only: NetBSD does without)
if [ "x`uname -s`" = "xLinux" ] ; then
env mkfs.xfs -V > /dev/null 2>& 1
if [ $? -ne 0 ] ; then
MISSING = " $MISSING xfsprogs "
fi
2014-03-06 16:53:50 +00:00
fi
# Check for attr
env getfattr --version > /dev/null 2>& 1
if [ $? -ne 0 ] ; then
MISSING = " $MISSING attr "
fi
2014-07-29 02:32:14 +02:00
# Check for pidof
2014-09-04 19:30:48 +05:30
pidof pidof > /dev/null 2>& 1
2014-07-29 02:32:14 +02:00
if [ $? -ne 0 ] ; then
MISSING = " $MISSING pidof "
fi
2014-08-19 16:14:03 -07:00
# check for psutil python package
test ` uname -s` = = "Darwin" || test ` uname -s` = = "FreeBSD" && {
pip show psutil | grep -q psutil >/dev/null 2>& 1
if [ $? -ne 0 ] ; then
MISSING = " $MISSING psutil "
fi
}
2014-03-06 16:53:50 +00:00
## If dependencies are missing, warn the user and abort
if [ " x $MISSING " != "x" ] ; then
2014-07-29 02:32:14 +02:00
test " x ${ force } " != "xyes" && echo "Aborting."
2014-03-06 16:53:50 +00:00
echo
echo "The following required tools are missing:"
echo
for pkg in $MISSING ; do
echo " * $pkg "
done
echo
2014-07-29 02:32:14 +02:00
test " x ${ force } " = "xyes" && return
2014-03-06 16:53:50 +00:00
echo "Please install them and try again."
echo
exit 2
fi
}
function check_location( )
2013-08-21 00:50:41 -07:00
{
2013-09-15 19:56:25 -07:00
regression_testsdir = $( dirname $0 ) ;
2013-08-21 00:50:41 -07:00
if [ ! -f ${ regression_testsdir } /tests/include.rc ] ; then
2014-03-06 16:53:50 +00:00
echo "Aborting."
echo
echo "The tests/ subdirectory seems to be missing."
echo
echo "Please correct the problem and try again."
echo
2013-08-21 00:50:41 -07:00
exit 1
fi
}
2014-03-06 16:53:50 +00:00
function check_user( )
{
# If we're not running as root, warn the user and abort
MYUID = ` /usr/bin/id -u`
if [ 0${ MYUID } -ne 0 ] ; then
echo "Aborting."
echo
echo "The GlusterFS Test Framework must be run as root."
echo
echo "Please change to the root user and try again."
echo
exit 3
fi
}
2014-07-10 20:17:25 +02:00
function run_tests( )
{
declare -A DONE
match( )
{
# Patterns considered valid:
# 1. full or partial file/directory names
# basic matches tests/basic
# basic/afr matches tests/basic/afr
# 2. globs
# basic/* matches all files and directories in basic
# basic/*/ matches subdirectories in basic (afr|ec)
# 3. numbered bug matching
# 884455 matches bugs/bug-884455.t
# 859927 matches bugs/859927, bugs/bug-859927.t
# 1015990 matches /bugs/bug-1015990-rep.t, bug-1015990.t
# ...lots of other cases accepted as well, since globbing is tricky.
local t = $1
local mt = $1
shift
local a
local match = 1
if [ -d $t ] ; then
# Allow matching on globs like 'basic/*/'
mt = $t /
fi
for a in " $@ " ; do
case " $mt " in
*$a | */bugs/$a /| */bugs/$a .t| */bugs/bug-$a .t| */bugs/bug-$a -*.t)
match = 0
; ;
esac
done
if [ " ${ DONE [ $( dirname $t ) ] } " != "" ] ; then
# Parentdir is already matched
match = 1
if [ -d $t ] ; then
# Ignore subdirectory as well
DONE[ $t ] = $t
fi
elif [ $match -eq 0 -a -d $t ] ; then
# Make sure children of this matched directory will be ignored
DONE[ $t ] = $t
elif [ [ -f $t && ! $t = ~ .*\. t ] ] ; then
# Ignore files not ending in .t
match = 1
fi
return $match
}
RES = 0
2015-05-28 19:26:00 +05:30
for t in $( find ${ regression_testsdir } /tests | LC_COLLATE = C sort) ; do
2014-07-10 20:17:25 +02:00
if match $t " $@ " ; then
if [ -d $t ] ; then
echo " Running tests in directory $t "
prove -rf --timer $t
elif [ -f $t ] ; then
echo " Running tests in file $t "
prove -f --timer $t
fi
2014-06-29 18:56:44 -07:00
TMP_RES = $?
2014-07-10 20:17:25 +02:00
if [ ${ TMP_RES } -ne 0 ] ; then
RES = ${ TMP_RES }
FAILED = " $FAILED $t "
fi
fi
done
if [ ${ RES } -ne 0 ] ; then
2015-04-06 06:21:05 +02:00
FAILED = $( echo ${ FAILED } | tr ' ' '\n' | sort -u )
2014-07-10 20:17:25 +02:00
echo " Failed tests ${ FAILED } "
fi
return ${ RES }
}
2015-04-15 22:58:59 -04:00
# If you're submitting a fix related to one of these tests and want its result
# to be considered, you'll need to remove it from the list as part of your
# patch.
function is_bad_test ( )
2015-04-07 15:32:18 -04:00
{
2015-04-15 22:58:59 -04:00
local name = $1
2015-05-27 16:40:52 +05:30
for bt in ./tests/basic/quota-anon-fd-nfs.t \
2015-11-05 10:04:42 -05:00
./tests/basic/mount-nfs-auth.t \
2015-09-01 14:21:43 +05:30
./tests/basic/quota-nfs.t \
2015-07-29 16:24:37 +05:30
./tests/basic/tier/tier_lookup_heal.t \
./tests/basic/tier/bug-1214222-directories_miising_after_attach_tier.t \
2015-08-08 21:29:55 +05:30
./tests/bugs/snapshot/bug-1109889.t \
./tests/bugs/distribute/bug-1066798.t \
2015-08-28 10:46:11 +05:30
./tests/bugs/glusterd/bug-1238706-daemons-stop-on-peer-cleanup.t \
2015-09-01 10:53:19 +05:30
./tests/bugs/glusterd/bug-948686.t \
2015-09-14 15:43:31 +05:30
./tests/geo-rep/georep-basic-dr-rsync.t \
2015-09-29 12:31:22 +05:30
./tests/geo-rep/georep-basic-dr-tarssh.t \
2015-10-05 12:54:34 +05:30
./tests/bugs/replicate/bug-1221481-allow-fops-on-dir-split-brain.t \
2015-11-02 07:56:51 +05:30
./tests/basic/ec/ec-readdir.t \
2015-08-24 16:20:06 +05:30
; do
2015-04-15 22:58:59 -04:00
[ x" $name " = x" $bt " ] && return 0 # bash: zero means true/success
done
return 1 # bash: non-zero means false/failure
}
2015-04-07 15:32:18 -04:00
2015-04-15 22:58:59 -04:00
function run_all ( )
{
2015-04-07 15:32:18 -04:00
find ${ regression_testsdir } /tests -name '*.t' \
| LC_COLLATE = C sort \
| while read t; do
2015-04-15 22:58:59 -04:00
old_cores = $( ls /core.* 2> /dev/null | wc -l)
2015-04-07 15:32:18 -04:00
retval = 0
2015-07-30 11:57:45 +05:30
prove -mf --timer $t
2015-04-07 15:32:18 -04:00
TMP_RES = $?
if [ ${ TMP_RES } -ne 0 ] ; then
echo " $t : bad status $TMP_RES "
retval = $(( retval+1))
fi
new_cores = $( ls /core.* 2> /dev/null | wc -l)
if [ x" $new_cores " != x" $old_cores " ] ; then
core_diff = $(( new_cores-old_cores))
echo " $t : $core_diff new core files "
retval = $(( retval+2))
fi
if [ $retval -ne 0 ] ; then
2015-04-15 22:58:59 -04:00
if is_bad_test $t ; then
echo " Ignoring failure from known-bad test $t "
2015-10-09 22:11:23 +05:30
retval = 0
else
2015-07-30 11:57:45 +05:30
echo
echo " Running failed test $t in debug mode "
echo "Just for debug data, does not change test result"
echo
bash -x $t
echo
2015-04-15 22:58:59 -04:00
return $retval
fi
2015-04-07 15:32:18 -04:00
fi
done
}
2013-08-21 00:50:41 -07:00
function main( )
{
if [ $# -lt 1 ] ; then
2015-04-07 15:32:18 -04:00
echo "Running all the regression test cases (new way)"
#prove -rf --timer ${regression_testsdir}/tests;
run_all
2013-08-21 00:50:41 -07:00
else
2014-07-10 20:17:25 +02:00
run_tests " $@ "
2013-08-21 00:50:41 -07:00
fi
}
2015-04-06 06:21:05 +02:00
function main_and_retry( )
{
RESFILE = ` mktemp /tmp/${ 0 ##*/ } .XXXXXX` || exit 1
main " $@ " | tee ${ RESFILE }
2015-04-17 18:06:17 +02:00
RET = $?
2015-04-06 06:21:05 +02:00
FAILED = $( awk '/Failed: /{print $1}' ${ RESFILE } )
if [ " x ${ FAILED } " != "x" ] ; then
echo ""
echo " *********************************"
echo " * REGRESSION FAILED *"
echo " * Retrying failed tests in case *"
echo " * we got some spurous failures *"
echo " *********************************"
echo ""
main ${ FAILED }
2015-04-17 18:06:17 +02:00
RET = $?
2015-04-06 06:21:05 +02:00
fi
rm -f ${ RESFILE }
2015-04-17 18:06:17 +02:00
return ${ RET }
2015-04-06 06:21:05 +02:00
}
2014-03-06 16:53:50 +00:00
echo
echo ... GlusterFS Test Framework ...
echo
2015-04-06 06:21:05 +02:00
force = "no"
retry = "no"
args = ` getopt fr $* `
set -- $args
while [ $# -gt 0 ] ; do
case " $1 " in
-f) force = "yes" ; ;
-r) retry = "yes" ; ;
--) shift; break; ;
esac
shift
done
2014-07-29 02:32:14 +02:00
2014-03-06 16:53:50 +00:00
# Make sure we're running as the root user
check_user
# Make sure the needed programs are available
check_dependencies
# Check we're running from the right location
check_location
# Run the tests
2015-04-06 06:21:05 +02:00
if [ " x ${ retry } " = "xyes" ] ; then
main_and_retry $@
else
main " $@ "
fi