xref: /qemu/tests/qemu-iotests/165 (revision fc905d3a0cd527e70af5fcce19c43596b7f5c046)
1*fc905d3aSVladimir Sementsov-Ogievskiy#!/usr/bin/env python
2*fc905d3aSVladimir Sementsov-Ogievskiy#
3*fc905d3aSVladimir Sementsov-Ogievskiy# Tests for persistent dirty bitmaps.
4*fc905d3aSVladimir Sementsov-Ogievskiy#
5*fc905d3aSVladimir Sementsov-Ogievskiy# Copyright: Vladimir Sementsov-Ogievskiy 2015-2017
6*fc905d3aSVladimir Sementsov-Ogievskiy#
7*fc905d3aSVladimir Sementsov-Ogievskiy# This program is free software; you can redistribute it and/or modify
8*fc905d3aSVladimir Sementsov-Ogievskiy# it under the terms of the GNU General Public License as published by
9*fc905d3aSVladimir Sementsov-Ogievskiy# the Free Software Foundation; either version 2 of the License, or
10*fc905d3aSVladimir Sementsov-Ogievskiy# (at your option) any later version.
11*fc905d3aSVladimir Sementsov-Ogievskiy#
12*fc905d3aSVladimir Sementsov-Ogievskiy# This program is distributed in the hope that it will be useful,
13*fc905d3aSVladimir Sementsov-Ogievskiy# but WITHOUT ANY WARRANTY; without even the implied warranty of
14*fc905d3aSVladimir Sementsov-Ogievskiy# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*fc905d3aSVladimir Sementsov-Ogievskiy# GNU General Public License for more details.
16*fc905d3aSVladimir Sementsov-Ogievskiy#
17*fc905d3aSVladimir Sementsov-Ogievskiy# You should have received a copy of the GNU General Public License
18*fc905d3aSVladimir Sementsov-Ogievskiy# along with this program.  If not, see <http://www.gnu.org/licenses/>.
19*fc905d3aSVladimir Sementsov-Ogievskiy#
20*fc905d3aSVladimir Sementsov-Ogievskiy
21*fc905d3aSVladimir Sementsov-Ogievskiyimport os
22*fc905d3aSVladimir Sementsov-Ogievskiyimport re
23*fc905d3aSVladimir Sementsov-Ogievskiyimport iotests
24*fc905d3aSVladimir Sementsov-Ogievskiyfrom iotests import qemu_img
25*fc905d3aSVladimir Sementsov-Ogievskiy
26*fc905d3aSVladimir Sementsov-Ogievskiydisk = os.path.join(iotests.test_dir, 'disk')
27*fc905d3aSVladimir Sementsov-Ogievskiydisk_size = 0x40000000 # 1G
28*fc905d3aSVladimir Sementsov-Ogievskiy
29*fc905d3aSVladimir Sementsov-Ogievskiy# regions for qemu_io: (start, count) in bytes
30*fc905d3aSVladimir Sementsov-Ogievskiyregions1 = ((0,        0x100000),
31*fc905d3aSVladimir Sementsov-Ogievskiy            (0x200000, 0x100000))
32*fc905d3aSVladimir Sementsov-Ogievskiy
33*fc905d3aSVladimir Sementsov-Ogievskiyregions2 = ((0x10000000, 0x20000),
34*fc905d3aSVladimir Sementsov-Ogievskiy            (0x3fff0000, 0x10000))
35*fc905d3aSVladimir Sementsov-Ogievskiy
36*fc905d3aSVladimir Sementsov-Ogievskiyclass TestPersistentDirtyBitmap(iotests.QMPTestCase):
37*fc905d3aSVladimir Sementsov-Ogievskiy
38*fc905d3aSVladimir Sementsov-Ogievskiy    def setUp(self):
39*fc905d3aSVladimir Sementsov-Ogievskiy        qemu_img('create', '-f', iotests.imgfmt, disk, str(disk_size))
40*fc905d3aSVladimir Sementsov-Ogievskiy
41*fc905d3aSVladimir Sementsov-Ogievskiy    def tearDown(self):
42*fc905d3aSVladimir Sementsov-Ogievskiy        os.remove(disk)
43*fc905d3aSVladimir Sementsov-Ogievskiy
44*fc905d3aSVladimir Sementsov-Ogievskiy    def mkVm(self):
45*fc905d3aSVladimir Sementsov-Ogievskiy        return iotests.VM().add_drive(disk)
46*fc905d3aSVladimir Sementsov-Ogievskiy
47*fc905d3aSVladimir Sementsov-Ogievskiy    def mkVmRo(self):
48*fc905d3aSVladimir Sementsov-Ogievskiy        return iotests.VM().add_drive(disk, opts='readonly=on')
49*fc905d3aSVladimir Sementsov-Ogievskiy
50*fc905d3aSVladimir Sementsov-Ogievskiy    def getSha256(self):
51*fc905d3aSVladimir Sementsov-Ogievskiy        result = self.vm.qmp('x-debug-block-dirty-bitmap-sha256',
52*fc905d3aSVladimir Sementsov-Ogievskiy                             node='drive0', name='bitmap0')
53*fc905d3aSVladimir Sementsov-Ogievskiy        return result['return']['sha256']
54*fc905d3aSVladimir Sementsov-Ogievskiy
55*fc905d3aSVladimir Sementsov-Ogievskiy    def checkBitmap(self, sha256):
56*fc905d3aSVladimir Sementsov-Ogievskiy        result = self.vm.qmp('x-debug-block-dirty-bitmap-sha256',
57*fc905d3aSVladimir Sementsov-Ogievskiy                             node='drive0', name='bitmap0')
58*fc905d3aSVladimir Sementsov-Ogievskiy        self.assert_qmp(result, 'return/sha256', sha256);
59*fc905d3aSVladimir Sementsov-Ogievskiy
60*fc905d3aSVladimir Sementsov-Ogievskiy    def writeRegions(self, regions):
61*fc905d3aSVladimir Sementsov-Ogievskiy        for r in regions:
62*fc905d3aSVladimir Sementsov-Ogievskiy            self.vm.hmp_qemu_io('drive0',
63*fc905d3aSVladimir Sementsov-Ogievskiy                                'write %d %d' % r)
64*fc905d3aSVladimir Sementsov-Ogievskiy
65*fc905d3aSVladimir Sementsov-Ogievskiy    def qmpAddBitmap(self):
66*fc905d3aSVladimir Sementsov-Ogievskiy        self.vm.qmp('block-dirty-bitmap-add', node='drive0',
67*fc905d3aSVladimir Sementsov-Ogievskiy                    name='bitmap0', persistent=True, autoload=True)
68*fc905d3aSVladimir Sementsov-Ogievskiy
69*fc905d3aSVladimir Sementsov-Ogievskiy    def test_persistent(self):
70*fc905d3aSVladimir Sementsov-Ogievskiy        self.vm = self.mkVm()
71*fc905d3aSVladimir Sementsov-Ogievskiy        self.vm.launch()
72*fc905d3aSVladimir Sementsov-Ogievskiy        self.qmpAddBitmap()
73*fc905d3aSVladimir Sementsov-Ogievskiy
74*fc905d3aSVladimir Sementsov-Ogievskiy        self.writeRegions(regions1)
75*fc905d3aSVladimir Sementsov-Ogievskiy        sha256 = self.getSha256()
76*fc905d3aSVladimir Sementsov-Ogievskiy
77*fc905d3aSVladimir Sementsov-Ogievskiy        self.vm.shutdown()
78*fc905d3aSVladimir Sementsov-Ogievskiy
79*fc905d3aSVladimir Sementsov-Ogievskiy        self.vm = self.mkVmRo()
80*fc905d3aSVladimir Sementsov-Ogievskiy        self.vm.launch()
81*fc905d3aSVladimir Sementsov-Ogievskiy        self.vm.shutdown()
82*fc905d3aSVladimir Sementsov-Ogievskiy
83*fc905d3aSVladimir Sementsov-Ogievskiy        #catch 'Persistent bitmaps are lost' possible error
84*fc905d3aSVladimir Sementsov-Ogievskiy        log = self.vm.get_log()
85*fc905d3aSVladimir Sementsov-Ogievskiy        log = re.sub(r'^\[I \d+\.\d+\] OPENED\n', '', log)
86*fc905d3aSVladimir Sementsov-Ogievskiy        log = re.sub(r'\[I \+\d+\.\d+\] CLOSED\n?$', '', log)
87*fc905d3aSVladimir Sementsov-Ogievskiy        if log:
88*fc905d3aSVladimir Sementsov-Ogievskiy            print log
89*fc905d3aSVladimir Sementsov-Ogievskiy
90*fc905d3aSVladimir Sementsov-Ogievskiy        self.vm = self.mkVm()
91*fc905d3aSVladimir Sementsov-Ogievskiy        self.vm.launch()
92*fc905d3aSVladimir Sementsov-Ogievskiy
93*fc905d3aSVladimir Sementsov-Ogievskiy        self.checkBitmap(sha256)
94*fc905d3aSVladimir Sementsov-Ogievskiy        self.writeRegions(regions2)
95*fc905d3aSVladimir Sementsov-Ogievskiy        sha256 = self.getSha256()
96*fc905d3aSVladimir Sementsov-Ogievskiy
97*fc905d3aSVladimir Sementsov-Ogievskiy        self.vm.shutdown()
98*fc905d3aSVladimir Sementsov-Ogievskiy        self.vm.launch()
99*fc905d3aSVladimir Sementsov-Ogievskiy
100*fc905d3aSVladimir Sementsov-Ogievskiy        self.checkBitmap(sha256)
101*fc905d3aSVladimir Sementsov-Ogievskiy
102*fc905d3aSVladimir Sementsov-Ogievskiy        self.vm.shutdown()
103*fc905d3aSVladimir Sementsov-Ogievskiy
104*fc905d3aSVladimir Sementsov-Ogievskiyif __name__ == '__main__':
105*fc905d3aSVladimir Sementsov-Ogievskiy    iotests.main(supported_fmts=['qcow2'])
106