#!/usr/bin/env vpython3 # # Copyright 2019 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. """ Run unit tests on a pinned version of chrome. """ import os import sys import argparse scripts_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(scripts_path) import test_helpers import devtools_paths def run_tests(chrome_binary, target, no_text_coverage, no_html_coverage, coverage, expanded_reporting, cwd, mocha_fgrep): karmaconfig_path = os.path.join(cwd, 'out', target, 'gen', 'test', 'unittests', 'karma.conf.js') if not os.path.exists(karmaconfig_path): print('Unable to find Karma config at ' + karmaconfig_path) print('Make sure to set the --ninja-build-name argument to the folder name of "out/target"') sys.exit(1) print('Using karma config ' + karmaconfig_path) exec_command = [devtools_paths.node_path(), devtools_paths.karma_path(), 'start', test_helpers.to_platform_path_exact(karmaconfig_path)] env = os.environ.copy() env['NODE_PATH'] = devtools_paths.node_path() if (no_text_coverage is not False): env['NO_TEXT_COVERAGE'] = '1' if (no_html_coverage is not False): env['NO_HTML_COVERAGE'] = '1' if (coverage is True): env['COVERAGE'] = '1' if (expanded_reporting is True): env['EXPANDED_REPORTING'] = '1' if (chrome_binary is not None): env['CHROME_BIN'] = chrome_binary if (mocha_fgrep is not None): print('Using Mocha --fgrep flag ' + mocha_fgrep) env['MOCHA_FGREP'] = mocha_fgrep exit_code = test_helpers.popen(exec_command, cwd=cwd, env=env) if exit_code == 1: return True return False def run_unit_tests_on_ninja_build_target(target, no_text_coverage=True, no_html_coverage=True, coverage=False, expanded_reporting=False, chrome_binary=None, cwd=None, mocha_fgrep=None): if chrome_binary and not test_helpers.check_chrome_binary(chrome_binary): print( 'Chrome binary argument path does not exist or is not executable, reverting to downloaded binary' ) chrome_binary = None if not chrome_binary: # Default to the downloaded / pinned Chromium binary downloaded_chrome_binary = devtools_paths.downloaded_chrome_binary_path( ) if test_helpers.check_chrome_binary(downloaded_chrome_binary): chrome_binary = downloaded_chrome_binary if (chrome_binary is None): print('Unable to run, no Chrome binary provided') sys.exit(1) print('Using Chromium binary (%s)' % chrome_binary) if not cwd: cwd = devtools_paths.devtools_root_path() print('Running tests from %s\n' % cwd) errors_found = run_tests(chrome_binary, target, no_text_coverage, no_html_coverage, coverage, expanded_reporting, cwd, mocha_fgrep) if coverage and not no_html_coverage: print('') print( ' You can see the coverage results by opening \033[1mkarma-coverage/index.html\033[0m in a browser' ) print('') if errors_found: print('ERRORS DETECTED') if not expanded_reporting: print('') print( ' Run with \033[1m--expanded-reporting\033[0m to get better information about why the tests failed.' ) print('') sys.exit(1) def main(): parser = argparse.ArgumentParser(description='Run unittests on Ninja targets.') parser.add_argument( '--target', '-t', default='Default', dest='target', help='The name of the Ninja output directory. Defaults to "Default"') parser.add_argument( '--no-text-coverage', action='store_true', default=False, dest='no_text_coverage', help='Whether to output text coverage') parser.add_argument('--no-html-coverage', action='store_true', default=False, dest='no_html_coverage', help='Whether to output html coverage') parser.add_argument('--coverage', action='store_true', default=False, dest='coverage', help='Whether to output coverage') parser.add_argument('--expanded-reporting', action='store_true', default=False, dest='expanded_reporting', help='Whether to output expanded report info') parser.add_argument('--chrome-binary', dest='chrome_binary', help='Path to Chromium binary') parser.add_argument('--cwd', dest='cwd', help='Path to the directory containing the out dir', default=devtools_paths.devtools_root_path()) parser.add_argument('--mocha-fgrep', dest='mocha_fgrep', help='Run only tests that match this string.') args = parser.parse_args(sys.argv[1:]) run_unit_tests_on_ninja_build_target(args.target, args.no_text_coverage, args.no_html_coverage, args.coverage, args.expanded_reporting, args.chrome_binary, args.cwd, args.mocha_fgrep) if __name__ == '__main__': main()