diff options
Diffstat (limited to 'webkit/tools/layout_tests/layout_package/failure.py')
-rw-r--r-- | webkit/tools/layout_tests/layout_package/failure.py | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/webkit/tools/layout_tests/layout_package/failure.py b/webkit/tools/layout_tests/layout_package/failure.py new file mode 100644 index 0000000..cefcc13 --- /dev/null +++ b/webkit/tools/layout_tests/layout_package/failure.py @@ -0,0 +1,184 @@ +#!/bin/env/python +# 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. + +CHROMIUM_WIN = "chromium-win" +CHROMIUM_MAC = "chromium-mac" +CHROMIUM_LINUX = "chromium-linux" +WEBKIT_WIN_TITLE = "WebKit Win" +WEBKIT_MAC_TITLE = "WebKit Mac" +WEBKIT_TITLE = "WebKit" +UNKNOWN = "Unknown" + +EXPECTED_IMAGE_FILE_ENDING = "-expected.png" +ACTUAL_IMAGE_FILE_ENDING = "-actual.png" +UPSTREAM_IMAGE_FILE_ENDING = "-upstream.png" +EXPECTED_TEXT_FILE_ENDING = "-expected.txt" +ACTUAL_TEXT_FILE_ENDING = "-actual.txt" +DIFF_IMAGE_FILE_ENDING = "-diff.png" +DIFF_TEXT_FILE_ENDING = "-diff.txt" + +CHROMIUM_SRC_HOME = "http://src.chromium.org/viewvc/chrome/trunk/src/webkit/" +CHROMIUM_TRAC_HOME = CHROMIUM_SRC_HOME + "data/layout_tests/" +WEBKIT_TRAC_HOME = "http://trac.webkit.org/browser/trunk/" +WEBKIT_SVN_HOSTNAME = "svn.webkit.org" + +WEBKIT_PLATFORM_URL_BASE = WEBKIT_TRAC_HOME + "LayoutTests/platform" +WEBKIT_LAYOUT_TEST_BASE_URL = "http://svn.webkit.org/repository/webkit/trunk/" +WEBKIT_IMAGE_BASELINE_BASE_URL_WIN = (WEBKIT_LAYOUT_TEST_BASE_URL + + "LayoutTests/platform/win/") +WEBKIT_IMAGE_BASELINE_BASE_URL_MAC = (WEBKIT_LAYOUT_TEST_BASE_URL + + "LayoutTests/platform/mac/") +WEBKIT_TRAC_IMAGE_BASELINE_BASE_URL_MAC = WEBKIT_PLATFORM_URL_BASE + "/mac/" +WEBKIT_TRAC_IMAGE_BASELINE_BASE_URL_WIN = WEBKIT_PLATFORM_URL_BASE + "/win/" + +LAYOUT_TEST_RESULTS_DIR = "layout-test-results" + +class Failure(object): + """ + This class represents a failure in the test output, and is + intended as a data model object. + """ + def __init__(self): + self.platform = "" + self.test_path = "" + self.text_diff_mismatch = False + self.simplified_text_diff_mismatch = False + self.image_mismatch = False + self.timeout = False + self.crashed = False + self.text_baseline_url = "" + self.image_baseline_url = "" + self.text_baseline_age = "" + self.image_baseline_age = "" + self.test_age = "" + self.text_baseline_local = "" + self.image_baseline_local = "" + self.text_actual_local = "" + self.image_actual_local = "" + self.image_baseline_upstream_url = "" + self.image_baseline_upstream_local = "" + self.test_expectations_line = "" + self.flakiness = 0 + + def GetExpectedImageFilename(self): + return self._RenameEndOfTestPath(EXPECTED_IMAGE_FILE_ENDING) + + def GetActualImageFilename(self): + return self._RenameEndOfTestPath(ACTUAL_IMAGE_FILE_ENDING) + + def GetExpectedTextFilename(self): + return self._RenameEndOfTestPath(EXPECTED_TEXT_FILE_ENDING) + + def GetActualTextFilename(self): + return self._RenameEndOfTestPath(ACTUAL_TEXT_FILE_ENDING) + + def GetImageDiffFilename(self): + return self._RenameEndOfTestPath(DIFF_IMAGE_FILE_ENDING) + + def GetTextDiffFilename(self): + return self._RenameEndOfTestPath(DIFF_TEXT_FILE_ENDING) + + def _RenameEndOfTestPath(self, suffix): + last_index = self.test_path.rfind(".") + if last_index == -1: + return self.test_path + return self.test_path[0:last_index] + suffix + + def GetTestHome(self): + if (self.test_path.startswith("chrome") or + self.test_path.startswith("pending")): + return CHROMIUM_TRAC_HOME + self.test_path + return WEBKIT_TRAC_HOME + self.test_path + + def GetImageBaselineTracHome(self): + if self.IsImageBaselineInWebkit(): + return self._GetTracHome(self.image_baseline_url) + return self.image_baseline_url + + def GetTextBaselineTracHome(self): + if self.text_baseline_url and self.IsTextBaselineInWebkit(): + return self._GetTracHome(self.text_baseline_url) + return self.text_baseline_url + + def _GetTracHome(self, file): + return WEBKIT_TRAC_HOME + file[file.find("LayoutTests"):] + + def GetTextBaselineLocation(self): + return self._GetFileLocation(self.text_baseline_url) + + def GetImageBaselineLocation(self): + return self._GetFileLocation(self.image_baseline_url) + + # TODO(gwilson): Refactor this logic so it can be used by multiple scripts. + # TODO(gwilson): Change this so that it respects the fallback order of + # different platforms. (If platform is mac, the fallback should be different.) + def _GetFileLocation(self, file): + if not file: + return None + if file.find(CHROMIUM_WIN) > -1: + return CHROMIUM_WIN + if file.find(CHROMIUM_MAC) > -1: + return CHROMIUM_MAC + if file.find(CHROMIUM_LINUX) > -1: + return CHROMIUM_LINUX + if file.startswith(WEBKIT_IMAGE_BASELINE_BASE_URL_WIN): + return WEBKIT_WIN_TITLE + if file.startswith(WEBKIT_IMAGE_BASELINE_BASE_URL_MAC): + return WEBKIT_MAC_TITLE + # TODO(gwilson): Add mac-snowleopard, mac-leopard, mac-tiger here. + if file.startswith(WEBKIT_LAYOUT_TEST_BASE_URL): + return WEBKIT_TITLE + return UNKNOWN + + def _IsFileInWebKit(self, file): + return file != None and file.find(WEBKIT_SVN_HOSTNAME) > -1 + + def IsImageBaselineInChromium(self): + return not self.IsImageBaselineInWebkit() + + def IsImageBaselineInWebkit(self): + return self._IsFileInWebKit(self.image_baseline_url) + + def IsTextBaselineInChromium(self): + return not self.IsTextBaselineInWebkit() + + def IsTextBaselineInWebkit(self): + return self._IsFileInWebKit(self.text_baseline_url) + + def GetTextResultLocationInZipFile(self): + return self._GetFileLocationInZipFile(self.GetActualTextFilename()) + + def GetImageResultLocationInZipFile(self): + return self._GetFileLocationInZipFile(self.GetActualImageFilename()) + + def _GetFileLocationInZipFile(self, file): + return "%s/%s" % (LAYOUT_TEST_RESULTS_DIR, file) + + # TODO(gwilson): implement this method. + def GetAllBaselineLocations(self): + return None + + # This method determines whether the test is actually expected to fail, + # in order to know whether to retrieve expected test results for it. + # (test results dont exist for tests expected to fail/crash.) + def IsExpectedToFail(self): + return self._FindKeywordInExpectations("FAIL") + + def IsExpectedToTimeout(self): + return self._FindKeywordInExpectations("TIMEOUT") + + def IsExpectedToCrash(self): + return self._FindKeywordInExpectations("CRASH") + + def IsExpectedToPass(self): + return self._FindKeywordInExpectations("PASS") + + def _FindKeywordInExpectations(self, keyword): + if (not self.test_expectations_line or + len(self.test_expectations_line) == 0): + return False + if self.test_expectations_line.find(keyword) > -1: + return True + return False |