Files
apfstests/check
T

479 lines
9.9 KiB
Bash
Raw Normal View History

#!/bin/bash
#
# Control script for QA
#
# Copyright (c) 2000-2002,2006 Silicon Graphics, Inc. All Rights Reserved.
#
2009-06-05 15:41:14 -05:00
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
#
tmp=/tmp/$$
status=0
needwrap=true
2009-05-28 11:40:39 -05:00
n_try=0
try=""
n_bad=0
bad=""
notrun=""
interrupt=true
diff="diff -u"
showme=false
have_test_arg=false
randomize=false
here=`pwd`
FSTYP=xfs
SUPPORTED_TESTS="[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]"
SRC_DIR="tests"
SRC_GROUPS="generic shared"
# generic initialization
iam=check
2004-06-15 07:36:09 +00:00
export QA_CHECK_FS=${QA_CHECK_FS:=true}
# by default don't output timestamps
timestamp=${TIMESTAMP:=false}
# number of diff lines from a failed test, 0 for whole output
export DIFF_LENGTH=${DIFF_LENGTH:=10}
2004-06-15 07:36:09 +00:00
# by default don't output timestamps
timestamp=${TIMESTAMP:=false}
2013-03-15 12:27:49 +00:00
usage()
{
echo "Usage: $0 [options] [testlist]"'
check options
-xfs test XFS (default)
-udf test UDF
-nfs test NFS
-l line mode diff
-udiff show unified diff (default)
-n show me, do not run tests
-T output timestamps
-r randomize test order
--large-fs optimise scratch device for large filesystems
testlist options
-g group[,group...] include tests from these groups
-x group[,group...] exclude tests from these groups
[testlist] include tests matching names in testlist
2013-03-15 12:27:49 +00:00
'
exit 0
}
_setenvironment()
{
MSGVERB="text:action"
export MSGVERB
}
2013-03-15 12:27:49 +00:00
get_group_list()
{
grp=$1
2013-03-15 12:27:49 +00:00
for d in $SRC_GROUPS $FSTYP; do
l=$(sed -n < $SRC_DIR/$d/group \
2013-03-15 12:27:54 +00:00
-e 's/#.*//' \
-e 's/$/ /' \
-e "s;\(^[0-9][0-9][0-9]\).* $grp .*;$SRC_DIR/$d/\1;p")
2013-03-15 12:27:54 +00:00
grpl="$grpl $l"
done
echo $grpl
}
2013-03-15 12:27:49 +00:00
_wallclock()
{
date "+%H %M %S" | $AWK_PROG '{ print $1*3600 + $2*60 + $3 }'
}
2013-03-15 12:27:49 +00:00
_timestamp()
{
now=`date "+%T"`
echo -n " [$now]"
}
# start the initialisation work now
_setenvironment
rm -f $tmp.list $tmp.tmp $tmp.sed $here/$iam.out
# Autodetect fs type based on what's on $TEST_DEV
if [ "$HOSTOS" == "Linux" ]; then
FSTYP=`blkid -c /dev/null -s TYPE -o value $TEST_DEV`
fi
export FSTYP
# we need common.config
if ! . ./common.config
2013-03-15 12:27:49 +00:00
then
echo "$iam: failed to source common.config"
exit 1
2013-03-15 12:27:49 +00:00
fi
# Process command arguments first.
while [ $# -gt 0 ]; do
case "$1" in
-\? | -h | --help) usage ;;
-udf) FSTYP=udf ;;
-xfs) FSTYP=xfs ;;
-nfs) FSTYP=nfs ;;
-g) group=$2 ; shift ;
group_list=$(get_group_list $group)
if [ -z "$group_list" ]; then
echo "Group \"$group\" is empty or not defined?"
exit 1
fi
[ ! -s $tmp.list ] && touch $tmp.list
for t in $group_list; do
grep -s "^$t\$" $tmp.list >/dev/null || \
echo "$t" >>$tmp.list
done
;;
-x) xgroup=$2 ; shift ;
[ ! -s $tmp.list ] && ls $SUPPORTED_TESTS >$tmp.list 2>/dev/null
group_list=$(get_group_list $xgroup)
if [ -z "$group_list" ]; then
echo "Group \"$xgroup\" is empty or not defined?"
exit 1
fi
rm -f $tmp.sed
numsed=0
for t in $group_list
do
if [ $numsed -gt 100 ]; then
sed -f $tmp.sed <$tmp.list >$tmp.tmp
mv $tmp.tmp $tmp.list
numsed=0
rm -f $tmp.sed
fi
echo "/^$t\$/d" >>$tmp.sed
numsed=`expr $numsed + 1`
done
sed -f $tmp.sed <$tmp.list >$tmp.tmp
mv $tmp.tmp $tmp.list
;;
-l) diff="diff" ;;
-udiff) diff="$diff -u" ;;
-n) showme=true ;;
-r) randomize=true ;;
-T) timestamp=true ;;
--large-fs) export LARGE_SCRATCH_DEV=yes ;;
--extra-space=*) export SCRATCH_DEV_EMPTY_SPACE=${r#*=} ;;
-*) usage ;;
*) # not an argument, we've got tests now.
have_test_arg=true ;;
esac
# if we've found a test specification, the break out of the processing
# loop before we shift the arguments so that this is the first argument
# that we process in the test arg loop below.
if $have_test_arg; then
break;
fi
shift
done
# Process tests from command line now.
if $have_test_arg; then
while [ $# -gt 0 ]; do
case "$1" in
-*) echo "Argments before tests, please!"
status=1
exit $status
;;
*) test_dir=`dirname $1`
test_name=`basename $1`
group_file=$SRC_DIR/$test_dir/group
if grep "^$testname" $group_file >/dev/null ; then
# in group file ... OK
echo $SRC_DIR/$1 >>$tmp.list
else
# oops
echo "$1 - unknown test, ignored"
fi
;;
esac
shift
done
fi
if [ -s $tmp.list ]; then
# found some valid test numbers ... this is good
:
elif $have_test_arg; then
# had test numbers, but none in group file ... do nothing
touch $tmp.list
else
# no test numbers, do everything from group file
sed -n -e '/^[0-9][0-9][0-9]*/s/[ ].*//p' <group >$tmp.list
fi
# sort the list of tests into numeric order
list=`sort -n $tmp.list`
2013-03-15 12:27:49 +00:00
rm -f $tmp.list $tmp.tmp $tmp.sed
if $randomize
then
list=`echo $list | awk -f randomize.awk`
fi
# we need common.rc
if ! . ./common.rc
then
echo "check: failed to source common.rc"
exit 1
fi
2004-06-15 07:36:09 +00:00
if [ `id -u` -ne 0 ]
then
echo "check: QA must be run as root"
exit 1
fi
# Ok, time to start running...
2004-06-15 07:36:09 +00:00
_wrapup()
{
if $showme
then
:
elif $needwrap
then
if [ -f check.time -a -f $tmp.time ]
then
cat check.time $tmp.time \
| $AWK_PROG '
{ t[$1] = $2 }
END { if (NR > 0) {
for (i in t) print i " " t[i]
}
}' \
| sort -n >$tmp.out
mv $tmp.out check.time
fi
echo "" >>check.log
date >>check.log
echo $list | fmt | sed -e 's/^/ /' -e "s;$SRC_DIR/;;g" >>check.log
$interrupt && echo "Interrupted!" >>check.log
2009-05-28 11:40:39 -05:00
if [ ! -z "$n_try" -a $n_try != 0 ]
then
echo "Ran:$try"
fi
if [ ! -z "$notrun" ]
then
echo "Not run:$notrun"
echo "Not run:$notrun" >>check.log
fi
2009-05-28 11:40:39 -05:00
if [ ! -z "$n_bad" -a $n_bad != 0 ]
then
echo "Failures:$bad"
2009-05-28 11:40:39 -05:00
echo "Failed $n_bad of $n_try tests"
echo "Failures:$bad" | fmt >>check.log
2009-05-28 11:40:39 -05:00
echo "Failed $n_bad of $n_try tests" >>check.log
else
2009-05-28 11:40:39 -05:00
echo "Passed all $n_try tests"
echo "Passed all $n_try tests" >>check.log
fi
needwrap=false
fi
rm -f /tmp/*.rawout /tmp/*.out /tmp/*.err /tmp/*.time
rm -f $tmp.*
}
trap "_wrapup; exit \$status" 0 1 2 3 15
# don't leave old full output behind on a clean run
rm -f check.full
[ -f check.time ] || touch check.time
# print out our test configuration
echo "FSTYP -- `_full_fstyp_details`"
echo "PLATFORM -- `_full_platform_details`"
if [ ! -z "$SCRATCH_DEV" ]; then
echo "MKFS_OPTIONS -- `_scratch_mkfs_options`"
echo "MOUNT_OPTIONS -- `_scratch_mount_options`"
fi
echo
2004-06-15 07:36:09 +00:00
2009-06-04 19:12:55 +02:00
if [ ! -z "$SCRATCH_DEV" ]; then
2009-06-03 13:11:35 -05:00
umount $SCRATCH_DEV 2>/dev/null
# call the overridden mkfs - make sure the FS is built
# the same as we'll create it later.
2004-06-15 07:36:09 +00:00
2009-06-03 13:11:35 -05:00
if ! _scratch_mkfs $flag >$tmp.err 2>&1
then
echo "our local _scratch_mkfs routine ..."
cat $tmp.err
echo "check: failed to mkfs \$SCRATCH_DEV using specified options"
exit 1
fi
2009-06-03 13:11:35 -05:00
# call the overridden mount - make sure the FS mounts with
# the same options that we'll mount with later.
if ! _scratch_mount >$tmp.err 2>&1
then
echo "our local mount routine ..."
cat $tmp.err
echo "check: failed to mount \$SCRATCH_DEV using specified options"
exit 1
fi
fi
seq="check"
_check_test_fs
for seq in $list
do
err=false
2013-03-15 12:27:54 +00:00
# the filename for the test and the name output are different.
# we don't include the tests/ directory in the name output.
seqnum=`echo $seq | sed -e "s;$SRC_DIR/;;"`
2013-03-15 12:27:54 +00:00
echo -n "$seqnum"
if $showme
then
echo
continue
elif [ ! -f $seq ]
then
echo " - no such test?"
else
# really going to try and run this one
#
rm -f $seq.out.bad
2013-03-15 12:27:54 +00:00
# slashes now in names, sed barfs on them so use grep
lasttime=`grep -w ^$seq check.time | awk '// {print $2}'`
if [ "X$lasttime" != X ]; then
echo -n " ${lasttime}s ..."
else
echo -n " " # prettier output with timestamps.
fi
rm -f core $seq.notrun
start=`_wallclock`
$timestamp && echo -n " ["`date "+%T"`"]"
2004-04-23 04:08:39 +00:00
[ ! -x $seq ] && chmod u+x $seq # ensure we can run it
2013-03-15 12:27:54 +00:00
$LOGGER_PROG "run xfstest $seqnum"
2004-04-23 04:08:39 +00:00
./$seq >$tmp.rawout 2>&1
sts=$?
2004-06-15 07:36:09 +00:00
$timestamp && _timestamp
stop=`_wallclock`
_fix_malloc <$tmp.rawout >$tmp.out
rm -f $tmp.rawout
if [ -f core ]
then
echo -n " [dumped core]"
mv core $seq.core
err=true
fi
if [ -f $seq.notrun ]
then
$timestamp || echo -n " [not run] "
2013-03-15 12:27:54 +00:00
$timestamp && echo " [not run]" && echo -n " $seqnum -- "
cat $seq.notrun
2013-03-15 12:27:54 +00:00
notrun="$notrun $seqnum"
else
if [ $sts -ne 0 ]
then
echo -n " [failed, exit status $sts]"
err=true
fi
if [ ! -f $seq.out ]
then
echo " - no qualified output"
err=true
else
if diff $seq.out $tmp.out >/dev/null 2>&1
then
if $err
then
:
else
2013-03-15 12:27:54 +00:00
echo "$seqnum `expr $stop - $start`" >>$tmp.time
2010-07-08 15:23:52 +00:00
echo -n " `expr $stop - $start`s"
fi
2010-07-08 15:23:52 +00:00
echo ""
else
echo " - output mismatch (see $seq.out.bad)"
mv $tmp.out $seq.out.bad
$diff $seq.out $seq.out.bad | {
if test "$DIFF_LENGTH" -le 0; then
cat
else
head -n "$DIFF_LENGTH"
fi; } | \
sed -e 's/^\(.\)/ \1/'
echo " ..."
echo " (Run '$diff $seq.out $seq.out.bad' to see the" \
"entire diff)"
err=true
fi
fi
fi
fi
# come here for each test, except when $showme is true
#
if $err
then
2013-03-15 12:27:54 +00:00
bad="$bad $seqnum"
n_bad=`expr $n_bad + 1`
quick=false
fi
2009-05-28 11:40:39 -05:00
if [ ! -f $seq.notrun ]
then
2013-03-15 12:27:54 +00:00
try="$try $seqnum"
2009-05-28 11:40:39 -05:00
n_try=`expr $n_try + 1`
_check_test_fs
2009-05-28 11:40:39 -05:00
fi
2013-03-15 12:27:54 +00:00
seq="after_$seqnum"
done
interrupt=false
status=`expr $n_bad`
exit