[Piglit] [RFC 6/27] framework: Use an enum for concurrency.

Dylan Baker dylan at pnwbakers.com
Mon Oct 24 19:54:52 UTC 2016


This uses an enum (which are new in python 3.4, but available via the
enum34 backport in pip). I'm putting this up as an RFC, since it does
introduce another dependency for python 2.7 and 3.3, but I think it
makes the code cleaner, since this doesn't require passing strings
around for controlling concurrency.

Signed-off-by: Dylan Baker <dylanx.c.baker at intel.com>
---
 framework/profile.py      | 17 +++++++++++++++--
 framework/programs/run.py | 18 +++++++++---------
 tox.ini                   |  1 +
 3 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/framework/profile.py b/framework/profile.py
index 821a630..954bf25 100644
--- a/framework/profile.py
+++ b/framework/profile.py
@@ -36,6 +36,10 @@ import itertools
 import multiprocessing
 import multiprocessing.dummy
 import os
+try:
+    import enum
+except ImportError:
+    import enum34 as enum
 
 import six
 
@@ -46,12 +50,20 @@ from framework.monitoring import Monitoring
 from framework.test.base import Test
 
 __all__ = [
+    'ConcurrentMode',
     'TestProfile',
     'load_test_profile',
     'merge_test_profiles'
 ]
 
 
+ at enum.unique
+class ConcurrentMode(enum.Enum):
+    none = 0
+    some = 1
+    full = 2
+
+
 class TestDict(collections.MutableMapping):
     """A special kind of dict for tests.
 
@@ -488,11 +500,12 @@ def run(profile, logger, backend, concurrency):
     multi = multiprocessing.dummy.Pool()
 
     try:
-        if options.OPTIONS.concurrent == "all":
+        if concurrency is ConcurrentMode.full:
             run_threads(multi, six.iteritems(profile.test_list))
-        elif options.OPTIONS.concurrent == "none":
+        elif concurrency is ConcurrentMode.none:
             run_threads(single, six.iteritems(profile.test_list))
         else:
+            assert concurrency is ConcurrentMode.some
             # Filter and return only thread safe tests to the threaded pool
             run_threads(multi, (x for x in six.iteritems(profile.test_list)
                                 if x[1].run_concurrent))
diff --git a/framework/programs/run.py b/framework/programs/run.py
index be4d75d..4c2227f 100644
--- a/framework/programs/run.py
+++ b/framework/programs/run.py
@@ -126,15 +126,15 @@ def _run_parser(input_):
     conc_parser = parser.add_mutually_exclusive_group()
     conc_parser.add_argument('-c', '--all-concurrent',
                              action="store_const",
-                             default="some",
-                             const="all",
-                             dest="concurrency",
+                             default=framework.profile.ConcurrentMode.some,
+                             const=framework.profile.ConcurrentMode.full,
+                             dest="concurrent",
                              help="Run all tests concurrently")
     conc_parser.add_argument("-1", "--no-concurrency",
                              action="store_const",
-                             default="some",
-                             const="none",
-                             dest="concurrency",
+                             default=framework.profile.ConcurrentMode.some,
+                             const=framework.profile.ConcurrentMode.none,
+                             dest="concurrent",
                              help="Disable concurrent test runs")
     parser.add_argument("-p", "--platform",
                         choices=core.PLATFORMS,
@@ -222,7 +222,7 @@ def _create_metadata(args, name):
     opts = dict(options.OPTIONS)
     opts['profile'] = args.test_profile
     opts['log_level'] = args.log_level
-    opts['concurrent'] = args.concurrent
+    opts['concurrent'] = args.concurrent.name
     if args.platform:
         opts['platform'] = args.platform
 
@@ -274,7 +274,7 @@ def run(input_):
     # If dmesg is requested we must have serial run, this is because dmesg
     # isn't reliable with threaded run
     if args.dmesg or args.monitored:
-        args.concurrency = "none"
+        args.concurrent = framework.profile.ConcurrentMode.none
 
     # Pass arguments into Options
     options.OPTIONS.exclude_filter = args.exclude_tests
@@ -407,7 +407,7 @@ def resume(input_):
         profile,
         results.options['log_level'],
         backend,
-        results.options['concurrent'])
+        framework.profile.ConcurrentMode[results.options['concurrent']])
 
     backend.finalize()
 
diff --git a/tox.ini b/tox.ini
index 2d7b44a..27c2eb6 100644
--- a/tox.ini
+++ b/tox.ini
@@ -30,6 +30,7 @@ deps =
     six==1.5.2
     {accel,noaccel,streams}: jsonschema
     streams: jsonstreams>=0.4.0
+    py{27,33}: enum34
 commands = 
     {accel,noaccel}: py.test -rw unittests/framework unittests/suites []
     generator: py.test -rw unittests/generators []
-- 
git-series 0.8.10


More information about the Piglit mailing list