121 lines
4.1 KiB
Python
121 lines
4.1 KiB
Python
# Copyright 2015 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import base64
|
|
import datetime
|
|
import glob
|
|
import os
|
|
import shutil
|
|
|
|
from autotest_lib.client.bin import utils
|
|
from autotest_lib.client.cros import constants
|
|
from string import Template
|
|
|
|
class ImageDiffPublisher(object):
|
|
"""
|
|
Class that takes care of creating the HTML file output when a pdiff
|
|
comparison fails. It moves each of the three images to a folder in the
|
|
results directory. It then writes a html file that references these images.
|
|
|
|
"""
|
|
|
|
VIEWER_FILES = '/usr/local/autotest/cros/image_comparison/diffviewer/*'
|
|
|
|
|
|
def __init__(self, results_folder):
|
|
"""
|
|
@param results_folder: path, where to publish to
|
|
"""
|
|
self.results_folder = results_folder
|
|
# Copy files needed to the results dir
|
|
for diff_viewer_file in glob.glob(self.VIEWER_FILES):
|
|
shutil.copy(diff_viewer_file, self.results_folder)
|
|
|
|
|
|
def publish(self, golden_image_path, test_image_path, diff_image_path,
|
|
tags):
|
|
"""
|
|
Move viewer files to the results folder and base64 encode the images.
|
|
Write tags to HTML file.
|
|
|
|
@param golden_image_path: path, complete path to a golden image.
|
|
@param test_image_path: path, complete path to a test image.
|
|
@param diff_image_path: path, complete path to a diff image.
|
|
@param tags: list, run information.
|
|
"""
|
|
|
|
# Encode the images to base64
|
|
base64_images = {}
|
|
with open(golden_image_path, "rb") as image_file:
|
|
base64_images["golden"] = base64.b64encode(image_file.read())
|
|
with open(test_image_path, "rb") as image_file:
|
|
base64_images["test"] = base64.b64encode(image_file.read())
|
|
with open(diff_image_path, "rb") as image_file:
|
|
base64_images["diff"] = base64.b64encode(image_file.read())
|
|
|
|
# Append all of the things we push to the html template
|
|
tags.update(base64_images)
|
|
|
|
html_file_fullpath = os.path.join(self.results_folder, 'index.html')
|
|
self._write_tags_to_html(tags, html_file_fullpath)
|
|
|
|
|
|
def publish_paths(self, image_paths, testname):
|
|
"""
|
|
Creates a results page for an array of images.
|
|
|
|
Move viewer files to the results folder and base64 encode the images.
|
|
Write tags to HTML file.
|
|
|
|
@param image_paths: an array of paths
|
|
@param testname: name of current test.
|
|
"""
|
|
|
|
img_tags = []
|
|
for img in image_paths:
|
|
with open(img, "rb") as image_file:
|
|
b64img = base64.b64encode(image_file.read())
|
|
b64imgsrc = "data:image/png;base64, " + b64img
|
|
img_tags.append(b64imgsrc)
|
|
|
|
tags = self._generate_tags(testname)
|
|
tags['images'] = img_tags
|
|
html_file_fullpath = os.path.join(self.results_folder, 'slideshow.html')
|
|
self._write_tags_to_html(tags, html_file_fullpath)
|
|
|
|
|
|
def _write_tags_to_html(self, tags, html_filename):
|
|
"""
|
|
Writes tags to the HTML file
|
|
|
|
@param tags the tags to write into the html template
|
|
@param html_filename the full path to the html template
|
|
"""
|
|
|
|
with open(html_filename, 'r+') as f:
|
|
html = Template(f.read())
|
|
formatted_html = html.substitute(tags)
|
|
f.seek(0)
|
|
f.write(formatted_html)
|
|
|
|
|
|
def _generate_tags(self, testname):
|
|
"""
|
|
Generate tags for the current test run
|
|
|
|
@param testname the name of the current test
|
|
@return an array of tags
|
|
"""
|
|
# get chrome version
|
|
version_string = utils.system_output(
|
|
constants.CHROME_VERSION_COMMAND, ignore_status=True)
|
|
version_string = utils.parse_chrome_version(version_string)[0]
|
|
|
|
return {
|
|
'testname': testname,
|
|
'chromeos_version': utils.get_chromeos_release_version(),
|
|
'chrome_version': version_string,
|
|
'board': utils.get_board(),
|
|
'date': datetime.date.today().strftime("%m/%d/%y"),
|
|
}
|