Index: tools/chrome_proxy/webdriver/common.py |
diff --git a/tools/chrome_proxy/webdriver/common.py b/tools/chrome_proxy/webdriver/common.py |
index 695bb5634bdbcbd619bdf44e642eded0ee9cb2f4..6417d8a1ea830715119ebad4c8054af5792aad16 100644 |
--- a/tools/chrome_proxy/webdriver/common.py |
+++ b/tools/chrome_proxy/webdriver/common.py |
@@ -27,6 +27,15 @@ def ParseFlags(): |
A new Namespace object with class properties for each argument added below. |
See pydoc for argparse. |
""" |
+ def TestFilter(v): |
+ try: |
+ # The filtering here allows for any number of * wildcards with a required |
+ # . separator between classname and methodname, but no other special |
+ # characters. |
+ return re.match(r'^([A-Za-z_0-9\*]+\.)?[A-Za-z_0-9\*]+$', v).group(0) |
+ except: |
+ raise argparse.ArgumentTypeError('Test filter "%s" is not a valid filter' |
+ % v) |
parser = argparse.ArgumentParser() |
parser.add_argument('--browser_args', type=str, help='Override browser flags ' |
'in code with these flags') |
@@ -53,6 +62,10 @@ def ParseFlags(): |
action='store_true') |
parser.add_argument('-f', '--failfast', help='Stop the test run on the first ' |
'error or failure.', action='store_true') |
+ parser.add_argument('--test_filter', '--gtest_filter', type=TestFilter, |
+ help='The filter to use when discovering tests to run, in the form ' |
+ '<class name>.<method name> Wildcards (*) are accepted. Default=*', |
+ default='*') |
parser.add_argument('--logging_level', choices=['DEBUG', 'INFO', 'WARN', |
'ERROR', 'CRIT'], default='WARN', help='The logging verbosity for log ' |
'messages, printed to stderr. To see stderr logging output during a ' |
@@ -540,9 +553,22 @@ class IntegrationTest(unittest.TestCase): |
logger.info('sys.argv parsed to %s', str(flags)) |
if flags.catch: |
unittest.installHandler() |
+ # Use python's test discovery to locate tests files that have subclasses of |
+ # unittest.TestCase and methods beginning with 'test'. |
pattern = '*.py' if run_all_tests else os.path.basename(sys.argv[0]) |
loader = unittest.TestLoader() |
- tests = loader.discover(os.path.dirname(__file__), pattern=pattern) |
+ test_suite_iter = loader.discover(os.path.dirname(__file__), |
+ pattern=pattern) |
+ # Match class and method name on the given test filter from --test_filter. |
+ tests = unittest.TestSuite() |
+ test_filter_re = flags.test_filter.replace('.', r'\.').replace('*', '.*') |
+ for test_suite in test_suite_iter: |
+ for test_case in test_suite: |
+ for test in test_case: |
+ # Drop the file name in the form <filename>.<classname>.<methodname> |
+ test_id = test.id()[test.id().find('.') + 1:] |
+ if re.match(test_filter_re, test_id): |
+ tests.addTest(test) |
testRunner = unittest.runner.TextTestRunner(verbosity=2, |
failfast=flags.failfast, buffer=(not flags.disable_buffer)) |
testRunner.run(tests) |