xref: /openbmc/qemu/tests/qemu-iotests/check (revision 11a82d14293cd66f428f535741717ff338c0722b)
1*11a82d14SPhilippe 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 QEMU_OPTIONS="-nodefaults -machine accel=qtest"
13409d653e6SPaolo Bonziniexport VALGRIND_QEMU=
13509d653e6SPaolo Bonziniexport IMGKEYSECRET=
13609d653e6SPaolo Bonziniexport IMGOPTSSYNTAX=false
13709d653e6SPaolo Bonzini
1388803714bSEric Blake# Save current tty settings, since an aborting qemu call may leave things
1398803714bSEric Blake# screwed up
1408803714bSEric BlakeSTTY_RESTORE=
1418803714bSEric Blakeif test -t 0; then
1428803714bSEric Blake    STTY_RESTORE=$(stty -g)
1438803714bSEric Blakefi
1448803714bSEric Blake
14509d653e6SPaolo Bonzinifor r
14609d653e6SPaolo Bonzinido
14709d653e6SPaolo Bonzini
14809d653e6SPaolo Bonzini    if $group
14909d653e6SPaolo Bonzini    then
15009d653e6SPaolo Bonzini        # arg after -g
1514a9e751fSMao Zhongyi        group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
15209d653e6SPaolo Bonzinis/ .*//p
1534a9e751fSMao Zhongyi}')
15409d653e6SPaolo Bonzini        if [ -z "$group_list" ]
15509d653e6SPaolo Bonzini        then
15609d653e6SPaolo Bonzini            echo "Group \"$r\" is empty or not defined?"
15709d653e6SPaolo Bonzini            exit 1
15809d653e6SPaolo Bonzini        fi
15909d653e6SPaolo Bonzini        [ ! -s $tmp.list ] && touch $tmp.list
16009d653e6SPaolo Bonzini        for t in $group_list
16109d653e6SPaolo Bonzini        do
16209d653e6SPaolo Bonzini            if grep -s "^$t\$" $tmp.list >/dev/null
16309d653e6SPaolo Bonzini            then
16409d653e6SPaolo Bonzini                :
16509d653e6SPaolo Bonzini            else
16609d653e6SPaolo Bonzini                echo "$t" >>$tmp.list
16709d653e6SPaolo Bonzini            fi
16809d653e6SPaolo Bonzini        done
16909d653e6SPaolo Bonzini        group=false
17009d653e6SPaolo Bonzini        continue
17109d653e6SPaolo Bonzini
17209d653e6SPaolo Bonzini    elif $xgroup
17309d653e6SPaolo Bonzini    then
17409d653e6SPaolo Bonzini        # arg after -x
17509d653e6SPaolo Bonzini        # Populate $tmp.list with all tests
17609d653e6SPaolo Bonzini        awk '/^[0-9]{3,}/ {print $1}' "${source_iotests}/group" > $tmp.list 2>/dev/null
1774a9e751fSMao Zhongyi        group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
17809d653e6SPaolo Bonzinis/ .*//p
1794a9e751fSMao Zhongyi}')
18009d653e6SPaolo Bonzini        if [ -z "$group_list" ]
18109d653e6SPaolo Bonzini        then
18209d653e6SPaolo Bonzini            echo "Group \"$r\" is empty or not defined?"
18309d653e6SPaolo Bonzini            exit 1
18409d653e6SPaolo Bonzini        fi
18509d653e6SPaolo Bonzini        numsed=0
18609d653e6SPaolo Bonzini        rm -f $tmp.sed
18709d653e6SPaolo Bonzini        for t in $group_list
18809d653e6SPaolo Bonzini        do
18909d653e6SPaolo Bonzini            if [ $numsed -gt 100 ]
19009d653e6SPaolo Bonzini            then
19109d653e6SPaolo Bonzini                sed -f $tmp.sed <$tmp.list >$tmp.tmp
19209d653e6SPaolo Bonzini                mv $tmp.tmp $tmp.list
19309d653e6SPaolo Bonzini                numsed=0
19409d653e6SPaolo Bonzini                rm -f $tmp.sed
19509d653e6SPaolo Bonzini            fi
19609d653e6SPaolo Bonzini            echo "/^$t\$/d" >>$tmp.sed
1974a9e751fSMao Zhongyi            numsed=$(expr $numsed + 1)
19809d653e6SPaolo Bonzini        done
19909d653e6SPaolo Bonzini        sed -f $tmp.sed <$tmp.list >$tmp.tmp
20009d653e6SPaolo Bonzini        mv $tmp.tmp $tmp.list
20109d653e6SPaolo Bonzini        xgroup=false
20209d653e6SPaolo Bonzini        continue
20309d653e6SPaolo Bonzini
20409d653e6SPaolo Bonzini    elif $imgopts
20509d653e6SPaolo Bonzini    then
20609d653e6SPaolo Bonzini        IMGOPTS="$r"
20709d653e6SPaolo Bonzini        imgopts=false
20809d653e6SPaolo Bonzini        continue
20909d653e6SPaolo Bonzini    elif $cachemode
21009d653e6SPaolo Bonzini    then
21109d653e6SPaolo Bonzini        CACHEMODE="$r"
21209d653e6SPaolo Bonzini        CACHEMODE_IS_DEFAULT=false
21309d653e6SPaolo Bonzini        cachemode=false
21409d653e6SPaolo Bonzini        continue
21509d653e6SPaolo Bonzini    fi
21609d653e6SPaolo Bonzini
21709d653e6SPaolo Bonzini    xpand=true
21809d653e6SPaolo Bonzini    case "$r"
21909d653e6SPaolo Bonzini    in
22009d653e6SPaolo Bonzini
22109d653e6SPaolo Bonzini        -\? | -h | --help)        # usage
22209d653e6SPaolo Bonzini            echo "Usage: $0 [options] [testlist]"'
22309d653e6SPaolo Bonzini
22409d653e6SPaolo Bonzinicommon options
22509d653e6SPaolo Bonzini    -v                  verbose
22609d653e6SPaolo Bonzini    -d                  debug
22709d653e6SPaolo Bonzini
22809d653e6SPaolo Bonziniimage format options
22909d653e6SPaolo Bonzini    -raw                test raw (default)
23009d653e6SPaolo Bonzini    -bochs              test bochs
23109d653e6SPaolo Bonzini    -cloop              test cloop
23209d653e6SPaolo Bonzini    -parallels          test parallels
23309d653e6SPaolo Bonzini    -qcow               test qcow
23409d653e6SPaolo Bonzini    -qcow2              test qcow2
23509d653e6SPaolo Bonzini    -qed                test qed
23609d653e6SPaolo Bonzini    -vdi                test vdi
23709d653e6SPaolo Bonzini    -vpc                test vpc
23809d653e6SPaolo Bonzini    -vhdx               test vhdx
23909d653e6SPaolo Bonzini    -vmdk               test vmdk
24009d653e6SPaolo Bonzini    -luks               test luks
24176f1cf0aSyuchenlin    -dmg                test dmg
24209d653e6SPaolo Bonzini
24309d653e6SPaolo Bonziniimage protocol options
24409d653e6SPaolo Bonzini    -file               test file (default)
24509d653e6SPaolo Bonzini    -rbd                test rbd
24609d653e6SPaolo Bonzini    -sheepdog           test sheepdog
24709d653e6SPaolo Bonzini    -nbd                test nbd
24809d653e6SPaolo Bonzini    -ssh                test ssh
24909d653e6SPaolo Bonzini    -nfs                test nfs
25009d653e6SPaolo Bonzini    -vxhs               test vxhs
25109d653e6SPaolo Bonzini
25209d653e6SPaolo Bonziniother options
25309d653e6SPaolo Bonzini    -xdiff              graphical mode diff
25409d653e6SPaolo Bonzini    -nocache            use O_DIRECT on backing file
25509d653e6SPaolo Bonzini    -misalign           misalign memory allocations
25609d653e6SPaolo Bonzini    -n                  show me, do not run tests
25709d653e6SPaolo Bonzini    -o options          -o options to pass to qemu-img create/convert
25809d653e6SPaolo Bonzini    -T                  output timestamps
25909d653e6SPaolo Bonzini    -c mode             cache mode
26009d653e6SPaolo Bonzini
26109d653e6SPaolo Bonzinitestlist options
26209d653e6SPaolo Bonzini    -g group[,group...]        include tests from these groups
26309d653e6SPaolo Bonzini    -x group[,group...]        exclude tests from these groups
26409d653e6SPaolo Bonzini    NNN                        include test NNN
26509d653e6SPaolo Bonzini    NNN-NNN                    include test range (eg. 012-021)
26609d653e6SPaolo Bonzini'
26709d653e6SPaolo Bonzini            exit 0
26809d653e6SPaolo Bonzini            ;;
26909d653e6SPaolo Bonzini
27009d653e6SPaolo Bonzini        -raw)
27109d653e6SPaolo Bonzini            IMGFMT=raw
27209d653e6SPaolo Bonzini            xpand=false
27309d653e6SPaolo Bonzini            ;;
27409d653e6SPaolo Bonzini
27509d653e6SPaolo Bonzini        -bochs)
27609d653e6SPaolo Bonzini            IMGFMT=bochs
27709d653e6SPaolo Bonzini            IMGFMT_GENERIC=false
27809d653e6SPaolo Bonzini            xpand=false
27909d653e6SPaolo Bonzini            ;;
28009d653e6SPaolo Bonzini
28109d653e6SPaolo Bonzini        -cloop)
28209d653e6SPaolo Bonzini            IMGFMT=cloop
28309d653e6SPaolo Bonzini            IMGFMT_GENERIC=false
28409d653e6SPaolo Bonzini            xpand=false
28509d653e6SPaolo Bonzini            ;;
28609d653e6SPaolo Bonzini
28709d653e6SPaolo Bonzini        -parallels)
28809d653e6SPaolo Bonzini            IMGFMT=parallels
28909d653e6SPaolo Bonzini            xpand=false
29009d653e6SPaolo Bonzini            ;;
29109d653e6SPaolo Bonzini
29209d653e6SPaolo Bonzini        -qcow)
29309d653e6SPaolo Bonzini            IMGFMT=qcow
29409d653e6SPaolo Bonzini            xpand=false
29509d653e6SPaolo Bonzini            ;;
29609d653e6SPaolo Bonzini
29709d653e6SPaolo Bonzini        -qcow2)
29809d653e6SPaolo Bonzini            IMGFMT=qcow2
29909d653e6SPaolo Bonzini            xpand=false
30009d653e6SPaolo Bonzini            ;;
30109d653e6SPaolo Bonzini
30209d653e6SPaolo Bonzini        -luks)
30309d653e6SPaolo Bonzini            IMGOPTSSYNTAX=true
30409d653e6SPaolo Bonzini            IMGFMT=luks
30509d653e6SPaolo Bonzini            IMGKEYSECRET=123456
30609d653e6SPaolo Bonzini            xpand=false
30709d653e6SPaolo Bonzini            ;;
30809d653e6SPaolo Bonzini
30976f1cf0aSyuchenlin        -dmg)
31076f1cf0aSyuchenlin            IMGFMT=dmg
31176f1cf0aSyuchenlin            IMGFMT_GENERIC=false
31276f1cf0aSyuchenlin            xpand=false
31376f1cf0aSyuchenlin            ;;
31476f1cf0aSyuchenlin
31509d653e6SPaolo Bonzini        -qed)
31609d653e6SPaolo Bonzini            IMGFMT=qed
31709d653e6SPaolo Bonzini            xpand=false
31809d653e6SPaolo Bonzini            ;;
31909d653e6SPaolo Bonzini
32009d653e6SPaolo Bonzini        -vdi)
32109d653e6SPaolo Bonzini            IMGFMT=vdi
32209d653e6SPaolo Bonzini            xpand=false
32309d653e6SPaolo Bonzini            ;;
32409d653e6SPaolo Bonzini
32509d653e6SPaolo Bonzini        -vmdk)
32609d653e6SPaolo Bonzini            IMGFMT=vmdk
32709d653e6SPaolo Bonzini            xpand=false
32809d653e6SPaolo Bonzini            ;;
32909d653e6SPaolo Bonzini
33009d653e6SPaolo Bonzini        -vpc)
33109d653e6SPaolo Bonzini            IMGFMT=vpc
33209d653e6SPaolo Bonzini            xpand=false
33309d653e6SPaolo Bonzini            ;;
33409d653e6SPaolo Bonzini
33509d653e6SPaolo Bonzini        -vhdx)
33609d653e6SPaolo Bonzini            IMGFMT=vhdx
33709d653e6SPaolo Bonzini            xpand=false
33809d653e6SPaolo Bonzini            ;;
33909d653e6SPaolo Bonzini
34009d653e6SPaolo Bonzini        -file)
34109d653e6SPaolo Bonzini            IMGPROTO=file
34209d653e6SPaolo Bonzini            xpand=false
34309d653e6SPaolo Bonzini            ;;
34409d653e6SPaolo Bonzini
34509d653e6SPaolo Bonzini        -rbd)
34609d653e6SPaolo Bonzini            IMGPROTO=rbd
34709d653e6SPaolo Bonzini            xpand=false
34809d653e6SPaolo Bonzini            ;;
34909d653e6SPaolo Bonzini
35009d653e6SPaolo Bonzini        -sheepdog)
35109d653e6SPaolo Bonzini            IMGPROTO=sheepdog
35209d653e6SPaolo Bonzini            xpand=false
35309d653e6SPaolo Bonzini            ;;
35409d653e6SPaolo Bonzini
35509d653e6SPaolo Bonzini        -nbd)
35609d653e6SPaolo Bonzini            IMGPROTO=nbd
35709d653e6SPaolo Bonzini            xpand=false
35809d653e6SPaolo Bonzini            ;;
35909d653e6SPaolo Bonzini
36009d653e6SPaolo Bonzini        -vxhs)
36109d653e6SPaolo Bonzini            IMGPROTO=vxhs
36209d653e6SPaolo Bonzini            xpand=false
36309d653e6SPaolo Bonzini            ;;
36409d653e6SPaolo Bonzini
36509d653e6SPaolo Bonzini        -ssh)
36609d653e6SPaolo Bonzini            IMGPROTO=ssh
36709d653e6SPaolo Bonzini            xpand=false
36809d653e6SPaolo Bonzini            ;;
36909d653e6SPaolo Bonzini
37009d653e6SPaolo Bonzini        -nfs)
37109d653e6SPaolo Bonzini            IMGPROTO=nfs
37209d653e6SPaolo Bonzini            xpand=false
37309d653e6SPaolo Bonzini            ;;
37409d653e6SPaolo Bonzini
37509d653e6SPaolo Bonzini        -nocache)
37609d653e6SPaolo Bonzini            CACHEMODE="none"
37709d653e6SPaolo Bonzini            CACHEMODE_IS_DEFAULT=false
37809d653e6SPaolo Bonzini            xpand=false
37909d653e6SPaolo Bonzini            ;;
38009d653e6SPaolo Bonzini
38109d653e6SPaolo Bonzini        -misalign)
38209d653e6SPaolo Bonzini            QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --misalign"
38309d653e6SPaolo Bonzini            xpand=false
38409d653e6SPaolo Bonzini            ;;
38509d653e6SPaolo Bonzini
38609d653e6SPaolo Bonzini        -valgrind)
38709d653e6SPaolo Bonzini            VALGRIND_QEMU='y'
38809d653e6SPaolo Bonzini            xpand=false
38909d653e6SPaolo Bonzini            ;;
39009d653e6SPaolo Bonzini
39109d653e6SPaolo Bonzini        -g)        # -g group ... pick from group file
39209d653e6SPaolo Bonzini            group=true
39309d653e6SPaolo Bonzini            xpand=false
39409d653e6SPaolo Bonzini            ;;
39509d653e6SPaolo Bonzini
39609d653e6SPaolo Bonzini        -xdiff)        # graphical diff mode
39709d653e6SPaolo Bonzini            xpand=false
39809d653e6SPaolo Bonzini
39909d653e6SPaolo Bonzini            if [ ! -z "$DISPLAY" ]
40009d653e6SPaolo Bonzini            then
40109d653e6SPaolo Bonzini                command -v xdiff >/dev/null 2>&1 && diff=xdiff
40209d653e6SPaolo Bonzini                command -v gdiff >/dev/null 2>&1 && diff=gdiff
40309d653e6SPaolo Bonzini                command -v tkdiff >/dev/null 2>&1 && diff=tkdiff
40409d653e6SPaolo Bonzini                command -v xxdiff >/dev/null 2>&1 && diff=xxdiff
40509d653e6SPaolo Bonzini            fi
40609d653e6SPaolo Bonzini            ;;
40709d653e6SPaolo Bonzini
40809d653e6SPaolo Bonzini        -n)        # show me, don't do it
40909d653e6SPaolo Bonzini            showme=true
41009d653e6SPaolo Bonzini            xpand=false
41109d653e6SPaolo Bonzini            ;;
41209d653e6SPaolo Bonzini        -o)
41309d653e6SPaolo Bonzini            imgopts=true
41409d653e6SPaolo Bonzini            xpand=false
41509d653e6SPaolo Bonzini            ;;
41609d653e6SPaolo Bonzini        -c)
41709d653e6SPaolo Bonzini            cachemode=true
41809d653e6SPaolo Bonzini            xpand=false
41909d653e6SPaolo Bonzini            ;;
42009d653e6SPaolo Bonzini        -T)        # turn on timestamp output
42109d653e6SPaolo Bonzini            timestamp=true
42209d653e6SPaolo Bonzini            xpand=false
42309d653e6SPaolo Bonzini            ;;
42409d653e6SPaolo Bonzini
42509d653e6SPaolo Bonzini        -v)
42609d653e6SPaolo Bonzini            verbose=true
42709d653e6SPaolo Bonzini            xpand=false
42809d653e6SPaolo Bonzini            ;;
42909d653e6SPaolo Bonzini        -d)
43009d653e6SPaolo Bonzini            debug=true
43109d653e6SPaolo Bonzini            xpand=false
43209d653e6SPaolo Bonzini            ;;
43309d653e6SPaolo Bonzini        -x)        # -x group ... exclude from group file
43409d653e6SPaolo Bonzini            xgroup=true
43509d653e6SPaolo Bonzini            xpand=false
43609d653e6SPaolo Bonzini            ;;
43709d653e6SPaolo Bonzini        '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
43809d653e6SPaolo Bonzini            echo "No tests?"
43909d653e6SPaolo Bonzini            status=1
44009d653e6SPaolo Bonzini            exit $status
44109d653e6SPaolo Bonzini            ;;
44209d653e6SPaolo Bonzini
44309d653e6SPaolo Bonzini        [0-9]*-[0-9]*)
4444a9e751fSMao Zhongyi            eval $(echo $r | sed -e 's/^/start=/' -e 's/-/ end=/')
44509d653e6SPaolo Bonzini            ;;
44609d653e6SPaolo Bonzini
44709d653e6SPaolo Bonzini        [0-9]*-)
4484a9e751fSMao Zhongyi            eval $(echo $r | sed -e 's/^/start=/' -e 's/-//')
4494a9e751fSMao 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/.* //')
45009d653e6SPaolo Bonzini            if [ -z "$end" ]
45109d653e6SPaolo Bonzini            then
45209d653e6SPaolo Bonzini                echo "No tests in range \"$r\"?"
45309d653e6SPaolo Bonzini                status=1
45409d653e6SPaolo Bonzini                exit $status
45509d653e6SPaolo Bonzini            fi
45609d653e6SPaolo Bonzini            ;;
45709d653e6SPaolo Bonzini
45809d653e6SPaolo Bonzini        *)
45909d653e6SPaolo Bonzini            start=$r
46009d653e6SPaolo Bonzini            end=$r
46109d653e6SPaolo Bonzini            ;;
46209d653e6SPaolo Bonzini
46309d653e6SPaolo Bonzini    esac
46409d653e6SPaolo Bonzini
46509d653e6SPaolo Bonzini    # get rid of leading 0s as can be interpreted as octal
4664a9e751fSMao Zhongyi    start=$(echo $start | sed 's/^0*//')
4674a9e751fSMao Zhongyi    end=$(echo $end | sed 's/^0*//')
46809d653e6SPaolo Bonzini
46909d653e6SPaolo Bonzini    if $xpand
47009d653e6SPaolo Bonzini    then
47109d653e6SPaolo Bonzini        have_test_arg=true
47209d653e6SPaolo Bonzini        awk </dev/null '
47309d653e6SPaolo BonziniBEGIN        { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
47409d653e6SPaolo Bonzini        | while read id
47509d653e6SPaolo Bonzini        do
47609d653e6SPaolo Bonzini            if grep -s "^$id " "$source_iotests/group" >/dev/null
47709d653e6SPaolo Bonzini            then
47809d653e6SPaolo Bonzini                # in group file ... OK
47909d653e6SPaolo Bonzini                echo $id >>$tmp.list
48009d653e6SPaolo Bonzini            else
48109d653e6SPaolo Bonzini                if [ -f expunged ] && $expunge && egrep "^$id([         ]|\$)" expunged >/dev/null
48209d653e6SPaolo Bonzini                then
48309d653e6SPaolo Bonzini                    # expunged ... will be reported, but not run, later
48409d653e6SPaolo Bonzini                    echo $id >>$tmp.list
48509d653e6SPaolo Bonzini                else
48609d653e6SPaolo Bonzini                    # oops
48709d653e6SPaolo Bonzini                    if [ "$start" == "$end" -a "$id" == "$end" ]
48809d653e6SPaolo Bonzini                    then
48909d653e6SPaolo Bonzini                        echo "$id - unknown test"
49009d653e6SPaolo Bonzini                        exit 1
49109d653e6SPaolo Bonzini                    else
49209d653e6SPaolo Bonzini                        echo "$id - unknown test, ignored"
49309d653e6SPaolo Bonzini                    fi
49409d653e6SPaolo Bonzini                fi
49509d653e6SPaolo Bonzini            fi
49609d653e6SPaolo Bonzini        done || exit 1
49709d653e6SPaolo Bonzini    fi
49809d653e6SPaolo Bonzini
49909d653e6SPaolo Bonzinidone
50009d653e6SPaolo Bonzini
50109d653e6SPaolo Bonzini# Set qemu-io cache mode with $CACHEMODE we have
50209d653e6SPaolo BonziniQEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --cache $CACHEMODE"
50309d653e6SPaolo Bonzini
50409d653e6SPaolo BonziniQEMU_IO_OPTIONS_NO_FMT="$QEMU_IO_OPTIONS"
50509d653e6SPaolo Bonziniif [ "$IMGOPTSSYNTAX" != "true" ]; then
50609d653e6SPaolo Bonzini    QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS -f $IMGFMT"
50709d653e6SPaolo Bonzinifi
50809d653e6SPaolo Bonzini
50909d653e6SPaolo Bonzini# Set default options for qemu-img create -o if they were not specified
51009d653e6SPaolo Bonziniif [ "$IMGFMT" == "qcow2" ] && ! (echo "$IMGOPTS" | grep "compat=" > /dev/null); then
51109d653e6SPaolo Bonzini    IMGOPTS=$(_optstr_add "$IMGOPTS" "compat=1.1")
51209d653e6SPaolo Bonzinifi
51309d653e6SPaolo Bonziniif [ "$IMGFMT" == "luks" ] && ! (echo "$IMGOPTS" | grep "iter-time=" > /dev/null); then
51409d653e6SPaolo Bonzini    IMGOPTS=$(_optstr_add "$IMGOPTS" "iter-time=10")
51509d653e6SPaolo Bonzinifi
51609d653e6SPaolo Bonzini
51709d653e6SPaolo Bonziniif [ -z "$SAMPLE_IMG_DIR" ]; then
51809d653e6SPaolo Bonzini        SAMPLE_IMG_DIR="$source_iotests/sample_images"
51909d653e6SPaolo Bonzinifi
52009d653e6SPaolo Bonzini
52109d653e6SPaolo Bonziniexport TEST_DIR
52209d653e6SPaolo Bonziniexport SAMPLE_IMG_DIR
52309d653e6SPaolo Bonzini
52409d653e6SPaolo Bonziniif [ -s $tmp.list ]
52509d653e6SPaolo Bonzinithen
52609d653e6SPaolo Bonzini    # found some valid test numbers ... this is good
52709d653e6SPaolo Bonzini    :
52809d653e6SPaolo Bonzinielse
52909d653e6SPaolo Bonzini    if $have_test_arg
53009d653e6SPaolo Bonzini    then
53109d653e6SPaolo Bonzini        # had test numbers, but none in group file ... do nothing
53209d653e6SPaolo Bonzini        touch $tmp.list
53309d653e6SPaolo Bonzini    else
53409d653e6SPaolo Bonzini        # no test numbers, do everything from group file
53509d653e6SPaolo Bonzini        sed -n -e '/^[0-9][0-9][0-9]*/s/[         ].*//p' <"$source_iotests/group" >$tmp.list
53609d653e6SPaolo Bonzini    fi
53709d653e6SPaolo Bonzinifi
53809d653e6SPaolo Bonzini
53909d653e6SPaolo Bonzini# should be sort -n, but this did not work for Linux when this
54009d653e6SPaolo Bonzini# was ported from IRIX
54109d653e6SPaolo Bonzini#
5424a9e751fSMao Zhongyilist=$(sort $tmp.list)
54309d653e6SPaolo Bonzinirm -f $tmp.list $tmp.tmp $tmp.sed
54409d653e6SPaolo Bonzini
54509d653e6SPaolo Bonziniif [ -z "$QEMU_PROG" ]
54609d653e6SPaolo Bonzinithen
54709d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu" ]; then
54809d653e6SPaolo Bonzini        export QEMU_PROG="$build_iotests/qemu"
54996914159SLukáš Doktor    elif [ -x "$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}" ]; then
55096914159SLukáš Doktor        export QEMU_PROG="$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}"
55109d653e6SPaolo Bonzini    else
55209d653e6SPaolo Bonzini        pushd "$build_root" > /dev/null
55309d653e6SPaolo Bonzini        for binary in *-softmmu/qemu-system-*
55409d653e6SPaolo Bonzini        do
55509d653e6SPaolo Bonzini            if [ -x "$binary" ]
55609d653e6SPaolo Bonzini            then
55709d653e6SPaolo Bonzini                export QEMU_PROG="$build_root/$binary"
55809d653e6SPaolo Bonzini                break
55909d653e6SPaolo Bonzini            fi
56009d653e6SPaolo Bonzini        done
56109d653e6SPaolo Bonzini        popd > /dev/null
56209d653e6SPaolo Bonzini        [ "$QEMU_PROG" = "" ] && _init_error "qemu not found"
56309d653e6SPaolo Bonzini    fi
56409d653e6SPaolo Bonzinifi
56563ca8406SEric Blakeexport QEMU_PROG="$(type -p "$QEMU_PROG")"
56609d653e6SPaolo Bonzini
56709d653e6SPaolo Bonziniif [ -z "$QEMU_IMG_PROG" ]; then
56809d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-img" ]; then
56909d653e6SPaolo Bonzini        export QEMU_IMG_PROG="$build_iotests/qemu-img"
57009d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-img" ]; then
57109d653e6SPaolo Bonzini        export QEMU_IMG_PROG="$build_root/qemu-img"
57209d653e6SPaolo Bonzini    else
57309d653e6SPaolo Bonzini        _init_error "qemu-img not found"
57409d653e6SPaolo Bonzini    fi
57509d653e6SPaolo Bonzinifi
57663ca8406SEric Blakeexport QEMU_IMG_PROG="$(type -p "$QEMU_IMG_PROG")"
57709d653e6SPaolo Bonzini
57809d653e6SPaolo Bonziniif [ -z "$QEMU_IO_PROG" ]; then
57909d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-io" ]; then
58009d653e6SPaolo Bonzini        export QEMU_IO_PROG="$build_iotests/qemu-io"
58109d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-io" ]; then
58209d653e6SPaolo Bonzini        export QEMU_IO_PROG="$build_root/qemu-io"
58309d653e6SPaolo Bonzini    else
58409d653e6SPaolo Bonzini        _init_error "qemu-io not found"
58509d653e6SPaolo Bonzini    fi
58609d653e6SPaolo Bonzinifi
58763ca8406SEric Blakeexport QEMU_IO_PROG="$(type -p "$QEMU_IO_PROG")"
58809d653e6SPaolo Bonzini
58909d653e6SPaolo Bonziniif [ -z $QEMU_NBD_PROG ]; then
59009d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-nbd" ]; then
59109d653e6SPaolo Bonzini        export QEMU_NBD_PROG="$build_iotests/qemu-nbd"
59209d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-nbd" ]; then
59309d653e6SPaolo Bonzini        export QEMU_NBD_PROG="$build_root/qemu-nbd"
59409d653e6SPaolo Bonzini    else
59509d653e6SPaolo Bonzini        _init_error "qemu-nbd not found"
59609d653e6SPaolo Bonzini    fi
59709d653e6SPaolo Bonzinifi
59863ca8406SEric Blakeexport QEMU_NBD_PROG="$(type -p "$QEMU_NBD_PROG")"
59909d653e6SPaolo Bonzini
60009d653e6SPaolo Bonziniif [ -z "$QEMU_VXHS_PROG" ]; then
6014a9e751fSMao Zhongyi    export QEMU_VXHS_PROG="$(set_prog_path qnio_server)"
60209d653e6SPaolo Bonzinifi
60309d653e6SPaolo Bonzini
60409d653e6SPaolo Bonziniif [ -x "$build_iotests/socket_scm_helper" ]
60509d653e6SPaolo Bonzinithen
60609d653e6SPaolo Bonzini    export SOCKET_SCM_HELPER="$build_iotests/socket_scm_helper"
60709d653e6SPaolo Bonzinifi
60809d653e6SPaolo Bonzini
60909d653e6SPaolo Bonzinidefault_machine=$($QEMU_PROG -machine help | sed -n '/(default)/ s/ .*//p')
61009d653e6SPaolo Bonzinidefault_alias_machine=$($QEMU_PROG -machine help | \
61109d653e6SPaolo Bonzini   sed -n "/(alias of $default_machine)/ { s/ .*//p; q; }")
61209d653e6SPaolo Bonziniif [[ "$default_alias_machine" ]]; then
61309d653e6SPaolo Bonzini    default_machine="$default_alias_machine"
61409d653e6SPaolo Bonzinifi
61509d653e6SPaolo Bonzini
61609d653e6SPaolo Bonziniexport QEMU_DEFAULT_MACHINE="$default_machine"
61789004368SKevin Wolf
61836bd4228SDaniel P. BerrangeTIMESTAMP_FILE=check.time-$IMGPROTO-$IMGFMT
61936bd4228SDaniel P. Berrange
6206bf19c94SChristoph Hellwig_wallclock()
6216bf19c94SChristoph Hellwig{
6229ee4b6f8SPaolo Bonzini    date "+%H %M %S" | awk '{ print $1*3600 + $2*60 + $3 }'
6236bf19c94SChristoph Hellwig}
6246bf19c94SChristoph Hellwig
6256bf19c94SChristoph Hellwig_timestamp()
6266bf19c94SChristoph Hellwig{
6274a9e751fSMao Zhongyi    now=$(date "+%T")
628b43671f8SEric Blake    printf %s " [$now]"
6296bf19c94SChristoph Hellwig}
6306bf19c94SChristoph Hellwig
6316bf19c94SChristoph Hellwig_wrapup()
6326bf19c94SChristoph Hellwig{
6336bf19c94SChristoph Hellwig    if $showme
6346bf19c94SChristoph Hellwig    then
6356bf19c94SChristoph Hellwig        :
6366bf19c94SChristoph Hellwig    elif $needwrap
6376bf19c94SChristoph Hellwig    then
63836bd4228SDaniel P. Berrange        if [ -f $TIMESTAMP_FILE -a -f $tmp.time ]
6396bf19c94SChristoph Hellwig        then
64036bd4228SDaniel P. Berrange            cat $TIMESTAMP_FILE $tmp.time \
6419ee4b6f8SPaolo Bonzini            | awk '
6426bf19c94SChristoph Hellwig        { t[$1] = $2 }
6436bf19c94SChristoph HellwigEND        { if (NR > 0) {
6446bf19c94SChristoph Hellwig            for (i in t) print i " " t[i]
6456bf19c94SChristoph Hellwig          }
6466bf19c94SChristoph Hellwig        }' \
6476bf19c94SChristoph Hellwig            | sort -n >$tmp.out
64836bd4228SDaniel P. Berrange            mv $tmp.out $TIMESTAMP_FILE
6496bf19c94SChristoph Hellwig        fi
6506bf19c94SChristoph Hellwig
6516bf19c94SChristoph Hellwig        if [ -f $tmp.expunged ]
6526bf19c94SChristoph Hellwig        then
6534a9e751fSMao Zhongyi            notrun=$(wc -l <$tmp.expunged | sed -e 's/  *//g')
6544a9e751fSMao Zhongyi            try=$(expr $try - $notrun)
6554a9e751fSMao Zhongyi            list=$(echo "$list" | sed -f $tmp.expunged)
6566bf19c94SChristoph Hellwig        fi
6576bf19c94SChristoph Hellwig
6586bf19c94SChristoph Hellwig        echo "" >>check.log
6596bf19c94SChristoph Hellwig        date >>check.log
6606bf19c94SChristoph Hellwig        echo $list | fmt | sed -e 's/^/    /' >>check.log
6616bf19c94SChristoph Hellwig        $interrupt && echo "Interrupted!" >>check.log
6626bf19c94SChristoph Hellwig
6636bf19c94SChristoph Hellwig        if [ ! -z "$notrun" ]
6646bf19c94SChristoph Hellwig        then
6656bf19c94SChristoph Hellwig            echo "Not run:$notrun"
6666bf19c94SChristoph Hellwig            echo "Not run:$notrun" >>check.log
6676bf19c94SChristoph Hellwig        fi
66857ed557fSAndrey Shinkevich        if [ ! -z "$casenotrun" ]
66957ed557fSAndrey Shinkevich        then
67057ed557fSAndrey Shinkevich            echo "Some cases not run in:$casenotrun"
67157ed557fSAndrey Shinkevich            echo "Some cases not run in:$casenotrun" >>check.log
67257ed557fSAndrey Shinkevich        fi
6736bf19c94SChristoph Hellwig        if [ ! -z "$n_bad" -a $n_bad != 0 ]
6746bf19c94SChristoph Hellwig        then
6756bf19c94SChristoph Hellwig            echo "Failures:$bad"
6766bf19c94SChristoph Hellwig            echo "Failed $n_bad of $try tests"
6776bf19c94SChristoph Hellwig            echo "Failures:$bad" | fmt >>check.log
6786bf19c94SChristoph Hellwig            echo "Failed $n_bad of $try tests" >>check.log
6796bf19c94SChristoph Hellwig        else
6806bf19c94SChristoph Hellwig            echo "Passed all $try tests"
6816bf19c94SChristoph Hellwig            echo "Passed all $try tests" >>check.log
6826bf19c94SChristoph Hellwig        fi
6836bf19c94SChristoph Hellwig        needwrap=false
6846bf19c94SChristoph Hellwig    fi
6856bf19c94SChristoph Hellwig
6868803714bSEric Blake    if test -n "$STTY_RESTORE"; then
6878803714bSEric Blake        stty $STTY_RESTORE
6888803714bSEric Blake    fi
6890145b4e1SSascha Silbe    rm -f "${TEST_DIR}"/*.out "${TEST_DIR}"/*.err "${TEST_DIR}"/*.time
6900145b4e1SSascha Silbe    rm -f "${TEST_DIR}"/check.pid "${TEST_DIR}"/check.sts
6916bf19c94SChristoph Hellwig    rm -f $tmp.*
6926bf19c94SChristoph Hellwig}
6936bf19c94SChristoph Hellwig
6946bf19c94SChristoph Hellwigtrap "_wrapup; exit \$status" 0 1 2 3 15
6956bf19c94SChristoph Hellwig
69636bd4228SDaniel P. Berrange[ -f $TIMESTAMP_FILE ] || touch $TIMESTAMP_FILE
6976bf19c94SChristoph Hellwig
6984a9e751fSMao ZhongyiFULL_IMGFMT_DETAILS=$(_full_imgfmt_details)
6994a9e751fSMao ZhongyiFULL_HOST_DETAILS=$(_full_platform_details)
7006bf19c94SChristoph Hellwig
7016bf19c94SChristoph Hellwigcat <<EOF
702934659c4SMax ReitzQEMU          -- "$QEMU_PROG" $QEMU_OPTIONS
703934659c4SMax ReitzQEMU_IMG      -- "$QEMU_IMG_PROG" $QEMU_IMG_OPTIONS
704934659c4SMax ReitzQEMU_IO       -- "$QEMU_IO_PROG" $QEMU_IO_OPTIONS
705934659c4SMax ReitzQEMU_NBD      -- "$QEMU_NBD_PROG" $QEMU_NBD_OPTIONS
7066bf19c94SChristoph HellwigIMGFMT        -- $FULL_IMGFMT_DETAILS
707657c572aSCleber RosaIMGPROTO      -- $IMGPROTO
7086bf19c94SChristoph HellwigPLATFORM      -- $FULL_HOST_DETAILS
709b8aff7d6SFam ZhengTEST_DIR      -- $TEST_DIR
71030b005d9SWenchao XiaSOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER
7116bf19c94SChristoph Hellwig
7126bf19c94SChristoph HellwigEOF
7136bf19c94SChristoph Hellwig
7146bf19c94SChristoph Hellwigseq="check"
7156bf19c94SChristoph Hellwig
7166bf19c94SChristoph Hellwig[ -n "$TESTS_REMAINING_LOG" ] && echo $list > $TESTS_REMAINING_LOG
7176bf19c94SChristoph Hellwig
7186bf19c94SChristoph Hellwigfor seq in $list
7196bf19c94SChristoph Hellwigdo
7206bf19c94SChristoph Hellwig    err=false
721b43671f8SEric Blake    printf %s "$seq"
7226bf19c94SChristoph Hellwig    if [ -n "$TESTS_REMAINING_LOG" ] ; then
7236bf19c94SChristoph Hellwig        sed -e "s/$seq//" -e 's/  / /' -e 's/^ *//' $TESTS_REMAINING_LOG > $TESTS_REMAINING_LOG.tmp
7246bf19c94SChristoph Hellwig        mv $TESTS_REMAINING_LOG.tmp $TESTS_REMAINING_LOG
7256bf19c94SChristoph Hellwig        sync
7266bf19c94SChristoph Hellwig    fi
7276bf19c94SChristoph Hellwig
7286bf19c94SChristoph Hellwig    if $showme
7296bf19c94SChristoph Hellwig    then
7306bf19c94SChristoph Hellwig        echo
7316bf19c94SChristoph Hellwig        continue
7326bf19c94SChristoph Hellwig    elif [ -f expunged ] && $expunge && egrep "^$seq([         ]|\$)" expunged >/dev/null
7336bf19c94SChristoph Hellwig    then
7346bf19c94SChristoph Hellwig        echo " - expunged"
7356bf19c94SChristoph Hellwig        rm -f $seq.out.bad
7366bf19c94SChristoph Hellwig        echo "/^$seq\$/d" >>$tmp.expunged
737e8f8624dSMax Reitz    elif [ ! -f "$source_iotests/$seq" ]
7386bf19c94SChristoph Hellwig    then
7396bf19c94SChristoph Hellwig        echo " - no such test?"
7406bf19c94SChristoph Hellwig        echo "/^$seq\$/d" >>$tmp.expunged
7416bf19c94SChristoph Hellwig    else
7426bf19c94SChristoph Hellwig        # really going to try and run this one
7436bf19c94SChristoph Hellwig        #
7446bf19c94SChristoph Hellwig        rm -f $seq.out.bad
7454a9e751fSMao Zhongyi        lasttime=$(sed -n -e "/^$seq /s/.* //p" <$TIMESTAMP_FILE)
7466bf19c94SChristoph Hellwig        if [ "X$lasttime" != X ]; then
747b43671f8SEric Blake                printf %s " ${lasttime}s ..."
7486bf19c94SChristoph Hellwig        else
749b43671f8SEric Blake                printf "        "        # prettier output with timestamps.
7506bf19c94SChristoph Hellwig        fi
7516bf19c94SChristoph Hellwig        rm -f core $seq.notrun
75257ed557fSAndrey Shinkevich        rm -f $seq.casenotrun
7536bf19c94SChristoph Hellwig
7544a9e751fSMao Zhongyi        start=$(_wallclock)
755b43671f8SEric Blake        $timestamp && printf %s "        [$(date "+%T")]"
756ea81ca9dSMax Reitz
757ea81ca9dSMax Reitz        if [ "$(head -n 1 "$source_iotests/$seq")" == "#!/usr/bin/env python" ]; then
758ea81ca9dSMax Reitz            run_command="$PYTHON $seq"
759ea81ca9dSMax Reitz        else
760ea81ca9dSMax Reitz            run_command="./$seq"
761ea81ca9dSMax Reitz        fi
762e8f8624dSMax Reitz        export OUTPUT_DIR=$PWD
763aa4f592aSFam Zheng        if $debug; then
764aa4f592aSFam Zheng            (cd "$source_iotests";
765aa4f592aSFam Zheng            MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
766aa4f592aSFam Zheng                    $run_command -d 2>&1 | tee $tmp.out)
767aa4f592aSFam Zheng        else
768e8f8624dSMax Reitz            (cd "$source_iotests";
76904129606SStefan Hajnoczi            MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
770ea81ca9dSMax Reitz                    $run_command >$tmp.out 2>&1)
771aa4f592aSFam Zheng        fi
7726bf19c94SChristoph Hellwig        sts=$?
7736bf19c94SChristoph Hellwig        $timestamp && _timestamp
7744a9e751fSMao Zhongyi        stop=$(_wallclock)
7756bf19c94SChristoph Hellwig
7766bf19c94SChristoph Hellwig        if [ -f core ]
7776bf19c94SChristoph Hellwig        then
778b43671f8SEric Blake            printf " [dumped core]"
7796bf19c94SChristoph Hellwig            mv core $seq.core
7806bf19c94SChristoph Hellwig            err=true
7816bf19c94SChristoph Hellwig        fi
7826bf19c94SChristoph Hellwig
7836bf19c94SChristoph Hellwig        if [ -f $seq.notrun ]
7846bf19c94SChristoph Hellwig        then
785b43671f8SEric Blake            $timestamp || printf " [not run] "
786b43671f8SEric Blake            $timestamp && echo " [not run]" && printf %s "        $seq -- "
7876bf19c94SChristoph Hellwig            cat $seq.notrun
7886bf19c94SChristoph Hellwig            notrun="$notrun $seq"
7896bf19c94SChristoph Hellwig        else
7906bf19c94SChristoph Hellwig            if [ $sts -ne 0 ]
7916bf19c94SChristoph Hellwig            then
792b43671f8SEric Blake                printf %s " [failed, exit status $sts]"
7936bf19c94SChristoph Hellwig                err=true
7946bf19c94SChristoph Hellwig            fi
7958f94b077SKevin Wolf
796e8f8624dSMax Reitz            reference="$source_iotests/$seq.out"
797e166b414SBo Tu            reference_machine="$source_iotests/$seq.$QEMU_DEFAULT_MACHINE.out"
798e166b414SBo Tu            if [ -f "$reference_machine" ]; then
799e166b414SBo Tu                reference="$reference_machine"
800e166b414SBo Tu            fi
801e166b414SBo Tu
802217a0683SStefan Hajnoczi            reference_format="$source_iotests/$seq.out.$IMGFMT"
803217a0683SStefan Hajnoczi            if [ -f "$reference_format" ]; then
804217a0683SStefan Hajnoczi                reference="$reference_format"
805217a0683SStefan Hajnoczi            fi
806217a0683SStefan Hajnoczi
8073baa8449SFam Zheng            if [ "$CACHEMODE" = "none" ]; then
808e8f8624dSMax Reitz                [ -f "$source_iotests/$seq.out.nocache" ] && reference="$source_iotests/$seq.out.nocache"
8098f94b077SKevin Wolf            fi
8108f94b077SKevin Wolf
811e8f8624dSMax Reitz            if [ ! -f "$reference" ]
8126bf19c94SChristoph Hellwig            then
8136bf19c94SChristoph Hellwig                echo " - no qualified output"
8146bf19c94SChristoph Hellwig                err=true
8156bf19c94SChristoph Hellwig            else
816e8f8624dSMax Reitz                if diff -w "$reference" $tmp.out >/dev/null 2>&1
8176bf19c94SChristoph Hellwig                then
8186bf19c94SChristoph Hellwig                    echo ""
8196bf19c94SChristoph Hellwig                    if $err
8206bf19c94SChristoph Hellwig                    then
8216bf19c94SChristoph Hellwig                        :
8226bf19c94SChristoph Hellwig                    else
8234a9e751fSMao Zhongyi                        echo "$seq $(expr $stop - $start)" >>$tmp.time
8246bf19c94SChristoph Hellwig                    fi
8256bf19c94SChristoph Hellwig                else
8266bf19c94SChristoph Hellwig                    echo " - output mismatch (see $seq.out.bad)"
8276bf19c94SChristoph Hellwig                    mv $tmp.out $seq.out.bad
82863ca8406SEric Blake                    $diff -w "$reference" "$PWD"/$seq.out.bad
8296bf19c94SChristoph Hellwig                    err=true
8306bf19c94SChristoph Hellwig                fi
8316bf19c94SChristoph Hellwig            fi
8326bf19c94SChristoph Hellwig        fi
83357ed557fSAndrey Shinkevich        if [ -f $seq.casenotrun ]
83457ed557fSAndrey Shinkevich        then
83557ed557fSAndrey Shinkevich            cat $seq.casenotrun
83657ed557fSAndrey Shinkevich            casenotrun="$casenotrun $seq"
83757ed557fSAndrey Shinkevich        fi
8386bf19c94SChristoph Hellwig    fi
8396bf19c94SChristoph Hellwig
8406bf19c94SChristoph Hellwig    # come here for each test, except when $showme is true
8416bf19c94SChristoph Hellwig    #
8426bf19c94SChristoph Hellwig    if $err
8436bf19c94SChristoph Hellwig    then
8446bf19c94SChristoph Hellwig        bad="$bad $seq"
8454a9e751fSMao Zhongyi        n_bad=$(expr $n_bad + 1)
8466bf19c94SChristoph Hellwig        quick=false
8476bf19c94SChristoph Hellwig    fi
8484a9e751fSMao Zhongyi    [ -f $seq.notrun ] || try=$(expr $try + 1)
8496bf19c94SChristoph Hellwig
8506bf19c94SChristoph Hellwig    seq="after_$seq"
8516bf19c94SChristoph Hellwigdone
8526bf19c94SChristoph Hellwig
8536bf19c94SChristoph Hellwiginterrupt=false
8544a9e751fSMao Zhongyistatus=$(expr $n_bad)
8556bf19c94SChristoph Hellwigexit
856