]> Git Repo - qemu.git/blob - tests/qemu-iotests/check
Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging
[qemu.git] / tests / qemu-iotests / check
1 #!/usr/bin/env bash
2 #
3 # Copyright (C) 2009 Red Hat, Inc.
4 # Copyright (c) 2000-2002,2006 Silicon Graphics, Inc.  All Rights Reserved.
5 #
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License as
8 # published by the Free Software Foundation.
9 #
10 # This program is distributed in the hope that it would be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 #
18 #
19 # Control script for QA
20 #
21
22 status=0
23 needwrap=true
24 try=0
25 n_bad=0
26 bad=""
27 notrun=""
28 casenotrun=""
29 interrupt=true
30 makecheck=false
31
32 _init_error()
33 {
34     echo "check: $1" >&2
35     exit 1
36 }
37
38 if [ -L "$0" ]
39 then
40     # called from the build tree
41     source_iotests=$(dirname "$(readlink "$0")")
42     if [ -z "$source_iotests" ]
43     then
44         _init_error "failed to obtain source tree name from check symlink"
45     fi
46     source_iotests=$(cd "$source_iotests"; pwd) || _init_error "failed to enter source tree"
47     build_iotests=$PWD
48 else
49     # called from the source tree
50     source_iotests=$PWD
51     # this may be an in-tree build (note that in the following code we may not
52     # assume that it truly is and have to test whether the build results
53     # actually exist)
54     build_iotests=$PWD
55 fi
56
57 build_root="$build_iotests/../.."
58
59 # we need common.env
60 if ! . "$build_iotests/common.env"
61 then
62     _init_error "failed to source common.env (make sure the qemu-iotests are run from tests/qemu-iotests in the build tree)"
63 fi
64
65 # we need common.config
66 if ! . "$source_iotests/common.config"
67 then
68     _init_error "failed to source common.config"
69 fi
70
71 _full_imgfmt_details()
72 {
73     if [ -n "$IMGOPTS" ]; then
74         echo "$IMGFMT ($IMGOPTS)"
75     else
76         echo "$IMGFMT"
77     fi
78 }
79
80 _full_platform_details()
81 {
82     os=$(uname -s)
83     host=$(hostname -s)
84     kernel=$(uname -r)
85     platform=$(uname -m)
86     echo "$os/$platform $host $kernel"
87 }
88
89 _full_env_details()
90 {
91     cat <<EOF
92 QEMU          -- "$QEMU_PROG" $QEMU_OPTIONS
93 QEMU_IMG      -- "$QEMU_IMG_PROG" $QEMU_IMG_OPTIONS
94 QEMU_IO       -- "$QEMU_IO_PROG" $QEMU_IO_OPTIONS
95 QEMU_NBD      -- "$QEMU_NBD_PROG" $QEMU_NBD_OPTIONS
96 IMGFMT        -- $FULL_IMGFMT_DETAILS
97 IMGPROTO      -- $IMGPROTO
98 PLATFORM      -- $FULL_HOST_DETAILS
99 TEST_DIR      -- $TEST_DIR
100 SOCK_DIR      -- $SOCK_DIR
101 SOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER
102
103 EOF
104 }
105
106 # $1 = prog to look for
107 set_prog_path()
108 {
109     p=$(command -v $1 2> /dev/null)
110     if [ -n "$p" -a -x "$p" ]; then
111         type -p "$p"
112     else
113         return 1
114     fi
115 }
116
117 if [ -z "$TEST_DIR" ]; then
118         TEST_DIR=$PWD/scratch
119 fi
120 mkdir -p "$TEST_DIR" || _init_error 'Failed to create TEST_DIR'
121
122 tmp_sock_dir=false
123 if [ -z "$SOCK_DIR" ]; then
124     SOCK_DIR=$(mktemp -d)
125     tmp_sock_dir=true
126 fi
127 mkdir -p "$SOCK_DIR" || _init_error 'Failed to create SOCK_DIR'
128
129 diff="diff -u"
130 verbose=false
131 debug=false
132 group=false
133 xgroup=false
134 imgopts=false
135 showme=false
136 sortme=false
137 expunge=true
138 have_test_arg=false
139 cachemode=false
140 aiomode=false
141
142 tmp="${TEST_DIR}"/$$
143 rm -f $tmp.list $tmp.tmp $tmp.sed
144
145 export IMGFMT=raw
146 export IMGFMT_GENERIC=true
147 export IMGPROTO=file
148 export IMGOPTS=""
149 export CACHEMODE="writeback"
150 export AIOMODE="threads"
151 export QEMU_IO_OPTIONS=""
152 export QEMU_IO_OPTIONS_NO_FMT=""
153 export CACHEMODE_IS_DEFAULT=true
154 export VALGRIND_QEMU=
155 export IMGKEYSECRET=
156 export IMGOPTSSYNTAX=false
157
158 # Save current tty settings, since an aborting qemu call may leave things
159 # screwed up
160 STTY_RESTORE=
161 if test -t 0; then
162     STTY_RESTORE=$(stty -g)
163 fi
164
165 for r
166 do
167
168     if $group
169     then
170         # arg after -g
171         group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
172 s/ .*//p
173 }')
174         if [ -z "$group_list" ]
175         then
176             echo "Group \"$r\" is empty or not defined?"
177             exit 1
178         fi
179         [ ! -s $tmp.list ] && touch $tmp.list
180         for t in $group_list
181         do
182             if grep -s "^$t\$" $tmp.list >/dev/null
183             then
184                 :
185             else
186                 echo "$t" >>$tmp.list
187             fi
188         done
189         group=false
190         continue
191
192     elif $xgroup
193     then
194         # arg after -x
195         # Populate $tmp.list with all tests
196         awk '/^[0-9]{3,}/ {print $1}' "${source_iotests}/group" > $tmp.list 2>/dev/null
197         group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
198 s/ .*//p
199 }')
200         if [ -z "$group_list" ]
201         then
202             echo "Group \"$r\" is empty or not defined?"
203             exit 1
204         fi
205         numsed=0
206         rm -f $tmp.sed
207         for t in $group_list
208         do
209             if [ $numsed -gt 100 ]
210             then
211                 sed -f $tmp.sed <$tmp.list >$tmp.tmp
212                 mv $tmp.tmp $tmp.list
213                 numsed=0
214                 rm -f $tmp.sed
215             fi
216             echo "/^$t\$/d" >>$tmp.sed
217             numsed=$(expr $numsed + 1)
218         done
219         sed -f $tmp.sed <$tmp.list >$tmp.tmp
220         mv $tmp.tmp $tmp.list
221         xgroup=false
222         continue
223
224     elif $imgopts
225     then
226         IMGOPTS="$r"
227         imgopts=false
228         continue
229     elif $cachemode
230     then
231         CACHEMODE="$r"
232         CACHEMODE_IS_DEFAULT=false
233         cachemode=false
234         continue
235     elif $aiomode
236     then
237         AIOMODE="$r"
238         aiomode=false
239         continue
240     fi
241
242     xpand=true
243     case "$r"
244     in
245
246         -\? | -h | --help)        # usage
247             echo "Usage: $0 [options] [testlist]"'
248
249 common options
250     -v                  verbose
251     -d                  debug
252
253 image format options
254     -raw                test raw (default)
255     -bochs              test bochs
256     -cloop              test cloop
257     -parallels          test parallels
258     -qcow               test qcow
259     -qcow2              test qcow2
260     -qed                test qed
261     -vdi                test vdi
262     -vpc                test vpc
263     -vhdx               test vhdx
264     -vmdk               test vmdk
265     -luks               test luks
266     -dmg                test dmg
267
268 image protocol options
269     -file               test file (default)
270     -rbd                test rbd
271     -sheepdog           test sheepdog
272     -nbd                test nbd
273     -ssh                test ssh
274     -nfs                test nfs
275     -vxhs               test vxhs
276
277 other options
278     -xdiff              graphical mode diff
279     -nocache            use O_DIRECT on backing file
280     -misalign           misalign memory allocations
281     -n                  show me, do not run tests
282     -o options          -o options to pass to qemu-img create/convert
283     -c mode             cache mode
284     -i mode             AIO mode
285     -makecheck          pretty print output for make check
286
287 testlist options
288     -g group[,group...]        include tests from these groups
289     -x group[,group...]        exclude tests from these groups
290     NNN                        include test NNN
291     NNN-NNN                    include test range (eg. 012-021)
292 '
293             exit 0
294             ;;
295
296         -raw)
297             IMGFMT=raw
298             xpand=false
299             ;;
300
301         -bochs)
302             IMGFMT=bochs
303             IMGFMT_GENERIC=false
304             xpand=false
305             ;;
306
307         -cloop)
308             IMGFMT=cloop
309             IMGFMT_GENERIC=false
310             xpand=false
311             ;;
312
313         -parallels)
314             IMGFMT=parallels
315             xpand=false
316             ;;
317
318         -qcow)
319             IMGFMT=qcow
320             xpand=false
321             ;;
322
323         -qcow2)
324             IMGFMT=qcow2
325             xpand=false
326             ;;
327
328         -luks)
329             IMGOPTSSYNTAX=true
330             IMGFMT=luks
331             IMGKEYSECRET=123456
332             xpand=false
333             ;;
334
335         -dmg)
336             IMGFMT=dmg
337             IMGFMT_GENERIC=false
338             xpand=false
339             ;;
340
341         -qed)
342             IMGFMT=qed
343             xpand=false
344             ;;
345
346         -vdi)
347             IMGFMT=vdi
348             xpand=false
349             ;;
350
351         -vmdk)
352             IMGFMT=vmdk
353             xpand=false
354             ;;
355
356         -vpc)
357             IMGFMT=vpc
358             xpand=false
359             ;;
360
361         -vhdx)
362             IMGFMT=vhdx
363             xpand=false
364             ;;
365
366         -file)
367             IMGPROTO=file
368             xpand=false
369             ;;
370
371         -rbd)
372             IMGPROTO=rbd
373             xpand=false
374             ;;
375
376         -sheepdog)
377             IMGPROTO=sheepdog
378             xpand=false
379             ;;
380
381         -nbd)
382             IMGPROTO=nbd
383             xpand=false
384             ;;
385
386         -vxhs)
387             IMGPROTO=vxhs
388             xpand=false
389             ;;
390
391         -ssh)
392             IMGPROTO=ssh
393             xpand=false
394             ;;
395
396         -nfs)
397             IMGPROTO=nfs
398             xpand=false
399             ;;
400
401         -nocache)
402             CACHEMODE="none"
403             CACHEMODE_IS_DEFAULT=false
404             xpand=false
405             ;;
406
407         -misalign)
408             QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --misalign"
409             xpand=false
410             ;;
411
412         -valgrind)
413             VALGRIND_QEMU='y'
414             xpand=false
415             ;;
416
417         -g)        # -g group ... pick from group file
418             group=true
419             xpand=false
420             ;;
421
422         -xdiff)        # graphical diff mode
423             xpand=false
424
425             if [ ! -z "$DISPLAY" ]
426             then
427                 command -v xdiff >/dev/null 2>&1 && diff=xdiff
428                 command -v gdiff >/dev/null 2>&1 && diff=gdiff
429                 command -v tkdiff >/dev/null 2>&1 && diff=tkdiff
430                 command -v xxdiff >/dev/null 2>&1 && diff=xxdiff
431             fi
432             ;;
433         -makecheck)   # makecheck friendly output
434             makecheck=true
435             xpand=false
436             ;;
437         -n)        # show me, don't do it
438             showme=true
439             xpand=false
440             ;;
441         -o)
442             imgopts=true
443             xpand=false
444             ;;
445         -c)
446             cachemode=true
447             xpand=false
448             ;;
449         -i)
450             aiomode=true
451             xpand=false
452             ;;
453         -T)        # deprecated timestamp option
454             xpand=false
455             ;;
456         -v)
457             verbose=true
458             xpand=false
459             ;;
460         -d)
461             debug=true
462             xpand=false
463             ;;
464         -x)        # -x group ... exclude from group file
465             xgroup=true
466             xpand=false
467             ;;
468         '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
469             echo "No tests?"
470             status=1
471             exit $status
472             ;;
473
474         [0-9]*-[0-9]*)
475             eval $(echo $r | sed -e 's/^/start=/' -e 's/-/ end=/')
476             ;;
477
478         [0-9]*-)
479             eval $(echo $r | sed -e 's/^/start=/' -e 's/-//')
480             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/.* //')
481             if [ -z "$end" ]
482             then
483                 echo "No tests in range \"$r\"?"
484                 status=1
485                 exit $status
486             fi
487             ;;
488
489         *)
490             start=$r
491             end=$r
492             ;;
493
494     esac
495
496     # get rid of leading 0s as can be interpreted as octal
497     start=$(echo $start | sed 's/^0*//')
498     end=$(echo $end | sed 's/^0*//')
499
500     if $xpand
501     then
502         have_test_arg=true
503         awk </dev/null '
504 BEGIN        { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
505         | while read id
506         do
507             if grep -s "^$id\( \|\$\)" "$source_iotests/group" >/dev/null
508             then
509                 # in group file ... OK
510                 echo $id >>$tmp.list
511             else
512                 if [ -f expunged ] && $expunge && egrep "^$id([         ]|\$)" expunged >/dev/null
513                 then
514                     # expunged ... will be reported, but not run, later
515                     echo $id >>$tmp.list
516                 else
517                     # oops
518                     if [ "$start" == "$end" -a "$id" == "$end" ]
519                     then
520                         echo "$id - unknown test"
521                         exit 1
522                     else
523                         echo "$id - unknown test, ignored"
524                     fi
525                 fi
526             fi
527         done || exit 1
528     fi
529
530 done
531
532 # Set qemu-io cache mode with $CACHEMODE we have
533 QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --cache $CACHEMODE"
534 # Set qemu-io aio mode with $AIOMODE we have
535 QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --aio $AIOMODE"
536
537 QEMU_IO_OPTIONS_NO_FMT="$QEMU_IO_OPTIONS"
538 if [ "$IMGOPTSSYNTAX" != "true" ]; then
539     QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS -f $IMGFMT"
540 fi
541
542 # Set default options for qemu-img create -o if they were not specified
543 if [ "$IMGFMT" == "qcow2" ] && ! (echo "$IMGOPTS" | grep "compat=" > /dev/null); then
544     IMGOPTS=$(_optstr_add "$IMGOPTS" "compat=1.1")
545 fi
546 if [ "$IMGFMT" == "luks" ] && ! (echo "$IMGOPTS" | grep "iter-time=" > /dev/null); then
547     IMGOPTS=$(_optstr_add "$IMGOPTS" "iter-time=10")
548 fi
549
550 if [ -z "$SAMPLE_IMG_DIR" ]; then
551         SAMPLE_IMG_DIR="$source_iotests/sample_images"
552 fi
553
554 export TEST_DIR
555 export SOCK_DIR
556 export SAMPLE_IMG_DIR
557
558 if [ -s $tmp.list ]
559 then
560     # found some valid test numbers ... this is good
561     :
562 else
563     if $have_test_arg
564     then
565         # had test numbers, but none in group file ... do nothing
566         touch $tmp.list
567     else
568         # no test numbers, do everything from group file
569         sed -n -e '/^[0-9][0-9][0-9]*/s/^\([0-9]*\).*/\1/p' <"$source_iotests/group" >$tmp.list
570     fi
571 fi
572
573 # should be sort -n, but this did not work for Linux when this
574 # was ported from IRIX
575 #
576 list=$(sort $tmp.list)
577 rm -f $tmp.list $tmp.tmp $tmp.sed
578
579 if [ -z "$QEMU_PROG" ]
580 then
581     if [ -x "$build_iotests/qemu" ]; then
582         export QEMU_PROG="$build_iotests/qemu"
583     elif [ -x "$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}" ]; then
584         export QEMU_PROG="$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}"
585     else
586         pushd "$build_root" > /dev/null
587         for binary in *-softmmu/qemu-system-*
588         do
589             if [ -x "$binary" ]
590             then
591                 export QEMU_PROG="$build_root/$binary"
592                 break
593             fi
594         done
595         popd > /dev/null
596         [ "$QEMU_PROG" = "" ] && _init_error "qemu not found"
597     fi
598 fi
599 export QEMU_PROG="$(type -p "$QEMU_PROG")"
600
601 case "$QEMU_PROG" in
602     *qemu-system-arm|*qemu-system-aarch64)
603         export QEMU_OPTIONS="-nodefaults -display none -machine virt -accel qtest"
604         ;;
605     *qemu-system-tricore)
606         export QEMU_OPTIONS="-nodefaults -display none -machine tricore_testboard -accel qtest"
607         ;;
608     *)
609         export QEMU_OPTIONS="-nodefaults -display none -accel qtest"
610         ;;
611 esac
612
613 if [ -z "$QEMU_IMG_PROG" ]; then
614     if [ -x "$build_iotests/qemu-img" ]; then
615         export QEMU_IMG_PROG="$build_iotests/qemu-img"
616     elif [ -x "$build_root/qemu-img" ]; then
617         export QEMU_IMG_PROG="$build_root/qemu-img"
618     else
619         _init_error "qemu-img not found"
620     fi
621 fi
622 export QEMU_IMG_PROG="$(type -p "$QEMU_IMG_PROG")"
623
624 if [ -z "$QEMU_IO_PROG" ]; then
625     if [ -x "$build_iotests/qemu-io" ]; then
626         export QEMU_IO_PROG="$build_iotests/qemu-io"
627     elif [ -x "$build_root/qemu-io" ]; then
628         export QEMU_IO_PROG="$build_root/qemu-io"
629     else
630         _init_error "qemu-io not found"
631     fi
632 fi
633 export QEMU_IO_PROG="$(type -p "$QEMU_IO_PROG")"
634
635 if [ -z $QEMU_NBD_PROG ]; then
636     if [ -x "$build_iotests/qemu-nbd" ]; then
637         export QEMU_NBD_PROG="$build_iotests/qemu-nbd"
638     elif [ -x "$build_root/qemu-nbd" ]; then
639         export QEMU_NBD_PROG="$build_root/qemu-nbd"
640     else
641         _init_error "qemu-nbd not found"
642     fi
643 fi
644 export QEMU_NBD_PROG="$(type -p "$QEMU_NBD_PROG")"
645
646 if [ -z "$QEMU_VXHS_PROG" ]; then
647     export QEMU_VXHS_PROG="$(set_prog_path qnio_server)"
648 fi
649
650 if [ -x "$build_iotests/socket_scm_helper" ]
651 then
652     export SOCKET_SCM_HELPER="$build_iotests/socket_scm_helper"
653 fi
654
655 python_usable=false
656 if $PYTHON -c 'import sys; sys.exit(0 if sys.version_info >= (3,6) else 1)'
657 then
658     # Our python framework also requires virtio-blk
659     if "$QEMU_PROG" -M none -device help | grep -q virtio-blk >/dev/null 2>&1
660     then
661         python_usable=true
662     else
663         python_unusable_because="Missing virtio-blk in QEMU binary"
664     fi
665 else
666     python_unusable_because="Unsupported Python version"
667 fi
668
669 default_machine=$($QEMU_PROG -machine help | sed -n '/(default)/ s/ .*//p')
670 default_alias_machine=$($QEMU_PROG -machine help | \
671    sed -n "/(alias of $default_machine)/ { s/ .*//p; q; }")
672 if [[ "$default_alias_machine" ]]; then
673     default_machine="$default_alias_machine"
674 fi
675
676 export QEMU_DEFAULT_MACHINE="$default_machine"
677
678 TIMESTAMP_FILE=check.time-$IMGPROTO-$IMGFMT
679
680 _wallclock()
681 {
682     date "+%H %M %S" | awk '{ print $1*3600 + $2*60 + $3 }'
683 }
684
685 _wrapup()
686 {
687     if $showme
688     then
689         :
690     elif $needwrap
691     then
692         if [ -f $TIMESTAMP_FILE -a -f $tmp.time ]
693         then
694             cat $TIMESTAMP_FILE $tmp.time \
695             | awk '
696         { t[$1] = $2 }
697 END        { if (NR > 0) {
698             for (i in t) print i " " t[i]
699           }
700         }' \
701             | sort -n >$tmp.out
702             mv $tmp.out $TIMESTAMP_FILE
703         fi
704
705         if [ -f $tmp.expunged ]
706         then
707             notrun=$(wc -l <$tmp.expunged | sed -e 's/  *//g')
708             try=$(expr $try - $notrun)
709             list=$(echo "$list" | sed -f $tmp.expunged)
710         fi
711
712         echo "" >>check.log
713         date >>check.log
714         echo $list | fmt | sed -e 's/^/    /' >>check.log
715         $interrupt && echo "Interrupted!" >>check.log
716
717         if [ ! -z "$notrun" ]
718         then
719             echo "Not run:$notrun"
720             echo "Not run:$notrun" >>check.log
721         fi
722         if [ ! -z "$casenotrun" ]
723         then
724             echo "Some cases not run in:$casenotrun"
725             echo "Some cases not run in:$casenotrun" >>check.log
726         fi
727         if [ ! -z "$n_bad" -a $n_bad != 0 ]
728         then
729             echo "Failures:$bad"
730             echo "Failed $n_bad of $try iotests"
731             echo "Failures:$bad" | fmt >>check.log
732             echo "Failed $n_bad of $try iotests" >>check.log
733         else
734             echo "Passed all $try iotests"
735             echo "Passed all $try iotests" >>check.log
736         fi
737         needwrap=false
738     fi
739
740     if test -n "$STTY_RESTORE"; then
741         stty $STTY_RESTORE
742     fi
743     rm -f "${TEST_DIR}"/*.out "${TEST_DIR}"/*.err "${TEST_DIR}"/*.time
744     rm -f "${TEST_DIR}"/check.pid "${TEST_DIR}"/check.sts
745     rm -f $tmp.*
746
747     if $tmp_sock_dir
748     then
749         rm -rf "$SOCK_DIR"
750     fi
751 }
752
753 trap "_wrapup; exit \$status" 0 1 2 3 15
754
755 # Report the test start and results. For makecheck we want to pretty
756 # print the whole report at the end of the execution.
757 # args: $seq, $starttime, $lasttime
758 _report_test_start()
759 {
760     if ! $makecheck; then
761         if [ -n "$3" ]; then
762             local lasttime=" (last: $3s)"
763         fi
764         printf "%-8s %-10s [%s]            %4s%-14s\r" "$1" "..." "$2" "..." "$lasttime"
765     fi
766 }
767 # args:$seq $status $starttime $lasttime $thistime $details
768 _report_test_result()
769 {
770     local status lasttime thistime
771     if $makecheck; then
772         if [ -n "$2" ] && [ "$2" != "pass" ]; then
773             status=" [$2]"
774         fi
775         printf "  TEST    iotest-$IMGFMT: %s%s\n" "$1" "$status"
776         return
777     fi
778
779     if [ -n "$4" ]; then
780         lasttime=" (last: $4s)"
781     fi
782     if [ -n "$5" ]; then
783         thistime=" $5s"
784     fi
785     case "$2" in
786         "pass")     status=$(printf "\e[32m%-10s\e[0m" "$2") ;;
787         "fail")     status=$(printf "\e[1m\e[31m%-10s\e[0m" "$2") ;;
788         "not run")  status=$(printf "\e[33m%-10s\e[0m" "$2") ;;
789         *)          status=$(printf "%-10s" "$2") ;;
790     esac
791
792     printf "%-8s %s [%s] [%s] %4s%-14s %s\n" "$1" "$status" "$3" "$(date '+%T')" "$thistime" "$lasttime" "$6"
793 }
794
795 [ -f $TIMESTAMP_FILE ] || touch $TIMESTAMP_FILE
796
797 FULL_IMGFMT_DETAILS=$(_full_imgfmt_details)
798 FULL_HOST_DETAILS=$(_full_platform_details)
799
800 if ! $makecheck; then
801     _full_env_details
802 fi
803
804 seq="check"
805
806 [ -n "$TESTS_REMAINING_LOG" ] && echo $list > $TESTS_REMAINING_LOG
807
808 for seq in $list
809 do
810     err=false       # error flag
811     printdiff=false # show diff to reference output?
812     status=""       # test result summary
813     results=""      # test result details
814     thistime=""     # time the test took
815
816     if [ -n "$TESTS_REMAINING_LOG" ] ; then
817         sed -e "s/$seq//" -e 's/  / /' -e 's/^ *//' $TESTS_REMAINING_LOG > $TESTS_REMAINING_LOG.tmp
818         mv $TESTS_REMAINING_LOG.tmp $TESTS_REMAINING_LOG
819         sync
820     fi
821
822     lasttime=$(sed -n -e "/^$seq /s/.* //p" <$TIMESTAMP_FILE)
823     starttime=$(date "+%T")
824     _report_test_start $seq $starttime $lasttime
825
826     if $showme
827     then
828         status="not run"
829     elif [ -f expunged ] && $expunge && egrep "^$seq([         ]|\$)" expunged >/dev/null
830     then
831         status="not run"
832         results="expunged"
833         rm -f $seq.out.bad
834         echo "/^$seq\$/d" >>$tmp.expunged
835     elif [ ! -f "$source_iotests/$seq" ]
836     then
837         status="not run"
838         results="no such test?"
839         echo "/^$seq\$/d" >>$tmp.expunged
840     else
841         # really going to try and run this one
842         #
843         rm -f $seq.out.bad
844         rm -f core $seq.notrun
845         rm -f $seq.casenotrun
846
847         start=$(_wallclock)
848
849         if [ "$(head -n 1 "$source_iotests/$seq")" == "#!/usr/bin/env python3" ]; then
850             if $python_usable; then
851                 run_command="$PYTHON $seq"
852             else
853                 run_command="false"
854                 echo "$python_unusable_because" > $seq.notrun
855             fi
856         else
857             run_command="./$seq"
858         fi
859         export OUTPUT_DIR=$PWD
860         if $debug; then
861             (cd "$source_iotests";
862             MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
863                     $run_command -d 2>&1 | tee $tmp.out)
864         else
865             (cd "$source_iotests";
866             MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \
867                     $run_command >$tmp.out 2>&1)
868         fi
869         sts=$?
870         stop=$(_wallclock)
871
872         if [ -f core ]
873         then
874             mv core $seq.core
875             status="fail"
876             results="[dumped core] $seq.core"
877             err=true
878         fi
879
880         if [ -f $seq.notrun ]
881         then
882             # overwrites timestamp output
883             status="not run"
884             results="$(cat $seq.notrun)"
885         else
886             if [ $sts -ne 0 ]
887             then
888                 status="fail"
889                 results=$(printf %s "[failed, exit status $sts]")
890                 err=true
891             fi
892
893             reference="$source_iotests/$seq.out"
894             reference_machine="$source_iotests/$seq.$QEMU_DEFAULT_MACHINE.out"
895             if [ -f "$reference_machine" ]; then
896                 reference="$reference_machine"
897             fi
898
899             reference_format="$source_iotests/$seq.out.$IMGFMT"
900             if [ -f "$reference_format" ]; then
901                 reference="$reference_format"
902             fi
903
904             if [ "$CACHEMODE" = "none" ]; then
905                 [ -f "$source_iotests/$seq.out.nocache" ] && reference="$source_iotests/$seq.out.nocache"
906             fi
907
908             if [ ! -f "$reference" ]
909             then
910                 status="fail"
911                 results="no qualified output"
912                 err=true
913             else
914                 if diff -w "$reference" $tmp.out >/dev/null 2>&1
915                 then
916                     if ! $err; then
917                         status="pass"
918                         thistime=$(expr $stop - $start)
919                         echo "$seq $thistime" >>$tmp.time
920                     fi
921                 else
922                     mv $tmp.out $seq.out.bad
923                     status="fail"
924                     results="output mismatch (see $seq.out.bad)"
925                     printdiff=true
926                     err=true
927                 fi
928             fi
929         fi
930         if [ -f $seq.casenotrun ]
931         then
932             cat $seq.casenotrun
933             casenotrun="$casenotrun $seq"
934         fi
935     fi
936
937     # come here for each test, except when $showme is true
938     #
939     _report_test_result $seq "$status" "$starttime" "$lasttime" "$thistime" "$results"
940     case "$status" in
941         "pass")
942             try=$(expr $try + 1)
943             ;;
944         "fail")
945             try=$(expr $try + 1)
946             if $makecheck; then
947                 _full_env_details
948             fi
949             if $printdiff; then
950                 $diff -w "$reference" "$PWD"/$seq.out.bad
951             fi
952             bad="$bad $seq"
953             n_bad=$(expr $n_bad + 1)
954             quick=false
955             ;;
956         "not run")
957             notrun="$notrun $seq"
958             ;;
959     esac
960
961     seq="after_$seq"
962 done
963
964 interrupt=false
965 status=$(expr $n_bad)
966 exit
This page took 0.078156 seconds and 4 git commands to generate.