xref: /qemu/tests/qemu-iotests/030 (revision db58f9c0)
137ce63ebSStefan Hajnoczi#!/usr/bin/env python
237ce63ebSStefan Hajnoczi#
337ce63ebSStefan Hajnoczi# Tests for image streaming.
437ce63ebSStefan Hajnoczi#
537ce63ebSStefan Hajnoczi# Copyright (C) 2012 IBM Corp.
637ce63ebSStefan Hajnoczi#
737ce63ebSStefan Hajnoczi# This program is free software; you can redistribute it and/or modify
837ce63ebSStefan Hajnoczi# it under the terms of the GNU General Public License as published by
937ce63ebSStefan Hajnoczi# the Free Software Foundation; either version 2 of the License, or
1037ce63ebSStefan Hajnoczi# (at your option) any later version.
1137ce63ebSStefan Hajnoczi#
1237ce63ebSStefan Hajnoczi# This program is distributed in the hope that it will be useful,
1337ce63ebSStefan Hajnoczi# but WITHOUT ANY WARRANTY; without even the implied warranty of
1437ce63ebSStefan Hajnoczi# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1537ce63ebSStefan Hajnoczi# GNU General Public License for more details.
1637ce63ebSStefan Hajnoczi#
1737ce63ebSStefan Hajnoczi# You should have received a copy of the GNU General Public License
1837ce63ebSStefan Hajnoczi# along with this program.  If not, see <http://www.gnu.org/licenses/>.
1937ce63ebSStefan Hajnoczi#
2037ce63ebSStefan Hajnoczi
2137ce63ebSStefan Hajnocziimport os
2237ce63ebSStefan Hajnocziimport iotests
2337ce63ebSStefan Hajnoczifrom iotests import qemu_img, qemu_io
2437ce63ebSStefan Hajnoczi
2537ce63ebSStefan Hajnoczibacking_img = os.path.join(iotests.test_dir, 'backing.img')
2637ce63ebSStefan Hajnoczitest_img = os.path.join(iotests.test_dir, 'test.img')
2737ce63ebSStefan Hajnoczi
2837ce63ebSStefan Hajnocziclass ImageStreamingTestCase(iotests.QMPTestCase):
2937ce63ebSStefan Hajnoczi    '''Abstract base class for image streaming test cases'''
3037ce63ebSStefan Hajnoczi
3137ce63ebSStefan Hajnoczi    def assert_no_active_streams(self):
3237ce63ebSStefan Hajnoczi        result = self.vm.qmp('query-block-jobs')
3337ce63ebSStefan Hajnoczi        self.assert_qmp(result, 'return', [])
3437ce63ebSStefan Hajnoczi
3537ce63ebSStefan Hajnocziclass TestSingleDrive(ImageStreamingTestCase):
3637ce63ebSStefan Hajnoczi    image_len = 1 * 1024 * 1024 # MB
3737ce63ebSStefan Hajnoczi
3837ce63ebSStefan Hajnoczi    def setUp(self):
3937ce63ebSStefan Hajnoczi        qemu_img('create', backing_img, str(TestSingleDrive.image_len))
4037ce63ebSStefan Hajnoczi        qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img)
4137ce63ebSStefan Hajnoczi        self.vm = iotests.VM().add_drive(test_img)
4237ce63ebSStefan Hajnoczi        self.vm.launch()
4337ce63ebSStefan Hajnoczi
4437ce63ebSStefan Hajnoczi    def tearDown(self):
4537ce63ebSStefan Hajnoczi        self.vm.shutdown()
4637ce63ebSStefan Hajnoczi        os.remove(test_img)
4737ce63ebSStefan Hajnoczi        os.remove(backing_img)
4837ce63ebSStefan Hajnoczi
4937ce63ebSStefan Hajnoczi    def test_stream(self):
5037ce63ebSStefan Hajnoczi        self.assert_no_active_streams()
5137ce63ebSStefan Hajnoczi
52*db58f9c0SStefan Hajnoczi        result = self.vm.qmp('block-stream', device='drive0')
5337ce63ebSStefan Hajnoczi        self.assert_qmp(result, 'return', {})
5437ce63ebSStefan Hajnoczi
5537ce63ebSStefan Hajnoczi        completed = False
5637ce63ebSStefan Hajnoczi        while not completed:
5737ce63ebSStefan Hajnoczi            for event in self.vm.get_qmp_events(wait=True):
5837ce63ebSStefan Hajnoczi                if event['event'] == 'BLOCK_JOB_COMPLETED':
5937ce63ebSStefan Hajnoczi                    self.assert_qmp(event, 'data/type', 'stream')
6037ce63ebSStefan Hajnoczi                    self.assert_qmp(event, 'data/device', 'drive0')
6137ce63ebSStefan Hajnoczi                    self.assert_qmp(event, 'data/offset', self.image_len)
6237ce63ebSStefan Hajnoczi                    self.assert_qmp(event, 'data/len', self.image_len)
6337ce63ebSStefan Hajnoczi                    completed = True
6437ce63ebSStefan Hajnoczi
6537ce63ebSStefan Hajnoczi        self.assert_no_active_streams()
6637ce63ebSStefan Hajnoczi
6737ce63ebSStefan Hajnoczi        self.assertFalse('sectors not allocated' in qemu_io('-c', 'map', test_img),
6837ce63ebSStefan Hajnoczi                         'image file not fully populated after streaming')
6937ce63ebSStefan Hajnoczi
7037ce63ebSStefan Hajnoczi    def test_device_not_found(self):
71*db58f9c0SStefan Hajnoczi        result = self.vm.qmp('block-stream', device='nonexistent')
7237ce63ebSStefan Hajnoczi        self.assert_qmp(result, 'error/class', 'DeviceNotFound')
7337ce63ebSStefan Hajnoczi
7437ce63ebSStefan Hajnocziclass TestStreamStop(ImageStreamingTestCase):
7537ce63ebSStefan Hajnoczi    image_len = 8 * 1024 * 1024 * 1024 # GB
7637ce63ebSStefan Hajnoczi
7737ce63ebSStefan Hajnoczi    def setUp(self):
7837ce63ebSStefan Hajnoczi        qemu_img('create', backing_img, str(TestStreamStop.image_len))
7937ce63ebSStefan Hajnoczi        qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img)
8037ce63ebSStefan Hajnoczi        self.vm = iotests.VM().add_drive(test_img)
8137ce63ebSStefan Hajnoczi        self.vm.launch()
8237ce63ebSStefan Hajnoczi
8337ce63ebSStefan Hajnoczi    def tearDown(self):
8437ce63ebSStefan Hajnoczi        self.vm.shutdown()
8537ce63ebSStefan Hajnoczi        os.remove(test_img)
8637ce63ebSStefan Hajnoczi        os.remove(backing_img)
8737ce63ebSStefan Hajnoczi
8837ce63ebSStefan Hajnoczi    def test_stream_stop(self):
8937ce63ebSStefan Hajnoczi        import time
9037ce63ebSStefan Hajnoczi
9137ce63ebSStefan Hajnoczi        self.assert_no_active_streams()
9237ce63ebSStefan Hajnoczi
93*db58f9c0SStefan Hajnoczi        result = self.vm.qmp('block-stream', device='drive0')
9437ce63ebSStefan Hajnoczi        self.assert_qmp(result, 'return', {})
9537ce63ebSStefan Hajnoczi
9637ce63ebSStefan Hajnoczi        time.sleep(1)
9737ce63ebSStefan Hajnoczi        events = self.vm.get_qmp_events(wait=False)
9837ce63ebSStefan Hajnoczi        self.assertEqual(events, [], 'unexpected QMP event: %s' % events)
9937ce63ebSStefan Hajnoczi
100*db58f9c0SStefan Hajnoczi        self.vm.qmp('block-job-cancel', device='drive0')
10137ce63ebSStefan Hajnoczi        self.assert_qmp(result, 'return', {})
10237ce63ebSStefan Hajnoczi
10337ce63ebSStefan Hajnoczi        cancelled = False
10437ce63ebSStefan Hajnoczi        while not cancelled:
10537ce63ebSStefan Hajnoczi            for event in self.vm.get_qmp_events(wait=True):
10637ce63ebSStefan Hajnoczi                if event['event'] == 'BLOCK_JOB_CANCELLED':
10737ce63ebSStefan Hajnoczi                    self.assert_qmp(event, 'data/type', 'stream')
10837ce63ebSStefan Hajnoczi                    self.assert_qmp(event, 'data/device', 'drive0')
10937ce63ebSStefan Hajnoczi                    cancelled = True
11037ce63ebSStefan Hajnoczi
11137ce63ebSStefan Hajnoczi        self.assert_no_active_streams()
11237ce63ebSStefan Hajnoczi
11337ce63ebSStefan Hajnoczi# This is a short performance test which is not run by default.
11437ce63ebSStefan Hajnoczi# Invoke "IMGFMT=qed ./030 TestSetSpeed.perf_test_set_speed"
11537ce63ebSStefan Hajnocziclass TestSetSpeed(ImageStreamingTestCase):
11637ce63ebSStefan Hajnoczi    image_len = 80 * 1024 * 1024 # MB
11737ce63ebSStefan Hajnoczi
11837ce63ebSStefan Hajnoczi    def setUp(self):
11937ce63ebSStefan Hajnoczi        qemu_img('create', backing_img, str(TestSetSpeed.image_len))
12037ce63ebSStefan Hajnoczi        qemu_img('create', '-f', iotests.imgfmt, '-o', 'backing_file=%s' % backing_img, test_img)
12137ce63ebSStefan Hajnoczi        self.vm = iotests.VM().add_drive(test_img)
12237ce63ebSStefan Hajnoczi        self.vm.launch()
12337ce63ebSStefan Hajnoczi
12437ce63ebSStefan Hajnoczi    def tearDown(self):
12537ce63ebSStefan Hajnoczi        self.vm.shutdown()
12637ce63ebSStefan Hajnoczi        os.remove(test_img)
12737ce63ebSStefan Hajnoczi        os.remove(backing_img)
12837ce63ebSStefan Hajnoczi
12937ce63ebSStefan Hajnoczi    def perf_test_set_speed(self):
13037ce63ebSStefan Hajnoczi        self.assert_no_active_streams()
13137ce63ebSStefan Hajnoczi
132*db58f9c0SStefan Hajnoczi        result = self.vm.qmp('block-stream', device='drive0')
13337ce63ebSStefan Hajnoczi        self.assert_qmp(result, 'return', {})
13437ce63ebSStefan Hajnoczi
135*db58f9c0SStefan Hajnoczi        result = self.vm.qmp('block-job-set-speed', device='drive0', value=8 * 1024 * 1024)
13637ce63ebSStefan Hajnoczi        self.assert_qmp(result, 'return', {})
13737ce63ebSStefan Hajnoczi
13837ce63ebSStefan Hajnoczi        completed = False
13937ce63ebSStefan Hajnoczi        while not completed:
14037ce63ebSStefan Hajnoczi            for event in self.vm.get_qmp_events(wait=True):
14137ce63ebSStefan Hajnoczi                if event['event'] == 'BLOCK_JOB_COMPLETED':
14237ce63ebSStefan Hajnoczi                    self.assert_qmp(event, 'data/type', 'stream')
14337ce63ebSStefan Hajnoczi                    self.assert_qmp(event, 'data/device', 'drive0')
14437ce63ebSStefan Hajnoczi                    self.assert_qmp(event, 'data/offset', self.image_len)
14537ce63ebSStefan Hajnoczi                    self.assert_qmp(event, 'data/len', self.image_len)
14637ce63ebSStefan Hajnoczi                    completed = True
14737ce63ebSStefan Hajnoczi
14837ce63ebSStefan Hajnoczi        self.assert_no_active_streams()
14937ce63ebSStefan Hajnoczi
15037ce63ebSStefan Hajnocziif __name__ == '__main__':
15137ce63ebSStefan Hajnoczi    iotests.main(supported_fmts=['qcow2', 'qed'])
152