iotests: Allow out-of-tree run

As out-of-tree builds are preferred for qemu, running the qemu-iotests
in that out-of-tree build should be supported as well. To do so, a
symbolic link has to be created pointing to the check script in the
source directory. That script will check whether it has been run through
a symlink, and if so, will assume it is run in the build tree. All
output and temporary operations performed by iotests are then redirected
here and, unless specified otherwise by the user, QEMU_PROG etc. will be
set to paths appropriate for the build tree.

Also, drop making every test case executable if it is not yet, as this
would modify the source tree which is not desired for out-of-tree runs
and should be fixed in the repository anyway.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Max Reitz 2014-05-24 23:24:55 +02:00 committed by Kevin Wolf
parent 6b8aeca574
commit e8f8624d3b
5 changed files with 96 additions and 28 deletions

View File

@ -34,22 +34,89 @@ timestamp=${TIMESTAMP:=false}
# generic initialization # generic initialization
iam=check iam=check
# we need common.config _init_error()
if ! . ./common.config {
then echo "$iam: $1" >&2
echo "$iam: failed to source common.config"
exit 1 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/../.."
if [ -x "$build_iotests/socket_scm_helper" ]
then
export SOCKET_SCM_HELPER="$build_iotests/socket_scm_helper"
fi
# if ./qemu exists, it should be prioritized and will be chosen by common.config
if [[ -z "$QEMU_PROG" && ! -x './qemu' ]]
then
arch=$(uname -m 2> /dev/null)
if [[ -n $arch && -x "$build_root/$arch-softmmu/qemu-system-$arch" ]]
then
export QEMU_PROG="$build_root/$arch-softmmu/qemu-system-$arch"
else
pushd "$build_root" > /dev/null
for binary in *-softmmu/qemu-system-*
do
if [ -x "$binary" ]
then
export QEMU_PROG="$build_root/$binary"
break
fi
done
popd > /dev/null
fi
fi
if [[ -z $QEMU_IMG_PROG && -x "$build_root/qemu-img" && ! -x './qemu-img' ]]
then
export QEMU_IMG_PROG="$build_root/qemu-img"
fi
if [[ -z $QEMU_IO_PROG && -x "$build_root/qemu-io" && ! -x './qemu-io' ]]
then
export QEMU_IO_PROG="$build_root/qemu-io"
fi
if [[ -z $QEMU_NBD_PROG && -x "$build_root/qemu-nbd" && ! -x './qemu-nbd' ]]
then
export QEMU_NBD_PROG="$build_root/qemu-nbd"
fi
# we need common.config
if ! . "$source_iotests/common.config"
then
_init_error "failed to source common.config"
fi fi
# we need common.rc # we need common.rc
if ! . ./common.rc if ! . "$source_iotests/common.rc"
then then
echo "check: failed to source common.rc" _init_error "failed to source common.rc"
exit 1
fi fi
# we need common # we need common
. ./common . "$source_iotests/common"
#if [ `id -u` -ne 0 ] #if [ `id -u` -ne 0 ]
#then #then
@ -194,7 +261,7 @@ do
echo " - expunged" echo " - expunged"
rm -f $seq.out.bad rm -f $seq.out.bad
echo "/^$seq\$/d" >>$tmp.expunged echo "/^$seq\$/d" >>$tmp.expunged
elif [ ! -f $seq ] elif [ ! -f "$source_iotests/$seq" ]
then then
echo " - no such test?" echo " - no such test?"
echo "/^$seq\$/d" >>$tmp.expunged echo "/^$seq\$/d" >>$tmp.expunged
@ -215,9 +282,10 @@ do
start=`_wallclock` start=`_wallclock`
$timestamp && echo -n " ["`date "+%T"`"]" $timestamp && echo -n " ["`date "+%T"`"]"
[ ! -x $seq ] && chmod u+x $seq # ensure we can run it export OUTPUT_DIR=$PWD
(cd "$source_iotests";
MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \ MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
./$seq >$tmp.out 2>&1 ./$seq >$tmp.out 2>&1)
sts=$? sts=$?
$timestamp && _timestamp $timestamp && _timestamp
stop=`_wallclock` stop=`_wallclock`
@ -242,17 +310,17 @@ do
err=true err=true
fi fi
reference=$seq.out reference="$source_iotests/$seq.out"
if [ "$CACHEMODE" = "none" ]; then if [ "$CACHEMODE" = "none" ]; then
[ -f $seq.out.nocache ] && reference=$seq.out.nocache [ -f "$source_iotests/$seq.out.nocache" ] && reference="$source_iotests/$seq.out.nocache"
fi fi
if [ ! -f $reference ] if [ ! -f "$reference" ]
then then
echo " - no qualified output" echo " - no qualified output"
err=true err=true
else else
if diff -w $reference $tmp.out >/dev/null 2>&1 if diff -w "$reference" $tmp.out >/dev/null 2>&1
then then
echo "" echo ""
if $err if $err
@ -264,7 +332,7 @@ do
else else
echo " - output mismatch (see $seq.out.bad)" echo " - output mismatch (see $seq.out.bad)"
mv $tmp.out $seq.out.bad mv $tmp.out $seq.out.bad
$diff -w $reference $seq.out.bad $diff -w "$reference" $seq.out.bad
err=true err=true
fi fi
fi fi

View File

@ -25,8 +25,7 @@ _setenvironment()
export MSGVERB export MSGVERB
} }
here=`pwd` rm -f "$OUTPUT_DIR/$iam.out"
rm -f $here/$iam.out
_setenvironment _setenvironment
check=${check-true} check=${check-true}
@ -59,7 +58,7 @@ do
if $group if $group
then then
# arg after -g # arg after -g
group_list=`sed -n <group -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{ group_list=`sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
s/ .*//p s/ .*//p
}'` }'`
if [ -z "$group_list" ] if [ -z "$group_list" ]
@ -84,7 +83,7 @@ s/ .*//p
then then
# arg after -x # arg after -x
[ ! -s $tmp.list ] && ls [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] >$tmp.list 2>/dev/null [ ! -s $tmp.list ] && ls [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] >$tmp.list 2>/dev/null
group_list=`sed -n <group -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{ group_list=`sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
s/ .*//p s/ .*//p
}'` }'`
if [ -z "$group_list" ] if [ -z "$group_list" ]
@ -366,7 +365,7 @@ testlist options
BEGIN { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \ BEGIN { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
| while read id | while read id
do do
if grep -s "^$id " group >/dev/null if grep -s "^$id " "$source_iotests/group" >/dev/null
then then
# in group file ... OK # in group file ... OK
echo $id >>$tmp.list echo $id >>$tmp.list
@ -402,7 +401,7 @@ else
touch $tmp.list touch $tmp.list
else else
# no test numbers, do everything from group file # no test numbers, do everything from group file
sed -n -e '/^[0-9][0-9][0-9]*/s/[ ].*//p' <group >$tmp.list sed -n -e '/^[0-9][0-9][0-9]*/s/[ ].*//p' <"$source_iotests/group" >$tmp.list
fi fi
fi fi

View File

@ -126,7 +126,7 @@ fi
export TEST_DIR export TEST_DIR
if [ -z "$SAMPLE_IMG_DIR" ]; then if [ -z "$SAMPLE_IMG_DIR" ]; then
SAMPLE_IMG_DIR=`pwd`/sample_images SAMPLE_IMG_DIR="$source_iotests/sample_images"
fi fi
if [ ! -d "$SAMPLE_IMG_DIR" ]; then if [ ! -d "$SAMPLE_IMG_DIR" ]; then

View File

@ -318,9 +318,9 @@ _do()
status=1; exit status=1; exit
fi fi
(eval "echo '---' \"$_cmd\"") >>$here/$seq.full (eval "echo '---' \"$_cmd\"") >>"$OUTPUT_DIR/$seq.full"
(eval "$_cmd") >$tmp._out 2>&1; ret=$? (eval "$_cmd") >$tmp._out 2>&1; ret=$?
cat $tmp._out >>$here/$seq.full cat $tmp._out >>"$OUTPUT_DIR/$seq.full"
if [ $# -eq 2 ]; then if [ $# -eq 2 ]; then
if [ $ret -eq 0 ]; then if [ $ret -eq 0 ]; then
echo "done" echo "done"
@ -344,7 +344,7 @@ _do()
# #
_notrun() _notrun()
{ {
echo "$*" >$seq.notrun echo "$*" >"$OUTPUT_DIR/$seq.notrun"
echo "$seq not run: $*" echo "$seq not run: $*"
status=0 status=0
exit exit
@ -354,7 +354,7 @@ _notrun()
# #
_fail() _fail()
{ {
echo "$*" | tee -a $here/$seq.full echo "$*" | tee -a "$OUTPUT_DIR/$seq.full"
echo "(see $seq.full for details)" echo "(see $seq.full for details)"
status=1 status=1
exit 1 exit 1

View File

@ -37,6 +37,7 @@ qemu_args = os.environ.get('QEMU', 'qemu').strip().split(' ')
imgfmt = os.environ.get('IMGFMT', 'raw') imgfmt = os.environ.get('IMGFMT', 'raw')
imgproto = os.environ.get('IMGPROTO', 'file') imgproto = os.environ.get('IMGPROTO', 'file')
test_dir = os.environ.get('TEST_DIR', '/var/tmp') test_dir = os.environ.get('TEST_DIR', '/var/tmp')
output_dir = os.environ.get('OUTPUT_DIR', '.')
cachemode = os.environ.get('CACHEMODE') cachemode = os.environ.get('CACHEMODE')
socket_scm_helper = os.environ.get('SOCKET_SCM_HELPER', 'socket_scm_helper') socket_scm_helper = os.environ.get('SOCKET_SCM_HELPER', 'socket_scm_helper')
@ -278,7 +279,7 @@ def notrun(reason):
# Each test in qemu-iotests has a number ("seq") # Each test in qemu-iotests has a number ("seq")
seq = os.path.basename(sys.argv[0]) seq = os.path.basename(sys.argv[0])
open('%s.notrun' % seq, 'wb').write(reason + '\n') open('%s/%s.notrun' % (output_dir, seq), 'wb').write(reason + '\n')
print '%s not run: %s' % (seq, reason) print '%s not run: %s' % (seq, reason)
sys.exit(0) sys.exit(0)