Commit e8f8624d authored by Max Reitz's avatar Max Reitz Committed by Kevin Wolf
Browse files

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: default avatarMax Reitz <mreitz@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 6b8aeca5
Loading
Loading
Loading
Loading
+83 −15
Original line number Diff line number Diff line
@@ -34,22 +34,89 @@ 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/../.."

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 ! . ./common.config
if ! . "$source_iotests/common.config"
then
    echo "$iam: failed to source common.config"
    exit 1
    _init_error "failed to source common.config"
fi

# we need common.rc
if ! . ./common.rc
if ! . "$source_iotests/common.rc"
then
    echo "check: failed to source common.rc"
    exit 1
    _init_error "failed to source common.rc"
fi

# we need common
. ./common
. "$source_iotests/common"

#if [ `id -u` -ne 0 ]
#then
@@ -194,7 +261,7 @@ do
        echo " - expunged"
        rm -f $seq.out.bad
        echo "/^$seq\$/d" >>$tmp.expunged
    elif [ ! -f $seq ]
    elif [ ! -f "$source_iotests/$seq" ]
    then
        echo " - no such test?"
        echo "/^$seq\$/d" >>$tmp.expunged
@@ -215,9 +282,10 @@ do

        start=`_wallclock`
        $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))} \
                ./$seq >$tmp.out 2>&1
                ./$seq >$tmp.out 2>&1)
        sts=$?
        $timestamp && _timestamp
        stop=`_wallclock`
@@ -242,17 +310,17 @@ do
                err=true
            fi

            reference=$seq.out
            reference="$source_iotests/$seq.out"
            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

            if [ ! -f $reference ]
            if [ ! -f "$reference" ]
            then
                echo " - no qualified output"
                err=true
            else
                if diff -w $reference $tmp.out >/dev/null 2>&1
                if diff -w "$reference" $tmp.out >/dev/null 2>&1
                then
                    echo ""
                    if $err
@@ -264,7 +332,7 @@ do
                else
                    echo " - output mismatch (see $seq.out.bad)"
                    mv $tmp.out $seq.out.bad
                    $diff -w $reference $seq.out.bad
                    $diff -w "$reference" $seq.out.bad
                    err=true
                fi
            fi
+5 −6
Original line number Diff line number Diff line
@@ -25,8 +25,7 @@ _setenvironment()
    export MSGVERB
}

here=`pwd`
rm -f $here/$iam.out
rm -f "$OUTPUT_DIR/$iam.out"
_setenvironment

check=${check-true}
@@ -59,7 +58,7 @@ do
    if $group
    then
        # 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
}'`
        if [ -z "$group_list" ]
@@ -84,7 +83,7 @@ s/ .*//p
    then
        # 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
        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
}'`
        if [ -z "$group_list" ]
@@ -366,7 +365,7 @@ testlist options
BEGIN        { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
        | while read id
        do
            if grep -s "^$id " group >/dev/null
            if grep -s "^$id " "$source_iotests/group" >/dev/null
            then
                # in group file ... OK
                echo $id >>$tmp.list
@@ -402,7 +401,7 @@ else
        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
        sed -n -e '/^[0-9][0-9][0-9]*/s/[         ].*//p' <"$source_iotests/group" >$tmp.list
    fi
fi

+1 −1
Original line number Diff line number Diff line
@@ -126,7 +126,7 @@ fi
export TEST_DIR

if [ -z "$SAMPLE_IMG_DIR" ]; then
        SAMPLE_IMG_DIR=`pwd`/sample_images
        SAMPLE_IMG_DIR="$source_iotests/sample_images"
fi

if [ ! -d "$SAMPLE_IMG_DIR" ]; then
+4 −4
Original line number Diff line number Diff line
@@ -318,9 +318,9 @@ _do()
        status=1; exit
    fi

    (eval "echo '---' \"$_cmd\"") >>$here/$seq.full
    (eval "echo '---' \"$_cmd\"") >>"$OUTPUT_DIR/$seq.full"
    (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 [ $ret -eq 0 ]; then
            echo "done"
@@ -344,7 +344,7 @@ _do()
#
_notrun()
{
    echo "$*" >$seq.notrun
    echo "$*" >"$OUTPUT_DIR/$seq.notrun"
    echo "$seq not run: $*"
    status=0
    exit
@@ -354,7 +354,7 @@ _notrun()
#
_fail()
{
    echo "$*" | tee -a $here/$seq.full
    echo "$*" | tee -a "$OUTPUT_DIR/$seq.full"
    echo "(see $seq.full for details)"
    status=1
    exit 1
+2 −1
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ qemu_args = os.environ.get('QEMU', 'qemu').strip().split(' ')
imgfmt = os.environ.get('IMGFMT', 'raw')
imgproto = os.environ.get('IMGPROTO', 'file')
test_dir = os.environ.get('TEST_DIR', '/var/tmp')
output_dir = os.environ.get('OUTPUT_DIR', '.')
cachemode = os.environ.get('CACHEMODE')

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")
    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)
    sys.exit(0)