[Piglit] [Patch v2 2/2] results.py: Add recursive_update method to TestResult

Dylan Baker baker.dylan.c at gmail.com
Wed Jul 2 10:17:03 PDT 2014


This method is used during PiglitTest.interpret_result() to update
subtest entries safely. I chose this approach since it is robust,
reusable, and it felt more natural as a part of TestResult than putting
it in PiglitTest.interpret_result()

v2: - Fix commit message

Signed-off-by: Dylan Baker <baker.dylan.c at gmail.com>
---
 framework/exectest.py |  2 +-
 framework/results.py  | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/framework/exectest.py b/framework/exectest.py
index e4a2344..fcc29af 100644
--- a/framework/exectest.py
+++ b/framework/exectest.py
@@ -279,6 +279,6 @@ class PiglitTest(Test):
         outpiglit = (s[7:] for s in outlines if s.startswith('PIGLIT:'))
 
         for piglit in outpiglit:
-            self.result.update(json.loads(piglit))
+            self.result.recursive_update(json.loads(piglit))
         self.result['out'] = '\n'.join(
             s for s in outlines if not s.startswith('PIGLIT:'))
diff --git a/framework/results.py b/framework/results.py
index a715b29..88d962d 100644
--- a/framework/results.py
+++ b/framework/results.py
@@ -248,6 +248,38 @@ class TestResult(dict):
             # normally
             pass
 
+    def recursive_update(self, dictionary):
+        """ Recursively update the TestResult
+
+        The problem with using self.update() is this:
+        >>> t = TestResult()
+        >>> t.update({'subtest': {'test1': 'pass'}})
+        >>> t.update({'subtest': {'test2': 'pass'}})
+        >>> t['subtest']
+        {'test2': 'pass'}
+
+        This function is different, because it recursively updates self, it
+        doesn't clobber existing entires in the same way
+        >>> t = TestResult()
+        >>> t.recursive_update({'subtest': {'test1': 'pass'}})
+        >>> t.recursive_update({'subtest': {'test2': 'pass'}})
+        >>> t['subtest']
+        {'test1': 'pass', 'test2': 'pass'}
+
+        Arguments:
+        dictionary -- a dictionary instance to update the TestResult with
+
+        """
+        def update(d, u):
+            for k, v in u.iteritems():
+                if isinstance(v, dict):
+                    d[k] = update(d.get(k, {}), v)
+                else:
+                    d[k] = u[k]
+            return d
+
+        update(self, dictionary)
+
 
 class TestrunResult(object):
     def __init__(self, resultfile=None):
-- 
2.0.0



More information about the Piglit mailing list