Clean up ChunkedUpdateDrawingAreaProxy
[WebKit-https.git] / WebKitTools / Scripts / webkitpy / layout_tests / port / chromium_linux.py
1 #!/usr/bin/env python
2 # Copyright (C) 2010 Google Inc. All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are
6 # met:
7 #
8 #     * Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer.
10 #     * Redistributions in binary form must reproduce the above
11 # copyright notice, this list of conditions and the following disclaimer
12 # in the documentation and/or other materials provided with the
13 # distribution.
14 #     * Neither the name of Google Inc. nor the names of its
15 # contributors may be used to endorse or promote products derived from
16 # this software without specific prior written permission.
17 #
18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 """Chromium Linux implementation of the Port interface."""
31
32 import logging
33 import os
34 import signal
35
36 import chromium
37
38 _log = logging.getLogger("webkitpy.layout_tests.port.chromium_linux")
39
40
41 class ChromiumLinuxPort(chromium.ChromiumPort):
42     """Chromium Linux implementation of the Port class."""
43
44     def __init__(self, **kwargs):
45         kwargs.setdefault('port_name', 'chromium-linux')
46         chromium.ChromiumPort.__init__(self, **kwargs)
47
48     def baseline_search_path(self):
49         port_names = ["chromium-linux", "chromium-win", "chromium", "win", "mac"]
50         return map(self._webkit_baseline_path, port_names)
51
52     def check_build(self, needs_http):
53         result = chromium.ChromiumPort.check_build(self, needs_http)
54         if needs_http:
55             if self.get_option('use_apache'):
56                 result = self._check_apache_install() and result
57             else:
58                 result = self._check_lighttpd_install() and result
59         result = self._check_wdiff_install() and result
60
61         if not result:
62             _log.error('For complete Linux build requirements, please see:')
63             _log.error('')
64             _log.error('    http://code.google.com/p/chromium/wiki/'
65                        'LinuxBuildInstructions')
66         return result
67
68     def test_platform_name(self):
69         # We use 'linux' instead of 'chromium-linux' in test_expectations.txt.
70         return 'linux'
71
72     def version(self):
73         # We don't have different versions on linux.
74         return ''
75
76     #
77     # PROTECTED METHODS
78     #
79
80     def _build_path(self, *comps):
81         base = self.path_from_chromium_base()
82         if os.path.exists(os.path.join(base, 'sconsbuild')):
83             return os.path.join(base, 'sconsbuild', *comps)
84         if os.path.exists(os.path.join(base, 'out', *comps)) or self.get_option('use_test_shell'):
85             return os.path.join(base, 'out', *comps)
86         base = self.path_from_webkit_base()
87         if os.path.exists(os.path.join(base, 'sconsbuild')):
88             return os.path.join(base, 'sconsbuild', *comps)
89         return os.path.join(base, 'out', *comps)
90
91     def _check_apache_install(self):
92         result = chromium.check_file_exists(self._path_to_apache(),
93             "apache2")
94         result = chromium.check_file_exists(self._path_to_apache_config_file(),
95             "apache2 config file") and result
96         if not result:
97             _log.error('    Please install using: "sudo apt-get install '
98                        'apache2 libapache2-mod-php5"')
99             _log.error('')
100         return result
101
102     def _check_lighttpd_install(self):
103         result = chromium.check_file_exists(
104             self._path_to_lighttpd(), "LigHTTPd executable")
105         result = chromium.check_file_exists(self._path_to_lighttpd_php(),
106             "PHP CGI executable") and result
107         result = chromium.check_file_exists(self._path_to_lighttpd_modules(),
108             "LigHTTPd modules") and result
109         if not result:
110             _log.error('    Please install using: "sudo apt-get install '
111                        'lighttpd php5-cgi"')
112             _log.error('')
113         return result
114
115     def _check_wdiff_install(self):
116         result = chromium.check_file_exists(self._path_to_wdiff(), 'wdiff')
117         if not result:
118             _log.error('    Please install using: "sudo apt-get install '
119                        'wdiff"')
120             _log.error('')
121         # FIXME: The ChromiumMac port always returns True.
122         return result
123
124     def _path_to_apache(self):
125         if self._is_redhat_based():
126             return '/usr/sbin/httpd'
127         else:
128             return '/usr/sbin/apache2'
129
130     def _path_to_apache_config_file(self):
131         if self._is_redhat_based():
132             config_name = 'fedora-httpd.conf'
133         else:
134             config_name = 'apache2-debian-httpd.conf'
135
136         return os.path.join(self.layout_tests_dir(), 'http', 'conf',
137                             config_name)
138
139     def _path_to_lighttpd(self):
140         return "/usr/sbin/lighttpd"
141
142     def _path_to_lighttpd_modules(self):
143         return "/usr/lib/lighttpd"
144
145     def _path_to_lighttpd_php(self):
146         return "/usr/bin/php-cgi"
147
148     def _path_to_driver(self, configuration=None):
149         if not configuration:
150             configuration = self.get_option('configuration')
151         binary_name = 'DumpRenderTree'
152         if self.get_option('use_test_shell'):
153             binary_name = 'test_shell'
154         return self._build_path(configuration, binary_name)
155
156     def _path_to_helper(self):
157         return None
158
159     def _path_to_wdiff(self):
160         if self._is_redhat_based():
161             return '/usr/bin/dwdiff'
162         else:
163             return '/usr/bin/wdiff'
164
165     def _is_redhat_based(self):
166         return os.path.exists(os.path.join('/etc', 'redhat-release'))
167
168     def _shut_down_http_server(self, server_pid):
169         """Shut down the lighttpd web server. Blocks until it's fully
170         shut down.
171
172         Args:
173             server_pid: The process ID of the running server.
174         """
175         # server_pid is not set when "http_server.py stop" is run manually.
176         if server_pid is None:
177             # TODO(mmoss) This isn't ideal, since it could conflict with
178             # lighttpd processes not started by http_server.py,
179             # but good enough for now.
180             self._executive.kill_all("lighttpd")
181             self._executive.kill_all("apache2")
182         else:
183             try:
184                 os.kill(server_pid, signal.SIGTERM)
185                 # TODO(mmoss) Maybe throw in a SIGKILL just to be sure?
186             except OSError:
187                 # Sometimes we get a bad PID (e.g. from a stale httpd.pid
188                 # file), so if kill fails on the given PID, just try to
189                 # 'killall' web servers.
190                 self._shut_down_http_server(None)