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