Reland "Android: Add --wait-for-java-debugger to test_runner.py"

This reverts commit f7b7b5ab8c2fc32d87928e131ec64cd213ee46b8.

Reason for revert: Will update when ready.

Change-Id: I5478e9a738b64a6a34a9937e080b59583f7c3f16
Reviewed-on: https://chromium-review.googlesource.com/698544
Reviewed-by: Yoland Yan <yolandyan@chromium.org>
Commit-Queue: Andrew Grieve <agrieve@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#506174}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 0904ce15333a33f85ead565625d2099406e1adc3
This commit is contained in:
Andrew Grieve 2017-10-03 21:09:12 +00:00 коммит произвёл Commit Bot
Родитель 9baf931d83
Коммит 7bb5694189
6 изменённых файлов: 61 добавлений и 17 удалений

Просмотреть файл

@ -81,7 +81,7 @@ def _UninstallApk(devices, install_dict, package_name):
def _LaunchUrl(devices, input_args, device_args_file, url, apk,
wait_for_debugger):
wait_for_java_debugger):
if input_args and device_args_file is None:
raise Exception('This apk does not support any flags.')
if url:
@ -92,8 +92,10 @@ def _LaunchUrl(devices, input_args, device_args_file, url, apk,
def launch(device):
# Set debug app in order to enable reading command line flags on user
# builds.
cmd = ['am', 'set-debug-app', '--persistent', apk.GetPackageName()]
if wait_for_debugger:
cmd = ['am', 'set-debug-app', apk.GetPackageName()]
if wait_for_java_debugger:
# To wait for debugging on a non-primary process:
# am set-debug-app org.chromium.chrome:privileged_process0
cmd[-1:-1] = ['-w']
# Ignore error since it will fail if apk is not debuggable.
device.RunShellCommand(cmd, check_return=False)
@ -844,13 +846,15 @@ class _LaunchCommand(_Command):
all_devices_by_default = True
def _RegisterExtraArgs(self, group):
group.add_argument('-w', '--wait-for-debugger', action='store_true',
help='Pause execution until debugger attaches.')
group.add_argument('-w', '--wait-for-java-debugger', action='store_true',
help='Pause execution until debugger attaches. Applies '
'only to the main process. To have renderers wait, '
'use --args="--renderer-wait-for-java-debugger"')
group.add_argument('url', nargs='?', help='A URL to launch with.')
def Run(self):
_LaunchUrl(self.devices, self.args.args, self.args.command_line_flags_file,
self.args.url, self.apk_helper, self.args.wait_for_debugger)
self.args.url, self.apk_helper, self.args.wait_for_java_debugger)
class _StopCommand(_Command):

Просмотреть файл

@ -293,6 +293,7 @@ class GtestTestInstance(test_instance.TestInstance):
self._suite = args.suite_name[0]
self._symbolizer = stack_symbolizer.Symbolizer(None, False)
self._gs_test_artifacts_bucket = args.gs_test_artifacts_bucket
self._wait_for_java_debugger = args.wait_for_java_debugger
# GYP:
if args.executable_dist_dir:
@ -327,6 +328,8 @@ class GtestTestInstance(test_instance.TestInstance):
self._extras[_EXTRA_SHARD_SIZE_LIMIT] = 1
self._extras[EXTRA_SHARD_NANO_TIMEOUT] = int(1e9 * self._shard_timeout)
self._shard_timeout = 10 * self._shard_timeout
if args.wait_for_java_debugger:
self._extras[EXTRA_SHARD_NANO_TIMEOUT] = int(1e15) # Forever
if not self._apk_helper and not self._exe_dist_dir:
error_func('Could not find apk or executable for %s' % self._suite)
@ -469,6 +472,10 @@ class GtestTestInstance(test_instance.TestInstance):
def total_external_shards(self):
return self._total_external_shards
@property
def wait_for_java_debugger(self):
return self._wait_for_java_debugger
#override
def TestType(self):
return 'gtest'

Просмотреть файл

@ -491,6 +491,7 @@ class InstrumentationTestInstance(test_instance.TestInstance):
self._render_results_dir = None
self._screenshot_dir = None
self._timeout_scale = None
self._wait_for_java_debugger = None
self._initializeTestControlAttributes(args)
self._coverage_directory = None
@ -675,6 +676,7 @@ class InstrumentationTestInstance(test_instance.TestInstance):
self._screenshot_dir = args.screenshot_dir
self._timeout_scale = args.timeout_scale or 1
self._ui_screenshot_dir = args.ui_screenshot_dir
self._wait_for_java_debugger = args.wait_for_java_debugger
def _initializeTestCoverageAttributes(self, args):
self._coverage_directory = args.coverage_dir
@ -820,6 +822,10 @@ class InstrumentationTestInstance(test_instance.TestInstance):
def ui_screenshot_dir(self):
return self._ui_screenshot_dir
@property
def wait_for_java_debugger(self):
return self._wait_for_java_debugger
#override
def TestType(self):
return 'instrumentation'

Просмотреть файл

