[Piglit] [PATCH 22/35] framework/profile: Add support for meta profiles
Dylan Baker
dylan at pnwbakers.com
Wed Apr 4 22:27:10 UTC 2018
MetaProfiles are a single profile composed of more than one profile.
This is designed to allow the old all-inclusive names to continue to
exist without having to keep duplicates of each profile around. A
metaprofile simply declares that it needs profiles a, b, and c and then
runs those.
This allows an "all" meta profile to include opengl, shader, and
glslparser, for example.
A metaprofile is allowed to include XML or python based profiles.
---
framework/profile.py | 64 +++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 62 insertions(+), 2 deletions(-)
diff --git a/framework/profile.py b/framework/profile.py
index 2395b22..3975d06 100644
--- a/framework/profile.py
+++ b/framework/profile.py
@@ -359,6 +359,62 @@ class XMLProfile(object):
return iter(self._itertests())
+class MetaProfile(object):
+
+ """Holds multiple profiles but acts like one.
+
+ This is meant to allow classic profiles like all to exist after being
+ split.
+ """
+
+ def __init__(self, filename):
+ self.forced_test_list = []
+ self.filters = []
+ self.options = {
+ 'dmesg': get_dmesg(False),
+ 'monitor': Monitoring(False),
+ 'ignore_missing': False,
+ }
+
+ tree = et.parse(filename)
+ root = tree.getroot()
+ self._profiles = [load_test_profile(p.text)
+ for p in root.findall('.//Profile')]
+
+ for p in self._profiles:
+ p.options = self.options
+
+ def __len__(self):
+ if self.forced_test_list or self.filters:
+ return sum(1 for _ in self.itertests())
+ return sum(len(p) for p in self._profiles)
+
+ def setup(self):
+ pass
+
+ def teardown(self):
+ pass
+
+ def _itertests(self):
+ for p in self._profiles:
+ for k, v in p.itertests():
+ if all(f(k, v) for f in self.filters):
+ yield k, v
+
+ def itertests(self):
+ if self.forced_test_list:
+ alltests = dict(self._itertests())
+ opts = collections.OrderedDict()
+ for n in self.forced_test_list:
+ if self.options['ignore_missing'] and n not in alltests:
+ opts[n] = DummyTest(n, status.NOTRUN)
+ else:
+ opts[n] = alltests[n]
+ return six.iteritems(opts)
+ else:
+ return iter(self._itertests())
+
+
class TestProfile(object):
"""Class that holds a list of tests for execution.
@@ -456,14 +512,18 @@ def load_test_profile(filename, python=None):
XML is tried.
"""
name = os.path.splitext(os.path.basename(filename))[0]
- xml = os.path.join('tests', name + '.xml')
if not python:
+ meta = os.path.join(ROOT_DIR, 'tests', name + '.meta.xml')
+ if os.path.exists(meta):
+ return MetaProfile(meta)
+
xml = os.path.join(ROOT_DIR, 'tests', name + '.xml')
if os.path.exists(xml):
return XMLProfile(xml)
if python is False:
- raise exceptions.PiglitFatalError('Cannot open "tests/{}.xml"'.format(name))
+ raise exceptions.PiglitFatalError(
+ 'Cannot open "tests/{0}.xml" or "tests/{0}.meta.xml"'.format(name))
try:
mod = importlib.import_module('tests.{0}'.format(name))
--
git-series 0.9.1
More information about the Piglit
mailing list