Skip to content

Commit

Permalink
Add --render-results-dir arg to store render results locally.
Browse files Browse the repository at this point in the history
If --render-results-dir is specified, the render result images
will get pulled from the device and stored there locally.

BUG=722779

Review-Url: https://codereview.chromium.org/2889663003
Cr-Commit-Position: refs/heads/master@{#472670}
  • Loading branch information
case540 authored and Commit bot committed May 18, 2017
1 parent 518dccb commit 39e3f9e
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,8 @@ def __init__(self, args, data_deps_delegate, error_func):
self._driver_name = None
self._initializeDriverAttributes()

self._render_results_dir = None
self._screenshot_dir = None
self._timeout_scale = None
self._initializeTestControlAttributes(args)

Expand Down Expand Up @@ -666,6 +668,7 @@ def _initializeDriverAttributes(self):
self._driver_apk = None

def _initializeTestControlAttributes(self, args):
self._render_results_dir = args.render_results_dir
self._screenshot_dir = args.screenshot_dir
self._timeout_scale = args.timeout_scale or 1

Expand Down Expand Up @@ -753,6 +756,10 @@ def should_save_logcat(self):
def package_info(self):
return self._package_info

@property
def render_results_dir(self):
return self._render_results_dir

@property
def screenshot_dir(self):
return self._screenshot_dir
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -513,84 +513,103 @@ def _SaveScreenshot(self, device, screenshot_host_dir, screenshot_device_file,

def _ProcessRenderTestResults(
self, device, render_tests_device_output_dir, results):
# Will archive test images if we are given a GS bucket to store the results
# in and are given a results file to output the links to.
if not bool(self._test_instance.gs_results_bucket):
# 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')

if not device.FileExists(failure_images_device_dir):
return

render_tests_bucket = (
self._test_instance.gs_results_bucket + '/render_tests')

diff_images_device_dir = posixpath.join(
render_tests_device_output_dir, 'diffs')

golden_images_device_dir = posixpath.join(
render_tests_device_output_dir, 'goldens')

with tempfile_ext.NamedTemporaryDirectory() as temp_dir:
device.PullFile(failure_images_device_dir, temp_dir)
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, temp_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, temp_dir)
device.PullFile(golden_images_device_dir, render_host_dir)
else:
logging.error('Golden images not found on device.')

for failure_filename in os.listdir(os.path.join(temp_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(temp_dir, 'failures', failure_filename)
failure_link = google_storage_helper.upload_content_addressed(
failure_filepath, bucket=render_tests_bucket)

golden_filepath = os.path.join(temp_dir, 'goldens', failure_filename)
if os.path.exists(golden_filepath):
golden_link = google_storage_helper.upload_content_addressed(
golden_filepath, bucket=render_tests_bucket)
else:
golden_link = ''
# Upload results to Google Storage.
if self._test_instance.gs_results_bucket:
self._UploadRenderTestResults(render_host_dir, results)

diff_filepath = os.path.join(temp_dir, 'diffs', failure_filename)
if os.path.exists(diff_filepath):
diff_link = google_storage_helper.upload_content_addressed(
diff_filepath, bucket=render_tests_bucket)
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)
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)
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)
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)

#override
def _ShouldRetry(self, test):
Expand Down
4 changes: 4 additions & 0 deletions build/android/test_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,10 @@ def AddInstrumentationTestOptions(parser):
help='Causes the render tests to not fail when a check'
'fails or the golden image is missing but to render'
'the view and carry on.')
parser.add_argument(
'--render-results-directory',
dest='render_results_dir',
help='Directory to pull render test result images off of the device to.')
parser.add_argument(
'--runtime-deps-path',
dest='runtime_deps_path', type=os.path.realpath,
Expand Down

0 comments on commit 39e3f9e

Please sign in to comment.