[Piglit] [PATCH 07/11] profile.py: Update docstrings and comments
Dylan Baker
baker.dylan.c at gmail.com
Fri Apr 25 13:27:39 PDT 2014
Adds or fixes docstrings and comments
---
framework/profile.py | 79 ++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 65 insertions(+), 14 deletions(-)
diff --git a/framework/profile.py b/framework/profile.py
index 0793f61..25f82b0 100644
--- a/framework/profile.py
+++ b/framework/profile.py
@@ -39,7 +39,25 @@ import framework.exectest
class TestProfile(object):
+ """ Class that holds a list of tests for execution
+
+ This class provides a container for storing tests in either a nested
+ dictionary structure (deprecated), or a flat dictionary structure with '/'
+ delimited groups.
+
+ Once a TestProfile object is created tests can be added to the test_list
+ name as a key/value pair, the key should be a fully qualified name for the
+ test, including it's group hierarchy and should be '/' delimited, with no
+ leading or trailing '/', the value should be an exectest.Test derived
+ object.
+
+ When the test list is filled calling TestProfile.run() will set the
+ execution of these tests off, and will flatten the nested group hierarchy
+ of self.tests and merge it with self.test_list
+
+ """
def __init__(self):
+ # Self.tests is deprecated, see above
self.tests = {}
self.test_list = {}
self.filters = []
@@ -56,7 +74,7 @@ class TestProfile(object):
def dmesg(self, not_dummy):
""" Set dmesg
- Argumnts:
+ Arguments:
not_dummy -- if Truthy dmesg will try to get a PosixDmesg, if Falsy it
will get a DummyDmesg
@@ -64,17 +82,20 @@ 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,
- tests['spec']['glsl-1.30']['preprocessor']['compiler']['void.frag']
+ self.tests['spec']['glsl-1.30']['preprocessor']['compiler']['void.frag']
would become:
- test_list['spec/glsl-1.30/preprocessor/compiler/void.frag']
- '''
+ 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 = os.path.join(prefix, key)
if isinstance(value, dict):
@@ -86,11 +107,22 @@ class TestProfile(object):
self.tests = {}
def prepare_test_list(self, env):
+ """ Prepare tests for running
+
+ Flattens the nested group hierarchy into a flat dictionary using '/'
+ delimited groups by calling self.flatten_group_hierarchy(), then
+ runs it's own filters plus the filters in the self.filters name
+
+ Arguments:
+ env - a core.Environment instance
+
+ """
self.flatten_group_hierarchy()
def matches_any_regexp(x, re_list):
return any(r.search(x) for r in re_list)
+ # The extra argument is needed to match check_all's API
def test_matches(path, test):
"""Filter for user-specified restrictions"""
return ((not env.filter or matches_any_regexp(path, env.filter))
@@ -99,6 +131,7 @@ class TestProfile(object):
filters = self.filters + [test_matches]
def check_all(item):
+ """ Checks group and test name against all filters """
path, test = item
for f in filters:
if not f(path, test):
@@ -113,7 +146,7 @@ class TestProfile(object):
""" Hook executed at the start of TestProfile.run
To make use of this hook one will need to subclass TestProfile, and
- set this to do something, as be dfault it will no-op
+ set this to do something, as be default it will no-op
"""
pass
@@ -122,18 +155,29 @@ class TestProfile(object):
""" Hook executed at the end of TestProfile.run
To make use of this hook one will need to subclass TestProfile, and
- set this to do something, as be dfault it will no-op
+ set this to do something, as be default it will no-op
"""
pass
def run(self, env, json_writer):
- '''
- Schedule all tests in profile for execution.
+ """ Runs all tests using Thread pool
- See ``Test.schedule`` and ``Test.run``.
- '''
- self.prepare_test_list(env)
+ When called this method will flatten out self.tests into
+ self.test_list, then will prepare a logger, pass env to the Test class,
+ and begin executing tests through it's Thread pools.
+
+ Based on the value of env.concurrent it will either run all the tests
+ concurrently, all serially, or first the thread safe tests then the
+ serial tests.
+
+ Finally it will print a final summary of the tests
+
+ Arguments:
+ env -- a core.Environment instance
+ json_writer -- a core.JSONWriter instance
+
+ """
self.pre_run_hook()
framework.exectest.Test.ENV = env
@@ -146,7 +190,7 @@ class TestProfile(object):
def test(pair):
""" Function to call test.execute from .map
- adds env and json_writer which are needed by Test.execute()
+ Adds env and json_writer which are needed by Test.execute()
"""
name, test = pair
@@ -215,6 +259,13 @@ def loadTestProfile(filename):
TestProfile instance. This loads that module and returns it or raises an
error.
+ This method doesn't care about file extensions as a way to be backwards
+ compatible with script wrapping piglit. 'tests/quick', 'tests/quick.tests',
+ and 'tests/quick.py' are all equally valid for filename
+
+ Arguments:
+ filename -- the name of a python module to get a 'profile' from
+
"""
mod = importlib.import_module('tests.{0}'.format(
os.path.splitext(os.path.basename(filename))[0]))
@@ -231,7 +282,7 @@ def merge_test_profiles(profiles):
""" Helper for loading and merging TestProfile instances
Takes paths to test profiles as arguments and returns a single merged
- TestPRofile instance.
+ TestProfile instance.
Arguments:
profiles -- a list of one or more paths to profile files.
--
2.0.0.rc0
More information about the Piglit
mailing list