Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(119)

Unified Diff: build/android/pylib/local/device/local_device_instrumentation_test_run.py

Issue 2933993002: Add local results details pages.
Patch Set: Fix some of Johns comments. Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: build/android/pylib/local/device/local_device_instrumentation_test_run.py
diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
index 231370e8f7f802d849de6646c49e685fb92355a1..ae03465d7c1a3acf5cd65a4a81e3265e190a3ba8 100644
--- a/build/android/pylib/local/device/local_device_instrumentation_test_run.py
+++ b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
@@ -10,7 +10,6 @@ import os
import posixpath
import re
import sys
-import tempfile
import time
from devil.android import crash_handler
@@ -18,20 +17,20 @@ from devil.android import device_errors
from devil.android import device_temp_file
from devil.android import flag_changer
from devil.android.sdk import shared_prefs
+from devil.android import logcat_monitor
from devil.android.tools import system_app
from devil.utils import reraiser_thread
from incremental_install import installer
from pylib import valgrind_tools
-from pylib.android import logdog_logcat_monitor
from pylib.base import base_test_result
+from pylib.base import output_manager
from pylib.constants import host_paths
from pylib.instrumentation import instrumentation_test_instance
from pylib.local.device import local_device_environment
from pylib.local.device import local_device_test_run
-from pylib.utils import google_storage_helper
from pylib.utils import instrumentation_tracing
-from pylib.utils import logdog_helper
from pylib.utils import shared_preference_utils
+
from py_trace_event import trace_event
from py_trace_event import trace_time
from py_utils import contextlib_ext
@@ -125,7 +124,8 @@ _CURRENT_FOCUS_CRASH_RE = re.compile(
class LocalDeviceInstrumentationTestRun(
local_device_test_run.LocalDeviceTestRun):
def __init__(self, env, test_instance):
- super(LocalDeviceInstrumentationTestRun, self).__init__(env, test_instance)
+ super(LocalDeviceInstrumentationTestRun, self).__init__(
+ env, test_instance)
self._flag_changers = {}
self._ui_capture_dir = dict()
self._replace_package_contextmanager = None
@@ -362,12 +362,9 @@ class LocalDeviceInstrumentationTestRun(
extras['coverageFile'] = coverage_device_file
# Save screenshot if screenshot dir is specified (save locally) or if
# a GS bucket is passed (save in cloud).
- screenshot_device_file = None
- if (self._test_instance.screenshot_dir or
- self._test_instance.gs_results_bucket):
- screenshot_device_file = device_temp_file.DeviceTempFile(
- device.adb, suffix='.png', dir=device.GetExternalStoragePath())
- extras[EXTRA_SCREENSHOT_FILE] = screenshot_device_file.name
+ screenshot_device_file = device_temp_file.DeviceTempFile(
+ device.adb, suffix='.png', dir=device.GetExternalStoragePath())
+ extras[EXTRA_SCREENSHOT_FILE] = screenshot_device_file.name
extras[EXTRA_UI_CAPTURE_DIR] = self._ui_capture_dir[device]
@@ -444,19 +441,20 @@ class LocalDeviceInstrumentationTestRun(
test_name.replace('#', '.'),
time.strftime('%Y%m%dT%H%M%S-UTC', time.gmtime()),
device.serial)
- logmon = logdog_logcat_monitor.LogdogLogcatMonitor(
- device.adb, stream_name, filter_specs=LOGCAT_FILTERS)
-
- with contextlib_ext.Optional(
- logmon, self._test_instance.should_save_logcat):
- with _LogTestEndpoints(device, test_name):
- with contextlib_ext.Optional(
- trace_event.trace(test_name),
- self._env.trace_output):
- output = device.StartInstrumentation(
- target, raw=True, extras=extras, timeout=timeout, retries=0)
-
- logcat_url = logmon.GetLogcatURL()
+
+ with self._env.output_manager.ArchivedTempfile(
+ stream_name, 'logcat') as logcat_file:
+ with logcat_monitor.LogcatMonitor(
+ device.adb, filter_specs=LOGCAT_FILTERS,
+ output_file=logcat_file.name) as logmon:
+ with _LogTestEndpoints(device, test_name):
+ with contextlib_ext.Optional(
+ trace_event.trace(test_name),
+ self._env.trace_output):
+ output = device.StartInstrumentation(
+ target, raw=True, extras=extras, timeout=timeout, retries=0)
+ logmon.Close()
+
duration_ms = time_ms() - start_ms
if self._env.trace_output:
@@ -514,8 +512,8 @@ class LocalDeviceInstrumentationTestRun(
step()
for result in results:
- if logcat_url:
- result.SetLink('logcat', logcat_url)
+ if logcat_file:
+ result.SetLink('logcat', logcat_file.Link())
# Update the result name if the test used flags.
if flags_to_add:
@@ -544,15 +542,8 @@ class LocalDeviceInstrumentationTestRun(
if any(r.GetType() not in (base_test_result.ResultType.PASS,
base_test_result.ResultType.SKIP)
for r in results):
- with contextlib_ext.Optional(
- tempfile_ext.NamedTemporaryDirectory(),
- self._test_instance.screenshot_dir is None and
- self._test_instance.gs_results_bucket) as screenshot_host_dir:
- screenshot_host_dir = (
- self._test_instance.screenshot_dir or screenshot_host_dir)
- self._SaveScreenshot(device, screenshot_host_dir,
- screenshot_device_file, test_display_name,
- results)
+ self._SaveScreenshot(device, screenshot_device_file, test_display_name,
+ results)
logging.info('detected failure in %s. raw output:', test_display_name)
for l in output:
@@ -580,13 +571,13 @@ class LocalDeviceInstrumentationTestRun(
include_stack_symbols=False,
wipe_tombstones=True,
tombstone_symbolizer=self._test_instance.symbolizer)
- stream_name = 'tombstones_%s_%s' % (
+ tombstone_filename = 'tombstones_%s_%s' % (
time.strftime('%Y%m%dT%H%M%S-UTC', time.gmtime()),
device.serial)
- tombstones_url = logdog_helper.text(
- stream_name, '\n'.join(resolved_tombstones))
- result.SetLink('tombstones', tombstones_url)
-
+ with self._env.output_manager.ArchivedTempfile(
+ tombstone_filename, 'tombstones') as tombstone_file:
+ tombstone_file.write('\n'.join(resolved_tombstones))
+ result.SetLink('tombstones', tombstone_file.Link())
if self._env.concurrent_adb:
post_test_step_thread_group.JoinAll()
return results, None
@@ -698,41 +689,23 @@ class LocalDeviceInstrumentationTestRun(
with open(trace_host_file, 'a') as host_handle:
host_handle.write(java_trace_json)
- def _SaveScreenshot(self, device, screenshot_host_dir, screenshot_device_file,
- test_name, results):
- if screenshot_host_dir:
- screenshot_host_file = os.path.join(
- screenshot_host_dir,
- '%s-%s.png' % (
- test_name,
- time.strftime('%Y%m%dT%H%M%S-UTC', time.gmtime())))
+ def _SaveScreenshot(self, device, screenshot_device_file, test_name, results):
+ screenshot_filename = '%s-%s.png' % (
+ test_name, time.strftime('%Y%m%dT%H%M%S-UTC', time.gmtime()))
if device.FileExists(screenshot_device_file.name):
- try:
- device.PullFile(screenshot_device_file.name, screenshot_host_file)
- finally:
- screenshot_device_file.close()
-
- logging.info(
- 'Saved screenshot for %s to %s.',
- test_name, screenshot_host_file)
- if self._test_instance.gs_results_bucket:
- link = google_storage_helper.upload(
- google_storage_helper.unique_name(
- 'screenshot', device=device),
- screenshot_host_file,
- bucket=('%s/screenshots' %
- self._test_instance.gs_results_bucket))
- for result in results:
- result.SetLink('post_test_screenshot', link)
+ with self._env.output_manager.ArchivedTempfile(
+ screenshot_filename, 'screenshot',
+ output_manager.Datatype.IMAGE) as screenshot_host_file:
+ try:
+ device.PullFile(screenshot_device_file.name,
+ screenshot_host_file.name)
+ finally:
+ screenshot_device_file.close()
+ for result in results:
+ result.SetLink('post_test_screenshot', screenshot_host_file.Link())
def _ProcessRenderTestResults(
self, device, render_tests_device_output_dir, results):
- # If GS results bucket is specified, will archive render result images.
- # If render image dir is specified, will pull the render result image from
- # the device and leave in the directory.
- if not (bool(self._test_instance.gs_results_bucket) or
- bool(self._test_instance.render_results_dir)):
- return
failure_images_device_dir = posixpath.join(
render_tests_device_output_dir, 'failures')
@@ -745,85 +718,58 @@ class LocalDeviceInstrumentationTestRun(
golden_images_device_dir = posixpath.join(
render_tests_device_output_dir, 'goldens')
- with contextlib_ext.Optional(
- tempfile_ext.NamedTemporaryDirectory(),
- not bool(self._test_instance.render_results_dir)) as render_temp_dir:
- render_host_dir = (
- self._test_instance.render_results_dir or render_temp_dir)
-
- if not os.path.exists(render_host_dir):
- os.makedirs(render_host_dir)
-
- # Pull all render test results from device.
- device.PullFile(failure_images_device_dir, render_host_dir)
-
- if device.FileExists(diff_images_device_dir):
- device.PullFile(diff_images_device_dir, render_host_dir)
- else:
- logging.error('Diff images not found on device.')
-
- if device.FileExists(golden_images_device_dir):
- device.PullFile(golden_images_device_dir, render_host_dir)
- else:
- logging.error('Golden images not found on device.')
-
- # Upload results to Google Storage.
- if self._test_instance.gs_results_bucket:
- self._UploadRenderTestResults(render_host_dir, results)
-
- def _UploadRenderTestResults(self, render_host_dir, results):
- render_tests_bucket = (
- self._test_instance.gs_results_bucket + '/render_tests')
-
- for failure_filename in os.listdir(
- os.path.join(render_host_dir, 'failures')):
- m = RE_RENDER_IMAGE_NAME.match(failure_filename)
- if not m:
- logging.warning('Unexpected file in render test failures: %s',
- failure_filename)
- continue
-
- failure_filepath = os.path.join(
- render_host_dir, 'failures', failure_filename)
- failure_link = google_storage_helper.upload_content_addressed(
- failure_filepath, bucket=render_tests_bucket)
-
- golden_filepath = os.path.join(
- render_host_dir, 'goldens', failure_filename)
- if os.path.exists(golden_filepath):
- golden_link = google_storage_helper.upload_content_addressed(
- golden_filepath, bucket=render_tests_bucket)
+ for failure_filename in device.ListDirectory(failure_images_device_dir):
+
+ with self._env.output_manager.ArchivedTempfile(
+ 'fail_%s' % failure_filename, 'render_tests',
+ output_manager.Datatype.IMAGE) as failure_image_host_file:
+ device.PullFile(
+ posixpath.join(failure_images_device_dir, failure_filename),
+ failure_image_host_file)
+ failure_link = failure_image_host_file.Link()
+
+ golden_image_device_file = posixpath.join(
+ golden_images_device_dir, failure_filename)
+ if device.PathExists(golden_image_device_file):
+ with self._env.output_manager.ArchivedTempfile(
+ 'golden_%s' % failure_filename, 'render_tests',
+ output_manager.Datatype.IMAGE) as golden_image_host_file:
+ device.PullFile(
+ golden_image_device_file, golden_image_host_file)
+ golden_link = golden_image_host_file.Link()
else:
golden_link = ''
- diff_filepath = os.path.join(
- render_host_dir, 'diffs', failure_filename)
- if os.path.exists(diff_filepath):
- diff_link = google_storage_helper.upload_content_addressed(
- diff_filepath, bucket=render_tests_bucket)
+ diff_image_device_file = posixpath.join(
+ diff_images_device_dir, failure_filename)
+ if device.PathExists(diff_image_device_file):
+ with self._env.output_manager.ArchivedTempfile(
+ 'diff_%s' % failure_filename, 'render_tests',
+ output_manager.Datatype.IMAGE) as diff_image_host_file:
+ device.PullFile(
+ diff_image_device_file, diff_image_host_file)
+ diff_link = diff_image_host_file.Link()
else:
diff_link = ''
- with tempfile.NamedTemporaryFile(suffix='.html') as temp_html:
- jinja2_env = jinja2.Environment(
- loader=jinja2.FileSystemLoader(_JINJA_TEMPLATE_DIR),
- trim_blocks=True)
- template = jinja2_env.get_template(_JINJA_TEMPLATE_FILENAME)
- # pylint: disable=no-member
- processed_template_output = template.render(
- test_name=failure_filename,
- failure_link=failure_link,
- golden_link=golden_link,
- diff_link=diff_link)
-
- temp_html.write(processed_template_output)
- temp_html.flush()
- html_results_link = google_storage_helper.upload_content_addressed(
- temp_html.name,
- bucket=render_tests_bucket,
- content_type='text/html')
- for result in results:
- result.SetLink(failure_filename, html_results_link)
+ jinja2_env = jinja2.Environment(
+ loader=jinja2.FileSystemLoader(_JINJA_TEMPLATE_DIR),
+ trim_blocks=True)
+ template = jinja2_env.get_template(_JINJA_TEMPLATE_FILENAME)
+ # pylint: disable=no-member
+ processed_template_output = template.render(
+ test_name=failure_filename,
+ failure_link=failure_link,
+ golden_link=golden_link,
+ diff_link=diff_link)
+
+ with self._env.output_manager.ArchivedTempfile(
+ '%s.html' % failure_filename, 'render_tests',
+ output_manager.Datatype.HTML) as html_results:
+ html_results.write(processed_template_output)
+ html_results.flush()
+ for result in results:
+ result.SetLink(failure_filename, html_results.Link())
#override
def _ShouldRetry(self, test, result):

Powered by Google App Engine
This is Rietveld 408576698