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 0000000..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