Commit 70ff5b07 authored by Alex Bennée's avatar Alex Bennée
Browse files

tests/qemu-iotests: re-format output to for make check-block



This attempts to clean-up the output to better match the output of the
rest of the QEMU check system when called with -makecheck. This includes:

  - formatting as "  TEST    iotest-FMT: nnn"
  - only dumping config on failure (when -makecheck enabled)

The non-make check output has been cleaned up as well:

  - line re-displayed (\r) at the end
  - fancy colours for pass/fail/skip
  - timestamps always printed (option removed)

Signed-off-by: default avatarAlex Bennée <alex.bennee@linaro.org>
Message-Id: <20190503143904.31211-1-alex.bennee@linaro.org>
Tested-by: default avatarThomas Huth <thuth@redhat.com>
parent d4271ce5
Loading
Loading
Loading
Loading
+117 −60
Original line number Diff line number Diff line
@@ -27,9 +27,7 @@ bad=""
notrun=""
casenotrun=""
interrupt=true

# by default don't output timestamps
timestamp=${TIMESTAMP:=false}
makecheck=false

_init_error()
{
@@ -88,6 +86,22 @@ _full_platform_details()
    echo "$os/$platform $host $kernel"
}

_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
SOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER

EOF
}

# $1 = prog to look for
set_prog_path()
{
@@ -254,8 +268,8 @@ other options
    -misalign           misalign memory allocations
    -n                  show me, do not run tests
    -o options          -o options to pass to qemu-img create/convert
    -T                  output timestamps
    -c mode             cache mode
    -makecheck          pretty print output for make check

testlist options
    -g group[,group...]        include tests from these groups
@@ -403,7 +417,10 @@ testlist options
                command -v xxdiff >/dev/null 2>&1 && diff=xxdiff
            fi
            ;;

        -makecheck)   # makecheck friendly output
            makecheck=true
            xpand=false
            ;;
        -n)        # show me, don't do it
            showme=true
            xpand=false
@@ -416,8 +433,7 @@ testlist options
            cachemode=true
            xpand=false
            ;;
        -T)        # turn on timestamp output
            timestamp=true
        -T)        # deprecated timestamp option
            xpand=false
            ;;

@@ -633,12 +649,6 @@ _wallclock()
    date "+%H %M %S" | awk '{ print $1*3600 + $2*60 + $3 }'
}

_timestamp()
{
    now=$(date "+%T")
    printf %s " [$now]"
}

_wrapup()
{
    if $showme
@@ -704,23 +714,54 @@ END { if (NR > 0) {

trap "_wrapup; exit \$status" 0 1 2 3 15

# 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"
}

[ -f $TIMESTAMP_FILE ] || touch $TIMESTAMP_FILE

FULL_IMGFMT_DETAILS=$(_full_imgfmt_details)
FULL_HOST_DETAILS=$(_full_platform_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
SOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER

EOF
if ! $makecheck; then
    _full_env_details
fi

seq="check"

@@ -728,42 +769,43 @@ seq="check"

for seq in $list
do
    err=false
    printf %s "$seq"
    err=false       # error flag
    printdiff=false # show diff to reference output?
    status=""       # test result summary
    results=""      # test result details

    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

    lasttime=$(sed -n -e "/^$seq /s/.* //p" <$TIMESTAMP_FILE)
    starttime=$(date "+%T")
    _report_test_start $seq $starttime $lasttime

    if $showme
    then
        echo
        continue
        status="not run"
    elif [ -f expunged ] && $expunge && egrep "^$seq([         ]|\$)" expunged >/dev/null
    then
        echo " - expunged"
        status="not run"
        results="expunged"
        rm -f $seq.out.bad
        echo "/^$seq\$/d" >>$tmp.expunged
    elif [ ! -f "$source_iotests/$seq" ]
    then
        echo " - no such test?"
        status="not run"
        results="no such test?"
        echo "/^$seq\$/d" >>$tmp.expunged
    else
        # really going to try and run this one
        #
        rm -f $seq.out.bad
        lasttime=$(sed -n -e "/^$seq /s/.* //p" <$TIMESTAMP_FILE)
        if [ "X$lasttime" != X ]; then
                printf %s " ${lasttime}s ..."
        else
                printf "        "        # prettier output with timestamps.
        fi
        rm -f core $seq.notrun
        rm -f $seq.casenotrun

        start=$(_wallclock)
        $timestamp && printf %s "        [$(date "+%T")]"

        if [ "$(head -n 1 "$source_iotests/$seq")" == "#!/usr/bin/env python" ]; then
            run_command="$PYTHON $seq"
@@ -781,26 +823,26 @@ do
                    $run_command >$tmp.out 2>&1)
        fi
        sts=$?
        $timestamp && _timestamp
        stop=$(_wallclock)

        if [ -f core ]
        then
            printf " [dumped core]"
            mv core $seq.core
            status="fail"
            results="[dumped core] $seq.core"
            err=true
        fi

        if [ -f $seq.notrun ]
        then
            $timestamp || printf " [not run] "
            $timestamp && echo " [not run]" && printf %s "        $seq -- "
            cat $seq.notrun
            notrun="$notrun $seq"
            # overwrites timestamp output
            status="not run"
            results="$(cat $seq.notrun)"
        else
            if [ $sts -ne 0 ]
            then
                printf %s " [failed, exit status $sts]"
                status="fail"
                results=$(printf %s "[failed, exit status $sts]")
                err=true
            fi

@@ -821,22 +863,23 @@ do

            if [ ! -f "$reference" ]
            then
                echo " - no qualified output"
                status="fail"
                reason="no qualified output"
                err=true
            else
                if diff -w "$reference" $tmp.out >/dev/null 2>&1
                then
                    echo ""
                    if $err
                    then
                        :
                    else
                        echo "$seq $(expr $stop - $start)" >>$tmp.time
                    if ! $err; then
                        status="pass"
                        thistime=$(expr $stop - $start)
                        echo "$seq $thistime" >>$tmp.time
                    fi
                else
                    echo " - output mismatch (see $seq.out.bad)"
                    mv $tmp.out $seq.out.bad
                    $diff -w "$reference" "$PWD"/$seq.out.bad
                    status="fail"
                    results="output mismatch (see $seq.out.bad)"
                    printdiff=true
                    err=true
                fi
            fi
@@ -850,13 +893,27 @@ do

    # come here for each test, except when $showme is true
    #
    if $err
    then
    _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
    fi
    [ -f $seq.notrun ] || try=$(expr $try + 1)
            ;;
        "not run")
            notrun="$notrun $seq"
            ;;
    esac

    seq="after_$seq"
done