mirror of
https://github.com/react/react-native-devtools-frontend.git
synced 2026-10-01 01:38:07 +08:00
Currently, you cannot run tests in non-debug mode and turn on debug logging from Puppeteer that relies on https://www.npmjs.com/package/debug. Running `DEBUG=puppeteer.* ...` would also start the test runner in a debug and non headless mode. This CL renames the DEBUG variable that DevTools test runner relies on so that debug logging is independent from the debug mode we have for tests. Bug: none Change-Id: I8b8476f7c26c07eea1db29bfae74d4fb61afd42c Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2963755 Reviewed-by: Simon Zünd <szuend@chromium.org> Reviewed-by: Tim van der Lippe <tvanderlippe@chromium.org> Reviewed-by: Jan Scheffler <janscheffler@chromium.org> Commit-Queue: Alex Rudenko <alexrudenko@chromium.org>
210 lines
6.5 KiB
Python
Executable File
210 lines
6.5 KiB
Python
Executable File
#!/usr/bin/env vpython
|
|
#
|
|
# 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.
|
|
"""
|
|
|
|
import argparse
|
|
import os
|
|
import re
|
|
from subprocess import Popen
|
|
import sys
|
|
import signal
|
|
|
|
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():
|
|
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()
|