mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-12-18 05:28:36 -07:00
Instead of ./check failing when a binary is missing, we try each test case now and each one fails with tons of test case diffs. Also, all the variables were initialized by "check" prior to "common" being sourced, and then (uselessly) checked for emptiness again in "check". Centralize the search for programs in "common" (which will soon be one with "check"), including the "realpath" invocation which can be done just once in "check" rather than in the tests. For qnio_server, move the detection to "common", simplifying set_prog_path to stop handling the unused second argument, and embedding the "realpath" pass. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
310 lines
8.1 KiB
Bash
Executable file
310 lines
8.1 KiB
Bash
Executable file
#!/bin/bash
|
|
#
|
|
# Copyright (C) 2009 Red Hat, Inc.
|
|
# Copyright (c) 2000-2002,2006 Silicon Graphics, Inc. All Rights Reserved.
|
|
#
|
|
# 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, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
#
|
|
# Control script for QA
|
|
#
|
|
|
|
status=0
|
|
needwrap=true
|
|
try=0
|
|
n_bad=0
|
|
bad=""
|
|
notrun=""
|
|
interrupt=true
|
|
|
|
# by default don't output timestamps
|
|
timestamp=${TIMESTAMP:=false}
|
|
|
|
# generic initialization
|
|
iam=check
|
|
|
|
_init_error()
|
|
{
|
|
echo "$iam: $1" >&2
|
|
exit 1
|
|
}
|
|
|
|
if [ -L "$0" ]
|
|
then
|
|
# called from the build tree
|
|
source_iotests=$(dirname "$(readlink "$0")")
|
|
if [ -z "$source_iotests" ]
|
|
then
|
|
_init_error "failed to obtain source tree name from check symlink"
|
|
fi
|
|
source_iotests=$(cd "$source_iotests"; pwd) || _init_error "failed to enter source tree"
|
|
build_iotests=$PWD
|
|
else
|
|
# called from the source tree
|
|
source_iotests=$PWD
|
|
# this may be an in-tree build (note that in the following code we may not
|
|
# assume that it truly is and have to test whether the build results
|
|
# actually exist)
|
|
build_iotests=$PWD
|
|
fi
|
|
|
|
build_root="$build_iotests/../.."
|
|
|
|
# we need common.env
|
|
if ! . "$build_iotests/common.env"
|
|
then
|
|
_init_error "failed to source common.env (make sure the qemu-iotests are run from tests/qemu-iotests in the build tree)"
|
|
fi
|
|
|
|
# we need common.config
|
|
if ! . "$source_iotests/common.config"
|
|
then
|
|
_init_error "failed to source common.config"
|
|
fi
|
|
|
|
# we need common.rc
|
|
if ! . "$source_iotests/common.rc"
|
|
then
|
|
_init_error "failed to source common.rc"
|
|
fi
|
|
|
|
# we need common
|
|
. "$source_iotests/common"
|
|
|
|
TIMESTAMP_FILE=check.time-$IMGPROTO-$IMGFMT
|
|
|
|
tmp="${TEST_DIR}"/$$
|
|
|
|
_wallclock()
|
|
{
|
|
date "+%H %M %S" | awk '{ print $1*3600 + $2*60 + $3 }'
|
|
}
|
|
|
|
_timestamp()
|
|
{
|
|
now=`date "+%T"`
|
|
printf %s " [$now]"
|
|
}
|
|
|
|
_wrapup()
|
|
{
|
|
if $showme
|
|
then
|
|
:
|
|
elif $needwrap
|
|
then
|
|
if [ -f $TIMESTAMP_FILE -a -f $tmp.time ]
|
|
then
|
|
cat $TIMESTAMP_FILE $tmp.time \
|
|
| awk '
|
|
{ t[$1] = $2 }
|
|
END { if (NR > 0) {
|
|
for (i in t) print i " " t[i]
|
|
}
|
|
}' \
|
|
| sort -n >$tmp.out
|
|
mv $tmp.out $TIMESTAMP_FILE
|
|
fi
|
|
|
|
if [ -f $tmp.expunged ]
|
|
then
|
|
notrun=`wc -l <$tmp.expunged | sed -e 's/ *//g'`
|
|
try=`expr $try - $notrun`
|
|
list=`echo "$list" | sed -f $tmp.expunged`
|
|
fi
|
|
|
|
echo "" >>check.log
|
|
date >>check.log
|
|
echo $list | fmt | sed -e 's/^/ /' >>check.log
|
|
$interrupt && echo "Interrupted!" >>check.log
|
|
|
|
if [ ! -z "$notrun" ]
|
|
then
|
|
echo "Not run:$notrun"
|
|
echo "Not run:$notrun" >>check.log
|
|
fi
|
|
if [ ! -z "$n_bad" -a $n_bad != 0 ]
|
|
then
|
|
echo "Failures:$bad"
|
|
echo "Failed $n_bad of $try tests"
|
|
echo "Failures:$bad" | fmt >>check.log
|
|
echo "Failed $n_bad of $try tests" >>check.log
|
|
else
|
|
echo "Passed all $try tests"
|
|
echo "Passed all $try tests" >>check.log
|
|
fi
|
|
needwrap=false
|
|
fi
|
|
|
|
rm -f "${TEST_DIR}"/*.out "${TEST_DIR}"/*.err "${TEST_DIR}"/*.time
|
|
rm -f "${TEST_DIR}"/check.pid "${TEST_DIR}"/check.sts
|
|
rm -f $tmp.*
|
|
}
|
|
|
|
trap "_wrapup; exit \$status" 0 1 2 3 15
|
|
|
|
[ -f $TIMESTAMP_FILE ] || touch $TIMESTAMP_FILE
|
|
|
|
FULL_IMGFMT_DETAILS=`_full_imgfmt_details`
|
|
FULL_HOST_DETAILS=`_full_platform_details`
|
|
|
|
cat <<EOF
|
|
QEMU -- "$QEMU_PROG" $QEMU_OPTIONS
|
|
QEMU_IMG -- "$QEMU_IMG_PROG" $QEMU_IMG_OPTIONS
|
|
QEMU_IO -- "$QEMU_IO_PROG" $QEMU_IO_OPTIONS
|
|
QEMU_NBD -- "$QEMU_NBD_PROG" $QEMU_NBD_OPTIONS
|
|
IMGFMT -- $FULL_IMGFMT_DETAILS
|
|
IMGPROTO -- $IMGPROTO
|
|
PLATFORM -- $FULL_HOST_DETAILS
|
|
TEST_DIR -- $TEST_DIR
|
|
SOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER
|
|
|
|
EOF
|
|
|
|
seq="check"
|
|
|
|
[ -n "$TESTS_REMAINING_LOG" ] && echo $list > $TESTS_REMAINING_LOG
|
|
|
|
for seq in $list
|
|
do
|
|
err=false
|
|
printf %s "$seq"
|
|
if [ -n "$TESTS_REMAINING_LOG" ] ; then
|
|
sed -e "s/$seq//" -e 's/ / /' -e 's/^ *//' $TESTS_REMAINING_LOG > $TESTS_REMAINING_LOG.tmp
|
|
mv $TESTS_REMAINING_LOG.tmp $TESTS_REMAINING_LOG
|
|
sync
|
|
fi
|
|
|
|
if $showme
|
|
then
|
|
echo
|
|
continue
|
|
elif [ -f expunged ] && $expunge && egrep "^$seq([ ]|\$)" expunged >/dev/null
|
|
then
|
|
echo " - expunged"
|
|
rm -f $seq.out.bad
|
|
echo "/^$seq\$/d" >>$tmp.expunged
|
|
elif [ ! -f "$source_iotests/$seq" ]
|
|
then
|
|
echo " - no such test?"
|
|
echo "/^$seq\$/d" >>$tmp.expunged
|
|
else
|
|
# really going to try and run this one
|
|
#
|
|
rm -f $seq.out.bad
|
|
lasttime=`sed -n -e "/^$seq /s/.* //p" <$TIMESTAMP_FILE`
|
|
if [ "X$lasttime" != X ]; then
|
|
printf %s " ${lasttime}s ..."
|
|
else
|
|
printf " " # prettier output with timestamps.
|
|
fi
|
|
rm -f core $seq.notrun
|
|
|
|
start=`_wallclock`
|
|
$timestamp && printf %s " [$(date "+%T")]"
|
|
|
|
if [ "$(head -n 1 "$source_iotests/$seq")" == "#!/usr/bin/env python" ]; then
|
|
run_command="$PYTHON $seq"
|
|
else
|
|
run_command="./$seq"
|
|
fi
|
|
export OUTPUT_DIR=$PWD
|
|
if $debug; then
|
|
(cd "$source_iotests";
|
|
MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
|
|
$run_command -d 2>&1 | tee $tmp.out)
|
|
else
|
|
(cd "$source_iotests";
|
|
MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
|
|
$run_command >$tmp.out 2>&1)
|
|
fi
|
|
sts=$?
|
|
$timestamp && _timestamp
|
|
stop=`_wallclock`
|
|
|
|
if [ -f core ]
|
|
then
|
|
printf " [dumped core]"
|
|
mv core $seq.core
|
|
err=true
|
|
fi
|
|
|
|
if [ -f $seq.notrun ]
|
|
then
|
|
$timestamp || printf " [not run] "
|
|
$timestamp && echo " [not run]" && printf %s " $seq -- "
|
|
cat $seq.notrun
|
|
notrun="$notrun $seq"
|
|
else
|
|
if [ $sts -ne 0 ]
|
|
then
|
|
printf %s " [failed, exit status $sts]"
|
|
err=true
|
|
fi
|
|
|
|
reference="$source_iotests/$seq.out"
|
|
reference_machine="$source_iotests/$seq.$QEMU_DEFAULT_MACHINE.out"
|
|
if [ -f "$reference_machine" ]; then
|
|
reference="$reference_machine"
|
|
fi
|
|
|
|
reference_format="$source_iotests/$seq.out.$IMGFMT"
|
|
if [ -f "$reference_format" ]; then
|
|
reference="$reference_format"
|
|
fi
|
|
|
|
if [ "$CACHEMODE" = "none" ]; then
|
|
[ -f "$source_iotests/$seq.out.nocache" ] && reference="$source_iotests/$seq.out.nocache"
|
|
fi
|
|
|
|
if [ ! -f "$reference" ]
|
|
then
|
|
echo " - no qualified output"
|
|
err=true
|
|
else
|
|
if diff -w "$reference" $tmp.out >/dev/null 2>&1
|
|
then
|
|
echo ""
|
|
if $err
|
|
then
|
|
:
|
|
else
|
|
echo "$seq `expr $stop - $start`" >>$tmp.time
|
|
fi
|
|
else
|
|
echo " - output mismatch (see $seq.out.bad)"
|
|
mv $tmp.out $seq.out.bad
|
|
$diff -w "$reference" $(realpath $seq.out.bad)
|
|
err=true
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
fi
|
|
|
|
# come here for each test, except when $showme is true
|
|
#
|
|
if $err
|
|
then
|
|
bad="$bad $seq"
|
|
n_bad=`expr $n_bad + 1`
|
|
quick=false
|
|
fi
|
|
[ -f $seq.notrun ] || try=`expr $try + 1`
|
|
|
|
seq="after_$seq"
|
|
done
|
|
|
|
interrupt=false
|
|
status=`expr $n_bad`
|
|
exit
|