26ba25
From e56b23f0bbf8c9c1149cfb4f0a1a3b002b5aec1b Mon Sep 17 00:00:00 2001
26ba25
From: John Snow <jsnow@redhat.com>
26ba25
Date: Wed, 10 Oct 2018 20:50:59 +0100
26ba25
Subject: [PATCH 2/3] iotests: Add failure matching to common.qemu
26ba25
26ba25
RH-Author: John Snow <jsnow@redhat.com>
26ba25
Message-id: <20181010205100.17689-3-jsnow@redhat.com>
26ba25
Patchwork-id: 82633
26ba25
O-Subject: [RHEL8/rhel qemu-kvm PATCH 2/3] iotests: Add failure matching to common.qemu
26ba25
Bugzilla: 1635583
26ba25
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
26ba25
RH-Acked-by: Max Reitz <mreitz@redhat.com>
26ba25
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
26ba25
26ba25
From: Max Reitz <mreitz@redhat.com>
26ba25
26ba25
Currently, common.qemu only allows to match for results indicating
26ba25
success.  The only way to fail is by provoking a timeout.  However,
26ba25
sometimes we do have a defined failure output and can match for that,
26ba25
which saves us from having to wait for the timeout in case of failure.
26ba25
Because failure can sometimes just result in a _notrun in the test, it
26ba25
is actually important to care about being able to fail quickly.
26ba25
26ba25
Also, sometimes we simply do not get any specific output in case of
26ba25
success.  The only way to handle this currently would be to define an
26ba25
error message as the string to look for, which means that actual success
26ba25
results in a timeout.  This is really bad because it unnecessarily slows
26ba25
down a succeeding test.
26ba25
26ba25
Therefore, this patch adds a new parameter $success_or_failure to
26ba25
_timed_wait_for and _send_qemu_cmd.  Setting this to a non-empty string
26ba25
makes both commands expect two match parameters: If the first matches,
26ba25
the function succeeds.  If the second matches, the function fails.
26ba25
26ba25
Signed-off-by: Max Reitz <mreitz@redhat.com>
26ba25
Message-id: 20180406151731.4285-2-mreitz@redhat.com
26ba25
Signed-off-by: Max Reitz <mreitz@redhat.com>
26ba25
(cherry picked from commit 81c6ddf49a76a663cea16c07a07d51b67c853209)
26ba25
Signed-off-by: John Snow <jsnow@redhat.com>
26ba25
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
26ba25
---
26ba25
 tests/qemu-iotests/common.qemu | 58 +++++++++++++++++++++++++++++++++++++-----
26ba25
 1 file changed, 51 insertions(+), 7 deletions(-)
26ba25
26ba25
diff --git a/tests/qemu-iotests/common.qemu b/tests/qemu-iotests/common.qemu
26ba25
index 85f66b8..f285484 100644
26ba25
--- a/tests/qemu-iotests/common.qemu
26ba25
+++ b/tests/qemu-iotests/common.qemu
26ba25
@@ -52,11 +52,29 @@ _in_fd=4
26ba25
 # response is not echoed out.
26ba25
 # If $mismatch_only is set, only non-matching responses will
26ba25
 # be echoed.
26ba25
+#
26ba25
+# If $success_or_failure is set, the meaning of the arguments is
26ba25
+# changed as follows:
26ba25
+# $2: A string to search for in the response; if found, this indicates
26ba25
+#     success and ${QEMU_STATUS[$1]} is set to 0.
26ba25
+# $3: A string to search for in the response; if found, this indicates
26ba25
+#     failure and the test is either aborted (if $qemu_error_no_exit
26ba25
+#     is not set) or ${QEMU_STATUS[$1]} is set to -1 (otherwise).
26ba25
 function _timed_wait_for()
