mirror of https://github.com/xemu-project/xemu.git
iotests: Add VM.assert_block_path()
Signed-off-by: Max Reitz <mreitz@redhat.com> Message-Id: <20200218103454.296704-15-mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
6644d0e619
commit
6a3d0f1e3f
|
@ -714,6 +714,65 @@ class VM(qtest.QEMUQtestMachine):
|
||||||
|
|
||||||
return fields.items() <= ret.items()
|
return fields.items() <= ret.items()
|
||||||
|
|
||||||
|
def assert_block_path(self, root, path, expected_node, graph=None):
|
||||||
|
"""
|
||||||
|
Check whether the node under the given path in the block graph
|
||||||
|
is @expected_node.
|
||||||
|
|
||||||
|
@root is the node name of the node where the @path is rooted.
|
||||||
|
|
||||||
|
@path is a string that consists of child names separated by
|
||||||
|
slashes. It must begin with a slash.
|
||||||
|
|
||||||
|
Examples for @root + @path:
|
||||||
|
- root="qcow2-node", path="/backing/file"
|
||||||
|
- root="quorum-node", path="/children.2/file"
|
||||||
|
|
||||||
|
Hypothetically, @path could be empty, in which case it would
|
||||||
|
point to @root. However, in practice this case is not useful
|
||||||
|
and hence not allowed.
|
||||||
|
|
||||||
|
@expected_node may be None. (All elements of the path but the
|
||||||
|
leaf must still exist.)
|
||||||
|
|
||||||
|
@graph may be None or the result of an x-debug-query-block-graph
|
||||||
|
call that has already been performed.
|
||||||
|
"""
|
||||||
|
if graph is None:
|
||||||
|
graph = self.qmp('x-debug-query-block-graph')['return']
|
||||||
|
|
||||||
|
iter_path = iter(path.split('/'))
|
||||||
|
|
||||||
|
# Must start with a /
|
||||||
|
assert next(iter_path) == ''
|
||||||
|
|
||||||
|
node = next((node for node in graph['nodes'] if node['name'] == root),
|
||||||
|
None)
|
||||||
|
|
||||||
|
# An empty @path is not allowed, so the root node must be present
|
||||||
|
assert node is not None, 'Root node %s not found' % root
|
||||||
|
|
||||||
|
for child_name in iter_path:
|
||||||
|
assert node is not None, 'Cannot follow path %s%s' % (root, path)
|
||||||
|
|
||||||
|
try:
|
||||||
|
node_id = next(edge['child'] for edge in graph['edges'] \
|
||||||
|
if edge['parent'] == node['id'] and
|
||||||
|
edge['name'] == child_name)
|
||||||
|
|
||||||
|
node = next(node for node in graph['nodes'] \
|
||||||
|
if node['id'] == node_id)
|
||||||
|
except StopIteration:
|
||||||
|
node = None
|
||||||
|
|
||||||
|
if node is None:
|
||||||
|
assert expected_node is None, \
|
||||||
|
'No node found under %s (but expected %s)' % \
|
||||||
|
(path, expected_node)
|
||||||
|
else:
|
||||||
|
assert node['name'] == expected_node, \
|
||||||
|
'Found node %s under %s (but expected %s)' % \
|
||||||
|
(node['name'], path, expected_node)
|
||||||
|
|
||||||
index_re = re.compile(r'([^\[]+)\[([^\]]+)\]')
|
index_re = re.compile(r'([^\[]+)\[([^\]]+)\]')
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue