xref: /openbmc/qemu/tests/qemu-iotests/check (revision 09d653e6176a5e92f5d2a3b2270f386d9ce6a544)
1908eaf68SStefan Hajnoczi#!/bin/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=""
286bf19c94SChristoph Hellwiginterrupt=true
296bf19c94SChristoph Hellwig
306bf19c94SChristoph Hellwig# by default don't output timestamps
316bf19c94SChristoph Hellwigtimestamp=${TIMESTAMP:=false}
326bf19c94SChristoph Hellwig
33e8f8624dSMax Reitz_init_error()
34e8f8624dSMax Reitz{
354e670492SPaolo Bonzini    echo "check: $1" >&2
366bf19c94SChristoph Hellwig    exit 1
37e8f8624dSMax Reitz}
38e8f8624dSMax Reitz
39e8f8624dSMax Reitzif [ -L "$0" ]
40e8f8624dSMax Reitzthen
41e8f8624dSMax Reitz    # called from the build tree
42e8f8624dSMax Reitz    source_iotests=$(dirname "$(readlink "$0")")
43e8f8624dSMax Reitz    if [ -z "$source_iotests" ]
44e8f8624dSMax Reitz    then
45e8f8624dSMax Reitz        _init_error "failed to obtain source tree name from check symlink"
46e8f8624dSMax Reitz    fi
47e8f8624dSMax Reitz    source_iotests=$(cd "$source_iotests"; pwd) || _init_error "failed to enter source tree"
48e8f8624dSMax Reitz    build_iotests=$PWD
49e8f8624dSMax Reitzelse
50e8f8624dSMax Reitz    # called from the source tree
51e8f8624dSMax Reitz    source_iotests=$PWD
52e8f8624dSMax Reitz    # this may be an in-tree build (note that in the following code we may not
53e8f8624dSMax Reitz    # assume that it truly is and have to test whether the build results
54e8f8624dSMax Reitz    # actually exist)
55e8f8624dSMax Reitz    build_iotests=$PWD
56e8f8624dSMax Reitzfi
57e8f8624dSMax Reitz
58e8f8624dSMax Reitzbuild_root="$build_iotests/../.."
59e8f8624dSMax Reitz
607fed1a49SMax Reitz# we need common.env
617fed1a49SMax Reitzif ! . "$build_iotests/common.env"
627fed1a49SMax Reitzthen
637fed1a49SMax Reitz    _init_error "failed to source common.env (make sure the qemu-iotests are run from tests/qemu-iotests in the build tree)"
647fed1a49SMax Reitzfi
657fed1a49SMax Reitz
66e8f8624dSMax Reitz# we need common.config
67e8f8624dSMax Reitzif ! . "$source_iotests/common.config"
68e8f8624dSMax Reitzthen
69e8f8624dSMax Reitz    _init_error "failed to source common.config"
706bf19c94SChristoph Hellwigfi
716bf19c94SChristoph Hellwig
72*09d653e6SPaolo Bonzini_full_imgfmt_details()
73*09d653e6SPaolo Bonzini{
74*09d653e6SPaolo Bonzini    if [ -n "$IMGOPTS" ]; then
75*09d653e6SPaolo Bonzini        echo "$IMGFMT ($IMGOPTS)"
76*09d653e6SPaolo Bonzini    else
77*09d653e6SPaolo Bonzini        echo "$IMGFMT"
78*09d653e6SPaolo Bonzini    fi
79*09d653e6SPaolo Bonzini}
80*09d653e6SPaolo Bonzini
81*09d653e6SPaolo Bonzini_full_platform_details()
82*09d653e6SPaolo Bonzini{
83*09d653e6SPaolo Bonzini    os=`uname -s`
84*09d653e6SPaolo Bonzini    host=`hostname -s`
85*09d653e6SPaolo Bonzini    kernel=`uname -r`
86*09d653e6SPaolo Bonzini    platform=`uname -m`
87*09d653e6SPaolo Bonzini    echo "$os/$platform $host $kernel"
88*09d653e6SPaolo Bonzini}
89*09d653e6SPaolo Bonzini
90*09d653e6SPaolo Bonzini# $1 = prog to look for
91*09d653e6SPaolo Bonziniset_prog_path()
92*09d653e6SPaolo Bonzini{
93*09d653e6SPaolo Bonzini    p=`command -v $1 2> /dev/null`
94*09d653e6SPaolo Bonzini    if [ -n "$p" -a -x "$p" ]; then
95*09d653e6SPaolo Bonzini        realpath -- "$(type -p "$p")"
96*09d653e6SPaolo Bonzini    else
97*09d653e6SPaolo Bonzini        return 1
98*09d653e6SPaolo Bonzini    fi
99*09d653e6SPaolo Bonzini}
100*09d653e6SPaolo Bonzini
101*09d653e6SPaolo Bonziniif [ -z "$TEST_DIR" ]; then
102*09d653e6SPaolo Bonzini        TEST_DIR=`pwd`/scratch
103*09d653e6SPaolo Bonzinifi
104*09d653e6SPaolo Bonzini
105*09d653e6SPaolo Bonziniif [ ! -e "$TEST_DIR" ]; then
106*09d653e6SPaolo Bonzini        mkdir "$TEST_DIR"
107*09d653e6SPaolo Bonzinifi
108*09d653e6SPaolo Bonzini
109*09d653e6SPaolo Bonzinidiff="diff -u"
110*09d653e6SPaolo Bonziniverbose=false
111*09d653e6SPaolo Bonzinidebug=false
112*09d653e6SPaolo Bonzinigroup=false
113*09d653e6SPaolo Bonzinixgroup=false
114*09d653e6SPaolo Bonziniimgopts=false
115*09d653e6SPaolo Bonzinishowme=false
116*09d653e6SPaolo Bonzinisortme=false
117*09d653e6SPaolo Bonziniexpunge=true
118*09d653e6SPaolo Bonzinihave_test_arg=false
119*09d653e6SPaolo Bonzinicachemode=false
120*09d653e6SPaolo Bonzini
121*09d653e6SPaolo Bonzinitmp="${TEST_DIR}"/$$
122*09d653e6SPaolo Bonzinirm -f $tmp.list $tmp.tmp $tmp.sed
123*09d653e6SPaolo Bonzini
124*09d653e6SPaolo Bonziniexport IMGFMT=raw
125*09d653e6SPaolo Bonziniexport IMGFMT_GENERIC=true
126*09d653e6SPaolo Bonziniexport IMGPROTO=file
127*09d653e6SPaolo Bonziniexport IMGOPTS=""
128*09d653e6SPaolo Bonziniexport CACHEMODE="writeback"
129*09d653e6SPaolo Bonziniexport QEMU_IO_OPTIONS=""
130*09d653e6SPaolo Bonziniexport QEMU_IO_OPTIONS_NO_FMT=""
131*09d653e6SPaolo Bonziniexport CACHEMODE_IS_DEFAULT=true
132*09d653e6SPaolo Bonziniexport QEMU_OPTIONS="-nodefaults -machine accel=qtest"
133*09d653e6SPaolo Bonziniexport VALGRIND_QEMU=
134*09d653e6SPaolo Bonziniexport IMGKEYSECRET=
135*09d653e6SPaolo Bonziniexport IMGOPTSSYNTAX=false
136*09d653e6SPaolo Bonzini
137*09d653e6SPaolo Bonzinifor r
138*09d653e6SPaolo Bonzinido
139*09d653e6SPaolo Bonzini
140*09d653e6SPaolo Bonzini    if $group
141*09d653e6SPaolo Bonzini    then
142*09d653e6SPaolo Bonzini        # arg after -g
143*09d653e6SPaolo Bonzini        group_list=`sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
144*09d653e6SPaolo Bonzinis/ .*//p
145*09d653e6SPaolo Bonzini}'`
146*09d653e6SPaolo Bonzini        if [ -z "$group_list" ]
147*09d653e6SPaolo Bonzini        then
148*09d653e6SPaolo Bonzini            echo "Group \"$r\" is empty or not defined?"
149*09d653e6SPaolo Bonzini            exit 1
150*09d653e6SPaolo Bonzini        fi
151*09d653e6SPaolo Bonzini        [ ! -s $tmp.list ] && touch $tmp.list
152*09d653e6SPaolo Bonzini        for t in $group_list
153*09d653e6SPaolo Bonzini        do
154*09d653e6SPaolo Bonzini            if grep -s "^$t\$" $tmp.list >/dev/null
155*09d653e6SPaolo Bonzini            then
156*09d653e6SPaolo Bonzini                :
157*09d653e6SPaolo Bonzini            else
158*09d653e6SPaolo Bonzini                echo "$t" >>$tmp.list
159*09d653e6SPaolo Bonzini            fi
160*09d653e6SPaolo Bonzini        done
161*09d653e6SPaolo Bonzini        group=false
162*09d653e6SPaolo Bonzini        continue
163*09d653e6SPaolo Bonzini
164*09d653e6SPaolo Bonzini    elif $xgroup
165*09d653e6SPaolo Bonzini    then
166*09d653e6SPaolo Bonzini        # arg after -x
167*09d653e6SPaolo Bonzini        # Populate $tmp.list with all tests
168*09d653e6SPaolo Bonzini        awk '/^[0-9]{3,}/ {print $1}' "${source_iotests}/group" > $tmp.list 2>/dev/null
169*09d653e6SPaolo Bonzini        group_list=`sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
170*09d653e6SPaolo Bonzinis/ .*//p
171*09d653e6SPaolo Bonzini}'`
172*09d653e6SPaolo Bonzini        if [ -z "$group_list" ]
173*09d653e6SPaolo Bonzini        then
174*09d653e6SPaolo Bonzini            echo "Group \"$r\" is empty or not defined?"
175*09d653e6SPaolo Bonzini            exit 1
176*09d653e6SPaolo Bonzini        fi
177*09d653e6SPaolo Bonzini        numsed=0
178*09d653e6SPaolo Bonzini        rm -f $tmp.sed
179*09d653e6SPaolo Bonzini        for t in $group_list
180*09d653e6SPaolo Bonzini        do
181*09d653e6SPaolo Bonzini            if [ $numsed -gt 100 ]
182*09d653e6SPaolo Bonzini            then
183*09d653e6SPaolo Bonzini                sed -f $tmp.sed <$tmp.list >$tmp.tmp
184*09d653e6SPaolo Bonzini                mv $tmp.tmp $tmp.list
185*09d653e6SPaolo Bonzini                numsed=0
186*09d653e6SPaolo Bonzini                rm -f $tmp.sed
187*09d653e6SPaolo Bonzini            fi
188*09d653e6SPaolo Bonzini            echo "/^$t\$/d" >>$tmp.sed
189*09d653e6SPaolo Bonzini            numsed=`expr $numsed + 1`
190*09d653e6SPaolo Bonzini        done
191*09d653e6SPaolo Bonzini        sed -f $tmp.sed <$tmp.list >$tmp.tmp
192*09d653e6SPaolo Bonzini        mv $tmp.tmp $tmp.list
193*09d653e6SPaolo Bonzini        xgroup=false
194*09d653e6SPaolo Bonzini        continue
195*09d653e6SPaolo Bonzini
196*09d653e6SPaolo Bonzini    elif $imgopts
197*09d653e6SPaolo Bonzini    then
198*09d653e6SPaolo Bonzini        IMGOPTS="$r"
199*09d653e6SPaolo Bonzini        imgopts=false
200*09d653e6SPaolo Bonzini        continue
201*09d653e6SPaolo Bonzini    elif $cachemode
202*09d653e6SPaolo Bonzini    then
203*09d653e6SPaolo Bonzini        CACHEMODE="$r"
204*09d653e6SPaolo Bonzini        CACHEMODE_IS_DEFAULT=false
205*09d653e6SPaolo Bonzini        cachemode=false
206*09d653e6SPaolo Bonzini        continue
207*09d653e6SPaolo Bonzini    fi
208*09d653e6SPaolo Bonzini
209*09d653e6SPaolo Bonzini    xpand=true
210*09d653e6SPaolo Bonzini    case "$r"
211*09d653e6SPaolo Bonzini    in
212*09d653e6SPaolo Bonzini
213*09d653e6SPaolo Bonzini        -\? | -h | --help)        # usage
214*09d653e6SPaolo Bonzini            echo "Usage: $0 [options] [testlist]"'
215*09d653e6SPaolo Bonzini
216*09d653e6SPaolo Bonzinicommon options
217*09d653e6SPaolo Bonzini    -v                  verbose
218*09d653e6SPaolo Bonzini    -d                  debug
219*09d653e6SPaolo Bonzini
220*09d653e6SPaolo Bonziniimage format options
221*09d653e6SPaolo Bonzini    -raw                test raw (default)
222*09d653e6SPaolo Bonzini    -bochs              test bochs
223*09d653e6SPaolo Bonzini    -cloop              test cloop
224*09d653e6SPaolo Bonzini    -parallels          test parallels
225*09d653e6SPaolo Bonzini    -qcow               test qcow
226*09d653e6SPaolo Bonzini    -qcow2              test qcow2
227*09d653e6SPaolo Bonzini    -qed                test qed
228*09d653e6SPaolo Bonzini    -vdi                test vdi
229*09d653e6SPaolo Bonzini    -vpc                test vpc
230*09d653e6SPaolo Bonzini    -vhdx               test vhdx
231*09d653e6SPaolo Bonzini    -vmdk               test vmdk
232*09d653e6SPaolo Bonzini    -luks               test luks
233*09d653e6SPaolo Bonzini
234*09d653e6SPaolo Bonziniimage protocol options
235*09d653e6SPaolo Bonzini    -file               test file (default)
236*09d653e6SPaolo Bonzini    -rbd                test rbd
237*09d653e6SPaolo Bonzini    -sheepdog           test sheepdog
238*09d653e6SPaolo Bonzini    -nbd                test nbd
239*09d653e6SPaolo Bonzini    -ssh                test ssh
240*09d653e6SPaolo Bonzini    -nfs                test nfs
241*09d653e6SPaolo Bonzini    -vxhs               test vxhs
242*09d653e6SPaolo Bonzini
243*09d653e6SPaolo Bonziniother options
244*09d653e6SPaolo Bonzini    -xdiff              graphical mode diff
245*09d653e6SPaolo Bonzini    -nocache            use O_DIRECT on backing file
246*09d653e6SPaolo Bonzini    -misalign           misalign memory allocations
247*09d653e6SPaolo Bonzini    -n                  show me, do not run tests
248*09d653e6SPaolo Bonzini    -o options          -o options to pass to qemu-img create/convert
249*09d653e6SPaolo Bonzini    -T                  output timestamps
250*09d653e6SPaolo Bonzini    -c mode             cache mode
251*09d653e6SPaolo Bonzini
252*09d653e6SPaolo Bonzinitestlist options
253*09d653e6SPaolo Bonzini    -g group[,group...]        include tests from these groups
254*09d653e6SPaolo Bonzini    -x group[,group...]        exclude tests from these groups
255*09d653e6SPaolo Bonzini    NNN                        include test NNN
256*09d653e6SPaolo Bonzini    NNN-NNN                    include test range (eg. 012-021)
257*09d653e6SPaolo Bonzini'
258*09d653e6SPaolo Bonzini            exit 0
259*09d653e6SPaolo Bonzini            ;;
260*09d653e6SPaolo Bonzini
261*09d653e6SPaolo Bonzini        -raw)
262*09d653e6SPaolo Bonzini            IMGFMT=raw
263*09d653e6SPaolo Bonzini            xpand=false
264*09d653e6SPaolo Bonzini            ;;
265*09d653e6SPaolo Bonzini
266*09d653e6SPaolo Bonzini        -bochs)
267*09d653e6SPaolo Bonzini            IMGFMT=bochs
268*09d653e6SPaolo Bonzini            IMGFMT_GENERIC=false
269*09d653e6SPaolo Bonzini            xpand=false
270*09d653e6SPaolo Bonzini            ;;
271*09d653e6SPaolo Bonzini
272*09d653e6SPaolo Bonzini        -cloop)
273*09d653e6SPaolo Bonzini            IMGFMT=cloop
274*09d653e6SPaolo Bonzini            IMGFMT_GENERIC=false
275*09d653e6SPaolo Bonzini            xpand=false
276*09d653e6SPaolo Bonzini            ;;
277*09d653e6SPaolo Bonzini
278*09d653e6SPaolo Bonzini        -parallels)
279*09d653e6SPaolo Bonzini            IMGFMT=parallels
280*09d653e6SPaolo Bonzini            IMGFMT_GENERIC=false
281*09d653e6SPaolo Bonzini            xpand=false
282*09d653e6SPaolo Bonzini            ;;
283*09d653e6SPaolo Bonzini
284*09d653e6SPaolo Bonzini        -qcow)
285*09d653e6SPaolo Bonzini            IMGFMT=qcow
286*09d653e6SPaolo Bonzini            xpand=false
287*09d653e6SPaolo Bonzini            ;;
288*09d653e6SPaolo Bonzini
289*09d653e6SPaolo Bonzini        -qcow2)
290*09d653e6SPaolo Bonzini            IMGFMT=qcow2
291*09d653e6SPaolo Bonzini            xpand=false
292*09d653e6SPaolo Bonzini            ;;
293*09d653e6SPaolo Bonzini
294*09d653e6SPaolo Bonzini        -luks)
295*09d653e6SPaolo Bonzini            IMGOPTSSYNTAX=true
296*09d653e6SPaolo Bonzini            IMGFMT=luks
297*09d653e6SPaolo Bonzini            IMGKEYSECRET=123456
298*09d653e6SPaolo Bonzini            xpand=false
299*09d653e6SPaolo Bonzini            ;;
300*09d653e6SPaolo Bonzini
301*09d653e6SPaolo Bonzini        -qed)
302*09d653e6SPaolo Bonzini            IMGFMT=qed
303*09d653e6SPaolo Bonzini            xpand=false
304*09d653e6SPaolo Bonzini            ;;
305*09d653e6SPaolo Bonzini
306*09d653e6SPaolo Bonzini        -vdi)
307*09d653e6SPaolo Bonzini            IMGFMT=vdi
308*09d653e6SPaolo Bonzini            xpand=false
309*09d653e6SPaolo Bonzini            ;;
310*09d653e6SPaolo Bonzini
311*09d653e6SPaolo Bonzini        -vmdk)
312*09d653e6SPaolo Bonzini            IMGFMT=vmdk
313*09d653e6SPaolo Bonzini            xpand=false
314*09d653e6SPaolo Bonzini            ;;
315*09d653e6SPaolo Bonzini
316*09d653e6SPaolo Bonzini        -vpc)
317*09d653e6SPaolo Bonzini            IMGFMT=vpc
318*09d653e6SPaolo Bonzini            xpand=false
319*09d653e6SPaolo Bonzini            ;;
320*09d653e6SPaolo Bonzini
321*09d653e6SPaolo Bonzini        -vhdx)
322*09d653e6SPaolo Bonzini            IMGFMT=vhdx
323*09d653e6SPaolo Bonzini            xpand=false
324*09d653e6SPaolo Bonzini            ;;
325*09d653e6SPaolo Bonzini
326*09d653e6SPaolo Bonzini        -file)
327*09d653e6SPaolo Bonzini            IMGPROTO=file
328*09d653e6SPaolo Bonzini            xpand=false
329*09d653e6SPaolo Bonzini            ;;
330*09d653e6SPaolo Bonzini
331*09d653e6SPaolo Bonzini        -rbd)
332*09d653e6SPaolo Bonzini            IMGPROTO=rbd
333*09d653e6SPaolo Bonzini            xpand=false
334*09d653e6SPaolo Bonzini            ;;
335*09d653e6SPaolo Bonzini
336*09d653e6SPaolo Bonzini        -sheepdog)
337*09d653e6SPaolo Bonzini            IMGPROTO=sheepdog
338*09d653e6SPaolo Bonzini            xpand=false
339*09d653e6SPaolo Bonzini            ;;
340*09d653e6SPaolo Bonzini
341*09d653e6SPaolo Bonzini        -nbd)
342*09d653e6SPaolo Bonzini            IMGPROTO=nbd
343*09d653e6SPaolo Bonzini            xpand=false
344*09d653e6SPaolo Bonzini            ;;
345*09d653e6SPaolo Bonzini
346*09d653e6SPaolo Bonzini        -vxhs)
347*09d653e6SPaolo Bonzini            IMGPROTO=vxhs
348*09d653e6SPaolo Bonzini            xpand=false
349*09d653e6SPaolo Bonzini            ;;
350*09d653e6SPaolo Bonzini
351*09d653e6SPaolo Bonzini        -ssh)
352*09d653e6SPaolo Bonzini            IMGPROTO=ssh
353*09d653e6SPaolo Bonzini            xpand=false
354*09d653e6SPaolo Bonzini            ;;
355*09d653e6SPaolo Bonzini
356*09d653e6SPaolo Bonzini        -nfs)
357*09d653e6SPaolo Bonzini            IMGPROTO=nfs
358*09d653e6SPaolo Bonzini            xpand=false
359*09d653e6SPaolo Bonzini            ;;
360*09d653e6SPaolo Bonzini
361*09d653e6SPaolo Bonzini        -nocache)
362*09d653e6SPaolo Bonzini            CACHEMODE="none"
363*09d653e6SPaolo Bonzini            CACHEMODE_IS_DEFAULT=false
364*09d653e6SPaolo Bonzini            xpand=false
365*09d653e6SPaolo Bonzini            ;;
366*09d653e6SPaolo Bonzini
367*09d653e6SPaolo Bonzini        -misalign)
368*09d653e6SPaolo Bonzini            QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --misalign"
369*09d653e6SPaolo Bonzini            xpand=false
370*09d653e6SPaolo Bonzini            ;;
371*09d653e6SPaolo Bonzini
372*09d653e6SPaolo Bonzini        -valgrind)
373*09d653e6SPaolo Bonzini            VALGRIND_QEMU='y'
374*09d653e6SPaolo Bonzini            xpand=false
375*09d653e6SPaolo Bonzini            ;;
376*09d653e6SPaolo Bonzini
377*09d653e6SPaolo Bonzini        -g)        # -g group ... pick from group file
378*09d653e6SPaolo Bonzini            group=true
379*09d653e6SPaolo Bonzini            xpand=false
380*09d653e6SPaolo Bonzini            ;;
381*09d653e6SPaolo Bonzini
382*09d653e6SPaolo Bonzini        -xdiff)        # graphical diff mode
383*09d653e6SPaolo Bonzini            xpand=false
384*09d653e6SPaolo Bonzini
385*09d653e6SPaolo Bonzini            if [ ! -z "$DISPLAY" ]
386*09d653e6SPaolo Bonzini            then
387*09d653e6SPaolo Bonzini                command -v xdiff >/dev/null 2>&1 && diff=xdiff
388*09d653e6SPaolo Bonzini                command -v gdiff >/dev/null 2>&1 && diff=gdiff
389*09d653e6SPaolo Bonzini                command -v tkdiff >/dev/null 2>&1 && diff=tkdiff
390*09d653e6SPaolo Bonzini                command -v xxdiff >/dev/null 2>&1 && diff=xxdiff
391*09d653e6SPaolo Bonzini            fi
392*09d653e6SPaolo Bonzini            ;;
393*09d653e6SPaolo Bonzini
394*09d653e6SPaolo Bonzini        -n)        # show me, don't do it
395*09d653e6SPaolo Bonzini            showme=true
396*09d653e6SPaolo Bonzini            xpand=false
397*09d653e6SPaolo Bonzini            ;;
398*09d653e6SPaolo Bonzini        -o)
399*09d653e6SPaolo Bonzini            imgopts=true
400*09d653e6SPaolo Bonzini            xpand=false
401*09d653e6SPaolo Bonzini            ;;
402*09d653e6SPaolo Bonzini        -c)
403*09d653e6SPaolo Bonzini            cachemode=true
404*09d653e6SPaolo Bonzini            xpand=false
405*09d653e6SPaolo Bonzini            ;;
406*09d653e6SPaolo Bonzini        -T)        # turn on timestamp output
407*09d653e6SPaolo Bonzini            timestamp=true
408*09d653e6SPaolo Bonzini            xpand=false
409*09d653e6SPaolo Bonzini            ;;
410*09d653e6SPaolo Bonzini
411*09d653e6SPaolo Bonzini        -v)
412*09d653e6SPaolo Bonzini            verbose=true
413*09d653e6SPaolo Bonzini            xpand=false
414*09d653e6SPaolo Bonzini            ;;
415*09d653e6SPaolo Bonzini        -d)
416*09d653e6SPaolo Bonzini            debug=true
417*09d653e6SPaolo Bonzini            xpand=false
418*09d653e6SPaolo Bonzini            ;;
419*09d653e6SPaolo Bonzini        -x)        # -x group ... exclude from group file
420*09d653e6SPaolo Bonzini            xgroup=true
421*09d653e6SPaolo Bonzini            xpand=false
422*09d653e6SPaolo Bonzini            ;;
423*09d653e6SPaolo Bonzini        '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
424*09d653e6SPaolo Bonzini            echo "No tests?"
425*09d653e6SPaolo Bonzini            status=1
426*09d653e6SPaolo Bonzini            exit $status
427*09d653e6SPaolo Bonzini            ;;
428*09d653e6SPaolo Bonzini
429*09d653e6SPaolo Bonzini        [0-9]*-[0-9]*)
430*09d653e6SPaolo Bonzini            eval `echo $r | sed -e 's/^/start=/' -e 's/-/ end=/'`
431*09d653e6SPaolo Bonzini            ;;
432*09d653e6SPaolo Bonzini
433*09d653e6SPaolo Bonzini        [0-9]*-)
434*09d653e6SPaolo Bonzini            eval `echo $r | sed -e 's/^/start=/' -e 's/-//'`
435*09d653e6SPaolo Bonzini            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/.* //'`
436*09d653e6SPaolo Bonzini            if [ -z "$end" ]
437*09d653e6SPaolo Bonzini            then
438*09d653e6SPaolo Bonzini                echo "No tests in range \"$r\"?"
439*09d653e6SPaolo Bonzini                status=1
440*09d653e6SPaolo Bonzini                exit $status
441*09d653e6SPaolo Bonzini            fi
442*09d653e6SPaolo Bonzini            ;;
443*09d653e6SPaolo Bonzini
444*09d653e6SPaolo Bonzini        *)
445*09d653e6SPaolo Bonzini            start=$r
446*09d653e6SPaolo Bonzini            end=$r
447*09d653e6SPaolo Bonzini            ;;
448*09d653e6SPaolo Bonzini
449*09d653e6SPaolo Bonzini    esac
450*09d653e6SPaolo Bonzini
451*09d653e6SPaolo Bonzini    # get rid of leading 0s as can be interpreted as octal
452*09d653e6SPaolo Bonzini    start=`echo $start | sed 's/^0*//'`
453*09d653e6SPaolo Bonzini    end=`echo $end | sed 's/^0*//'`
454*09d653e6SPaolo Bonzini
455*09d653e6SPaolo Bonzini    if $xpand
456*09d653e6SPaolo Bonzini    then
457*09d653e6SPaolo Bonzini        have_test_arg=true
458*09d653e6SPaolo Bonzini        awk </dev/null '
459*09d653e6SPaolo BonziniBEGIN        { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
460*09d653e6SPaolo Bonzini        | while read id
461*09d653e6SPaolo Bonzini        do
462*09d653e6SPaolo Bonzini            if grep -s "^$id " "$source_iotests/group" >/dev/null
463*09d653e6SPaolo Bonzini            then
464*09d653e6SPaolo Bonzini                # in group file ... OK
465*09d653e6SPaolo Bonzini                echo $id >>$tmp.list
466*09d653e6SPaolo Bonzini            else
467*09d653e6SPaolo Bonzini                if [ -f expunged ] && $expunge && egrep "^$id([         ]|\$)" expunged >/dev/null
468*09d653e6SPaolo Bonzini                then
469*09d653e6SPaolo Bonzini                    # expunged ... will be reported, but not run, later
470*09d653e6SPaolo Bonzini                    echo $id >>$tmp.list
471*09d653e6SPaolo Bonzini                else
472*09d653e6SPaolo Bonzini                    # oops
473*09d653e6SPaolo Bonzini                    if [ "$start" == "$end" -a "$id" == "$end" ]
474*09d653e6SPaolo Bonzini                    then
475*09d653e6SPaolo Bonzini                        echo "$id - unknown test"
476*09d653e6SPaolo Bonzini                        exit 1
477*09d653e6SPaolo Bonzini                    else
478*09d653e6SPaolo Bonzini                        echo "$id - unknown test, ignored"
479*09d653e6SPaolo Bonzini                    fi
480*09d653e6SPaolo Bonzini                fi
481*09d653e6SPaolo Bonzini            fi
482*09d653e6SPaolo Bonzini        done || exit 1
483*09d653e6SPaolo Bonzini    fi
484*09d653e6SPaolo Bonzini
485*09d653e6SPaolo Bonzinidone
486*09d653e6SPaolo Bonzini
487*09d653e6SPaolo Bonzini# Set qemu-io cache mode with $CACHEMODE we have
488*09d653e6SPaolo BonziniQEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --cache $CACHEMODE"
489*09d653e6SPaolo Bonzini
490*09d653e6SPaolo BonziniQEMU_IO_OPTIONS_NO_FMT="$QEMU_IO_OPTIONS"
491*09d653e6SPaolo Bonziniif [ "$IMGOPTSSYNTAX" != "true" ]; then
492*09d653e6SPaolo Bonzini    QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS -f $IMGFMT"
493*09d653e6SPaolo Bonzinifi
494*09d653e6SPaolo Bonzini
495*09d653e6SPaolo Bonzini# Set default options for qemu-img create -o if they were not specified
496*09d653e6SPaolo Bonziniif [ "$IMGFMT" == "qcow2" ] && ! (echo "$IMGOPTS" | grep "compat=" > /dev/null); then
497*09d653e6SPaolo Bonzini    IMGOPTS=$(_optstr_add "$IMGOPTS" "compat=1.1")
498*09d653e6SPaolo Bonzinifi
499*09d653e6SPaolo Bonziniif [ "$IMGFMT" == "luks" ] && ! (echo "$IMGOPTS" | grep "iter-time=" > /dev/null); then
500*09d653e6SPaolo Bonzini    IMGOPTS=$(_optstr_add "$IMGOPTS" "iter-time=10")
501*09d653e6SPaolo Bonzinifi
502*09d653e6SPaolo Bonzini
503*09d653e6SPaolo Bonziniif [ -z "$SAMPLE_IMG_DIR" ]; then
504*09d653e6SPaolo Bonzini        SAMPLE_IMG_DIR="$source_iotests/sample_images"
505*09d653e6SPaolo Bonzinifi
506*09d653e6SPaolo Bonzini
507*09d653e6SPaolo Bonziniexport TEST_DIR
508*09d653e6SPaolo Bonziniexport SAMPLE_IMG_DIR
509*09d653e6SPaolo Bonzini
510*09d653e6SPaolo Bonziniif [ -s $tmp.list ]
511*09d653e6SPaolo Bonzinithen
512*09d653e6SPaolo Bonzini    # found some valid test numbers ... this is good
513*09d653e6SPaolo Bonzini    :
514*09d653e6SPaolo Bonzinielse
515*09d653e6SPaolo Bonzini    if $have_test_arg
516*09d653e6SPaolo Bonzini    then
517*09d653e6SPaolo Bonzini        # had test numbers, but none in group file ... do nothing
518*09d653e6SPaolo Bonzini        touch $tmp.list
519*09d653e6SPaolo Bonzini    else
520*09d653e6SPaolo Bonzini        # no test numbers, do everything from group file
521*09d653e6SPaolo Bonzini        sed -n -e '/^[0-9][0-9][0-9]*/s/[         ].*//p' <"$source_iotests/group" >$tmp.list
522*09d653e6SPaolo Bonzini    fi
523*09d653e6SPaolo Bonzinifi
524*09d653e6SPaolo Bonzini
525*09d653e6SPaolo Bonzini# should be sort -n, but this did not work for Linux when this
526*09d653e6SPaolo Bonzini# was ported from IRIX
527*09d653e6SPaolo Bonzini#
528*09d653e6SPaolo Bonzinilist=`sort $tmp.list`
529*09d653e6SPaolo Bonzinirm -f $tmp.list $tmp.tmp $tmp.sed
530*09d653e6SPaolo Bonzini
531*09d653e6SPaolo Bonziniif [ -z "$QEMU_PROG" ]
532*09d653e6SPaolo Bonzinithen
533*09d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu" ]; then
534*09d653e6SPaolo Bonzini        export QEMU_PROG="$build_iotests/qemu"
535*09d653e6SPaolo Bonzini    elif [ -x "$build_root/$arch-softmmu/qemu-system-$arch" ]; then
536*09d653e6SPaolo Bonzini        export QEMU_PROG="$build_root/$arch-softmmu/qemu-system-$arch"
537*09d653e6SPaolo Bonzini    else
538*09d653e6SPaolo Bonzini        pushd "$build_root" > /dev/null
539*09d653e6SPaolo Bonzini        for binary in *-softmmu/qemu-system-*
540*09d653e6SPaolo Bonzini        do
541*09d653e6SPaolo Bonzini            if [ -x "$binary" ]
542*09d653e6SPaolo Bonzini            then
543*09d653e6SPaolo Bonzini                export QEMU_PROG="$build_root/$binary"
544*09d653e6SPaolo Bonzini                break
545*09d653e6SPaolo Bonzini            fi
546*09d653e6SPaolo Bonzini        done
547*09d653e6SPaolo Bonzini        popd > /dev/null
548*09d653e6SPaolo Bonzini        [ "$QEMU_PROG" = "" ] && _init_error "qemu not found"
549*09d653e6SPaolo Bonzini    fi
550*09d653e6SPaolo Bonzinifi
551*09d653e6SPaolo Bonziniexport QEMU_PROG=$(realpath -- "$(type -p "$QEMU_PROG")")
552*09d653e6SPaolo Bonzini
553*09d653e6SPaolo Bonziniif [ -z "$QEMU_IMG_PROG" ]; then
554*09d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-img" ]; then
555*09d653e6SPaolo Bonzini        export QEMU_IMG_PROG="$build_iotests/qemu-img"
556*09d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-img" ]; then
557*09d653e6SPaolo Bonzini        export QEMU_IMG_PROG="$build_root/qemu-img"
558*09d653e6SPaolo Bonzini    else
559*09d653e6SPaolo Bonzini        _init_error "qemu-img not found"
560*09d653e6SPaolo Bonzini    fi
561*09d653e6SPaolo Bonzinifi
562*09d653e6SPaolo Bonziniexport QEMU_IMG_PROG=$(realpath -- "$(type -p "$QEMU_IMG_PROG")")
563*09d653e6SPaolo Bonzini
564*09d653e6SPaolo Bonziniif [ -z "$QEMU_IO_PROG" ]; then
565*09d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-io" ]; then
566*09d653e6SPaolo Bonzini        export QEMU_IO_PROG="$build_iotests/qemu-io"
567*09d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-io" ]; then
568*09d653e6SPaolo Bonzini        export QEMU_IO_PROG="$build_root/qemu-io"
569*09d653e6SPaolo Bonzini    else
570*09d653e6SPaolo Bonzini        _init_error "qemu-io not found"
571*09d653e6SPaolo Bonzini    fi
572*09d653e6SPaolo Bonzinifi
573*09d653e6SPaolo Bonziniexport QEMU_IO_PROG=$(realpath -- "$(type -p "$QEMU_IO_PROG")")
574*09d653e6SPaolo Bonzini
575*09d653e6SPaolo Bonziniif [ -z $QEMU_NBD_PROG ]; then
576*09d653e6SPaolo Bonzini    if [ -x "$build_iotests/qemu-nbd" ]; then
577*09d653e6SPaolo Bonzini        export QEMU_NBD_PROG="$build_iotests/qemu-nbd"
578*09d653e6SPaolo Bonzini    elif [ -x "$build_root/qemu-nbd" ]; then
579*09d653e6SPaolo Bonzini        export QEMU_NBD_PROG="$build_root/qemu-nbd"
580*09d653e6SPaolo Bonzini    else
581*09d653e6SPaolo Bonzini        _init_error "qemu-nbd not found"
582*09d653e6SPaolo Bonzini    fi
583*09d653e6SPaolo Bonzinifi
584*09d653e6SPaolo Bonziniexport QEMU_NBD_PROG=$(realpath -- "$(type -p "$QEMU_NBD_PROG")")
585*09d653e6SPaolo Bonzini
586*09d653e6SPaolo Bonziniif [ -z "$QEMU_VXHS_PROG" ]; then
587*09d653e6SPaolo Bonzini  export QEMU_VXHS_PROG="`set_prog_path qnio_server`"
588*09d653e6SPaolo Bonzinifi
589*09d653e6SPaolo Bonzini
590*09d653e6SPaolo Bonziniif [ -x "$build_iotests/socket_scm_helper" ]
591*09d653e6SPaolo Bonzinithen
592*09d653e6SPaolo Bonzini    export SOCKET_SCM_HELPER="$build_iotests/socket_scm_helper"
593*09d653e6SPaolo Bonzinifi
594*09d653e6SPaolo Bonzini
595*09d653e6SPaolo Bonzinidefault_machine=$($QEMU_PROG -machine help | sed -n '/(default)/ s/ .*//p')
596*09d653e6SPaolo Bonzinidefault_alias_machine=$($QEMU_PROG -machine help | \
597*09d653e6SPaolo Bonzini   sed -n "/(alias of $default_machine)/ { s/ .*//p; q; }")
598*09d653e6SPaolo Bonziniif [[ "$default_alias_machine" ]]; then
599*09d653e6SPaolo Bonzini    default_machine="$default_alias_machine"
600*09d653e6SPaolo Bonzinifi
601*09d653e6SPaolo Bonzini
602*09d653e6SPaolo Bonziniexport QEMU_DEFAULT_MACHINE="$default_machine"
60389004368SKevin Wolf
60436bd4228SDaniel P. BerrangeTIMESTAMP_FILE=check.time-$IMGPROTO-$IMGFMT
60536bd4228SDaniel P. Berrange
6066bf19c94SChristoph Hellwig_wallclock()
6076bf19c94SChristoph Hellwig{
6089ee4b6f8SPaolo Bonzini    date "+%H %M %S" | awk '{ print $1*3600 + $2*60 + $3 }'
6096bf19c94SChristoph Hellwig}
6106bf19c94SChristoph Hellwig
6116bf19c94SChristoph Hellwig_timestamp()
6126bf19c94SChristoph Hellwig{
6136bf19c94SChristoph Hellwig    now=`date "+%T"`
614b43671f8SEric Blake    printf %s " [$now]"
6156bf19c94SChristoph Hellwig}
6166bf19c94SChristoph Hellwig
6176bf19c94SChristoph Hellwig_wrapup()
6186bf19c94SChristoph Hellwig{
6196bf19c94SChristoph Hellwig    if $showme
6206bf19c94SChristoph Hellwig    then
6216bf19c94SChristoph Hellwig        :
6226bf19c94SChristoph Hellwig    elif $needwrap
6236bf19c94SChristoph Hellwig    then
62436bd4228SDaniel P. Berrange        if [ -f $TIMESTAMP_FILE -a -f $tmp.time ]
6256bf19c94SChristoph Hellwig        then
62636bd4228SDaniel P. Berrange            cat $TIMESTAMP_FILE $tmp.time \
6279ee4b6f8SPaolo Bonzini            | awk '
6286bf19c94SChristoph Hellwig        { t[$1] = $2 }
6296bf19c94SChristoph HellwigEND        { if (NR > 0) {
6306bf19c94SChristoph Hellwig            for (i in t) print i " " t[i]
6316bf19c94SChristoph Hellwig          }
6326bf19c94SChristoph Hellwig        }' \
6336bf19c94SChristoph Hellwig            | sort -n >$tmp.out
63436bd4228SDaniel P. Berrange            mv $tmp.out $TIMESTAMP_FILE
6356bf19c94SChristoph Hellwig        fi
6366bf19c94SChristoph Hellwig
6376bf19c94SChristoph Hellwig        if [ -f $tmp.expunged ]
6386bf19c94SChristoph Hellwig        then
6396bf19c94SChristoph Hellwig            notrun=`wc -l <$tmp.expunged | sed -e 's/  *//g'`
6406bf19c94SChristoph Hellwig            try=`expr $try - $notrun`
6416bf19c94SChristoph Hellwig            list=`echo "$list" | sed -f $tmp.expunged`
6426bf19c94SChristoph Hellwig        fi
6436bf19c94SChristoph Hellwig
6446bf19c94SChristoph Hellwig        echo "" >>check.log
6456bf19c94SChristoph Hellwig        date >>check.log
6466bf19c94SChristoph Hellwig        echo $list | fmt | sed -e 's/^/    /' >>check.log
6476bf19c94SChristoph Hellwig        $interrupt && echo "Interrupted!" >>check.log
6486bf19c94SChristoph Hellwig
6496bf19c94SChristoph Hellwig        if [ ! -z "$notrun" ]
6506bf19c94SChristoph Hellwig        then
6516bf19c94SChristoph Hellwig            echo "Not run:$notrun"
6526bf19c94SChristoph Hellwig            echo "Not run:$notrun" >>check.log
6536bf19c94SChristoph Hellwig        fi
6546bf19c94SChristoph Hellwig        if [ ! -z "$n_bad" -a $n_bad != 0 ]
6556bf19c94SChristoph Hellwig        then
6566bf19c94SChristoph Hellwig            echo "Failures:$bad"
6576bf19c94SChristoph Hellwig            echo "Failed $n_bad of $try tests"
6586bf19c94SChristoph Hellwig            echo "Failures:$bad" | fmt >>check.log
6596bf19c94SChristoph Hellwig            echo "Failed $n_bad of $try tests" >>check.log
6606bf19c94SChristoph Hellwig        else
6616bf19c94SChristoph Hellwig            echo "Passed all $try tests"
6626bf19c94SChristoph Hellwig            echo "Passed all $try tests" >>check.log
6636bf19c94SChristoph Hellwig        fi
6646bf19c94SChristoph Hellwig        needwrap=false
6656bf19c94SChristoph Hellwig    fi
6666bf19c94SChristoph Hellwig
6670145b4e1SSascha Silbe    rm -f "${TEST_DIR}"/*.out "${TEST_DIR}"/*.err "${TEST_DIR}"/*.time
6680145b4e1SSascha Silbe    rm -f "${TEST_DIR}"/check.pid "${TEST_DIR}"/check.sts
6696bf19c94SChristoph Hellwig    rm -f $tmp.*
6706bf19c94SChristoph Hellwig}
6716bf19c94SChristoph Hellwig
6726bf19c94SChristoph Hellwigtrap "_wrapup; exit \$status" 0 1 2 3 15
6736bf19c94SChristoph Hellwig
67436bd4228SDaniel P. Berrange[ -f $TIMESTAMP_FILE ] || touch $TIMESTAMP_FILE
6756bf19c94SChristoph Hellwig
6766bf19c94SChristoph HellwigFULL_IMGFMT_DETAILS=`_full_imgfmt_details`
6776bf19c94SChristoph HellwigFULL_HOST_DETAILS=`_full_platform_details`
6786bf19c94SChristoph Hellwig
6796bf19c94SChristoph Hellwigcat <<EOF
680934659c4SMax ReitzQEMU          -- "$QEMU_PROG" $QEMU_OPTIONS
681934659c4SMax ReitzQEMU_IMG      -- "$QEMU_IMG_PROG" $QEMU_IMG_OPTIONS
682934659c4SMax ReitzQEMU_IO       -- "$QEMU_IO_PROG" $QEMU_IO_OPTIONS
683934659c4SMax ReitzQEMU_NBD      -- "$QEMU_NBD_PROG" $QEMU_NBD_OPTIONS
6846bf19c94SChristoph HellwigIMGFMT        -- $FULL_IMGFMT_DETAILS
685657c572aSCleber RosaIMGPROTO      -- $IMGPROTO
6866bf19c94SChristoph HellwigPLATFORM      -- $FULL_HOST_DETAILS
687b8aff7d6SFam ZhengTEST_DIR      -- $TEST_DIR
68830b005d9SWenchao XiaSOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER
6896bf19c94SChristoph Hellwig
6906bf19c94SChristoph HellwigEOF
6916bf19c94SChristoph Hellwig
6926bf19c94SChristoph Hellwigseq="check"
6936bf19c94SChristoph Hellwig
6946bf19c94SChristoph Hellwig[ -n "$TESTS_REMAINING_LOG" ] && echo $list > $TESTS_REMAINING_LOG
6956bf19c94SChristoph Hellwig
6966bf19c94SChristoph Hellwigfor seq in $list
6976bf19c94SChristoph Hellwigdo
6986bf19c94SChristoph Hellwig    err=false
699b43671f8SEric Blake    printf %s "$seq"
7006bf19c94SChristoph Hellwig    if [ -n "$TESTS_REMAINING_LOG" ] ; then
7016bf19c94SChristoph Hellwig        sed -e "s/$seq//" -e 's/  / /' -e 's/^ *//' $TESTS_REMAINING_LOG > $TESTS_REMAINING_LOG.tmp
7026bf19c94SChristoph Hellwig        mv $TESTS_REMAINING_LOG.tmp $TESTS_REMAINING_LOG
7036bf19c94SChristoph Hellwig        sync
7046bf19c94SChristoph Hellwig    fi
7056bf19c94SChristoph Hellwig
7066bf19c94SChristoph Hellwig    if $showme
7076bf19c94SChristoph Hellwig    then
7086bf19c94SChristoph Hellwig        echo
7096bf19c94SChristoph Hellwig        continue
7106bf19c94SChristoph Hellwig    elif [ -f expunged ] && $expunge && egrep "^$seq([         ]|\$)" expunged >/dev/null
7116bf19c94SChristoph Hellwig    then
7126bf19c94SChristoph Hellwig        echo " - expunged"
7136bf19c94SChristoph Hellwig        rm -f $seq.out.bad
7146bf19c94SChristoph Hellwig        echo "/^$seq\$/d" >>$tmp.expunged
715e8f8624dSMax Reitz    elif [ ! -f "$source_iotests/$seq" ]
7166bf19c94SChristoph Hellwig    then
7176bf19c94SChristoph Hellwig        echo " - no such test?"
7186bf19c94SChristoph Hellwig        echo "/^$seq\$/d" >>$tmp.expunged
7196bf19c94SChristoph Hellwig    else
7206bf19c94SChristoph Hellwig        # really going to try and run this one
7216bf19c94SChristoph Hellwig        #
7226bf19c94SChristoph Hellwig        rm -f $seq.out.bad
72336bd4228SDaniel P. Berrange        lasttime=`sed -n -e "/^$seq /s/.* //p" <$TIMESTAMP_FILE`
7246bf19c94SChristoph Hellwig        if [ "X$lasttime" != X ]; then
725b43671f8SEric Blake                printf %s " ${lasttime}s ..."
7266bf19c94SChristoph Hellwig        else
727b43671f8SEric Blake                printf "        "        # prettier output with timestamps.
7286bf19c94SChristoph Hellwig        fi
7296bf19c94SChristoph Hellwig        rm -f core $seq.notrun
7306bf19c94SChristoph Hellwig
7316bf19c94SChristoph Hellwig        start=`_wallclock`
732b43671f8SEric Blake        $timestamp && printf %s "        [$(date "+%T")]"
733ea81ca9dSMax Reitz
734ea81ca9dSMax Reitz        if [ "$(head -n 1 "$source_iotests/$seq")" == "#!/usr/bin/env python" ]; then
735ea81ca9dSMax Reitz            run_command="$PYTHON $seq"
736ea81ca9dSMax Reitz        else
737ea81ca9dSMax Reitz            run_command="./$seq"
738ea81ca9dSMax Reitz        fi
739e8f8624dSMax Reitz        export OUTPUT_DIR=$PWD
740aa4f592aSFam Zheng        if $debug; then
741aa4f592aSFam Zheng            (cd "$source_iotests";
742aa4f592aSFam Zheng            MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
743aa4f592aSFam Zheng                    $run_command -d 2>&1 | tee $tmp.out)
744aa4f592aSFam Zheng        else
745e8f8624dSMax Reitz            (cd "$source_iotests";
74604129606SStefan Hajnoczi            MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
747ea81ca9dSMax Reitz                    $run_command >$tmp.out 2>&1)
748aa4f592aSFam Zheng        fi
7496bf19c94SChristoph Hellwig        sts=$?
7506bf19c94SChristoph Hellwig        $timestamp && _timestamp
7516bf19c94SChristoph Hellwig        stop=`_wallclock`
7526bf19c94SChristoph Hellwig
7536bf19c94SChristoph Hellwig        if [ -f core ]
7546bf19c94SChristoph Hellwig        then
755b43671f8SEric Blake            printf " [dumped core]"
7566bf19c94SChristoph Hellwig            mv core $seq.core
7576bf19c94SChristoph Hellwig            err=true
7586bf19c94SChristoph Hellwig        fi
7596bf19c94SChristoph Hellwig
7606bf19c94SChristoph Hellwig        if [ -f $seq.notrun ]
7616bf19c94SChristoph Hellwig        then
762b43671f8SEric Blake            $timestamp || printf " [not run] "
763b43671f8SEric Blake            $timestamp && echo " [not run]" && printf %s "        $seq -- "
7646bf19c94SChristoph Hellwig            cat $seq.notrun
7656bf19c94SChristoph Hellwig            notrun="$notrun $seq"
7666bf19c94SChristoph Hellwig        else
7676bf19c94SChristoph Hellwig            if [ $sts -ne 0 ]
7686bf19c94SChristoph Hellwig            then
769b43671f8SEric Blake                printf %s " [failed, exit status $sts]"
7706bf19c94SChristoph Hellwig                err=true
7716bf19c94SChristoph Hellwig            fi
7728f94b077SKevin Wolf
773e8f8624dSMax Reitz            reference="$source_iotests/$seq.out"
774e166b414SBo Tu            reference_machine="$source_iotests/$seq.$QEMU_DEFAULT_MACHINE.out"
775e166b414SBo Tu            if [ -f "$reference_machine" ]; then
776e166b414SBo Tu                reference="$reference_machine"
777e166b414SBo Tu            fi
778e166b414SBo Tu
779217a0683SStefan Hajnoczi            reference_format="$source_iotests/$seq.out.$IMGFMT"
780217a0683SStefan Hajnoczi            if [ -f "$reference_format" ]; then
781217a0683SStefan Hajnoczi                reference="$reference_format"
782217a0683SStefan Hajnoczi            fi
783217a0683SStefan Hajnoczi
7843baa8449SFam Zheng            if [ "$CACHEMODE" = "none" ]; then
785e8f8624dSMax Reitz                [ -f "$source_iotests/$seq.out.nocache" ] && reference="$source_iotests/$seq.out.nocache"
7868f94b077SKevin Wolf            fi
7878f94b077SKevin Wolf
788e8f8624dSMax Reitz            if [ ! -f "$reference" ]
7896bf19c94SChristoph Hellwig            then
7906bf19c94SChristoph Hellwig                echo " - no qualified output"
7916bf19c94SChristoph Hellwig                err=true
7926bf19c94SChristoph Hellwig            else
793e8f8624dSMax Reitz                if diff -w "$reference" $tmp.out >/dev/null 2>&1
7946bf19c94SChristoph Hellwig                then
7956bf19c94SChristoph Hellwig                    echo ""
7966bf19c94SChristoph Hellwig                    if $err
7976bf19c94SChristoph Hellwig                    then
7986bf19c94SChristoph Hellwig                        :
7996bf19c94SChristoph Hellwig                    else
8006bf19c94SChristoph Hellwig                        echo "$seq `expr $stop - $start`" >>$tmp.time
8016bf19c94SChristoph Hellwig                    fi
8026bf19c94SChristoph Hellwig                else
8036bf19c94SChristoph Hellwig                    echo " - output mismatch (see $seq.out.bad)"
8046bf19c94SChristoph Hellwig                    mv $tmp.out $seq.out.bad
80593e53fb6SFam Zheng                    $diff -w "$reference" $(realpath $seq.out.bad)
8066bf19c94SChristoph Hellwig                    err=true
8076bf19c94SChristoph Hellwig                fi
8086bf19c94SChristoph Hellwig            fi
8096bf19c94SChristoph Hellwig        fi
8106bf19c94SChristoph Hellwig
8116bf19c94SChristoph Hellwig    fi
8126bf19c94SChristoph Hellwig
8136bf19c94SChristoph Hellwig    # come here for each test, except when $showme is true
8146bf19c94SChristoph Hellwig    #
8156bf19c94SChristoph Hellwig    if $err
8166bf19c94SChristoph Hellwig    then
8176bf19c94SChristoph Hellwig        bad="$bad $seq"
8186bf19c94SChristoph Hellwig        n_bad=`expr $n_bad + 1`
8196bf19c94SChristoph Hellwig        quick=false
8206bf19c94SChristoph Hellwig    fi
8216bf19c94SChristoph Hellwig    [ -f $seq.notrun ] || try=`expr $try + 1`
8226bf19c94SChristoph Hellwig
8236bf19c94SChristoph Hellwig    seq="after_$seq"
8246bf19c94SChristoph Hellwigdone
8256bf19c94SChristoph Hellwig
8266bf19c94SChristoph Hellwiginterrupt=false
8276bf19c94SChristoph Hellwigstatus=`expr $n_bad`
8286bf19c94SChristoph Hellwigexit
829