Title: [217572] trunk/Tools
Revision
217572
Author
[email protected]
Date
2017-05-30 14:08:11 -0700 (Tue, 30 May 2017)

Log 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.

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (217571 => 217572)


--- trunk/Tools/ChangeLog	2017-05-30 21:01:59 UTC (rev 217571)
+++ trunk/Tools/ChangeLog	2017-05-30 21:08:11 UTC (rev 217572)
@@ -1,3 +1,35 @@
+2017-05-30  Jonathan Bedard  <[email protected]>
+
+        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.
+
 2017-05-30  Daniel Bates  <[email protected]>
 
         [WK2] Add runBeforeUnloadConfirmPanel WKUIDelegate SPI; support onbeforeunload confirm panel in MiniBrowser

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py (217571 => 217572)


--- trunk/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py	2017-05-30 21:01:59 UTC (rev 217571)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/controllers/layout_test_runner.py	2017-05-30 21:08:11 UTC (rev 217572)
@@ -26,6 +26,7 @@
 # (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 atexit
 import logging
 import math
 import threading
@@ -61,33 +62,36 @@
 
 
 class LayoutTestRunner(object):
-    def __init__(self, options, port, printer, results_directory, test_is_slow_fn):
+    def __init__(self, options, port, printer, results_directory, test_is_slow_fn, needs_http=False, needs_websockets=False, needs_web_platform_test_server=False):
         self._options = options
         self._port = port
         self._printer = printer
         self._results_directory = results_directory
         self._test_is_slow = test_is_slow_fn
+        self._needs_http = needs_http
+        self._needs_websockets = needs_websockets
+        self._needs_web_platform_test_server = needs_web_platform_test_server
+
         self._sharder = Sharder(self._port.split_test)
         self._filesystem = self._port.host.filesystem
 
         self._expectations = None
         self._test_inputs = []
-        self._needs_http = None
-        self._needs_websockets = None
-        self._needs_web_platform_test_server = None
         self._retrying = False
         self._current_run_results = None
 
+        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"):
+            self.start_servers()
+            atexit.register(lambda: self.stop_servers())
+
     def get_worker_count(self, test_inputs, child_process_count):
         all_shards = self._sharder.shard_tests(test_inputs, child_process_count, self._options.fully_parallel)
         return min(child_process_count, len(all_shards))
 
-    def run_tests(self, expectations, test_inputs, tests_to_skip, num_workers, needs_http, needs_websockets, needs_web_platform_test_server, retrying):
+    def run_tests(self, expectations, test_inputs, tests_to_skip, num_workers, retrying):
         self._expectations = expectations
         self._test_inputs = test_inputs
-        self._needs_http = needs_http
-        self._needs_websockets = needs_websockets
-        self._needs_web_platform_test_server = needs_web_platform_test_server
+
         self._retrying = retrying
 
         # FIXME: rename all variables to test_run_results or some such ...
@@ -107,10 +111,6 @@
         self._printer.write_update('Sharding tests ...')
         all_shards = self._sharder.shard_tests(test_inputs, int(self._options.child_processes), self._options.fully_parallel)
 
-        if (self._needs_http and self._options.http) or self._needs_web_platform_test_server:
-            if self._port.get_option("start_http_servers_if_needed"):
-                self.start_servers()
-
         self._printer.print_workers_and_shards(num_workers, len(all_shards))
 
         if self._options.dry_run:
@@ -131,8 +131,6 @@
         except Exception, e:
             _log.debug('%s("%s") raised, exiting' % (e.__class__.__name__, str(e)))
             raise
-        finally:
-            self.stop_servers()
 
         return run_results
 
@@ -189,13 +187,13 @@
         self._interrupt_if_at_failure_limits(run_results)
 
     def start_servers(self):
-        if self._needs_http:
+        if self._needs_http and not self._port.is_http_server_running():
             self._printer.write_update('Starting HTTP server ...')
             self._port.start_http_server()
-        if self._needs_websockets:
+        if self._needs_websockets and not self._port.is_websocket_servers_running():
             self._printer.write_update('Starting WebSocket server ...')
             self._port.start_websocket_server()
-        if self._needs_web_platform_test_server:
+        if self._needs_web_platform_test_server and not self._port.is_wpt_server_running():
             self._printer.write_update('Starting Web Platform Test server ...')
             self._port.start_web_platform_test_server()
 

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py (217571 => 217572)


--- trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py	2017-05-30 21:01:59 UTC (rev 217571)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py	2017-05-30 21:08:11 UTC (rev 217572)
@@ -85,7 +85,7 @@
         self.LAYOUT_TESTS_DIRECTORY = 'LayoutTests'
         self._results_directory = self._port.results_directory()
         self._finder = LayoutTestFinder(self._port, self._options)
-        self._runner = LayoutTestRunner(self._options, self._port, self._printer, self._results_directory, self._test_is_slow)
+        self._runner = None
 
         test_options_json_path = self._port.path_from_webkit_base(self.LAYOUT_TESTS_DIRECTORY, "tests-options.json")
         self._tests_options = json.loads(self._filesystem.read_text_file(test_options_json_path)) if self._filesystem.exists(test_options_json_path) else {}
