]> www.infradead.org Git - users/hch/blktests.git/commitdiff
Show last run for skipped tests
authorOmar Sandoval <osandov@fb.com>
Thu, 5 Mar 2020 01:08:51 +0000 (17:08 -0800)
committerOmar Sandoval <osandov@fb.com>
Sat, 7 Mar 2020 21:56:23 +0000 (13:56 -0800)
When we support skipping from test{,_device}, we will show the last run
information and then skip the test. This is inconsistent with how we
currently show skipped tests, which doesn't display any information. For
consistency, consolidate on always showing the last run (and for device
tests, showing the skipped message for each device).

check
tests/meta/013 [new file with mode: 0755]
tests/meta/013.out [new file with mode: 0644]

diff --git a/check b/check
index 5aeedd2ce79f7d0ee442d8aa4426450d25b7c479..0b6f2d687fa579bc3d23a7171310044553c8718b 100755 (executable)
--- a/check
+++ b/check
@@ -158,27 +158,18 @@ _check_dmesg() {
        fi
 }
 
-# Associative arrays are local by default. declare -g was added in 4.2, but it
-# was apparently broken for associative arrays initially.
-declare -A LAST_TEST_RUN
-declare -A TEST_RUN
-
 _read_last_test_run() {
        local seqres="${RESULTS_DIR}/${TEST_NAME}"
 
-       LAST_TEST_RUN["date"]=""
-       LAST_TEST_RUN["status"]=""
-       LAST_TEST_RUN["reason"]=""
-       LAST_TEST_RUN["exit_status"]=""
-       LAST_TEST_RUN["runtime"]=""
-
        if [[ ! -e $seqres ]]; then
                return
        fi
 
        local key value
        while IFS=$'\t' read -r key value; do
-               LAST_TEST_RUN["$key"]="$value"
+               if [[ ! $key =~ ^date|status|reason|exit_status$ ]]; then
+                       LAST_TEST_RUN["$key"]="$value"
+               fi
        done <"$seqres"
 }
 
