diff options
author | Dylan Baker <baker.dylan.c@gmail.com> | 2014-06-20 02:01:19 -0700 |
---|---|---|
committer | Dylan Baker <baker.dylan.c@gmail.com> | 2014-06-23 22:21:45 -0700 |
commit | 767e55b539246e069f254a5b0dcbb04819d6773e (patch) | |
tree | f99b62d28d601434564b33167400628315e55495 /framework | |
parent | d78e65e0862472a3506e28eb6ee3945e190bca5a (diff) |
core.py: rename Environment to Options
Environment doesn't really describe what the class is (although,
honestly it's a pretty bad class design), but Options comes much closer
to what it is.
v7: - update piglit-print-commands.py
- replace instance name 'env' with 'opts'
- rename Test.ENV to Test.OPTS
Signed-off-by: Dylan Baker <baker.dylan.c@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Diffstat (limited to 'framework')
-rw-r--r-- | framework/core.py | 17 | ||||
-rw-r--r-- | framework/exectest.py | 20 | ||||
-rw-r--r-- | framework/profile.py | 32 | ||||
-rw-r--r-- | framework/programs/run.py | 46 | ||||
-rw-r--r-- | framework/tests/core_tests.py | 2 | ||||
-rw-r--r-- | framework/tests/profile_tests.py | 8 |
6 files changed, 69 insertions, 56 deletions
diff --git a/framework/core.py b/framework/core.py index 6f476d0c5..2005a4eca 100644 --- a/framework/core.py +++ b/framework/core.py @@ -40,7 +40,7 @@ import framework.status as status from .threads import synchronized_self __all__ = ['PIGLIT_CONFIG', - 'Environment', + 'Options', 'TestrunResult', 'TestResult', 'JSONWriter', @@ -326,7 +326,20 @@ class TestrunResult: json.dump(raw_dict, file, indent=JSONWriter.INDENT) -class Environment: +class Options(object): + """ Contains options for a piglit run + + Options are as follows: + concurrent -- True if concurrency is to be used + execute -- False for dry run + filter -- list of compiled regex which include exclusively tests that match + exclude_filter -- list of compiled regex which exclude tests that match + valgrind -- True if valgrind is to be used + dmesg -- True if dmesg checking is desired. This forces concurrency off + verbose -- verbosity level. + env -- environment variables set for each test before run + + """ def __init__(self, concurrent=True, execute=True, include_filter=None, exclude_filter=None, valgrind=False, dmesg=False, verbose=False): diff --git a/framework/exectest.py b/framework/exectest.py index 990b87def..2df49f57f 100644 --- a/framework/exectest.py +++ b/framework/exectest.py @@ -29,7 +29,7 @@ import sys import traceback import itertools -from .core import TestResult, Environment +from .core import TestResult, Options __all__ = ['Test', @@ -50,8 +50,8 @@ else: class Test(object): - ENV = Environment() - __slots__ = ['ENV', 'run_concurrent', 'env', 'result', 'cwd', '_command', + OPTS = Options() + __slots__ = ['run_concurrent', 'env', 'result', 'cwd', '_command', '_test_hook_execute_run'] def __init__(self, command, run_concurrent=False): @@ -79,10 +79,10 @@ class Test(object): Fully qualified test name as a string. For example, ``spec/glsl-1.30/preprocessor/compiler/keywords/void.frag``. ''' - log_current = log.pre_log(path if self.ENV.verbose else None) + log_current = log.pre_log(path if self.OPTS.verbose else None) # Run the test - if self.ENV.execute: + if self.OPTS.execute: try: time_start = time.time() dmesg.update_dmesg() @@ -110,7 +110,7 @@ class Test(object): @property def command(self): assert self._command - if self.ENV.valgrind: + if self.OPTS.valgrind: return ['valgrind', '--quiet', '--error-exitcode=1', '--tool=memcheck'] + self._command return self._command @@ -138,7 +138,7 @@ class Test(object): self.result['command'] = ' '.join(self.command) self.result['environment'] = " ".join( '{0}="{1}"'.format(k, v) for k, v in itertools.chain( - self.ENV.env.iteritems(), self.env.iteritems())) + self.OPTS.env.iteritems(), self.env.iteritems())) if self.check_for_skip_scenario(): self.result['result'] = 'skip' @@ -168,7 +168,7 @@ class Test(object): elif self.result['returncode'] != 0 and self.result['result'] == 'pass': self.result['result'] = 'warn' - if self.ENV.valgrind: + if self.OPTS.valgrind: # If the underlying test failed, simply report # 'skip' for this valgrind test. if self.result['result'] != 'pass': @@ -191,10 +191,10 @@ class Test(object): def get_command_result(self): # Set the environment for the tests. Use the default settings created - # in the Environment constructor first, then use any user defined + # in the Options constructor first, then use any user defined # variables, finally, use any variables set for the test in the test # profile - fullenv = self.ENV.env.copy() + fullenv = self.OPTS.env.copy() for key, value in itertools.chain(self.env.iteritems(), os.environ.iteritems()): fullenv[key] = str(value) diff --git a/framework/profile.py b/framework/profile.py index affd4b676..4242a986c 100644 --- a/framework/profile.py +++ b/framework/profile.py @@ -113,7 +113,7 @@ class TestProfile(object): # Clear out the old Group() self.tests = {} - def _prepare_test_list(self, env): + def _prepare_test_list(self, opts): """ Prepare tests for running Flattens the nested group hierarchy into a flat dictionary using '/' @@ -121,7 +121,7 @@ class TestProfile(object): runs it's own filters plus the filters in the self.filters name Arguments: - env - a core.Environment instance + opts - a core.Options instance """ self._flatten_group_hierarchy() @@ -132,9 +132,9 @@ class TestProfile(object): # 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)) - and not path in env.exclude_tests and - not matches_any_regexp(path, env.exclude_filter)) + return ((not opts.filter or matches_any_regexp(path, opts.filter)) + and not path in opts.exclude_tests and + not matches_any_regexp(path, opts.exclude_filter)) filters = self.filters + [test_matches] def check_all(item): @@ -167,37 +167,37 @@ class TestProfile(object): """ pass - def run(self, env, json_writer): + def run(self, opts, json_writer): """ Runs all tests using Thread pool 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. + self.test_list, then will prepare a logger, pass opts 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 + Based on the value of opts.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 + opts -- a core.Options instance json_writer -- a core.JSONWriter instance """ self._pre_run_hook() - framework.exectest.Test.ENV = env + framework.exectest.Test.Opts = opts chunksize = 1 - self._prepare_test_list(env) - log = Log(len(self.test_list), env.verbose) + self._prepare_test_list(opts) + log = Log(len(self.test_list), opts.verbose) def test(pair): """ Function to call test.execute from .map - Adds env and json_writer which are needed by Test.execute() + Adds opts and json_writer which are needed by Test.execute() """ name, test = pair @@ -216,9 +216,9 @@ class TestProfile(object): single = multiprocessing.dummy.Pool(1) multi = multiprocessing.dummy.Pool() - if env.concurrent == "all": + if opts.concurrent == "all": run_threads(multi, self.test_list.iteritems()) - elif env.concurrent == "none": + elif opts.concurrent == "none": run_threads(single, self.test_list.iteritems()) else: # Filter and return only thread safe tests to the threaded pool diff --git a/framework/programs/run.py b/framework/programs/run.py index 758c84553..d3e9830a2 100644 --- a/framework/programs/run.py +++ b/framework/programs/run.py @@ -130,18 +130,18 @@ def run(input_): os.path.join( os.path.dirname(__file__), '..', '..', 'piglit.conf'))) - # Pass arguments into Environment - env = core.Environment(concurrent=args.concurrency, - exclude_filter=args.exclude_tests, - include_filter=args.include_tests, - execute=args.execute, - valgrind=args.valgrind, - dmesg=args.dmesg, - verbose=args.verbose) + # Pass arguments into Options + opts = core.Options(concurrent=args.concurrency, + exclude_filter=args.exclude_tests, + include_filter=args.include_tests, + execute=args.execute, + valgrind=args.valgrind, + dmesg=args.dmesg, + verbose=args.verbose) # Set the platform to pass to waffle if args.platform: - env.env['PIGLIT_PLATFORM'] = args.platform + opts.env['PIGLIT_PLATFORM'] = args.platform # Change working directory to the root of the piglit directory piglit_dir = path.dirname(path.realpath(sys.argv[0])) @@ -166,7 +166,7 @@ def run(input_): json_writer.write_dict_key('options') json_writer.open_dict() json_writer.write_dict_item('profile', args.test_profile) - for key, value in env: + for key, value in opts: json_writer.write_dict_item(key, value) if args.platform: json_writer.write_dict_item('platform', args.platform) @@ -186,7 +186,7 @@ def run(input_): # Set the dmesg type if args.dmesg: profile.dmesg = args.dmesg - profile.run(env, json_writer) + profile.run(opts, json_writer) time_end = time.time() json_writer.close_dict() @@ -211,16 +211,16 @@ def resume(input_): args = parser.parse_args(input_) results = core.load_results(args.results_path) - env = core.Environment(concurrent=results.options['concurrent'], - exclude_filter=results.options['exclude_filter'], - include_filter=results.options['filter'], - execute=results.options['execute'], - valgrind=results.options['valgrind'], - dmesg=results.options['dmesg'], - verbose=results.options['verbose']) + opts = core.Options(concurrent=results.options['concurrent'], + exclude_filter=results.options['exclude_filter'], + include_filter=results.options['filter'], + execute=results.options['execute'], + valgrind=results.options['valgrind'], + dmesg=results.options['dmesg'], + verbose=results.options['verbose']) if results.options.get('platform'): - env.env['PIGLIT_PLATFORM'] = results.options['platform'] + opts.env['PIGLIT_PLATFORM'] = results.options['platform'] results_path = path.join(args.results_path, "main") json_writer = core.JSONWriter(open(results_path, 'w+')) @@ -239,15 +239,15 @@ def resume(input_): json_writer.open_dict() for key, value in results.tests.iteritems(): json_writer.write_dict_item(key, value) - env.exclude_tests.add(key) + opts.exclude_tests.add(key) profile = framework.profile.merge_test_profiles(results.options['profile']) profile.results_dir = args.results_path - if env.dmesg: - profile.dmesg = env.dmesg + if opts.dmesg: + profile.dmesg = opts.dmesg # This is resumed, don't bother with time since it wont be accurate anyway - profile.run(env, json_writer) + profile.run(opts, json_writer) json_writer.close_dict() json_writer.close_dict() diff --git a/framework/tests/core_tests.py b/framework/tests/core_tests.py index a6ac8031d..ac021ddd0 100644 --- a/framework/tests/core_tests.py +++ b/framework/tests/core_tests.py @@ -50,7 +50,7 @@ def test_generate_initialize(): """ yieldable = check_initialize - for target in [core.Environment, core.TestrunResult, core.TestResult, + for target in [core.Options, core.TestrunResult, core.TestResult, core.PiglitJSONEncoder]: yieldable.description = "Test that {} initializes".format( target.__name__) diff --git a/framework/tests/profile_tests.py b/framework/tests/profile_tests.py index de4730f4a..c861cfced 100644 --- a/framework/tests/profile_tests.py +++ b/framework/tests/profile_tests.py @@ -211,7 +211,7 @@ def test_matches_filter_mar_1(data): Nothing should be filtered. """ - env = core.Environment() + env = core.Options() profile_ = profile.TestProfile() profile_.test_list = data @@ -223,7 +223,7 @@ def test_matches_filter_mar_1(data): @nt.nottest def test_matches_filter_mar_2(data): """ Tests 'not env.filter or matches_any_regex() mar is False""" - env = core.Environment(include_filter=['test5']) + env = core.Options(include_filter=['test5']) profile_ = profile.TestProfile() profile_.test_list = data @@ -237,7 +237,7 @@ def test_matches_filter_mar_2(data): @nt.nottest def test_matches_env_exclude(data): """ Tests 'not path in env.exclude_tests """ - env = core.Environment() + env = core.Options() env.exclude_tests.add('group3/test5') profile_ = profile.TestProfile() @@ -253,7 +253,7 @@ def test_matches_env_exclude(data): @nt.nottest def test_matches_exclude_mar(data): """ Tests 'not matches_any_regexp() """ - env = core.Environment(exclude_filter=['test5']) + env = core.Options(exclude_filter=['test5']) profile_ = profile.TestProfile() profile_.test_list = data |