| Index: webkit/tools/layout_tests/layout_package/test_failures.py
|
| ===================================================================
|
| --- webkit/tools/layout_tests/layout_package/test_failures.py (revision 36724)
|
| +++ webkit/tools/layout_tests/layout_package/test_failures.py (working copy)
|
| @@ -1,241 +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.
|
| -
|
| -"""Classes for failures that occur during tests."""
|
| -
|
| -import os
|
| -import test_expectations
|
| -
|
| -
|
| -def DetermineResultType(failure_list):
|
| - """Takes a set of test_failures and returns which result type best fits
|
| - the list of failures. "Best fits" means we use the worst type of failure.
|
| -
|
| - Returns:
|
| - one of the test_expectations result types - PASS, TEXT, CRASH, etc."""
|
| -
|
| - if not failure_list or len(failure_list) == 0:
|
| - return test_expectations.PASS
|
| -
|
| - failure_types = [type(f) for f in failure_list]
|
| - if FailureCrash in failure_types:
|
| - return test_expectations.CRASH
|
| - elif FailureTimeout in failure_types:
|
| - return test_expectations.TIMEOUT
|
| - elif (FailureMissingResult in failure_types or
|
| - FailureMissingImage in failure_types or
|
| - FailureMissingImageHash in failure_types):
|
| - return test_expectations.MISSING
|
| - else:
|
| - is_text_failure = FailureTextMismatch in failure_types
|
| - is_image_failure = (FailureImageHashIncorrect in failure_types or
|
| - FailureImageHashMismatch in failure_types)
|
| - if is_text_failure and is_image_failure:
|
| - return test_expectations.IMAGE_PLUS_TEXT
|
| - elif is_text_failure:
|
| - return test_expectations.TEXT
|
| - elif is_image_failure:
|
| - return test_expectations.IMAGE
|
| - else:
|
| - raise ValueError("unclassifiable set of failures: "
|
| - + str(failure_types))
|
| -
|
| -
|
| -class TestFailure(object):
|
| - """Abstract base class that defines the failure interface."""
|
| -
|
| - @staticmethod
|
| - def Message():
|
| - """Returns a string describing the failure in more detail."""
|
| - raise NotImplemented
|
| -
|
| - def ResultHtmlOutput(self, filename):
|
| - """Returns an HTML string to be included on the results.html page."""
|
| - raise NotImplemented
|
| -
|
| - def ShouldKillTestShell(self):
|
| - """Returns True if we should kill the test shell before the next
|
| - test."""
|
| - return False
|
| -
|
| - def RelativeOutputFilename(self, filename, modifier):
|
| - """Returns a relative filename inside the output dir that contains
|
| - modifier.
|
| -
|
| - For example, if filename is fast\dom\foo.html and modifier is
|
| - "-expected.txt", the return value is fast\dom\foo-expected.txt
|
| -
|
| - Args:
|
| - filename: relative filename to test file
|
| - modifier: a string to replace the extension of filename with
|
| -
|
| - Return:
|
| - The relative windows path to the output filename
|
| - """
|
| - return os.path.splitext(filename)[0] + modifier
|
| -
|
| -
|
| -class FailureWithType(TestFailure):
|
| - """Base class that produces standard HTML output based on the test type.
|
| -
|
| - Subclasses may commonly choose to override the ResultHtmlOutput, but still
|
| - use the standard OutputLinks.
|
| - """
|
| -
|
| - def __init__(self, test_type):
|
| - TestFailure.__init__(self)
|
| - # TODO(ojan): This class no longer needs to know the test_type.
|
| - self._test_type = test_type
|
| -
|
| - # Filename suffixes used by ResultHtmlOutput.
|
| - OUT_FILENAMES = []
|
| -
|
| - def OutputLinks(self, filename, out_names):
|
| - """Returns a string holding all applicable output file links.
|
| -
|
| - Args:
|
| - filename: the test filename, used to construct the result file names
|
| - out_names: list of filename suffixes for the files. If three or more
|
| - suffixes are in the list, they should be [actual, expected, diff,
|
| - wdiff]. Two suffixes should be [actual, expected], and a
|
| - single item is the [actual] filename suffix.
|
| - If out_names is empty, returns the empty string.
|
| - """
|
| - links = ['']
|
| - uris = [self.RelativeOutputFilename(filename, fn) for fn in out_names]
|
| - if len(uris) > 1:
|
| - links.append("<a href='%s'>expected</a>" % uris[1])
|
| - if len(uris) > 0:
|
| - links.append("<a href='%s'>actual</a>" % uris[0])
|
| - if len(uris) > 2:
|
| - links.append("<a href='%s'>diff</a>" % uris[2])
|
| - if len(uris) > 3:
|
| - links.append("<a href='%s'>wdiff</a>" % uris[3])
|
| - return ' '.join(links)
|
| -
|
| - def ResultHtmlOutput(self, filename):
|
| - return self.Message() + self.OutputLinks(filename, self.OUT_FILENAMES)
|
| -
|
| -
|
| -class FailureTimeout(TestFailure):
|
| - """Test timed out. We also want to restart the test shell if this
|
| - happens."""
|
| -
|
| - @staticmethod
|
| - def Message():
|
| - return "Test timed out"
|
| -
|
| - def ResultHtmlOutput(self, filename):
|
| - return "<strong>%s</strong>" % self.Message()
|
| -
|
| - def ShouldKillTestShell(self):
|
| - return True
|
| -
|
| -
|
| -class FailureCrash(TestFailure):
|
| - """Test shell crashed."""
|
| -
|
| - @staticmethod
|
| - def Message():
|
| - return "Test shell crashed"
|
| -
|
| - def ResultHtmlOutput(self, filename):
|
| - # TODO(tc): create a link to the minidump file
|
| - stack = self.RelativeOutputFilename(filename, "-stack.txt")
|
| - return "<strong>%s</strong> <a href=%s>stack</a>" % (self.Message(),
|
| - stack)
|
| -
|
| - def ShouldKillTestShell(self):
|
| - return True
|
| -
|
| -
|
| -class FailureMissingResult(FailureWithType):
|
| - """Expected result was missing."""
|
| - OUT_FILENAMES = ["-actual.txt"]
|
| -
|
| - @staticmethod
|
| - def Message():
|
| - return "No expected results found"
|
| -
|
| - def ResultHtmlOutput(self, filename):
|
| - return ("<strong>%s</strong>" % self.Message() +
|
| - self.OutputLinks(filename, self.OUT_FILENAMES))
|
| -
|
| -
|
| -class FailureTextMismatch(FailureWithType):
|
| - """Text diff output failed."""
|
| - # Filename suffixes used by ResultHtmlOutput.
|
| - OUT_FILENAMES = ["-actual.txt", "-expected.txt", "-diff.txt"]
|
| - OUT_FILENAMES_WDIFF = ["-actual.txt", "-expected.txt", "-diff.txt",
|
| - "-wdiff.html"]
|
| -
|
| - def __init__(self, test_type, has_wdiff):
|
| - FailureWithType.__init__(self, test_type)
|
| - if has_wdiff:
|
| - self.OUT_FILENAMES = self.OUT_FILENAMES_WDIFF
|
| -
|
| - @staticmethod
|
| - def Message():
|
| - return "Text diff mismatch"
|
| -
|
| -
|
| -class FailureMissingImageHash(FailureWithType):
|
| - """Actual result hash was missing."""
|
| - # Chrome doesn't know to display a .checksum file as text, so don't bother
|
| - # putting in a link to the actual result.
|
| - OUT_FILENAMES = []
|
| -
|
| - @staticmethod
|
| - def Message():
|
| - return "No expected image hash found"
|
| -
|
| - def ResultHtmlOutput(self, filename):
|
| - return "<strong>%s</strong>" % self.Message()
|
| -
|
| -
|
| -class FailureMissingImage(FailureWithType):
|
| - """Actual result image was missing."""
|
| - OUT_FILENAMES = ["-actual.png"]
|
| -
|
| - @staticmethod
|
| - def Message():
|
| - return "No expected image found"
|
| -
|
| - def ResultHtmlOutput(self, filename):
|
| - return ("<strong>%s</strong>" % self.Message() +
|
| - self.OutputLinks(filename, self.OUT_FILENAMES))
|
| -
|
| -
|
| -class FailureImageHashMismatch(FailureWithType):
|
| - """Image hashes didn't match."""
|
| - OUT_FILENAMES = ["-actual.png", "-expected.png", "-diff.png"]
|
| -
|
| - @staticmethod
|
| - def Message():
|
| - # We call this a simple image mismatch to avoid confusion, since
|
| - # we link to the PNGs rather than the checksums.
|
| - return "Image mismatch"
|
| -
|
| -
|
| -class FailureFuzzyFailure(FailureWithType):
|
| - """Image hashes didn't match."""
|
| - OUT_FILENAMES = ["-actual.png", "-expected.png"]
|
| -
|
| - @staticmethod
|
| - def Message():
|
| - return "Fuzzy image match also failed"
|
| -
|
| -
|
| -class FailureImageHashIncorrect(FailureWithType):
|
| - """Actual result hash is incorrect."""
|
| - # Chrome doesn't know to display a .checksum file as text, so don't bother
|
| - # putting in a link to the actual result.
|
| - OUT_FILENAMES = []
|
| -
|
| - @staticmethod
|
| - def Message():
|
| - return "Images match, expected image hash incorrect. "
|
| -
|
| - def ResultHtmlOutput(self, filename):
|
| - return "<strong>%s</strong>" % self.Message()
|
|
|