| 
									
										
										
										
											2019-03-07 15:58:38 +01:00
										 |  |  | #!/usr/bin/env bash | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | # | 
					
						
							|  |  |  | # Copyright (C) 2009 Red Hat, Inc. | 
					
						
							|  |  |  | # Copyright (c) 2000-2002,2006 Silicon Graphics, Inc.  All Rights Reserved. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  | # modify it under the terms of the GNU General Public License as | 
					
						
							|  |  |  | # published by the Free Software Foundation. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This program is distributed in the hope that it would be useful, | 
					
						
							|  |  |  | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | # GNU General Public License for more details. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # You should have received a copy of the GNU General Public License | 
					
						
							| 
									
										
										
										
											2009-07-16 19:26:54 +02:00
										 |  |  | # along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | # | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Control script for QA | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | status=0 | 
					
						
							|  |  |  | needwrap=true | 
					
						
							|  |  |  | try=0 | 
					
						
							|  |  |  | n_bad=0 | 
					
						
							|  |  |  | bad="" | 
					
						
							|  |  |  | notrun="" | 
					
						
							| 
									
										
										
										
											2019-03-07 16:33:59 +03:00
										 |  |  | casenotrun="" | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | interrupt=true | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  | makecheck=false | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-24 23:24:55 +02:00
										 |  |  | _init_error() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:58 +02:00
										 |  |  |     echo "check: $1" >&2 | 
					
						
							| 
									
										
										
										
											2014-05-24 23:24:55 +02:00
										 |  |  |     exit 1 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [ -L "$0" ] | 
					
						
							|  |  |  | then | 
					
						
							|  |  |  |     # called from the build tree | 
					
						
							|  |  |  |     source_iotests=$(dirname "$(readlink "$0")") | 
					
						
							|  |  |  |     if [ -z "$source_iotests" ] | 
					
						
							|  |  |  |     then | 
					
						
							|  |  |  |         _init_error "failed to obtain source tree name from check symlink" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |     source_iotests=$(cd "$source_iotests"; pwd) || _init_error "failed to enter source tree" | 
					
						
							|  |  |  |     build_iotests=$PWD | 
					
						
							|  |  |  | else | 
					
						
							|  |  |  |     # called from the source tree | 
					
						
							|  |  |  |     source_iotests=$PWD | 
					
						
							|  |  |  |     # this may be an in-tree build (note that in the following code we may not | 
					
						
							|  |  |  |     # assume that it truly is and have to test whether the build results | 
					
						
							|  |  |  |     # actually exist) | 
					
						
							|  |  |  |     build_iotests=$PWD | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | build_root="$build_iotests/../.." | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-24 23:24:57 +02:00
										 |  |  | # we need common.env | 
					
						
							|  |  |  | if ! . "$build_iotests/common.env" | 
					
						
							|  |  |  | then | 
					
						
							|  |  |  |     _init_error "failed to source common.env (make sure the qemu-iotests are run from tests/qemu-iotests in the build tree)" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | # we need common.config | 
					
						
							| 
									
										
										
										
											2014-05-24 23:24:55 +02:00
										 |  |  | if ! . "$source_iotests/common.config" | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | then | 
					
						
							| 
									
										
										
										
											2014-05-24 23:24:55 +02:00
										 |  |  |     _init_error "failed to source common.config" | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | _full_imgfmt_details() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if [ -n "$IMGOPTS" ]; then | 
					
						
							|  |  |  |         echo "$IMGFMT ($IMGOPTS)" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         echo "$IMGFMT" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _full_platform_details() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  |     os=$(uname -s) | 
					
						
							|  |  |  |     host=$(hostname -s) | 
					
						
							|  |  |  |     kernel=$(uname -r) | 
					
						
							|  |  |  |     platform=$(uname -m) | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |     echo "$os/$platform $host $kernel" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  | _full_env_details() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cat <<EOF | 
					
						
							|  |  |  | QEMU          -- "$QEMU_PROG" $QEMU_OPTIONS | 
					
						
							|  |  |  | QEMU_IMG      -- "$QEMU_IMG_PROG" $QEMU_IMG_OPTIONS | 
					
						
							|  |  |  | QEMU_IO       -- "$QEMU_IO_PROG" $QEMU_IO_OPTIONS | 
					
						
							|  |  |  | QEMU_NBD      -- "$QEMU_NBD_PROG" $QEMU_NBD_OPTIONS | 
					
						
							|  |  |  | IMGFMT        -- $FULL_IMGFMT_DETAILS | 
					
						
							|  |  |  | IMGPROTO      -- $IMGPROTO | 
					
						
							|  |  |  | PLATFORM      -- $FULL_HOST_DETAILS | 
					
						
							|  |  |  | TEST_DIR      -- $TEST_DIR | 
					
						
							| 
									
										
										
										
											2019-10-17 15:31:33 +02:00
										 |  |  | SOCK_DIR      -- $SOCK_DIR | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  | SOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | EOF | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | # $1 = prog to look for | 
					
						
							|  |  |  | set_prog_path() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  |     p=$(command -v $1 2> /dev/null) | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |     if [ -n "$p" -a -x "$p" ]; then | 
					
						
							| 
									
										
										
										
											2018-03-15 06:51:44 -05:00
										 |  |  |         type -p "$p" | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |     else | 
					
						
							|  |  |  |         return 1 | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [ -z "$TEST_DIR" ]; then | 
					
						
							| 
									
										
										
										
											2018-11-16 14:33:03 -06:00
										 |  |  |         TEST_DIR=$PWD/scratch | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | fi | 
					
						
							| 
									
										
										
										
											2019-10-17 15:31:33 +02:00
										 |  |  | mkdir -p "$TEST_DIR" || _init_error 'Failed to create TEST_DIR' | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-17 15:31:33 +02:00
										 |  |  | tmp_sock_dir=false | 
					
						
							|  |  |  | if [ -z "$SOCK_DIR" ]; then | 
					
						
							|  |  |  |     SOCK_DIR=$(mktemp -d) | 
					
						
							|  |  |  |     tmp_sock_dir=true | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | fi | 
					
						
							| 
									
										
										
										
											2019-10-17 15:31:33 +02:00
										 |  |  | mkdir -p "$SOCK_DIR" || _init_error 'Failed to create SOCK_DIR' | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | diff="diff -u" | 
					
						
							|  |  |  | verbose=false | 
					
						
							|  |  |  | debug=false | 
					
						
							|  |  |  | group=false | 
					
						
							|  |  |  | xgroup=false | 
					
						
							|  |  |  | imgopts=false | 
					
						
							|  |  |  | showme=false | 
					
						
							|  |  |  | sortme=false | 
					
						
							|  |  |  | expunge=true | 
					
						
							|  |  |  | have_test_arg=false | 
					
						
							|  |  |  | cachemode=false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | tmp="${TEST_DIR}"/$$ | 
					
						
							|  |  |  | rm -f $tmp.list $tmp.tmp $tmp.sed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export IMGFMT=raw | 
					
						
							|  |  |  | export IMGFMT_GENERIC=true | 
					
						
							|  |  |  | export IMGPROTO=file | 
					
						
							|  |  |  | export IMGOPTS="" | 
					
						
							|  |  |  | export CACHEMODE="writeback" | 
					
						
							|  |  |  | export QEMU_IO_OPTIONS="" | 
					
						
							|  |  |  | export QEMU_IO_OPTIONS_NO_FMT="" | 
					
						
							|  |  |  | export CACHEMODE_IS_DEFAULT=true | 
					
						
							|  |  |  | export VALGRIND_QEMU= | 
					
						
							|  |  |  | export IMGKEYSECRET= | 
					
						
							|  |  |  | export IMGOPTSSYNTAX=false | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-05 14:02:45 -05:00
										 |  |  | # Save current tty settings, since an aborting qemu call may leave things | 
					
						
							|  |  |  | # screwed up | 
					
						
							|  |  |  | STTY_RESTORE= | 
					
						
							|  |  |  | if test -t 0; then | 
					
						
							|  |  |  |     STTY_RESTORE=$(stty -g) | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | for r | 
					
						
							|  |  |  | do | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if $group | 
					
						
							|  |  |  |     then | 
					
						
							|  |  |  |         # arg after -g | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  |         group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{ | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | s/ .*//p | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  | }') | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |         if [ -z "$group_list" ] | 
					
						
							|  |  |  |         then | 
					
						
							|  |  |  |             echo "Group \"$r\" is empty or not defined?" | 
					
						
							|  |  |  |             exit 1 | 
					
						
							|  |  |  |         fi | 
					
						
							|  |  |  |         [ ! -s $tmp.list ] && touch $tmp.list | 
					
						
							|  |  |  |         for t in $group_list | 
					
						
							|  |  |  |         do | 
					
						
							|  |  |  |             if grep -s "^$t\$" $tmp.list >/dev/null | 
					
						
							|  |  |  |             then | 
					
						
							|  |  |  |                 : | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 echo "$t" >>$tmp.list | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |         done | 
					
						
							|  |  |  |         group=false | 
					
						
							|  |  |  |         continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     elif $xgroup | 
					
						
							|  |  |  |     then | 
					
						
							|  |  |  |         # arg after -x | 
					
						
							|  |  |  |         # Populate $tmp.list with all tests | 
					
						
							|  |  |  |         awk '/^[0-9]{3,}/ {print $1}' "${source_iotests}/group" > $tmp.list 2>/dev/null | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  |         group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{ | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | s/ .*//p | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  | }') | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |         if [ -z "$group_list" ] | 
					
						
							|  |  |  |         then | 
					
						
							|  |  |  |             echo "Group \"$r\" is empty or not defined?" | 
					
						
							|  |  |  |             exit 1 | 
					
						
							|  |  |  |         fi | 
					
						
							|  |  |  |         numsed=0 | 
					
						
							|  |  |  |         rm -f $tmp.sed | 
					
						
							|  |  |  |         for t in $group_list | 
					
						
							|  |  |  |         do | 
					
						
							|  |  |  |             if [ $numsed -gt 100 ] | 
					
						
							|  |  |  |             then | 
					
						
							|  |  |  |                 sed -f $tmp.sed <$tmp.list >$tmp.tmp | 
					
						
							|  |  |  |                 mv $tmp.tmp $tmp.list | 
					
						
							|  |  |  |                 numsed=0 | 
					
						
							|  |  |  |                 rm -f $tmp.sed | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |             echo "/^$t\$/d" >>$tmp.sed | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  |             numsed=$(expr $numsed + 1) | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |         done | 
					
						
							|  |  |  |         sed -f $tmp.sed <$tmp.list >$tmp.tmp | 
					
						
							|  |  |  |         mv $tmp.tmp $tmp.list | 
					
						
							|  |  |  |         xgroup=false | 
					
						
							|  |  |  |         continue | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     elif $imgopts | 
					
						
							|  |  |  |     then | 
					
						
							|  |  |  |         IMGOPTS="$r" | 
					
						
							|  |  |  |         imgopts=false | 
					
						
							|  |  |  |         continue | 
					
						
							|  |  |  |     elif $cachemode | 
					
						
							|  |  |  |     then | 
					
						
							|  |  |  |         CACHEMODE="$r" | 
					
						
							|  |  |  |         CACHEMODE_IS_DEFAULT=false | 
					
						
							|  |  |  |         cachemode=false | 
					
						
							|  |  |  |         continue | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     xpand=true | 
					
						
							|  |  |  |     case "$r" | 
					
						
							|  |  |  |     in | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -\? | -h | --help)        # usage | 
					
						
							|  |  |  |             echo "Usage: $0 [options] [testlist]"' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | common options | 
					
						
							|  |  |  |     -v                  verbose | 
					
						
							|  |  |  |     -d                  debug | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | image format options | 
					
						
							|  |  |  |     -raw                test raw (default) | 
					
						
							|  |  |  |     -bochs              test bochs | 
					
						
							|  |  |  |     -cloop              test cloop | 
					
						
							|  |  |  |     -parallels          test parallels | 
					
						
							|  |  |  |     -qcow               test qcow | 
					
						
							|  |  |  |     -qcow2              test qcow2 | 
					
						
							|  |  |  |     -qed                test qed | 
					
						
							|  |  |  |     -vdi                test vdi | 
					
						
							|  |  |  |     -vpc                test vpc | 
					
						
							|  |  |  |     -vhdx               test vhdx | 
					
						
							|  |  |  |     -vmdk               test vmdk | 
					
						
							|  |  |  |     -luks               test luks | 
					
						
							| 
									
										
										
										
											2019-01-05 16:42:43 +08:00
										 |  |  |     -dmg                test dmg | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | image protocol options | 
					
						
							|  |  |  |     -file               test file (default) | 
					
						
							|  |  |  |     -rbd                test rbd | 
					
						
							|  |  |  |     -sheepdog           test sheepdog | 
					
						
							|  |  |  |     -nbd                test nbd | 
					
						
							|  |  |  |     -ssh                test ssh | 
					
						
							|  |  |  |     -nfs                test nfs | 
					
						
							|  |  |  |     -vxhs               test vxhs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | other options | 
					
						
							|  |  |  |     -xdiff              graphical mode diff | 
					
						
							|  |  |  |     -nocache            use O_DIRECT on backing file | 
					
						
							|  |  |  |     -misalign           misalign memory allocations | 
					
						
							|  |  |  |     -n                  show me, do not run tests | 
					
						
							|  |  |  |     -o options          -o options to pass to qemu-img create/convert | 
					
						
							|  |  |  |     -c mode             cache mode | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |     -makecheck          pretty print output for make check | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | testlist options | 
					
						
							|  |  |  |     -g group[,group...]        include tests from these groups | 
					
						
							|  |  |  |     -x group[,group...]        exclude tests from these groups | 
					
						
							|  |  |  |     NNN                        include test NNN | 
					
						
							|  |  |  |     NNN-NNN                    include test range (eg. 012-021) | 
					
						
							|  |  |  | ' | 
					
						
							|  |  |  |             exit 0 | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -raw) | 
					
						
							|  |  |  |             IMGFMT=raw | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -bochs) | 
					
						
							|  |  |  |             IMGFMT=bochs | 
					
						
							|  |  |  |             IMGFMT_GENERIC=false | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -cloop) | 
					
						
							|  |  |  |             IMGFMT=cloop | 
					
						
							|  |  |  |             IMGFMT_GENERIC=false | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -parallels) | 
					
						
							|  |  |  |             IMGFMT=parallels | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -qcow) | 
					
						
							|  |  |  |             IMGFMT=qcow | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -qcow2) | 
					
						
							|  |  |  |             IMGFMT=qcow2 | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -luks) | 
					
						
							|  |  |  |             IMGOPTSSYNTAX=true | 
					
						
							|  |  |  |             IMGFMT=luks | 
					
						
							|  |  |  |             IMGKEYSECRET=123456 | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-05 16:42:43 +08:00
										 |  |  |         -dmg) | 
					
						
							|  |  |  |             IMGFMT=dmg | 
					
						
							|  |  |  |             IMGFMT_GENERIC=false | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |         -qed) | 
					
						
							|  |  |  |             IMGFMT=qed | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -vdi) | 
					
						
							|  |  |  |             IMGFMT=vdi | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -vmdk) | 
					
						
							|  |  |  |             IMGFMT=vmdk | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -vpc) | 
					
						
							|  |  |  |             IMGFMT=vpc | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -vhdx) | 
					
						
							|  |  |  |             IMGFMT=vhdx | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -file) | 
					
						
							|  |  |  |             IMGPROTO=file | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -rbd) | 
					
						
							|  |  |  |             IMGPROTO=rbd | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -sheepdog) | 
					
						
							|  |  |  |             IMGPROTO=sheepdog | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -nbd) | 
					
						
							|  |  |  |             IMGPROTO=nbd | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -vxhs) | 
					
						
							|  |  |  |             IMGPROTO=vxhs | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -ssh) | 
					
						
							|  |  |  |             IMGPROTO=ssh | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -nfs) | 
					
						
							|  |  |  |             IMGPROTO=nfs | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -nocache) | 
					
						
							|  |  |  |             CACHEMODE="none" | 
					
						
							|  |  |  |             CACHEMODE_IS_DEFAULT=false | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -misalign) | 
					
						
							|  |  |  |             QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --misalign" | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -valgrind) | 
					
						
							|  |  |  |             VALGRIND_QEMU='y' | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -g)        # -g group ... pick from group file | 
					
						
							|  |  |  |             group=true | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -xdiff)        # graphical diff mode | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if [ ! -z "$DISPLAY" ] | 
					
						
							|  |  |  |             then | 
					
						
							|  |  |  |                 command -v xdiff >/dev/null 2>&1 && diff=xdiff | 
					
						
							|  |  |  |                 command -v gdiff >/dev/null 2>&1 && diff=gdiff | 
					
						
							|  |  |  |                 command -v tkdiff >/dev/null 2>&1 && diff=tkdiff | 
					
						
							|  |  |  |                 command -v xxdiff >/dev/null 2>&1 && diff=xxdiff | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |             ;; | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |         -makecheck)   # makecheck friendly output | 
					
						
							|  |  |  |             makecheck=true | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |         -n)        # show me, don't do it | 
					
						
							|  |  |  |             showme=true | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  |         -o) | 
					
						
							|  |  |  |             imgopts=true | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  |         -c) | 
					
						
							|  |  |  |             cachemode=true | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |         -T)        # deprecated timestamp option | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         -v) | 
					
						
							|  |  |  |             verbose=true | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  |         -d) | 
					
						
							|  |  |  |             debug=true | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  |         -x)        # -x group ... exclude from group file | 
					
						
							|  |  |  |             xgroup=true | 
					
						
							|  |  |  |             xpand=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  |         '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]') | 
					
						
							|  |  |  |             echo "No tests?" | 
					
						
							|  |  |  |             status=1 | 
					
						
							|  |  |  |             exit $status | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         [0-9]*-[0-9]*) | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  |             eval $(echo $r | sed -e 's/^/start=/' -e 's/-/ end=/') | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         [0-9]*-) | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  |             eval $(echo $r | sed -e 's/^/start=/' -e 's/-//') | 
					
						
							|  |  |  |             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/.* //') | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |             if [ -z "$end" ] | 
					
						
							|  |  |  |             then | 
					
						
							|  |  |  |                 echo "No tests in range \"$r\"?" | 
					
						
							|  |  |  |                 status=1 | 
					
						
							|  |  |  |                 exit $status | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         *) | 
					
						
							|  |  |  |             start=$r | 
					
						
							|  |  |  |             end=$r | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     esac | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # get rid of leading 0s as can be interpreted as octal | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  |     start=$(echo $start | sed 's/^0*//') | 
					
						
							|  |  |  |     end=$(echo $end | sed 's/^0*//') | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if $xpand | 
					
						
							|  |  |  |     then | 
					
						
							|  |  |  |         have_test_arg=true | 
					
						
							|  |  |  |         awk </dev/null ' | 
					
						
							|  |  |  | BEGIN        { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \ | 
					
						
							|  |  |  |         | while read id | 
					
						
							|  |  |  |         do | 
					
						
							| 
									
										
										
										
											2019-07-17 13:19:44 +02:00
										 |  |  |             if grep -s "^$id\( \|\$\)" "$source_iotests/group" >/dev/null | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |             then | 
					
						
							|  |  |  |                 # in group file ... OK | 
					
						
							|  |  |  |                 echo $id >>$tmp.list | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 if [ -f expunged ] && $expunge && egrep "^$id([         ]|\$)" expunged >/dev/null | 
					
						
							|  |  |  |                 then | 
					
						
							|  |  |  |                     # expunged ... will be reported, but not run, later | 
					
						
							|  |  |  |                     echo $id >>$tmp.list | 
					
						
							|  |  |  |                 else | 
					
						
							|  |  |  |                     # oops | 
					
						
							|  |  |  |                     if [ "$start" == "$end" -a "$id" == "$end" ] | 
					
						
							|  |  |  |                     then | 
					
						
							|  |  |  |                         echo "$id - unknown test" | 
					
						
							|  |  |  |                         exit 1 | 
					
						
							|  |  |  |                     else | 
					
						
							|  |  |  |                         echo "$id - unknown test, ignored" | 
					
						
							|  |  |  |                     fi | 
					
						
							|  |  |  |                 fi | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |         done || exit 1 | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Set qemu-io cache mode with $CACHEMODE we have | 
					
						
							|  |  |  | QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --cache $CACHEMODE" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QEMU_IO_OPTIONS_NO_FMT="$QEMU_IO_OPTIONS" | 
					
						
							|  |  |  | if [ "$IMGOPTSSYNTAX" != "true" ]; then | 
					
						
							|  |  |  |     QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS -f $IMGFMT" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Set default options for qemu-img create -o if they were not specified | 
					
						
							|  |  |  | if [ "$IMGFMT" == "qcow2" ] && ! (echo "$IMGOPTS" | grep "compat=" > /dev/null); then | 
					
						
							|  |  |  |     IMGOPTS=$(_optstr_add "$IMGOPTS" "compat=1.1") | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | if [ "$IMGFMT" == "luks" ] && ! (echo "$IMGOPTS" | grep "iter-time=" > /dev/null); then | 
					
						
							|  |  |  |     IMGOPTS=$(_optstr_add "$IMGOPTS" "iter-time=10") | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [ -z "$SAMPLE_IMG_DIR" ]; then | 
					
						
							|  |  |  |         SAMPLE_IMG_DIR="$source_iotests/sample_images" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export TEST_DIR | 
					
						
							| 
									
										
										
										
											2019-10-17 15:31:33 +02:00
										 |  |  | export SOCK_DIR | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | export SAMPLE_IMG_DIR | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [ -s $tmp.list ] | 
					
						
							|  |  |  | then | 
					
						
							|  |  |  |     # found some valid test numbers ... this is good | 
					
						
							|  |  |  |     : | 
					
						
							|  |  |  | else | 
					
						
							|  |  |  |     if $have_test_arg | 
					
						
							|  |  |  |     then | 
					
						
							|  |  |  |         # had test numbers, but none in group file ... do nothing | 
					
						
							|  |  |  |         touch $tmp.list | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         # no test numbers, do everything from group file | 
					
						
							| 
									
										
										
										
											2019-07-17 13:19:44 +02:00
										 |  |  |         sed -n -e '/^[0-9][0-9][0-9]*/s/^\([0-9]*\).*/\1/p' <"$source_iotests/group" >$tmp.list | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |     fi | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # should be sort -n, but this did not work for Linux when this | 
					
						
							|  |  |  | # was ported from IRIX | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  | list=$(sort $tmp.list) | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | rm -f $tmp.list $tmp.tmp $tmp.sed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [ -z "$QEMU_PROG" ] | 
					
						
							|  |  |  | then | 
					
						
							|  |  |  |     if [ -x "$build_iotests/qemu" ]; then | 
					
						
							|  |  |  |         export QEMU_PROG="$build_iotests/qemu" | 
					
						
							| 
									
										
										
										
											2018-03-29 13:20:53 +02:00
										 |  |  |     elif [ -x "$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}" ]; then | 
					
						
							|  |  |  |         export QEMU_PROG="$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}" | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  |     else | 
					
						
							|  |  |  |         pushd "$build_root" > /dev/null | 
					
						
							|  |  |  |         for binary in *-softmmu/qemu-system-* | 
					
						
							|  |  |  |         do | 
					
						
							|  |  |  |             if [ -x "$binary" ] | 
					
						
							|  |  |  |             then | 
					
						
							|  |  |  |                 export QEMU_PROG="$build_root/$binary" | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |         done | 
					
						
							|  |  |  |         popd > /dev/null | 
					
						
							|  |  |  |         [ "$QEMU_PROG" = "" ] && _init_error "qemu not found" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | fi | 
					
						
							| 
									
										
										
										
											2018-03-15 06:51:44 -05:00
										 |  |  | export QEMU_PROG="$(type -p "$QEMU_PROG")" | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-23 11:19:14 +02:00
										 |  |  | case "$QEMU_PROG" in | 
					
						
							|  |  |  |     *qemu-system-arm|*qemu-system-aarch64) | 
					
						
							| 
									
										
										
										
											2019-08-19 22:18:44 +02:00
										 |  |  |         export QEMU_OPTIONS="-nodefaults -display none -machine virt,accel=qtest" | 
					
						
							| 
									
										
										
										
											2019-04-23 11:19:14 +02:00
										 |  |  |         ;; | 
					
						
							|  |  |  |     *qemu-system-tricore) | 
					
						
							| 
									
										
										
										
											2019-08-19 22:18:44 +02:00
										 |  |  |         export QEMU_OPTIONS="-nodefaults -display none -machine tricore_testboard,accel=qtest" | 
					
						
							| 
									
										
										
										
											2019-04-23 11:19:14 +02:00
										 |  |  |         ;; | 
					
						
							|  |  |  |     *) | 
					
						
							| 
									
										
										
										
											2019-08-19 22:18:44 +02:00
										 |  |  |         export QEMU_OPTIONS="-nodefaults -display none -machine accel=qtest" | 
					
						
							| 
									
										
										
										
											2019-04-23 11:19:14 +02:00
										 |  |  |         ;; | 
					
						
							|  |  |  | esac | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | if [ -z "$QEMU_IMG_PROG" ]; then | 
					
						
							|  |  |  |     if [ -x "$build_iotests/qemu-img" ]; then | 
					
						
							|  |  |  |         export QEMU_IMG_PROG="$build_iotests/qemu-img" | 
					
						
							|  |  |  |     elif [ -x "$build_root/qemu-img" ]; then | 
					
						
							|  |  |  |         export QEMU_IMG_PROG="$build_root/qemu-img" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         _init_error "qemu-img not found" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | fi | 
					
						
							| 
									
										
										
										
											2018-03-15 06:51:44 -05:00
										 |  |  | export QEMU_IMG_PROG="$(type -p "$QEMU_IMG_PROG")" | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | if [ -z "$QEMU_IO_PROG" ]; then | 
					
						
							|  |  |  |     if [ -x "$build_iotests/qemu-io" ]; then | 
					
						
							|  |  |  |         export QEMU_IO_PROG="$build_iotests/qemu-io" | 
					
						
							|  |  |  |     elif [ -x "$build_root/qemu-io" ]; then | 
					
						
							|  |  |  |         export QEMU_IO_PROG="$build_root/qemu-io" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         _init_error "qemu-io not found" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | fi | 
					
						
							| 
									
										
										
										
											2018-03-15 06:51:44 -05:00
										 |  |  | export QEMU_IO_PROG="$(type -p "$QEMU_IO_PROG")" | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | if [ -z $QEMU_NBD_PROG ]; then | 
					
						
							|  |  |  |     if [ -x "$build_iotests/qemu-nbd" ]; then | 
					
						
							|  |  |  |         export QEMU_NBD_PROG="$build_iotests/qemu-nbd" | 
					
						
							|  |  |  |     elif [ -x "$build_root/qemu-nbd" ]; then | 
					
						
							|  |  |  |         export QEMU_NBD_PROG="$build_root/qemu-nbd" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         _init_error "qemu-nbd not found" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | fi | 
					
						
							| 
									
										
										
										
											2018-03-15 06:51:44 -05:00
										 |  |  | export QEMU_NBD_PROG="$(type -p "$QEMU_NBD_PROG")" | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | if [ -z "$QEMU_VXHS_PROG" ]; then | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  |     export QEMU_VXHS_PROG="$(set_prog_path qnio_server)" | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [ -x "$build_iotests/socket_scm_helper" ] | 
					
						
							|  |  |  | then | 
					
						
							|  |  |  |     export SOCKET_SCM_HELPER="$build_iotests/socket_scm_helper" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-18 10:50:05 +02:00
										 |  |  | python_usable=false | 
					
						
							|  |  |  | if $PYTHON -c 'import sys; sys.exit(0 if sys.version_info >= (3,6) else 1)' | 
					
						
							|  |  |  | then | 
					
						
							|  |  |  |     python_usable=true | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:59 +02:00
										 |  |  | default_machine=$($QEMU_PROG -machine help | sed -n '/(default)/ s/ .*//p') | 
					
						
							|  |  |  | default_alias_machine=$($QEMU_PROG -machine help | \ | 
					
						
							|  |  |  |    sed -n "/(alias of $default_machine)/ { s/ .*//p; q; }") | 
					
						
							|  |  |  | if [[ "$default_alias_machine" ]]; then | 
					
						
							|  |  |  |     default_machine="$default_alias_machine" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export QEMU_DEFAULT_MACHINE="$default_machine" | 
					
						
							| 
									
										
										
										
											2012-03-27 13:45:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-03 16:05:56 +00:00
										 |  |  | TIMESTAMP_FILE=check.time-$IMGPROTO-$IMGFMT | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | _wallclock() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:51 +02:00
										 |  |  |     date "+%H %M %S" | awk '{ print $1*3600 + $2*60 + $3 }' | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _wrapup() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if $showme | 
					
						
							|  |  |  |     then | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |         : | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  |     elif $needwrap | 
					
						
							|  |  |  |     then | 
					
						
							| 
									
										
										
										
											2017-01-03 16:05:56 +00:00
										 |  |  |         if [ -f $TIMESTAMP_FILE -a -f $tmp.time ] | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |         then | 
					
						
							| 
									
										
										
										
											2017-01-03 16:05:56 +00:00
										 |  |  |             cat $TIMESTAMP_FILE $tmp.time \ | 
					
						
							| 
									
										
										
										
											2017-09-12 16:44:51 +02:00
										 |  |  |             | awk ' | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |         { t[$1] = $2 } | 
					
						
							|  |  |  | END        { if (NR > 0) { | 
					
						
							|  |  |  |             for (i in t) print i " " t[i] | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }' \ | 
					
						
							|  |  |  |             | sort -n >$tmp.out | 
					
						
							| 
									
										
										
										
											2017-01-03 16:05:56 +00:00
										 |  |  |             mv $tmp.out $TIMESTAMP_FILE | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |         fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if [ -f $tmp.expunged ] | 
					
						
							|  |  |  |         then | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  |             notrun=$(wc -l <$tmp.expunged | sed -e 's/  *//g') | 
					
						
							|  |  |  |             try=$(expr $try - $notrun) | 
					
						
							|  |  |  |             list=$(echo "$list" | sed -f $tmp.expunged) | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |         fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         echo "" >>check.log | 
					
						
							|  |  |  |         date >>check.log | 
					
						
							|  |  |  |         echo $list | fmt | sed -e 's/^/    /' >>check.log | 
					
						
							|  |  |  |         $interrupt && echo "Interrupted!" >>check.log | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if [ ! -z "$notrun" ] | 
					
						
							|  |  |  |         then | 
					
						
							|  |  |  |             echo "Not run:$notrun" | 
					
						
							|  |  |  |             echo "Not run:$notrun" >>check.log | 
					
						
							|  |  |  |         fi | 
					
						
							| 
									
										
										
										
											2019-03-07 16:33:59 +03:00
										 |  |  |         if [ ! -z "$casenotrun" ] | 
					
						
							|  |  |  |         then | 
					
						
							|  |  |  |             echo "Some cases not run in:$casenotrun" | 
					
						
							|  |  |  |             echo "Some cases not run in:$casenotrun" >>check.log | 
					
						
							|  |  |  |         fi | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  |         if [ ! -z "$n_bad" -a $n_bad != 0 ] | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |         then | 
					
						
							|  |  |  |             echo "Failures:$bad" | 
					
						
							| 
									
										
										
										
											2019-09-06 13:39:20 +02:00
										 |  |  |             echo "Failed $n_bad of $try iotests" | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |             echo "Failures:$bad" | fmt >>check.log | 
					
						
							| 
									
										
										
										
											2019-09-06 13:39:20 +02:00
										 |  |  |             echo "Failed $n_bad of $try iotests" >>check.log | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |         else | 
					
						
							| 
									
										
										
										
											2019-09-06 13:39:20 +02:00
										 |  |  |             echo "Passed all $try iotests" | 
					
						
							|  |  |  |             echo "Passed all $try iotests" >>check.log | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |         fi | 
					
						
							|  |  |  |         needwrap=false | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-05 14:02:45 -05:00
										 |  |  |     if test -n "$STTY_RESTORE"; then | 
					
						
							|  |  |  |         stty $STTY_RESTORE | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											2016-04-05 11:21:43 +02:00
										 |  |  |     rm -f "${TEST_DIR}"/*.out "${TEST_DIR}"/*.err "${TEST_DIR}"/*.time | 
					
						
							|  |  |  |     rm -f "${TEST_DIR}"/check.pid "${TEST_DIR}"/check.sts | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  |     rm -f $tmp.* | 
					
						
							| 
									
										
										
										
											2019-10-17 15:31:33 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if $tmp_sock_dir | 
					
						
							|  |  |  |     then | 
					
						
							|  |  |  |         rm -rf "$SOCK_DIR" | 
					
						
							|  |  |  |     fi | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | trap "_wrapup; exit \$status" 0 1 2 3 15 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  | # Report the test start and results. For makecheck we want to pretty | 
					
						
							|  |  |  | # print the whole report at the end of the execution. | 
					
						
							|  |  |  | # args: $seq, $starttime, $lasttime | 
					
						
							|  |  |  | _report_test_start() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if ! $makecheck; then | 
					
						
							|  |  |  |         if [ -n "$3" ]; then | 
					
						
							|  |  |  |             local lasttime=" (last: $3s)" | 
					
						
							|  |  |  |         fi | 
					
						
							|  |  |  |         printf "%-8s %-10s [%s]            %4s%-14s\r" "$1" "..." "$2" "..." "$lasttime" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | # args:$seq $status $starttime $lasttime $thistime $details | 
					
						
							|  |  |  | _report_test_result() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     local status lasttime thistime | 
					
						
							|  |  |  |     if $makecheck; then | 
					
						
							|  |  |  |         if [ -n "$2" ] && [ "$2" != "pass" ]; then | 
					
						
							|  |  |  |             status=" [$2]" | 
					
						
							|  |  |  |         fi | 
					
						
							|  |  |  |         printf "  TEST    iotest-$IMGFMT: %s%s\n" "$1" "$status" | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if [ -n "$4" ]; then | 
					
						
							|  |  |  |         lasttime=" (last: $4s)" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |     if [ -n "$5" ]; then | 
					
						
							|  |  |  |         thistime=" $5s" | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  |     case "$2" in | 
					
						
							|  |  |  |         "pass")     status=$(printf "\e[32m%-10s\e[0m" "$2") ;; | 
					
						
							|  |  |  |         "fail")     status=$(printf "\e[1m\e[31m%-10s\e[0m" "$2") ;; | 
					
						
							|  |  |  |         "not run")  status=$(printf "\e[33m%-10s\e[0m" "$2") ;; | 
					
						
							|  |  |  |         *)          status=$(printf "%-10s" "$2") ;; | 
					
						
							|  |  |  |     esac | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     printf "%-8s %s [%s] [%s] %4s%-14s %s\n" "$1" "$status" "$3" "$(date '+%T')" "$thistime" "$lasttime" "$6" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-03 16:05:56 +00:00
										 |  |  | [ -f $TIMESTAMP_FILE ] || touch $TIMESTAMP_FILE | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  | FULL_IMGFMT_DETAILS=$(_full_imgfmt_details) | 
					
						
							|  |  |  | FULL_HOST_DETAILS=$(_full_platform_details) | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  | if ! $makecheck; then | 
					
						
							|  |  |  |     _full_env_details | 
					
						
							|  |  |  | fi | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | seq="check" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ -n "$TESTS_REMAINING_LOG" ] && echo $list > $TESTS_REMAINING_LOG | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | for seq in $list | 
					
						
							|  |  |  | do | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |     err=false       # error flag | 
					
						
							|  |  |  |     printdiff=false # show diff to reference output? | 
					
						
							|  |  |  |     status=""       # test result summary | 
					
						
							|  |  |  |     results=""      # test result details | 
					
						
							| 
									
										
										
										
											2019-06-13 20:37:27 +02:00
										 |  |  |     thistime=""     # time the test took | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  |     if [ -n "$TESTS_REMAINING_LOG" ] ; then | 
					
						
							|  |  |  |         sed -e "s/$seq//" -e 's/  / /' -e 's/^ *//' $TESTS_REMAINING_LOG > $TESTS_REMAINING_LOG.tmp | 
					
						
							|  |  |  |         mv $TESTS_REMAINING_LOG.tmp $TESTS_REMAINING_LOG | 
					
						
							|  |  |  |         sync | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |     lasttime=$(sed -n -e "/^$seq /s/.* //p" <$TIMESTAMP_FILE) | 
					
						
							|  |  |  |     starttime=$(date "+%T") | 
					
						
							|  |  |  |     _report_test_start $seq $starttime $lasttime | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  |     if $showme | 
					
						
							|  |  |  |     then | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |         status="not run" | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |     elif [ -f expunged ] && $expunge && egrep "^$seq([         ]|\$)" expunged >/dev/null | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  |     then | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |         status="not run" | 
					
						
							|  |  |  |         results="expunged" | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |         rm -f $seq.out.bad | 
					
						
							|  |  |  |         echo "/^$seq\$/d" >>$tmp.expunged | 
					
						
							| 
									
										
										
										
											2014-05-24 23:24:55 +02:00
										 |  |  |     elif [ ! -f "$source_iotests/$seq" ] | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  |     then | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |         status="not run" | 
					
						
							|  |  |  |         results="no such test?" | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |         echo "/^$seq\$/d" >>$tmp.expunged | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |         # really going to try and run this one | 
					
						
							|  |  |  |         # | 
					
						
							|  |  |  |         rm -f $seq.out.bad | 
					
						
							|  |  |  |         rm -f core $seq.notrun | 
					
						
							| 
									
										
										
										
											2019-03-07 16:33:59 +03:00
										 |  |  |         rm -f $seq.casenotrun | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  |         start=$(_wallclock) | 
					
						
							| 
									
										
										
										
											2014-05-24 23:24:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if [ "$(head -n 1 "$source_iotests/$seq")" == "#!/usr/bin/env python" ]; then | 
					
						
							| 
									
										
										
										
											2019-09-18 10:50:05 +02:00
										 |  |  |             if $python_usable; then | 
					
						
							|  |  |  |                 run_command="$PYTHON $seq" | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 run_command="false" | 
					
						
							|  |  |  |                 echo "Unsupported Python version" > $seq.notrun | 
					
						
							|  |  |  |             fi | 
					
						
							| 
									
										
										
										
											2014-05-24 23:24:58 +02:00
										 |  |  |         else | 
					
						
							|  |  |  |             run_command="./$seq" | 
					
						
							|  |  |  |         fi | 
					
						
							| 
									
										
										
										
											2014-05-24 23:24:55 +02:00
										 |  |  |         export OUTPUT_DIR=$PWD | 
					
						
							| 
									
										
										
										
											2015-05-18 09:39:12 +08:00
										 |  |  |         if $debug; then | 
					
						
							|  |  |  |             (cd "$source_iotests"; | 
					
						
							|  |  |  |             MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \ | 
					
						
							|  |  |  |                     $run_command -d 2>&1 | tee $tmp.out) | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             (cd "$source_iotests"; | 
					
						
							|  |  |  |             MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \ | 
					
						
							|  |  |  |                     $run_command >$tmp.out 2>&1) | 
					
						
							|  |  |  |         fi | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |         sts=$? | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  |         stop=$(_wallclock) | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if [ -f core ] | 
					
						
							|  |  |  |         then | 
					
						
							|  |  |  |             mv core $seq.core | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |             status="fail" | 
					
						
							|  |  |  |             results="[dumped core] $seq.core" | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |             err=true | 
					
						
							|  |  |  |         fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if [ -f $seq.notrun ] | 
					
						
							|  |  |  |         then | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |             # overwrites timestamp output | 
					
						
							|  |  |  |             status="not run" | 
					
						
							|  |  |  |             results="$(cat $seq.notrun)" | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |         else | 
					
						
							|  |  |  |             if [ $sts -ne 0 ] | 
					
						
							|  |  |  |             then | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |                 status="fail" | 
					
						
							|  |  |  |                 results=$(printf %s "[failed, exit status $sts]") | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |                 err=true | 
					
						
							|  |  |  |             fi | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-24 23:24:55 +02:00
										 |  |  |             reference="$source_iotests/$seq.out" | 
					
						
							| 
									
										
										
										
											2015-07-03 15:28:46 +08:00
										 |  |  |             reference_machine="$source_iotests/$seq.$QEMU_DEFAULT_MACHINE.out" | 
					
						
							|  |  |  |             if [ -f "$reference_machine" ]; then | 
					
						
							|  |  |  |                 reference="$reference_machine" | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-05 13:57:37 +01:00
										 |  |  |             reference_format="$source_iotests/$seq.out.$IMGFMT" | 
					
						
							|  |  |  |             if [ -f "$reference_format" ]; then | 
					
						
							|  |  |  |                 reference="$reference_format" | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-04 09:06:58 +08:00
										 |  |  |             if [ "$CACHEMODE" = "none" ]; then | 
					
						
							| 
									
										
										
										
											2014-05-24 23:24:55 +02:00
										 |  |  |                 [ -f "$source_iotests/$seq.out.nocache" ] && reference="$source_iotests/$seq.out.nocache" | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:05 +02:00
										 |  |  |             fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-24 23:24:55 +02:00
										 |  |  |             if [ ! -f "$reference" ] | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |             then | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |                 status="fail" | 
					
						
							| 
									
										
										
										
											2019-11-08 09:03:59 +01:00
										 |  |  |                 results="no qualified output" | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |                 err=true | 
					
						
							|  |  |  |             else | 
					
						
							| 
									
										
										
										
											2014-05-24 23:24:55 +02:00
										 |  |  |                 if diff -w "$reference" $tmp.out >/dev/null 2>&1 | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |                 then | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |                     if ! $err; then | 
					
						
							|  |  |  |                         status="pass" | 
					
						
							|  |  |  |                         thistime=$(expr $stop - $start) | 
					
						
							|  |  |  |                         echo "$seq $thistime" >>$tmp.time | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |                     fi | 
					
						
							|  |  |  |                 else | 
					
						
							|  |  |  |                     mv $tmp.out $seq.out.bad | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |                     status="fail" | 
					
						
							|  |  |  |                     results="output mismatch (see $seq.out.bad)" | 
					
						
							|  |  |  |                     printdiff=true | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  |                     err=true | 
					
						
							|  |  |  |                 fi | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |         fi | 
					
						
							| 
									
										
										
										
											2019-03-07 16:33:59 +03:00
										 |  |  |         if [ -f $seq.casenotrun ] | 
					
						
							|  |  |  |         then | 
					
						
							|  |  |  |             cat $seq.casenotrun | 
					
						
							|  |  |  |             casenotrun="$casenotrun $seq" | 
					
						
							|  |  |  |         fi | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  |     fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # come here for each test, except when $showme is true | 
					
						
							|  |  |  |     # | 
					
						
							| 
									
										
										
										
											2019-05-03 15:39:04 +01:00
										 |  |  |     _report_test_result $seq "$status" "$starttime" "$lasttime" "$thistime" "$results" | 
					
						
							|  |  |  |     case "$status" in | 
					
						
							|  |  |  |         "pass") | 
					
						
							|  |  |  |             try=$(expr $try + 1) | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  |         "fail") | 
					
						
							|  |  |  |             try=$(expr $try + 1) | 
					
						
							|  |  |  |             if $makecheck; then | 
					
						
							|  |  |  |                 _full_env_details | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |             if $printdiff; then | 
					
						
							|  |  |  |                 $diff -w "$reference" "$PWD"/$seq.out.bad | 
					
						
							|  |  |  |             fi | 
					
						
							|  |  |  |             bad="$bad $seq" | 
					
						
							|  |  |  |             n_bad=$(expr $n_bad + 1) | 
					
						
							|  |  |  |             quick=false | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  |         "not run") | 
					
						
							|  |  |  |             notrun="$notrun $seq" | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  |     esac | 
					
						
							| 
									
										
										
										
											2013-09-04 13:16:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  |     seq="after_$seq" | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | interrupt=false | 
					
						
							| 
									
										
										
										
											2018-10-24 17:40:51 +08:00
										 |  |  | status=$(expr $n_bad) | 
					
						
							| 
									
										
										
										
											2009-06-22 18:29:05 +02:00
										 |  |  | exit |