1231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#!/usr/bin/env python
25e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block# Copyright (C) 2010 Google Inc. All rights reserved.
30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# Redistribution and use in source and binary forms, with or without
50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# modification, are permitted provided that the following conditions are
60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# met:
7d0825bca7fe65beaee391d30da42e937db621564Steve Block#
80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#     * Redistributions of source code must retain the above copyright
90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# notice, this list of conditions and the following disclaimer.
100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#     * Redistributions in binary form must reproduce the above
110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# copyright notice, this list of conditions and the following disclaimer
120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# in the documentation and/or other materials provided with the
130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# distribution.
145e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#     * Neither the name of Google Inc. nor the names of its
150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# contributors may be used to endorse or promote products derived from
160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# this software without specific prior written permission.
17d0825bca7fe65beaee391d30da42e937db621564Steve Block#
180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
30d0825bca7fe65beaee391d30da42e937db621564Steve Block"""Base class with common routines between the Apache and Lighttpd servers."""
31d0825bca7fe65beaee391d30da42e937db621564Steve Block
32d0825bca7fe65beaee391d30da42e937db621564Steve Blockimport logging
338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockimport os
34d0825bca7fe65beaee391d30da42e937db621564Steve Blockimport time
35d0825bca7fe65beaee391d30da42e937db621564Steve Blockimport urllib
36d0825bca7fe65beaee391d30da42e937db621564Steve Block
37f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochfrom webkitpy.common.system import filesystem
38f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block_log = logging.getLogger("webkitpy.layout_tests.port.http_server_base")
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
41d0825bca7fe65beaee391d30da42e937db621564Steve Block
42d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass HttpServerBase(object):
43d0825bca7fe65beaee391d30da42e937db621564Steve Block
448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    def __init__(self, port_obj):
458a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        self._port_obj = port_obj
468a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
47d0825bca7fe65beaee391d30da42e937db621564Steve Block    def wait_for_action(self, action):
48d0825bca7fe65beaee391d30da42e937db621564Steve Block        """Repeat the action for 20 seconds or until it succeeds. Returns
49d0825bca7fe65beaee391d30da42e937db621564Steve Block        whether it succeeded."""
50d0825bca7fe65beaee391d30da42e937db621564Steve Block        start_time = time.time()
51d0825bca7fe65beaee391d30da42e937db621564Steve Block        while time.time() - start_time < 20:
52d0825bca7fe65beaee391d30da42e937db621564Steve Block            if action():
53d0825bca7fe65beaee391d30da42e937db621564Steve Block                return True
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            _log.debug("Waiting for action: %s" % action)
55d0825bca7fe65beaee391d30da42e937db621564Steve Block            time.sleep(1)
56d0825bca7fe65beaee391d30da42e937db621564Steve Block
57d0825bca7fe65beaee391d30da42e937db621564Steve Block        return False
58d0825bca7fe65beaee391d30da42e937db621564Steve Block
59d0825bca7fe65beaee391d30da42e937db621564Steve Block    def is_server_running_on_all_ports(self):
60d0825bca7fe65beaee391d30da42e937db621564Steve Block        """Returns whether the server is running on all the desired ports."""
61d0825bca7fe65beaee391d30da42e937db621564Steve Block        for mapping in self.mappings:
62d0825bca7fe65beaee391d30da42e937db621564Steve Block            if 'sslcert' in mapping:
63d0825bca7fe65beaee391d30da42e937db621564Steve Block                http_suffix = 's'
64d0825bca7fe65beaee391d30da42e937db621564Steve Block            else:
65d0825bca7fe65beaee391d30da42e937db621564Steve Block                http_suffix = ''
66d0825bca7fe65beaee391d30da42e937db621564Steve Block
67d0825bca7fe65beaee391d30da42e937db621564Steve Block            url = 'http%s://127.0.0.1:%d/' % (http_suffix, mapping['port'])
68d0825bca7fe65beaee391d30da42e937db621564Steve Block
69d0825bca7fe65beaee391d30da42e937db621564Steve Block            try:
702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                response = urllib.urlopen(url, proxies={})
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                _log.debug("Server running at %s" % url)
72967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            except IOError, e:
73967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                _log.debug("Server NOT running at %s: %s" % (url, e))
74d0825bca7fe65beaee391d30da42e937db621564Steve Block                return False
75d0825bca7fe65beaee391d30da42e937db621564Steve Block
76d0825bca7fe65beaee391d30da42e937db621564Steve Block        return True
778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    def remove_log_files(self, folder, starts_with):
798a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        files = os.listdir(folder)
808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        for file in files:
818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            if file.startswith(starts_with):
828a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block                full_path = os.path.join(folder, file)
83f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                filesystem.FileSystem().remove(full_path)
84