From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39989) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UowxO-000517-OV for qemu-devel@nongnu.org; Tue, 18 Jun 2013 10:32:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UowxG-0006hU-3W for qemu-devel@nongnu.org; Tue, 18 Jun 2013 10:32:26 -0400 Received: from mail-wi0-x22b.google.com ([2a00:1450:400c:c05::22b]:55149) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UowxF-0006gz-Rq for qemu-devel@nongnu.org; Tue, 18 Jun 2013 10:32:18 -0400 Received: by mail-wi0-f171.google.com with SMTP id hj3so3503763wib.10 for ; Tue, 18 Jun 2013 07:32:17 -0700 (PDT) Date: Tue, 18 Jun 2013 16:32:12 +0200 From: Stefan Hajnoczi Message-ID: <20130618143212.GP7649@stefanha-thinkpad.redhat.com> References: <1371209999-15579-1-git-send-email-xiawenc@linux.vnet.ibm.com> <1371209999-15579-13-git-send-email-xiawenc@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1371209999-15579-13-git-send-email-xiawenc@linux.vnet.ibm.com> Subject: Re: [Qemu-devel] [PATCH V2 12/12] qemu-iotests: add 055 internal snapshot for block device test case List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Wenchao Xia Cc: kwolf@redhat.com, phrdina@redhat.com, famz@redhat.com, armbru@redhat.com, qemu-devel@nongnu.org, lcapitulino@redhat.com, stefanha@redhat.com, pbonzini@redhat.com, dietmar@proxmox.com On Fri, Jun 14, 2013 at 07:39:59PM +0800, Wenchao Xia wrote: > Signed-off-by: Wenchao Xia > --- > tests/qemu-iotests/055 | 157 ++++++++++++++++++++++++++++++++++++++++++++ > tests/qemu-iotests/055.out | 5 ++ drive-backup already uses 055, please name it 056 to avoid conflicts. > 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: > +# 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 . > +# > + > +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. > + 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.