Re: [Qemu-devel] [PATCH v4 4/8] qemu-iotests: add 055 drive-backup test case

2013-05-22 Thread Kevin Wolf
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

2013-05-22 Thread Stefan Hajnoczi
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

2013-05-16 Thread Stefan Hajnoczi
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()
+
+