xref: /openbmc/qemu/tests/qemu-iotests/check (revision 4a715461c8eab628e79b1e6889d650455e043b88)
111a82d14SPhilippe Mathieu-Daudé#!/usr/bin/env bash
26bf19c94SChristoph Hellwig#
36bf19c94SChristoph Hellwig# Copyright (C) 2009 Red Hat, Inc.
46bf19c94SChristoph Hellwig# Copyright (c) 2000-2002,2006 Silicon Graphics, Inc.  All Rights Reserved.
56bf19c94SChristoph Hellwig#
66bf19c94SChristoph Hellwig# This program is free software; you can redistribute it and/or
76bf19c94SChristoph Hellwig# modify it under the terms of the GNU General Public License as
86bf19c94SChristoph Hellwig# published by the Free Software Foundation.
96bf19c94SChristoph Hellwig#
106bf19c94SChristoph Hellwig# This program is distributed in the hope that it would be useful,
116bf19c94SChristoph Hellwig# but WITHOUT ANY WARRANTY; without even the implied warranty of
126bf19c94SChristoph Hellwig# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
136bf19c94SChristoph Hellwig# GNU General Public License for more details.
146bf19c94SChristoph Hellwig#
156bf19c94SChristoph Hellwig# You should have received a copy of the GNU General Public License
16e8c212d6SChristoph Hellwig# along with this program.  If not, see <http://www.gnu.org/licenses/>.
176bf19c94SChristoph Hellwig#
186bf19c94SChristoph Hellwig#
196bf19c94SChristoph Hellwig# Control script for QA
206bf19c94SChristoph Hellwig#
216bf19c94SChristoph Hellwig
226bf19c94SChristoph Hellwigstatus=0
236bf19c94SChristoph Hellwigneedwrap=true
246bf19c94SChristoph Hellwigtry=0
256bf19c94SChristoph Hellwign_bad=0
266bf19c94SChristoph Hellwigbad=""
276bf19c94SChristoph Hellwignotrun=""
2857ed557fSAndrey Shinkevichcasenotrun=""
296bf19c94SChristoph Hellwiginterrupt=true
306bf19c94SChristoph Hellwig
316bf19c94SChristoph Hellwig# by default don't output timestamps
326bf19c94SChristoph Hellwigtimestamp=${TIMESTAMP:=false}
336bf19c94SChristoph Hellwig
34e8f8624dSMax Reitz_init_error()
35e8f8624dSMax Reitz{
364e670492SPaolo Bonzini    echo "check: $1" >&2
376bf19c94SChristoph Hellwig    exit 1
38e8f8624dSMax Reitz}
39e8f8624dSMax Reitz
40e8f8624dSMax Reitzif [ -L "$0" ]
41e8f8624dSMax Reitzthen
42e8f8624dSMax Reitz    # called from the build tree
43e8f8624dSMax Reitz    source_iotests=$(dirname "$(readlink "$0")")
44e8f8624dSMax Reitz    if [ -z "$source_iotests" ]
45e8f8624dSMax Reitz    then
46e8f8624dSMax Reitz        _init_error "failed to obtain source tree name from check symlink"
47e8f8624dSMax Reitz    fi
48e8f8624dSMax Reitz    source_iotests=$(cd "$source_iotests"; pwd) || _init_error "failed to enter source tree"
49e8f8624dSMax Reitz    build_iotests=$PWD
50e8f8624dSMax Reitzelse
51e8f8624dSMax Reitz    # called from the source tree
52e8f8624dSMax Reitz    source_iotests=$PWD
53e8f8624dSMax Reitz    # this may be an in-tree build (note that in the following code we may not
54e8f8624dSMax Reitz    # assume that it truly is and have to test whether the build results
55e8f8624dSMax Reitz    # actually exist)
56e8f8624dSMax Reitz    build_iotests=$PWD
57e8f8624dSMax Reitzfi
58e8f8624dSMax Reitz
59e8f8624dSMax Reitzbuild_root="$build_iotests/../.."
60e8f8624dSMax Reitz
617fed1a49SMax Reitz# we need common.env
627fed1a49SMax Reitzif ! . "$build_iotests/common.env"
637fed1a49SMax Reitzthen
647fed1a49SMax Reitz    _init_error "failed to source common.env (make sure the qemu-iotests are run from tests/qemu-iotests in the build tree)"
657fed1a49SMax Reitzfi
667fed1a49SMax Reitz
67e8f8624dSMax Reitz# we need common.config
68e8f8624dSMax Reitzif ! . "$source_iotests/common.config"
69e8f8624dSMax Reitzthen
70e8f8624dSMax Reitz    _init_error "failed to source common.config"
716bf19c94SChristoph Hellwigfi
726bf19c94SChristoph Hellwig
7309d653e6SPaolo Bonzini_full_imgfmt_details()
7409d653e6SPaolo Bonzini{
7509d653e6SPaolo Bonzini    if [ -n "$IMGOPTS" ]; then
7609d653e6SPaolo Bonzini        echo "$IMGFMT ($IMGOPTS)"
7709d653e6SPaolo Bonzini    else
7809d653e6SPaolo Bonzini        echo "$IMGFMT"
7909d653e6SPaolo Bonzini    fi
8009d653e6SPaolo Bonzini}
8109d653e6SPaolo Bonzini
8209d653e6SPaolo Bonzini_full_platform_details()
8309d653e6SPaolo Bonzini{
844a9e751fSMao Zhongyi    os=$(uname -s)
854a9e751fSMao Zhongyi    host=$(hostname -s)
864a9e751fSMao Zhongyi    kernel=$(uname -r)
874a9e751fSMao Zhongyi    platform=$(uname -m)
8809d653e6SPaolo Bonzini    echo "$os/$platform $host $kernel"
8909d653e6SPaolo Bonzini}
9009d653e6SPaolo Bonzini
9109d653e6SPaolo Bonzini# $1 = prog to look for
9209d653e6SPaolo Bonziniset_prog_path()
9309d653e6SPaolo Bonzini{
944a9e751fSMao Zhongyi    p=$(command -v $1 2> /dev/null)
9509d653e6SPaolo Bonzini    if [ -n "$p" -a -x "$p" ]; then
9663ca8406SEric Blake        type -p "$p"
9709d653e6SPaolo Bonzini    else
9809d653e6SPaolo Bonzini        return 1
9909d653e6SPaolo Bonzini    fi
10009d653e6SPaolo Bonzini}
10109d653e6SPaolo Bonzini
10209d653e6SPaolo Bonziniif [ -z "$TEST_DIR" ]; then
103e8d81a61SMao Zhongyi        TEST_DIR=$PWD/scratch
10409d653e6SPaolo Bonzinifi
10509d653e6SPaolo Bonzini
10609d653e6SPaolo Bonziniif [ ! -e "$TEST_DIR" ]; then
10709d653e6SPaolo Bonzini        mkdir "$TEST_DIR"
10809d653e6SPaolo Bonzinifi
10909d653e6SPaolo Bonzini
11009d653e6SPaolo Bonzinidiff="diff -u"
11109d653e6SPaolo Bonziniverbose=false
11209d653e6SPaolo Bonzinidebug=false
11309d653e6SPaolo Bonzinigroup=false
11409d653e6SPaolo Bonzinixgroup=false
11509d653e6SPaolo Bonziniimgopts=false
11609d653e6SPaolo Bonzinishowme=false
11709d653e6SPaolo Bonzinisortme=false
11809d653e6SPaolo Bonziniexpunge=true
11909d653e6SPaolo Bonzinihave_test_arg=false
12009d653e6SPaolo Bonzinicachemode=false
12109d653e6SPaolo Bonzini
12209d653e6SPaolo Bonzinitmp="${TEST_DIR}"/$$
12309d653e6SPaolo Bonzinirm -f $tmp.list $tmp.tmp $tmp.sed
12409d653e6SPaolo Bonzini
12509d653e6SPaolo Bonziniexport IMGFMT=raw
12609d653e6SPaolo Bonziniexport IMGFMT_GENERIC=true
12709d653e6SPaolo Bonziniexport IMGPROTO=file
12809d653e6SPaolo Bonziniexport IMGOPTS=""
12909d653e6SPaolo Bonziniexport CACHEMODE="writeback"
13009d653e6SPaolo Bonziniexport QEMU_IO_OPTIONS=""
13109d653e6SPaolo Bonziniexport QEMU_IO_OPTIONS_NO_FMT=""
13209d653e6SPaolo Bonziniexport CACHEMODE_IS_DEFAULT=true
13309d653e6SPaolo Bonziniexport VALGRIND_QEMU=
13409d653e6SPaolo Bonziniexport IMGKEYSECRET=
13509d653e6SPaolo Bonziniexport IMGOPTSSYNTAX=false
13609d653e6SPaolo Bonzini
1378803714bSEric Blake# Save current tty settings, since an aborting qemu call may leave things
1388803714bSEric Blake# screwed up
1398803714bSEric BlakeSTTY_RESTORE=
1408803714bSEric Blakeif test -t 0; then
1418803714bSEric Blake    STTY_RESTORE=$(stty -g)
1428803714bSEric Blakefi
1438803714bSEric Blake
14409d653e6SPaolo Bonzinifor r
14509d653e6SPaolo Bonzinido
14609d653e6SPaolo Bonzini
14709d653e6SPaolo Bonzini    if $group
14809d653e6SPaolo Bonzini    then
14909d653e6SPaolo Bonzini        # arg after -g
1504a9e751fSMao Zhongyi        group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
15109d653e6SPaolo Bonzinis/ .*//p
1524a9e751fSMao Zhongyi}')
15309d653e6SPaolo Bonzini        if [ -z "$group_list" ]
15409d653e6SPaolo Bonzini        then
15509d653e6SPaolo Bonzini            echo "Group \"$r\" is empty or not defined?"
15609d653e6SPaolo Bonzini            exit 1
15709d653e6SPaolo Bonzini        fi
15809d653e6SPaolo Bonzini        [ ! -s $tmp.list ] && touch $tmp.list
15909d653e6SPaolo Bonzini        for t in $group_list
16009d653e6SPaolo Bonzini        do
16109d653e6SPaolo Bonzini            if grep -s "^$t\$" $tmp.list >/dev/null
16209d653e6SPaolo Bonzini            then
16309d653e6SPaolo Bonzini                :
16409d653e6SPaolo Bonzini            else
16509d653e6SPaolo Bonzini                echo "$t" >>$tmp.list
16609d653e6SPaolo Bonzini            fi
16709d653e6SPaolo Bonzini        done
16809d653e6SPaolo Bonzini        group=false
16909d653e6SPaolo Bonzini        continue
17009d653e6SPaolo Bonzini
17109d653e6SPaolo Bonzini    elif $xgroup
17209d653e6SPaolo Bonzini    then
17309d653e6SPaolo Bonzini        # arg after -x
17409d653e6SPaolo Bonzini        # Populate $tmp.list with all tests
17509d653e6SPaolo Bonzini        awk '/^[0-9]{3,}/ {print $1}' "${source_iotests}/group" > $tmp.list 2>/dev/null
1764a9e751fSMao Zhongyi        group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
17709d653e6SPaolo Bonzinis/ .*//p
1784a9e751fSMao Zhongyi}')
17909d653e6SPaolo Bonzini        if [ -z "$group_list" ]
18009d653e6SPaolo Bonzini        then
18109d653e6SPaolo Bonzini            echo "Group \"$r\" is empty or not defined?"
18209d653e6SPaolo Bonzini            exit 1
18309d653e6SPaolo Bonzini        fi
18409d653e6SPaolo Bonzini        numsed=0
18509d653e6SPaolo Bonzini        rm -f $tmp.sed
18609d653e6SPaolo Bonzini        for t in $group_list
18709d653e6SPaolo Bonzini        do
18809d653e6SPaolo Bonzini            if [ $numsed -gt 100 ]
18909d653e6SPaolo Bonzini            then
19009d653e6SPaolo Bonzini                sed -f $tmp.sed <$tmp.list >$tmp.tmp
19109d653e6SPaolo Bonzini                mv $tmp.tmp $tmp.list
19209d653e6SPaolo Bonzini                numsed=0
19309d653e6SPaolo Bonzini                rm -f $tmp.sed
19409d653e6SPaolo Bonzini            fi
19509d653e6SPaolo Bonzini            echo "/^$t\$/d" >>$tmp.sed
1964a9e751fSMao Zhongyi            numsed=$(expr $numsed + 1)
19709d653e6SPaolo Bonzini        done
19809d653e6SPaolo Bonzini        sed -f $tmp.sed <$tmp.list >$tmp.tmp
19909d653e6SPaolo Bonzini        mv $tmp.tmp $tmp.list
20009d653e6SPaolo Bonzini        xgroup=false
20109d653e6SPaolo Bonzini        continue
20209d653e6SPaolo Bonzini
20309d653e6SPaolo Bonzini    elif $imgopts
20409d653e6SPaolo Bonzini    then
20509d653e6SPaolo Bonzini        IMGOPTS="$r"
20609d653e6SPaolo Bonzini        imgopts=false
20709d653e6SPaolo Bonzini        continue
20809d653e6SPaolo Bonzini    elif $cachemode
20909d653e6SPaolo Bonzini    then
21009d653e6SPaolo Bonzini        CACHEMODE="$r"
21109d653e6SPaolo Bonzini        CACHEMODE_IS_DEFAULT=false
21209d653e6SPaolo Bonzini        cachemode=false
21309d653e6SPaolo Bonzini        continue
21409d653e6SPaolo Bonzini    fi
21509d653e6SPaolo Bonzini
21609d653e6SPaolo Bonzini    xpand=true
21709d653e6SPaolo Bonzini    case "$r"
21809d653e6SPaolo Bonzini    in
21909d653e6SPaolo Bonzini
22009d653e6SPaolo Bonzini        -\? | -h | --help)        # usage
22109d653e6SPaolo Bonzini            echo "Usage: $0 [options] [testlist]"'
22209d653e6SPaolo Bonzini
22309d653e6SPaolo Bonzinicommon options
22409d653e6SPaolo Bonzini    -v                  verbose
22509d653e6SPaolo Bonzini    -d                  debug
22609d653e6SPaolo Bonzini
22709d653e6SPaolo Bonziniimage format options
22809d653e6SPaolo Bonzini    -raw                test raw (default)
22909d653e6SPaolo Bonzini    -bochs              test bochs
23009d653e6SPaolo Bonzini    -cloop              test cloop
23109d653e6SPaolo Bonzini    -parallels          test parallels
23209d653e6SPaolo Bonzini    -qcow               test qcow
23309d653e6SPaolo Bonzini    -qcow2              test qcow2
23409d653e6SPaolo Bonzini    -qed                test qed
23509d653e6SPaolo Bonzini    -vdi                test vdi
23609d653e6SPaolo Bonzini    -vpc                test vpc
23709d653e6SPaolo Bonzini    -vhdx               test vhdx
23809d653e6SPaolo Bonzini    -vmdk               test vmdk
23909d653e6SPaolo Bonzini    -luks               test luks
24076f1cf0aSyuchenlin    -dmg                test dmg
24109d653e6SPaolo Bonzini
24209d653e6SPaolo Bonziniimage protocol options
24309d653e6SPaolo Bonzini    -file               test file (default)
24409d653e6SPaolo Bonzini    -rbd                test rbd
24509d653e6SPaolo Bonzini    -sheepdog           test sheepdog
24609d653e6SPaolo Bonzini    -nbd                test nbd
24709d653e6SPaolo Bonzini    -ssh                test ssh
24809d653e6SPaolo Bonzini    -nfs                test nfs
24909d653e6SPaolo Bonzini    -vxhs               test vxhs
25009d653e6SPaolo Bonzini
25109d653e6SPaolo Bonziniother options
25209d653e6SPaolo Bonzini    -xdiff              graphical mode diff
25309d653e6SPaolo Bonzini    -nocache            use O_DIRECT on backing file
25409d653e6SPaolo Bonzini    -misalign           misalign memory allocations
25509d653e6SPaolo Bonzini    -n                  show me, do not run tests
25609d653e6SPaolo Bonzini    -o options          -o options to pass to qemu-img create/convert
25709d653e6SPaolo Bonzini    -T                  output timestamps
25809d653e6SPaolo Bonzini    -c mode             cache mode
25909d653e6SPaolo Bonzini
26009d653e6SPaolo Bonzinitestlist options
26109d653e6SPaolo Bonzini    -g group[,group...]        include tests from these groups
26209d653e6SPaolo Bonzini    -x group[,group...]        exclude tests from these groups
26309d653e6SPaolo Bonzini    NNN                        include test NNN
26409d653e6SPaolo Bonzini    NNN-NNN                    include test range (eg. 012-021)
26509d653e6SPaolo Bonzini'
26609d653e6SPaolo Bonzini            exit 0
26709d653e6SPaolo Bonzini            ;;
26809d653e6SPaolo Bonzini
26909d653e6SPaolo Bonzini        -raw)
27009d653e6SPaolo Bonzini            IMGFMT=raw
27109d653e6SPaolo Bonzini            xpand=false
27209d653e6SPaolo Bonzini            ;;
27309d653e6SPaolo Bonzini
27409d653e6SPaolo Bonzini        -bochs)
27509d653e6SPaolo Bonzini            IMGFMT=bochs
27609d653e6SPaolo Bonzini            IMGFMT_GENERIC=false
27709d653e6SPaolo Bonzini            xpand=false
27809d653e6SPaolo Bonzini            ;;
27909d653e6SPaolo Bonzini
28009d653e6SPaolo Bonzini        -cloop)
28109d653e6SPaolo Bonzini            IMGFMT=cloop
28209d653e6SPaolo Bonzini            IMGFMT_GENERIC=false
28309d653e6SPaolo Bonzini            xpand=false
28409d653e6SPaolo Bonzini            ;;
28509d653e6SPaolo Bonzini
28609d653e6SPaolo Bonzini        -parallels)
28709d653e6SPaolo Bonzini            IMGFMT=parallels
28809d653e6SPaolo Bonzini            xpand=false
28909d653e6SPaolo Bonzini            ;;
29009d653e6SPaolo Bonzini
29109d653e6SPaolo Bonzini        -qcow)
29209d653e6SPaolo Bonzini            IMGFMT=qcow
29309d653e6SPaolo Bonzini            xpand=false
29409d653e6SPaolo Bonzini            ;;
29509d653e6SPaolo Bonzini
29609d653e6SPaolo Bonzini        -qcow2)
29709d653e6SPaolo Bonzini            IMGFMT=qcow2
29809d653e6SPaolo Bonzini            xpand=false
29909d653e6SPaolo Bonzini            ;;
30009d653e6SPaolo Bonzini
30109d653e6SPaolo Bonzini        -luks)
30209d653e6SPaolo Bonzini            IMGOPTSSYNTAX=true
30309d653e6SPaolo Bonzini            IMGFMT=luks
30409d653e6SPaolo Bonzini            IMGKEYSECRET=123456
30509d653e6SPaolo Bonzini            xpand=false
30609d653e6SPaolo Bonzini            ;;
30709d653e6SPaolo Bonzini
30876f1cf0aSyuchenlin        -dmg)
30976f1cf0aSyuchenlin            IMGFMT=dmg
31076f1cf0aSyuchenlin            IMGFMT_GENERIC=false
31176f1cf0aSyuchenlin            xpand=false
31276f1cf0aSyuchenlin            ;;
31376f1cf0aSyuchenlin
31409d653e6SPaolo Bonzini        -qed)
31509d653e6SPaolo Bonzini            IMGFMT=qed
31609d653e6SPaolo Bonzini            xpand=false
31709d653e6SPaolo Bonzini            ;;
31809d653e6SPaolo Bonzini
31909d653e6SPaolo Bonzini        -vdi)
32009d653e6SPaolo Bonzini            IMGFMT=vdi
32109d653e6SPaolo Bonzini            xpand=false
32209d653e6SPaolo Bonzini            ;;
32309d653e6SPaolo Bonzini
32409d653e6SPaolo Bonzini        -vmdk)
32509d653e6SPaolo Bonzini            IMGFMT=vmdk
32609d653e6SPaolo Bonzini            xpand=false
32709d653e6SPaolo Bonzini            ;;
32809d653e6SPaolo Bonzini
32909d653e6SPaolo Bonzini        -vpc)
33009d653e6SPaolo Bonzini            IMGFMT=vpc
33109d653e6SPaolo Bonzini            xpand=false
33209d653e6SPaolo Bonzini            ;;
33309d653e6SPaolo Bonzini
33409d653e6SPaolo Bonzini        -vhdx)
33509d653e6SPaolo Bonzini            IMGFMT=vhdx
33609d653e6SPaolo Bonzini            xpand=false
33709d653e6SPaolo Bonzini            ;;
33809d653e6SPaolo Bonzini
33909d653e6SPaolo Bonzini        -file)
34009d653e6SPaolo Bonzini            IMGPROTO=file
34109d653e6SPaolo Bonzini            xpand=false
34209d653e6SPaolo Bonzini            ;;
34309d653e6SPaolo Bonzini
34409d653e6SPaolo Bonzini        -rbd)
34509d653e6SPaolo Bonzini            IMGPROTO=rbd
34609d653e6SPaolo Bonzini            xpand=false
34709d653e6SPaolo Bonzini            ;;
34809d653e6SPaolo Bonzini
34909d653e6SPaolo Bonzini        -sheepdog)
35009d653e6SPaolo Bonzini            IMGPROTO=sheepdog
35109d653e6SPaolo Bonzini            xpand=false
35209d653e6SPaolo Bonzini            ;;
35309d653e6SPaolo Bonzini
35409d653e6SPaolo Bonzini        -nbd)
35509d653e6SPaolo Bonzini            IMGPROTO=nbd
35609d653e6SPaolo Bonzini            xpand=false
35709d653e6SPaolo Bonzini            ;;
35809d653e6SPaolo Bonzini
35909d653e6SPaolo Bonzini        -vxhs)
36009d653e6SPaolo Bonzini            IMGPROTO=vxhs
36109d653e6SPaolo Bonzini            xpand=false
36209d653e6SPaolo Bonzini            ;;
36309d653e6SPaolo Bonzini
36409d653e6SPaolo Bonzini        -ssh)
36509d653e6SPaolo Bonzini            IMGPROTO=ssh
36609d653e6SPaolo Bonzini            xpand=false
36709d653e6SPaolo Bonzini            ;;
36809d653e6SPaolo Bonzini
36909d653e6SPaolo Bonzini        -nfs)
37009d653e6SPaolo Bonzini            IMGPROTO=nfs
37109d653e6SPaolo Bonzini            xpand=false
37209d653e6SPaolo Bonzini            ;;
37309d653e6SPaolo Bonzini
37409d653e6SPaolo Bonzini        -nocache)
37509d653e6SPaolo Bonzini            CACHEMODE="none"
37609d653e6SPaolo Bonzini            CACHEMODE_IS_DEFAULT=false
37709d653e6SPaolo Bonzini            xpand=false
37809d653e6SPaolo Bonzini            ;;
37909d653e6SPaolo Bonzini
38009d653e6SPaolo Bonzini        -misalign)
38109d653e6SPaolo Bonzini            QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --misalign"
38209d653e6SPaolo Bonzini            xpand=false
38309d653e6SPaolo Bonzini            ;;
38409d653e6SPaolo Bonzini
38509d653e6SPaolo Bonzini        -valgrind)
38609d653e6SPaolo Bonzini            VALGRIND_QEMU='y'
38709d653e6SPaolo Bonzini            xpand=false
38809d653e6SPaolo Bonzini            ;;
38909d653e6SPaolo Bonzini
39009d653e6SPaolo Bonzini        -g)        # -g group ... pick from group file
39109d653e6SPaolo Bonzini            group=true
39209d653e6SPaolo Bonzini            xpand=false
39309d653e6SPaolo Bonzini            ;;
39409d653e6SPaolo Bonzini
39509d653e6SPaolo Bonzini        -xdiff)        # graphical diff mode
39609d653e6SPaolo Bonzini            xpand=false
39709d653e6SPaolo Bonzini
39809d653e6SPaolo Bonzini            if [ ! -z "$DISPLAY" ]
39909d653e6SPaolo Bonzini            then
40009d653e6SPaolo Bonzini                command -v xdiff >/dev/null 2>&1 && diff=xdiff
40109d653e6SPaolo Bonzini                command -v gdiff >/dev/null 2>&1 && diff=gdiff
40209d653e6SPaolo Bonzini                command -v tkdiff >/dev/null 2>&1 && diff=tkdiff
40309d653e6SPaolo Bonzini                command -v xxdiff >/dev/null 2>&1 && diff=xxdiff
40409d653e6SPaolo Bonzini            fi
40509d653e6SPaolo Bonzini            ;;
40609d653e6SPaolo Bonzini
40709d653e6SPaolo Bonzini        -n)        # show me, don't do it
40809d653e6SPaolo Bonzini            showme=true
40909d653e6SPaolo Bonzini            xpand=false
41009d653e6SPaolo Bonzini            ;;
41109d653e6SPaolo Bonzini        -o)
41209d653e6SPaolo Bonzini            imgopts=true
41309d653e6SPaolo Bonzini            xpand=false
41409d653e6SPaolo Bonzini            ;;
41509d653e6SPaolo Bonzini        -c)
41609d653e6SPaolo Bonzini            cachemode=true
41709d653e6SPaolo Bonzini            xpand=false
41809d653e6SPaolo Bonzini            ;;
41909d653e6SPaolo Bonzini        -T)        # turn on timestamp output
42009d653e6SPaolo Bonzini            timestamp=true
42109d653e6SPaolo Bonzini            xpand=false
42209d653e6SPaolo Bonzini            ;;
42309d653e6SPaolo Bonzini
42409d653e6SPaolo Bonzini        -v)
42509d653e6SPaolo Bonzini            verbose=true
42609d653e6SPaolo Bonzini            xpand=false
42709d653e6SPaolo Bonzini            ;;
42809d653e6SPaolo Bonzini        -d)
42909d653e6SPaolo Bonzini            debug=true
43009d653e6SPaolo Bonzini            xpand=false
43109d653e6SPaolo Bonzini            ;;
43209d653e6SPaolo Bonzini        -x)        # -x group ... exclude from group file
43309d653e6SPaolo Bonzini            xgroup=true
43409d653e6SPaolo Bonzini            xpand=false
43509d653e6SPaolo Bonzini            ;;
43609d653e6SPaolo Bonzini        '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
43709d653e6SPaolo Bonzini            echo "No tests?"
43809d653e6SPaolo Bonzini            status=1
43909d653e6SPaolo Bonzini            exit $status
44009d653e6SPaolo Bonzini            ;;
44109d653e6SPaolo Bonzini
44209d653e6SPaolo Bonzini        [0-9]*-[0-9]*)
4434a9e751fSMao Zhongyi            eval $(echo $r | sed -e 's/^/start=/' -e 's/-/ end=/')
44409d653e6SPaolo Bonzini            ;;
44509d653e6SPaolo Bonzini
44609d653e6SPaolo Bonzini        [0-9]*-)
4474a9e751fSMao Zhongyi            eval $(echo $r | sed -e 's/^/start=/' -e 's/-//')
4484a9e751fSMao Zhongyi            end=$(echo [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] | sed -e 's/\[0-9]//g' -e 's/  *$//' -e 's/.* //')
44909d653e6SPaolo Bonzini            if [ -z "$end" ]
45009d653e6SPaolo Bonzini            then
45109d653e6SPaolo Bonzini                echo "No tests in range \"$r\"?"
45209d653e6SPaolo Bonzini                status=1
45309d653e6SPaolo Bonzini                exit $status
45409d653e6SPaolo Bonzini            fi
45509d653e6SPaolo Bonzini            ;;
45609d653e6SPaolo Bonzini
45709d653e6SPaolo Bonzini        *)
45809d653e6SPaolo Bonzini            start=$r
45909d653e6SPaolo Bonzini            end=$r
46009d653e6SPaolo Bonzini            ;;
46109d653e6SPaolo Bonzini
46209d653e6SPaolo Bonzini    esac
46309d653e6SPaolo Bonzini
46409d653e6SPaolo Bonzini    # get rid of leading 0s as can be interpreted as octal
4654a9e751fSMao Zhongyi    start=$(echo $start | sed 's/^0*//')
4664a9e751fSMao Zhongyi    end=$(echo $end | sed 's/^0*//')
46709d653e6SPaolo Bonzini
46809d653e6SPaolo Bonzini    if $xpand
46909d653e6SPaolo Bonzini    then
47009d653e6SPaolo Bonzini        have_test_arg=true
47109d653e6SPaolo Bonzini        awk </dev/null '
47209d653e6SPaolo BonziniBEGIN        { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
47309d653e6SPaolo Bonzini        | while read id
47409d653e6SPaolo Bonzini        do
47509d653e6SPaolo Bonzini            if grep -s "^$id " "$source_iotests/group" >/dev/null
47609d653e6SPaolo Bonzini            then
47709d653e6SPaolo Bonzini                # in group file ... OK
47809d653e6SPaolo Bonzini                echo $id >>$tmp.list
47909d653e6SPaolo Bonzini            else
48009d653e6SPaolo Bonzini                if [ -f expunged ] && $expunge && egrep "^$id([         ]|\$)" expunged >/dev/null
48109d653e6SPaolo Bonzini                then
48209d653e6SPaolo Bonzini                    # expunged ... will be reported, but not run, later
48309d653e6SPaolo Bonzini                    echo $id >>$tmp.list
48409d653e6SPaolo Bonzini                else
48509d653e6SPaolo Bonzini                    # oops
48609d653e6SPaolo Bonzini                    if [ "$start" == "$end" -a "$id" == "$end" ]
48709d653e6SPaolo Bonzini                    then
48809d653e6SPaolo Bonzini                        echo "$id - unknown test"
48909d653e6SPaolo Bonzini                        exit 1
49009d653e6SPaolo Bonzini                    else
49109d653e6SPaolo Bonzini                        echo "$id - unknown test, ignored"
49209d653e6SPaolo Bonzini                    fi
49309d653e6SPaolo Bonzini                fi
49409d653e6SPaolo Bonzini            fi
49509d653e6SPaolo Bonzini        done || exit 1
49609d653e6SPaolo Bonzini    fi
49709d653e6SPaolo Bonzini
49809d653e6SPaolo Bonzinidone
49909d653e6SPaolo Bonzini
50009d653e6SPaolo Bonzini# Set qemu-io cache mode with $CACHEMODE we have
50109d653e6SPaolo BonziniQEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --cache $CACHEMODE"
50209d653e6SPaolo Bonzini
50309d653e6SPaolo BonziniQEMU_IO_OPTIONS_NO_FMT="$QEMU_IO_OPTIONS"
50409d653e6SPaolo Bonziniif [ "$IMGOPTSSYNTAX" != "true" ]; then
50509d653e6SPaolo Bonzini    QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS -f $IMGFMT"
50609d653e6SPaolo Bonzinifi
50709d653e6SPaolo Bonzini
50809d653e6SPaolo Bonzini# Set default options for qemu-img create -o if they were not specified
50909d653e6SPaolo Bonziniif [ "$IMGFMT" == "qcow2" ] && ! (echo "$IMGOPTS" | grep "compat=" > /dev/null); then
51009d653e6SPaolo Bonzini    IMGOPTS=$(_optstr_add "$IMGOPTS" "compat=1.1")
51109d653e6SPaolo Bonzinifi
51209d653e6SPaolo Bonziniif [ "$IMGFMT" == "luks" ] && ! (echo "$IMGOPTS" | grep "iter-time=" > /dev/null); then
51309d653e6SPaolo Bonzini    IMGOPTS=$(_optstr_add "$IMGOPTS" "iter-time=10")
51409d653e6SPaolo Bonzinifi
51509d653e6SPaolo Bonzini
51609d653e6SPaolo Bonziniif [ -z "$SAMPLE_IMG_DIR" ]; then
51709d653e6SPaolo Bonzini        SAMPLE_IMG_DIR="$source_iotests/sample_images"
51809d653e6SPaolo Bonzinifi
51909d653e6SPaolo Bonzini
52009d653e6SPaolo Bonziniexport TEST_DIR
52109d653e6SPaolo Bonziniexport SAMPLE_IMG_DIR
52209d653e6SPaolo Bonzini
52309d653e6SPaolo Bonziniif [ -s $tmp.list ]
52409d653e6SPaolo Bonzinithen
52509d653e6SPaolo Bonzini    # found some valid test numbers ... this is good
52609d653e6SPaolo Bonzini    :
52709d653e6SPaolo Bonzinielse
52809d653e6SPaolo Bonzini    if $have_test_arg
52909d653e6SPaolo Bonzini    then
53009d653e6SPaolo Bonzini        # had test numbers, but none in group file ... do nothing
53109d653e6SPaolo Bonzini        touch $tmp.list
53209d653e6SPaolo Bonzini    else
53309d653e6SPaolo Bonzini        # no test numbers, do everything from group file
53409d653e6SPaolo Bonzini        sed -n -e '/^[0-9][0-9][0-9]*/s/[         ].*//p' <"$source_iotests/group" >$tmp.list
53509d653e6SPaolo Bonzini    fi
53609d653e6SPaolo Bonzinifi
53709d653e6SPaolo Bonzini
53809d653e6SPaolo Bonzini# should be sort -n, but this did not work for Linux when this
53909d653e6SPaolo Bonzini# was ported from IRIX
54009d653e6SPaolo Bonzini#
5414a9e751fSMao Zhongyilist=$(sort $tmp.list)
54209d653e6SPaolo Bonzinirm -f $tmp.list $tmp.tmp $tmp.sed
54309d653e6SPaolo Bonzini
54409d653e6SPaolo Bonziniif [ -z "$QEMU_PROG" ]
54509d653e6SPaolo Bonzinithen
54609d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu" ]; then
54709d653e6SPaolo Bonzini        export QEMU_PROG="$build_iotests/qemu"
54896914159SLukáš Doktor    elif [ -x "$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}" ]; then
54996914159SLukáš Doktor        export QEMU_PROG="$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}"
55009d653e6SPaolo Bonzini    else
55109d653e6SPaolo Bonzini        pushd "$build_root" > /dev/null
55209d653e6SPaolo Bonzini        for binary in *-softmmu/qemu-system-*
55309d653e6SPaolo Bonzini        do
55409d653e6SPaolo Bonzini            if [ -x "$binary" ]
55509d653e6SPaolo Bonzini            then
55609d653e6SPaolo Bonzini                export QEMU_PROG="$build_root/$binary"
55709d653e6SPaolo Bonzini                break
55809d653e6SPaolo Bonzini            fi
55909d653e6SPaolo Bonzini        done
56009d653e6SPaolo Bonzini        popd > /dev/null
56109d653e6SPaolo Bonzini        [ "$QEMU_PROG" = "" ] && _init_error "qemu not found"
56209d653e6SPaolo Bonzini    fi
56309d653e6SPaolo Bonzinifi
56463ca8406SEric Blakeexport QEMU_PROG="$(type -p "$QEMU_PROG")"
56509d653e6SPaolo Bonzini
566*4a715461SThomas Huthcase "$QEMU_PROG" in
567*4a715461SThomas Huth    *qemu-system-arm|*qemu-system-aarch64)
568*4a715461SThomas Huth        export QEMU_OPTIONS="-nodefaults -machine virt,accel=qtest"
569*4a715461SThomas Huth        ;;
570*4a715461SThomas Huth    *qemu-system-tricore)
571*4a715461SThomas Huth        export QEMU_OPTIONS="-nodefaults -machine tricore_testboard,accel=qtest"
572*4a715461SThomas Huth        ;;
573*4a715461SThomas Huth    *)
574*4a715461SThomas Huth        export QEMU_OPTIONS="-nodefaults -machine accel=qtest"
575*4a715461SThomas Huth        ;;
576*4a715461SThomas Huthesac
577*4a715461SThomas Huth
57809d653e6SPaolo Bonziniif [ -z "$QEMU_IMG_PROG" ]; then
57909d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-img" ]; then
58009d653e6SPaolo Bonzini        export QEMU_IMG_PROG="$build_iotests/qemu-img"
58109d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-img" ]; then
58209d653e6SPaolo Bonzini        export QEMU_IMG_PROG="$build_root/qemu-img"
58309d653e6SPaolo Bonzini    else
58409d653e6SPaolo Bonzini        _init_error "qemu-img not found"
58509d653e6SPaolo Bonzini    fi
58609d653e6SPaolo Bonzinifi
58763ca8406SEric Blakeexport QEMU_IMG_PROG="$(type -p "$QEMU_IMG_PROG")"
58809d653e6SPaolo Bonzini
58909d653e6SPaolo Bonziniif [ -z "$QEMU_IO_PROG" ]; then
59009d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-io" ]; then
59109d653e6SPaolo Bonzini        export QEMU_IO_PROG="$build_iotests/qemu-io"
59209d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-io" ]; then
59309d653e6SPaolo Bonzini        export QEMU_IO_PROG="$build_root/qemu-io"
59409d653e6SPaolo Bonzini    else
59509d653e6SPaolo Bonzini        _init_error "qemu-io not found"
59609d653e6SPaolo Bonzini    fi
59709d653e6SPaolo Bonzinifi
59863ca8406SEric Blakeexport QEMU_IO_PROG="$(type -p "$QEMU_IO_PROG")"
59909d653e6SPaolo Bonzini
60009d653e6SPaolo Bonziniif [ -z $QEMU_NBD_PROG ]; then
60109d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-nbd" ]; then
60209d653e6SPaolo Bonzini        export QEMU_NBD_PROG="$build_iotests/qemu-nbd"
60309d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-nbd" ]; then
60409d653e6SPaolo Bonzini        export QEMU_NBD_PROG="$build_root/qemu-nbd"
60509d653e6SPaolo Bonzini    else
60609d653e6SPaolo Bonzini        _init_error "qemu-nbd not found"
60709d653e6SPaolo Bonzini    fi
60809d653e6SPaolo Bonzinifi
60963ca8406SEric Blakeexport QEMU_NBD_PROG="$(type -p "$QEMU_NBD_PROG")"
61009d653e6SPaolo Bonzini
61109d653e6SPaolo Bonziniif [ -z "$QEMU_VXHS_PROG" ]; then
6124a9e751fSMao Zhongyi    export QEMU_VXHS_PROG="$(set_prog_path qnio_server)"
61309d653e6SPaolo Bonzinifi
61409d653e6SPaolo Bonzini
61509d653e6SPaolo Bonziniif [ -x "$build_iotests/socket_scm_helper" ]
61609d653e6SPaolo Bonzinithen
61709d653e6SPaolo Bonzini    export SOCKET_SCM_HELPER="$build_iotests/socket_scm_helper"
61809d653e6SPaolo Bonzinifi
61909d653e6SPaolo Bonzini
62009d653e6SPaolo Bonzinidefault_machine=$($QEMU_PROG -machine help | sed -n '/(default)/ s/ .*//p')
62109d653e6SPaolo Bonzinidefault_alias_machine=$($QEMU_PROG -machine help | \
62209d653e6SPaolo Bonzini   sed -n "/(alias of $default_machine)/ { s/ .*//p; q; }")
62309d653e6SPaolo Bonziniif [[ "$default_alias_machine" ]]; then
62409d653e6SPaolo Bonzini    default_machine="$default_alias_machine"
62509d653e6SPaolo Bonzinifi
62609d653e6SPaolo Bonzini
62709d653e6SPaolo Bonziniexport QEMU_DEFAULT_MACHINE="$default_machine"
62889004368SKevin Wolf
62936bd4228SDaniel P. BerrangeTIMESTAMP_FILE=check.time-$IMGPROTO-$IMGFMT
63036bd4228SDaniel P. Berrange
6316bf19c94SChristoph Hellwig_wallclock()
6326bf19c94SChristoph Hellwig{
6339ee4b6f8SPaolo Bonzini    date "+%H %M %S" | awk '{ print $1*3600 + $2*60 + $3 }'
6346bf19c94SChristoph Hellwig}
6356bf19c94SChristoph Hellwig
6366bf19c94SChristoph Hellwig_timestamp()
6376bf19c94SChristoph Hellwig{
6384a9e751fSMao Zhongyi    now=$(date "+%T")
639b43671f8SEric Blake    printf %s " [$now]"
6406bf19c94SChristoph Hellwig}
6416bf19c94SChristoph Hellwig
6426bf19c94SChristoph Hellwig_wrapup()
6436bf19c94SChristoph Hellwig{
6446bf19c94SChristoph Hellwig    if $showme
6456bf19c94SChristoph Hellwig    then
6466bf19c94SChristoph Hellwig        :
6476bf19c94SChristoph Hellwig    elif $needwrap
6486bf19c94SChristoph Hellwig    then
64936bd4228SDaniel P. Berrange        if [ -f $TIMESTAMP_FILE -a -f $tmp.time ]
6506bf19c94SChristoph Hellwig        then
65136bd4228SDaniel P. Berrange            cat $TIMESTAMP_FILE $tmp.time \
6529ee4b6f8SPaolo Bonzini            | awk '
6536bf19c94SChristoph Hellwig        { t[$1] = $2 }
6546bf19c94SChristoph HellwigEND        { if (NR > 0) {
6556bf19c94SChristoph Hellwig            for (i in t) print i " " t[i]
6566bf19c94SChristoph Hellwig          }
6576bf19c94SChristoph Hellwig        }' \
6586bf19c94SChristoph Hellwig            | sort -n >$tmp.out
65936bd4228SDaniel P. Berrange            mv $tmp.out $TIMESTAMP_FILE
6606bf19c94SChristoph Hellwig        fi
6616bf19c94SChristoph Hellwig
6626bf19c94SChristoph Hellwig        if [ -f $tmp.expunged ]
6636bf19c94SChristoph Hellwig        then
6644a9e751fSMao Zhongyi            notrun=$(wc -l <$tmp.expunged | sed -e 's/  *//g')
6654a9e751fSMao Zhongyi            try=$(expr $try - $notrun)
6664a9e751fSMao Zhongyi            list=$(echo "$list" | sed -f $tmp.expunged)
6676bf19c94SChristoph Hellwig        fi
6686bf19c94SChristoph Hellwig
6696bf19c94SChristoph Hellwig        echo "" >>check.log
6706bf19c94SChristoph Hellwig        date >>check.log
6716bf19c94SChristoph Hellwig        echo $list | fmt | sed -e 's/^/    /' >>check.log
6726bf19c94SChristoph Hellwig        $interrupt && echo "Interrupted!" >>check.log
6736bf19c94SChristoph Hellwig
6746bf19c94SChristoph Hellwig        if [ ! -z "$notrun" ]
6756bf19c94SChristoph Hellwig        then
6766bf19c94SChristoph Hellwig            echo "Not run:$notrun"
6776bf19c94SChristoph Hellwig            echo "Not run:$notrun" >>check.log
6786bf19c94SChristoph Hellwig        fi
67957ed557fSAndrey Shinkevich        if [ ! -z "$casenotrun" ]
68057ed557fSAndrey Shinkevich        then
68157ed557fSAndrey Shinkevich            echo "Some cases not run in:$casenotrun"
68257ed557fSAndrey Shinkevich            echo "Some cases not run in:$casenotrun" >>check.log
68357ed557fSAndrey Shinkevich        fi
6846bf19c94SChristoph Hellwig        if [ ! -z "$n_bad" -a $n_bad != 0 ]
6856bf19c94SChristoph Hellwig        then
6866bf19c94SChristoph Hellwig            echo "Failures:$bad"
6876bf19c94SChristoph Hellwig            echo "Failed $n_bad of $try tests"
6886bf19c94SChristoph Hellwig            echo "Failures:$bad" | fmt >>check.log
6896bf19c94SChristoph Hellwig            echo "Failed $n_bad of $try tests" >>check.log
6906bf19c94SChristoph Hellwig        else
6916bf19c94SChristoph Hellwig            echo "Passed all $try tests"
6926bf19c94SChristoph Hellwig            echo "Passed all $try tests" >>check.log
6936bf19c94SChristoph Hellwig        fi
6946bf19c94SChristoph Hellwig        needwrap=false
6956bf19c94SChristoph Hellwig    fi
6966bf19c94SChristoph Hellwig
6978803714bSEric Blake    if test -n "$STTY_RESTORE"; then
6988803714bSEric Blake        stty $STTY_RESTORE
6998803714bSEric Blake    fi
7000145b4e1SSascha Silbe    rm -f "${TEST_DIR}"/*.out "${TEST_DIR}"/*.err "${TEST_DIR}"/*.time
7010145b4e1SSascha Silbe    rm -f "${TEST_DIR}"/check.pid "${TEST_DIR}"/check.sts
7026bf19c94SChristoph Hellwig    rm -f $tmp.*
7036bf19c94SChristoph Hellwig}
7046bf19c94SChristoph Hellwig
7056bf19c94SChristoph Hellwigtrap "_wrapup; exit \$status" 0 1 2 3 15
7066bf19c94SChristoph Hellwig
70736bd4228SDaniel P. Berrange[ -f $TIMESTAMP_FILE ] || touch $TIMESTAMP_FILE
7086bf19c94SChristoph Hellwig
7094a9e751fSMao ZhongyiFULL_IMGFMT_DETAILS=$(_full_imgfmt_details)
7104a9e751fSMao ZhongyiFULL_HOST_DETAILS=$(_full_platform_details)
7116bf19c94SChristoph Hellwig
7126bf19c94SChristoph Hellwigcat <<EOF
713934659c4SMax ReitzQEMU          -- "$QEMU_PROG" $QEMU_OPTIONS
714934659c4SMax ReitzQEMU_IMG      -- "$QEMU_IMG_PROG" $QEMU_IMG_OPTIONS
715934659c4SMax ReitzQEMU_IO       -- "$QEMU_IO_PROG" $QEMU_IO_OPTIONS
716934659c4SMax ReitzQEMU_NBD      -- "$QEMU_NBD_PROG" $QEMU_NBD_OPTIONS
7176bf19c94SChristoph HellwigIMGFMT        -- $FULL_IMGFMT_DETAILS
718657c572aSCleber RosaIMGPROTO      -- $IMGPROTO
7196bf19c94SChristoph HellwigPLATFORM      -- $FULL_HOST_DETAILS
720b8aff7d6SFam ZhengTEST_DIR      -- $TEST_DIR
72130b005d9SWenchao XiaSOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER
7226bf19c94SChristoph Hellwig
7236bf19c94SChristoph HellwigEOF
7246bf19c94SChristoph Hellwig
7256bf19c94SChristoph Hellwigseq="check"
7266bf19c94SChristoph Hellwig
7276bf19c94SChristoph Hellwig[ -n "$TESTS_REMAINING_LOG" ] && echo $list > $TESTS_REMAINING_LOG
7286bf19c94SChristoph Hellwig
7296bf19c94SChristoph Hellwigfor seq in $list
7306bf19c94SChristoph Hellwigdo
7316bf19c94SChristoph Hellwig    err=false
732b43671f8SEric Blake    printf %s "$seq"
7336bf19c94SChristoph Hellwig    if [ -n "$TESTS_REMAINING_LOG" ] ; then
7346bf19c94SChristoph Hellwig        sed -e "s/$seq//" -e 's/  / /' -e 's/^ *//' $TESTS_REMAINING_LOG > $TESTS_REMAINING_LOG.tmp
7356bf19c94SChristoph Hellwig        mv $TESTS_REMAINING_LOG.tmp $TESTS_REMAINING_LOG
7366bf19c94SChristoph Hellwig        sync
7376bf19c94SChristoph Hellwig    fi
7386bf19c94SChristoph Hellwig
7396bf19c94SChristoph Hellwig    if $showme
7406bf19c94SChristoph Hellwig    then
7416bf19c94SChristoph Hellwig        echo
7426bf19c94SChristoph Hellwig        continue
7436bf19c94SChristoph Hellwig    elif [ -f expunged ] && $expunge && egrep "^$seq([         ]|\$)" expunged >/dev/null
7446bf19c94SChristoph Hellwig    then
7456bf19c94SChristoph Hellwig        echo " - expunged"
7466bf19c94SChristoph Hellwig        rm -f $seq.out.bad
7476bf19c94SChristoph Hellwig        echo "/^$seq\$/d" >>$tmp.expunged
748e8f8624dSMax Reitz    elif [ ! -f "$source_iotests/$seq" ]
7496bf19c94SChristoph Hellwig    then
7506bf19c94SChristoph Hellwig        echo " - no such test?"
7516bf19c94SChristoph Hellwig        echo "/^$seq\$/d" >>$tmp.expunged
7526bf19c94SChristoph Hellwig    else
7536bf19c94SChristoph Hellwig        # really going to try and run this one
7546bf19c94SChristoph Hellwig        #
7556bf19c94SChristoph Hellwig        rm -f $seq.out.bad
7564a9e751fSMao Zhongyi        lasttime=$(sed -n -e "/^$seq /s/.* //p" <$TIMESTAMP_FILE)
7576bf19c94SChristoph Hellwig        if [ "X$lasttime" != X ]; then
758b43671f8SEric Blake                printf %s " ${lasttime}s ..."
7596bf19c94SChristoph Hellwig        else
760b43671f8SEric Blake                printf "        "        # prettier output with timestamps.
7616bf19c94SChristoph Hellwig        fi
7626bf19c94SChristoph Hellwig        rm -f core $seq.notrun
76357ed557fSAndrey Shinkevich        rm -f $seq.casenotrun
7646bf19c94SChristoph Hellwig
7654a9e751fSMao Zhongyi        start=$(_wallclock)
766b43671f8SEric Blake        $timestamp && printf %s "        [$(date "+%T")]"
767ea81ca9dSMax Reitz
768ea81ca9dSMax Reitz        if [ "$(head -n 1 "$source_iotests/$seq")" == "#!/usr/bin/env python" ]; then
769ea81ca9dSMax Reitz            run_command="$PYTHON $seq"
770ea81ca9dSMax Reitz        else
771ea81ca9dSMax Reitz            run_command="./$seq"
772ea81ca9dSMax Reitz        fi
773e8f8624dSMax Reitz        export OUTPUT_DIR=$PWD
774aa4f592aSFam Zheng        if $debug; then
775aa4f592aSFam Zheng            (cd "$source_iotests";
776aa4f592aSFam Zheng            MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
777aa4f592aSFam Zheng                    $run_command -d 2>&1 | tee $tmp.out)
778aa4f592aSFam Zheng        else
779e8f8624dSMax Reitz            (cd "$source_iotests";
78004129606SStefan Hajnoczi            MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
781ea81ca9dSMax Reitz                    $run_command >$tmp.out 2>&1)
782aa4f592aSFam Zheng        fi
7836bf19c94SChristoph Hellwig        sts=$?
7846bf19c94SChristoph Hellwig        $timestamp && _timestamp
7854a9e751fSMao Zhongyi        stop=$(_wallclock)
7866bf19c94SChristoph Hellwig
7876bf19c94SChristoph Hellwig        if [ -f core ]
7886bf19c94SChristoph Hellwig        then
789b43671f8SEric Blake            printf " [dumped core]"
7906bf19c94SChristoph Hellwig            mv core $seq.core
7916bf19c94SChristoph Hellwig            err=true
7926bf19c94SChristoph Hellwig        fi
7936bf19c94SChristoph Hellwig
7946bf19c94SChristoph Hellwig        if [ -f $seq.notrun ]
7956bf19c94SChristoph Hellwig        then
796b43671f8SEric Blake            $timestamp || printf " [not run] "
797b43671f8SEric Blake            $timestamp && echo " [not run]" && printf %s "        $seq -- "
7986bf19c94SChristoph Hellwig            cat $seq.notrun
7996bf19c94SChristoph Hellwig            notrun="$notrun $seq"
8006bf19c94SChristoph Hellwig        else
8016bf19c94SChristoph Hellwig            if [ $sts -ne 0 ]
8026bf19c94SChristoph Hellwig            then
803b43671f8SEric Blake                printf %s " [failed, exit status $sts]"
8046bf19c94SChristoph Hellwig                err=true
8056bf19c94SChristoph Hellwig            fi
8068f94b077SKevin Wolf
807e8f8624dSMax Reitz            reference="$source_iotests/$seq.out"
808e166b414SBo Tu            reference_machine="$source_iotests/$seq.$QEMU_DEFAULT_MACHINE.out"
809e166b414SBo Tu            if [ -f "$reference_machine" ]; then
810e166b414SBo Tu                reference="$reference_machine"
811e166b414SBo Tu            fi
812e166b414SBo Tu
813217a0683SStefan Hajnoczi            reference_format="$source_iotests/$seq.out.$IMGFMT"
814217a0683SStefan Hajnoczi            if [ -f "$reference_format" ]; then
815217a0683SStefan Hajnoczi                reference="$reference_format"
816217a0683SStefan Hajnoczi            fi
817217a0683SStefan Hajnoczi
8183baa8449SFam Zheng            if [ "$CACHEMODE" = "none" ]; then
819e8f8624dSMax Reitz                [ -f "$source_iotests/$seq.out.nocache" ] && reference="$source_iotests/$seq.out.nocache"
8208f94b077SKevin Wolf            fi
8218f94b077SKevin Wolf
822e8f8624dSMax Reitz            if [ ! -f "$reference" ]
8236bf19c94SChristoph Hellwig            then
8246bf19c94SChristoph Hellwig                echo " - no qualified output"
8256bf19c94SChristoph Hellwig                err=true
8266bf19c94SChristoph Hellwig            else
827e8f8624dSMax Reitz                if diff -w "$reference" $tmp.out >/dev/null 2>&1
8286bf19c94SChristoph Hellwig                then
8296bf19c94SChristoph Hellwig                    echo ""
8306bf19c94SChristoph Hellwig                    if $err
8316bf19c94SChristoph Hellwig                    then
8326bf19c94SChristoph Hellwig                        :
8336bf19c94SChristoph Hellwig                    else
8344a9e751fSMao Zhongyi                        echo "$seq $(expr $stop - $start)" >>$tmp.time
8356bf19c94SChristoph Hellwig                    fi
8366bf19c94SChristoph Hellwig                else
8376bf19c94SChristoph Hellwig                    echo " - output mismatch (see $seq.out.bad)"
8386bf19c94SChristoph Hellwig                    mv $tmp.out $seq.out.bad
83963ca8406SEric Blake                    $diff -w "$reference" "$PWD"/$seq.out.bad
8406bf19c94SChristoph Hellwig                    err=true
8416bf19c94SChristoph Hellwig                fi
8426bf19c94SChristoph Hellwig            fi
8436bf19c94SChristoph Hellwig        fi
84457ed557fSAndrey Shinkevich        if [ -f $seq.casenotrun ]
84557ed557fSAndrey Shinkevich        then
84657ed557fSAndrey Shinkevich            cat $seq.casenotrun
84757ed557fSAndrey Shinkevich            casenotrun="$casenotrun $seq"
84857ed557fSAndrey Shinkevich        fi
8496bf19c94SChristoph Hellwig    fi
8506bf19c94SChristoph Hellwig
8516bf19c94SChristoph Hellwig    # come here for each test, except when $showme is true
8526bf19c94SChristoph Hellwig    #
8536bf19c94SChristoph Hellwig    if $err
8546bf19c94SChristoph Hellwig    then
8556bf19c94SChristoph Hellwig        bad="$bad $seq"
8564a9e751fSMao Zhongyi        n_bad=$(expr $n_bad + 1)
8576bf19c94SChristoph Hellwig        quick=false
8586bf19c94SChristoph Hellwig    fi
8594a9e751fSMao Zhongyi    [ -f $seq.notrun ] || try=$(expr $try + 1)
8606bf19c94SChristoph Hellwig
8616bf19c94SChristoph Hellwig    seq="after_$seq"
8626bf19c94SChristoph Hellwigdone
8636bf19c94SChristoph Hellwig
8646bf19c94SChristoph Hellwiginterrupt=false
8654a9e751fSMao Zhongyistatus=$(expr $n_bad)
8666bf19c94SChristoph Hellwigexit
867