export here=`pwd`
xfile=""
brief_test_summary=false
-err_msg=""
do_report=false
DUMP_OUTPUT=false
+# This is a global variable used to pass test failure text to reporting gunk
+_err_msg=""
+
# start the initialisation work now
iam=check
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).
+If you want to run all the tests in the test suite, use "-g all" to specify all
+groups.
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
fi
# Specified groups to include
- for group in $GROUP_LIST; do
- list=$(get_group_list $group)
- if [ -z "$list" ]; then
- echo "Group \"$group\" is empty or not defined?"
- exit 1
- fi
+ # Note that the CLI processing adds a leading space to the first group
+ # parameter, so we have to catch that here checking for "all"
+ if ! $have_test_arg && [ "$GROUP_LIST" == " all" ]; then
+ # no test numbers, do everything
+ get_all_tests
+ else
+ for group in $GROUP_LIST; do
+ list=$(get_group_list $group)
+ if [ -z "$list" ]; then
+ echo "Group \"$group\" is empty or not defined?"
+ exit 1
+ fi
- for t in $list; do
- grep -s "^$t\$" $tmp.list >/dev/null || \
+ for t in $list; do
+ grep -s "^$t\$" $tmp.list >/dev/null || \
echo "$t" >>$tmp.list
+ done
done
- done
-
- if ! $have_test_arg && [ -z "$GROUP_LIST" ]; then
- # no test numbers, do everything
- get_all_tests
fi
# Specified groups to exclude
shift
done
-# we need common/config, source it after processing args, overlay needs FSTYP
-# set before sourcing common/config
-if ! . ./common/config; then
- echo "$iam: failed to source common/config"
+# we need common/rc, that also sources common/config. We need to source it
+# after processing args, overlay needs FSTYP set before sourcing common/config
+if ! . ./common/rc; then
+ echo "check: failed to source common/rc"
exit 1
fi
shift
done
-fi
-
-# we need common/rc
-if ! . ./common/rc
-then
- echo "check: failed to source common/rc"
- exit 1
+elif [ -z "$GROUP_LIST" ]; then
+ # default group list is the auto group. If any other group or test is
+ # specified, we use that instead.
+ GROUP_LIST="auto"
fi
if [ `id -u` -ne 0 ]
if [ -f ${RESULT_DIR}/require_test ]; then
_check_test_fs || err=true
rm -f ${RESULT_DIR}/require_test*
+ else
+ _test_unmount 2> /dev/null
fi
if [ -f ${RESULT_DIR}/require_scratch ]; then
_check_scratch_fs || err=true
rm -f ${RESULT_DIR}/require_scratch*
+ else
+ _scratch_unmount 2> /dev/null
fi
}
seqres="$check"
_check_test_fs
- 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
- # the test and not its sample output or helping files.
- bname=$(basename $seq)
- full_seq=$(find $(dirname $seq) -name $bname* -executable |
- awk '(NR == 1 || length < length(shortest)) { shortest = $0 }\
- END { print shortest }')
- if [ -f $full_seq ] \
- && [ x$(echo $bname | grep -o "^$VALID_TEST_ID") != x ]; then
- seq=$full_seq
- fi
- fi
+ err=false
+ first_test=true
+ prev_seq=""
+ for seq in $list ; do
+ # Run report for previous test!
+ if $err ; then
+ bad="$bad $seqnum"
+ n_bad=`expr $n_bad + 1`
+ tc_status="fail"
+ fi
+ if $do_report && ! $first_test ; then
+ if [ $tc_status != "expunge" ] ; then
+ _make_testcase_report "$prev_seq" "$tc_status"
+ fi
+ fi
+ first_test=false
+
+ err=false
+ prev_seq="$seq"
+ 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 the test and not its sample output or
+ # helping files.
+ bname=$(basename $seq)
+ full_seq=$(find $(dirname $seq) -name $bname* -executable |
+ awk '(NR == 1 || length < length(shortest)) { shortest = $0 }\
+ END { print shortest }')
+ if [ -f $full_seq ] && \
+ [ x$(echo $bname | grep -o "^$VALID_TEST_ID") != x ]; then
+ seq=$full_seq
+ fi
+ fi
- # the filename for the test and the name output are different.
- # we don't include the tests/ directory in the name output.
- export seqnum=`echo $seq | sed -e "s;$SRC_DIR/;;"`
-
- # Similarly, the result directory needs to replace the tests/
- # part of the test location.
- group=`dirname $seq`
- if $OPTIONS_HAVE_SECTIONS; then
- export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;${RESULT_BASE}/$section;"`
- REPORT_DIR="$RESULT_BASE/$section"
- else
- export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;$RESULT_BASE;"`
- REPORT_DIR="$RESULT_BASE"
- fi
- seqres="$REPORT_DIR/$seqnum"
+ # the filename for the test and the name output are different.
+ # we don't include the tests/ directory in the name output.
+ export seqnum=`echo $seq | sed -e "s;$SRC_DIR/;;"`
- mkdir -p $RESULT_DIR
+ # Similarly, the result directory needs to replace the tests/
+ # part of the test location.
+ group=`dirname $seq`
+ if $OPTIONS_HAVE_SECTIONS; then
+ export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;${RESULT_BASE}/$section;"`
+ REPORT_DIR="$RESULT_BASE/$section"
+ else
+ export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;$RESULT_BASE;"`
+ REPORT_DIR="$RESULT_BASE"
+ fi
+ seqres="$REPORT_DIR/$seqnum"
- echo -n "$seqnum"
+ mkdir -p $RESULT_DIR
+ echo -n "$seqnum"
- if $showme; then
- _expunge_test $seqnum
- if [ $? -eq 1 ]; then
+ if $showme; then
+ _expunge_test $seqnum
+ if [ $? -eq 1 ]; then
+ tc_status="expunge"
+ continue
+ fi
+ echo
+ start=0
+ stop=0
+ tc_status="list"
+ n_notrun=`expr $n_notrun + 1`
continue
fi
- echo
- start=0
- stop=0
- n_notrun=`expr $n_notrun + 1`
- if $do_report; then
- _make_testcase_report "list"
+
+ tc_status="pass"
+ if [ ! -f $seq ]; then
+ echo " - no such test?"
+ continue
fi
- 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
# check if we really should run it
_expunge_test $seqnum
if [ $? -eq 1 ]; then
+ tc_status="expunge"
continue
fi
+ # record that we really tried to run this test.
+ try="$try $seqnum"
+ n_try=`expr $n_try + 1`
+
# slashes now in names, sed barfs on them so use grep
lasttime=`grep -w ^$seqnum $check.time | awk '// {print $2}'`
if [ "X$lasttime" != X ]; then
- echo -n " ${lasttime}s ..."
+ echo -n " ${lasttime}s ... "
else
- echo -n " " # prettier output with timestamps.
+ echo -n " " # prettier output with timestamps.
fi
rm -f core $seqres.notrun
touch ${RESULT_DIR}/check_dmesg
fi
if [ "$DUMP_OUTPUT" = true ]; then
- ./$seq 2>&1 | tee $tmp.rawout
+ ./$seq 2>&1 | tee $tmp.out
# Because $? would get tee's return code
sts=${PIPESTATUS[0]}
else
- ./$seq >$tmp.rawout 2>&1
+ ./$seq >$tmp.out 2>&1
sts=$?
fi
- $timestamp && _timestamp
- stop=`_wallclock`
- _fix_malloc <$tmp.rawout >$tmp.out
- rm -f $tmp.rawout
+ if [ -f core ]; then
+ _dump_err_cont "[dumped core]"
+ mv core $RESULT_BASE/$seqnum.core
+ err=true
+ fi
- if [ -f core ]
- then
- err_msg="[dumped core]"
- echo -n " $err_msg"
- mv core $RESULT_BASE/$seqnum.core
- err=true
+ if [ -f $seqres.notrun ]; then
+ $timestamp && _timestamp
+ stop=`_wallclock`
+ $timestamp || echo -n "[not run] "
+ $timestamp && echo " [not run]" && \
+ echo -n " $seqnum -- "
+ cat $seqres.notrun
+ notrun="$notrun $seqnum"
+ n_notrun=`expr $n_notrun + 1`
+ tc_status="notrun"
+ continue;
fi
- if [ -f $seqres.notrun ]
- then
- $timestamp || echo -n " [not run] "
- $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
- err_msg="[failed, exit status $sts]"
- echo -n " $err_msg"
+ if [ $sts -ne 0 ]; then
+ _dump_err_cont "[failed, exit status $sts]"
+ _test_unmount 2> /dev/null
+ _scratch_unmount 2> /dev/null
err=true
- fi
- if [ ! -f $seq.out ]
- then
+ else
+ # the test apparently passed, so check for corruption
+ # and log messages that shouldn't be there.
+ _check_filesystems
+ _check_dmesg || err=true
+ _check_kmemleak || err=true
+ fi
+
+ # test ends after all checks are done.
+ $timestamp && _timestamp
+ stop=`_wallclock`
+
+ if [ ! -f $seq.out ]; then
_dump_err "no qualified output"
err=true
- else
-
- # coreutils 8.16+ changed quote formats in error messages from
- # `foo' to 'foo'. Filter old versions to match the new version.
- sed -i "s/\`/\'/g" $tmp.out
- if diff $seq.out $tmp.out >/dev/null 2>&1
- then
- if $err
- then
- :
- else
+ continue;
+ fi
+
+ # coreutils 8.16+ changed quote formats in error messages
+ # from `foo' to 'foo'. Filter old versions to match the new
+ # version.
+ sed -i "s/\`/\'/g" $tmp.out
+ if diff $seq.out $tmp.out >/dev/null 2>&1 ; then
+ if ! $err ; then
echo "$seqnum `expr $stop - $start`" >>$tmp.time
echo -n " `expr $stop - $start`s"
- fi
- echo ""
- else
- echo " - output mismatch (see $seqres.out.bad)"
- mv $tmp.out $seqres.out.bad
- $diff $seq.out $seqres.out.bad | {
- if test "$DIFF_LENGTH" -le 0; then
- cat
- else
- head -n "$DIFF_LENGTH"
- echo "..."
- echo "(Run '$diff $seq.out $seqres.out.bad'" \
- " 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
- try="$try $seqnum"
- n_try=`expr $n_try + 1`
- _check_filesystems
- _check_dmesg || err=true
- _check_kmemleak || err=true
+ echo ""
+ else
+ _dump_err "- output mismatch (see $seqres.out.bad)"
+ mv $tmp.out $seqres.out.bad
+ $diff $seq.out $seqres.out.bad | {
+ if test "$DIFF_LENGTH" -le 0; then
+ cat
+ else
+ head -n "$DIFF_LENGTH"
+ echo "..."
+ echo "(Run '$diff $seq.out $seqres.out.bad'" \
+ " to see the entire diff)"
+ fi; } | sed -e 's/^\(.\)/ \1/'
+ err=true
fi
+ done
- fi
-
- # come here for each test, except when $showme is true
- #
- if $err
- then
+ # make sure we record the status of the last test we ran.
+ if $err ; then
bad="$bad $seqnum"
n_bad=`expr $n_bad + 1`
tc_status="fail"
- fi
- if $do_report; then
- _make_testcase_report "$tc_status"
- fi
- seq="after_$seqnum"
- done
+ fi
+ if $do_report && ! $first_test ; then
+ if [ $tc_status != "expunge" ] ; then
+ _make_testcase_report "$prev_seq" "$tc_status"
+ fi
+ fi
+
sect_stop=`_wallclock`
interrupt=false
_wrapup