26ba25
 {
26ba25
     local h=${1}
26ba25
     shift
26ba25
 
26ba25
+    if [ -z "${success_or_failure}" ]; then
26ba25
+        success_match=${*}
26ba25
+        failure_match=
26ba25
+    else
26ba25
+        success_match=${1}
26ba25
+        failure_match=${2}
26ba25
+    fi
26ba25
+
26ba25
+    timeout=yes
26ba25
+
26ba25
     QEMU_STATUS[$h]=0
26ba25
     while IFS= read -t ${QEMU_COMM_TIMEOUT} resp <&${QEMU_OUT[$h]}
26ba25
     do
26ba25
@@ -64,10 +82,18 @@ function _timed_wait_for()
26ba25
             echo "${resp}" | _filter_testdir | _filter_qemu \
26ba25
                            | _filter_qemu_io | _filter_qmp | _filter_hmp
26ba25
         fi
26ba25
-        grep -q "${*}" < <(echo "${resp}")
26ba25
+        if [ -n "${failure_match}" ]; then
26ba25
+            grep -q "${failure_match}" < <(echo "${resp}")
26ba25
+            if [ $? -eq 0 ]; then
26ba25
+                timeout=
26ba25
+                break
26ba25
+            fi
26ba25
+        fi
26ba25
+        grep -q "${success_match}" < <(echo "${resp}")
26ba25
         if [ $? -eq 0 ]; then
26ba25
             return
26ba25
-        elif [ -z "${silent}" ] && [ -n "${mismatch_only}" ]; then
26ba25
+        fi
26ba25
+        if [ -z "${silent}" ] && [ -n "${mismatch_only}" ]; then
26ba25
             echo "${resp}" | _filter_testdir | _filter_qemu \
26ba25
                            | _filter_qemu_io | _filter_qmp | _filter_hmp
26ba25
         fi
26ba25
@@ -75,8 +101,12 @@ function _timed_wait_for()
26ba25
     done
26ba25
     QEMU_STATUS[$h]=-1
26ba25
     if [ -z "${qemu_error_no_exit}" ]; then
26ba25
-        echo "Timeout waiting for ${*} on handle ${h}"
26ba25
-        exit 1  # Timeout means the test failed
26ba25
+        if [ -n "${timeout}" ]; then
26ba25
+            echo "Timeout waiting for ${success_match} on handle ${h}"
26ba25
+        else
26ba25
+            echo "Wrong response matching ${failure_match} on handle ${h}"
26ba25
+        fi
26ba25
+        exit 1  # Timeout or wrong match mean the test failed
26ba25
     fi
26ba25
 }
26ba25
 
26ba25
@@ -96,6 +126,11 @@ function _timed_wait_for()
26ba25
 # If $qemu_error_no_exit is set, then even if the expected response
26ba25
 # is not seen, we will not exit.  $QEMU_STATUS[$1] will be set it -1 in
26ba25
 # that case.
26ba25
+#
26ba25
+# If $success_or_failure is set, then the last two strings are the
26ba25
+# strings the response will be scanned for.  The first of the two
26ba25
+# indicates success, the latter indicates failure.  Failure is handled
26ba25
+# like a timeout.
26ba25
 function _send_qemu_cmd()
26ba25
 {
26ba25
     local h=${1}
26ba25
@@ -109,14 +144,23 @@ function _send_qemu_cmd()
26ba25
         use_error="no"
26ba25
     fi
26ba25
     # This array element extraction is done to accommodate pathnames with spaces
26ba25
-    cmd=${@: 1:${#@}-1}
26ba25
-    shift $(($# - 1))
26ba25
+    if [ -z "${success_or_failure}" ]; then
26ba25
+        cmd=${@: 1:${#@}-1}
26ba25
+        shift $(($# - 1))
26ba25
+    else
26ba25
+        cmd=${@: 1:${#@}-2}
26ba25
+        shift $(($# - 2))
26ba25
+    fi
26ba25
 
26ba25
     while [ ${count} -gt 0 ]
26ba25
     do
26ba25
         echo "${cmd}" >&${QEMU_IN[${h}]}
26ba25
         if [ -n "${1}" ]; then
26ba25
-            qemu_error_no_exit=${use_error} _timed_wait_for ${h} "${1}"
26ba25
+            if [ -z "${success_or_failure}" ]; then
26ba25
+                qemu_error_no_exit=${use_error} _timed_wait_for ${h} "${1}"
26ba25
+            else
26ba25
+                qemu_error_no_exit=${use_error} _timed_wait_for ${h} "${1}" "${2}"
26ba25
+            fi
26ba25
             if [ ${QEMU_STATUS[$h]} -eq 0 ]; then
26ba25
                 return
26ba25
             fi
26ba25
-- 
26ba25
1.8.3.1
26ba25