@@ -240,43 +231,45 @@ _output_last_test_run() {
                _output_status "$TEST_NAME" ""
        fi
 
-       (
-       local key value
-       while IFS= read -r key; do
-               if [[ $key =~ ^date|status|reason|exit_status$ ]]; then
-                       continue
-               fi
-               value="${LAST_TEST_RUN["$key"]}"
-               printf '    %s\t%s\t...\n' "${key}" "${value}"
-       done < <(printf '%s\n' "${!LAST_TEST_RUN[@]}" | sort)
-       ) | column -t -s $'\t'
+       {
+       local key
+       for key in "${!LAST_TEST_RUN[@]}"; do
+               printf '    %s\t%s\t...\n' "$key" "${LAST_TEST_RUN["$key"]}"
+       done
+       } | sort -t $'\t' -k 1,1 | column -t -s $'\t'
 }
 
 _output_test_run() {
        if [[ -t 1 ]]; then
-               # -4 for date, status, reason, and exit_status, which we don't
-               # output, +1 for the test name.
-               tput cuu $((${#LAST_TEST_RUN[@]} - 3))
+               # Move the cursor back up to the status.
+               tput cuu $((${#LAST_TEST_RUN[@]} + 1))
        fi
 
+       local status=${TEST_RUN["status"]}
+       if [[ $status = pass || $status = fail ]]; then
+               status+="ed"
+       fi
        if [[ "${TEST_DEV:-}" ]]; then
-               _output_status "$TEST_NAME => $(basename "$TEST_DEV")" "${TEST_RUN["status"]}ed"
+               _output_status "$TEST_NAME => $(basename "$TEST_DEV")" "$status"
        else
-               _output_status "$TEST_NAME" "${TEST_RUN["status"]}ed"
+               _output_status "$TEST_NAME" "$status"
        fi
 
-       (
+       {
        local key last_value value
-       while IFS= read -r key; do
-               if [[ $key =~ ^date|status|reason|exit_status$ ]]; then
-                       continue
-               fi
+       {
+       for key in "${!LAST_TEST_RUN[@]}"; do
                last_value="${LAST_TEST_RUN["$key"]}"
                value="${TEST_RUN["$key"]}"
                printf '    %s\t%s\t...\t%s\n' "$key" "$last_value" "$value"
-       done < <(printf '%s\n' "${!LAST_TEST_RUN[@]}" | sort)
+       done
+       } | sort -t $'\t' -k 1,1
 
-       while IFS= read -r key; do
+       {
+       for key in "${!TEST_RUN[@]}"; do
+               if [[ $key =~ ^date|status|reason|exit_status$ ]]; then
+                       continue
+               fi
                # [[ -v array[key] ]] was added in Bash 4.3. Do it this ugly
                # way to support older versions.
                if [[ -n ${LAST_TEST_RUN["$key"]} || ${LAST_TEST_RUN["$key"]-unset} != unset ]]; then
@@ -284,8 +277,13 @@ _output_test_run() {
                fi
                value="${TEST_RUN["$key"]}"
                printf '    %s\t\t...\t%s\n' "$key" "$value"
-       done < <(printf '%s\n' "${!TEST_RUN[@]}" | sort)
-       ) | column -t -s $'\t'
+       done
+       } | sort -t $'\t' -k 1,1
+       } | column -t -s $'\t'
+
+       if [[ $status = "not run" ]]; then
+               echo "    $SKIP_REASON"
+       fi
 }
 
 _register_test_cleanup() {
@@ -327,61 +325,65 @@ _call_test() {
        FULL="${seqres}.full"
        declare -A TEST_DEV_QUEUE_SAVED
 
+       declare -A LAST_TEST_RUN
        _read_last_test_run
        _output_last_test_run
 
+       declare -A TEST_RUN
        TEST_RUN["date"]="$(date "+%F %T")"
 
        mkdir -p "$(dirname "$seqres")"
        # Remove leftovers from last time.
        rm -f "${seqres}" "${seqres}."*
 
-       if [[ -w /dev/kmsg ]]; then
-               local dmesg_marker="run blktests $TEST_NAME at ${TEST_RUN["date"]}"
-               echo "$dmesg_marker" >> /dev/kmsg
+       if [[ -v SKIP_REASON ]]; then
+               TEST_RUN["status"]="not run"
        else
-               local dmesg_marker=""
-               CHECK_DMESG=0
-       fi
-       $LOGGER_PROG "run blktests $TEST_NAME"
+               if [[ -w /dev/kmsg ]]; then
+                       local dmesg_marker="run blktests $TEST_NAME at ${TEST_RUN["date"]}"
+                       echo "$dmesg_marker" >> /dev/kmsg
+               else
+                       local dmesg_marker=""
+                       CHECK_DMESG=0
+               fi
+               $LOGGER_PROG "run blktests $TEST_NAME"
 
-       unset TEST_CLEANUP
-       trap _cleanup EXIT
-       if ! TMPDIR="$(mktemp --tmpdir -p "$OUTPUT" -d "tmpdir.${TEST_NAME//\//.}.XXX")"; then
-               return
-       fi
+               unset TEST_CLEANUP
+               trap _cleanup EXIT
+               if ! TMPDIR="$(mktemp --tmpdir -p "$OUTPUT" -d "tmpdir.${TEST_NAME//\//.}.XXX")"; then
+                       return
+               fi
 
-       TIMEFORMAT="%Rs"
-       pushd . >/dev/null || return
-       { time "$test_func" >"${seqres}.out" 2>&1; } 2>"${seqres}.runtime"
-       TEST_RUN["exit_status"]=$?
-       popd >/dev/null || return
-       TEST_RUN["runtime"]="$(cat "${seqres}.runtime")"
-       rm -f "${seqres}.runtime"
-
-       _cleanup
-
-       if ! diff "tests/${TEST_NAME}.out" "${seqres}.out" >/dev/null; then
-               mv "${seqres}.out" "${seqres}.out.bad"
-               TEST_RUN["status"]=fail
-               TEST_RUN["reason"]=output
-       elif [[ ${TEST_RUN["exit_status"]} -ne 0 ]]; then
-               TEST_RUN["status"]=fail
-               TEST_RUN["reason"]="exit"
-       elif ! _check_dmesg "$dmesg_marker"; then
-               TEST_RUN["status"]=fail
-               TEST_RUN["reason"]=dmesg
-       else
-               TEST_RUN["status"]=pass
+               TIMEFORMAT="%Rs"
+               pushd . >/dev/null || return
+               { time "$test_func" >"${seqres}.out" 2>&1; } 2>"${seqres}.runtime"
+               TEST_RUN["exit_status"]=$?
+               popd >/dev/null || return
+               TEST_RUN["runtime"]="$(cat "${seqres}.runtime")"
+               rm -f "${seqres}.runtime"
+
+               _cleanup
+
+               if ! diff "tests/${TEST_NAME}.out" "${seqres}.out" >/dev/null; then
+                       mv "${seqres}.out" "${seqres}.out.bad"
+                       TEST_RUN["status"]=fail
+                       TEST_RUN["reason"]=output
+               elif [[ ${TEST_RUN["exit_status"]} -ne 0 ]]; then
+                       TEST_RUN["status"]=fail
+                       TEST_RUN["reason"]="exit"
+               elif ! _check_dmesg "$dmesg_marker"; then
+                       TEST_RUN["status"]=fail
+                       TEST_RUN["reason"]=dmesg
+               else
+                       TEST_RUN["status"]=pass
+               fi
+               rm -f "${seqres}.out"
        fi
-       rm -f "${seqres}.out"
 
        _write_test_run
        _output_test_run
 
-       if [[ ${TEST_RUN["status"]} = pass ]]; then
-               return 0
-       else
+       if [[ ${TEST_RUN["status"]} = fail ]]; then
                case "${TEST_RUN["reason"]}" in
                output)
                        diff -u "tests/${TEST_NAME}.out" "${seqres}.out.bad" | awk "
@@ -411,6 +413,8 @@ _call_test() {
                        ;;
                esac
                return 1
+       else
+               return 0
        fi
 }
 
@@ -446,10 +450,6 @@ _run_test() {
        if declare -fF test >/dev/null; then
                if declare -fF requires >/dev/null; then
                        requires
-                       if [[ -v SKIP_REASON ]]; then
-                               _output_notrun "$TEST_NAME"
-                               return 0
-                       fi
                fi
 
                RESULTS_DIR="$OUTPUT/nodev"
@@ -485,33 +485,29 @@ _run_test() {
 
                if declare -fF requires >/dev/null; then
                        requires
-                       if [[ -v SKIP_REASON ]]; then
-                               _output_notrun "$TEST_NAME"
-                               return 0
-                       fi
                fi
 
                local ret=0
                for TEST_DEV in "${TEST_DEVS[@]}"; do
                        TEST_DEV_SYSFS="${TEST_DEV_SYSFS_DIRS["$TEST_DEV"]}"
                        TEST_DEV_PART_SYSFS="${TEST_DEV_PART_SYSFS_DIRS["$TEST_DEV"]}"
-                       if (( !CAN_BE_ZONED )) && ! _test_dev_is_not_zoned; then
-                               _output_notrun "$TEST_NAME => $(basename "$TEST_DEV")"
-                               unset SKIP_REASON
-                               continue
-                       fi
-                       if declare -fF device_requires >/dev/null; then
-                               device_requires
-                               if [[ -v SKIP_REASON ]]; then
-                                       _output_notrun "$TEST_NAME => $(basename "$TEST_DEV")"
-                                       unset SKIP_REASON
-                                       continue
+
+                       local unset_skip_reason=0
+                       if [[ ! -v SKIP_REASON ]]; then
+                               unset_skip_reason=1
+                               if (( !CAN_BE_ZONED )) && ! _test_dev_is_not_zoned; then
+                                       SKIP_REASON="${TEST_DEV} is a zoned block device"
+                               elif declare -fF device_requires >/dev/null; then
+                                       device_requires
                                fi
                        fi
                        RESULTS_DIR="$OUTPUT/$(basename "$TEST_DEV")"
                        if ! _call_test test_device; then
                                ret=1
                        fi
+                       if (( unset_skip_reason )); then
+                               unset SKIP_REASON
+                       fi
                done
 
                if (( FALLBACK_DEVICE )); then
diff --git a/tests/meta/013 b/tests/meta/013
new file mode 100755 (executable)
index 0000000..fd9f8e9
--- /dev/null
@@ -0,0 +1,17 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-3.0+
+# Copyright (C) 2020 Omar Sandoval
+#
+# Test requires() with test_device().
+
+. tests/meta/rc
+
+DESCRIPTION="skip test_device() in requires()"
+
+requires() {
+       SKIP_REASON="(╯°□°)╯︵ ┻━┻"
+}
+
+test_device() {
+       echo '¯\_(ツ)_/¯'
+}
diff --git a/tests/meta/013.out b/tests/meta/013.out
new file mode 100644 (file)
index 0000000..183e1b8
--- /dev/null
@@ -0,0 +1,2 @@
+Running meta/013
+Test complete