summaryrefslogtreecommitdiffstats
path: root/chromium/build/android/pylib/local/device
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-01-23 17:21:03 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-01-23 16:25:15 +0000
commitc551f43206405019121bd2b2c93714319a0a3300 (patch)
tree1f48c30631c421fd4bbb3c36da20183c8a2ed7d7 /chromium/build/android/pylib/local/device
parent7961cea6d1041e3e454dae6a1da660b453efd238 (diff)
BASELINE: Update Chromium to 79.0.3945.139
Change-Id: I336b7182fab9bca80b709682489c07db112eaca5 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/build/android/pylib/local/device')
-rw-r--r--chromium/build/android/pylib/local/device/local_device_gtest_run.py64
-rw-r--r--chromium/build/android/pylib/local/device/local_device_instrumentation_test_run.py80
2 files changed, 108 insertions, 36 deletions
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():