Changeset 217572 in webkit


Ignore:
Timestamp:
May 30, 2017 2:08:11 PM (7 years ago)
Author:
Jonathan Bedard
Message:

webkitpy: Start servers before setting-up for testing
https://bugs.webkit.org/show_bug.cgi?id=172176
<rdar://problem/32225538>

Reviewed by Alexey Proskuryakov.

On-device testing requires that servers are started before ports set-up their
test environments.

  • Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py:

(LayoutTestRunner.init): Start servers when initializing LayoutTestRunner.
Servers are unconditionally stopped on exit.
(LayoutTestRunner.run_tests): Move the starting of servers to the initializer. The
Manager now stops servers.
(LayoutTestRunner.start_servers): Set flag to indicate servers are running.
(LayoutTestRunner.stop_servers): Check flag, only shutdown servers if they are shutdown.

  • Scripts/webkitpy/layout_tests/controllers/manager.py:

(Manager.init): Delay construction of the test runner until we can determine
if servers need to be started.
(Manager.run): Determine if servers need to be started and construct the test runner.
Shut servers down when the test run is finished.
(Manager._run_tests): Move the determination of servers to run into Manager.run.

  • Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py:

(is_wpt_server_running): Server is not running if no config is found.

  • Scripts/webkitpy/layout_tests/servers/websocket_server.py:

(PyWebSocket.is_running): Check if this WebSocket server is running.

  • Scripts/webkitpy/port/base.py:

(Port.init): Define secure WebSocket server.
(Port.to.is_websocket_server_running): Check if WebSocket servers are defined.

