qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 16/21] iotests: Add VM.assert_block_path()


From: Vladimir Sementsov-Ogievskiy
Subject: Re: [PATCH v3 16/21] iotests: Add VM.assert_block_path()
Date: Tue, 4 Feb 2020 17:09:45 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1

31.01.2020 0:44, Max Reitz wrote:
Signed-off-by: Max Reitz <address@hidden>
---
  tests/qemu-iotests/iotests.py | 56 +++++++++++++++++++++++++++++++++++
  1 file changed, 56 insertions(+)

diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py
index 01b58dcb50..69861cf05e 100644
--- a/tests/qemu-iotests/iotests.py
+++ b/tests/qemu-iotests/iotests.py
@@ -713,6 +713,62 @@ class VM(qtest.QEMUQtestMachine):
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)
+
+        for child_name in iter_path:
+            assert node is not None, 'Cannot follow path %s' % path

this error message will be a bit misleading if we failed to find root node. So,
may be add additional assert for root node, or at least
'Cannot follow path %s%s'.format(root, path)


It doesn't worth to resend only for this, apply it if you want and keep my r-b 
anyway.

+
+            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'([^\[]+)\[([^\]]+)\]')


--
Best regards,
Vladimir



reply via email to

[Prev in Thread] Current Thread [Next in Thread]