summaryrefslogtreecommitdiffstats
path: root/WebKitTools/Scripts/webkitpy/layout_tests/port
diff options
context:
space:
mode:
authorKristian Monsen <kristianm@google.com>2010-05-21 16:53:46 +0100
committerKristian Monsen <kristianm@google.com>2010-05-25 10:24:15 +0100
commit6c2af9490927c3c5959b5cb07461b646f8b32f6c (patch)
treef7111b9b22befab472616c1d50ec94eb50f1ec8c /WebKitTools/Scripts/webkitpy/layout_tests/port
parenta149172322a9067c14e8b474a53e63649aa17cad (diff)
downloadexternal_webkit-6c2af9490927c3c5959b5cb07461b646f8b32f6c.zip
external_webkit-6c2af9490927c3c5959b5cb07461b646f8b32f6c.tar.gz
external_webkit-6c2af9490927c3c5959b5cb07461b646f8b32f6c.tar.bz2
Merge WebKit at r59636: Initial merge by git
Change-Id: I59b289c4e6b18425f06ce41cc9d34c522515de91
Diffstat (limited to 'WebKitTools/Scripts/webkitpy/layout_tests/port')
-rw-r--r--WebKitTools/Scripts/webkitpy/layout_tests/port/base.py11
-rw-r--r--WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_linux.py7
-rw-r--r--WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_mac.py7
-rw-r--r--WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_win.py39
-rw-r--r--WebKitTools/Scripts/webkitpy/layout_tests/port/dryrun.py8
-rw-r--r--WebKitTools/Scripts/webkitpy/layout_tests/port/factory_unittest.py138
-rwxr-xr-xWebKitTools/Scripts/webkitpy/layout_tests/port/http_server.py18
-rw-r--r--WebKitTools/Scripts/webkitpy/layout_tests/port/mac.py12
-rw-r--r--WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py32
-rw-r--r--WebKitTools/Scripts/webkitpy/layout_tests/port/websocket_server.py25
-rw-r--r--WebKitTools/Scripts/webkitpy/layout_tests/port/win.py5
11 files changed, 232 insertions, 70 deletions
diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/base.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/base.py
index 25946af..a4cbe42 100644
--- a/WebKitTools/Scripts/webkitpy/layout_tests/port/base.py
+++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/base.py
@@ -414,10 +414,17 @@ class Port(object):
raise NotImplemented('Port.results_directory')
def setup_test_run(self):
- """This routine can be overridden to perform any port-specific
- work that shouuld be done at the beginning of a test run."""
+ """Perform port-specific work at the beginning of a test run."""
pass
+ def setup_environ_for_server(self):
+ """Perform port-specific work at the beginning of a server launch.
+
+ Returns:
+ Operating-system's environment.
+ """
+ return os.environ
+
def show_html_results_file(self, results_filename):
"""This routine should display the HTML file pointed at by
results_filename in a users' browser."""
diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_linux.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_linux.py
index a01bd14..979e225 100644
--- a/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_linux.py
+++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_linux.py
@@ -49,11 +49,8 @@ class ChromiumLinuxPort(chromium.ChromiumPort):
chromium.ChromiumPort.__init__(self, port_name, options)
def baseline_search_path(self):
- return [self._webkit_baseline_path('chromium-linux'),
- self._webkit_baseline_path('chromium-win'),
- self._webkit_baseline_path('chromium'),
- self._webkit_baseline_path('win'),
- self._webkit_baseline_path('mac')]
+ port_names = ["chromium-linux", "chromium-win", "chromium", "win", "mac"]
+ return map(self._webkit_baseline_path, port_names)
def check_build(self, needs_http):
result = chromium.ChromiumPort.check_build(self, needs_http)
diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_mac.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_mac.py
index 4ead26f..ba67a3e 100644
--- a/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_mac.py
+++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_mac.py
@@ -52,10 +52,8 @@ class ChromiumMacPort(chromium.ChromiumPort):
chromium.ChromiumPort.__init__(self, port_name, options)
def baseline_search_path(self):
- return [self._webkit_baseline_path('chromium-mac'),
- self._webkit_baseline_path('chromium'),
- self._webkit_baseline_path('mac' + self.version()),
- self._webkit_baseline_path('mac')]
+ port_names = ["chromium-mac", "chromium", "mac" + self.version(), "mac"]
+ return map(self._webkit_baseline_path, port_names)
def check_build(self, needs_http):
result = chromium.ChromiumPort.check_build(self, needs_http)
@@ -87,6 +85,7 @@ class ChromiumMacPort(chromium.ChromiumPort):
return 'mac'
def version(self):
+ # FIXME: It's strange that this string is -version, not just version.
os_version_string = platform.mac_ver()[0] # e.g. "10.5.6"
if not os_version_string:
return '-leopard'
diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_win.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_win.py
index 302af86..ad78e61 100644
--- a/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_win.py
+++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/chromium_win.py
@@ -43,22 +43,39 @@ class ChromiumWinPort(chromium.ChromiumPort):
def __init__(self, port_name=None, options=None):
if port_name is None:
- port_name = 'chromium-win' + self.version()
- if options and not hasattr(options, 'configuration'):
- options.configuration = 'Release'
+ port_name = "chromium-win" + self.version()
+ if options and not hasattr(options, "configuration"):
+ options.configuration = "Release"
chromium.ChromiumPort.__init__(self, port_name, options)
+ def setup_environ_for_server(self):
+ env = chromium.ChromiumPort.setup_environ_for_server(self)
+ # Put the cygwin directory first in the path to find cygwin1.dll.
+ env["PATH"] = "%s;%s" % (
+ self.path_from_chromium_base("third_party", "cygwin", "bin"),
+ env["PATH"])
+ # Configure the cygwin directory so that pywebsocket finds proper
+ # python executable to run cgi program.
+ env["CYGWIN_PATH"] = self.path_from_chromium_base(
+ "third_party", "cygwin", "bin")
+ if (sys.platform == "win32" and self._options and
+ hasattr(self._options, "register_cygwin") and
+ self._options.register_cygwin):
+ setup_mount = self.path_from_chromium_base("third_party",
+ "cygwin",
+ "setup_mount.bat")
+ self._executive.run_command(setup_mount)
+ return env
+
def baseline_search_path(self):
- dirs = []
+ port_names = []
if self._name == 'chromium-win-xp':
- dirs.append(self._webkit_baseline_path('chromium-win-xp'))
+ port_names.append("chromium-win-xp")
if self._name in ('chromium-win-xp', 'chromium-win-vista'):
- dirs.append(self._webkit_baseline_path('chromium-win-vista'))
- dirs.append(self._webkit_baseline_path('chromium-win'))
- dirs.append(self._webkit_baseline_path('chromium'))
- dirs.append(self._webkit_baseline_path('win'))
- dirs.append(self._webkit_baseline_path('mac'))
- return dirs
+ port_names.append("chromium-win-vista")
+ # FIXME: This may need to include mac-snowleopard like win.py.
+ port_names.extend(["chromium-win", "chromium", "win", "mac"])
+ return map(self._webkit_baseline_path, port_names)
def check_build(self, needs_http):
result = chromium.ChromiumPort.check_build(self, needs_http)
diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/dryrun.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/dryrun.py
index 2cbb1b9..2c92865 100644
--- a/WebKitTools/Scripts/webkitpy/layout_tests/port/dryrun.py
+++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/dryrun.py
@@ -46,6 +46,8 @@
from __future__ import with_statement
+import sys
+
import base
import factory
@@ -172,7 +174,11 @@ class DryrunDriver(base.Driver):
test = uri
if uri.startswith("file:///"):
- test = test.replace('file://', '')
+ if sys.platform == 'win32':
+ test = test.replace('file:///', '')
+ test = test.replace('/', '\\')
+ else:
+ test = test.replace('file://', '')
return test
elif uri.startswith("http://127.0.0.1:8880/"):
# websocket tests
diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/factory_unittest.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/factory_unittest.py
new file mode 100644
index 0000000..d8dffdf
--- /dev/null
+++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/factory_unittest.py
@@ -0,0 +1,138 @@
+# Copyright (C) 2010 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import sys
+import unittest
+
+import chromium_linux
+import chromium_mac
+import chromium_win
+import dryrun
+import factory
+import gtk
+import mac
+import qt
+import test
+import win
+
+
+class FactoryTest(unittest.TestCase):
+ """Test factory creates proper port object for the target.
+
+ Target is specified by port_name, sys.platform and options.
+
+ """
+ # FIXME: The ports themselves should expose what options they require,
+ # instead of passing generic "options".
+
+ class WebKitOptions(object):
+ """Represents the minimum options for WebKit port."""
+ def __init__(self):
+ self.pixel_tests = False
+
+ class ChromiumOptions(WebKitOptions):
+ """Represents minimum options for Chromium port."""
+ def __init__(self):
+ FactoryTest.WebKitOptions.__init__(self)
+ self.chromium = True
+
+ def setUp(self):
+ self.real_sys_platform = sys.platform
+ self.webkit_options = FactoryTest.WebKitOptions()
+ self.chromium_options = FactoryTest.ChromiumOptions()
+
+ def tearDown(self):
+ sys.platform = self.real_sys_platform
+
+ def assert_port(self, port_name, expected_port):
+ """Helper assert for port_name.
+
+ Args:
+ port_name: port name to get port object.
+ expected_port: class of expected port object.
+
+ """
+ self.assertTrue(isinstance(factory.get(port_name=port_name),
+ expected_port))
+
+ def assert_platform_port(self, platform, options, expected_port):
+ """Helper assert for platform and options.
+
+ Args:
+ platform: sys.platform.
+ options: options to get port object.
+ expected_port: class of expected port object.
+
+ """
+ orig_platform = sys.platform
+ sys.platform = platform
+ self.assertTrue(isinstance(factory.get(options=options),
+ expected_port))
+ sys.platform = orig_platform
+
+ def test_test(self):
+ self.assert_port("test", test.TestPort)
+
+ def test_dryrun(self):
+ self.assert_port("dryrun-test", dryrun.DryRunPort)
+ self.assert_port("dryrun-mac", dryrun.DryRunPort)
+
+ def test_mac(self):
+ self.assert_port("mac", mac.MacPort)
+ self.assert_platform_port("darwin", None, mac.MacPort)
+ self.assert_platform_port("darwin", self.webkit_options, mac.MacPort)
+
+ def test_win(self):
+ self.assert_port("win", win.WinPort)
+ self.assert_platform_port("win32", None, win.WinPort)
+ self.assert_platform_port("win32", self.webkit_options, win.WinPort)
+ self.assert_platform_port("cygwin", None, win.WinPort)
+ self.assert_platform_port("cygwin", self.webkit_options, win.WinPort)
+
+ def test_gtk(self):
+ self.assert_port("gtk", gtk.GtkPort)
+
+ def test_qt(self):
+ self.assert_port("qt", qt.QtPort)
+
+ def test_chromium_mac(self):
+ self.assert_port("chromium-mac", chromium_mac.ChromiumMacPort)
+ self.assert_platform_port("darwin", self.chromium_options,
+ chromium_mac.ChromiumMacPort)
+
+ def test_chromium_linux(self):
+ self.assert_port("chromium-linux", chromium_linux.ChromiumLinuxPort)
+ self.assert_platform_port("linux2", self.chromium_options,
+ chromium_linux.ChromiumLinuxPort)
+
+ def test_chromium_win(self):
+ self.assert_port("chromium-win", chromium_win.ChromiumWinPort)
+ self.assert_platform_port("win32", self.chromium_options,
+ chromium_win.ChromiumWinPort)
+ self.assert_platform_port("cygwin", self.chromium_options,
+ chromium_win.ChromiumWinPort)
diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/http_server.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/http_server.py
index fbe47e3..0f8a21e 100755
--- a/WebKitTools/Scripts/webkitpy/layout_tests/port/http_server.py
+++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/http_server.py
@@ -55,7 +55,7 @@ class HttpdNotStarted(Exception):
class Lighttpd(http_server_base.HttpServerBase):
def __init__(self, port_obj, output_dir, background=False, port=None,
- root=None, register_cygwin=None, run_background=None):
+ root=None, run_background=None):
"""Args:
output_dir: the absolute path to the layout test result directory
"""
@@ -65,7 +65,6 @@ class Lighttpd(http_server_base.HttpServerBase):
self._process = None
self._port = port
self._root = root
- self._register_cygwin = register_cygwin
self._run_background = run_background
if self._port:
self._port = int(self._port)
@@ -199,20 +198,7 @@ class Lighttpd(http_server_base.HttpServerBase):
shutil.copyfile(os.path.join(module_path, lib_file),
os.path.join(tmp_module_path, lib_file))
- # Put the cygwin directory first in the path to find cygwin1.dll
- env = os.environ
- if sys.platform in ('cygwin', 'win32'):
- env['PATH'] = '%s;%s' % (
- self._port_obj.path_from_chromium_base('third_party',
- 'cygwin', 'bin'),
- env['PATH'])
-
- if sys.platform == 'win32' and self._register_cygwin:
- setup_mount = self._port_obj.path_from_chromium_base('third_party',
- 'cygwin', 'setup_mount.bat')
- # FIXME: Should use Executive.run_command
- subprocess.Popen(setup_mount).wait()
-
+ env = self._port_obj.setup_environ_for_server()
_log.debug('Starting http server')
# FIXME: Should use Executive.run_command
self._process = subprocess.Popen(start_cmd, env=env)
diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/mac.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/mac.py
index 350b088..413b5f2 100644
--- a/WebKitTools/Scripts/webkitpy/layout_tests/port/mac.py
+++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/mac.py
@@ -58,15 +58,15 @@ class MacPort(WebKitPort):
return child_processes
def baseline_search_path(self):
- dirs = []
+ port_names = []
if self._name == 'mac-tiger':
- dirs.append(self._webkit_baseline_path(self._name))
+ port_names.append("mac-tiger")
if self._name in ('mac-tiger', 'mac-leopard'):
- dirs.append(self._webkit_baseline_path('mac-leopard'))
+ port_names.append("mac-leopard")
if self._name in ('mac-tiger', 'mac-leopard', 'mac-snowleopard'):
- dirs.append(self._webkit_baseline_path('mac-snowleopard'))
- dirs.append(self._webkit_baseline_path('mac'))
- return dirs
+ port_names.append("mac-snowleopard")
+ port_names.append("mac")
+ return map(self._webkit_baseline_path, port_names)
def path_to_test_expectations_file(self):
return self.path_from_webkit_base('LayoutTests', 'platform',
diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py
index ada83ce..2097ce7 100644
--- a/WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py
+++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/webkit.py
@@ -294,13 +294,33 @@ class WebKitPort(base.Port):
return self.test_base_platform_names() + (
'mac-tiger', 'mac-leopard', 'mac-snowleopard')
+ def _configuration_file_path(self):
+ build_root = self._webkit_build_directory(["--top-level"])
+ return os.path.join(build_root, "Configuration")
+
+ # Easy override for unit tests
+ def _open_configuration_file(self):
+ configuration_path = self._configuration_file_path()
+ return codecs.open(configuration_path, "r", "utf-8")
+
+ def _read_configuration(self):
+ try:
+ with self._open_configuration_file() as file:
+ return file.readline().rstrip()
+ except IOError, e:
+ return None
+
+ # FIXME: This list may be incomplete as Apple has some sekret configs.
+ _RECOGNIZED_CONFIGURATIONS = ("Debug", "Release")
+
def default_configuration(self):
- # This is a bit of a hack. This state exists in a much nicer form in
- # perl-land.
- configuration = ospath.relpath(
- self._webkit_build_directory(["--configuration"]),
- self._webkit_build_directory(["--top-level"]))
- assert(configuration == "Debug" or configuration == "Release")
+ # FIXME: Unify this with webkitdir.pm configuration reading code.
+ configuration = self._read_configuration()
+ if not configuration:
+ configuration = "Release"
+ if configuration not in self._RECOGNIZED_CONFIGURATIONS:
+ _log.warn("Configuration \"%s\" found in %s is not a recognized value.\n" % (configuration, self._configuration_file_path()))
+ _log.warn("Scripts may fail. See 'set-webkit-configuration --help'.")
return configuration
def _webkit_build_directory(self, args):
diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/websocket_server.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/websocket_server.py
index ad557bd..22ae780 100644
--- a/WebKitTools/Scripts/webkitpy/layout_tests/port/websocket_server.py
+++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/websocket_server.py
@@ -46,6 +46,8 @@ import factory
import http_server
from webkitpy.common.system.executive import Executive
+from webkitpy.thirdparty.autoinstalled.pywebsocket import mod_pywebsocket
+
_log = logging.getLogger("webkitpy.layout_tests.port.websocket_server")
@@ -95,15 +97,13 @@ class PyWebSocket(http_server.Lighttpd):
def __init__(self, port_obj, output_dir, port=_DEFAULT_WS_PORT,
root=None, use_tls=False,
- register_cygwin=True,
pidfile=None):
"""Args:
output_dir: the absolute path to the layout test result directory
"""
http_server.Lighttpd.__init__(self, port_obj, output_dir,
port=_DEFAULT_WS_PORT,
- root=root,
- register_cygwin=register_cygwin)
+ root=root)
self._output_dir = output_dir
self._process = None
self._port = port
@@ -159,7 +159,8 @@ class PyWebSocket(http_server.Lighttpd):
python_interp = sys.executable
pywebsocket_base = os.path.join(
os.path.dirname(os.path.dirname(os.path.dirname(
- os.path.abspath(__file__)))), 'thirdparty', 'pywebsocket')
+ os.path.abspath(__file__)))), 'thirdparty',
+ 'autoinstalled', 'pywebsocket')
pywebsocket_script = os.path.join(pywebsocket_base, 'mod_pywebsocket',
'standalone.py')
start_cmd = [
@@ -185,21 +186,7 @@ class PyWebSocket(http_server.Lighttpd):
start_cmd.extend(['-t', '-k', self._private_key,
'-c', self._certificate])
- # Put the cygwin directory first in the path to find cygwin1.dll
- env = os.environ
- if sys.platform in ('cygwin', 'win32'):
- env['PATH'] = '%s;%s' % (
- self._port_obj.path_from_chromium_base('third_party',
- 'cygwin', 'bin'),
- env['PATH'])
- env['CYGWIN_PATH'] = self._port_obj.path_from_chromium_base(
- 'third_party', 'cygwin', 'bin')
-
- if sys.platform == 'win32' and self._register_cygwin:
- setup_mount = self._port_obj.path_from_chromium_base(
- 'third_party', 'cygwin', 'setup_mount.bat')
- subprocess.Popen(setup_mount).wait()
-
+ env = self._port_obj.setup_environ_for_server()
env['PYTHONPATH'] = (pywebsocket_base + os.path.pathsep +
env.get('PYTHONPATH', ''))
diff --git a/WebKitTools/Scripts/webkitpy/layout_tests/port/win.py b/WebKitTools/Scripts/webkitpy/layout_tests/port/win.py
index 3b7a817..e05a69d 100644
--- a/WebKitTools/Scripts/webkitpy/layout_tests/port/win.py
+++ b/WebKitTools/Scripts/webkitpy/layout_tests/port/win.py
@@ -44,6 +44,11 @@ class WinPort(WebKitPort):
port_name = 'win'
WebKitPort.__init__(self, port_name, options)
+ def baseline_search_path(self):
+ # Based on code from old-run-webkit-tests expectedDirectoryForTest()
+ port_names = ["win", "mac-snowleopard", "mac"]
+ return map(self._webkit_baseline_path, port_names)
+
def _tests_for_other_platforms(self):
# FIXME: This list could be dynamic based on platform name and
# pushed into base.Port.