iotests: fortify compare_images() against crashes

Fortify compare_images() to be more discerning about the status codes it
receives. If qemu_img() returns an exit code that implies it didn't
actually perform the comparison, treat that as an exceptional
circumstance and force the caller to be aware of the peril.

If a negative test is desired (perhaps to test how qemu_img compare
behaves on malformed images, for instance), it is still possible to
catch the exception in the test and deal with that circumstance
manually.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
Message-Id: <20220321201618.903471-6-jsnow@redhat.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
This commit is contained in:
John Snow 2022-03-21 16:16:05 -04:00 committed by Hanna Reitz
parent 2882ccf86a
commit 569131d585

View File

@ -507,11 +507,22 @@ def qemu_nbd_popen(*args):
p.kill()
p.wait()
def compare_images(img1, img2, fmt1=imgfmt, fmt2=imgfmt):
'''Return True if two image files are identical'''
res = qemu_img('compare', '-f', fmt1,
'-F', fmt2, img1, img2, check=False)
return res.returncode == 0
def compare_images(img1: str, img2: str,
fmt1: str = imgfmt, fmt2: str = imgfmt) -> bool:
"""
Compare two images with QEMU_IMG; return True if they are identical.
:raise CalledProcessError:
when qemu-img crashes or returns a status code of anything other
than 0 (identical) or 1 (different).
"""
try:
qemu_img('compare', '-f', fmt1, '-F', fmt2, img1, img2)
return True
except subprocess.CalledProcessError as exc:
if exc.returncode == 1:
return False
raise
def create_image(name, size):
'''Create a fully-allocated raw image with sector markers'''