| # Copyright 2020 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Implementation of skia_gold_session.py without output managers. |
| |
| Diff output is instead stored in a directory and pointed to with file:// URLs. |
| """ |
| |
| import os |
| import subprocess |
| import time |
| from typing import List, Tuple |
| |
| import six |
| |
| from skia_gold_common import skia_gold_session |
| |
| |
| class OutputManagerlessSkiaGoldSession(skia_gold_session.SkiaGoldSession): |
| def RunComparison(self, *args, **kwargs) -> skia_gold_session.StepRetVal: |
| # Passing True for the output manager is a bit of a hack, as we don't |
| # actually need an output manager and just need to get past the truthy |
| # check. |
| assert 'output_manager' not in kwargs, 'Cannot specify output_manager' |
| kwargs['output_manager'] = True |
| return super().RunComparison(*args, **kwargs) |
| |
| def _CreateDiffOutputDir(self, name: str) -> str: |
| # Do this instead of just making a temporary directory so that it's easier |
| # for users to look through multiple results. We intentionally do not clean |
| # this directory up since the user might need to look at it later. |
| timestamp = int(time.time()) |
| name = '%s_%d' % (name, timestamp) |
| filepath = os.path.join(self._local_png_directory, name) |
| os.makedirs(filepath) |
| return filepath |
| |
| def _StoreDiffLinks(self, image_name: str, _, output_dir: str) -> None: |
| results = self._comparison_results.setdefault(image_name, |
| self.ComparisonResults()) |
| # The directory should contain "input-<hash>.png", "closest-<hash>.png", |
| # and "diff.png". |
| for f in os.listdir(output_dir): |
| file_url = 'file://%s' % os.path.join(output_dir, f) |
| if f.startswith('input-'): |
| results.local_diff_given_image = file_url |
| elif f.startswith('closest-'): |
| results.local_diff_closest_image = file_url |
| elif f == 'diff.png': |
| results.local_diff_diff_image = file_url |
| |
| @staticmethod |
| def _RunCmdForRcAndOutput(cmd: List[str]) -> Tuple[int, str]: |
| try: |
| output = subprocess.check_output(cmd, |
| stderr=subprocess.STDOUT).decode('utf-8') |
| return 0, output |
| except subprocess.CalledProcessError as e: |
| output = e.output |
| if not isinstance(output, six.string_types): |
| output = output.decode('utf-8') |
| return e.returncode, output |