From: John Snow <jsnow@redhat.com>
To: qemu-devel@nongnu.org
Cc: Eduardo Habkost <eduardo@habkost.net>,
Kevin Wolf <kwolf@redhat.com>, Thomas Huth <thuth@redhat.com>,
Beraldo Leal <bleal@redhat.com>,
qemu-block@nongnu.org, Hanna Reitz <hreitz@redhat.com>,
Cleber Rosa <crosa@redhat.com>, John Snow <jsnow@redhat.com>
Subject: [PATCH 2/4] iotests: add VerboseProcessError
Date: Tue, 15 Feb 2022 17:08:51 -0500 [thread overview]
Message-ID: <20220215220853.4179173-3-jsnow@redhat.com> (raw)
In-Reply-To: <20220215220853.4179173-1-jsnow@redhat.com>
This adds an Exception that extends the garden variety
subprocess.CalledProcessError. When this exception is raised, it will
still be caught when selecting for the stdlib variant.
The difference is that the str() method of this Exception also adds the
stdout/stderr logs. In effect, if this exception goes unhandled, Python
will print the output in a nice, highlighted box to the terminal so that
it's easy to spot.
This should save some headache from having to re-run test suites with
debugging enabled if we augment the exceptions we print more information
in the default case.
Signed-off-by: John Snow <jsnow@redhat.com>
---
tests/qemu-iotests/iotests.py | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
index 6ba65eb1ffe..7df393df2c3 100644
--- a/tests/qemu-iotests/iotests.py
+++ b/tests/qemu-iotests/iotests.py
@@ -30,6 +30,7 @@
import struct
import subprocess
import sys
+import textwrap
import time
from typing import (Any, Callable, Dict, Iterable, Iterator,
List, Optional, Sequence, TextIO, Tuple, Type, TypeVar)
@@ -39,6 +40,7 @@
from qemu.machine import qtest
from qemu.qmp import QMPMessage
+from qemu.utils import enboxify
# Use this logger for logging messages directly from the iotests module
logger = logging.getLogger('qemu.iotests')
@@ -117,6 +119,38 @@
sample_img_dir = os.environ['SAMPLE_IMG_DIR']
+class VerboseProcessError(subprocess.CalledProcessError):
+ """
+ The same as CalledProcessError, but more verbose.
+
+ This is useful for debugging failed calls during test executions.
+ The return code, signal (if any), and terminal output will be displayed
+ on unhandled exceptions.
+ """
+ def summary(self) -> str:
+ return super().__str__()
+
+ def __str__(self) -> str:
+ lmargin = ' '
+ width = shutil.get_terminal_size()[0] - len(lmargin)
+ sections = []
+
+ if self.stdout:
+ name = 'output' if self.stderr is None else 'stdout'
+ sections.append(enboxify(self.stdout, width, name))
+ else:
+ sections.append(f"{name}: N/A")
+
+ if self.stderr:
+ sections.append(enboxify(self.stderr, width, 'stderr'))
+ elif self.stderr is not None:
+ sections.append("stderr: N/A")
+
+ return os.linesep.join((
+ self.summary(),
+ textwrap.indent(os.linesep.join(sections), prefix=lmargin),
+ ))
+
@contextmanager
def change_log_level(
logger_name: str, level: int = logging.CRITICAL) -> Iterator[None]:
--
2.34.1
next prev parent reply other threads:[~2022-02-15 22:35 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-15 22:08 [PATCH 0/4] iotests: add detailed tracebacks to qemu_img() failures John Snow
2022-02-15 22:08 ` [PATCH 1/4] python/utils: add enboxify() text decoration utility John Snow
2022-02-15 22:55 ` Eric Blake
2022-02-15 23:53 ` John Snow
2022-02-15 23:57 ` Philippe Mathieu-Daudé via
2022-02-16 16:16 ` John Snow
2022-02-16 16:54 ` Hanna Reitz
2022-02-15 22:08 ` John Snow [this message]
2022-02-15 22:58 ` [PATCH 2/4] iotests: add VerboseProcessError Eric Blake
2022-02-15 23:54 ` John Snow
2022-02-15 22:08 ` [PATCH 3/4] iotests: Remove explicit checks for qemu_img() == 0 John Snow
2022-02-15 23:04 ` Eric Blake
2022-02-15 23:57 ` John Snow
2022-02-15 22:08 ` [PATCH 4/4] iotests: make qemu_img raise on non-zero rc by default John Snow
2022-02-15 23:09 ` Eric Blake
2022-02-16 0:02 ` John Snow
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220215220853.4179173-3-jsnow@redhat.com \
--to=jsnow@redhat.com \
--cc=bleal@redhat.com \
--cc=crosa@redhat.com \
--cc=eduardo@habkost.net \
--cc=hreitz@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).