blob: cc7ec806a6713a9a141c960a59d187fa76bb3400 [file]
#!/usr/bin/env vpython3
#
# Copyright 2020 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 tests on a pinned version of chrome.
DEPRECATED: please use run_test_suite.js instead.
"""
import argparse
import os
import sys
ROOT_DIRECTORY = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..',
'..')
scripts_path = os.path.join(ROOT_DIRECTORY, 'scripts')
sys.path.append(scripts_path)
import devtools_paths
import test_helpers
def parse_options(cli_args):
parser = argparse.ArgumentParser(description='Run tests')
parser.add_argument('--chrome-binary',
dest='chrome_binary',
help='path to Chromium binary')
parser.add_argument(
'--test-suite',
dest='test_suite',
help=
'test suite name. DEPRECATED: please use --test-suite-path instead.')
parser.add_argument(
'--test-suite-path',
dest='test_suite_path',
help=
'path to test suite, starting from the out/TARGET directory. Should use Linux path separators.'
)
parser.add_argument('--test-file',
dest='test_file',
help='an absolute path for the file to test')
parser.add_argument(
'--target',
'-t',
default='Default',
dest='target',
help='The name of the Ninja output directory. Defaults to "Default"')
parser.add_argument(
'--chrome-features',
dest='chrome_features',
help=
'comma separated list of strings passed to --enable-features on the chromium commandline'
)
parser.add_argument(
'--jobs',
default='1',
dest='jobs',
help=
'The number of parallel runners to use (if supported). Defaults to 1')
parser.add_argument('--cwd',
dest='cwd',
help='Path to the directory containing the out dir',
default=devtools_paths.devtools_root_path())
parser.add_argument(
'--node_modules-path',
dest='node_modules_path',
help=
'Path to the node_modules directory for Node to use. Will use Node defaults if not set.',
default=None)
parser.add_argument('test_patterns', nargs='*')
return parser.parse_args(cli_args)
def run_tests(chrome_binary,
chrome_features,
test_suite_path,
test_suite,
jobs,
target,
cwd=None,
node_modules_path=None,
test_patterns=None):
env = os.environ.copy()
env['CHROME_BIN'] = chrome_binary
if chrome_features:
env['CHROME_FEATURES'] = chrome_features
if test_patterns:
env['TEST_PATTERNS'] = ';'.join(test_patterns)
if jobs:
env['JOBS'] = jobs
if target:
env['TARGET'] = target
if node_modules_path is not None:
# Node requires the path to be absolute
env['NODE_PATH'] = os.path.abspath(node_modules_path)
if not cwd:
cwd = devtools_paths.devtools_root_path()
exec_command = [devtools_paths.node_path()]
if 'DEBUG_TEST' in env:
exec_command.append('--inspect')
exec_command = exec_command + [
devtools_paths.mocha_path(),
'--config',
os.path.join(test_suite_path, '.mocharc.js'),
]
exit_code = test_helpers.popen(exec_command, cwd=cwd, env=env)
if exit_code != 0:
return True
return False
def run_test():
print(
"DEPRECATED: run_test_suite.py is deprecated and will be removed in the future.\nPlease use run_test_suite.js which is newer and more robust with handling paths."
)
OPTIONS = parse_options(sys.argv[1:])
is_cygwin = sys.platform == 'cygwin'
chrome_binary = None
test_suite = None
chrome_features = None
# 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
# Override with the arg value if provided.
if OPTIONS.chrome_binary:
chrome_binary = OPTIONS.chrome_binary
if not test_helpers.check_chrome_binary(chrome_binary):
print('Unable to find a Chrome binary at \'%s\'' % chrome_binary)
sys.exit(1)
if OPTIONS.chrome_features:
chrome_features = OPTIONS.chrome_features
if (chrome_binary is None):
print('Unable to run, no Chrome binary provided')
sys.exit(1)
if OPTIONS.jobs:
jobs = OPTIONS.jobs
test_file = OPTIONS.test_file
test_patterns = OPTIONS.test_patterns
if test_file:
test_patterns.append(test_file)
print('Using Chromium binary ({}{})\n'.format(
chrome_binary, ' ' + chrome_features if chrome_features else ''))
print('Using target (%s)\n' % OPTIONS.target)
if test_file is not None:
print(
'The test_file argument is obsolete, just pass the filename as positional argument'
)
if test_patterns:
print('Testing file(s) (%s)' % ', '.join(test_patterns))
cwd = OPTIONS.cwd
target = OPTIONS.target
node_modules_path = OPTIONS.node_modules_path
print('Running tests from %s\n' % cwd)
test_suite_path_input = OPTIONS.test_suite_path
test_suite = OPTIONS.test_suite
test_suite_parts = None
if test_suite:
# test-suite is deprecated and will be removed, but we support it for now to not break the bots until their recipes are updated.
test_suite_parts = ['gen', 'test', test_suite]
elif test_suite_path_input:
# We take the input with Linux path separators, but need to split and join to make sure this works on Windows.
test_suite_parts = test_suite_path_input.split('/')
else:
print(
'Unable to run, require one of --test-suite or --test-suite-path to be provided.'
)
sys.exit(1)
print('Using Test Suite (%s)\n' % os.path.join(*test_suite_parts))
test_suite_path = os.path.join(os.path.abspath(cwd), 'out', OPTIONS.target,
*test_suite_parts)
errors_found = False
try:
errors_found = run_tests(chrome_binary,
chrome_features,
test_suite_path,
test_suite,
jobs,
target,
cwd,
node_modules_path,
test_patterns=test_patterns)
except Exception as err:
print(err)
if errors_found:
print('ERRORS DETECTED')
sys.exit(1)
if __name__ == '__main__':
run_test()