| OLD | NEW | 
|---|
| 1 # Copyright (C) 2010 Google Inc. All rights reserved. | 1 # Copyright (C) 2010 Google Inc. All rights reserved. | 
| 2 # | 2 # | 
| 3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without | 
| 4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are | 
| 5 # met: | 5 # met: | 
| 6 # | 6 # | 
| 7 #     * Redistributions of source code must retain the above copyright | 7 #     * Redistributions of source code must retain the above copyright | 
| 8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. | 
| 9 #     * Redistributions in binary form must reproduce the above | 9 #     * Redistributions in binary form must reproduce the above | 
| 10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer | 
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 58 from webkitpy.common.webkit_finder import WebKitFinder | 58 from webkitpy.common.webkit_finder import WebKitFinder | 
| 59 from webkitpy.layout_tests.layout_package.bot_test_expectations import BotTestEx
      pectationsFactory | 59 from webkitpy.layout_tests.layout_package.bot_test_expectations import BotTestEx
      pectationsFactory | 
| 60 from webkitpy.layout_tests.models import test_run_results | 60 from webkitpy.layout_tests.models import test_run_results | 
| 61 from webkitpy.layout_tests.models.test_configuration import TestConfiguration | 61 from webkitpy.layout_tests.models.test_configuration import TestConfiguration | 
| 62 from webkitpy.layout_tests.port import config as port_config | 62 from webkitpy.layout_tests.port import config as port_config | 
| 63 from webkitpy.layout_tests.port import driver | 63 from webkitpy.layout_tests.port import driver | 
| 64 from webkitpy.layout_tests.port import server_process | 64 from webkitpy.layout_tests.port import server_process | 
| 65 from webkitpy.layout_tests.port.factory import PortFactory | 65 from webkitpy.layout_tests.port.factory import PortFactory | 
| 66 from webkitpy.layout_tests.servers import apache_http | 66 from webkitpy.layout_tests.servers import apache_http | 
| 67 from webkitpy.layout_tests.servers import pywebsocket | 67 from webkitpy.layout_tests.servers import pywebsocket | 
|  | 68 from webkitpy.layout_tests.servers import wptserve | 
| 68 | 69 | 
| 69 _log = logging.getLogger(__name__) | 70 _log = logging.getLogger(__name__) | 
| 70 | 71 | 
| 71 | 72 | 
| 72 # FIXME: This class should merge with WebKitPort now that Chromium behaves mostl
      y like other webkit ports. | 73 # FIXME: This class should merge with WebKitPort now that Chromium behaves mostl
      y like other webkit ports. | 
| 73 class Port(object): | 74 class Port(object): | 
| 74     """Abstract class for Port-specific hooks for the layout_test package.""" | 75     """Abstract class for Port-specific hooks for the layout_test package.""" | 
| 75 | 76 | 
| 76     # Subclasses override this. This should indicate the basic implementation | 77     # Subclasses override this. This should indicate the basic implementation | 
| 77     # part of the port name, e.g., 'mac', 'win', 'gtk'; there is probably (?) | 78     # part of the port name, e.g., 'mac', 'win', 'gtk'; there is probably (?) | 
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 181 | 182 | 
| 182         self.host = host | 183         self.host = host | 
| 183         self._executive = host.executive | 184         self._executive = host.executive | 
| 184         self._filesystem = host.filesystem | 185         self._filesystem = host.filesystem | 
| 185         self._webkit_finder = WebKitFinder(host.filesystem) | 186         self._webkit_finder = WebKitFinder(host.filesystem) | 
| 186         self._config = port_config.Config(self._executive, self._filesystem, sel
      f.port_name) | 187         self._config = port_config.Config(self._executive, self._filesystem, sel
      f.port_name) | 
