Index: webkit/tools/layout_tests/test_types/test_type_base.py |
=================================================================== |
--- webkit/tools/layout_tests/test_types/test_type_base.py (revision 36724) |
+++ webkit/tools/layout_tests/test_types/test_type_base.py (working copy) |
@@ -1,241 +0,0 @@ |
-# Copyright (c) 2006-2008 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. |
- |
-"""Defines the interface TestTypeBase which other test types inherit from. |
- |
-Also defines the TestArguments "struct" to pass them additional arguments. |
-""" |
- |
-import cgi |
-import difflib |
-import errno |
-import logging |
-import os.path |
-import subprocess |
- |
-from layout_package import path_utils |
- |
- |
-class TestArguments(object): |
- """Struct-like wrapper for additional arguments needed by |
- specific tests.""" |
- # Whether to save new baseline results. |
- new_baseline = False |
- |
- # Path to the actual PNG file generated by pixel tests |
- png_path = None |
- |
- # Value of checksum generated by pixel tests. |
- hash = None |
- |
- # Whether to use wdiff to generate by-word diffs. |
- wdiff = False |
- |
- # Whether to report the locations of the expected result files used. |
- show_sources = False |
- |
-# Python bug workaround. See the wdiff code in WriteOutputFiles for an |
-# explanation. |
-_wdiff_available = True |
- |
- |
-class TestTypeBase(object): |
- |
- # Filename pieces when writing failures to the test results directory. |
- FILENAME_SUFFIX_ACTUAL = "-actual" |
- FILENAME_SUFFIX_EXPECTED = "-expected" |
- FILENAME_SUFFIX_DIFF = "-diff" |
- FILENAME_SUFFIX_WDIFF = "-wdiff.html" |
- FILENAME_SUFFIX_COMPARE = "-diff.png" |
- |
- def __init__(self, platform, root_output_dir): |
- """Initialize a TestTypeBase object. |
- |
- Args: |
- platform: the platform (e.g., 'chromium-mac-leopard') |
- identifying the platform-specific results to be used. |
- root_output_dir: The unix style path to the output dir. |
- """ |
- self._root_output_dir = root_output_dir |
- self._platform = platform |
- |
- def _MakeOutputDirectory(self, filename): |
- """Creates the output directory (if needed) for a given test |
- filename.""" |
- output_filename = os.path.join(self._root_output_dir, |
- path_utils.RelativeTestFilename(filename)) |
- path_utils.MaybeMakeDirectory(os.path.split(output_filename)[0]) |
- |
- def _SaveBaselineData(self, filename, data, modifier): |
- """Saves a new baseline file into the platform directory. |
- |
- The file will be named simply "<test>-expected<modifier>", suitable for |
- use as the expected results in a later run. |
- |
- Args: |
- filename: path to the test file |
- data: result to be saved as the new baseline |
- modifier: type of the result file, e.g. ".txt" or ".png" |
- """ |
- relative_dir = os.path.dirname( |
- path_utils.RelativeTestFilename(filename)) |
- output_dir = os.path.join( |
- path_utils.ChromiumBaselinePath(self._platform), relative_dir) |
- output_file = os.path.basename(os.path.splitext(filename)[0] + |
- self.FILENAME_SUFFIX_EXPECTED + modifier) |
- |
- path_utils.MaybeMakeDirectory(output_dir) |
- output_path = os.path.join(output_dir, output_file) |
- logging.debug('writing new baseline to "%s"' % (output_path)) |
- open(output_path, "wb").write(data) |
- |
- def OutputFilename(self, filename, modifier): |
- """Returns a filename inside the output dir that contains modifier. |
- |
- For example, if filename is c:/.../fast/dom/foo.html and modifier is |
- "-expected.txt", the return value is |
- c:/cygwin/tmp/layout-test-results/fast/dom/foo-expected.txt |
- |
- Args: |
- filename: absolute filename to test file |
- modifier: a string to replace the extension of filename with |
- |
- Return: |
- The absolute windows path to the output filename |
- """ |
- output_filename = os.path.join(self._root_output_dir, |
- path_utils.RelativeTestFilename(filename)) |
- return os.path.splitext(output_filename)[0] + modifier |
- |
- def CompareOutput(self, filename, proc, output, test_args, target): |
- """Method that compares the output from the test with the |
- expected value. |
- |
- This is an abstract method to be implemented by all sub classes. |
- |
- Args: |
- filename: absolute filename to test file |
- proc: a reference to the test_shell process |
- output: a string containing the output of the test |
- test_args: a TestArguments object holding optional additional |
- arguments |
- target: Debug or Release |
- |
- Return: |
- a list of TestFailure objects, empty if the test passes |
- """ |
- raise NotImplemented |
- |
- def WriteOutputFiles(self, filename, test_type, file_type, output, |
- expected, diff=True, wdiff=False): |
- """Writes the test output, the expected output and optionally the diff |
- between the two to files in the results directory. |
- |
- The full output filename of the actual, for example, will be |
- <filename><test_type>-actual<file_type> |
- For instance, |
- my_test-simp-actual.txt |
- |
- Args: |
- filename: The test filename |
- test_type: A string describing the test type, e.g. "simp" |
- file_type: A string describing the test output file type, e.g. ".txt" |
- output: A string containing the test output |
- expected: A string containing the expected test output |
- diff: if True, write a file containing the diffs too. This should be |
- False for results that are not text |
- wdiff: if True, write an HTML file containing word-by-word diffs |
- """ |
- self._MakeOutputDirectory(filename) |
- actual_filename = self.OutputFilename(filename, |
- test_type + self.FILENAME_SUFFIX_ACTUAL + file_type) |
- expected_filename = self.OutputFilename(filename, |
- test_type + self.FILENAME_SUFFIX_EXPECTED + file_type) |
- if output: |
- open(actual_filename, "wb").write(output) |
- if expected: |
- open(expected_filename, "wb").write(expected) |
- |
- if not output or not expected: |
- return |
- |
- if diff: |
- diff = difflib.unified_diff(expected.splitlines(True), |
- output.splitlines(True), |
- expected_filename, |
- actual_filename) |
- |
- diff_filename = self.OutputFilename(filename, |
- test_type + self.FILENAME_SUFFIX_DIFF + file_type) |
- open(diff_filename, "wb").write(''.join(diff)) |
- |
- if wdiff: |
- # Shell out to wdiff to get colored inline diffs. |
- executable = path_utils.WDiffPath() |
- cmd = [executable, |
- '--start-delete=##WDIFF_DEL##', |
- '--end-delete=##WDIFF_END##', |
- '--start-insert=##WDIFF_ADD##', |
- '--end-insert=##WDIFF_END##', |
- expected_filename, |
- actual_filename] |
- filename = self.OutputFilename(filename, |
- test_type + self.FILENAME_SUFFIX_WDIFF) |
- |
- global _wdiff_available |
- |
- try: |
- # Python's Popen has a bug that causes any pipes opened to a |
- # process that can't be executed to be leaked. Since this |
- # code is specifically designed to tolerate exec failures |
- # to gracefully handle cases where wdiff is not installed, |
- # the bug results in a massive file descriptor leak. As a |
- # workaround, if an exec failure is ever experienced for |
- # wdiff, assume it's not available. This will leak one |
- # file descriptor but that's better than leaking each time |
- # wdiff would be run. |
- # |
- # http://mail.python.org/pipermail/python-list/ |
- # 2008-August/505753.html |
- # http://bugs.python.org/issue3210 |
- # |
- # It also has a threading bug, so we don't output wdiff if |
- # the Popen raises a ValueError. |
- # http://bugs.python.org/issue1236 |
- if _wdiff_available: |
- wdiff = subprocess.Popen( |
- cmd, stdout=subprocess.PIPE).communicate()[0] |
- wdiff_failed = False |
- |
- except OSError, e: |
- if (e.errno == errno.ENOENT or e.errno == errno.EACCES or |
- e.errno == errno.ECHILD): |
- _wdiff_available = False |
- else: |
- raise e |
- except ValueError, e: |
- wdiff_failed = True |
- |
- out = open(filename, 'wb') |
- |
- if not _wdiff_available: |
- out.write( |
- "wdiff not installed.<br/> " |
- "If you're running OS X, you can install via macports." |
- "<br/>" |
- "If running Ubuntu linux, you can run " |
- "'sudo apt-get install wdiff'.") |
- elif wdiff_failed: |
- out.write('wdiff failed due to running with multiple ' |
- 'test_shells in parallel.') |
- else: |
- wdiff = cgi.escape(wdiff) |
- wdiff = wdiff.replace('##WDIFF_DEL##', '<span class=del>') |
- wdiff = wdiff.replace('##WDIFF_ADD##', '<span class=add>') |
- wdiff = wdiff.replace('##WDIFF_END##', '</span>') |
- out.write('<head><style>.del { background: #faa; } ') |
- out.write('.add { background: #afa; }</style></head>') |
- out.write('<pre>' + wdiff + '</pre>') |
- |
- out.close() |