Index: scripts/slave/unittests/expect_tests/main.py |
diff --git a/scripts/slave/unittests/expect_tests/main.py b/scripts/slave/unittests/expect_tests/main.py |
index 5a266b1136eea7e6caff7030d0a86a12a56c3bfe..ce9f11964bd1a3e7aa6dc0788ad6b4f925b29605 100644 |
--- a/scripts/slave/unittests/expect_tests/main.py |
+++ b/scripts/slave/unittests/expect_tests/main.py |
@@ -4,6 +4,7 @@ |
import argparse |
import multiprocessing |
+import pkgutil |
import sys |
from .cover import CoverageContext |
@@ -12,6 +13,11 @@ from . import handle_list, handle_debug, handle_train, handle_test |
from .pipeline import result_loop |
+from .unittest_helper import _is_unittest, UnittestTestCase |
+ |
+ |
+EVERYTHING = object() |
Vadim Sh.
2014/06/27 21:40:08
It's a not very descriptive name. every what?
ALL
iannucci
2014/06/28 16:22:17
Done.
|
+ |
HANDLERS = { |
'list': handle_list.ListHandler, |
@@ -35,8 +41,8 @@ class _test_completer(object): |
for k, v in kwargs.iteritems(): |
setattr(self, k, v) |
- def __init__(self, gen): |
- self._gen = gen |
+ def __init__(self, test_modules): |
+ self._test_modules = test_modules |
def __call__(self, prefix, **_): |
handle_list.ListHandler.COMPLETION_LIST = [] |
@@ -45,12 +51,13 @@ class _test_completer(object): |
test_glob=[prefix], |
jobs=1, |
) |
- ctx = CoverageContext('', [], [], False, None, None, False) |
- result_loop(self._gen, ctx.create_subprocess_context(), options) |
+ ctx = CoverageContext(False, False, False) |
+ test_gens = get_test_gens(self._test_modules) |
+ result_loop(test_gens, ctx.create_subprocess_context(), options) |
return handle_list.ListHandler.COMPLETION_LIST |
-def _parse_args(args, test_gen): |
+def _parse_args(args, test_modules): |
args = args or sys.argv[1:] |
# Set the default mode if not specified and not passing --help |
@@ -83,6 +90,11 @@ def _parse_args(args, test_gen): |
default=multiprocessing.cpu_count(), |
help='run N jobs in parallel (default %(default)s)') |
+ sp.add_argument( |
+ '--force_coverage', action='store_true', |
+ help='Enable coverage report even when specifying a test filter.' |
+ ) |
Vadim Sh.
2014/06/27 21:40:08
nit: keep ) on previous line
or move ) on line 91
iannucci
2014/06/28 16:22:17
Done.
|
+ |
sp.add_argument( |
'--test_list', metavar='FILE', |
help='take the list of test globs from the FILE (use "-" for stdin)' |
@@ -99,7 +111,7 @@ def _parse_args(args, test_gen): |
'then it acts as a negation glob and anything which matches it ' |
'will be skipped. If a glob doesn\'t have "*" in it, "*" will be ' |
'implicitly appended to the end') |
- ).completer = _test_completer(test_gen) |
+ ).completer = _test_completer(test_modules) |
opts = parser.parse_args(args) |
@@ -121,7 +133,32 @@ def _parse_args(args, test_gen): |
return opts |
-def main(name, test_gen, cover_branches=False, args=None): |
+def get_test_gens(test_modules): |
+ test_gens = [] |
+ if not test_modules or test_modules is EVERYTHING: |
+ # if we're running directly |
+ if __name__ == '__main__' or test_modules is EVERYTHING: |
+ test_modules = [] |
+ for importer, modname, ispkg in pkgutil.walk_packages(path=['.']): |
+ if not ispkg and modname.endswith('_test'): |
+ if modname in sys.modules: |
+ test_modules.append(sys.modules[modname]) |
+ else: |
+ test_modules.append( |
+ importer.find_module(modname).load_module(modname)) |
+ else: # a wrapper main() script |
+ test_modules = [sys.modules['__main__']] |
+ for mod in test_modules: |
+ for obj in mod.__dict__.values(): |
+ if getattr(obj, '_expect_tests_generator', False): |
+ test_gens.append(obj) |
+ elif _is_unittest(obj): |
+ test_gens.append(UnittestTestCase(obj)) |
+ return test_gens |
+ |
+ |
+# TODO(iannucci): have Test determine cover_branches |
+def main(cover_branches=False, test_modules=None, args=None): |
"""Entry point for tests using expect_tests. |
Example: |
@@ -138,23 +175,28 @@ def main(name, test_gen, cover_branches=False, args=None): |
if __name__ == '__main__': |
expect_tests.main('happy_test_suite', Gen) |
- @param name: Name of the test suite. |
- @param test_gen: A Generator which yields Test objects. |
+ @param test_modules: Modules containing expect_tests generators and/or |
+ unittests. Defaults to the __main__ module, or if |
+ this script is invoked directly, all '_test' modules |
+ under the current working directory. |
@param cover_branches: Include branch coverage data (rather than just line |
coverage) |
@param args: Commandline args (starting at argv[1]) |
""" |
try: |
- opts = _parse_args(args, test_gen) |
+ opts = _parse_args(args, test_modules) |
- cover_ctx = CoverageContext(name, cover_branches, opts.html_report, |
+ cover_ctx = CoverageContext(cover_branches, opts.html_report, |
not opts.handler.SKIP_RUNLOOP) |
+ with cover_ctx.create_subprocess_context(): |
+ test_gens = get_test_gens(test_modules) |
+ |
error, killed = result_loop( |
- test_gen, cover_ctx.create_subprocess_context(), opts) |
+ test_gens, cover_ctx.create_subprocess_context(), opts) |
cover_ctx.cleanup() |
- if not killed and not opts.test_glob: |
+ if not killed and (opts.force_coverage or not opts.test_glob): |
if not cover_ctx.report(opts.verbose): |
sys.exit(2) |