OLD | NEW |
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import fnmatch | 5 import fnmatch |
6 import urlparse | 6 import urlparse |
7 | 7 |
8 # Valid expectation conditions are: | 8 # Valid expectation conditions are: |
9 # | 9 # |
10 # Operating systems: | 10 # Operating systems: |
11 # win, xp, vista, win7, win8, win10, mac, leopard, snowleopard, | 11 # win, xp, vista, win7, win8, win10, mac, leopard, snowleopard, |
12 # lion, mountainlion, mavericks, yosemite, linux, chromeos, | 12 # lion, mountainlion, mavericks, yosemite, linux, chromeos, |
13 # android | 13 # android |
14 # | 14 # |
15 # Browser types: | 15 # Browser types: |
16 # android-webview-shell, android-content-shell, debug, release | 16 # android-webview-shell, android-content-shell, debug, release |
17 # | 17 # |
18 # Sample usage in SetExpectations in subclasses: | 18 # Sample usage in SetExpectations in subclasses: |
19 # self.Fail('gl-enable-vertex-attrib.html', | 19 # self.Fail('gl-enable-vertex-attrib.html', |
20 # ['mac', 'release'], bug=123) | 20 # ['mac', 'release'], bug=123) |
21 | 21 |
22 WIN_CONDITIONS = ['xp', 'vista', 'win7', 'win8', 'win10'] | 22 WIN_CONDITIONS = ['xp', 'vista', 'win7', 'win8', 'win10'] |
23 MAC_CONDITIONS = ['leopard', 'snowleopard', 'lion', 'mountainlion', | 23 MAC_CONDITIONS = ['leopard', 'snowleopard', 'lion', 'mountainlion', |
24 'mavericks', 'yosemite'] | 24 'mavericks', 'yosemite'] |
25 | 25 |
26 OS_CONDITIONS = ['win', 'mac', 'linux', 'chromeos', 'android'] + \ | 26 OS_CONDITIONS = ['win', 'mac', 'linux', 'chromeos', 'android'] + \ |
27 WIN_CONDITIONS + MAC_CONDITIONS | 27 WIN_CONDITIONS + MAC_CONDITIONS |
28 | 28 |
29 BROWSER_TYPE_CONDITIONS = [ | 29 BROWSER_TYPE_CONDITIONS = [ |
30 'android-webview-shell', 'android-content-shell', 'debug', 'release' ] | 30 'android-webview-shell', 'android-content-shell', 'debug', 'release'] |
31 | 31 |
32 class Expectation(object): | 32 class Expectation(object): |
33 """Represents a single test expectation for a page. | 33 """Represents a single test expectation for a page. |
34 | 34 |
35 Supports conditions based on operating system (e.g., win, mac) and | 35 Supports conditions based on operating system (e.g., win, mac) and |
36 browser type (e.g. 'debug', 'release'). | 36 browser type (e.g. 'debug', 'release'). |
37 | 37 |
38 Subclass this class and call super.__init__ last in your constructor | 38 Subclass this class and call super.__init__ last in your constructor |
39 in order to add new user-defined conditions. The conditions are | 39 in order to add new user-defined conditions. The conditions are |
40 parsed at the end of this class's constructor, so be careful not to | 40 parsed at the end of this class's constructor, so be careful not to |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 | 135 |
136 def _HasWildcardCharacters(self, input_string): | 136 def _HasWildcardCharacters(self, input_string): |
137 # Could make this more precise. | 137 # Could make this more precise. |
138 return '*' in input_string or '+' in input_string | 138 return '*' in input_string or '+' in input_string |
139 | 139 |
140 def _BuildExpectationsCache(self, browser, page): | 140 def _BuildExpectationsCache(self, browser, page): |
141 # Turn off name matching while building the cache. | 141 # Turn off name matching while building the cache. |
142 self._skip_matching_names = True | 142 self._skip_matching_names = True |
143 for e in self._expectations: | 143 for e in self._expectations: |
144 if self.ExpectationAppliesToPage(e, browser, page): | 144 if self.ExpectationAppliesToPage(e, browser, page): |
145 if (self._HasWildcardCharacters(e.pattern)): | 145 if self._HasWildcardCharacters(e.pattern): |
146 self._expectations_with_wildcards.append(e) | 146 self._expectations_with_wildcards.append(e) |
147 else: | 147 else: |
148 if e.pattern in self._expectations_by_pattern: | 148 if e.pattern in self._expectations_by_pattern: |
149 print "WARNING: Non-wildcard pattern collision for", pattern | 149 print "WARNING: Non-wildcard pattern collision for", e.pattern |
150 self._expectations_by_pattern[e.pattern] = e | 150 self._expectations_by_pattern[e.pattern] = e |
151 self._built_expectation_cache = True | 151 self._built_expectation_cache = True |
152 self._skip_matching_names = False | 152 self._skip_matching_names = False |
153 | 153 |
154 def _GetNormalizedURL(self, url, browser): | 154 def _GetNormalizedURL(self, url, browser): |
155 # Telemetry uses backslashes in its file:// URLs on Windows, | 155 # Telemetry uses backslashes in its file:// URLs on Windows, |
156 # breaking matching of test expectations. | 156 # breaking matching of test expectations. |
157 if not browser.platform.GetOSName() == 'win': | 157 if not browser.platform.GetOSName() == 'win': |
158 return url | 158 return url |
159 return url.replace('\\', '/') | 159 return url.replace('\\', '/') |
160 | 160 |
161 def _GetURLPath(self, url): | 161 def _GetURLPath(self, url): |
162 components = urlparse.urlsplit(url) | 162 components = urlparse.urlsplit(url) |
163 # For compatibility, the file:// scheme must be treated specially. | 163 # For compatibility, the file:// scheme must be treated specially. |
164 # The top-level directory shows up in the netloc portion of the URL. | 164 # The top-level directory shows up in the netloc portion of the URL. |
165 if components[0] == 'file': | 165 if components[0] == 'file': |
166 url_path = components[1] + components[2] | 166 url_path = components[1] + components[2] |
167 else: | 167 else: |
168 url_path = components[2] | 168 url_path = components[2] |
169 # Chop any leading slash since the expectations used by this class | 169 # Chop any leading slash since the expectations used by this class |
170 # assume that. | 170 # assume that. |
171 if (url_path and url_path[0] == '/'): | 171 if url_path and url_path[0] == '/': |
172 url_path = url_path[1:] | 172 url_path = url_path[1:] |
173 # Python's urlsplit doesn't seem to handle query arguments for | 173 # Python's urlsplit doesn't seem to handle query arguments for |
174 # file:// URLs properly. Split them off manually. | 174 # file:// URLs properly. Split them off manually. |
175 query_index = url_path.find('?') | 175 query_index = url_path.find('?') |
176 if query_index > 0: | 176 if query_index > 0: |
177 url_path = url_path[0:query_index] | 177 url_path = url_path[0:query_index] |
178 return url_path | 178 return url_path |
179 | 179 |
180 def _GetExpectationObjectForPage(self, browser, page): | 180 def _GetExpectationObjectForPage(self, browser, page): |
181 if not self._built_expectation_cache: | 181 if not self._built_expectation_cache: |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 platform = browser.platform | 253 platform = browser.platform |
254 os_matches = (not expectation.os_conditions or | 254 os_matches = (not expectation.os_conditions or |
255 platform.GetOSName() in expectation.os_conditions or | 255 platform.GetOSName() in expectation.os_conditions or |
256 platform.GetOSVersionName() in expectation.os_conditions) | 256 platform.GetOSVersionName() in expectation.os_conditions) |
257 | 257 |
258 browser_matches = ( | 258 browser_matches = ( |
259 (not expectation.browser_conditions) or | 259 (not expectation.browser_conditions) or |
260 browser.browser_type in expectation.browser_conditions) | 260 browser.browser_type in expectation.browser_conditions) |
261 | 261 |
262 return os_matches and browser_matches | 262 return os_matches and browser_matches |
OLD | NEW |