xref: /openbmc/qemu/tests/qemu-iotests/check (revision 70ff5b07fcdd378180ad2d5cc0b0d5e67e7ef325)
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
30*70ff5b07SAlex Bennéemakecheck=false
316bf19c94SChristoph Hellwig
32e8f8624dSMax Reitz_init_error()
33e8f8624dSMax Reitz{
344e670492SPaolo Bonzini    echo "check: $1" >&2
356bf19c94SChristoph Hellwig    exit 1
36e8f8624dSMax Reitz}
37e8f8624dSMax Reitz
38e8f8624dSMax Reitzif [ -L "$0" ]
39e8f8624dSMax Reitzthen
40e8f8624dSMax Reitz    # called from the build tree
41e8f8624dSMax Reitz    source_iotests=$(dirname "$(readlink "$0")")
42e8f8624dSMax Reitz    if [ -z "$source_iotests" ]
43e8f8624dSMax Reitz    then
44e8f8624dSMax Reitz        _init_error "failed to obtain source tree name from check symlink"
45e8f8624dSMax Reitz    fi
46e8f8624dSMax Reitz    source_iotests=$(cd "$source_iotests"; pwd) || _init_error "failed to enter source tree"
47e8f8624dSMax Reitz    build_iotests=$PWD
48e8f8624dSMax Reitzelse
49e8f8624dSMax Reitz    # called from the source tree
50e8f8624dSMax Reitz    source_iotests=$PWD
51e8f8624dSMax Reitz    # this may be an in-tree build (note that in the following code we may not
52e8f8624dSMax Reitz    # assume that it truly is and have to test whether the build results
53e8f8624dSMax Reitz    # actually exist)
54e8f8624dSMax Reitz    build_iotests=$PWD
55e8f8624dSMax Reitzfi
56e8f8624dSMax Reitz
57e8f8624dSMax Reitzbuild_root="$build_iotests/../.."
58e8f8624dSMax Reitz
597fed1a49SMax Reitz# we need common.env
607fed1a49SMax Reitzif ! . "$build_iotests/common.env"
617fed1a49SMax Reitzthen
627fed1a49SMax Reitz    _init_error "failed to source common.env (make sure the qemu-iotests are run from tests/qemu-iotests in the build tree)"
637fed1a49SMax Reitzfi
647fed1a49SMax Reitz
65e8f8624dSMax Reitz# we need common.config
66e8f8624dSMax Reitzif ! . "$source_iotests/common.config"
67e8f8624dSMax Reitzthen
68e8f8624dSMax Reitz    _init_error "failed to source common.config"
696bf19c94SChristoph Hellwigfi
706bf19c94SChristoph Hellwig
7109d653e6SPaolo Bonzini_full_imgfmt_details()
7209d653e6SPaolo Bonzini{
7309d653e6SPaolo Bonzini    if [ -n "$IMGOPTS" ]; then
7409d653e6SPaolo Bonzini        echo "$IMGFMT ($IMGOPTS)"
7509d653e6SPaolo Bonzini    else
7609d653e6SPaolo Bonzini        echo "$IMGFMT"
7709d653e6SPaolo Bonzini    fi
7809d653e6SPaolo Bonzini}
7909d653e6SPaolo Bonzini
8009d653e6SPaolo Bonzini_full_platform_details()
8109d653e6SPaolo Bonzini{
824a9e751fSMao Zhongyi    os=$(uname -s)
834a9e751fSMao Zhongyi    host=$(hostname -s)
844a9e751fSMao Zhongyi    kernel=$(uname -r)
854a9e751fSMao Zhongyi    platform=$(uname -m)
8609d653e6SPaolo Bonzini    echo "$os/$platform $host $kernel"
8709d653e6SPaolo Bonzini}
8809d653e6SPaolo Bonzini
89*70ff5b07SAlex Bennée_full_env_details()
90*70ff5b07SAlex Bennée{
91*70ff5b07SAlex Bennée    cat <<EOF
92*70ff5b07SAlex BennéeQEMU          -- "$QEMU_PROG" $QEMU_OPTIONS
93*70ff5b07SAlex BennéeQEMU_IMG      -- "$QEMU_IMG_PROG" $QEMU_IMG_OPTIONS
94*70ff5b07SAlex BennéeQEMU_IO       -- "$QEMU_IO_PROG" $QEMU_IO_OPTIONS
95*70ff5b07SAlex BennéeQEMU_NBD      -- "$QEMU_NBD_PROG" $QEMU_NBD_OPTIONS
96*70ff5b07SAlex BennéeIMGFMT        -- $FULL_IMGFMT_DETAILS
97*70ff5b07SAlex BennéeIMGPROTO      -- $IMGPROTO
98*70ff5b07SAlex BennéePLATFORM      -- $FULL_HOST_DETAILS
99*70ff5b07SAlex BennéeTEST_DIR      -- $TEST_DIR
100*70ff5b07SAlex BennéeSOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER
101*70ff5b07SAlex Bennée
102*70ff5b07SAlex BennéeEOF
103*70ff5b07SAlex Bennée}
104*70ff5b07SAlex Bennée
10509d653e6SPaolo Bonzini# $1 = prog to look for
10609d653e6SPaolo Bonziniset_prog_path()
10709d653e6SPaolo Bonzini{
1084a9e751fSMao Zhongyi    p=$(command -v $1 2> /dev/null)
10909d653e6SPaolo Bonzini    if [ -n "$p" -a -x "$p" ]; then
11063ca8406SEric Blake        type -p "$p"
11109d653e6SPaolo Bonzini    else
11209d653e6SPaolo Bonzini        return 1
11309d653e6SPaolo Bonzini    fi
11409d653e6SPaolo Bonzini}
11509d653e6SPaolo Bonzini
11609d653e6SPaolo Bonziniif [ -z "$TEST_DIR" ]; then
117e8d81a61SMao Zhongyi        TEST_DIR=$PWD/scratch
11809d653e6SPaolo Bonzinifi
11909d653e6SPaolo Bonzini
12009d653e6SPaolo Bonziniif [ ! -e "$TEST_DIR" ]; then
12109d653e6SPaolo Bonzini        mkdir "$TEST_DIR"
12209d653e6SPaolo Bonzinifi
12309d653e6SPaolo Bonzini
12409d653e6SPaolo Bonzinidiff="diff -u"
12509d653e6SPaolo Bonziniverbose=false
12609d653e6SPaolo Bonzinidebug=false
12709d653e6SPaolo Bonzinigroup=false
12809d653e6SPaolo Bonzinixgroup=false
12909d653e6SPaolo Bonziniimgopts=false
13009d653e6SPaolo Bonzinishowme=false
13109d653e6SPaolo Bonzinisortme=false
13209d653e6SPaolo Bonziniexpunge=true
13309d653e6SPaolo Bonzinihave_test_arg=false
13409d653e6SPaolo Bonzinicachemode=false
13509d653e6SPaolo Bonzini
13609d653e6SPaolo Bonzinitmp="${TEST_DIR}"/$$
13709d653e6SPaolo Bonzinirm -f $tmp.list $tmp.tmp $tmp.sed
13809d653e6SPaolo Bonzini
13909d653e6SPaolo Bonziniexport IMGFMT=raw
14009d653e6SPaolo Bonziniexport IMGFMT_GENERIC=true
14109d653e6SPaolo Bonziniexport IMGPROTO=file
14209d653e6SPaolo Bonziniexport IMGOPTS=""
14309d653e6SPaolo Bonziniexport CACHEMODE="writeback"
14409d653e6SPaolo Bonziniexport QEMU_IO_OPTIONS=""
14509d653e6SPaolo Bonziniexport QEMU_IO_OPTIONS_NO_FMT=""
14609d653e6SPaolo Bonziniexport CACHEMODE_IS_DEFAULT=true
14709d653e6SPaolo Bonziniexport VALGRIND_QEMU=
14809d653e6SPaolo Bonziniexport IMGKEYSECRET=
14909d653e6SPaolo Bonziniexport IMGOPTSSYNTAX=false
15009d653e6SPaolo Bonzini
1518803714bSEric Blake# Save current tty settings, since an aborting qemu call may leave things
1528803714bSEric Blake# screwed up
1538803714bSEric BlakeSTTY_RESTORE=
1548803714bSEric Blakeif test -t 0; then
1558803714bSEric Blake    STTY_RESTORE=$(stty -g)
1568803714bSEric Blakefi
1578803714bSEric Blake
15809d653e6SPaolo Bonzinifor r
15909d653e6SPaolo Bonzinido
16009d653e6SPaolo Bonzini
16109d653e6SPaolo Bonzini    if $group
16209d653e6SPaolo Bonzini    then
16309d653e6SPaolo Bonzini        # arg after -g
1644a9e751fSMao Zhongyi        group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
16509d653e6SPaolo Bonzinis/ .*//p
1664a9e751fSMao Zhongyi}')
16709d653e6SPaolo Bonzini        if [ -z "$group_list" ]
16809d653e6SPaolo Bonzini        then
16909d653e6SPaolo Bonzini            echo "Group \"$r\" is empty or not defined?"
17009d653e6SPaolo Bonzini            exit 1
17109d653e6SPaolo Bonzini        fi
17209d653e6SPaolo Bonzini        [ ! -s $tmp.list ] && touch $tmp.list
17309d653e6SPaolo Bonzini        for t in $group_list
17409d653e6SPaolo Bonzini        do
17509d653e6SPaolo Bonzini            if grep -s "^$t\$" $tmp.list >/dev/null
17609d653e6SPaolo Bonzini            then
17709d653e6SPaolo Bonzini                :
17809d653e6SPaolo Bonzini            else
17909d653e6SPaolo Bonzini                echo "$t" >>$tmp.list
18009d653e6SPaolo Bonzini            fi
18109d653e6SPaolo Bonzini        done
18209d653e6SPaolo Bonzini        group=false
18309d653e6SPaolo Bonzini        continue
18409d653e6SPaolo Bonzini
18509d653e6SPaolo Bonzini    elif $xgroup
18609d653e6SPaolo Bonzini    then
18709d653e6SPaolo Bonzini        # arg after -x
18809d653e6SPaolo Bonzini        # Populate $tmp.list with all tests
18909d653e6SPaolo Bonzini        awk '/^[0-9]{3,}/ {print $1}' "${source_iotests}/group" > $tmp.list 2>/dev/null
1904a9e751fSMao Zhongyi        group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
19109d653e6SPaolo Bonzinis/ .*//p
1924a9e751fSMao Zhongyi}')
19309d653e6SPaolo Bonzini        if [ -z "$group_list" ]
19409d653e6SPaolo Bonzini        then
19509d653e6SPaolo Bonzini            echo "Group \"$r\" is empty or not defined?"
19609d653e6SPaolo Bonzini            exit 1
19709d653e6SPaolo Bonzini        fi
19809d653e6SPaolo Bonzini        numsed=0
19909d653e6SPaolo Bonzini        rm -f $tmp.sed
20009d653e6SPaolo Bonzini        for t in $group_list
20109d653e6SPaolo Bonzini        do
20209d653e6SPaolo Bonzini            if [ $numsed -gt 100 ]
20309d653e6SPaolo Bonzini            then
20409d653e6SPaolo Bonzini                sed -f $tmp.sed <$tmp.list >$tmp.tmp
20509d653e6SPaolo Bonzini                mv $tmp.tmp $tmp.list
20609d653e6SPaolo Bonzini                numsed=0
20709d653e6SPaolo Bonzini                rm -f $tmp.sed
20809d653e6SPaolo Bonzini            fi
20909d653e6SPaolo Bonzini            echo "/^$t\$/d" >>$tmp.sed
2104a9e751fSMao Zhongyi            numsed=$(expr $numsed + 1)
21109d653e6SPaolo Bonzini        done
21209d653e6SPaolo Bonzini        sed -f $tmp.sed <$tmp.list >$tmp.tmp
21309d653e6SPaolo Bonzini        mv $tmp.tmp $tmp.list
21409d653e6SPaolo Bonzini        xgroup=false
21509d653e6SPaolo Bonzini        continue
21609d653e6SPaolo Bonzini
21709d653e6SPaolo Bonzini    elif $imgopts
21809d653e6SPaolo Bonzini    then
21909d653e6SPaolo Bonzini        IMGOPTS="$r"
22009d653e6SPaolo Bonzini        imgopts=false
22109d653e6SPaolo Bonzini        continue
22209d653e6SPaolo Bonzini    elif $cachemode
22309d653e6SPaolo Bonzini    then
22409d653e6SPaolo Bonzini        CACHEMODE="$r"
22509d653e6SPaolo Bonzini        CACHEMODE_IS_DEFAULT=false
22609d653e6SPaolo Bonzini        cachemode=false
22709d653e6SPaolo Bonzini        continue
22809d653e6SPaolo Bonzini    fi
22909d653e6SPaolo Bonzini
23009d653e6SPaolo Bonzini    xpand=true
23109d653e6SPaolo Bonzini    case "$r"
23209d653e6SPaolo Bonzini    in
23309d653e6SPaolo Bonzini
23409d653e6SPaolo Bonzini        -\? | -h | --help)        # usage
23509d653e6SPaolo Bonzini            echo "Usage: $0 [options] [testlist]"'
23609d653e6SPaolo Bonzini
23709d653e6SPaolo Bonzinicommon options
23809d653e6SPaolo Bonzini    -v                  verbose
23909d653e6SPaolo Bonzini    -d                  debug
24009d653e6SPaolo Bonzini
24109d653e6SPaolo Bonziniimage format options
24209d653e6SPaolo Bonzini    -raw                test raw (default)
24309d653e6SPaolo Bonzini    -bochs              test bochs
24409d653e6SPaolo Bonzini    -cloop              test cloop
24509d653e6SPaolo Bonzini    -parallels          test parallels
24609d653e6SPaolo Bonzini    -qcow               test qcow
24709d653e6SPaolo Bonzini    -qcow2              test qcow2
24809d653e6SPaolo Bonzini    -qed                test qed
24909d653e6SPaolo Bonzini    -vdi                test vdi
25009d653e6SPaolo Bonzini    -vpc                test vpc
25109d653e6SPaolo Bonzini    -vhdx               test vhdx
25209d653e6SPaolo Bonzini    -vmdk               test vmdk
25309d653e6SPaolo Bonzini    -luks               test luks
25476f1cf0aSyuchenlin    -dmg                test dmg
25509d653e6SPaolo Bonzini
25609d653e6SPaolo Bonziniimage protocol options
25709d653e6SPaolo Bonzini    -file               test file (default)
25809d653e6SPaolo Bonzini    -rbd                test rbd
25909d653e6SPaolo Bonzini    -sheepdog           test sheepdog
26009d653e6SPaolo Bonzini    -nbd                test nbd
26109d653e6SPaolo Bonzini    -ssh                test ssh
26209d653e6SPaolo Bonzini    -nfs                test nfs
26309d653e6SPaolo Bonzini    -vxhs               test vxhs
26409d653e6SPaolo Bonzini
26509d653e6SPaolo Bonziniother options
26609d653e6SPaolo Bonzini    -xdiff              graphical mode diff
26709d653e6SPaolo Bonzini    -nocache            use O_DIRECT on backing file
26809d653e6SPaolo Bonzini    -misalign           misalign memory allocations
26909d653e6SPaolo Bonzini    -n                  show me, do not run tests
27009d653e6SPaolo Bonzini    -o options          -o options to pass to qemu-img create/convert
27109d653e6SPaolo Bonzini    -c mode             cache mode
272*70ff5b07SAlex Bennée    -makecheck          pretty print output for make check
27309d653e6SPaolo Bonzini
27409d653e6SPaolo Bonzinitestlist options
27509d653e6SPaolo Bonzini    -g group[,group...]        include tests from these groups
27609d653e6SPaolo Bonzini    -x group[,group...]        exclude tests from these groups
27709d653e6SPaolo Bonzini    NNN                        include test NNN
27809d653e6SPaolo Bonzini    NNN-NNN                    include test range (eg. 012-021)
27909d653e6SPaolo Bonzini'
28009d653e6SPaolo Bonzini            exit 0
28109d653e6SPaolo Bonzini            ;;
28209d653e6SPaolo Bonzini
28309d653e6SPaolo Bonzini        -raw)
28409d653e6SPaolo Bonzini            IMGFMT=raw
28509d653e6SPaolo Bonzini            xpand=false
28609d653e6SPaolo Bonzini            ;;
28709d653e6SPaolo Bonzini
28809d653e6SPaolo Bonzini        -bochs)
28909d653e6SPaolo Bonzini            IMGFMT=bochs
29009d653e6SPaolo Bonzini            IMGFMT_GENERIC=false
29109d653e6SPaolo Bonzini            xpand=false
29209d653e6SPaolo Bonzini            ;;
29309d653e6SPaolo Bonzini
29409d653e6SPaolo Bonzini        -cloop)
29509d653e6SPaolo Bonzini            IMGFMT=cloop
29609d653e6SPaolo Bonzini            IMGFMT_GENERIC=false
29709d653e6SPaolo Bonzini            xpand=false
29809d653e6SPaolo Bonzini            ;;
29909d653e6SPaolo Bonzini
30009d653e6SPaolo Bonzini        -parallels)
30109d653e6SPaolo Bonzini            IMGFMT=parallels
30209d653e6SPaolo Bonzini            xpand=false
30309d653e6SPaolo Bonzini            ;;
30409d653e6SPaolo Bonzini
30509d653e6SPaolo Bonzini        -qcow)
30609d653e6SPaolo Bonzini            IMGFMT=qcow
30709d653e6SPaolo Bonzini            xpand=false
30809d653e6SPaolo Bonzini            ;;
30909d653e6SPaolo Bonzini
31009d653e6SPaolo Bonzini        -qcow2)
31109d653e6SPaolo Bonzini            IMGFMT=qcow2
31209d653e6SPaolo Bonzini            xpand=false
31309d653e6SPaolo Bonzini            ;;
31409d653e6SPaolo Bonzini
31509d653e6SPaolo Bonzini        -luks)
31609d653e6SPaolo Bonzini            IMGOPTSSYNTAX=true
31709d653e6SPaolo Bonzini            IMGFMT=luks
31809d653e6SPaolo Bonzini            IMGKEYSECRET=123456
31909d653e6SPaolo Bonzini            xpand=false
32009d653e6SPaolo Bonzini            ;;
32109d653e6SPaolo Bonzini
32276f1cf0aSyuchenlin        -dmg)
32376f1cf0aSyuchenlin            IMGFMT=dmg
32476f1cf0aSyuchenlin            IMGFMT_GENERIC=false
32576f1cf0aSyuchenlin            xpand=false
32676f1cf0aSyuchenlin            ;;
32776f1cf0aSyuchenlin
32809d653e6SPaolo Bonzini        -qed)
32909d653e6SPaolo Bonzini            IMGFMT=qed
33009d653e6SPaolo Bonzini            xpand=false
33109d653e6SPaolo Bonzini            ;;
33209d653e6SPaolo Bonzini
33309d653e6SPaolo Bonzini        -vdi)
33409d653e6SPaolo Bonzini            IMGFMT=vdi
33509d653e6SPaolo Bonzini            xpand=false
33609d653e6SPaolo Bonzini            ;;
33709d653e6SPaolo Bonzini
33809d653e6SPaolo Bonzini        -vmdk)
33909d653e6SPaolo Bonzini            IMGFMT=vmdk
34009d653e6SPaolo Bonzini            xpand=false
34109d653e6SPaolo Bonzini            ;;
34209d653e6SPaolo Bonzini
34309d653e6SPaolo Bonzini        -vpc)
34409d653e6SPaolo Bonzini            IMGFMT=vpc
34509d653e6SPaolo Bonzini            xpand=false
34609d653e6SPaolo Bonzini            ;;
34709d653e6SPaolo Bonzini
34809d653e6SPaolo Bonzini        -vhdx)
34909d653e6SPaolo Bonzini            IMGFMT=vhdx
35009d653e6SPaolo Bonzini            xpand=false
35109d653e6SPaolo Bonzini            ;;
35209d653e6SPaolo Bonzini
35309d653e6SPaolo Bonzini        -file)
35409d653e6SPaolo Bonzini            IMGPROTO=file
35509d653e6SPaolo Bonzini            xpand=false
35609d653e6SPaolo Bonzini            ;;
35709d653e6SPaolo Bonzini
35809d653e6SPaolo Bonzini        -rbd)
35909d653e6SPaolo Bonzini            IMGPROTO=rbd
36009d653e6SPaolo Bonzini            xpand=false
36109d653e6SPaolo Bonzini            ;;
36209d653e6SPaolo Bonzini
36309d653e6SPaolo Bonzini        -sheepdog)
36409d653e6SPaolo Bonzini            IMGPROTO=sheepdog
36509d653e6SPaolo Bonzini            xpand=false
36609d653e6SPaolo Bonzini            ;;
36709d653e6SPaolo Bonzini
36809d653e6SPaolo Bonzini        -nbd)
36909d653e6SPaolo Bonzini            IMGPROTO=nbd
37009d653e6SPaolo Bonzini            xpand=false
37109d653e6SPaolo Bonzini            ;;
37209d653e6SPaolo Bonzini
37309d653e6SPaolo Bonzini        -vxhs)
37409d653e6SPaolo Bonzini            IMGPROTO=vxhs
37509d653e6SPaolo Bonzini            xpand=false
37609d653e6SPaolo Bonzini            ;;
37709d653e6SPaolo Bonzini
37809d653e6SPaolo Bonzini        -ssh)
37909d653e6SPaolo Bonzini            IMGPROTO=ssh
38009d653e6SPaolo Bonzini            xpand=false
38109d653e6SPaolo Bonzini            ;;
38209d653e6SPaolo Bonzini
38309d653e6SPaolo Bonzini        -nfs)
38409d653e6SPaolo Bonzini            IMGPROTO=nfs
38509d653e6SPaolo Bonzini            xpand=false
38609d653e6SPaolo Bonzini            ;;
38709d653e6SPaolo Bonzini
38809d653e6SPaolo Bonzini        -nocache)
38909d653e6SPaolo Bonzini            CACHEMODE="none"
39009d653e6SPaolo Bonzini            CACHEMODE_IS_DEFAULT=false
39109d653e6SPaolo Bonzini            xpand=false
39209d653e6SPaolo Bonzini            ;;
39309d653e6SPaolo Bonzini
39409d653e6SPaolo Bonzini        -misalign)
39509d653e6SPaolo Bonzini            QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --misalign"
39609d653e6SPaolo Bonzini            xpand=false
39709d653e6SPaolo Bonzini            ;;
39809d653e6SPaolo Bonzini
39909d653e6SPaolo Bonzini        -valgrind)
40009d653e6SPaolo Bonzini            VALGRIND_QEMU='y'
40109d653e6SPaolo Bonzini            xpand=false
40209d653e6SPaolo Bonzini            ;;
40309d653e6SPaolo Bonzini
40409d653e6SPaolo Bonzini        -g)        # -g group ... pick from group file
40509d653e6SPaolo Bonzini            group=true
40609d653e6SPaolo Bonzini            xpand=false
40709d653e6SPaolo Bonzini            ;;
40809d653e6SPaolo Bonzini
40909d653e6SPaolo Bonzini        -xdiff)        # graphical diff mode
41009d653e6SPaolo Bonzini            xpand=false
41109d653e6SPaolo Bonzini
41209d653e6SPaolo Bonzini            if [ ! -z "$DISPLAY" ]
41309d653e6SPaolo Bonzini            then
41409d653e6SPaolo Bonzini                command -v xdiff >/dev/null 2>&1 && diff=xdiff
41509d653e6SPaolo Bonzini                command -v gdiff >/dev/null 2>&1 && diff=gdiff
41609d653e6SPaolo Bonzini                command -v tkdiff >/dev/null 2>&1 && diff=tkdiff
41709d653e6SPaolo Bonzini                command -v xxdiff >/dev/null 2>&1 && diff=xxdiff
41809d653e6SPaolo Bonzini            fi
41909d653e6SPaolo Bonzini            ;;
420*70ff5b07SAlex Bennée        -makecheck)   # makecheck friendly output
421*70ff5b07SAlex Bennée            makecheck=true
422*70ff5b07SAlex Bennée            xpand=false
423*70ff5b07SAlex Bennée            ;;
42409d653e6SPaolo Bonzini        -n)        # show me, don't do it
42509d653e6SPaolo Bonzini            showme=true
42609d653e6SPaolo Bonzini            xpand=false
42709d653e6SPaolo Bonzini            ;;
42809d653e6SPaolo Bonzini        -o)
42909d653e6SPaolo Bonzini            imgopts=true
43009d653e6SPaolo Bonzini            xpand=false
43109d653e6SPaolo Bonzini            ;;
43209d653e6SPaolo Bonzini        -c)
43309d653e6SPaolo Bonzini            cachemode=true
43409d653e6SPaolo Bonzini            xpand=false
43509d653e6SPaolo Bonzini            ;;
436*70ff5b07SAlex Bennée        -T)        # deprecated timestamp option
43709d653e6SPaolo Bonzini            xpand=false
43809d653e6SPaolo Bonzini            ;;
43909d653e6SPaolo Bonzini
44009d653e6SPaolo Bonzini        -v)
44109d653e6SPaolo Bonzini            verbose=true
44209d653e6SPaolo Bonzini            xpand=false
44309d653e6SPaolo Bonzini            ;;
44409d653e6SPaolo Bonzini        -d)
44509d653e6SPaolo Bonzini            debug=true
44609d653e6SPaolo Bonzini            xpand=false
44709d653e6SPaolo Bonzini            ;;
44809d653e6SPaolo Bonzini        -x)        # -x group ... exclude from group file
44909d653e6SPaolo Bonzini            xgroup=true
45009d653e6SPaolo Bonzini            xpand=false
45109d653e6SPaolo Bonzini            ;;
45209d653e6SPaolo Bonzini        '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
45309d653e6SPaolo Bonzini            echo "No tests?"
45409d653e6SPaolo Bonzini            status=1
45509d653e6SPaolo Bonzini            exit $status
45609d653e6SPaolo Bonzini            ;;
45709d653e6SPaolo Bonzini
45809d653e6SPaolo Bonzini        [0-9]*-[0-9]*)
4594a9e751fSMao Zhongyi            eval $(echo $r | sed -e 's/^/start=/' -e 's/-/ end=/')
46009d653e6SPaolo Bonzini            ;;
46109d653e6SPaolo Bonzini
46209d653e6SPaolo Bonzini        [0-9]*-)
4634a9e751fSMao Zhongyi            eval $(echo $r | sed -e 's/^/start=/' -e 's/-//')
4644a9e751fSMao 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/.* //')
46509d653e6SPaolo Bonzini            if [ -z "$end" ]
46609d653e6SPaolo Bonzini            then
46709d653e6SPaolo Bonzini                echo "No tests in range \"$r\"?"
46809d653e6SPaolo Bonzini                status=1
46909d653e6SPaolo Bonzini                exit $status
47009d653e6SPaolo Bonzini            fi
47109d653e6SPaolo Bonzini            ;;
47209d653e6SPaolo Bonzini
47309d653e6SPaolo Bonzini        *)
47409d653e6SPaolo Bonzini            start=$r
47509d653e6SPaolo Bonzini            end=$r
47609d653e6SPaolo Bonzini            ;;
47709d653e6SPaolo Bonzini
47809d653e6SPaolo Bonzini    esac
47909d653e6SPaolo Bonzini
48009d653e6SPaolo Bonzini    # get rid of leading 0s as can be interpreted as octal
4814a9e751fSMao Zhongyi    start=$(echo $start | sed 's/^0*//')
4824a9e751fSMao Zhongyi    end=$(echo $end | sed 's/^0*//')
48309d653e6SPaolo Bonzini
48409d653e6SPaolo Bonzini    if $xpand
48509d653e6SPaolo Bonzini    then
48609d653e6SPaolo Bonzini        have_test_arg=true
48709d653e6SPaolo Bonzini        awk </dev/null '
48809d653e6SPaolo BonziniBEGIN        { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
48909d653e6SPaolo Bonzini        | while read id
49009d653e6SPaolo Bonzini        do
49109d653e6SPaolo Bonzini            if grep -s "^$id " "$source_iotests/group" >/dev/null
49209d653e6SPaolo Bonzini            then
49309d653e6SPaolo Bonzini                # in group file ... OK
49409d653e6SPaolo Bonzini                echo $id >>$tmp.list
49509d653e6SPaolo Bonzini            else
49609d653e6SPaolo Bonzini                if [ -f expunged ] && $expunge && egrep "^$id([         ]|\$)" expunged >/dev/null
49709d653e6SPaolo Bonzini                then
49809d653e6SPaolo Bonzini                    # expunged ... will be reported, but not run, later
49909d653e6SPaolo Bonzini                    echo $id >>$tmp.list
50009d653e6SPaolo Bonzini                else
50109d653e6SPaolo Bonzini                    # oops
50209d653e6SPaolo Bonzini                    if [ "$start" == "$end" -a "$id" == "$end" ]
50309d653e6SPaolo Bonzini                    then
50409d653e6SPaolo Bonzini                        echo "$id - unknown test"
50509d653e6SPaolo Bonzini                        exit 1
50609d653e6SPaolo Bonzini                    else
50709d653e6SPaolo Bonzini                        echo "$id - unknown test, ignored"
50809d653e6SPaolo Bonzini                    fi
50909d653e6SPaolo Bonzini                fi
51009d653e6SPaolo Bonzini            fi
51109d653e6SPaolo Bonzini        done || exit 1
51209d653e6SPaolo Bonzini    fi
51309d653e6SPaolo Bonzini
51409d653e6SPaolo Bonzinidone
51509d653e6SPaolo Bonzini
51609d653e6SPaolo Bonzini# Set qemu-io cache mode with $CACHEMODE we have
51709d653e6SPaolo BonziniQEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --cache $CACHEMODE"
51809d653e6SPaolo Bonzini
51909d653e6SPaolo BonziniQEMU_IO_OPTIONS_NO_FMT="$QEMU_IO_OPTIONS"
52009d653e6SPaolo Bonziniif [ "$IMGOPTSSYNTAX" != "true" ]; then
52109d653e6SPaolo Bonzini    QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS -f $IMGFMT"
52209d653e6SPaolo Bonzinifi
52309d653e6SPaolo Bonzini
52409d653e6SPaolo Bonzini# Set default options for qemu-img create -o if they were not specified
52509d653e6SPaolo Bonziniif [ "$IMGFMT" == "qcow2" ] && ! (echo "$IMGOPTS" | grep "compat=" > /dev/null); then
52609d653e6SPaolo Bonzini    IMGOPTS=$(_optstr_add "$IMGOPTS" "compat=1.1")
52709d653e6SPaolo Bonzinifi
52809d653e6SPaolo Bonziniif [ "$IMGFMT" == "luks" ] && ! (echo "$IMGOPTS" | grep "iter-time=" > /dev/null); then
52909d653e6SPaolo Bonzini    IMGOPTS=$(_optstr_add "$IMGOPTS" "iter-time=10")
53009d653e6SPaolo Bonzinifi
53109d653e6SPaolo Bonzini
53209d653e6SPaolo Bonziniif [ -z "$SAMPLE_IMG_DIR" ]; then
53309d653e6SPaolo Bonzini        SAMPLE_IMG_DIR="$source_iotests/sample_images"
53409d653e6SPaolo Bonzinifi
53509d653e6SPaolo Bonzini
53609d653e6SPaolo Bonziniexport TEST_DIR
53709d653e6SPaolo Bonziniexport SAMPLE_IMG_DIR
53809d653e6SPaolo Bonzini
53909d653e6SPaolo Bonziniif [ -s $tmp.list ]
54009d653e6SPaolo Bonzinithen
54109d653e6SPaolo Bonzini    # found some valid test numbers ... this is good
54209d653e6SPaolo Bonzini    :
54309d653e6SPaolo Bonzinielse
54409d653e6SPaolo Bonzini    if $have_test_arg
54509d653e6SPaolo Bonzini    then
54609d653e6SPaolo Bonzini        # had test numbers, but none in group file ... do nothing
54709d653e6SPaolo Bonzini        touch $tmp.list
54809d653e6SPaolo Bonzini    else
54909d653e6SPaolo Bonzini        # no test numbers, do everything from group file
55009d653e6SPaolo Bonzini        sed -n -e '/^[0-9][0-9][0-9]*/s/[         ].*//p' <"$source_iotests/group" >$tmp.list
55109d653e6SPaolo Bonzini    fi
55209d653e6SPaolo Bonzinifi
55309d653e6SPaolo Bonzini
55409d653e6SPaolo Bonzini# should be sort -n, but this did not work for Linux when this
55509d653e6SPaolo Bonzini# was ported from IRIX
55609d653e6SPaolo Bonzini#
5574a9e751fSMao Zhongyilist=$(sort $tmp.list)
55809d653e6SPaolo Bonzinirm -f $tmp.list $tmp.tmp $tmp.sed
55909d653e6SPaolo Bonzini
56009d653e6SPaolo Bonziniif [ -z "$QEMU_PROG" ]
56109d653e6SPaolo Bonzinithen
56209d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu" ]; then
56309d653e6SPaolo Bonzini        export QEMU_PROG="$build_iotests/qemu"
56496914159SLukáš Doktor    elif [ -x "$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}" ]; then
56596914159SLukáš Doktor        export QEMU_PROG="$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}"
56609d653e6SPaolo Bonzini    else
56709d653e6SPaolo Bonzini        pushd "$build_root" > /dev/null
56809d653e6SPaolo Bonzini        for binary in *-softmmu/qemu-system-*
56909d653e6SPaolo Bonzini        do
57009d653e6SPaolo Bonzini            if [ -x "$binary" ]
57109d653e6SPaolo Bonzini            then
57209d653e6SPaolo Bonzini                export QEMU_PROG="$build_root/$binary"
57309d653e6SPaolo Bonzini                break
57409d653e6SPaolo Bonzini            fi
57509d653e6SPaolo Bonzini        done
57609d653e6SPaolo Bonzini        popd > /dev/null
57709d653e6SPaolo Bonzini        [ "$QEMU_PROG" = "" ] && _init_error "qemu not found"
57809d653e6SPaolo Bonzini    fi
57909d653e6SPaolo Bonzinifi
58063ca8406SEric Blakeexport QEMU_PROG="$(type -p "$QEMU_PROG")"
58109d653e6SPaolo Bonzini
5824a715461SThomas Huthcase "$QEMU_PROG" in
5834a715461SThomas Huth    *qemu-system-arm|*qemu-system-aarch64)
5844a715461SThomas Huth        export QEMU_OPTIONS="-nodefaults -machine virt,accel=qtest"
5854a715461SThomas Huth        ;;
5864a715461SThomas Huth    *qemu-system-tricore)
5874a715461SThomas Huth        export QEMU_OPTIONS="-nodefaults -machine tricore_testboard,accel=qtest"
5884a715461SThomas Huth        ;;
5894a715461SThomas Huth    *)
5904a715461SThomas Huth        export QEMU_OPTIONS="-nodefaults -machine accel=qtest"
5914a715461SThomas Huth        ;;
5924a715461SThomas Huthesac
5934a715461SThomas Huth
59409d653e6SPaolo Bonziniif [ -z "$QEMU_IMG_PROG" ]; then
59509d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-img" ]; then
59609d653e6SPaolo Bonzini        export QEMU_IMG_PROG="$build_iotests/qemu-img"
59709d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-img" ]; then
59809d653e6SPaolo Bonzini        export QEMU_IMG_PROG="$build_root/qemu-img"
59909d653e6SPaolo Bonzini    else
60009d653e6SPaolo Bonzini        _init_error "qemu-img not found"
60109d653e6SPaolo Bonzini    fi
60209d653e6SPaolo Bonzinifi
60363ca8406SEric Blakeexport QEMU_IMG_PROG="$(type -p "$QEMU_IMG_PROG")"
60409d653e6SPaolo Bonzini
60509d653e6SPaolo Bonziniif [ -z "$QEMU_IO_PROG" ]; then
60609d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-io" ]; then
60709d653e6SPaolo Bonzini        export QEMU_IO_PROG="$build_iotests/qemu-io"
60809d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-io" ]; then
60909d653e6SPaolo Bonzini        export QEMU_IO_PROG="$build_root/qemu-io"
61009d653e6SPaolo Bonzini    else
61109d653e6SPaolo Bonzini        _init_error "qemu-io not found"
61209d653e6SPaolo Bonzini    fi
61309d653e6SPaolo Bonzinifi
61463ca8406SEric Blakeexport QEMU_IO_PROG="$(type -p "$QEMU_IO_PROG")"
61509d653e6SPaolo Bonzini
61609d653e6SPaolo Bonziniif [ -z $QEMU_NBD_PROG ]; then
61709d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-nbd" ]; then
61809d653e6SPaolo Bonzini        export QEMU_NBD_PROG="$build_iotests/qemu-nbd"
61909d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-nbd" ]; then
62009d653e6SPaolo Bonzini        export QEMU_NBD_PROG="$build_root/qemu-nbd"
62109d653e6SPaolo Bonzini    else
62209d653e6SPaolo Bonzini        _init_error "qemu-nbd not found"
62309d653e6SPaolo Bonzini    fi
62409d653e6SPaolo Bonzinifi
62563ca8406SEric Blakeexport QEMU_NBD_PROG="$(type -p "$QEMU_NBD_PROG")"
62609d653e6SPaolo Bonzini
62709d653e6SPaolo Bonziniif [ -z "$QEMU_VXHS_PROG" ]; then
6284a9e751fSMao Zhongyi    export QEMU_VXHS_PROG="$(set_prog_path qnio_server)"
62909d653e6SPaolo Bonzinifi
63009d653e6SPaolo Bonzini
63109d653e6SPaolo Bonziniif [ -x "$build_iotests/socket_scm_helper" ]
63209d653e6SPaolo Bonzinithen
63309d653e6SPaolo Bonzini    export SOCKET_SCM_HELPER="$build_iotests/socket_scm_helper"
63409d653e6SPaolo Bonzinifi
63509d653e6SPaolo Bonzini
63609d653e6SPaolo Bonzinidefault_machine=$($QEMU_PROG -machine help | sed -n '/(default)/ s/ .*//p')
63709d653e6SPaolo Bonzinidefault_alias_machine=$($QEMU_PROG -machine help | \
63809d653e6SPaolo Bonzini   sed -n "/(alias of $default_machine)/ { s/ .*//p; q; }")
63909d653e6SPaolo Bonziniif [[ "$default_alias_machine" ]]; then
64009d653e6SPaolo Bonzini    default_machine="$default_alias_machine"
64109d653e6SPaolo Bonzinifi
64209d653e6SPaolo Bonzini
64309d653e6SPaolo Bonziniexport QEMU_DEFAULT_MACHINE="$default_machine"
64489004368SKevin Wolf
64536bd4228SDaniel P. BerrangeTIMESTAMP_FILE=check.time-$IMGPROTO-$IMGFMT
64636bd4228SDaniel P. Berrange
6476bf19c94SChristoph Hellwig_wallclock()
6486bf19c94SChristoph Hellwig{
6499ee4b6f8SPaolo Bonzini    date "+%H %M %S" | awk '{ print $1*3600 + $2*60 + $3 }'
6506bf19c94SChristoph Hellwig}
6516bf19c94SChristoph Hellwig
6526bf19c94SChristoph Hellwig_wrapup()
6536bf19c94SChristoph Hellwig{
6546bf19c94SChristoph Hellwig    if $showme
6556bf19c94SChristoph Hellwig    then
6566bf19c94SChristoph Hellwig        :
6576bf19c94SChristoph Hellwig    elif $needwrap
6586bf19c94SChristoph Hellwig    then
65936bd4228SDaniel P. Berrange        if [ -f $TIMESTAMP_FILE -a -f $tmp.time ]
6606bf19c94SChristoph Hellwig        then
66136bd4228SDaniel P. Berrange            cat $TIMESTAMP_FILE $tmp.time \
6629ee4b6f8SPaolo Bonzini            | awk '
6636bf19c94SChristoph Hellwig        { t[$1] = $2 }
6646bf19c94SChristoph HellwigEND        { if (NR > 0) {
6656bf19c94SChristoph Hellwig            for (i in t) print i " " t[i]
6666bf19c94SChristoph Hellwig          }
6676bf19c94SChristoph Hellwig        }' \
6686bf19c94SChristoph Hellwig            | sort -n >$tmp.out
66936bd4228SDaniel P. Berrange            mv $tmp.out $TIMESTAMP_FILE
6706bf19c94SChristoph Hellwig        fi
6716bf19c94SChristoph Hellwig
6726bf19c94SChristoph Hellwig        if [ -f $tmp.expunged ]
6736bf19c94SChristoph Hellwig        then
6744a9e751fSMao Zhongyi            notrun=$(wc -l <$tmp.expunged | sed -e 's/  *//g')
6754a9e751fSMao Zhongyi            try=$(expr $try - $notrun)
6764a9e751fSMao Zhongyi            list=$(echo "$list" | sed -f $tmp.expunged)
6776bf19c94SChristoph Hellwig        fi
6786bf19c94SChristoph Hellwig
6796bf19c94SChristoph Hellwig        echo "" >>check.log
6806bf19c94SChristoph Hellwig        date >>check.log
6816bf19c94SChristoph Hellwig        echo $list | fmt | sed -e 's/^/    /' >>check.log
6826bf19c94SChristoph Hellwig        $interrupt && echo "Interrupted!" >>check.log
6836bf19c94SChristoph Hellwig
6846bf19c94SChristoph Hellwig        if [ ! -z "$notrun" ]
6856bf19c94SChristoph Hellwig        then
6866bf19c94SChristoph Hellwig            echo "Not run:$notrun"
6876bf19c94SChristoph Hellwig            echo "Not run:$notrun" >>check.log
6886bf19c94SChristoph Hellwig        fi
68957ed557fSAndrey Shinkevich        if [ ! -z "$casenotrun" ]
69057ed557fSAndrey Shinkevich        then
69157ed557fSAndrey Shinkevich            echo "Some cases not run in:$casenotrun"
69257ed557fSAndrey Shinkevich            echo "Some cases not run in:$casenotrun" >>check.log
69357ed557fSAndrey Shinkevich        fi
6946bf19c94SChristoph Hellwig        if [ ! -z "$n_bad" -a $n_bad != 0 ]
6956bf19c94SChristoph Hellwig        then
6966bf19c94SChristoph Hellwig            echo "Failures:$bad"
6976bf19c94SChristoph Hellwig            echo "Failed $n_bad of $try tests"
6986bf19c94SChristoph Hellwig            echo "Failures:$bad" | fmt >>check.log
6996bf19c94SChristoph Hellwig            echo "Failed $n_bad of $try tests" >>check.log
7006bf19c94SChristoph Hellwig        else
7016bf19c94SChristoph Hellwig            echo "Passed all $try tests"
7026bf19c94SChristoph Hellwig            echo "Passed all $try tests" >>check.log
7036bf19c94SChristoph Hellwig        fi
7046bf19c94SChristoph Hellwig        needwrap=false
7056bf19c94SChristoph Hellwig    fi
7066bf19c94SChristoph Hellwig
7078803714bSEric Blake    if test -n "$STTY_RESTORE"; then
7088803714bSEric Blake        stty $STTY_RESTORE
7098803714bSEric Blake    fi
7100145b4e1SSascha Silbe    rm -f "${TEST_DIR}"/*.out "${TEST_DIR}"/*.err "${TEST_DIR}"/*.time
7110145b4e1SSascha Silbe    rm -f "${TEST_DIR}"/check.pid "${TEST_DIR}"/check.sts
7126bf19c94SChristoph Hellwig    rm -f $tmp.*
7136bf19c94SChristoph Hellwig}
7146bf19c94SChristoph Hellwig
7156bf19c94SChristoph Hellwigtrap "_wrapup; exit \$status" 0 1 2 3 15
7166bf19c94SChristoph Hellwig
717*70ff5b07SAlex Bennée# Report the test start and results. For makecheck we want to pretty
718*70ff5b07SAlex Bennée# print the whole report at the end of the execution.
719*70ff5b07SAlex Bennée# args: $seq, $starttime, $lasttime
720*70ff5b07SAlex Bennée_report_test_start()
721*70ff5b07SAlex Bennée{
722*70ff5b07SAlex Bennée    if ! $makecheck; then
723*70ff5b07SAlex Bennée        if [ -n "$3" ]; then
724*70ff5b07SAlex Bennée            local lasttime=" (last: $3s)"
725*70ff5b07SAlex Bennée        fi
726*70ff5b07SAlex Bennée        printf "%-8s %-10s [%s]            %4s%-14s\r" "$1" "..." "$2" "..." "$lasttime"
727*70ff5b07SAlex Bennée    fi
728*70ff5b07SAlex Bennée}
729*70ff5b07SAlex Bennée# args:$seq $status $starttime $lasttime $thistime $details
730*70ff5b07SAlex Bennée_report_test_result()
731*70ff5b07SAlex Bennée{
732*70ff5b07SAlex Bennée    local status lasttime thistime
733*70ff5b07SAlex Bennée    if $makecheck; then
734*70ff5b07SAlex Bennée        if [ -n "$2" ] && [ "$2" != "pass" ]; then
735*70ff5b07SAlex Bennée            status=" [$2]"
736*70ff5b07SAlex Bennée        fi
737*70ff5b07SAlex Bennée        printf "  TEST    iotest-$IMGFMT: %s%s\n" "$1" "$status"
738*70ff5b07SAlex Bennée        return
739*70ff5b07SAlex Bennée    fi
740*70ff5b07SAlex Bennée
741*70ff5b07SAlex Bennée    if [ -n "$4" ]; then
742*70ff5b07SAlex Bennée        lasttime=" (last: $4s)"
743*70ff5b07SAlex Bennée    fi
744*70ff5b07SAlex Bennée    if [ -n "$5" ]; then
745*70ff5b07SAlex Bennée        thistime=" $5s"
746*70ff5b07SAlex Bennée    fi
747*70ff5b07SAlex Bennée    case "$2" in
748*70ff5b07SAlex Bennée        "pass")     status=$(printf "\e[32m%-10s\e[0m" "$2") ;;
749*70ff5b07SAlex Bennée        "fail")     status=$(printf "\e[1m\e[31m%-10s\e[0m" "$2") ;;
750*70ff5b07SAlex Bennée        "not run")  status=$(printf "\e[33m%-10s\e[0m" "$2") ;;
751*70ff5b07SAlex Bennée        *)          status=$(printf "%-10s" "$2") ;;
752*70ff5b07SAlex Bennée    esac
753*70ff5b07SAlex Bennée
754*70ff5b07SAlex Bennée    printf "%-8s %s [%s] [%s] %4s%-14s %s\n" "$1" "$status" "$3" "$(date '+%T')" "$thistime" "$lasttime" "$6"
755*70ff5b07SAlex Bennée}
756*70ff5b07SAlex Bennée
75736bd4228SDaniel P. Berrange[ -f $TIMESTAMP_FILE ] || touch $TIMESTAMP_FILE
7586bf19c94SChristoph Hellwig
7594a9e751fSMao ZhongyiFULL_IMGFMT_DETAILS=$(_full_imgfmt_details)
7604a9e751fSMao ZhongyiFULL_HOST_DETAILS=$(_full_platform_details)
7616bf19c94SChristoph Hellwig
762*70ff5b07SAlex Bennéeif ! $makecheck; then
763*70ff5b07SAlex Bennée    _full_env_details
764*70ff5b07SAlex Bennéefi
7656bf19c94SChristoph Hellwig
7666bf19c94SChristoph Hellwigseq="check"
7676bf19c94SChristoph Hellwig
7686bf19c94SChristoph Hellwig[ -n "$TESTS_REMAINING_LOG" ] && echo $list > $TESTS_REMAINING_LOG
7696bf19c94SChristoph Hellwig
7706bf19c94SChristoph Hellwigfor seq in $list
7716bf19c94SChristoph Hellwigdo
772*70ff5b07SAlex Bennée    err=false       # error flag
773*70ff5b07SAlex Bennée    printdiff=false # show diff to reference output?
774*70ff5b07SAlex Bennée    status=""       # test result summary
775*70ff5b07SAlex Bennée    results=""      # test result details
776*70ff5b07SAlex Bennée
7776bf19c94SChristoph Hellwig    if [ -n "$TESTS_REMAINING_LOG" ] ; then
7786bf19c94SChristoph Hellwig        sed -e "s/$seq//" -e 's/  / /' -e 's/^ *//' $TESTS_REMAINING_LOG > $TESTS_REMAINING_LOG.tmp
7796bf19c94SChristoph Hellwig        mv $TESTS_REMAINING_LOG.tmp $TESTS_REMAINING_LOG
7806bf19c94SChristoph Hellwig        sync
7816bf19c94SChristoph Hellwig    fi
7826bf19c94SChristoph Hellwig
783*70ff5b07SAlex Bennée    lasttime=$(sed -n -e "/^$seq /s/.* //p" <$TIMESTAMP_FILE)
784*70ff5b07SAlex Bennée    starttime=$(date "+%T")
785*70ff5b07SAlex Bennée    _report_test_start $seq $starttime $lasttime
786*70ff5b07SAlex Bennée
7876bf19c94SChristoph Hellwig    if $showme
7886bf19c94SChristoph Hellwig    then
789*70ff5b07SAlex Bennée        status="not run"
7906bf19c94SChristoph Hellwig    elif [ -f expunged ] && $expunge && egrep "^$seq([         ]|\$)" expunged >/dev/null
7916bf19c94SChristoph Hellwig    then
792*70ff5b07SAlex Bennée        status="not run"
793*70ff5b07SAlex Bennée        results="expunged"
7946bf19c94SChristoph Hellwig        rm -f $seq.out.bad
7956bf19c94SChristoph Hellwig        echo "/^$seq\$/d" >>$tmp.expunged
796e8f8624dSMax Reitz    elif [ ! -f "$source_iotests/$seq" ]
7976bf19c94SChristoph Hellwig    then
798*70ff5b07SAlex Bennée        status="not run"
799*70ff5b07SAlex Bennée        results="no such test?"
8006bf19c94SChristoph Hellwig        echo "/^$seq\$/d" >>$tmp.expunged
8016bf19c94SChristoph Hellwig    else
8026bf19c94SChristoph Hellwig        # really going to try and run this one
8036bf19c94SChristoph Hellwig        #
8046bf19c94SChristoph Hellwig        rm -f $seq.out.bad
8056bf19c94SChristoph Hellwig        rm -f core $seq.notrun
80657ed557fSAndrey Shinkevich        rm -f $seq.casenotrun
8076bf19c94SChristoph Hellwig
8084a9e751fSMao Zhongyi        start=$(_wallclock)
809ea81ca9dSMax Reitz
810ea81ca9dSMax Reitz        if [ "$(head -n 1 "$source_iotests/$seq")" == "#!/usr/bin/env python" ]; then
811ea81ca9dSMax Reitz            run_command="$PYTHON $seq"
812ea81ca9dSMax Reitz        else
813ea81ca9dSMax Reitz            run_command="./$seq"
814ea81ca9dSMax Reitz        fi
815e8f8624dSMax Reitz        export OUTPUT_DIR=$PWD
816aa4f592aSFam Zheng        if $debug; then
817aa4f592aSFam Zheng            (cd "$source_iotests";
818aa4f592aSFam Zheng            MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
819aa4f592aSFam Zheng                    $run_command -d 2>&1 | tee $tmp.out)
820aa4f592aSFam Zheng        else
821e8f8624dSMax Reitz            (cd "$source_iotests";
82204129606SStefan Hajnoczi            MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
823ea81ca9dSMax Reitz                    $run_command >$tmp.out 2>&1)
824aa4f592aSFam Zheng        fi
8256bf19c94SChristoph Hellwig        sts=$?
8264a9e751fSMao Zhongyi        stop=$(_wallclock)
8276bf19c94SChristoph Hellwig
8286bf19c94SChristoph Hellwig        if [ -f core ]
8296bf19c94SChristoph Hellwig        then
8306bf19c94SChristoph Hellwig            mv core $seq.core
831*70ff5b07SAlex Bennée            status="fail"
832*70ff5b07SAlex Bennée            results="[dumped core] $seq.core"
8336bf19c94SChristoph Hellwig            err=true
8346bf19c94SChristoph Hellwig        fi
8356bf19c94SChristoph Hellwig
8366bf19c94SChristoph Hellwig        if [ -f $seq.notrun ]
8376bf19c94SChristoph Hellwig        then
838*70ff5b07SAlex Bennée            # overwrites timestamp output
839*70ff5b07SAlex Bennée            status="not run"
840*70ff5b07SAlex Bennée            results="$(cat $seq.notrun)"
8416bf19c94SChristoph Hellwig        else
8426bf19c94SChristoph Hellwig            if [ $sts -ne 0 ]
8436bf19c94SChristoph Hellwig            then
844*70ff5b07SAlex Bennée                status="fail"
845*70ff5b07SAlex Bennée                results=$(printf %s "[failed, exit status $sts]")
8466bf19c94SChristoph Hellwig                err=true
8476bf19c94SChristoph Hellwig            fi
8488f94b077SKevin Wolf
849e8f8624dSMax Reitz            reference="$source_iotests/$seq.out"
850e166b414SBo Tu            reference_machine="$source_iotests/$seq.$QEMU_DEFAULT_MACHINE.out"
851e166b414SBo Tu            if [ -f "$reference_machine" ]; then
852e166b414SBo Tu                reference="$reference_machine"
853e166b414SBo Tu            fi
854e166b414SBo Tu
855217a0683SStefan Hajnoczi            reference_format="$source_iotests/$seq.out.$IMGFMT"
856217a0683SStefan Hajnoczi            if [ -f "$reference_format" ]; then
857217a0683SStefan Hajnoczi                reference="$reference_format"
858217a0683SStefan Hajnoczi            fi
859217a0683SStefan Hajnoczi
8603baa8449SFam Zheng            if [ "$CACHEMODE" = "none" ]; then
861e8f8624dSMax Reitz                [ -f "$source_iotests/$seq.out.nocache" ] && reference="$source_iotests/$seq.out.nocache"
8628f94b077SKevin Wolf            fi
8638f94b077SKevin Wolf
864e8f8624dSMax Reitz            if [ ! -f "$reference" ]
8656bf19c94SChristoph Hellwig            then
866*70ff5b07SAlex Bennée                status="fail"
867*70ff5b07SAlex Bennée                reason="no qualified output"
8686bf19c94SChristoph Hellwig                err=true
8696bf19c94SChristoph Hellwig            else
870e8f8624dSMax Reitz                if diff -w "$reference" $tmp.out >/dev/null 2>&1
8716bf19c94SChristoph Hellwig                then
872*70ff5b07SAlex Bennée                    if ! $err; then
873*70ff5b07SAlex Bennée                        status="pass"
874*70ff5b07SAlex Bennée                        thistime=$(expr $stop - $start)
875*70ff5b07SAlex Bennée                        echo "$seq $thistime" >>$tmp.time
8766bf19c94SChristoph Hellwig                    fi
8776bf19c94SChristoph Hellwig                else
8786bf19c94SChristoph Hellwig                    mv $tmp.out $seq.out.bad
87963ca8406SEric Blake                    $diff -w "$reference" "$PWD"/$seq.out.bad
880*70ff5b07SAlex Bennée                    status="fail"
881*70ff5b07SAlex Bennée                    results="output mismatch (see $seq.out.bad)"
882*70ff5b07SAlex Bennée                    printdiff=true
8836bf19c94SChristoph Hellwig                    err=true
8846bf19c94SChristoph Hellwig                fi
8856bf19c94SChristoph Hellwig            fi
8866bf19c94SChristoph Hellwig        fi
88757ed557fSAndrey Shinkevich        if [ -f $seq.casenotrun ]
88857ed557fSAndrey Shinkevich        then
88957ed557fSAndrey Shinkevich            cat $seq.casenotrun
89057ed557fSAndrey Shinkevich            casenotrun="$casenotrun $seq"
89157ed557fSAndrey Shinkevich        fi
8926bf19c94SChristoph Hellwig    fi
8936bf19c94SChristoph Hellwig
8946bf19c94SChristoph Hellwig    # come here for each test, except when $showme is true
8956bf19c94SChristoph Hellwig    #
896*70ff5b07SAlex Bennée    _report_test_result $seq "$status" "$starttime" "$lasttime" "$thistime" "$results"
897*70ff5b07SAlex Bennée    case "$status" in
898*70ff5b07SAlex Bennée        "pass")
899*70ff5b07SAlex Bennée            try=$(expr $try + 1)
900*70ff5b07SAlex Bennée            ;;
901*70ff5b07SAlex Bennée        "fail")
902*70ff5b07SAlex Bennée            try=$(expr $try + 1)
903*70ff5b07SAlex Bennée            if $makecheck; then
904*70ff5b07SAlex Bennée                _full_env_details
905*70ff5b07SAlex Bennée            fi
906*70ff5b07SAlex Bennée            if $printdiff; then
907*70ff5b07SAlex Bennée                $diff -w "$reference" "$PWD"/$seq.out.bad
908*70ff5b07SAlex Bennée            fi
9096bf19c94SChristoph Hellwig            bad="$bad $seq"
9104a9e751fSMao Zhongyi            n_bad=$(expr $n_bad + 1)
9116bf19c94SChristoph Hellwig            quick=false
912*70ff5b07SAlex Bennée            ;;
913*70ff5b07SAlex Bennée        "not run")
914*70ff5b07SAlex Bennée            notrun="$notrun $seq"
915*70ff5b07SAlex Bennée            ;;
916*70ff5b07SAlex Bennée    esac
9176bf19c94SChristoph Hellwig
9186bf19c94SChristoph Hellwig    seq="after_$seq"
9196bf19c94SChristoph Hellwigdone
9206bf19c94SChristoph Hellwig
9216bf19c94SChristoph Hellwiginterrupt=false
9224a9e751fSMao Zhongyistatus=$(expr $n_bad)
9236bf19c94SChristoph Hellwigexit
924