n_bad=0
sum_bad=0
bad=""
+n_notrun=0
notrun=""
interrupt=true
diff="diff -u"
export here=`pwd`
xfile=""
brief_test_summary=false
-
+err_msg=""
+do_report=false
DUMP_OUTPUT=false
# start the initialisation work now
# by default don't output timestamps
timestamp=${TIMESTAMP:=false}
-rm -f $tmp.list $tmp.tmp $tmp.grep $here/$iam.out $tmp.xlist
+rm -f $tmp.list $tmp.tmp $tmp.grep $here/$iam.out $tmp.xlist $tmp.report.*
SRC_GROUPS="generic shared"
export SRC_DIR="tests"
check options
-nfs test NFS
+ -glusterfs test GlusterFS
-cifs test CIFS
-overlay test overlay
+ -pvfs2 test PVFS2
-tmpfs test TMPFS
+ -ubifs test ubifs
-l line mode diff
-udiff show unified diff (default)
-n show me, do not run tests
-r randomize test order
-d dump test output to stdout
-b brief test summary
+ -R fmt[,fmt] generate report in formats specified. Supported format: [xunit]
--large-fs optimise scratch device for large filesystems
-s section run only specified section from config file
-S section exclude the specified section from the config file
testlist options
-g group[,group...] include tests from these groups
-x group[,group...] exclude tests from these groups
- -X file exclude individual tests
+ -X exclude_file exclude individual tests
-E external_file exclude individual tests
[testlist] include tests matching names in testlist
+
+testlist argument is a list of tests in the form of <test dir>/<test name>.
+
+<test dir> is a directory under tests that contains a group file,
+with a list of the names of the tests in that directory.
+
+<test name> may be either a specific test file name (e.g. xfs/001) or
+a test file name match pattern (e.g. xfs/*).
+
+group argument is either a name of a tests group to collect from all
+the test dirs (e.g. quick) or a name of a tests group to collect from
+a specific tests dir in the form of <test dir>/<group name> (e.g. xfs/quick).
+
+exclude_file argument refers to a name of a file inside each test directory.
+for every test dir where this file is found, the listed test names are
+excluded from the list of tests to run from that test dir.
+
+external_file argument is a path to a single file containing a list of tests
+to exclude in the form of <test dir>/<test name>.
+
+examples:
+ check xfs/001
+ check -g quick
+ check -g xfs/quick
+ check -x stress xfs/*
+ check -X .exclude -g auto
+ check -E ~/.xfstests.exclude
'
exit 0
}
+get_sub_group_list()
+{
+ local d=$1
+ local grp=$2
+
+ test -s "$SRC_DIR/$d/group" || return 1
+
+ local grpl=$(sed -n < $SRC_DIR/$d/group \
+ -e 's/#.*//' \
+ -e 's/$/ /' \
+ -e "s;^\($VALID_TEST_NAME\).* $grp .*;$SRC_DIR/$d/\1;p")
+ echo $grpl
+}
+
get_group_list()
{
- grp=$1
+ local grp=$1
+ local grpl=""
+ local sub=$(dirname $grp)
+
+ if [ -n "$sub" -a "$sub" != "." -a -d "$SRC_DIR/$sub" ]; then
+ # group is given as <subdir>/<group> (e.g. xfs/quick)
+ grp=$(basename $grp)
+ get_sub_group_list $sub $grp
+ return
+ fi
for d in $SRC_GROUPS $FSTYP; do
if ! test -d "$SRC_DIR/$d" ; then
continue
fi
- l=$(sed -n < $SRC_DIR/$d/group \
- -e 's/#.*//' \
- -e 's/$/ /' \
- -e "s;^\($VALID_TEST_NAME\).* $grp .*;$SRC_DIR/$d/\1;p")
- grpl="$grpl $l"
+ grpl="$grpl $(get_sub_group_list $d $grp)"
done
echo $grpl
}
-\? | -h | --help) usage ;;
-nfs) FSTYP=nfs ;;
+ -glusterfs) FSTYP=glusterfs ;;
-cifs) FSTYP=cifs ;;
- -overlay) FSTYP=overlay ;;
+ -overlay) FSTYP=overlay; export OVERLAY=true ;;
+ -pvfs2) FSTYP=pvfs2 ;;
-tmpfs) FSTYP=tmpfs ;;
+ -ubifs) FSTYP=ubifs ;;
-g) group=$2 ; shift ;
GROUP_LIST="$GROUP_LIST ${group//,/ }"
-T) timestamp=true ;;
-d) DUMP_OUTPUT=true ;;
-b) brief_test_summary=true;;
-
+ -R) report_fmt=$2 ; shift ;
+ REPORT_LIST="$REPORT_LIST ${report_fmt//,/ }"
+ do_report=true
+ ;;
--large-fs) export LARGE_SCRATCH_DEV=yes ;;
--extra-space=*) export SCRATCH_DEV_EMPTY_SPACE=${r#*=} ;;
{
n_try="0"
n_bad="0"
+ n_notrun="0"
unset try notrun bad
}
check="$RESULT_BASE/check"
if $showme; then
- :
+ if $needwrap; then
+ if $do_report; then
+ _make_section_report
+ fi
+ needwrap=false
+ fi
elif $needwrap; then
if [ -f $check.time -a -f $tmp.time ]; then
cat $check.time $tmp.time \
echo "Ran:$try" >>$check.log
fi
- $interrupt && echo "Interrupted!" >>$check.log
+ $interrupt && echo "Interrupted!" | tee -a $check.log
if [ ! -z "$notrun" ]; then
if [ $brief_test_summary == "false" ]; then
echo "Passed all $n_try tests" >>$tmp.summary
fi
echo "" >>$tmp.summary
+ if $do_report; then
+ _make_section_report
+ fi
needwrap=false
fi
for section in $HOST_OPTIONS_SECTIONS; do
OLD_FSTYP=$FSTYP
- OLD_MOUNT_OPTIONS=$MOUNT_OPTIONS
+ OLD_TEST_FS_MOUNT_OPTS=$TEST_FS_MOUNT_OPTS
get_next_config $section
# Do we need to run only some sections ?
echo "SECTION -- $section"
fi
+ sect_start=`_wallclock`
if $RECREATE_TEST_DEV || [ "$OLD_FSTYP" != "$FSTYP" ]; then
echo "RECREATING -- $FSTYP on $TEST_DEV"
_test_unmount 2> /dev/null
status=1
exit
fi
- out=`_mount_or_remount_rw "$MOUNT_OPTIONS" $TEST_DEV $TEST_DIR`
- if [ $? -ne 1 ]; then
- echo $out
+ if ! _test_mount
+ then
+ echo "check: failed to mount $TEST_DEV on $TEST_DIR"
status=1
exit
fi
_prepare_test_list
- elif [ "$OLD_MOUNT_OPTIONS" != "$MOUNT_OPTIONS" ]; then
+ elif [ "$OLD_TEST_FS_MOUNT_OPTS" != "$TEST_FS_MOUNT_OPTS" ]; then
_test_unmount 2> /dev/null
- out=`_mount_or_remount_rw "$MOUNT_OPTIONS" $TEST_DEV $TEST_DIR`
- if [ $? -ne 1 ]; then
- echo $out
+ if ! _test_mount
+ then
+ echo "check: failed to mount $TEST_DEV on $TEST_DIR"
status=1
exit
fi
for seq in $list
do
err=false
+ err_msg=""
if [ ! -f $seq ]; then
# Try to get full name in case the user supplied only seq id
# and the test has a name. A bit of hassle to find really
group=`dirname $seq`
if $OPTIONS_HAVE_SECTIONS; then
export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;${RESULT_BASE}/$section;"`
- seqres="$RESULT_BASE/$section/$seqnum"
+ REPORT_DIR="$RESULT_BASE/$section"
else
export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;$RESULT_BASE;"`
- seqres="$RESULT_BASE/$seqnum"
+ REPORT_DIR="$RESULT_BASE"
fi
+ seqres="$REPORT_DIR/$seqnum"
mkdir -p $RESULT_DIR
echo -n "$seqnum"
- if $showme; then
- echo
- continue
+ if $showme; then
+ echo
+ start=0
+ stop=0
+ n_notrun=`expr $n_notrun + 1`
+ if $do_report; then
+ _make_testcase_report "list"
fi
-
- if [ ! -f $seq ]; then
- echo " - no such test?"
- else
+ continue
+ fi
+ tc_status="pass"
+ if [ ! -f $seq ]; then
+ echo " - no such test?"
+ else
# really going to try and run this one
#
rm -f $seqres.out.bad
if [ -f core ]
then
- echo -n " [dumped core]"
+ err_msg="[dumped core]"
+ echo -n " $err_msg"
mv core $RESULT_BASE/$seqnum.core
err=true
fi
$timestamp && echo " [not run]" && echo -n " $seqnum -- "
cat $seqres.notrun
notrun="$notrun $seqnum"
+ n_notrun=`expr $n_notrun + 1`
+ tc_status="notrun"
else
if [ $sts -ne 0 ]
then
- echo -n " [failed, exit status $sts]"
+ err_msg="[failed, exit status $sts]"
+ echo -n " $err_msg"
err=true
fi
if [ ! -f $seq.out ]
then
- echo " - no qualified output"
+ _dump_err "no qualified output"
err=true
else
" to see the entire diff)"
fi; } | \
sed -e 's/^\(.\)/ \1/'
+ err_msg="output mismatch (see $diff $seq.out $seqres.out.bad)"
err=true
fi
fi
bad="$bad $seqnum"
n_bad=`expr $n_bad + 1`
quick=false
+ tc_status="fail"
+ fi
+ if $do_report; then
+ _make_testcase_report "$tc_status"
fi
-
seq="after_$seqnum"
done
+ sect_stop=`_wallclock`
+ interrupt=false
_wrapup
+ interrupt=true
echo
_test_unmount 2> /dev/null