Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1033)

Unified Diff: Tools/Scripts/webkitpy/layout_tests/servers/server_base.py

Issue 159723008: Refactor webkitpy.layout_tests.servers.server_base. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Tools/Scripts/webkitpy/layout_tests/servers/server_base.py
diff --git a/Tools/Scripts/webkitpy/layout_tests/servers/server_base.py b/Tools/Scripts/webkitpy/layout_tests/servers/server_base.py
index 7ae32f7508dc0063f492de6c249385a7fdcb54ff..5b7f34121a3e97bd77be4ab41029ef3aad2ccd93 100644
--- a/Tools/Scripts/webkitpy/layout_tests/servers/server_base.py
+++ b/Tools/Scripts/webkitpy/layout_tests/servers/server_base.py
@@ -26,7 +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.
-"""Base class with common routines between the Apache, Lighttpd, and websocket servers."""
+"""Base class used to start servers used by the layout tests."""
import errno
import logging
@@ -46,15 +46,11 @@ class ServerError(Exception):
class ServerBase(object):
"""A skeleton class for starting and stopping servers used by the layout tests."""
- def __init__(self, port_obj, number_of_servers=None):
+ def __init__(self, port_obj, output_dir):
+ self._port_obj = port_obj
self._executive = port_obj._executive
self._filesystem = port_obj._filesystem
- self._name = '<virtual>'
- self._mappings = {}
- self._pid = None
- self._pid_file = None
- self._port_obj = port_obj
- self._number_of_servers = number_of_servers
+ self._output_dir = output_dir
# We need a non-checkout-dependent place to put lock files, etc. We
# don't use the Python default on the Mac because it defaults to a
@@ -67,6 +63,20 @@ class ServerBase(object):
self._runtime_path = self._filesystem.join(tmpdir, "WebKit")
self._filesystem.maybe_make_directory(self._runtime_path)
+ # Subclasses must override these fields.
+ self._name = '<virtual>'
+ self._log_prefixes = tuple()
+ self._mappings = {}
+ self._pid_file = None
+ self._start_cmd = None
+
+ # Subclasses may override these fields.
+ self._env = None
+ self._stdout = self._executive.PIPE
+ self._stderr = self._executive.PIPE
+ self._process = None
+ self._pid = None
+
def start(self):
"""Starts the server. It is an error to start an already started server.
@@ -140,20 +150,31 @@ class ServerBase(object):
left over from a prior run. This routine should log warnings if the
files cannot be deleted, but should not fail unless failure to
delete the logs will actually cause start() to fail."""
- pass
+ # Sometimes logs are open in other processes but they should clear eventually.
+ for log_prefix in self._log_prefixes:
+ try:
+ self._remove_log_files(self._output_dir, log_prefix)
+ except OSError, e:
+ _log.warning('Failed to remove old %s %s files' % (self._name, log_prefix))
def _spawn_process(self):
- """This routine must be implemented by subclasses to actually start the server.
-
- This routine returns the pid of the started process, and also ensures that that
- pid has been written to self._pid_file."""
- raise NotImplementedError()
+ _log.debug('Starting %s server, cmd="%s"' % (self._name, self._start_cmd))
+ process = self._executive.popen(self._start_cmd, env=self._env, stdout=self._stdout, stderr=self._stderr)
+ pid = process.pid
+ self._filesystem.write_text_file(self._pid_file, str(pid))
+ return pid
def _stop_running_server(self):
- """This routine must be implemented by subclasses to actually stop the running server listed in self._pid_file."""
- raise NotImplementedError()
+ self._wait_for_action(self._check_and_kill)
+ if self._filesystem.exists(self._pid_file):
+ self._filesystem.remove(self._pid_file)
- # Utility routines.
+ def _check_and_kill(self):
+ if self._executive.check_running_pid(self._pid):
+ host = self._port_obj.host
+ self._executive.kill_process(self._pid)
+ return False
+ return True
def _remove_pid_file(self):
if self._filesystem.exists(self._pid_file):

Powered by Google App Engine
This is Rietveld 408576698