Location:
trunk/Tools
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r217571 r217572  
     12017-05-30  Jonathan Bedard  <jbedard@apple.com>
     2
     3        webkitpy: Start servers before setting-up for testing
     4        https://bugs.webkit.org/show_bug.cgi?id=172176
     5        <rdar://problem/32225538>
     6
     7        Reviewed by Alexey Proskuryakov.
     8
     9        On-device testing requires that servers are started before ports set-up their
     10        test environments.
     11
     12        * Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py:
     13        (LayoutTestRunner.__init__): Start servers when initializing LayoutTestRunner.
     14        Servers are unconditionally stopped on exit.
     15        (LayoutTestRunner.run_tests): Move the starting of servers to the initializer. The
     16        Manager now stops servers.
     17        (LayoutTestRunner.start_servers): Set flag to indicate servers are running.
     18        (LayoutTestRunner.stop_servers): Check flag, only shutdown servers if they are shutdown.
     19        * Scripts/webkitpy/layout_tests/controllers/manager.py:
     20        (Manager.__init__): Delay construction of the test runner until we can determine
     21        if servers need to be started.
     22        (Manager.run): Determine if servers need to be started and construct the test runner.
     23        Shut servers down when the test run is finished.
     24        (Manager._run_tests): Move the determination of servers to run into Manager.run.
     25        * Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py:
     26        (is_wpt_server_running): Server is not running if no config is found.
     27        * Scripts/webkitpy/layout_tests/servers/websocket_server.py:
     28        (PyWebSocket.is_running): Check if this WebSocket server is running.
     29        * Scripts/webkitpy/port/base.py:
     30        (Port.__init__): Define secure WebSocket server.
     31        (Port.to.is_websocket_server_running): Check if WebSocket servers are defined.
     32
    1332017-05-30  Daniel Bates  <dabates@apple.com>
    234
  • trunk/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py

    r217276 r217572  
    2727# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2828
     29import atexit
    2930import logging
    3031import math
     
    6263
    6364class LayoutTestRunner(object):
    64     def __init__(self, options, port, printer, results_directory, test_is_slow_fn):
     65    def __init__(self, options, port, printer, results_directory, test_is_slow_fn, needs_http=False, needs_websockets=False, needs_web_platform_test_server=False):
    6566        self._options = options
    6667        self._port = port
     
    6869        self._results_directory = results_directory
    6970        self._test_is_slow = test_is_slow_fn
     71        self._needs_http = needs_http
     72        self._needs_websockets = needs_websockets
     73        self._needs_web_platform_test_server = needs_web_platform_test_server
     74
    7075        self._sharder = Sharder(self._port.split_test)
    7176        self._filesystem = self._port.host.filesystem
     
    7378        self._expectations = None
    7479        self._test_inputs = []
    75         self._needs_http = None
    76         self._needs_websockets = None
    77         self._needs_web_platform_test_server = None
    7880        self._retrying = False
    7981        self._current_run_results = None
     82
     83        if ((self._needs_http and self._options.http) or self._needs_web_platform_test_server) and self._port.get_option("start_http_servers_if_needed"):
     84            self.start_servers()
     85            atexit.register(lambda: self.stop_servers())
    8086
    8187    def get_worker_count(self, test_inputs, child_process_count):
     
    8389        return min(child_process_count, len(all_shards))
    8490
    85     def run_tests(self, expectations, test_inputs, tests_to_skip, num_workers, needs_http, needs_websockets, needs_web_platform_test_server, retrying):
     91    def run_tests(self, expectations, test_inputs, tests_to_skip, num_workers, retrying):
    8692        self._expectations = expectations
    8793        self._test_inputs = test_inputs
    88         self._needs_http = needs_http
    89         self._needs_websockets = needs_websockets
    90         self._needs_web_platform_test_server = needs_web_platform_test_server
     94
    9195        self._retrying = retrying
    9296
     
    107111        self._printer.write_update('Sharding tests ...')
    108112        all_shards = self._sharder.shard_tests(test_inputs, int(self._options.child_processes), self._options.fully_parallel)
    109 
    110         if (self._needs_http and self._options.http) or self._needs_web_platform_test_server:
    111             if self._port.get_option("start_http_servers_if_needed"):
    112                 self.start_servers()
    113113
    114114        self._printer.print_workers_and_shards(num_workers, len(all_shards))
     
    132132            _log.debug('%s("%s") raised, exiting' % (e.__class__.__name__, str(e)))
    133133            raise
    134         finally:
    135             self.stop_servers()
    136134
    137135        return run_results
     
    190188
    191189    def start_servers(self):
    192         if self._needs_http:
     190        if self._needs_http and not self._port.is_http_server_running():
    193191            self._printer.write_update('Starting HTTP server ...')
    194192            self._port.start_http_server()
    195         if self._needs_websockets:
     193        if self._needs_websockets and not self._port.is_websocket_servers_running():
    196194            self._printer.write_update('Starting WebSocket server ...')
    197195            self._port.start_websocket_server()
    198         if self._needs_web_platform_test_server:
     196        if self._needs_web_platform_test_server and not self._port.is_wpt_server_running():
    199197            self._printer.write_update('Starting Web Platform Test server ...')
    200198            self._port.start_web_platform_test_server()
  • trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py

    r217003 r217572  
    8686        self._results_directory = self._port.results_directory()
    8787        self._finder = LayoutTestFinder(self._port, self._options)
    88         self._runner = LayoutTestRunner(self._options, self._port, self._printer, self._results_directory, self._test_is_slow)
     88        self._runner = None
    8989
    9090        test_options_json_path = self._port.path_from_webkit_base(self.LAYOUT_TESTS_DIRECTORY, "tests-options.json")
     
    234234        enabled_pixel_tests_in_retry = False
    235235
     236        needs_http = any((self._is_http_test(test) and not self._needs_web_platform_test(test)) for test in tests_to_run)
     237        needs_web_platform_test_server = any(self._needs_web_platform_test(test) for test in tests_to_run)
     238        needs_websockets = any(self._is_websocket_test(test) for test in tests_to_run)
     239        self._runner = LayoutTestRunner(self._options, self._port, self._printer, self._results_directory, self._test_is_slow,
     240                                        needs_http=needs_http, needs_web_platform_test_server=needs_web_platform_test_server, needs_websockets=needs_websockets)
     241
    236242        if default_device_tests:
    237243            _log.info('')
     
    258264                enabled_pixel_tests_in_retry |= device_enabled_pixel_tests_in_retry
    259265
     266        self._runner.stop_servers()
    260267        end_time = time.time()
    261268        return self._end_test_run(start_time, end_time, initial_results, retry_results, enabled_pixel_tests_in_retry)
     
    319326
    320327    def _run_tests(self, tests_to_run, tests_to_skip, repeat_each, iterations, num_workers, retrying):
    321         needs_http = any((self._is_http_test(test) and not self._needs_web_platform_test(test)) for test in tests_to_run)
    322         needs_web_platform_test_server = any(self._needs_web_platform_test(test) for test in tests_to_run)
    323         needs_websockets = any(self._is_websocket_test(test) for test in tests_to_run)
    324 
    325328        test_inputs = self._get_test_inputs(tests_to_run, repeat_each, iterations)
    326329
    327         return self._runner.run_tests(self._expectations, test_inputs, tests_to_skip, num_workers, needs_http, needs_websockets, needs_web_platform_test_server, retrying)
     330        return self._runner.run_tests(self._expectations, test_inputs, tests_to_skip, num_workers, retrying)
    328331
    329332    def _clean_up_run(self):
  • trunk/Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py

    r217276 r217572  
    5858def is_wpt_server_running(port_obj):
    5959    config = wpt_config_json(port_obj)
     60    if not config:
     61        return False
    6062    return http_server_base.HttpServerBase._is_running_on_port(config["ports"]["http"][0])
    6163
  • trunk/Tools/Scripts/webkitpy/layout_tests/servers/websocket_server.py

    r214558 r217572  
    3030"""A class to help start/stop the PyWebSocket server used by layout tests."""
    3131
     32import errno
    3233import logging
    3334import os
     35import socket
    3436import sys
    3537import time
     
    5759        """
    5860        http_server.Lighttpd.__init__(self, port_obj, output_dir,
    59                                       port=PyWebSocket.DEFAULT_WS_PORT,
     61                                      port=port,
    6062                                      root=root)
    6163        self._output_dir = output_dir
     
    106108        else:
    107109            self._log_prefix = _WS_LOG_NAME
     110
     111    def is_running(self):
     112        s = socket.socket()
     113        try:
     114            s.connect(('localhost', self._port))
     115        except IOError, e:
     116            if e.errno not in (errno.ECONNREFUSED, errno.ECONNRESET):
     117                raise
     118            return False
     119        finally:
     120            s.close()
     121        return True
    108122
    109123    def ports_to_forward(self):
  • trunk/Tools/Scripts/webkitpy/port/base.py

    r217276 r217572  
    128128        self._http_server = None
    129129        self._websocket_server = None
     130        self._websocket_secure_server = None
    130131        self._web_platform_test_server = None
    131132        self._image_differ = None
     
    974975        return http_server_base.is_http_server_running()
    975976
     977    def is_websocket_servers_running(self):
     978        if self._websocket_secure_server and self._websocket_server:
     979            return self._websocket_secure_server.is_running() and self._websocket_server.is_running()
     980        elif self._websocket_server:
     981            return self._websocket_server.is_running()
     982        return False
     983
    976984    def is_wpt_server_running(self):
    977985        return web_platform_test_server.is_wpt_server_running(self)
Note: See TracChangeset for help on using the changeset viewer.