| Index: webkit/tools/layout_tests/layout_package/failure_finder_test.py
|
| ===================================================================
|
| --- webkit/tools/layout_tests/layout_package/failure_finder_test.py (revision 36724)
|
| +++ webkit/tools/layout_tests/layout_package/failure_finder_test.py (working copy)
|
| @@ -1,374 +0,0 @@
|
| -#!/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.
|
| -
|
| -import os
|
| -import zipfile
|
| -
|
| -from failure_finder import FailureFinder
|
| -
|
| -TEST_BUILDER_OUTPUT = """090723 10:38:22 test_shell_thread.py:289
|
| - ERROR chrome/fast/forms/textarea-metrics.html failed:
|
| - Text diff mismatch
|
| - 090723 10:38:21 test_shell_thread.py:289
|
| - ERROR chrome/fast/dom/xss-DENIED-javascript-variations.html failed:
|
| - Text diff mismatch
|
| - 090723 10:37:58 test_shell_thread.py:289
|
| - ERROR LayoutTests/plugins/bindings-test.html failed:
|
| - Text diff mismatch
|
| -
|
| -------------------------------------------------------------------------------
|
| -Expected to crash, but passed (1):
|
| - chrome/fast/forms/textarea-metrics.html
|
| -
|
| -Regressions: Unexpected failures (2):
|
| - chrome/fast/dom/xss-DENIED-javascript-variations.html = FAIL
|
| - LayoutTests/plugins/bindings-test.html = FAIL
|
| -------------------------------------------------------------------------------
|
| -"""
|
| -
|
| -TEST_FAILURE_1 = ("layout-test-results/chrome/fast/forms/"
|
| - "textarea-metrics-actual.txt")
|
| -TEST_FAILURE_2 = ("layout-test-results/chrome/fast/dom/"
|
| - "xss-DENIED-javascript-variations-actual.txt")
|
| -TEST_FAILURE_3 = ("layout-test-results/LayoutTests/plugins/"
|
| - "bindings-test-actual.txt")
|
| -
|
| -TEST_ARCHIVE_OUTPUT = """
|
| -Adding layout-test-results\pending\fast\repaint\not-real-actual.checksum
|
| -Adding layout-test-results\pending\fast\repaint\not-real-actual.png
|
| -Adding layout-test-results\pending\fast\repaint\not-real-actual.txt
|
| -last change: 22057
|
| -build name: webkit-rel
|
| -host name: codf138
|
| -saving results to \\my\test\location\webkit-rel\22057
|
| -program finished with exit code 0
|
| -"""
|
| -
|
| -TEST_TEST_EXPECTATIONS = """
|
| -BUG1234 chrome/fast/forms/textarea-metrics.html = CRASH
|
| -"""
|
| -
|
| -TEST_BUILDER_LOG_FILE = "TEST_builder.log"
|
| -TEST_ARCHIVE_LOG_FILE = "TEST_archive.log"
|
| -TEST_DUMMY_ZIP_FILE = "TEST_zipfile.zip"
|
| -TEST_EXPECTATIONS_FILE = "TEST_expectations.txt"
|
| -
|
| -WEBKIT_BUILDER_NUMBER = "9800"
|
| -WEBKIT_FAILURES = (
|
| - ["LayoutTests/fast/backgrounds/animated-svg-as-mask.html",
|
| - "LayoutTests/fast/backgrounds/background-clip-text.html",
|
| - "LayoutTests/fast/backgrounds/mask-composite.html",
|
| - "LayoutTests/fast/backgrounds/repeat/mask-negative-offset-repeat.html",
|
| - "LayoutTests/fast/backgrounds/svg-as-background-3.html",
|
| - "LayoutTests/fast/backgrounds/svg-as-background-6.html",
|
| - "LayoutTests/fast/backgrounds/svg-as-mask.html",
|
| - "LayoutTests/fast/block/float/013.html",
|
| - "LayoutTests/fast/block/float/nested-clearance.html",
|
| - "LayoutTests/fast/block/positioning/047.html"])
|
| -
|
| -CHROMIUM_BASELINE = "chrome/fast/forms/basic-buttons.html"
|
| -EXPECTED_CHROMIUM_LOCAL_BASELINE = "./chrome/fast/forms/basic-buttons.html"
|
| -EXPECTED_CHROMIUM_URL_BASELINE = ("http://src.chromium.org/viewvc/chrome/"
|
| - "trunk/src/webkit/data/layout_tests/chrome/"
|
| - "fast/forms/basic-buttons.html")
|
| -
|
| -WEBKIT_BASELINE = "LayoutTests/fast/forms/11423.html"
|
| -EXPECTED_WEBKIT_LOCAL_BASELINE = "./LayoutTests/fast/forms/11423.html"
|
| -EXPECTED_WEBKIT_URL_BASELINE = (
|
| - "http://svn.webkit.org/repository/webkit/trunk/"
|
| - "LayoutTests/fast/forms/11423.html")
|
| -
|
| -TEST_ZIP_FILE = ("http://build.chromium.org/buildbot/layout_test_results/"
|
| - "webkit-rel/21432/layout-test-results.zip")
|
| -
|
| -EXPECTED_REVISION = "20861"
|
| -EXPECTED_BUILD_NAME = "webkit-rel"
|
| -
|
| -SVG_TEST_EXPECTATION = (
|
| - "LayoutTests/svg/custom/foreign-object-skew-expected.png")
|
| -SVG_TEST_EXPECTATION_UPSTREAM = ("LayoutTests/svg/custom/"
|
| - "foreign-object-skew-expected-upstream.png")
|
| -WEBARCHIVE_TEST_EXPECTATION = ("LayoutTests/webarchive/adopt-attribute-"
|
| - "styled-body-webarchive-expected.webarchive")
|
| -DOM_TEST_EXPECTATION = ("LayoutTests/fast/dom/"
|
| - "attribute-downcast-right-expected.txt")
|
| -DOM_TEST_EXPECTATION_UPSTREAM = ("LayoutTests/fast/dom/"
|
| - "attribute-downcast-right-"
|
| - "expected-upstream.png")
|
| -
|
| -TEST_EXPECTATIONS = """
|
| -BUG1234 WONTFIX : LayoutTests/fast/backgrounds/svg-as-background-3.html = FAIL
|
| -BUG3456 WIN : LayoutTests/fast/backgrounds/svg-as-background-6.html = CRASH
|
| -BUG4567 : LayoutTests/fast/backgrounds/svg-as-mask.html = PASS
|
| -WONTFIX : LayoutTests/fast/block/ = FAIL
|
| -"""
|
| -
|
| -EXPECT_EXACT_MATCH = "LayoutTests/fast/backgrounds/svg-as-background-6.html"
|
| -EXPECT_GENERAL_MATCH = "LayoutTests/fast/block/float/013.html"
|
| -EXPECT_NO_MATCH = "LayoutTests/fast/backgrounds/svg-as-background-99.html"
|
| -
|
| -WEBKIT_ORG = "webkit.org"
|
| -CHROMIUM_ORG = "chromium.org"
|
| -
|
| -
|
| -class FailureFinderTest(object):
|
| -
|
| - def runTests(self):
|
| - all_tests_passed = True
|
| -
|
| - tests = ["testWhitespaceInBuilderName",
|
| - "testGetLastBuild",
|
| - "testFindMatchesInBuilderOutput",
|
| - "testScrapeBuilderOutput",
|
| - "testGetChromiumBaseline",
|
| - "testGetWebkitBaseline",
|
| - "testZipDownload",
|
| - "testUseLocalOutput",
|
| - "testTranslateBuildToZip",
|
| - "testGetBaseline",
|
| - "testFindTestExpectations",
|
| - "testFull"]
|
| -
|
| - for test in tests:
|
| - try:
|
| - result = eval(test + "()")
|
| - if result:
|
| - print "[ OK ] %s" % test
|
| - else:
|
| - all_tests_passed = False
|
| - print "[ FAIL ] %s" % test
|
| - except:
|
| - print "[ ERROR ] %s" % test
|
| - return all_tests_passed
|
| -
|
| -
|
| -def _getBasicFailureFinder():
|
| - return FailureFinder(None, "Webkit", False, "", ".", 10, False)
|
| -
|
| -
|
| -def _testLastBuild(failure_finder):
|
| - try:
|
| - last_build = failure_finder.GetLastBuild()
|
| - # Verify that last_build is not empty and is a number.
|
| - build = int(last_build)
|
| - return (build > 0)
|
| - except:
|
| - return False
|
| -
|
| -
|
| -def testGetLastBuild():
|
| - test = _getBasicFailureFinder()
|
| - return _testLastBuild(test)
|
| -
|
| -
|
| -def testWhitespaceInBuilderName():
|
| - test = _getBasicFailureFinder()
|
| - test.SetPlatform("Webkit (webkit.org)")
|
| - return _testLastBuild(test)
|
| -
|
| -
|
| -def testScrapeBuilderOutput():
|
| -
|
| - # Try on the default builder.
|
| - test = _getBasicFailureFinder()
|
| - test.build = "9800"
|
| - output = test._ScrapeBuilderOutput()
|
| - if not output:
|
| - return False
|
| -
|
| - # Try on a crazy builder on the FYI waterfall.
|
| - test = _getBasicFailureFinder()
|
| - test.build = "1766"
|
| - test.SetPlatform("Webkit Linux (webkit.org)")
|
| - output = test._ScrapeBuilderOutput()
|
| - if not output:
|
| - return False
|
| -
|
| - return True
|
| -
|
| -
|
| -def testFindMatchesInBuilderOutput():
|
| - test = _getBasicFailureFinder()
|
| - test.exclude_known_failures = True
|
| - matches = test._FindMatchesInBuilderOutput(TEST_BUILDER_OUTPUT)
|
| - # Verify that we found x matches.
|
| - if len(matches) != 2:
|
| - print "Did not find all unexpected failures."
|
| - return False
|
| -
|
| - test.exclude_known_failures = False
|
| - matches = test._FindMatchesInBuilderOutput(TEST_BUILDER_OUTPUT)
|
| - if len(matches) != 3:
|
| - print "Did not find all failures."
|
| - return False
|
| - return True
|
| -
|
| -
|
| -def _testBaseline(test_name, expected_local, expected_url):
|
| - test = _getBasicFailureFinder()
|
| - # Test baseline that is obviously in Chromium's tree.
|
| - baseline = test._GetBaseline(test_name, ".", False)
|
| - try:
|
| - os.remove(baseline.local_file)
|
| - if (baseline.local_file != expected_local or
|
| - baseline.baseline_url != expected_url):
|
| - return False
|
| - except:
|
| - return False
|
| - return True
|
| -
|
| -
|
| -def testGetChromiumBaseline():
|
| - return _testBaseline(CHROMIUM_BASELINE, EXPECTED_CHROMIUM_LOCAL_BASELINE,
|
| - EXPECTED_CHROMIUM_URL_BASELINE)
|
| -
|
| -
|
| -def testGetWebkitBaseline():
|
| - return _testBaseline(WEBKIT_BASELINE, EXPECTED_WEBKIT_LOCAL_BASELINE,
|
| - EXPECTED_WEBKIT_URL_BASELINE)
|
| -
|
| -
|
| -def testUseLocalOutput():
|
| - test_result = True
|
| - try:
|
| - _writeFile(TEST_BUILDER_LOG_FILE, TEST_BUILDER_OUTPUT)
|
| - _writeFile(TEST_ARCHIVE_LOG_FILE, TEST_ARCHIVE_OUTPUT)
|
| - _writeFile(TEST_EXPECTATIONS_FILE, TEST_TEST_EXPECTATIONS)
|
| - zip = zipfile.ZipFile(TEST_DUMMY_ZIP_FILE, 'w')
|
| - zip.write(TEST_BUILDER_LOG_FILE, TEST_FAILURE_1)
|
| - zip.write(TEST_BUILDER_LOG_FILE, TEST_FAILURE_2)
|
| - zip.write(TEST_BUILDER_LOG_FILE, TEST_FAILURE_3)
|
| - zip.close()
|
| - test = _getBasicFailureFinder()
|
| - test.archive_step_log_file = TEST_ARCHIVE_LOG_FILE
|
| - test.builder_output_log_file = TEST_BUILDER_LOG_FILE
|
| - test.test_expectations_file = TEST_EXPECTATIONS_FILE
|
| - test.zip_file = TEST_DUMMY_ZIP_FILE
|
| - test.dont_download = True
|
| - test.exclude_known_failures = True
|
| - test.delete_zip_file = False
|
| - failures = test.GetFailures()
|
| - if not failures or len(failures) != 2:
|
| - print "Did not get expected number of failures :"
|
| - for failure in failures:
|
| - print failure.test_path
|
| - test_result = False
|
| - finally:
|
| - os.remove(TEST_BUILDER_LOG_FILE)
|
| - os.remove(TEST_ARCHIVE_LOG_FILE)
|
| - os.remove(TEST_EXPECTATIONS_FILE)
|
| - os.remove(TEST_DUMMY_ZIP_FILE)
|
| - return test_result
|
| -
|
| -
|
| -def _writeFile(filename, contents):
|
| - myfile = open(filename, 'w')
|
| - myfile.write(contents)
|
| - myfile.close()
|
| -
|
| -
|
| -def testZipDownload():
|
| - test = _getBasicFailureFinder()
|
| - try:
|
| - test._DownloadFile(TEST_ZIP_FILE, "test.zip", "b") # "b" -> binary
|
| - os.remove("test.zip")
|
| - return True
|
| - except:
|
| - return False
|
| -
|
| -
|
| -def testTranslateBuildToZip():
|
| - test = _getBasicFailureFinder()
|
| - test.build = WEBKIT_BUILDER_NUMBER
|
| - revision, build_name = test._GetRevisionAndBuildFromArchiveStep()
|
| - if revision != EXPECTED_REVISION or build_name != EXPECTED_BUILD_NAME:
|
| - return False
|
| - return True
|
| -
|
| -
|
| -def testGetBaseline():
|
| - test = _getBasicFailureFinder()
|
| - result = True
|
| - test.platform = "chromium-mac"
|
| - baseline = test._GetBaseline(WEBARCHIVE_TEST_EXPECTATION, ".")
|
| - if not baseline.local_file or baseline.baseline_url.find(WEBKIT_ORG) == -1:
|
| - result = False
|
| - print "Webarchive layout test not found at webkit.org: %s" % url
|
| - test.platform = "chromium-win"
|
| - baseline = test._GetBaseline(SVG_TEST_EXPECTATION, ".")
|
| - if (not baseline.local_file or
|
| - baseline.baseline_url.find(CHROMIUM_ORG) == -1):
|
| - result = False
|
| - print "SVG layout test found at %s, not chromium.org" % url
|
| - baseline = test._GetBaseline(SVG_TEST_EXPECTATION, ".", True)
|
| - if not baseline.local_file or baseline.baseline_url.find(WEBKIT_ORG) == -1:
|
| - result = False
|
| - print "Upstream SVG layout test NOT found at webkit.org!"
|
| - baseline = test._GetBaseline(DOM_TEST_EXPECTATION, ".", True)
|
| - if (not baseline.local_file or
|
| - baseline.baseline_url.find("/platform/") > -1):
|
| - result = False
|
| - print ("Upstream SVG layout test found in a "
|
| - "platform directory: %s" % url)
|
| - os.remove(WEBARCHIVE_TEST_EXPECTATION)
|
| - os.remove(SVG_TEST_EXPECTATION)
|
| - os.remove(SVG_TEST_EXPECTATION_UPSTREAM)
|
| - os.remove(DOM_TEST_EXPECTATION_UPSTREAM)
|
| - deleteDir("LayoutTests")
|
| - return result
|
| -
|
| -
|
| -def deleteDir(directory):
|
| - """ Recursively deletes empty directories given a root.
|
| - This method will throw an exception if they are not empty. """
|
| - for root, dirs, files in os.walk(directory, topdown=False):
|
| - for d in dirs:
|
| - try:
|
| - os.rmdir(os.path.join(root, d))
|
| - except:
|
| - pass
|
| - os.rmdir(directory)
|
| -
|
| -
|
| -def testFull():
|
| - """ Verifies that the entire system works end-to-end. """
|
| - test = _getBasicFailureFinder()
|
| - test.build = WEBKIT_BUILDER_NUMBER
|
| - test.dont_download = True # Dry run only, no downloading needed.
|
| - failures = test.GetFailures()
|
| - # Verify that the max failures parameter works.
|
| - if not failures or len(failures) > 10:
|
| - "Got no failures or too many failures."
|
| - return False
|
| -
|
| - # Verify the failures match the list of expected failures.
|
| - for failure in failures:
|
| - if not (failure.test_path in WEBKIT_FAILURES):
|
| - print "Found a failure I did not expect to see."
|
| - return False
|
| -
|
| - return True
|
| -
|
| -
|
| -def testFindTestExpectations():
|
| - test = _getBasicFailureFinder()
|
| - test._test_expectations_cache = TEST_EXPECTATIONS
|
| - match = test._GetTestExpectationsLine(EXPECT_EXACT_MATCH)
|
| - if not match:
|
| - return False
|
| - match = test._GetTestExpectationsLine(EXPECT_GENERAL_MATCH)
|
| - if not match:
|
| - return False
|
| - match = test._GetTestExpectationsLine(EXPECT_NO_MATCH)
|
| - return not match
|
| -
|
| -
|
| -if __name__ == "__main__":
|
| - fft = FailureFinderTest()
|
| - result = fft.runTests()
|
| - if result:
|
| - print "All tests passed."
|
| - else:
|
| - print "Not all tests passed."
|
|
|