3 # Tests for persistent dirty bitmaps.
5 # Copyright: Vladimir Sementsov-Ogievskiy 2015-2017
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
21 from __future__
import print_function
25 from iotests
import qemu_img
27 disk
= os
.path
.join(iotests
.test_dir
, 'disk')
28 disk_size
= 0x40000000 # 1G
30 # regions for qemu_io: (start, count) in bytes
31 regions1
= ((0x0fff00, 0x10000),
34 regions2
= ((0x10000000, 0x20000),
35 (0x3fff0000, 0x10000))
37 class TestPersistentDirtyBitmap(iotests
.QMPTestCase
):
40 qemu_img('create', '-f', iotests
.imgfmt
, disk
, str(disk_size
))
46 return iotests
.VM().add_drive(disk
)
49 return iotests
.VM().add_drive(disk
, opts
='readonly=on')
52 result
= self
.vm
.qmp('x-debug-block-dirty-bitmap-sha256',
53 node
='drive0', name
='bitmap0')
54 return result
['return']['sha256']
56 def checkBitmap(self
, sha256
):
57 result
= self
.vm
.qmp('x-debug-block-dirty-bitmap-sha256',
58 node
='drive0', name
='bitmap0')
59 self
.assert_qmp(result
, 'return/sha256', sha256
);
61 def writeRegions(self
, regions
):
63 self
.vm
.hmp_qemu_io('drive0',
66 def qmpAddBitmap(self
):
67 self
.vm
.qmp('block-dirty-bitmap-add', node
='drive0',
68 name
='bitmap0', persistent
=True)
70 def test_persistent(self
):
75 self
.writeRegions(regions1
)
76 sha256
= self
.getSha256()
80 self
.vm
= self
.mkVmRo()
84 #catch 'Persistent bitmaps are lost' possible error
85 log
= self
.vm
.get_log()
86 log
= re
.sub(r
'^\[I \d+\.\d+\] OPENED\n', '', log
)
87 log
= re
.sub(r
'\[I \+\d+\.\d+\] CLOSED\n?$', '', log
)
94 self
.checkBitmap(sha256
)
95 self
.writeRegions(regions2
)
96 sha256
= self
.getSha256()
101 self
.checkBitmap(sha256
)
105 if __name__
== '__main__':
106 iotests
.main(supported_fmts
=['qcow2'])