Re: [Qemu-devel] [PATCH v4 4/8] qemu-iotests: add 055 drive-backup test case
Am 16.05.2013 um 10:36 hat Stefan Hajnoczi geschrieben: Testing drive-backup is similar to image streaming and drive mirroring. This test case is based on 041. Signed-off-by: Stefan Hajnoczi stefa...@redhat.com --- tests/qemu-iotests/055 | 230 + tests/qemu-iotests/055.out | 5 + tests/qemu-iotests/group | 1 + 3 files changed, 236 insertions(+) create mode 100755 tests/qemu-iotests/055 create mode 100644 tests/qemu-iotests/055.out diff --git a/tests/qemu-iotests/055 b/tests/qemu-iotests/055 new file mode 100755 index 000..bc2eebf --- /dev/null +++ b/tests/qemu-iotests/055 @@ -0,0 +1,230 @@ +#!/usr/bin/env python +# +# Tests for drive-backup +# +# Copyright (C) 2013 Red Hat, Inc. +# +# Based on 041. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# + +import time +import os +import iotests +from iotests import qemu_img, qemu_io + +test_img = os.path.join(iotests.test_dir, 'test.img') +target_img = os.path.join(iotests.test_dir, 'target.img') + +class DriveBackupTestCase(iotests.QMPTestCase): +'''Abstract base class for drive-backup test cases''' + +def assert_no_active_backups(self): +result = self.vm.qmp('query-block-jobs') +self.assert_qmp(result, 'return', []) + +def cancel_and_wait(self, drive='drive0'): +'''Cancel a block job and wait for it to finish''' +result = self.vm.qmp('block-job-cancel', device=drive) +self.assert_qmp(result, 'return', {}) + +cancelled = False +while not cancelled: +for event in self.vm.get_qmp_events(wait=True): +if event['event'] == 'BLOCK_JOB_COMPLETED' or \ + event['event'] == 'BLOCK_JOB_CANCELLED': +self.assert_qmp(event, 'data/type', 'backup') +self.assert_qmp(event, 'data/device', drive) +cancelled = True + +self.assert_no_active_backups() + +def complete_and_wait(self): +completed = False +while not completed: +for event in self.vm.get_qmp_events(wait=True): +if event['event'] == 'BLOCK_JOB_COMPLETED': +self.assert_qmp(event, 'data/type', 'backup') +self.assert_qmp(event, 'data/device', 'drive0') +self.assert_qmp(event, 'data/offset', self.image_len) +self.assert_qmp(event, 'data/len', self.image_len) +completed = True +self.assert_no_active_backups() + +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 compare_images() is an exact copy of its 041 counterparts, complete_and_wait() and cancel_and_wait() are the same as in 041 in the wait_ready = False case. Sounds like candidates for factoring out. Looks good otherwise. Kevin
Re: [Qemu-devel] [PATCH v4 4/8] qemu-iotests: add 055 drive-backup test case
On Wed, May 22, 2013 at 01:19:58PM +0200, Kevin Wolf wrote: Am 16.05.2013 um 10:36 hat Stefan Hajnoczi geschrieben: Testing drive-backup is similar to image streaming and drive mirroring. This test case is based on 041. Signed-off-by: Stefan Hajnoczi stefa...@redhat.com --- tests/qemu-iotests/055 | 230 + tests/qemu-iotests/055.out | 5 + tests/qemu-iotests/group | 1 + 3 files changed, 236 insertions(+) create mode 100755 tests/qemu-iotests/055 create mode 100644 tests/qemu-iotests/055.out diff --git a/tests/qemu-iotests/055 b/tests/qemu-iotests/055 new file mode 100755 index 000..bc2eebf --- /dev/null +++ b/tests/qemu-iotests/055 @@ -0,0 +1,230 @@ +#!/usr/bin/env python +# +# Tests for drive-backup +# +# Copyright (C) 2013 Red Hat, Inc. +# +# Based on 041. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# + +import time +import os +import iotests +from iotests import qemu_img, qemu_io + +test_img = os.path.join(iotests.test_dir, 'test.img') +target_img = os.path.join(iotests.test_dir, 'target.img') + +class DriveBackupTestCase(iotests.QMPTestCase): +'''Abstract base class for drive-backup test cases''' + +def assert_no_active_backups(self): +result = self.vm.qmp('query-block-jobs') +self.assert_qmp(result, 'return', []) + +def cancel_and_wait(self, drive='drive0'): +'''Cancel a block job and wait for it to finish''' +result = self.vm.qmp('block-job-cancel', device=drive) +self.assert_qmp(result, 'return', {}) + +cancelled = False +while not cancelled: +for event in self.vm.get_qmp_events(wait=True): +if event['event'] == 'BLOCK_JOB_COMPLETED' or \ + event['event'] == 'BLOCK_JOB_CANCELLED': +self.assert_qmp(event, 'data/type', 'backup') +self.assert_qmp(event, 'data/device', drive) +cancelled = True + +self.assert_no_active_backups() + +def complete_and_wait(self): +completed = False +while not completed: +for event in self.vm.get_qmp_events(wait=True): +if event['event'] == 'BLOCK_JOB_COMPLETED': +self.assert_qmp(event, 'data/type', 'backup') +self.assert_qmp(event, 'data/device', 'drive0') +self.assert_qmp(event, 'data/offset', self.image_len) +self.assert_qmp(event, 'data/len', self.image_len) +completed = True +self.assert_no_active_backups() + +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 compare_images() is an exact copy of its 041 counterparts, complete_and_wait() and cancel_and_wait() are the same as in 041 in the wait_ready = False case. Sounds like candidates for factoring out. Will fix.
[Qemu-devel] [PATCH v4 4/8] qemu-iotests: add 055 drive-backup test case
Testing drive-backup is similar to image streaming and drive mirroring. This test case is based on 041. Signed-off-by: Stefan Hajnoczi stefa...@redhat.com --- tests/qemu-iotests/055 | 230 + tests/qemu-iotests/055.out | 5 + tests/qemu-iotests/group | 1 + 3 files changed, 236 insertions(+) create mode 100755 tests/qemu-iotests/055 create mode 100644 tests/qemu-iotests/055.out diff --git a/tests/qemu-iotests/055 b/tests/qemu-iotests/055 new file mode 100755 index 000..bc2eebf --- /dev/null +++ b/tests/qemu-iotests/055 @@ -0,0 +1,230 @@ +#!/usr/bin/env python +# +# Tests for drive-backup +# +# Copyright (C) 2013 Red Hat, Inc. +# +# Based on 041. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# + +import time +import os +import iotests +from iotests import qemu_img, qemu_io + +test_img = os.path.join(iotests.test_dir, 'test.img') +target_img = os.path.join(iotests.test_dir, 'target.img') + +class DriveBackupTestCase(iotests.QMPTestCase): +'''Abstract base class for drive-backup test cases''' + +def assert_no_active_backups(self): +result = self.vm.qmp('query-block-jobs') +self.assert_qmp(result, 'return', []) + +def cancel_and_wait(self, drive='drive0'): +'''Cancel a block job and wait for it to finish''' +result = self.vm.qmp('block-job-cancel', device=drive) +self.assert_qmp(result, 'return', {}) + +cancelled = False +while not cancelled: +for event in self.vm.get_qmp_events(wait=True): +if event['event'] == 'BLOCK_JOB_COMPLETED' or \ + event['event'] == 'BLOCK_JOB_CANCELLED': +self.assert_qmp(event, 'data/type', 'backup') +self.assert_qmp(event, 'data/device', drive) +cancelled = True + +self.assert_no_active_backups() + +def complete_and_wait(self): +completed = False +while not completed: +for event in self.vm.get_qmp_events(wait=True): +if event['event'] == 'BLOCK_JOB_COMPLETED': +self.assert_qmp(event, 'data/type', 'backup') +self.assert_qmp(event, 'data/device', 'drive0') +self.assert_qmp(event, 'data/offset', self.image_len) +self.assert_qmp(event, 'data/len', self.image_len) +completed = True +self.assert_no_active_backups() + +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(DriveBackupTestCase): +image_len = 120 * 1024 * 1024 # MB + +def setUp(self): +qemu_img('create', '-f', iotests.imgfmt, test_img, str(TestSingleDrive.image_len)) +self.vm = iotests.VM().add_drive(test_img) +self.vm.launch() + +def tearDown(self): +self.vm.shutdown() +os.remove(test_img) +try: +os.remove(target_img) +except OSError: +pass + +def test_complete(self): +self.assert_no_active_backups() + +result = self.vm.qmp('drive-backup', device='drive0', + target=target_img) +self.assert_qmp(result, 'return', {}) + +self.complete_and_wait() +self.vm.shutdown() +self.assertTrue(self.compare_images(test_img, target_img), +'target image does not match source after backup') + +def test_cancel(self): +self.assert_no_active_backups() + +result = self.vm.qmp('drive-backup', device='drive0', + target=target_img) +self.assert_qmp(result, 'return', {}) + +self.cancel_and_wait() + +