| #!/usr/bin/env python |
| # Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| import unittest |
| import sys |
| import os |
| import optparse |
| |
| __all__ = [] |
| |
| def FilterSuite(suite, predicate): |
| new_suite = suite.__class__() |
| |
| for x in suite: |
| if isinstance(x, unittest.TestSuite): |
| subsuite = FilterSuite(x, predicate) |
| if subsuite.countTestCases() == 0: |
| continue |
| |
| new_suite.addTest(subsuite) |
| continue |
| |
| assert isinstance(x, unittest.TestCase) |
| if predicate(x): |
| new_suite.addTest(x) |
| |
| return new_suite |
| |
| class _TestLoader(unittest.TestLoader): |
| def __init__(self, *args): |
| super(_TestLoader, self).__init__(*args) |
| self.discover_calls = [] |
| |
| def loadTestsFromModule(self, module, use_load_tests=True): |
| if module.__file__ != __file__: |
| return super(_TestLoader, self).loadTestsFromModule( |
| module, use_load_tests) |
| |
| suite = unittest.TestSuite() |
| for discover_args in self.discover_calls: |
| subsuite = self.discover(*discover_args) |
| suite.addTest(subsuite) |
| return suite |
| |
| class _RunnerImpl(unittest.TextTestRunner): |
| def __init__(self, filters): |
| super(_RunnerImpl, self).__init__(verbosity=2) |
| self.filters = filters |
| |
| def ShouldTestRun(self, test): |
| return not self.filters or any(name in test.id() for name in self.filters) |
| |
| def run(self, suite): |
| filtered_test = FilterSuite(suite, self.ShouldTestRun) |
| return super(_RunnerImpl, self).run(filtered_test) |
| |
| |
| class TestRunner(object): |
| def __init__(self): |
| self._loader = _TestLoader() |
| |
| def AddDirectory(self, dir_path, test_file_pattern="*test.py"): |
| assert os.path.isdir(dir_path) |
| |
| self._loader.discover_calls.append((dir_path, test_file_pattern, dir_path)) |
| |
| def Main(self, argv=None): |
| if argv is None: |
| argv = sys.argv |
| |
| parser = optparse.OptionParser() |
| options, args = parser.parse_args(argv[1:]) |
| |
| runner = _RunnerImpl(filters=args) |
| return unittest.main(module=__name__, argv=[sys.argv[0]], |
| testLoader=self._loader, |
| testRunner=runner) |