| 187 | 188 | 
| 188         self._helper = None | 189         self._helper = None | 
| 189         self._http_server = None | 190         self._http_server = None | 
| 190         self._websocket_server = None | 191         self._websocket_server = None | 
|  | 192         self._is_wpt_enabled = hasattr(options, 'enable_wptserve') and options.e
      nable_wptserve | 
|  | 193         self._wpt_server = None | 
| 191         self._image_differ = None | 194         self._image_differ = None | 
| 192         self._server_process_constructor = server_process.ServerProcess  # overr
      idable for testing | 195         self._server_process_constructor = server_process.ServerProcess  # overr
      idable for testing | 
| 193         self._http_lock = None  # FIXME: Why does this live on the port object? | 196         self._http_lock = None  # FIXME: Why does this live on the port object? | 
| 194         self._dump_reader = None | 197         self._dump_reader = None | 
| 195 | 198 | 
| 196         # Python's Popen has a bug that causes any pipes opened to a | 199         # Python's Popen has a bug that causes any pipes opened to a | 
| 197         # process that can't be executed to be leaked.  Since this | 200         # process that can't be executed to be leaked.  Since this | 
| 198         # code is specifically designed to tolerate exec failures | 201         # code is specifically designed to tolerate exec failures | 
| 199         # to gracefully handle cases where wdiff is not installed, | 202         # to gracefully handle cases where wdiff is not installed, | 
| 200         # the bug results in a massive file descriptor leak. As a | 203         # the bug results in a massive file descriptor leak. As a | 
| (...skipping 962 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1163     def start_websocket_server(self): | 1166     def start_websocket_server(self): | 
| 1164         """Start a web server. Raise an error if it can't start or is already ru
      nning. | 1167         """Start a web server. Raise an error if it can't start or is already ru
      nning. | 
| 1165 | 1168 | 
| 1166         Ports can stub this out if they don't need a websocket server to be runn
      ing.""" | 1169         Ports can stub this out if they don't need a websocket server to be runn
      ing.""" | 
| 1167         assert not self._websocket_server, 'Already running a websocket server.' | 1170         assert not self._websocket_server, 'Already running a websocket server.' | 
| 1168 | 1171 | 
| 1169         server = pywebsocket.PyWebSocket(self, self.results_directory()) | 1172         server = pywebsocket.PyWebSocket(self, self.results_directory()) | 
| 1170         server.start() | 1173         server.start() | 
| 1171         self._websocket_server = server | 1174         self._websocket_server = server | 
| 1172 | 1175 | 
|  | 1176     def is_wpt_enabled(self): | 
|  | 1177         """Used as feature flag for WPT Serve feature.""" | 
|  | 1178         return self._is_wpt_enabled | 
|  | 1179 | 
|  | 1180     def is_wpt_test(self, test): | 
|  | 1181         """Whether this test is part of a web-platform-tests which require wptse
      rve servers.""" | 
|  | 1182         return "web-platform-tests" in test | 
|  | 1183 | 
|  | 1184     def start_wptserve(self): | 
|  | 1185         """Start a WPT web server. Raise an error if it can't start or is alread
      y running. | 
|  | 1186 | 
|  | 1187         Ports can stub this out if they don't need a WPT web server to be runnin
      g.""" | 
|  | 1188         assert not self._wpt_server, 'Already running an http server.' | 
|  | 1189         assert self.is_wpt_enabled(), 'Cannot start server if WPT is not enabled
      .' | 
|  | 1190 | 
|  | 1191         # We currently don't support any output mechanism for the WPT server. | 
|  | 1192         server = wptserve.WPTServe(self, self.results_directory()) | 
|  | 1193         server.start() | 
|  | 1194         self._wpt_server = server | 
|  | 1195 | 
|  | 1196     def stop_wptserve(self): | 
|  | 1197         """Shut down the WPT server if it is running. Do nothing if it isn't.""" | 
|  | 1198         if self._wpt_server: | 
|  | 1199             self._wpt_server.stop() | 
|  | 1200             self._wpt_server = None | 
|  | 1201 | 
| 1173     def http_server_supports_ipv6(self): | 1202     def http_server_supports_ipv6(self): | 
| 1174         # Apache < 2.4 on win32 does not support IPv6, nor does cygwin apache. | 1203         # Apache < 2.4 on win32 does not support IPv6, nor does cygwin apache. | 
| 1175         if self.host.platform.is_cygwin() or self.host.platform.is_win(): | 1204         if self.host.platform.is_cygwin() or self.host.platform.is_win(): | 
| 1176             return False | 1205             return False | 
| 1177         return True | 1206         return True | 
| 1178 | 1207 | 
| 1179     def stop_helper(self): | 1208     def stop_helper(self): | 
| 1180         """Shut down the test helper if it is running. Do nothing if | 1209         """Shut down the test helper if it is running. Do nothing if | 
| 1181         it isn't, or it isn't available. If a port overrides start_helper() | 1210         it isn't, or it isn't available. If a port overrides start_helper() | 
| 1182         it must override this routine as well.""" | 1211         it must override this routine as well.""" | 
| (...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1646         for suite in self.physical_test_suites(): | 1675         for suite in self.physical_test_suites(): | 
| 1647             if test_name.startswith(suite.name): | 1676             if test_name.startswith(suite.name): | 
| 1648                 return suite.reference_args | 1677                 return suite.reference_args | 
| 1649         return [] | 1678         return [] | 
| 1650 | 1679 | 
| 1651     def should_run_as_pixel_test(self, test_input): | 1680     def should_run_as_pixel_test(self, test_input): | 
| 1652         if not self._options.pixel_tests: | 1681         if not self._options.pixel_tests: | 
| 1653             return False | 1682             return False | 
| 1654         if self._options.pixel_test_directories: | 1683         if self._options.pixel_test_directories: | 
| 1655             return any(test_input.test_name.startswith(directory) for directory 
      in self._options.pixel_test_directories) | 1684             return any(test_input.test_name.startswith(directory) for directory 
      in self._options.pixel_test_directories) | 
|  | 1685         # TODO(burnik): Make sure this is the right way to do it. | 
|  | 1686         if self.is_wpt_enabled() and self.is_wpt_test(test_input.test_name): | 
|  | 1687             return False | 
| 1656         return True | 1688         return True | 
| 1657 | 1689 | 
| 1658     def _modules_to_search_for_symbols(self): | 1690     def _modules_to_search_for_symbols(self): | 
| 1659         path = self._path_to_webcore_library() | 1691         path = self._path_to_webcore_library() | 
| 1660         if path: | 1692         if path: | 
| 1661             return [path] | 1693             return [path] | 
| 1662         return [] | 1694         return [] | 
| 1663 | 1695 | 
| 1664     def _symbols_string(self): | 1696     def _symbols_string(self): | 
| 1665         symbols = '' | 1697         symbols = '' | 
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1769 class PhysicalTestSuite(object): | 1801 class PhysicalTestSuite(object): | 
| 1770     def __init__(self, base, args, reference_args=None): | 1802     def __init__(self, base, args, reference_args=None): | 
| 1771         self.name = base | 1803         self.name = base | 
| 1772         self.base = base | 1804         self.base = base | 
| 1773         self.args = args | 1805         self.args = args | 
| 1774         self.reference_args = args if reference_args is None else reference_args | 1806         self.reference_args = args if reference_args is None else reference_args | 
| 1775         self.tests = set() | 1807         self.tests = set() | 
| 1776 | 1808 | 
| 1777     def __repr__(self): | 1809     def __repr__(self): | 
| 1778         return "PhysicalTestSuite('%s', '%s', %s, %s)" % (self.name, self.base, 
      self.args, self.reference_args) | 1810         return "PhysicalTestSuite('%s', '%s', %s, %s)" % (self.name, self.base, 
      self.args, self.reference_args) | 
| OLD | NEW | 
|---|