@@ -233,6 +233,12 @@
         retry_results = None
         enabled_pixel_tests_in_retry = False
 
+        needs_http = any((self._is_http_test(test) and not self._needs_web_platform_test(test)) for test in tests_to_run)
+        needs_web_platform_test_server = any(self._needs_web_platform_test(test) for test in tests_to_run)
+        needs_websockets = any(self._is_websocket_test(test) for test in tests_to_run)
+        self._runner = LayoutTestRunner(self._options, self._port, self._printer, self._results_directory, self._test_is_slow,
+                                        needs_http=needs_http, needs_web_platform_test_server=needs_web_platform_test_server, needs_websockets=needs_websockets)
+
         if default_device_tests:
             _log.info('')
             _log.info("Running %s", pluralize(len(tests_to_run), "test"))
@@ -257,6 +263,7 @@
                 retry_results = retry_results.merge(device_retry_results) if retry_results else device_retry_results
                 enabled_pixel_tests_in_retry |= device_enabled_pixel_tests_in_retry
 
+        self._runner.stop_servers()
         end_time = time.time()
         return self._end_test_run(start_time, end_time, initial_results, retry_results, enabled_pixel_tests_in_retry)
 
@@ -318,13 +325,9 @@
         return test_run_results.RunDetails(exit_code, summarized_results, initial_results, retry_results, enabled_pixel_tests_in_retry)
 
     def _run_tests(self, tests_to_run, tests_to_skip, repeat_each, iterations, num_workers, retrying):
-        needs_http = any((self._is_http_test(test) and not self._needs_web_platform_test(test)) for test in tests_to_run)
-        needs_web_platform_test_server = any(self._needs_web_platform_test(test) for test in tests_to_run)
-        needs_websockets = any(self._is_websocket_test(test) for test in tests_to_run)
-
         test_inputs = self._get_test_inputs(tests_to_run, repeat_each, iterations)
 
-        return self._runner.run_tests(self._expectations, test_inputs, tests_to_skip, num_workers, needs_http, needs_websockets, needs_web_platform_test_server, retrying)
+        return self._runner.run_tests(self._expectations, test_inputs, tests_to_skip, num_workers, retrying)
 
     def _clean_up_run(self):
         _log.debug("Flushing stdout")

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py (217571 => 217572)


--- trunk/Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py	2017-05-30 21:01:59 UTC (rev 217571)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py	2017-05-30 21:08:11 UTC (rev 217572)
@@ -57,6 +57,8 @@
 
 def is_wpt_server_running(port_obj):
     config = wpt_config_json(port_obj)
+    if not config:
+        return False
     return http_server_base.HttpServerBase._is_running_on_port(config["ports"]["http"][0])
 
 

Modified: trunk/Tools/Scripts/webkitpy/layout_tests/servers/websocket_server.py (217571 => 217572)


--- trunk/Tools/Scripts/webkitpy/layout_tests/servers/websocket_server.py	2017-05-30 21:01:59 UTC (rev 217571)
+++ trunk/Tools/Scripts/webkitpy/layout_tests/servers/websocket_server.py	2017-05-30 21:08:11 UTC (rev 217572)
@@ -29,8 +29,10 @@
 
 """A class to help start/stop the PyWebSocket server used by layout tests."""
 
+import errno
 import logging
 import os
+import socket
 import sys
 import time
 
@@ -56,7 +58,7 @@
           output_dir: the absolute path to the layout test result directory
         """
         http_server.Lighttpd.__init__(self, port_obj, output_dir,
-                                      port=PyWebSocket.DEFAULT_WS_PORT,
+                                      port=port,
                                       root=root)
         self._output_dir = output_dir
         self._pid_file = pidfile
@@ -106,6 +108,18 @@
         else:
             self._log_prefix = _WS_LOG_NAME
 
+    def is_running(self):
+        s = socket.socket()
+        try:
+            s.connect(('localhost', self._port))
+        except IOError, e:
+            if e.errno not in (errno.ECONNREFUSED, errno.ECONNRESET):
+                raise
+            return False
+        finally:
+            s.close()
+        return True
+
     def ports_to_forward(self):
         return [self._port]
 

Modified: trunk/Tools/Scripts/webkitpy/port/base.py (217571 => 217572)


--- trunk/Tools/Scripts/webkitpy/port/base.py	2017-05-30 21:01:59 UTC (rev 217571)
+++ trunk/Tools/Scripts/webkitpy/port/base.py	2017-05-30 21:08:11 UTC (rev 217572)
@@ -127,6 +127,7 @@
         self._helper = None
         self._http_server = None
         self._websocket_server = None
+        self._websocket_secure_server = None
         self._web_platform_test_server = None
         self._image_differ = None
         self._server_process_constructor = server_process.ServerProcess  # overridable for testing
@@ -973,6 +974,13 @@
     def is_http_server_running(self):
         return http_server_base.is_http_server_running()
 
+    def is_websocket_servers_running(self):
+        if self._websocket_secure_server and self._websocket_server:
+            return self._websocket_secure_server.is_running() and self._websocket_server.is_running()
+        elif self._websocket_server:
+            return self._websocket_server.is_running()
+        return False
+
     def is_wpt_server_running(self):
         return web_platform_test_server.is_wpt_server_running(self)
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to