@ -118,6 +118,7 @@ class _ApkDelegate(object):
self._suite = test_instance.suite
self._component = '%s/%s' % (self._package, self._runner)
self._extras = test_instance.extras
self._wait_for_java_debugger = test_instance.wait_for_java_debugger
def GetTestDataRoot(self, device):
# pylint: disable=no-self-use
@ -169,6 +170,10 @@ class _ApkDelegate(object):
device.adb, dir=device.GetExternalStoragePath(), suffix='.gtest_out')
extras[_EXTRA_STDOUT_FILE] = stdout_file.name
if self._wait_for_java_debugger:
cmd = ['am', 'set-debug-app', '-w', self._package]
device.RunShellCommand(cmd, check_return=True)
with command_line_file, test_list_file, stdout_file:
try:
device.StartInstrumentation(
@ -370,9 +375,12 @@ class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun):
@local_device_environment.handle_shard_failures_with(
on_failure=self._env.BlacklistDevice)
def list_tests(dev):
timeout = 30
if self._test_instance.wait_for_java_debugger:
timeout = None
raw_test_list = crash_handler.RetryOnSystemCrash(
lambda d: self._delegate.Run(
None, d, flags='--gtest_list_tests', timeout=30),
None, d, flags='--gtest_list_tests', timeout=timeout),
device=dev)
tests = gtest_test_instance.ParseGTestListTests(raw_test_list)
if not tests:
@ -420,6 +428,8 @@ class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun):
# Run the test.
timeout = (self._test_instance.shard_timeout
* self.GetTool(device).GetTimeoutScale())
if self._test_instance.wait_for_java_debugger:
timeout = None
if self._test_instance.store_tombstones:
tombstones.ClearAllTombstones(device)
with device_temp_file.DeviceTempFile(

Просмотреть файл

@ -202,15 +202,16 @@ class LocalDeviceInstrumentationTestRun(
def set_debug_app(dev):
# Set debug app in order to enable reading command line flags on user
# builds
if self._test_instance.flags:
if not self._test_instance.package_info:
logging.error("Couldn't set debug app: no package info")
elif not self._test_instance.package_info.package:
logging.error("Couldn't set debug app: no package defined")
else:
dev.RunShellCommand(['am', 'set-debug-app', '--persistent',
self._test_instance.package_info.package],
check_return=True)
if not self._test_instance.package_info:
logging.error("Couldn't set debug app: no package info")
elif not self._test_instance.package_info.package:
logging.error("Couldn't set debug app: no package defined")
else:
cmd = ['am', 'set-debug-app', '--persistent']
if self._test_instance.wait_for_java_debugger:
cmd.append('-w')
cmd.append(self._test_instance.package_info.package)
dev.RunShellCommand(cmd, check_return=True)
@trace_event.traced
def edit_shared_prefs(dev):
@ -421,6 +422,8 @@ class LocalDeviceInstrumentationTestRun(
valgrind_tools.SetChromeTimeoutScale(
device, test_timeout_scale * self._test_instance.timeout_scale)
if self._test_instance.wait_for_java_debugger:
timeout = None
logging.info('preparing to run %s: %s', test_display_name, test)
render_tests_device_output_dir = None
@ -611,8 +614,11 @@ class LocalDeviceInstrumentationTestRun(
extras['log'] = 'true'
extras[_EXTRA_TEST_LIST] = dev_test_list_json.name
target = '%s/%s' % (test_package, junit4_runner_class)
kwargs = {}
if self._test_instance.wait_for_java_debugger:
kwargs['timeout'] = None
test_list_run_output = dev.StartInstrumentation(
target, extras=extras)
target, extras=extras, retries=0, **kwargs)
if any(test_list_run_output):
logging.error('Unexpected output while listing tests:')
for line in test_list_run_output:

Просмотреть файл

@ -334,6 +334,10 @@ def AddGTestOptions(parser):
'--test-apk-incremental-install-json',
type=os.path.realpath,
help='Path to install json for the test apk.')
parser.add_argument(
'-w', '--wait-for-java-debugger', action='store_true',
help='Wait for java debugger to attach before running any application '
'code. Also disables test timeouts and sets retries=0.')
filter_group = parser.add_mutually_exclusive_group()
filter_group.add_argument(
@ -481,6 +485,10 @@ def AddInstrumentationTestOptions(parser):
'--ui-screenshot-directory',
dest='ui_screenshot_dir', type=os.path.realpath,
help='Destination for screenshots captured by the tests')
parser.add_argument(
'-w', '--wait-for-java-debugger', action='store_true',
help='Wait for java debugger to attach before running any application '
'code. Also disables test timeouts and sets retries=0.')
# These arguments are suppressed from the help text because they should
# only ever be specified by an intermediate script.
@ -981,6 +989,9 @@ def main():
parser.error('--replace-system-package and --enable-concurrent-adb cannot '
'be used together')
if hasattr(args, 'wait_for_java_debugger') and args.wait_for_java_debugger:
args.num_retries = 0
try:
return RunTestsCommand(args)
except base_error.BaseError as e: