|
From: | Wenchao Xia |
Subject: | Re: [Qemu-devel] [PATCH V2 12/12] qemu-iotests: add 055 internal snapshot for block device test case |
Date: | Wed, 19 Jun 2013 14:21:31 +0800 |
User-agent: | Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130509 Thunderbird/17.0.6 |
δΊ 2013-6-18 22:32, Stefan Hajnoczi ει:
On Fri, Jun 14, 2013 at 07:39:59PM +0800, Wenchao Xia wrote:Signed-off-by: Wenchao Xia <address@hidden> --- tests/qemu-iotests/055 | 157 ++++++++++++++++++++++++++++++++++++++++++++ tests/qemu-iotests/055.out | 5 ++drive-backup already uses 055, please name it 056 to avoid conflicts.
OK.
tests/qemu-iotests/group | 1 + 3 files changed, 163 insertions(+), 0 deletions(-) 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..7658f22 --- /dev/null +++ b/tests/qemu-iotests/055 @@ -0,0 +1,157 @@ +#!/usr/bin/env python +# +# Tests for internal snapshot. +#Copyright (C) 2013 IBM ... Based on 055:
oops....
+# Copyright (C) 2012 Red Hat, Inc. +# +# 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_drv_base_name = 'drive' + +class ImageSnapshotTestCase(iotests.QMPTestCase): + image_len = 120 * 1024 * 1024 # MB + + def __init__(self, *args): + self.expect = [] + super(ImageSnapshotTestCase, self).__init__(*args) + + def _setUp(self, test_img_base_name, image_num): + self.vm = iotests.VM() + for i in range(0, image_num): + filename = '%s%d' % (test_img_base_name, i) + img = os.path.join(iotests.test_dir, filename) + device = '%s%d' % (test_drv_base_name, i) + qemu_img('create', '-f', iotests.imgfmt, img, str(self.image_len)) + self.vm.add_drive(img) + self.expect.append({'image': img, 'device': device, + 'snapshots': [], 'snapshots_name_counter': 0}) + self.vm.launch() + + def tearDown(self): + self.vm.shutdown() + for i in range(0, len(self.expect)): + os.remove(self.expect[i]['image']) + + def createSnapshotInTransaction(self, snapshot_num): + actions = [] + for i in range(0, len(self.expect)): + num = self.expect[i]['snapshots_name_counter'] + for j in range(0, snapshot_num): + name = '%s_sn%d' % (self.expect[i]['device'], num) + num = num + 1 + self.expect[i]['snapshots'].append(name) + actions.append({ + 'type': 'blockdev-snapshot-internal-sync', + 'data': { 'device': self.expect[i]['device'], + 'name': name }, + }) + self.expect[i]['snapshots_name_counter'] = num + result = self.vm.qmp('transaction', actions = actions) + self.assert_qmp(result, 'return', {})This tests the success case. Please also use the 'Abort' action to test the error case.
Is "Abort" upstreamed? If yes I will add that part.
+ def verifySnapshotInfo(self): + expect = self.expect + result = self.vm.qmp('query-block') + for i in range(0, len(expect)): + image = None + for device in result['return']: + if device['device'] == expect[i]['device']: + image = device['inserted']['image'] + break + self.assertTrue(image != None) + self.assertTrue(len(image['snapshots']) == + len(expect[i]['snapshots'])) + for j in range(0, len(image['snapshots'])): + try: + expect[i]['snapshots'].index(image['snapshots'][j]['name']) + except: + print 'not full match, image info:\n%s\n, expect:%s\n' % \ + (str(image), str(expect)) + self.assertTrue(False) + + def deleteSnapshot(self, device, name): + result = self.vm.qmp('blockdev-snapshot-delete-internal-sync', + device = device, + name = name) + self.assert_qmp(result, 'return', {}) + expect = self.expect + sn_list_expect = None + for i in range(0, len(expect)): + if expect[i]['device'] == device : + sn_list_expect = expect[i]['snapshots'] + break + self.assertTrue(sn_list_expect != None) + try: + sn_list_expect.remove(name) + except: + print 'snapshot %s not found in expect:\n%s\n' % \ + (name, str(expect)) + self.assertTrue(False) + +class TestSingleTransaction(ImageSnapshotTestCase): + def setUp(self): + self._setUp('test_a.img', 1) + + def test_create(self): + self.createSnapshotInTransaction(1) + self.verifySnapshotInfo() + + def test_error_name(self): + actions = [{'type': 'blockdev-snapshot-internal-sync', + 'data': { 'device': self.expect[0]['device'], + 'name': '1234' }, + }] + result = self.vm.qmp('transaction', actions = actions) + self.assert_qmp(result, 'error/class', 'GenericError')Please check that empty names error too.
OK. -- Best Regards Wenchao Xia
[Prev in Thread] | Current Thread | [Next in Thread] |