mirror of
https://git.proxmox.com/git/qemu
synced 2025-08-07 09:40:44 +00:00
qemu-iotests: make compare_images() common
The iotests.compare_images() function returns True if two image files have the identical data. Previously this was implemented by converting images to raw and then comparing their contents using Python. Since "qemu-img compare" is now available and is more efficient, switch to it. This function will be reused by the 'drive-backup' test case. Suggested-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
2575fe16d2
commit
3a3918c396
@ -80,27 +80,6 @@ class ImageMirroringTestCase(iotests.QMPTestCase):
|
|||||||
i = i + 512
|
i = i + 512
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
def compare_images(self, img1, img2):
|
|
||||||
try:
|
|
||||||
qemu_img('convert', '-f', iotests.imgfmt, '-O', 'raw', img1, img1 + '.raw')
|
|
||||||
qemu_img('convert', '-f', iotests.imgfmt, '-O', 'raw', img2, img2 + '.raw')
|
|
||||||
file1 = open(img1 + '.raw', 'r')
|
|
||||||
file2 = open(img2 + '.raw', 'r')
|
|
||||||
return file1.read() == file2.read()
|
|
||||||
finally:
|
|
||||||
if file1 is not None:
|
|
||||||
file1.close()
|
|
||||||
if file2 is not None:
|
|
||||||
file2.close()
|
|
||||||
try:
|
|
||||||
os.remove(img1 + '.raw')
|
|
||||||
except OSError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
os.remove(img2 + '.raw')
|
|
||||||
except OSError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
class TestSingleDrive(ImageMirroringTestCase):
|
class TestSingleDrive(ImageMirroringTestCase):
|
||||||
image_len = 1 * 1024 * 1024 # MB
|
image_len = 1 * 1024 * 1024 # MB
|
||||||
|
|
||||||
@ -130,7 +109,7 @@ class TestSingleDrive(ImageMirroringTestCase):
|
|||||||
result = self.vm.qmp('query-block')
|
result = self.vm.qmp('query-block')
|
||||||
self.assert_qmp(result, 'return[0]/inserted/file', target_img)
|
self.assert_qmp(result, 'return[0]/inserted/file', target_img)
|
||||||
self.vm.shutdown()
|
self.vm.shutdown()
|
||||||
self.assertTrue(self.compare_images(test_img, target_img),
|
self.assertTrue(iotests.compare_images(test_img, target_img),
|
||||||
'target image does not match source after mirroring')
|
'target image does not match source after mirroring')
|
||||||
|
|
||||||
def test_cancel(self):
|
def test_cancel(self):
|
||||||
@ -156,7 +135,7 @@ class TestSingleDrive(ImageMirroringTestCase):
|
|||||||
result = self.vm.qmp('query-block')
|
result = self.vm.qmp('query-block')
|
||||||
self.assert_qmp(result, 'return[0]/inserted/file', test_img)
|
self.assert_qmp(result, 'return[0]/inserted/file', test_img)
|
||||||
self.vm.shutdown()
|
self.vm.shutdown()
|
||||||
self.assertTrue(self.compare_images(test_img, target_img),
|
self.assertTrue(iotests.compare_images(test_img, target_img),
|
||||||
'target image does not match source after mirroring')
|
'target image does not match source after mirroring')
|
||||||
|
|
||||||
def test_pause(self):
|
def test_pause(self):
|
||||||
@ -182,7 +161,7 @@ class TestSingleDrive(ImageMirroringTestCase):
|
|||||||
|
|
||||||
self.complete_and_wait()
|
self.complete_and_wait()
|
||||||
self.vm.shutdown()
|
self.vm.shutdown()
|
||||||
self.assertTrue(self.compare_images(test_img, target_img),
|
self.assertTrue(iotests.compare_images(test_img, target_img),
|
||||||
'target image does not match source after mirroring')
|
'target image does not match source after mirroring')
|
||||||
|
|
||||||
def test_small_buffer(self):
|
def test_small_buffer(self):
|
||||||
@ -197,7 +176,7 @@ class TestSingleDrive(ImageMirroringTestCase):
|
|||||||
result = self.vm.qmp('query-block')
|
result = self.vm.qmp('query-block')
|
||||||
self.assert_qmp(result, 'return[0]/inserted/file', target_img)
|
self.assert_qmp(result, 'return[0]/inserted/file', target_img)
|
||||||
self.vm.shutdown()
|
self.vm.shutdown()
|
||||||
self.assertTrue(self.compare_images(test_img, target_img),
|
self.assertTrue(iotests.compare_images(test_img, target_img),
|
||||||
'target image does not match source after mirroring')
|
'target image does not match source after mirroring')
|
||||||
|
|
||||||
def test_small_buffer2(self):
|
def test_small_buffer2(self):
|
||||||
@ -213,7 +192,7 @@ class TestSingleDrive(ImageMirroringTestCase):
|
|||||||
result = self.vm.qmp('query-block')
|
result = self.vm.qmp('query-block')
|
||||||
self.assert_qmp(result, 'return[0]/inserted/file', target_img)
|
self.assert_qmp(result, 'return[0]/inserted/file', target_img)
|
||||||
self.vm.shutdown()
|
self.vm.shutdown()
|
||||||
self.assertTrue(self.compare_images(test_img, target_img),
|
self.assertTrue(iotests.compare_images(test_img, target_img),
|
||||||
'target image does not match source after mirroring')
|
'target image does not match source after mirroring')
|
||||||
|
|
||||||
def test_large_cluster(self):
|
def test_large_cluster(self):
|
||||||
@ -229,7 +208,7 @@ class TestSingleDrive(ImageMirroringTestCase):
|
|||||||
result = self.vm.qmp('query-block')
|
result = self.vm.qmp('query-block')
|
||||||
self.assert_qmp(result, 'return[0]/inserted/file', target_img)
|
self.assert_qmp(result, 'return[0]/inserted/file', target_img)
|
||||||
self.vm.shutdown()
|
self.vm.shutdown()
|
||||||
self.assertTrue(self.compare_images(test_img, target_img),
|
self.assertTrue(iotests.compare_images(test_img, target_img),
|
||||||
'target image does not match source after mirroring')
|
'target image does not match source after mirroring')
|
||||||
|
|
||||||
def test_medium_not_found(self):
|
def test_medium_not_found(self):
|
||||||
@ -256,7 +235,7 @@ class TestMirrorNoBacking(ImageMirroringTestCase):
|
|||||||
|
|
||||||
def compare_images(self, img1, img2):
|
def compare_images(self, img1, img2):
|
||||||
self.create_image(target_backing_img, TestMirrorNoBacking.image_len)
|
self.create_image(target_backing_img, TestMirrorNoBacking.image_len)
|
||||||
return ImageMirroringTestCase.compare_images(self, img1, img2)
|
return iotests.compare_images(img1, img2)
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.create_image(backing_img, TestMirrorNoBacking.image_len)
|
self.create_image(backing_img, TestMirrorNoBacking.image_len)
|
||||||
@ -353,7 +332,7 @@ class TestMirrorResized(ImageMirroringTestCase):
|
|||||||
result = self.vm.qmp('query-block')
|
result = self.vm.qmp('query-block')
|
||||||
self.assert_qmp(result, 'return[0]/inserted/file', target_img)
|
self.assert_qmp(result, 'return[0]/inserted/file', target_img)
|
||||||
self.vm.shutdown()
|
self.vm.shutdown()
|
||||||
self.assertTrue(self.compare_images(test_img, target_img),
|
self.assertTrue(iotests.compare_images(test_img, target_img),
|
||||||
'target image does not match source after mirroring')
|
'target image does not match source after mirroring')
|
||||||
|
|
||||||
def test_complete_full(self):
|
def test_complete_full(self):
|
||||||
@ -367,7 +346,7 @@ class TestMirrorResized(ImageMirroringTestCase):
|
|||||||
result = self.vm.qmp('query-block')
|
result = self.vm.qmp('query-block')
|
||||||
self.assert_qmp(result, 'return[0]/inserted/file', target_img)
|
self.assert_qmp(result, 'return[0]/inserted/file', target_img)
|
||||||
self.vm.shutdown()
|
self.vm.shutdown()
|
||||||
self.assertTrue(self.compare_images(test_img, target_img),
|
self.assertTrue(iotests.compare_images(test_img, target_img),
|
||||||
'target image does not match source after mirroring')
|
'target image does not match source after mirroring')
|
||||||
|
|
||||||
class TestReadErrors(ImageMirroringTestCase):
|
class TestReadErrors(ImageMirroringTestCase):
|
||||||
@ -487,7 +466,7 @@ new_state = "1"
|
|||||||
|
|
||||||
# Detach blkdebug to compare images successfully
|
# Detach blkdebug to compare images successfully
|
||||||
qemu_img('rebase', '-f', iotests.imgfmt, '-u', '-b', backing_img, test_img)
|
qemu_img('rebase', '-f', iotests.imgfmt, '-u', '-b', backing_img, test_img)
|
||||||
self.assertTrue(self.compare_images(test_img, target_img),
|
self.assertTrue(iotests.compare_images(test_img, target_img),
|
||||||
'target image does not match source after mirroring')
|
'target image does not match source after mirroring')
|
||||||
|
|
||||||
def test_stop_read(self):
|
def test_stop_read(self):
|
||||||
|
@ -51,6 +51,11 @@ def qemu_io(*args):
|
|||||||
args = qemu_io_args + list(args)
|
args = qemu_io_args + list(args)
|
||||||
return subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0]
|
return subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0]
|
||||||
|
|
||||||
|
def compare_images(img1, img2):
|
||||||
|
'''Return True if two image files are identical'''
|
||||||
|
return qemu_img('compare', '-f', imgfmt,
|
||||||
|
'-F', imgfmt, img1, img2) == 0
|
||||||
|
|
||||||
class VM(object):
|
class VM(object):
|
||||||
'''A QEMU VM'''
|
'''A QEMU VM'''
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user