From c551f43206405019121bd2b2c93714319a0a3300 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 23 Jan 2020 17:21:03 +0100 Subject: BASELINE: Update Chromium to 79.0.3945.139 Change-Id: I336b7182fab9bca80b709682489c07db112eaca5 Reviewed-by: Allan Sandfeld Jensen --- .../pylib/local/device/local_device_gtest_run.py | 64 +++++++++++++++-- .../local_device_instrumentation_test_run.py | 80 ++++++++++++++-------- 2 files changed, 108 insertions(+), 36 deletions(-) (limited to 'chromium/build/android/pylib/local/device') diff --git a/chromium/build/android/pylib/local/device/local_device_gtest_run.py b/chromium/build/android/pylib/local/device/local_device_gtest_run.py index 5044cdf1247..605b826c1a0 100644 --- a/chromium/build/android/pylib/local/device/local_device_gtest_run.py +++ b/chromium/build/android/pylib/local/device/local_device_gtest_run.py @@ -10,11 +10,13 @@ import posixpath import shutil import time +from devil import base_error from devil.android import crash_handler from devil.android import device_errors from devil.android import device_temp_file from devil.android import logcat_monitor from devil.android import ports +from devil.android.sdk import version_codes from devil.utils import reraiser_thread from incremental_install import installer from pylib import constants @@ -35,6 +37,8 @@ _EXTRA_COMMAND_LINE_FILE = ( 'org.chromium.native_test.NativeTest.CommandLineFile') _EXTRA_COMMAND_LINE_FLAGS = ( 'org.chromium.native_test.NativeTest.CommandLineFlags') +_EXTRA_COVERAGE_DEVICE_FILE = ( + 'org.chromium.native_test.NativeTest.CoverageDeviceFile') _EXTRA_STDOUT_FILE = ( 'org.chromium.native_test.NativeTestInstrumentationTestRunner' '.StdoutFile') @@ -102,6 +106,24 @@ def _ExtractTestsFromFilter(gtest_filter): return patterns +def _PullCoverageFile(device, coverage_device_file, output_dir): + """Pulls coverage file on device to host directory. + + Args: + device: The working device. + coverage_device_file: The temporary coverage file on device. + output_dir: The output directory on host. + """ + try: + if not os.path.exists(output_dir): + os.makedirs(output_dir) + device.PullFile(coverage_device_file.name, output_dir) + except (OSError, base_error.BaseError) as e: + logging.warning('Failed to handle coverage data after tests: %s', e) + finally: + coverage_device_file.close() + + class _ApkDelegate(object): def __init__(self, test_instance, tool): self._activity = test_instance.activity @@ -116,6 +138,7 @@ class _ApkDelegate(object): self._extras = test_instance.extras self._wait_for_java_debugger = test_instance.wait_for_java_debugger self._tool = tool + self._coverage_dir = test_instance.coverage_dir def GetTestDataRoot(self, device): # pylint: disable=no-self-use @@ -138,6 +161,15 @@ class _ApkDelegate(object): def Run(self, test, device, flags=None, **kwargs): extras = dict(self._extras) + device_api = device.build_version_sdk + + if self._coverage_dir and device_api >= version_codes.LOLLIPOP: + coverage_device_file = device_temp_file.DeviceTempFile( + device.adb, + suffix='.profraw', + prefix=self._suite, + dir=device.GetExternalStoragePath()) + extras[_EXTRA_COVERAGE_DEVICE_FILE] = coverage_device_file.name if ('timeout' in kwargs and gtest_test_instance.EXTRA_SHARD_NANO_TIMEOUT not in extras): @@ -193,6 +225,10 @@ class _ApkDelegate(object): except Exception: device.ForceStop(self._package) raise + finally: + if self._coverage_dir and device_api >= version_codes.LOLLIPOP: + _PullCoverageFile(device, coverage_device_file, self._coverage_dir) + # TODO(jbudorick): Remove this after resolving crbug.com/726880 if device.PathExists(stdout_file.name): logging.info('%s size on device: %s', stdout_file.name, @@ -218,13 +254,18 @@ class _ApkDelegate(object): class _ExeDelegate(object): - def __init__(self, tr, dist_dir, tool): - self._host_dist_dir = dist_dir - self._exe_file_name = os.path.basename(dist_dir)[:-len('__dist')] + + def __init__(self, tr, test_instance, tool): + self._host_dist_dir = test_instance.exe_dist_dir + self._exe_file_name = os.path.basename( + test_instance.exe_dist_dir)[:-len('__dist')] self._device_dist_dir = posixpath.join( - constants.TEST_EXECUTABLE_DIR, os.path.basename(dist_dir)) + constants.TEST_EXECUTABLE_DIR, + os.path.basename(test_instance.exe_dist_dir)) self._test_run = tr self._tool = tool + self._coverage_dir = test_instance.coverage_dir + self._suite = test_instance.suite def GetTestDataRoot(self, device): # pylint: disable=no-self-use @@ -261,6 +302,14 @@ class _ExeDelegate(object): 'LD_LIBRARY_PATH': self._device_dist_dir } + if self._coverage_dir: + coverage_device_file = device_temp_file.DeviceTempFile( + device.adb, + suffix='.profraw', + prefix=self._suite, + dir=device.GetExternalStoragePath()) + env['LLVM_PROFILE_FILE'] = coverage_device_file.name + if self._tool != 'asan': env['UBSAN_OPTIONS'] = constants.UBSAN_OPTIONS @@ -276,6 +325,10 @@ class _ExeDelegate(object): # fine from the test runner's perspective; thus check_return=False. output = device.RunShellCommand( cmd, cwd=cwd, env=env, check_return=False, large_output=True, **kwargs) + + if self._coverage_dir: + _PullCoverageFile(device, coverage_device_file, self._coverage_dir) + return output def PullAppFiles(self, device, files, directory): @@ -296,8 +349,7 @@ class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun): if self._test_instance.apk: self._delegate = _ApkDelegate(self._test_instance, env.tool) elif self._test_instance.exe_dist_dir: - self._delegate = _ExeDelegate(self, self._test_instance.exe_dist_dir, - self._env.tool) + self._delegate = _ExeDelegate(self, self._test_instance, self._env.tool) if self._test_instance.isolated_script_test_perf_output: self._test_perf_output_filenames = _GenerateSequentialFileNames( self._test_instance.isolated_script_test_perf_output) diff --git a/chromium/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/chromium/build/android/pylib/local/device/local_device_instrumentation_test_run.py index 18914e9aa13..25e47a0159d 100644 --- a/chromium/build/android/pylib/local/device/local_device_instrumentation_test_run.py +++ b/chromium/build/android/pylib/local/device/local_device_instrumentation_test_run.py @@ -190,32 +190,33 @@ class LocalDeviceInstrumentationTestRun( steps.append(use_webview_provider) - def install_helper(apk, permissions): + def install_helper(apk, modules=None, fake_modules=None, + permissions=None): + @instrumentation_tracing.no_tracing - @trace_event.traced("apk_path") - def install_helper_internal(d, apk_path=apk.path): + @trace_event.traced + def install_helper_internal(d, apk_path=None): # pylint: disable=unused-argument - d.Install(apk, permissions=permissions) + logging.info('Start Installing %s', apk.path) + d.Install( + apk, + modules=modules, + fake_modules=fake_modules, + permissions=permissions) + logging.info('Finished Installing %s', apk.path) + return install_helper_internal def incremental_install_helper(apk, json_path, permissions): - @trace_event.traced("apk_path") - def incremental_install_helper_internal(d, apk_path=apk.path): + + @trace_event.traced + def incremental_install_helper_internal(d, apk_path=None): # pylint: disable=unused-argument + logging.info('Start Incremental Installing %s', apk.path) installer.Install(d, json_path, apk=apk, permissions=permissions) - return incremental_install_helper_internal + logging.info('Finished Incremental Installing %s', apk.path) - if self._test_instance.apk_under_test: - permissions = self._test_instance.apk_under_test.GetPermissions() - if self._test_instance.apk_under_test_incremental_install_json: - steps.append(incremental_install_helper( - self._test_instance.apk_under_test, - self._test_instance. - apk_under_test_incremental_install_json, - permissions)) - else: - steps.append(install_helper(self._test_instance.apk_under_test, - permissions)) + return incremental_install_helper_internal permissions = self._test_instance.test_apk.GetPermissions() if self._test_instance.test_apk_incremental_install_json: @@ -225,11 +226,29 @@ class LocalDeviceInstrumentationTestRun( test_apk_incremental_install_json, permissions)) else: - steps.append(install_helper(self._test_instance.test_apk, - permissions)) + steps.append( + install_helper( + self._test_instance.test_apk, permissions=permissions)) + + steps.extend( + install_helper(apk) for apk in self._test_instance.additional_apks) - steps.extend(install_helper(apk, None) - for apk in self._test_instance.additional_apks) + # The apk under test needs to be installed last since installing other + # apks after will unintentionally clear the fake module directory. + # TODO(wnwen): Make this more robust, fix crbug.com/1010954. + if self._test_instance.apk_under_test: + permissions = self._test_instance.apk_under_test.GetPermissions() + if self._test_instance.apk_under_test_incremental_install_json: + steps.append( + incremental_install_helper( + self._test_instance.apk_under_test, + self._test_instance.apk_under_test_incremental_install_json, + permissions)) + else: + steps.append( + install_helper(self._test_instance.apk_under_test, + self._test_instance.modules, + self._test_instance.fake_modules, permissions)) @trace_event.traced def set_debug_app(dev): @@ -282,9 +301,9 @@ class LocalDeviceInstrumentationTestRun( host_device_tuples_substituted = [ (h, local_device_test_run.SubstituteDeviceRoot(d, device_root)) for h, d in host_device_tuples] - logging.info('instrumentation data deps:') + logging.info('Pushing data dependencies.') for h, d in host_device_tuples_substituted: - logging.info('%r -> %r', h, d) + logging.debug(' %r -> %r', h, d) dev.PushChangedFiles(host_device_tuples_substituted, delete_device_stale=True) if not host_device_tuples_substituted: @@ -541,6 +560,7 @@ class LocalDeviceInstrumentationTestRun( with ui_capture_dir: with self._env.output_manager.ArchivedTempfile( stream_name, 'logcat') as logcat_file: + logmon = None try: with logcat_monitor.LogcatMonitor( device.adb, @@ -555,7 +575,8 @@ class LocalDeviceInstrumentationTestRun( output = device.StartInstrumentation( target, raw=True, extras=extras, timeout=timeout, retries=0) finally: - logmon.Close() + if logmon: + logmon.Close() if logcat_file.Link(): logging.info('Logcat saved to %s', logcat_file.Link()) @@ -589,13 +610,12 @@ class LocalDeviceInstrumentationTestRun( def handle_coverage_data(): if self._test_instance.coverage_directory: try: + if not os.path.exists(self._test_instance.coverage_directory): + os.makedirs(self._test_instance.coverage_directory) device.PullFile(coverage_device_file, self._test_instance.coverage_directory) - device.RunShellCommand( - 'rm -f %s' % posixpath.join(coverage_directory, '*'), - check_return=True, - shell=True) - except base_error.BaseError as e: + device.RemovePath(coverage_device_file, True) + except (OSError, base_error.BaseError) as e: logging.warning('Failed to handle coverage data after tests: %s', e) def handle_render_test_data(): -- cgit v1.2.3