[Piglit] [RFC 30/30] profile.py: Remove TestProfile.tests

Dylan Baker baker.dylan.c at gmail.com
Tue Jan 27 14:59:04 PST 2015


This removes the tests attribute from TestProfile, which has been
deprecated for some time. The problem with tests is that it uses a
nested tree structure, which has to be flattened before tests can be
run. This creates a significant amount of overhead.

Signed-off-by: Dylan Baker <dylanx.c.baker at intel.com>
---
 framework/profile.py             | 53 +---------------------
 framework/tests/profile_tests.py | 98 ----------------------------------------
 2 files changed, 2 insertions(+), 149 deletions(-)

diff --git a/framework/profile.py b/framework/profile.py
index 6c3aa41..3a30e99 100644
--- a/framework/profile.py
+++ b/framework/profile.py
@@ -70,9 +70,8 @@ class TestDict(dict):  # pylint: disable=too-few-public-methods
                "Keys must be strings, but was {}".format(type(key))
         # None is required to make empty assignment work:
         # foo = Tree['a']
-        assert isinstance(value, (Tree, Test, types.NoneType)), \
-               "Values must be either a Tree or a Test, but was {}".format(
-                   type(value))
+        assert isinstance(value, (Test, types.NoneType)), \
+               "Values must be either a Test, but was {}".format(type(value))
 
         super(TestDict, self).__setitem__(key.lower(), value)
 
@@ -81,21 +80,6 @@ class TestDict(dict):  # pylint: disable=too-few-public-methods
         return super(TestDict, self).__getitem__(key.lower())
 
 
-class Tree(TestDict):  # pylint: disable=too-few-public-methods
-    """A tree-like object built with python dictionaries.
-
-    When a node that doesn't exist is requested it is automatically created
-    with a new Tree node.
-
-    This also enforces lowering of keys, both for getting and setting.
-
-    """
-    def __missing__(self, key):
-        """Automatically create new Tree nodes."""
-        self[key] = Tree()
-        return self[key]
-
-
 class TestProfile(object):
     """ Class that holds a list of tests for execution
 
@@ -115,8 +99,6 @@ class TestProfile(object):
 
     """
     def __init__(self):
-        # Self.tests is deprecated, see above
-        self.tests = Tree()
         self.test_list = TestDict()
         self.filters = []
         # Sets a default of a Dummy
@@ -140,34 +122,6 @@ class TestProfile(object):
         """
         self._dmesg = get_dmesg(not_dummy)
 
-    def _flatten_group_hierarchy(self):
-        """ Flatten nested dictionary structure
-
-        Convert Piglit's old hierarchical Group() structure into a flat
-        dictionary mapping from fully qualified test names to "Test" objects.
-
-        For example,
-        self.tests['spec']['glsl-1.30']['preprocessor']['compiler']['void.frag']
-        would become:
-        self.test_list['spec/glsl-1.30/preprocessor/compiler/void.frag']
-
-        """
-
-        def f(prefix, group, test_dict):
-            """ Recursively flatter nested dictionary tree """
-            for key, value in group.iteritems():
-                fullkey = grouptools.join(prefix, key)
-                if isinstance(value, Tree):
-                    f(fullkey, value, test_dict)
-                else:
-                    test_dict[fullkey] = value
-        f('', self.tests, self.test_list)
-
-        # Empty the nested structure. Do not use clear(), since it will
-        # actually remove all of the objects in the Tree, which will also
-        # remove them from self.test_list
-        self.tests = Tree()
-
     def _prepare_test_list(self, opts):
         """ Prepare tests for running
 
@@ -179,8 +133,6 @@ class TestProfile(object):
         opts - a core.Options instance
 
         """
-        self._flatten_group_hierarchy()
-
         def matches_any_regexp(x, re_list):
             return any(r.search(x) for r in re_list)
 
@@ -316,7 +268,6 @@ class TestProfile(object):
 
         """
         for profile in profiles:
-            self.tests.update(profile.tests)
             self.test_list.update(profile.test_list)
 
     @contextlib.contextmanager
diff --git a/framework/tests/profile_tests.py b/framework/tests/profile_tests.py
index 9723c8c..8f9dba0 100644
--- a/framework/tests/profile_tests.py
+++ b/framework/tests/profile_tests.py
@@ -82,54 +82,6 @@ def test_testprofile_set_dmesg_false():
     assert isinstance(profile_.dmesg, dmesg.DummyDmesg)
 
 
-def test_testprofile_flatten():
-    """ TestProfile.flatten_group_hierarchy flattens and empties self.tests """
-    test1 = utils.Test(['thing'])
-    test2 = utils.Test(['thing'])
-    test3 = utils.Test(['thing'])
-
-    profile_ = profile.TestProfile()
-    profile_.tests['group1']['test1'] = test1
-    profile_.tests['group1']['group2']['test2'] = test2
-    profile_.tests['group1']['group2']['group3']['test3'] = test3
-
-    profile_._flatten_group_hierarchy()
-
-    baseline = profile.Tree({
-        'group1/test1': test1,
-        'group1/group2/test2': test2,
-        'group1/group2/group3/test3': test3,
-    })
-
-    # Do not flatten until after baseline, since we want to use the same
-    # isntances and tests should be emptied by flattening
-    profile_._flatten_group_hierarchy()
-
-    # profile_.tests should have been emptied
-    nt.assert_dict_equal(profile_.tests, {})
-
-    nt.assert_dict_equal(profile_.test_list, baseline)
-
-
-def test_testprofile_update_tests():
-    """ TestProfile.update() updates TestProfile.tests
-
-    TestProfile.tests is deprecated, and this test should be removed eventually
-
-    """
-    profile1 = profile.TestProfile()
-    profile1.tests['group1']['test1'] = utils.Test(['test1'])
-
-    profile2 = profile.TestProfile()
-    baseline = profile2.tests
-    baseline['group2']['test2'] = utils.Test(['test2'])
-    baseline['group1']['test1'] = utils.Test(['test3'])
-
-    profile1.update(profile2)
-
-    nt.assert_dict_equal(profile1.tests, baseline)
-
-
 def test_testprofile_update_test_list():
     """ TestProfile.update() updates TestProfile.test_list """
     profile1 = profile.TestProfile()
@@ -145,56 +97,6 @@ def test_testprofile_update_test_list():
     nt.assert_dict_equal(profile1.test_list, profile2.test_list)
 
 
-def generate_prepare_test_list_flatten():
-    """ Generate tests for TestProfile.prepare_test_list() """
-    test1 = utils.Test(['thingy'])
-    test2 = utils.Test(['thingy'])
-    test3 = utils.Test(['thingy'])
-
-    tests = profile.Tree()
-    tests['group1']['test1'] = test1
-    tests['group1']['group3']['test2'] = test2
-    tests['group3']['test5'] = test3
-
-    test_list = {
-        'group1/test1': test1,
-        'group1/group3/test2': test2,
-        'group3/test5': test3,
-    }
-
-    check_flatten.description = \
-        "TestProfile.prepare_test_list flattens TestProfile.tests"
-    yield check_flatten, tests, test_list
-
-    check_mixed_flatten.description = \
-        "TestProfile flattening is correct when tess and test_list are set"
-    yield check_mixed_flatten, tests, test_list
-
-
- at nt.nottest
-def check_flatten(tests, testlist):
-    """ TestProfile.prepare_test_list flattens TestProfile.tests """
-    profile_ = profile.TestProfile()
-    profile_.tests = tests
-    profile_._flatten_group_hierarchy()
-
-    nt.assert_dict_equal(profile_.test_list, testlist)
-
-
- at nt.nottest
-def check_mixed_flatten(tests, testlist):
-    """ flattening is correct when tests and test_list are defined """
-    profile_ = profile.TestProfile()
-    profile_.tests = tests
-    profile_.test_list['test8'] = utils.Test(['other'])
-    profile_._flatten_group_hierarchy()
-
-    baseline = {'test8': profile_.test_list['test8']}
-    baseline.update(testlist)
-
-    nt.assert_dict_equal(profile_.test_list, baseline)
-
-
 def generate_prepare_test_list_test_test_matches():
     """ Generate tests for TestProfile.perpare_test_list filtering """
     data = {'group1/test1': 'thingy', 'group1/group3/test2': 'thing',
-- 
2.2.2



More information about the Piglit mailing list