#!/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)