diff options
author | dpranke@google.com <dpranke@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-21 21:07:53 +0000 |
---|---|---|
committer | dpranke@google.com <dpranke@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-21 21:07:53 +0000 |
commit | 77c2af208b64e6b8c128efe79c05932d63d33571 (patch) | |
tree | 4490018633dd3753fd79bdc9b38babe97bf33ad6 /webkit/tools | |
parent | 9db1d46d0d31b0aea57099f55f4566404d2e0fd3 (diff) | |
download | chromium_src-77c2af208b64e6b8c128efe79c05932d63d33571.zip chromium_src-77c2af208b64e6b8c128efe79c05932d63d33571.tar.gz chromium_src-77c2af208b64e6b8c128efe79c05932d63d33571.tar.bz2 |
Try change 23924 again - refactor layout_package.path_utils and
layout_package.platform_utils.
Deltas from that change:
* Don't enable 'win-xp' as the default platform
* Don't assume 'webkit/Release' exists (it doesn't by default on mac and
linux), and fix the output results directory path in run_webkit_tests
* Update tools/valgrind/chrome_tests.py (which I didn't realize
depended on the layout_package code).
BUG=none
R=tony@chromium.org
TEST=none
Review URL: http://codereview.chromium.org/174209
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@24007 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/tools')
16 files changed, 542 insertions, 1039 deletions
diff --git a/webkit/tools/layout_tests/layout_package/failure_finder.py b/webkit/tools/layout_tests/layout_package/failure_finder.py index 392d2f9..63fe573 100644 --- a/webkit/tools/layout_tests/layout_package/failure_finder.py +++ b/webkit/tools/layout_tests/layout_package/failure_finder.py @@ -8,10 +8,8 @@ import difflib import errno -import google.path_utils import os import path_utils -import platform_utils import re import subprocess import sys @@ -140,7 +138,7 @@ def ScrapeURL(url): def GeneratePNGDiff(file1, file2, output_file): _compare_available = False; try: - executable = path_utils.ImageDiffBinaryPath("Debug") + executable = path_utils.ImageDiffPath("Debug") cmd = [executable, '--diff', file1, file2, output_file] _compare_available = True; except Exception, e: diff --git a/webkit/tools/layout_tests/layout_package/http_server.py b/webkit/tools/layout_tests/layout_package/http_server.py index 1d32e58..d30d695 100644 --- a/webkit/tools/layout_tests/layout_package/http_server.py +++ b/webkit/tools/layout_tests/layout_package/http_server.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +# 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. @@ -9,21 +9,13 @@ import logging import optparse import os -import platform_utils import subprocess import sys import tempfile import time import urllib -import google.path_utils - -# This will be a native path to the directory this file resides in. -# It can either be relative or absolute depending how it's executed. -THISDIR = os.path.dirname(os.path.abspath(__file__)) - -def PathFromBase(*pathies): - return google.path_utils.FindUpward(THISDIR, *pathies) +import path_utils def RemoveLogFiles(folder, starts_with): files = os.listdir(folder) @@ -38,30 +30,30 @@ class HttpdNotStarted(Exception): class Lighttpd: # Webkit tests try: - _webkit_tests = PathFromBase('third_party', 'WebKit', - 'LayoutTests', 'http', 'tests') - except google.path_utils.PathNotFound: + _webkit_tests = path_utils.PathFromBase('third_party', 'WebKit', + 'LayoutTests', 'http', 'tests') + except path_utils.PathNotFound: # If third_party/WebKit/LayoutTests/http/tests does not exist, assume wekit # tests are located in webkit/data/layout_tests/LayoutTests/http/tests. try: - _webkit_tests = PathFromBase('webkit', 'data', 'layout_tests', - 'LayoutTests', 'http', 'tests') - except google.path_utils.PathNotFound: + _webkit_tests = path_utils.PathFromBase('webkit', 'data', 'layout_tests', + 'LayoutTests', 'http', 'tests') + except path_utils.PathNotFound: _webkit_tests = None # New tests for Chrome try: - _pending_tests = PathFromBase('webkit', 'data', 'layout_tests', - 'pending', 'http', 'tests') - except google.path_utils.PathNotFound: + _pending_tests = path_utils.PathFromBase('webkit', 'data', 'layout_tests', + 'pending', 'http', 'tests') + except path_utils.PathNotFound: _pending_tests = None # Path where we can access all of the tests - _all_tests = PathFromBase('webkit', 'data', 'layout_tests') + _all_tests = path_utils.PathFromBase('webkit', 'data', 'layout_tests') # Self generated certificate for SSL server (for client cert get # <base-path>\chrome\test\data\ssl\certs\root_ca_cert.crt) - _pem_file = PathFromBase('tools', 'python', 'google', 'httpd_config', - 'httpd2.pem') + _pem_file = path_utils.PathFromBase('tools', 'python', 'google', + 'httpd_config', 'httpd2.pem') VIRTUALCONFIG = [ # One mapping where we can get to everything {'port': 8081, 'docroot': _all_tests} @@ -103,7 +95,8 @@ class Lighttpd: if self.IsRunning(): raise 'Lighttpd already running' - base_conf_file = os.path.join(THISDIR, 'lighttpd.conf') + base_conf_file = path_utils.PathFromBase('webkit', + 'tools','layout_tests','layout_package', 'lighttpd.conf') out_conf_file = os.path.join(self._output_dir, 'lighttpd.conf') time_str = time.strftime("%d%b%Y-%H%M%S") access_file_name = "access.log-" + time_str + ".txt" @@ -126,12 +119,11 @@ class Lighttpd: # Write out our cgi handlers. Run perl through env so that it processes # the #! line and runs perl with the proper command line arguments. # Emulate apache's mod_asis with a cat cgi handler. - platform_util = platform_utils.PlatformUtility('') f.write(('cgi.assign = ( ".cgi" => "/usr/bin/env",\n' ' ".pl" => "/usr/bin/env",\n' ' ".asis" => "/bin/cat",\n' ' ".php" => "%s" )\n\n') % - platform_util.LigHTTPdPHPPath()) + path_utils.LigHTTPdPHPPath()) # Setup log files f.write(('server.errorlog = "%s"\n' @@ -170,11 +162,12 @@ class Lighttpd: '}\n\n') % (mapping['port'], mapping['docroot'])) f.close() - executable = platform_util.LigHTTPdExecutablePath() - module_path = platform_util.LigHTTPdModulePath() + executable = path_utils.LigHTTPdExecutablePath() + module_path = path_utils.LigHTTPdModulePath() start_cmd = [ executable, # Newly written config file - '-f', PathFromBase(self._output_dir, 'lighttpd.conf'), + '-f', path_utils.PathFromBase(self._output_dir, + 'lighttpd.conf'), # Where it can find its module dynamic libraries '-m', module_path, # Don't background @@ -184,10 +177,12 @@ class Lighttpd: env = os.environ if sys.platform in ('cygwin', 'win32'): env['PATH'] = '%s;%s' % ( - PathFromBase('third_party', 'cygwin', 'bin'), env['PATH']) + path_utils.PathFromBase('third_party', 'cygwin', 'bin'), + env['PATH']) if sys.platform == 'win32' and self._register_cygwin: - setup_mount = PathFromBase('third_party', 'cygwin', 'setup_mount.bat') + setup_mount = path_utils.PathFromBase('third_party', 'cygwin', + 'setup_mount.bat') subprocess.Popen(setup_mount).wait() logging.info('Starting http server') @@ -240,8 +235,7 @@ class Lighttpd: return logging.info('Shutting down http server') - platform_util = platform_utils.PlatformUtility('') - platform_util.ShutDownHTTPServer(self._process) + path_utils.ShutDownHTTPServer(self._process) if self._process: self._process.wait() diff --git a/webkit/tools/layout_tests/layout_package/path_utils.py b/webkit/tools/layout_tests/layout_package/path_utils.py index 9d05d18..43db161 100644 --- a/webkit/tools/layout_tests/layout_package/path_utils.py +++ b/webkit/tools/layout_tests/layout_package/path_utils.py @@ -1,176 +1,53 @@ -# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +# 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. -"""Some utility methods for getting paths used by run_webkit_tests.py. -""" +"""This package contains utility methods for manipulating paths and +filenames for test results and baselines. It also contains wrappers +of a few routines in platform_utils.py so that platform_utils.py can +be considered a 'protected' package - i.e., this file should be +the only file that ever includes platform_utils. This leads to +us including a few things that don't really have anything to do + with paths, unfortunately.""" import errno import os import platform_utils -import subprocess -import sys - -import google.path_utils +# Cache some values so we don't have to recalculate them. _basedir is +# used by PathFromBase() and caches the full (native) path to the top +# of the source tree (/src). _baseline_search_path is used by +# ExpectedBaseline() and caches the list of native paths to search +# for baseline results. +_basedir = None +_baseline_search_path = None class PathNotFound(Exception): pass -# Save some paths here so we don't keep re-evaling. -_webkit_root = None -_layout_data_dir = None -_layout_tests_dir = None -# A map from platform description to directory list. -_platform_results_dirs = {} - -# An instance of the PlatformUtility for use by methods mapped from there. -_platform_util = None - -# TODO this should probably be moved into path_utils as ToUnixPath(). -def WinPathToUnix(path): - """Convert a windows path to use unix-style path separators (a/b/c).""" - return path.replace('\\', '/') +def LayoutTestsDir(path=None): + """Returns the fully-qualified path to the directory containing the input + data for the specified layout test. -def WebKitRoot(): - """Returns the full path to the directory containing webkit.gyp. Raises - PathNotFound if we're unable to find webkit.gyp.""" - global _webkit_root - if _webkit_root: - return _webkit_root - webkit_gyp_path = google.path_utils.FindUpward(google.path_utils.ScriptDir(), - 'webkit.gyp') - _webkit_root = os.path.dirname(webkit_gyp_path) - return _webkit_root - -def LayoutDataDir(): - """Gets the full path to the tests directory. Raises PathNotFound if - we're unable to find it.""" - global _layout_data_dir - if _layout_data_dir: - return _layout_data_dir - _layout_data_dir = google.path_utils.FindUpward(WebKitRoot(), 'webkit', - 'data', 'layout_tests') - return _layout_data_dir - -def LayoutTestsDir(path = None): - """Returns the full path to the directory containing layout tests, based on - the supplied relative or absolute path to a layout tests. If the path contains - "LayoutTests" directory, locates this directory, assuming it's either in - in webkit/data/layout_tests or in third_party/WebKit.""" - - if path != None and path.find('LayoutTests') == -1: - return LayoutDataDir() - - global _layout_tests_dir - if _layout_tests_dir: - return _layout_tests_dir - - webkit_dir = google.path_utils.FindUpward( - google.path_utils.ScriptDir(), 'third_party', 'WebKit') - - if os.path.exists(os.path.join(webkit_dir, 'LayoutTests')): - _layout_tests_dir = webkit_dir + We have not fully upstreamed all of our layout tests, so we need to + potentially return two different places.""" + if path and path.find('LayoutTests') == -1: + return PathFromBase('webkit', 'data', 'layout_tests') else: - _layout_tests_dir = LayoutDataDir() + return PathFromBase('third_party', 'WebKit'); - return _layout_tests_dir +def ChromiumBaselinePath(platform): + """Returns the full path to the directory containing expected + baseline results from chromium ports.""" + return PathFromBase('webkit', 'data', 'layout_tests', 'platform', platform) -def ChromiumPlatformResultsEnclosingDir(): - """Returns the full path to the directory containing Chromium platform - result directories. - """ - # TODO(pamg): Once we move platform/chromium-* into LayoutTests/platform/, - # remove this and use PlatformResultsEnclosingDir() for everything. - return os.path.join(LayoutDataDir(), 'platform') - -def WebKitPlatformResultsEnclosingDir(): - """Gets the full path to just above the platform results directory.""" - return os.path.join(LayoutTestsDir(), 'LayoutTests', 'platform') - -def PlatformResultsEnclosingDir(platform): - """Gets the path to just above the results directory for this platform.""" - if platform.startswith('chromium'): - return ChromiumPlatformResultsEnclosingDir() - return WebKitPlatformResultsEnclosingDir() - -def GetPlatformDirs(platform): - """Returns a list of directories to look in for test results. - - The result will be sought in the chromium-specific platform directories, - in the corresponding WebKit platform directories, in the WebKit platform/mac/ - directory, and finally next to the test file. - - Suppose that the |platform| is 'chromium-win-xp'. In that case, the - following directories are searched in order, if they exist, and the first - match is returned: - LayoutTests/platform/chromium-win-xp/ - LayoutTests/platform/chromium-win/ - LayoutTests/platform/chromium/ - LayoutTests/platform/win-xp/ - LayoutTests/platform/win/ - LayoutTests/platform/mac/ - the directory in which the test itself is located - - If the |platform| is 'chromium-mac-leopard', the sequence will be as follows: - LayoutTests/platform/chromium-mac-leopard/ - LayoutTests/platform/chromium-mac/ - LayoutTests/platform/chromium/ - LayoutTests/platform/mac-leopard/ - LayoutTests/platform/mac/ - the directory in which the test itself is located - - A platform may optionally fall back to the Windows results if its own - results are not found, by returning True from its platform-specific - platform_utils.IsNonWindowsPlatformTargettingWindowsResults(). Supposing - that Linux does so, the search sequence for the |platform| 'chromium-linux' - will be - LayoutTests/platform/chromium-linux/ - LayoutTests/platform/chromium/ - LayoutTests/platform/linux/ - LayoutTests/platform/chromium-win/ - LayoutTests/platform/win/ - LayoutTests/platform/mac/ - the directory in which the test itself is located +def WebKitBaselinePath(platform): + """Returns the full path to the directory containing expected + baseline results from WebKit ports.""" + return PathFromBase('third_party', 'WebKit', 'LayoutTests', + 'platform', platform) - Args: - platform: a hyphen-separated list of platform descriptors from least to - most specific, matching the WebKit format, that will be used to find - the platform/ directories to look in. For example, 'chromium-win' or - 'chromium-mac-leopard'. - Returns: - a list of directories to search - """ - # Use the cached directory list if we have one. - global _platform_results_dirs - platform_dirs = _platform_results_dirs.get(platform, []) - if len(platform_dirs) == 0: - # Build the list of platform directories: chromium-foo-bar, chromium-foo, - # chromium. - segments = platform.split('-') - for length in range(len(segments), 0, -1): - platform_dirs.append('-'.join(segments[:length])) - - # Append corresponding WebKit platform directories too. - if platform.startswith('chromium-'): - for length in range(len(segments), 1, -1): - platform_dirs.append('-'.join(segments[1:length])) - - if platform_utils.IsNonWindowsPlatformTargettingWindowsResults(): - if platform.startswith('chromium'): - platform_dirs.append('chromium-win') - platform_dirs.append('win') - - # Finally, append platform/mac/ to all searches. - if 'mac' not in platform_dirs: - platform_dirs.append('mac') - - platform_dirs = [os.path.join(PlatformResultsEnclosingDir(x), x) - for x in platform_dirs] - _platform_results_dirs[platform] = platform_dirs - - return platform_dirs - -def ExpectedBaseline(filename, suffix, platform): + +def ExpectedBaseline(filename, suffix): """Given a test name, finds where the baseline result is located. The result is returned as a pair of values, the absolute path to top of the test results directory, and the relative path from there to the results file. @@ -185,16 +62,13 @@ def ExpectedBaseline(filename, suffix, platform): filename: absolute filename to test file suffix: file suffix of the expected results, including dot; e.g. '.txt' or '.png'. This should not be None, but may be an empty string. - platform: the most-specific directory name to use to build the - search list of directories, e.g., 'chromium-win', or - 'chromium-mac-leopard' (we follow the WebKit format) Returns - platform_dir - abs path to the top of the results tree (or test tree), - or None if the file doesn't exist. + platform_dir - abs path to the top of the results tree (or test tree) results_filename - relative path from top of tree to the results file (os.path.join of the two gives you the full path to the file, unless None was returned.) """ + global _baseline_search_path testname = os.path.splitext(RelativeTestFilename(filename))[0] # While we still have tests in LayoutTests/, chrome/, and pending/, we need @@ -203,8 +77,9 @@ def ExpectedBaseline(filename, suffix, platform): platform_filename = testname + '-expected' + suffix testdir, base_filename = platform_filename.split('/', 1) - platform_dirs = GetPlatformDirs(platform) - for platform_dir in platform_dirs: + if _baseline_search_path is None: + _baseline_search_path = platform_utils.BaselineSearchPath() + for platform_dir in _baseline_search_path: # TODO(pamg): Clean this up once we upstream everything in chrome/ and # pending/. if os.path.basename(platform_dir).startswith('chromium'): @@ -221,7 +96,7 @@ def ExpectedBaseline(filename, suffix, platform): return platform_dir, platform_filename return None, platform_filename -def ExpectedFilename(filename, suffix, platform): +def ExpectedFilename(filename, suffix): """Given a test name, returns an absolute path to its expected results. If no expected results are found in any of the searched directories, the @@ -237,86 +112,128 @@ def ExpectedFilename(filename, suffix, platform): search list of directories, e.g., 'chromium-win', or 'chromium-mac-leopard' (we follow the WebKit format) """ - (platform_dir, platform_filename) = ExpectedBaseline(filename, suffix, - platform) + platform_dir, platform_filename = ExpectedBaseline(filename, suffix) if platform_dir: return os.path.join(platform_dir, platform_filename) return os.path.join(LayoutTestsDir(filename), platform_filename) -def ImageDiffBinaryPath(target): - """Gets the full path to the image_diff binary for the target build - configuration. Raises PathNotFound if the file doesn't exist""" - platform_util = platform_utils.PlatformUtility('') - full_path = os.path.join(WebKitRoot(), target, - platform_util.ImageDiffBinary()) - if not os.path.exists(full_path): - # try output directory from either Xcode or chrome.sln - full_path = platform_util.ImageDiffBinaryPath(target) - if not os.path.exists(full_path): - raise PathNotFound('unable to find image_diff at %s' % full_path) - return full_path - -def TestShellBinaryPath(target): - """Gets the full path to the test_shell binary for the target build - configuration. Raises PathNotFound if the file doesn't exist""" - platform_util = platform_utils.PlatformUtility('') - full_path = os.path.join(WebKitRoot(), target, - platform_util.TestShellBinary()) - if not os.path.exists(full_path): - # try output directory from either Xcode or chrome.sln - full_path = platform_util.TestShellBinaryPath(target) - if not os.path.exists(full_path): - raise PathNotFound('unable to find test_shell at %s' % full_path) - return full_path - -def LayoutTestHelperBinaryPath(target): - """Gets the full path to the layout test helper binary for the target build - configuration, if it is needed, or an empty string if it isn't. - - Raises PathNotFound if it is needed and the file doesn't exist""" - platform_util = platform_utils.PlatformUtility('') - if len(platform_util.LayoutTestHelperBinary()): - full_path = os.path.join(WebKitRoot(), target, - platform_util.LayoutTestHelperBinary()) - if not os.path.exists(full_path): - # try output directory from either Xcode or chrome.sln - full_path = platform_util.LayoutTestHelperBinaryPath(target) - if len(full_path) and not os.path.exists(full_path): - raise PathNotFound('unable to find layout_test_helper at %s' % - full_path) - return full_path - else: - return '' - def RelativeTestFilename(filename): """Provide the filename of the test relative to the layout data directory as a unix style path (a/b/c).""" - return WinPathToUnix(filename[len(LayoutTestsDir(filename)) + 1:]) - -def GetPlatformUtil(): - """Returns a singleton instance of the PlatformUtility.""" - global _platform_util - if not _platform_util: - # Avoid circular import by delaying it. - import layout_package.platform_utils - _platform_util = ( - layout_package.platform_utils.PlatformUtility(WebKitRoot())) - return _platform_util - -# Map platform specific path utility functions. We do this as a convenience -# so importing path_utils will get all path related functions even if they are -# platform specific. -def GetAbsolutePath(path): - return GetPlatformUtil().GetAbsolutePath(path) - -def FilenameToUri(path): - return GetPlatformUtil().FilenameToUri(path) + return _WinPathToUnix(filename[len(LayoutTestsDir(filename)) + 1:]) -def TestListPlatformDir(): - return GetPlatformUtil().TestListPlatformDir() +def _WinPathToUnix(path): + """Convert a windows path to use unix-style path separators (a/b/c).""" + return path.replace('\\', '/') -def PlatformDir(): - return GetPlatformUtil().PlatformDir() +# +# Routines that are arguably platform-specific but have been made +# generic for now (they used to be in platform_utils_*) +# +def FilenameToUri(full_path): + """Convert a test file to a URI.""" + LAYOUTTEST_HTTP_DIR = "LayoutTests/http/tests/" + PENDING_HTTP_DIR = "pending/http/tests/" + + relative_path = _WinPathToUnix(RelativeTestFilename(full_path)) + port = None + use_ssl = False + + # LayoutTests/http/tests/ run off port 8000 and ssl/ off 8443 + if relative_path.startswith(LAYOUTTEST_HTTP_DIR): + relative_path = relative_path[len(LAYOUTTEST_HTTP_DIR):] + port = 8000 + # pending/http/tests/ run off port 9000 and ssl/ off 9443 + elif relative_path.startswith(PENDING_HTTP_DIR): + relative_path = relative_path[len(PENDING_HTTP_DIR):] + port = 9000 + # chrome/http/tests run off of port 8081 with the full path + elif relative_path.find("/http/") >= 0: + port = 8081 + + if port: + if relative_path.startswith("ssl/"): + port += 443 + protocol = "https" + else: + protocol = "http" + return "%s://127.0.0.1:%u/%s" % (protocol, port, relative_path) + else: + return "file:///" + GetAbsolutePath(full_path) -def PlatformNewResultsDir(): - return GetPlatformUtil().PlatformNewResultsDir() +def GetAbsolutePath(path): + """Returns an absolute UNIX path.""" + return _WinPathToUnix(os.path.abspath(path)) + +def MaybeMakeDirectory(*path): + """Creates the specified directory if it doesn't already exist.""" + # This is a reimplementation of google.path_utils.MaybeMakeDirectory(). + try: + os.makedirs(os.path.join(*path)) + except OSError, e: + if e.errno != errno.EEXIST: + raise + +def PathFromBase(*comps): + """Returns an absolute filename from a set of components specified + relative to the top of the source tree. If the path does not exist, + the exception PathNotFound is raised.""" + # This is a reimplementation of google.path_utils.PathFromBase(). + global _basedir + if _basedir == None: + # We compute the top of the source tree by finding the absolute + # path of this source file, and then climbing up three directories + # as given in subpath. If we move this file, subpath needs to be updated. + path = os.path.abspath(__file__) + subpath = os.path.join('webkit','tools','layout_tests') + _basedir = path[:path.index(subpath)] + path = os.path.join(_basedir, *comps) + if not os.path.exists(path): + raise PathNotFound('could not find %s' % (path)) + return path + + +# +# Wrappers around platform_utils +# + +def PlatformName(platform=None): + """Returns the appropriate chromium platform name for |platform|. If + |platform| is None, returns the name of the chromium platform on the + currently running system. If |platform| is of the form 'chromium-*', + it is returned unchanged, otherwise 'chromium-' is prepended.""" + if platform == None: + return platform_utils.PlatformName() + if not platform.startswith('chromium-'): + platform = "chromium-" + platform + return platform + +def PlatformVersion(): + return platform_utils.PlatformVersion() + +def LigHTTPdExecutablePath(): + return platform_utils.LigHTTPdExecutablePath() + +def LigHTTPdModulePath(): + return platform_utils.LigHTTPdModulePath() + +def LigHTTPdPHPPath(): + return platform_utils.LigHTTPdPHPPath() + +def WDiffPath(): + return platform_utils.WDiffPath() + +def TestShellPath(target): + return platform_utils.TestShellPath(target) + +def ImageDiffPath(target): + return platform_utils.ImageDiffPath(target) + +def LayoutTestHelperPath(target): + return platform_utils.LayoutTestHelperPath(target) + +def FuzzyMatchPath(): + return platform_utils.FuzzyMatchPath() + +def ShutDownHTTPServer(server_process): + return platform_utils.ShutDownHTTPServer(server_process) diff --git a/webkit/tools/layout_tests/layout_package/platform_utils.py b/webkit/tools/layout_tests/layout_package/platform_utils.py index bd12455..2b6755b 100644 --- a/webkit/tools/layout_tests/layout_package/platform_utils.py +++ b/webkit/tools/layout_tests/layout_package/platform_utils.py @@ -1,4 +1,4 @@ -# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +# 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. @@ -8,6 +8,8 @@ Any functions whose implementations or values differ from one platform to another should be defined in their respective platform_utils_<platform>.py modules. The appropriate one of those will be imported into this module to provide callers with a common, platform-independent interface. + +This file should only ever be imported by layout_package.path_utils. """ import sys diff --git a/webkit/tools/layout_tests/layout_package/platform_utils_linux.py b/webkit/tools/layout_tests/layout_package/platform_utils_linux.py index c68b87d..61267f8 100644 --- a/webkit/tools/layout_tests/layout_package/platform_utils_linux.py +++ b/webkit/tools/layout_tests/layout_package/platform_utils_linux.py @@ -1,239 +1,138 @@ -# Copyright (c) 2008 The Chromium Authors. All rights reserved. +# Copyright (c) 2008-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. -"""Platform-specific utility methods shared by several scripts.""" +"""This is the Linux implementation of the layout_package.platform_utils + package. This file should only be imported by that package.""" import os -import re import signal import subprocess import sys import logging -import google.path_utils - -# Distinguish the path_utils.py in this dir from google.path_utils. -import path_utils as layout_package_path_utils - -# This will be a native path to the directory this file resides in. -# It can either be relative or absolute depending how it's executed. -THISDIR = os.path.dirname(os.path.abspath(__file__)) -def PathFromBase(*pathies): - return google.path_utils.FindUpward(THISDIR, *pathies) +import path_utils + +def PlatformName(): + """Returns the name of the platform we're currently running on.""" + return 'chromium-linux' + PlatformVersion() + +def PlatformVersion(): + """Returns the version string for the platform, e.g. '-vista' or + '-snowleopard'. If the platform does not distinguish between + minor versions, it returns ''.""" + return '' + +def BaselineSearchPath(): + """Returns the list of directories to search for baselines/results, in + order of preference. Paths are relative to the top of the source tree.""" + return [path_utils.ChromiumBaselinePath(PlatformName()), + path_utils.ChromiumBaselinePath('chromium-win'), + path_utils.WebKitBaselinePath('win'), + path_utils.WebKitBaselinePath('mac')] + +def LigHTTPdExecutablePath(): + """Returns the executable path to start LigHTTPd""" + binpath = "/usr/sbin/lighttpd" + if os.path.exists(binpath): + return binpath + print "Unable to find LigHTTPd executable %s" % binpath + _MissingLigHTTPd() + +def LigHTTPdModulePath(): + """Returns the library module path for LigHTTPd""" + modpath = "/usr/lib/lighttpd" + if os.path.exists(modpath): + return modpath + print "Unable to find LigHTTPd modules %s" % modpath + _MissingLigHTTPd() + +def LigHTTPdPHPPath(): + """Returns the PHP executable path for LigHTTPd""" + binpath = "/usr/bin/php-cgi" + if os.path.exists(binpath): + return binpath + print "Unable to find PHP CGI executable %s" % binpath + _MissingLigHTTPd() + +def WDiffPath(): + """Path to the WDiff executable, which we assume is already installed and + in the user's $PATH. + """ + return 'wdiff' + +def ImageDiffPath(target): + """Path to the image_diff binary. + + Args: + target: Build target mode (debug or release)""" + return _PathFromBuildResults(target, 'image_diff') + +def LayoutTestHelperPath(target): + """Path to the layout_test helper binary, if needed, empty otherwise""" + return '' + +def TestShellPath(target): + """Return the platform-specific binary path for our TestShell. + + Args: + target: Build target mode (debug or release) """ + if target in ('Debug', 'Release'): + try: + debug_path = _PathFromBuildResults('Debug', 'test_shell') + release_path = _PathFromBuildResults('Release', 'test_shell') + + debug_mtime = os.stat(debug_path).st_mtime + release_mtime = os.stat(release_path).st_mtime + + if debug_mtime > release_mtime and target == 'Release' or \ + release_mtime > debug_mtime and target == 'Debug': + logging.info('\x1b[31mWarning: you are not running the most ' + \ + 'recent test_shell binary. You need to pass ' + \ + '--debug or not to select between Debug and ' + \ + 'Release.\x1b[0m') + # This will fail if we don't have both a debug and release binary. + # That's fine because, in this case, we must already be running the + # most up-to-date one. + except path_utils.PathNotFound: + pass -def PathFromBuildResults(*pathies): + return _PathFromBuildResults(target, 'test_shell') + +def FuzzyMatchPath(): + """Return the path to the fuzzy matcher binary.""" + return path_utils.PathFromBase('third_party', 'fuzzymatch', 'fuzzymatch') + +def ShutDownHTTPServer(server_process): + """Shut down the lighttpd web server. Blocks until it's fully shut down. + + Args: + server_process: The subprocess object representing the running server + """ + # server_process is not set when "http_server.py stop" is run manually. + if server_process is None: + # TODO(mmoss) This isn't ideal, since it could conflict with lighttpd + # processes not started by http_server.py, but good enough for now. + subprocess.call(['killall', '-u', os.getenv('USER'), '-TERM', 'lighttpd']) + else: + os.kill(server_process.pid, signal.SIGTERM) + +# +# Private helper functions +# + +def _MissingLigHTTPd(): + print 'Please install using: "sudo apt-get install lighttpd php5-cgi"' + print 'For complete Linux build requirements, please see:' + print 'http://code.google.com/p/chromium/wiki/LinuxBuildInstructions' + sys.exit(1) + +def _PathFromBuildResults(*pathies): # FIXME(dkegel): use latest or warn if more than one found? for dir in ["sconsbuild", "out", "xcodebuild"]: try: - return google.path_utils.FindUpward(THISDIR, dir, *pathies) + return path_utils.PathFromBase(dir, *pathies) except: pass - raise google.path_utils.PathNotFound("Unable to find %s under any ancestor of %s" % (os.path.join(*pathies), THISDIR)) - -def IsNonWindowsPlatformTargettingWindowsResults(): - """Returns true iff this platform is targetting Windows baseline, but isn't - Windows. By default, in path_utils.py:ExpectedFilename, we expect platforms to - be targetting Mac.""" - return True - -def GetTestListPlatformName(): - """Returns the name we use to identify the platform in the layout test - test list files.""" - return "LINUX" - -class PlatformUtility(object): - def __init__(self, base_dir): - """Args: - base_dir: a directory above which third_party/cygwin can be found, - used to locate the cygpath executable for path conversions. - """ - LAYOUTTEST_HTTP_DIR = "LayoutTests/http/tests/" - PENDING_HTTP_DIR = "pending/http/tests/" - - def GetAbsolutePath(self, path, force=False): - """Returns an absolute UNIX path.""" - return os.path.abspath(path) - - # TODO(mmoss): would be great to get rid of the duplication with - # platform_utils_win/mac.py for the next two functions, but inheritance - # from tools/python/google on the Windows side makes that a bit difficult. - - def _FilenameToUri(self, path, use_http=False, use_ssl=False, port=8000): - """Convert a Windows style path to a URI. - - Args: - path: For an http URI, the path relative to the httpd server's - DocumentRoot; for a file URI, the full path to the file. - use_http: if True, returns a URI of the form http://127.0.0.1:8000/. - If False, returns a file:/// URI. - use_ssl: if True, returns HTTPS URL (https://127.0.0.1:8000/). - This parameter is ignored if use_http=False. - port: The port number to append when returning an HTTP URI - """ - if use_http: - protocol = 'http' - if use_ssl: - protocol = 'https' - path = path.replace("\\", "/") - return "%s://127.0.0.1:%s/%s" % (protocol, str(port), path) - return "file:///" + self.GetAbsolutePath(path) - - def FilenameToUri(self, full_path): - relative_path = layout_package_path_utils.RelativeTestFilename(full_path) - port = None - use_ssl = False - - # LayoutTests/http/tests/ run off port 8000 and ssl/ off 8443 - if relative_path.startswith(self.LAYOUTTEST_HTTP_DIR): - relative_path = relative_path[len(self.LAYOUTTEST_HTTP_DIR):] - port = 8000 - # pending/http/tests/ run off port 9000 and ssl/ off 9443 - elif relative_path.startswith(self.PENDING_HTTP_DIR): - relative_path = relative_path[len(self.PENDING_HTTP_DIR):] - port = 9000 - # chrome/http/tests run off of port 8081 with the full path - elif relative_path.find("/http/") >= 0: - print relative_path - port = 8081 - - # We want to run off of the http server - if port: - if relative_path.startswith("ssl/"): - port += 443 - use_ssl = True - return PlatformUtility._FilenameToUri(self, - relative_path, - use_http=True, - use_ssl=use_ssl, - port=port) - - # Run off file:// - return PlatformUtility._FilenameToUri(self, full_path, use_http=False, - use_ssl=False, port=0) - - def KillAllTestShells(self): - """Kills all instances of the test_shell binary currently running.""" - subprocess.Popen(('killall', '-TERM', self.TestShellBinary()), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE).wait() - - def MissingLigHTTPd(self): - print 'Please install using: "sudo apt-get install lighttpd php5-cgi"' - print 'For complete Linux build requirements, please see:' - print 'http://code.google.com/p/chromium/wiki/LinuxBuildInstructions' - sys.exit(1) - - def LigHTTPdExecutablePath(self): - """Returns the executable path to start LigHTTPd""" - binpath = "/usr/sbin/lighttpd" - if os.path.exists(binpath): - return binpath - print "Unable to find LigHTTPd executable %s" % binpath - self.MissingLigHTTPd() - - def LigHTTPdModulePath(self): - """Returns the library module path for LigHTTPd""" - modpath = "/usr/lib/lighttpd" - if os.path.exists(modpath): - return modpath - print "Unable to find LigHTTPd modules %s" % modpath - self.MissingLigHTTPd() - - def LigHTTPdPHPPath(self): - """Returns the PHP executable path for LigHTTPd""" - binpath = "/usr/bin/php-cgi" - if os.path.exists(binpath): - return binpath - print "Unable to find PHP CGI executable %s" % binpath - self.MissingLigHTTPd() - - def ShutDownHTTPServer(self, server_process): - """Shut down the lighttpd web server. Blocks until it's fully shut down. - - Args: - server_process: The subprocess object representing the running server - """ - # server_process is not set when "http_server.py stop" is run manually. - if server_process is None: - # TODO(mmoss) This isn't ideal, since it could conflict with lighttpd - # processes not started by http_server.py, but good enough for now. - subprocess.call(['killall', '-u', os.getenv('USER'), '-TERM', 'lighttpd']) - else: - os.kill(server_process.pid, signal.SIGTERM) - - def WDiffExecutablePath(self): - """Path to the WDiff executable, which we assume is already installed and - in the user's $PATH. - """ - return 'wdiff' - - def ImageDiffBinary(self): - return 'image_diff' - - def ImageDiffBinaryPath(self, target): - """Path to the image_diff binary.""" - return PathFromBuildResults(target, self.ImageDiffBinary()) - - def LayoutTestHelperBinary(self): - """Path to the layout_test helper binary, if needed, empty otherwise""" - return '' - - def LayoutTestHelperBinaryPath(self, target): - """Path to the layout_test helper binary, if needed, empty otherwise""" - return '' - - def TestShellBinary(self): - """The name of the binary for TestShell.""" - return 'test_shell' - - def TestShellBinaryPath(self, target): - """Return the platform-specific binary path for our TestShell. - - Args: - target: Build target mode (debug or release) - """ - - if target in ('Debug', 'Release'): - try: - debug_path = PathFromBuildResults('Debug', self.TestShellBinary()) - release_path = PathFromBuildResults('Release', \ - self.TestShellBinary()) - - debug_mtime = os.stat(debug_path).st_mtime - release_mtime = os.stat(release_path).st_mtime - - if debug_mtime > release_mtime and target == 'Release' or \ - release_mtime > debug_mtime and target == 'Debug': - logging.info('\x1b[31mWarning: you are not running the most ' + \ - 'recent test_shell binary. You need to pass ' + \ - '--debug or not to select between Debug and ' + \ - 'Release.\x1b[0m') - # This will fail if we don't have both a debug and release binary. - # That's fine because, in this case, we must already be running the - # most up-to-date one. - except OSError: - pass - except google.path_utils.PathNotFound: - pass - - return PathFromBuildResults(target, self.TestShellBinary()) - - def FuzzyMatchBinaryPath(self): - """Return the path to the fuzzy matcher binary.""" - return PathFromBase('third_party', 'fuzzymatch', 'fuzzymatch') - - def TestListPlatformDir(self): - """Return the platform-specific directory for where the test lists live""" - return 'linux' - - def PlatformDir(self): - """Returns the most specific directory name where platform-specific - results live. - """ - return 'chromium-linux' - - def PlatformNewResultsDir(self): - """Returns the directory name in which to output newly baselined tests. - """ - return self.PlatformDir() + raise path_utils.PathNotFound("Unable to find %s in build tree" % + (os.path.join(*pathies))) diff --git a/webkit/tools/layout_tests/layout_package/platform_utils_mac.py b/webkit/tools/layout_tests/layout_package/platform_utils_mac.py index 4b6c832..5c3eb3d 100644 --- a/webkit/tools/layout_tests/layout_package/platform_utils_mac.py +++ b/webkit/tools/layout_tests/layout_package/platform_utils_mac.py @@ -1,208 +1,97 @@ -# Copyright (c) 2008 The Chromium Authors. All rights reserved. +# Copyright (c) 2008-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. -"""Platform-specific utility methods shared by several scripts.""" +"""This is the Mac implementation of the layout_package.platform_utils + package. This file should only be imported by that package.""" import os import platform -import re import signal import subprocess -import sys -import google.path_utils +import path_utils -# Distinguish the path_utils.py in this dir from google.path_utils. -import path_utils as layout_package_path_utils +def PlatformName(): + """Returns the name of the platform we're currently running on.""" + # At the moment all chromium mac results are version-independent. At some + # point we may need to return 'chromium-mac' + PlatformVersion() + return 'chromium-mac' -# This will be a native path to the directory this file resides in. -# It can either be relative or absolute depending how it's executed. -THISDIR = os.path.dirname(os.path.abspath(__file__)) -def PathFromBase(*pathies): - return google.path_utils.FindUpward(THISDIR, *pathies) - -def IsNonWindowsPlatformTargettingWindowsResults(): - """Returns true iff this platform is targetting Windows baseline, but isn't - Windows. By default, in path_utils.py:ExpectedFilename, we expect platforms to - be targetting Mac.""" - return False - -def GetTestListPlatformName(): - """Returns the name we use to identify the platform in the layout test - test list files.""" - return "MAC" - -def _HumanReadableSystemVersionName(): - """ Returns the name of this OS X system version, or an empty string if this - is an unknown OS version. - - Note: Chrome doesn't support Tiger, so the minimum version returned is - Leopard (10.5). - """ +def PlatformVersion(): + """Returns the version string for the platform, e.g. '-vista' or + '-snowleopard'. If the platform does not distinguish between + minor versions, it returns ''.""" os_version_string = platform.mac_ver()[0] # e.g. "10.5.6" release_version = int(os_version_string.split('.')[1]) + + # we don't support 'tiger' or earlier releases if release_version == 5: - return 'leopard' + return '-leopard' elif release_version == 6: - return 'snowleopard' - else: - return '' + return '-snowleopard' + return '' -class PlatformUtility(object): - def __init__(self, base_dir): - """Args: - base_dir: a directory above which third_party/cygwin can be found, - used to locate the cygpath executable for path conversions. - """ - self._cygwin_root = None - self._base_dir = base_dir +def BaselineSearchPath(): + """Returns the list of directories to search for baselines/results, in + order of preference. Paths are relative to the top of the source tree.""" + return [path_utils.ChromiumBaselinePath(PlatformName()), + path_utils.WebKitBaselinePath('mac' + PlatformVersion()), + path_utils.WebKitBaselinePath('mac')] - LAYOUTTEST_HTTP_DIR = "LayoutTests/http/tests/" - PENDING_HTTP_DIR = "pending/http/tests/" +def WDiffPath(): + """Path to the WDiff executable, which we assume is already installed and + in the user's $PATH.""" + return 'wdiff' - def GetAbsolutePath(self, path, force=False): - """Returns an absolute UNIX path.""" - return os.path.abspath(path) +def ImageDiffPath(target): + """Path to the image_diff executable - # TODO(pinkerton): would be great to get rid of the duplication with - # platform_utils_win.py for the next two functions, but the inheritance - # from tools/python/google on the windows side makes that a bit difficult. + Args: + target: build type - 'Debug','Release',etc.""" + return path_utils.PathFromBase('xcodebuild', target, 'image_diff') - def _FilenameToUri(self, path, use_http=False, use_ssl=False, port=8000): - """Convert a Windows style path to a URI. +def LayoutTestHelperPath(target): + """Path to the layout_test_helper executable, if needed, empty otherwise - Args: - path: For an http URI, the path relative to the httpd server's - DocumentRoot; for a file URI, the full path to the file. - use_http: if True, returns a URI of the form http://127.0.0.1:8000/. - If False, returns a file:/// URI. - use_ssl: if True, returns HTTPS URL (https://127.0.0.1:8000/). - This parameter is ignored if use_http=False. - port: The port number to append when returning an HTTP URI - """ - if use_http: - protocol = 'http' - if use_ssl: - protocol = 'https' - path = path.replace("\\", "/") - return "%s://127.0.0.1:%s/%s" % (protocol, str(port), path) - return "file:///" + self.GetAbsolutePath(path) - - def FilenameToUri(self, full_path): - relative_path = layout_package_path_utils.RelativeTestFilename(full_path) - port = None - use_ssl = False - - # LayoutTests/http/tests/ run off port 8000 and ssl/ off 8443 - if relative_path.startswith(self.LAYOUTTEST_HTTP_DIR): - relative_path = relative_path[len(self.LAYOUTTEST_HTTP_DIR):] - port = 8000 - # pending/http/tests/ run off port 9000 and ssl/ off 9443 - elif relative_path.startswith(self.PENDING_HTTP_DIR): - relative_path = relative_path[len(self.PENDING_HTTP_DIR):] - port = 9000 - # chrome/http/tests run off of port 8081 with the full path - elif relative_path.find("/http/") >= 0: - print relative_path - port = 8081 - - # We want to run off of the http server - if port: - if relative_path.startswith("ssl/"): - port += 443 - use_ssl = True - return PlatformUtility._FilenameToUri(self, - relative_path, - use_http=True, - use_ssl=use_ssl, - port=port) - - # Run off file:// - return PlatformUtility._FilenameToUri(self, full_path, use_http=False, - use_ssl=False, port=0) - - def LigHTTPdExecutablePath(self): - """Returns the executable path to start LigHTTPd""" - return PathFromBase('third_party', 'lighttpd', 'mac', 'bin', 'lighttpd') - - def LigHTTPdModulePath(self): - """Returns the library module path for LigHTTPd""" - return PathFromBase('third_party', 'lighttpd', 'mac', 'lib') - - def LigHTTPdPHPPath(self): - """Returns the PHP executable path for LigHTTPd""" - return PathFromBase('third_party', 'lighttpd', 'mac', 'bin', 'php-cgi') - - def ShutDownHTTPServer(self, server_process): - """Shut down the lighttpd web server. Blocks until it's fully shut down. + Args: + target: build type - 'Debug','Release',etc.""" + return path_utils.PathFromBase('xcodebuild', target, 'layout_test_helper') - Args: - server_process: The subprocess object representing the running server - """ - # server_process is not set when "http_server.py stop" is run manually. - if server_process is None: - # TODO(mmoss) This isn't ideal, since it could conflict with lighttpd - # processes not started by http_server.py, but good enough for now. - subprocess.call(['killall', '-u', os.getenv('USER'), '-TERM', 'lighttpd']) - else: - os.kill(server_process.pid, signal.SIGTERM) - - def WDiffExecutablePath(self): - """Path to the WDiff executable, which we assume is already installed and - in the user's $PATH. - """ - return 'wdiff' - - def ImageDiffBinary(self): - """The name of the binary for image_diff.""" - return 'image_diff' - - def ImageDiffBinaryPath(self, target): - """Return the platform-specific binary path for our image compare util. +def TestShellPath(target): + """Path to the test_shell executable. - Args: - target: Build target mode (debug or release) - """ - return PathFromBase('xcodebuild', target, self.ImageDiffBinary()) + Args: + target: build type - 'Debug','Release',etc.""" + # TODO(pinkerton): make |target| happy with case-sensitive file systems. + return path_utils.PathFromBase('xcodebuild', target, 'TestShell.app', + 'Contents', 'MacOS','TestShell') - def LayoutTestHelperBinary(self): - """name of the layout_test helper binary, if needed, empty otherwise""" - return 'layout_test_helper' +def LigHTTPdExecutablePath(): + """Returns the executable path to start LigHTTPd""" + return path_utils.PathFromBase('third_party', 'lighttpd', 'mac', + 'bin', 'lighttpd') - def LayoutTestHelperBinaryPath(self, target): - """Path to the layout_test helper binary, if needed, empty otherwise""" - return PathFromBase('xcodebuild', target, self.LayoutTestHelperBinary()) +def LigHTTPdModulePath(): + """Returns the library module path for LigHTTPd""" + return path_utils.PathFromBase('third_party', 'lighttpd', 'mac', 'lib') - def TestShellBinary(self): - """The name of the binary for TestShell.""" - return 'TestShell' +def LigHTTPdPHPPath(): + """Returns the PHP executable path for LigHTTPd""" + return path_utils.PathFromBase('third_party', 'lighttpd', 'mac', 'bin', + 'php-cgi') - def TestShellBinaryPath(self, target): - """Return the platform-specific binary path for our TestShell. +def ShutDownHTTPServer(server_process): + """Shut down the lighttpd web server. Blocks until it's fully shut down. Args: - target: Build target mode (debug or release) - """ - # TODO(pinkerton): make |target| happy with case-sensitive file systems. - return PathFromBase('xcodebuild', target, 'TestShell.app', - 'Contents', 'MacOS', self.TestShellBinary()) - - def TestListPlatformDir(self): - """Return the platform-specific directory for where the test lists live.""" - return 'mac' - - def PlatformDir(self): - """Returns the most specific directory name where platform-specific - results live. - """ - platform_dir = 'chromium-mac' - os_name = _HumanReadableSystemVersionName() - if len(os_name) > 0: - platform_dir += "-" + os_name - return platform_dir - - def PlatformNewResultsDir(self): - """Returns the directory name in which to output newly baselined tests. - """ - return 'chromium-mac' + server_process: The subprocess object representing the running server + """ + # server_process is not set when "http_server.py stop" is run manually. + if server_process is None: + # TODO(mmoss) This isn't ideal, since it could conflict with lighttpd + # processes not started by http_server.py, but good enough for now. + subprocess.call(['killall', '-u', os.getenv('USER'), '-TERM', 'lighttpd']) + else: + os.kill(server_process.pid, signal.SIGTERM) + diff --git a/webkit/tools/layout_tests/layout_package/platform_utils_win.py b/webkit/tools/layout_tests/layout_package/platform_utils_win.py index 9075854..bac4cee 100644 --- a/webkit/tools/layout_tests/layout_package/platform_utils_win.py +++ b/webkit/tools/layout_tests/layout_package/platform_utils_win.py @@ -1,249 +1,108 @@ -# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +# 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. -"""Platform specific utility methods. This file contains methods that are -specific to running the layout tests on windows. +"""This is the Linux implementation of the layout_package.platform_utils + package. This file should only be imported by that package.""" -This file constitutes a complete wrapper for google.platform_utils_win, -implementing or mapping all needed functions from there. Layout-test scripts -should be able to import only this file (via platform_utils.py), with no need -to fall back to the base functions. -""" - -import os -import re +import path_utils import subprocess import sys -import google.httpd_utils -import google.path_utils -import google.platform_utils_win - -# Distinguish the path_utils.py in this dir from google.path_utils. -import path_utils as layout_package_path_utils - -# This will be a native path to the directory this file resides in. -# It can either be relative or absolute depending how it's executed. -THISDIR = os.path.dirname(os.path.abspath(__file__)) -def PathFromBase(*pathies): - return google.path_utils.FindUpward(THISDIR, *pathies) - -def IsNonWindowsPlatformTargettingWindowsResults(): - """Returns true iff this platform is targetting Windows baseline, but isn't - Windows. By default, in path_utils.py:ExpectedFilename, we expect platforms to - be targetting Mac.""" - return False - -def GetTestListPlatformName(): - """Returns the name we use to identify the platform in the layout test - test list files.""" - #winver = sys.getwindowsversion() - #if winver[0] == 6 and winver[1] == 0: - # return "WIN-VISTA" - #elif winver[0] == 5 and (winver[1] == 1 or winver[1] == 2): - # return "WIN-XP" - #default to returning 'WIN' if it's an unsupported version - return "WIN" - -class PlatformUtility(google.platform_utils_win.PlatformUtility): - """Overrides base PlatformUtility methods as needed for layout tests.""" - - LAYOUTTEST_HTTP_DIR = "LayoutTests/http/tests/" - PENDING_HTTP_DIR = "pending/http/tests/" - - def FilenameToUri(self, full_path): - relative_path = layout_package_path_utils.RelativeTestFilename(full_path) - port = None - use_ssl = False - - # LayoutTests/http/tests/ run off port 8000 and ssl/ off 8443 - if relative_path.startswith(self.LAYOUTTEST_HTTP_DIR): - relative_path = relative_path[len(self.LAYOUTTEST_HTTP_DIR):] - port = 8000 - # pending/http/tests/ run off port 9000 and ssl/ off 9443 - elif relative_path.startswith(self.PENDING_HTTP_DIR): - relative_path = relative_path[len(self.PENDING_HTTP_DIR):] - port = 9000 - # chrome/http/tests run off of port 8081 with the full path - elif relative_path.find("/http/") >= 0: - print relative_path - port = 8081 - - # We want to run off of the http server - if port: - if relative_path.startswith("ssl/"): - port += 443 - use_ssl = True - return google.platform_utils_win.PlatformUtility.FilenameToUri(self, - relative_path, - use_http=True, - use_ssl=use_ssl, - port=port) - - # Run off file:// - return google.platform_utils_win.PlatformUtility.FilenameToUri( - self, full_path) - - def KillAllTestShells(self): - """Kills all instances of the test_shell binary currently running.""" - subprocess.Popen(['taskkill.exe', '/f', '/im', self.TestShellBinary()], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE).wait() - - def _GetVirtualHostConfig(self, document_root, port, ssl=False): - """Returns a <VirtualHost> directive block for an httpd.conf file. It will - listen to 127.0.0.1 on each of the given port. - """ - cygwin_document_root = google.platform_utils_win.GetCygwinPath( - document_root) - - return '\n'.join(('<VirtualHost 127.0.0.1:%s>' % port, - 'DocumentRoot %s' % cygwin_document_root, - ssl and 'SSLEngine On' or '', - '</VirtualHost>', '')) - - def GetStartHttpdCommand(self, output_dir, apache2=False): - """Prepares the config file and output directory to start an httpd server. - Returns a list of strings containing the server's command line+args. - - Creates the test output directory and generates an httpd.conf (or - httpd2.conf for Apache 2 if apache2 is True) file in it that contains - the necessary <VirtualHost> directives for running all the http tests. - - WebKit http tests expect the DocumentRoot to be in LayoutTests/http/tests/, - but that prevents us from running http tests in chrome/ or pending/. So we - run two virtual hosts, one on ports 8000 and 8080 for WebKit, and one on - port 8081 with a much broader DocumentRoot for everything else. (Note that - WebKit http tests that have been modified and are temporarily in pending/ - will still fail, if they expect the DocumentRoot to be located as described - above.) - - Args: - output_dir: the path to the test output directory. It will be created. - apache2: boolean if true will cause this function to return start - command for Apache 2.x instead of Apache 1.3.x - """ - layout_dir = google.platform_utils_win.GetCygwinPath( - layout_package_path_utils.LayoutTestsDir()) - main_document_root = os.path.join(layout_dir, "LayoutTests", - "http", "tests") - pending_document_root = os.path.join(layout_dir, "pending", - "http", "tests") - chrome_document_root = layout_dir - apache_config_dir = google.httpd_utils.ApacheConfigDir(self._base_dir) - mime_types_path = os.path.join(apache_config_dir, "mime.types") - - conf_file_name = "httpd.conf" - if apache2: - conf_file_name = "httpd2.conf" - # Make the test output directory and place the generated httpd.conf in it. - orig_httpd_conf_path = os.path.join(apache_config_dir, conf_file_name) - - httpd_conf_path = os.path.join(output_dir, conf_file_name) - google.path_utils.MaybeMakeDirectory(output_dir) - httpd_conf = open(orig_httpd_conf_path).read() - httpd_conf = (httpd_conf + - self._GetVirtualHostConfig(main_document_root, 8000) + - self._GetVirtualHostConfig(main_document_root, 8080) + - self._GetVirtualHostConfig(pending_document_root, 9000) + - self._GetVirtualHostConfig(pending_document_root, 9080) + - self._GetVirtualHostConfig(chrome_document_root, 8081)) - if apache2: - httpd_conf += self._GetVirtualHostConfig(main_document_root, 8443, - ssl=True) - httpd_conf += self._GetVirtualHostConfig(pending_document_root, 9443, - ssl=True) - f = open(httpd_conf_path, 'wb') - f.write(httpd_conf) - f.close() - - return google.platform_utils_win.PlatformUtility.GetStartHttpdCommand( - self, - output_dir, - httpd_conf_path, - mime_types_path, - apache2=apache2) - - def LigHTTPdExecutablePath(self): - """Returns the executable path to start LigHTTPd""" - return PathFromBase('third_party', 'lighttpd', 'win', 'LightTPD.exe') - - def LigHTTPdModulePath(self): - """Returns the library module path for LigHTTPd""" - return PathFromBase('third_party', 'lighttpd', 'win', 'lib') - - def LigHTTPdPHPPath(self): - """Returns the PHP executable path for LigHTTPd""" - return PathFromBase('third_party', 'lighttpd', 'win', 'php5', 'php-cgi.exe') - - def ShutDownHTTPServer(self, server_process): - """Shut down the lighttpd web server. Blocks until it's fully shut down. - - Args: - server_process: The subprocess object representing the running server. - Unused in this implementation of the method. - """ - subprocess.Popen(('taskkill.exe', '/f', '/im', 'LightTPD.exe'), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE).wait() - - def WDiffExecutablePath(self): - """Path to the WDiff executable, whose binary is checked in on Win""" - return PathFromBase('third_party', 'cygwin', 'bin', 'wdiff.exe') - - def ImageDiffBinary(self): - return 'image_diff.exe' - - def ImageDiffBinaryPath(self, target): - """Return the platform-specific binary path for the image compare util. - We use this if we can't find the binary in the default location - in path_utils. - - Args: - target: Build target mode (debug or release) - """ - return PathFromBase('chrome', target, self.ImageDiffBinary()) - - def LayoutTestHelperBinary(self): - """name of the layout test helper binary, if needed, empty otherwise""" - return 'layout_test_helper.exe' - - def LayoutTestHelperBinaryPath(self, target): - """Return the platform-specific binary path for the layout test helper. - We use this if we can't find the binary in the default location - in path_utils. - - Args: - target: Build target mode (debug or release) - """ - return PathFromBase('chrome', target, self.LayoutTestHelperBinary()) - - def TestShellBinary(self): - """The name of the binary for TestShell.""" - return 'test_shell.exe' - - def TestShellBinaryPath(self, target): - """Return the platform-specific binary path for our TestShell. +def PlatformName(): + """Returns the name of the platform we're currently running on.""" + # We're not ready for version-specific results yet. When we uncomment + # this, we also need to add it to the BaselineSearchPath() + # return 'chromium-win' + PlatformVersion() + return 'chromium-win' + +def PlatformVersion(): + """Returns the version string for the platform, e.g. '-vista' or + '-snowleopard'. If the platform does not distinguish between + minor versions, it returns ''.""" + winver = sys.getwindowsversion() + if winver[0] == 6 and winver[1] == 0: + return '-vista' + elif winver[0] == 5 and (winver[1] == 1 or winver[1] == 2): + return '-xp' + return '' + +def BaselineSearchPath(): + """Returns the list of directories to search for baselines/results, in + order of preference. Paths are relative to the top of the source tree.""" + return [path_utils.ChromiumBaselinePath('chromium-win'), + path_utils.WebKitBaselinePath('win'), + path_utils.WebKitBaselinePath('mac')] + +def WDiffPath(): + """Path to the WDiff executable, whose binary is checked in on Win""" + return path_utils.PathFromBase('third_party', 'cygwin', 'bin', 'wdiff.exe') + +def ImageDiffPath(target): + """Return the platform-specific binary path for the image compare util. We use this if we can't find the binary in the default location in path_utils. - Args: - target: Build target mode (debug or release) - """ - return PathFromBase('chrome', target, self.TestShellBinary()) - - def TestListPlatformDir(self): - """Return the platform-specific directory for where the test lists live.""" - return GetTestListPlatformName().lower() - - def PlatformDir(self): - """Returns the most specific directory name where platform-specific - results live. - """ - return 'chromium-' + GetTestListPlatformName().lower() - - def PlatformNewResultsDir(self): - """Returns the directory name in which to output newly baselined tests. - """ - return self.PlatformDir() + Args: + target: Build target mode (debug or release) + """ + return _FindBinary(target, 'image_diff.exe') + +def LayoutTestHelperPath(target): + """Return the platform-specific binary path for the layout test helper. + We use this if we can't find the binary in the default location + in path_utils. + + Args: + target: Build target mode (debug or release) + """ + return _FindBinary(target, 'layout_test_helper.exe') + +def TestShellPath(target): + """Return the platform-specific binary path for our TestShell. + We use this if we can't find the binary in the default location + in path_utils. + + Args: + target: Build target mode (debug or release) + """ + return _FindBinary(target, 'test_shell.exe') + +def LigHTTPdExecutablePath(): + """Returns the executable path to start LigHTTPd""" + return path_utils.PathFromBase('third_party', 'lighttpd', 'win', + 'LightTPD.exe') + +def LigHTTPdModulePath(): + """Returns the library module path for LigHTTPd""" + return path_utils.PathFromBase('third_party', 'lighttpd', 'win', 'lib') + +def LigHTTPdPHPPath(): + """Returns the PHP executable path for LigHTTPd""" + return path_utils.PathFromBase('third_party', 'lighttpd', 'win', 'php5', + 'php-cgi.exe') + +def ShutDownHTTPServer(server_process): + """Shut down the lighttpd web server. Blocks until it's fully shut down. + + Args: + server_process: The subprocess object representing the running server. + Unused in this implementation of the method. + """ + subprocess.Popen(('taskkill.exe', '/f', '/im', 'LightTPD.exe'), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE).wait() + +# +# Private helper functions. +# + +def _FindBinary(target, binary): + """On Windows, we look for binaries that we compile in potentially + two places: src/webkit/$target (preferably, which we get if we + built using webkit.gyp), or src/chrome/$target (if compiled some other + way).""" + try: + return path_utils.PathFromBase('webkit', target, binary) + except path_utils.PathNotFound: + return path_utils.PathFromBase('chrome', target, binary) diff --git a/webkit/tools/layout_tests/layout_package/test_expectations.py b/webkit/tools/layout_tests/layout_package/test_expectations.py index fa12894..f6831fb 100644 --- a/webkit/tools/layout_tests/layout_package/test_expectations.py +++ b/webkit/tools/layout_tests/layout_package/test_expectations.py @@ -1,4 +1,4 @@ -# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +# 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. @@ -223,7 +223,9 @@ class TestExpectationsFile: self._full_test_list = full_test_list self._errors = [] self._non_fatal_errors = [] - self._platform = platform + self._platform = self.ToTestPlatformName(platform) + if self._platform is None: + raise Exception("Unknown platform '%s'" % (platform)) self._is_debug_mode = is_debug_mode # Maps relative test paths as listed in the expectations file to a list of @@ -249,6 +251,17 @@ class TestExpectationsFile: self._Read(path) + def ToTestPlatformName(self, name): + """Returns the test expectation platform that will be used for a + given platform name, or None if there is no match.""" + chromium_prefix = 'chromium-' + name = name.lower() + if name.startswith(chromium_prefix): + name = name[len(chromium_prefix):] + if name in self.PLATFORMS: + return name + return None + def GetTestSet(self, modifier, expectation=None, include_skips=True): if expectation is None: tests = self._modifier_to_tests[modifier] diff --git a/webkit/tools/layout_tests/layout_package/test_failures.py b/webkit/tools/layout_tests/layout_package/test_failures.py index 3433fc2..831aa3d 100644 --- a/webkit/tools/layout_tests/layout_package/test_failures.py +++ b/webkit/tools/layout_tests/layout_package/test_failures.py @@ -1,11 +1,9 @@ -# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +# 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 path_utils - class FailureSort(object): """A repository for failure sort orders and tool to facilitate sorting.""" diff --git a/webkit/tools/layout_tests/layout_package/test_shell_thread.py b/webkit/tools/layout_tests/layout_package/test_shell_thread.py index a368137..13e5d1a 100644 --- a/webkit/tools/layout_tests/layout_package/test_shell_thread.py +++ b/webkit/tools/layout_tests/layout_package/test_shell_thread.py @@ -1,4 +1,4 @@ -# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +# 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. @@ -22,7 +22,6 @@ import threading import time import path_utils -import platform_utils import test_failures def ProcessOutput(proc, test_info, test_types, test_args, target): @@ -333,9 +332,7 @@ class TestShellThread(threading.Thread): # introducing spurious crashes. We accept that tradeoff in order to # avoid losing the rest of this thread's results. logging.error('Test thread hung: killing all test_shells') - # PlatformUtility() wants a base_dir, but it doesn't matter here. - platform_util = platform_utils.PlatformUtility('') - platform_util.KillAllTestShells() + path_utils.KillAllTestShells() try: stats = worker.GetTestStats() diff --git a/webkit/tools/layout_tests/rebaseline.py b/webkit/tools/layout_tests/rebaseline.py index 2261933..f49c072 100644 --- a/webkit/tools/layout_tests/rebaseline.py +++ b/webkit/tools/layout_tests/rebaseline.py @@ -30,12 +30,7 @@ import urllib import webbrowser import zipfile -import google.path_utils - from layout_package import path_utils -from layout_package import platform_utils_linux -from layout_package import platform_utils_mac -from layout_package import platform_utils_win from layout_package import test_expectations BASELINE_SUFFIXES = ['.txt', '.png', '.checksum'] @@ -294,18 +289,6 @@ class Rebaseliner(object): logging.info('Archive downloaded and saved to file: "%s"', fn) return fn - def _GetPlatformNewResultsDir(self): - """Get the dir name to extract new baselines for the given platform.""" - - if self._platform == 'win': - return platform_utils_win.PlatformUtility(None).PlatformNewResultsDir() - elif self._platform == 'mac': - return platform_utils_mac.PlatformUtility(None).PlatformNewResultsDir() - elif self._platform == 'linux': - return platform_utils_linux.PlatformUtility(None).PlatformNewResultsDir() - - return None - def _ExtractAndAddNewBaselines(self, archive_file): """Extract new baselines from archive and add them to SVN repository. @@ -324,13 +307,8 @@ class Rebaseliner(object): for name in zip_namelist: logging.debug(' ' + name) - platform_dir = self._GetPlatformNewResultsDir() - if not platform_dir: - logging.error('Invalid platform new results dir, platform: "%s"', - self._platform) - return None - - logging.debug('Platform new results dir: "%s"', platform_dir) + platform = path_utils.PlatformName(self._platform) + logging.debug('Platform dir: "%s"', platform) test_no = 1 self._rebaselined_tests = [] @@ -354,16 +332,14 @@ class Rebaseliner(object): expected_filename = '%s-expected%s' % (test_basename, suffix) expected_fullpath = os.path.join( - path_utils.ChromiumPlatformResultsEnclosingDir(), - platform_dir, - expected_filename) + path_utils.ChromiumBaselinePath(platform), expected_filename) expected_fullpath = os.path.normpath(expected_fullpath) logging.debug(' Expected file full path: "%s"', expected_fullpath) data = zip_file.read(archive_test_name) # Create the new baseline directory if it doesn't already exist. - google.path_utils.MaybeMakeDirectory(os.path.dirname(expected_fullpath)) + path_utils.MaybeMakeDirectory(os.path.dirname(expected_fullpath)) f = open(expected_fullpath, 'wb') f.write(data) @@ -788,6 +764,11 @@ def main(): logging.error('Invalid "platforms" option. --platforms must be specified ' 'in order to rebaseline.') sys.exit(1) + platforms = [p.strip().lower() for p in options.platforms.split(',')] + for platform in platforms: + if not TestExpectationsFile.ToTestPlatformName(platform): + logging.error('Invalid platform platform: "%s"' % (platform)) + sys.exit(1) if not options.no_html_results: options.html_directory = SetupHtmlDirectory(options.html_directory, @@ -795,7 +776,6 @@ def main(): rebaselining_tests = set() backup = options.backup - platforms = [p.strip().lower() for p in options.platforms.split(',')] for platform in platforms: rebaseliner = Rebaseliner(platform, options) diff --git a/webkit/tools/layout_tests/run_webkit_tests.py b/webkit/tools/layout_tests/run_webkit_tests.py index 807467e..c157ac9 100755 --- a/webkit/tools/layout_tests/run_webkit_tests.py +++ b/webkit/tools/layout_tests/run_webkit_tests.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +# 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. @@ -35,14 +35,11 @@ import sys import time import traceback -import google.path_utils - from layout_package import compare_failures from layout_package import test_expectations from layout_package import http_server from layout_package import json_results_generator from layout_package import path_utils -from layout_package import platform_utils from layout_package import test_failures from layout_package import test_shell_thread from test_types import fuzzy_image_diff @@ -53,19 +50,16 @@ from test_types import simplified_text_diff class TestInfo: """Groups information about a test for easy passing of data.""" - def __init__(self, filename, timeout, platform): + def __init__(self, filename, timeout): """Generates the URI and stores the filename and timeout for this test. Args: filename: Full path to the test. timeout: Timeout for running the test in TestShell. - platform: The platform whose test expected results to grab. """ self.filename = filename self.uri = path_utils.FilenameToUri(filename) self.timeout = timeout - expected_hash_file = path_utils.ExpectedFilename(filename, - '.checksum', - platform) + expected_hash_file = path_utils.ExpectedFilename(filename, '.checksum') try: self.image_hash = open(expected_hash_file, "r").read() except IOError, e: @@ -94,17 +88,14 @@ class TestRunner: # test_shell.exe. DEFAULT_TEST_TIMEOUT_MS = 10 * 1000 - def __init__(self, options, paths, platform_new_results_dir): + def __init__(self, options, paths): """Collect a list of files to test. Args: options: a dictionary of command line options paths: a list of paths to crawl looking for test files - platform_new_results_dir: name of leaf directory to put rebaselined files - in. """ self._options = options - self._platform_new_results_dir = platform_new_results_dir self._http_server = http_server.Lighttpd(options.results_directory) # a list of TestType objects @@ -117,14 +108,13 @@ class TestRunner: if options.lint_test_files: # Creating the expecations for each platform/target pair does all the - # test list parsing and ensures it's correct syntax(e.g. no dupes). + # test list parsing and ensures it's correct syntax (e.g. no dupes). for platform in test_expectations.TestExpectationsFile.PLATFORMS: self._ParseExpectations(platform, is_debug_mode=True) self._ParseExpectations(platform, is_debug_mode=False) else: self._GatherTestFiles(paths) - self._expectations = self._ParseExpectations( - platform_utils.GetTestListPlatformName().lower(), + self._expectations = self._ParseExpectations(options.platform, options.target == 'Debug') self._PrepareListsAndPrintOutput() @@ -286,8 +276,7 @@ class TestRunner: # update expectations so that the stats are calculated correctly self._expectations = self._ParseExpectations( - platform_utils.GetTestListPlatformName().lower(), - options.target == 'Debug') + path_utils.PlatformName(), options.target == 'Debug') else: logging.info('Run: %d tests' % len(self._test_files)) @@ -377,8 +366,7 @@ class TestRunner: else: timeout = self._options.time_out_ms - tests_by_dir[directory].append(TestInfo(test_file, timeout, - self._options.platform)) + tests_by_dir[directory].append(TestInfo(test_file, timeout)) # Sort by the number of tests in the dir so that the ones with the most # tests get run first in order to maximize parallelization. Number of tests @@ -460,8 +448,7 @@ class TestRunner: test_types = [] for t in self._test_types: test_types.append(t(self._options.platform, - self._options.results_directory, - self._platform_new_results_dir)) + self._options.results_directory)) test_args, shell_args = self._GetTestShellArgs(i) thread = test_shell_thread.TestShellThread(filename_queue, @@ -495,12 +482,12 @@ class TestRunner: if not self._test_files: return 0 start_time = time.time() - test_shell_binary = path_utils.TestShellBinaryPath(self._options.target) + test_shell_binary = path_utils.TestShellPath(self._options.target) # Start up any helper needed layout_test_helper_proc = None if not options.no_pixel_tests: - helper_path = path_utils.LayoutTestHelperBinaryPath(self._options.target) + helper_path = path_utils.LayoutTestHelperPath(self._options.target) if len(helper_path): logging.info("Starting layout helper %s" % helper_path) layout_test_helper_proc = subprocess.Popen([helper_path], @@ -523,7 +510,7 @@ class TestRunner: logging.info("Starting tests") # Create the output directory if it doesn't already exist. - google.path_utils.MaybeMakeDirectory(self._options.results_directory) + path_utils.MaybeMakeDirectory(self._options.results_directory) threads = self._InstantiateTestShellThreads(test_shell_binary) @@ -941,7 +928,7 @@ class TestRunner: """Launches the test shell open to the results.html page.""" results_filename = os.path.join(self._options.results_directory, "results.html") - subprocess.Popen([path_utils.TestShellBinaryPath(self._options.target), + subprocess.Popen([path_utils.TestShellPath(self._options.target), path_utils.FilenameToUri(results_filename)]) @@ -980,25 +967,18 @@ def main(options, args): options.target = "Release" if options.results_directory.startswith("/"): - # Assume it's an absolute path and normalize + # Assume it's an absolute path and normalize. options.results_directory = path_utils.GetAbsolutePath( options.results_directory) else: # If it's a relative path, make the output directory relative to Debug or # Release. - basedir = path_utils.WebKitRoot() - basedir = os.path.join(basedir, options.target) - + basedir = path_utils.PathFromBase('webkit') options.results_directory = path_utils.GetAbsolutePath( - os.path.join(basedir, options.results_directory)) + os.path.join(basedir, options.target, options.results_directory)) - if options.platform is None: - options.platform = path_utils.PlatformDir() - platform_new_results_dir = path_utils.PlatformNewResultsDir() - else: - # If the user specified a platform on the command line then use - # that as the name of the output directory for rebaselined files. - platform_new_results_dir = options.platform + # Ensure platform is valid and force it to the form 'chromium-<platform>'. + options.platform = path_utils.PlatformName(options.platform) if not options.num_test_shells: cpus = 1 @@ -1036,7 +1016,7 @@ def main(options, args): if options.test_list: paths += ReadTestFiles(options.test_list) - test_runner = TestRunner(options, paths, platform_new_results_dir) + test_runner = TestRunner(options, paths) if options.lint_test_files: # Just creating the TestRunner checks the syntax of the test lists. @@ -1049,18 +1029,18 @@ def main(options, args): print("html,txt,checksum,png"); for t in test_runner._test_files: (expected_txt_dir, expected_txt_file) = path_utils.ExpectedBaseline( - t, '.txt', options.platform) + t, '.txt') (expected_png_dir, expected_png_file) = path_utils.ExpectedBaseline( - t, '.png', options.platform) + t, '.png') (expected_checksum_dir, expected_checksum_file) = path_utils.ExpectedBaseline( - t, '.checksum', options.platform) + t, '.checksum') print("%s,%s,%s,%s" % (path_utils.RelativeTestFilename(t), expected_txt_dir, expected_checksum_dir, expected_png_dir)) return try: - test_shell_binary_path = path_utils.TestShellBinaryPath(options.target) + test_shell_binary_path = path_utils.TestShellPath(options.target) except path_utils.PathNotFound: print "\nERROR: test_shell is not found. Be sure that you have built it" print "and that you are using the correct build. This script will run the" @@ -1071,8 +1051,7 @@ def main(options, args): logging.info("Placing test results in %s" % options.results_directory) if options.new_baseline: logging.info("Placing new baselines in %s" % - os.path.join(path_utils.PlatformResultsEnclosingDir(options.platform), - platform_new_results_dir)) + path_utils.ChromiumBaselinePath()) logging.info("Using %s build at %s" % (options.target, test_shell_binary_path)) if not options.no_pixel_tests: diff --git a/webkit/tools/layout_tests/test_types/fuzzy_image_diff.py b/webkit/tools/layout_tests/test_types/fuzzy_image_diff.py index 6a87e22..03633b3e 100644 --- a/webkit/tools/layout_tests/test_types/fuzzy_image_diff.py +++ b/webkit/tools/layout_tests/test_types/fuzzy_image_diff.py @@ -1,4 +1,4 @@ -# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +# 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. @@ -27,9 +27,7 @@ class FuzzyImageDiff(test_type_base.TestTypeBase): if test_args.hash is None: return failures - expected_png_file = path_utils.ExpectedFilename(filename, - '.png', - self._platform) + expected_png_file = path_utils.ExpectedFilename(filename, '.png') if test_args.show_sources: logging.debug('Using %s' % expected_png_file) @@ -39,7 +37,7 @@ class FuzzyImageDiff(test_type_base.TestTypeBase): failures.append(test_failures.FailureMissingImage(self)) # Run the fuzzymatcher - r = subprocess.call([path_utils.GetPlatformUtil().FuzzyMatchBinaryPath(), + r = subprocess.call([path_utils.FuzzyMatchPath(), test_args.png_path, expected_png_file]) if r != 0: failures.append(test_failures.FailureFuzzyFailure(self)) diff --git a/webkit/tools/layout_tests/test_types/image_diff.py b/webkit/tools/layout_tests/test_types/image_diff.py index 3f7fa74..d8f0a16 100644 --- a/webkit/tools/layout_tests/test_types/image_diff.py +++ b/webkit/tools/layout_tests/test_types/image_diff.py @@ -1,4 +1,4 @@ -# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +# 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. @@ -16,7 +16,6 @@ import shutil import subprocess from layout_package import path_utils -from layout_package import platform_utils from layout_package import test_failures from test_types import test_type_base @@ -77,7 +76,7 @@ class ImageDiff(test_type_base.TestTypeBase): cmd = '' try: - executable = path_utils.ImageDiffBinaryPath(target) + executable = path_utils.ImageDiffPath(target) cmd = [executable, '--diff', actual_filename, expected_filename, diff_filename] except Exception, e: @@ -122,13 +121,9 @@ class ImageDiff(test_type_base.TestTypeBase): return failures # Compare hashes. - expected_hash_file = path_utils.ExpectedFilename(filename, - '.checksum', - self._platform) + expected_hash_file = path_utils.ExpectedFilename(filename, '.checksum') - expected_png_file = path_utils.ExpectedFilename(filename, - '.png', - self._platform) + expected_png_file = path_utils.ExpectedFilename(filename, '.png') if test_args.show_sources: logging.debug('Using %s' % expected_png_file) diff --git a/webkit/tools/layout_tests/test_types/test_type_base.py b/webkit/tools/layout_tests/test_types/test_type_base.py index b51677e..c6355d5 100644 --- a/webkit/tools/layout_tests/test_types/test_type_base.py +++ b/webkit/tools/layout_tests/test_types/test_type_base.py @@ -13,11 +13,7 @@ import errno import os.path import subprocess - -import google.path_utils - from layout_package import path_utils -from layout_package import platform_utils class TestArguments(object): """Struct-like wrapper for additional arguments needed by specific tests.""" @@ -48,25 +44,22 @@ class TestTypeBase(object): FILENAME_SUFFIX_WDIFF = "-wdiff.html" FILENAME_SUFFIX_COMPARE = "-diff.png" - def __init__(self, platform, root_output_dir, platform_new_results_dir): + 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. - platform_new_results_dir: Name of the directory to put newly baselined - results in. """ self._root_output_dir = root_output_dir self._platform = platform - self._platform_new_results_dir = platform_new_results_dir 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)) - google.path_utils.MaybeMakeDirectory(os.path.split(output_filename)[0]) + path_utils.MaybeMakeDirectory(os.path.split(output_filename)[0]) def _SaveBaselineData(self, filename, data, modifier): """Saves a new baseline file into the platform directory. @@ -80,13 +73,12 @@ class TestTypeBase(object): 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.PlatformResultsEnclosingDir(self._platform), - self._platform_new_results_dir, + 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) - google.path_utils.MaybeMakeDirectory(output_dir) + path_utils.MaybeMakeDirectory(output_dir) open(os.path.join(output_dir, output_file), "wb").write(data) def OutputFilename(self, filename, modifier): @@ -180,8 +172,7 @@ class TestTypeBase(object): if wdiff: # Shell out to wdiff to get colored inline diffs. - platform_util = platform_utils.PlatformUtility('') - executable = platform_util.WDiffExecutablePath() + executable = path_utils.WDiffPath() cmd = [executable, '--start-delete=##WDIFF_DEL##', '--end-delete=##WDIFF_END##', '--start-insert=##WDIFF_ADD##', '--end-insert=##WDIFF_END##', diff --git a/webkit/tools/layout_tests/test_types/text_diff.py b/webkit/tools/layout_tests/test_types/text_diff.py index c1d1b70..576d03d 100644 --- a/webkit/tools/layout_tests/test_types/text_diff.py +++ b/webkit/tools/layout_tests/test_types/text_diff.py @@ -1,4 +1,4 @@ -# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +# 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. @@ -12,10 +12,7 @@ import errno import logging import os.path -import google.path_utils - from layout_package import path_utils -from layout_package import platform_utils from layout_package import test_failures from test_types import test_type_base @@ -36,8 +33,7 @@ class TestTextDiff(test_type_base.TestTypeBase): and normalize the text. Returns a string with the expected text, or '' if the expected output file was not found.""" # Read the platform-specific expected text. - expected_filename = path_utils.ExpectedFilename(filename, '.txt', - self._platform) + expected_filename = path_utils.ExpectedFilename(filename, '.txt') if show_sources: logging.debug('Using %s' % expected_filename) @@ -67,21 +63,19 @@ class TestTextDiff(test_type_base.TestTypeBase): self.FILENAME_SUFFIX_EXPECTED + modifier) if isRenderTreeDump(data): relative_dir = os.path.dirname(path_utils.RelativeTestFilename(filename)) - output_dir = os.path.join(path_utils.PlatformResultsEnclosingDir(self._platform), - self._platform_new_results_dir, + output_dir = os.path.join(path_utils.ChromiumBaselinePath(), relative_dir) - google.path_utils.MaybeMakeDirectory(output_dir) + path_utils.MaybeMakeDirectory(output_dir) open(os.path.join(output_dir, output_file), "wb").write(data) else: # If it's not a render tree, then the results can be shared between all # platforms. Copy the file into the chromium-win and chromium-mac dirs. relative_dir = os.path.dirname(path_utils.RelativeTestFilename(filename)) for platform in ('chromium-win', 'chromium-mac'): - output_dir = os.path.join(path_utils.PlatformResultsEnclosingDir(self._platform), - platform, + output_dir = os.path.join(path_utils.ChromiumBaselinePath(), relative_dir) - google.path_utils.MaybeMakeDirectory(output_dir) + path_utils.MaybeMakeDirectory(output_dir) open(os.path.join(output_dir, output_file), "wb").write(data) def CompareOutput(self, filename, proc, output, test_args, target): |