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)