| #!/usr/bin/env python3 |
| # Copyright (C) 2019 Apple Inc. All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions |
| # are met: |
| # 1. Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # 2. Redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution. |
| # |
| # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND |
| # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| # DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR |
| # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| |
| import sys |
| sys.dont_write_bytecode = True |
| |
| import argparse |
| import os |
| import sys |
| import unittest |
| |
| from webkitpy.common.checkout.scm.scm_unittest import SCMTest |
| |
| |
| PYTHON3_COMPATIBLE_DIRECTORIES = [ |
| 'webkitpy.common', |
| 'webkitpy.layout_tests.controllers', |
| 'webkitpy.layout_tests.layout_package', |
| 'webkitpy.layout_tests.models', |
| 'webkitpy.layout_tests.servers', |
| 'webkitpy.layout_tests.views', |
| 'webkitpy.port', |
| 'webkitpy.results', |
| 'webkitpy.style', |
| 'webkitpy.xcode', |
| ] |
| SLOW_TESTS = [ |
| SCMTest, |
| ] |
| |
| def is_slow(candidate): |
| if isinstance(candidate, unittest.suite.TestSuite): |
| return any(is_slow(test) for test in candidate) |
| for test in SLOW_TESTS: |
| if isinstance(candidate, test): |
| return True |
| return False |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser(description='Run unit tests with Python3. This is intended as a temporary script during the Python2/3 transition') |
| parser.add_argument( |
| '-v', '--verbose', |
| default=False, action='store_true', |
| help='Verbose output', |
| ) |
| parser.add_argument( |
| '-f', '--stop-on-fail', |
| default=False, action='store_true', |
| help='Stop on first fail or error', |
| ) |
| parser.add_argument( |
| '-a', '--all', |
| default=False, action='store_true', |
| help='Enables SCM tests, which are slow and so disable by default', |
| ) |
| |
| if len(PYTHON3_COMPATIBLE_DIRECTORIES) == 1: |
| compatible_directories_readable = PYTHON3_COMPATIBLE_DIRECTORIES[0] |
| else: |
| compatible_directories_readable = '{} and {}'.format( |
| ', '.join(PYTHON3_COMPATIBLE_DIRECTORIES[:-1]), |
| PYTHON3_COMPATIBLE_DIRECTORIES[-1], |
| ) |
| parser.add_argument( |
| 'modules_to_test', nargs='*', |
| help='Modules to be tested. By default, this is {}'.format(compatible_directories_readable), |
| default=PYTHON3_COMPATIBLE_DIRECTORIES, |
| ) |
| options = parser.parse_args() |
| |
| root = os.path.dirname(os.path.abspath(__file__)) |
| |
| suite = unittest.TestSuite() |
| for module_name in options.modules_to_test: |
| module_suite = unittest.defaultTestLoader.discover(os.path.join(root, module_name.replace('.', '/')), pattern='*test.py', top_level_dir=root) |
| for test in (module_suite or []): |
| if options.all or not is_slow(test): |
| suite.addTest(test) |
| |
| if suite.countTestCases() == 0: |
| raise RuntimeError('No matching tests found.') |
| |
| from webkitpy.thirdparty import autoinstall_everything |
| autoinstall_everything() |
| |
| result = unittest.TextTestRunner(verbosity=int(options.verbose) + 1, failfast=options.stop_on_fail, buffer=not options.verbose).run(suite) |
| return len(result.errors) |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |