Index: webkit/tools/layout_tests/test_types/image_diff.py |
=================================================================== |
--- webkit/tools/layout_tests/test_types/image_diff.py (revision 36724) |
+++ webkit/tools/layout_tests/test_types/image_diff.py (working copy) |
@@ -1,199 +0,0 @@ |
-# Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-"""Compares the image output of a test to the expected image output. |
- |
-Compares hashes for the generated and expected images. If the output doesn't |
-match, returns FailureImageHashMismatch and outputs both hashes into the layout |
-test results directory. |
-""" |
- |
-import errno |
-import logging |
-import os |
-import shutil |
-import subprocess |
- |
-from layout_package import path_utils |
-from layout_package import test_failures |
-from test_types import test_type_base |
- |
-# Cache whether we have the image_diff executable available. |
-_compare_available = True |
-_compare_msg_printed = False |
- |
- |
-class ImageDiff(test_type_base.TestTypeBase): |
- |
- def _CopyOutputPNG(self, test_filename, source_image, extension): |
- """Copies result files into the output directory with appropriate |
- names. |
- |
- Args: |
- test_filename: the test filename |
- source_file: path to the image file (either actual or expected) |
- extension: extension to indicate -actual.png or -expected.png |
- """ |
- self._MakeOutputDirectory(test_filename) |
- dest_image = self.OutputFilename(test_filename, extension) |
- |
- try: |
- shutil.copyfile(source_image, dest_image) |
- except IOError, e: |
- # A missing expected PNG has already been recorded as an error. |
- if errno.ENOENT != e.errno: |
- raise |
- |
- def _SaveBaselineFiles(self, filename, png_path, checksum): |
- """Saves new baselines for the PNG and checksum. |
- |
- Args: |
- filename: test filename |
- png_path: path to the actual PNG result file |
- checksum: value of the actual checksum result |
- """ |
- png_file = open(png_path, "rb") |
- png_data = png_file.read() |
- png_file.close() |
- self._SaveBaselineData(filename, png_data, ".png") |
- self._SaveBaselineData(filename, checksum, ".checksum") |
- |
- def _CreateImageDiff(self, filename, target): |
- """Creates the visual diff of the expected/actual PNGs. |
- |
- Args: |
- filename: the name of the test |
- target: Debug or Release |
- """ |
- diff_filename = self.OutputFilename(filename, |
- self.FILENAME_SUFFIX_COMPARE) |
- actual_filename = self.OutputFilename(filename, |
- self.FILENAME_SUFFIX_ACTUAL + '.png') |
- expected_filename = self.OutputFilename(filename, |
- self.FILENAME_SUFFIX_EXPECTED + '.png') |
- |
- global _compare_available |
- cmd = '' |
- |
- try: |
- executable = path_utils.ImageDiffPath(target) |
- cmd = [executable, '--diff', actual_filename, expected_filename, |
- diff_filename] |
- except Exception, e: |
- _compare_available = False |
- |
- result = 1 |
- if _compare_available: |
- try: |
- result = subprocess.call(cmd) |
- except OSError, e: |
- if e.errno == errno.ENOENT or e.errno == errno.EACCES: |
- _compare_available = False |
- else: |
- raise e |
- except ValueError: |
- # work around a race condition in Python 2.4's implementation |
- # of subprocess.Popen |
- pass |
- |
- global _compare_msg_printed |
- |
- if not _compare_available and not _compare_msg_printed: |
- _compare_msg_printed = True |
- print('image_diff not found. Make sure you have a ' + target + |
- ' build of the image_diff executable.') |
- |
- return result |
- |
- def CompareOutput(self, filename, proc, output, test_args, target): |
- """Implementation of CompareOutput that checks the output image and |
- checksum against the expected files from the LayoutTest directory. |
- """ |
- failures = [] |
- |
- # If we didn't produce a hash file, this test must be text-only. |
- if test_args.hash is None: |
- return failures |
- |
- # If we're generating a new baseline, we pass. |
- if test_args.new_baseline: |
- self._SaveBaselineFiles(filename, test_args.png_path, |
- test_args.hash) |
- return failures |
- |
- # Compare hashes. |
- expected_hash_file = path_utils.ExpectedFilename(filename, '.checksum') |
- |
- expected_png_file = path_utils.ExpectedFilename(filename, '.png') |
- |
- if test_args.show_sources: |
- logging.debug('Using %s' % expected_hash_file) |
- logging.debug('Using %s' % expected_png_file) |
- |
- try: |
- expected_hash = open(expected_hash_file, "r").read() |
- except IOError, e: |
- if errno.ENOENT != e.errno: |
- raise |
- expected_hash = '' |
- |
- |
- if not os.path.isfile(expected_png_file): |
- # Report a missing expected PNG file. |
- self.WriteOutputFiles(filename, '', '.checksum', test_args.hash, |
- expected_hash, diff=False, wdiff=False) |
- self._CopyOutputPNG(filename, test_args.png_path, '-actual.png') |
- failures.append(test_failures.FailureMissingImage(self)) |
- return failures |
- elif test_args.hash == expected_hash: |
- # Hash matched (no diff needed, okay to return). |
- return failures |
- |
- |
- self.WriteOutputFiles(filename, '', '.checksum', test_args.hash, |
- expected_hash, diff=False, wdiff=False) |
- self._CopyOutputPNG(filename, test_args.png_path, '-actual.png') |
- self._CopyOutputPNG(filename, expected_png_file, '-expected.png') |
- |
- # Even though we only use result in one codepath below but we |
- # still need to call CreateImageDiff for other codepaths. |
- result = self._CreateImageDiff(filename, target) |
- if expected_hash == '': |
- failures.append(test_failures.FailureMissingImageHash(self)) |
- elif test_args.hash != expected_hash: |
- # Hashes don't match, so see if the images match. If they do, then |
- # the hash is wrong. |
- if result == 0: |
- failures.append(test_failures.FailureImageHashIncorrect(self)) |
- else: |
- failures.append(test_failures.FailureImageHashMismatch(self)) |
- |
- return failures |
- |
- def DiffFiles(self, file1, file2): |
- """Diff two image files. |
- |
- Args: |
- file1, file2: full paths of the files to compare. |
- |
- Returns: |
- True if two files are different. |
- False otherwise. |
- """ |
- |
- try: |
- executable = path_utils.ImageDiffPath('Debug') |
- except Exception, e: |
- logging.warn('Failed to find image diff executable.') |
- return True |
- |
- cmd = [executable, file1, file2] |
- result = 1 |
- try: |
- result = subprocess.call(cmd) |
- except OSError, e: |
- logging.warn('Failed to compare image diff: %s', e) |
- return True |
- |
- return result == 1 |