OLD | NEW |
---|---|
1 # Copyright (C) 2013 Google Inc. All rights reserved. | 1 # Copyright (C) 2013 Google Inc. All rights reserved. |
2 # | 2 # |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
(...skipping 11 matching lines...) Expand all Loading... | |
22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
28 | 28 |
29 import datetime | 29 import datetime |
30 import json | 30 import json |
31 import logging | 31 import logging |
32 import re | |
32 import sys | 33 import sys |
33 import traceback | 34 import traceback |
34 import urllib2 | 35 import urllib2 |
35 import webapp2 | 36 import webapp2 |
36 | 37 |
37 from google.appengine.api import memcache | 38 from google.appengine.api import memcache |
38 | 39 |
39 MASTERS = [ | 40 MASTERS = [ |
40 {'name': 'ChromiumWin', 'url': 'http://build.chromium.org/p/chromium.win', ' groups': ['@ToT Chromium']}, | 41 {'name': 'ChromiumWin', 'url': 'http://build.chromium.org/p/chromium.win', ' groups': ['@ToT Chromium']}, |
41 {'name': 'ChromiumMac', 'url': 'http://build.chromium.org/p/chromium.mac', ' groups': ['@ToT Chromium']}, | 42 {'name': 'ChromiumMac', 'url': 'http://build.chromium.org/p/chromium.mac', ' groups': ['@ToT Chromium']}, |
42 {'name': 'ChromiumLinux', 'url': 'http://build.chromium.org/p/chromium.linux ', 'groups': ['@ToT Chromium']}, | 43 {'name': 'ChromiumLinux', 'url': 'http://build.chromium.org/p/chromium.linux ', 'groups': ['@ToT Chromium']}, |
43 {'name': 'ChromiumChromiumOS', 'url': 'http://build.chromium.org/p/chromium. chromiumos', 'groups': ['@ToT ChromeOS']}, | 44 {'name': 'ChromiumChromiumOS', 'url': 'http://build.chromium.org/p/chromium. chromiumos', 'groups': ['@ToT ChromeOS']}, |
44 {'name': 'ChromiumGPU', 'url': 'http://build.chromium.org/p/chromium.gpu', ' groups': ['@ToT Chromium']}, | 45 {'name': 'ChromiumGPU', 'url': 'http://build.chromium.org/p/chromium.gpu', ' groups': ['@ToT Chromium']}, |
45 {'name': 'ChromiumGPUFYI', 'url': 'http://build.chromium.org/p/chromium.gpu. fyi', 'groups': ['@ToT Chromium FYI']}, | 46 {'name': 'ChromiumGPUFYI', 'url': 'http://build.chromium.org/p/chromium.gpu. fyi', 'groups': ['@ToT Chromium FYI']}, |
46 {'name': 'ChromiumWebkit', 'url': 'http://build.chromium.org/p/chromium.webk it', 'groups': ['@ToT Chromium', '@ToT Blink']}, | 47 {'name': 'ChromiumWebkit', 'url': 'http://build.chromium.org/p/chromium.webk it', 'groups': ['@ToT Chromium', '@ToT Blink']}, |
47 {'name': 'ChromiumFYI', 'url': 'http://build.chromium.org/p/chromium.fyi', ' groups': ['@ToT Chromium FYI']}, | 48 {'name': 'ChromiumFYI', 'url': 'http://build.chromium.org/p/chromium.fyi', ' groups': ['@ToT Chromium FYI']}, |
48 {'name': 'V8', 'url': 'http://build.chromium.org/p/client.v8', 'groups': ['@ ToT V8']}, | 49 {'name': 'V8', 'url': 'http://build.chromium.org/p/client.v8', 'groups': ['@ ToT V8']}, |
49 ] | 50 ] |
50 | 51 |
52 # Buildbot steps that have test in the name, but don't run tests. | |
53 NON_TEST_STEP_NAMES = [ | |
54 'archive', | |
55 'Run tests', | |
56 'find isolated tests', | |
57 'read test spec', | |
58 'Download latest chromedriver', | |
59 'compile tests', | |
60 'create_coverage_', | |
61 'update test result log', | |
62 'memory test:', | |
63 'install_', | |
64 ] | |
65 | |
66 # Buildbot steps that run tests but don't upload results to the flakiness dashbo ard server. | |
67 # FIXME: These should be fixed to upload and then removed from this list. | |
68 TEST_STEPS_THAT_DO_NOT_UPLOAD_YET = [ | |
69 'java_tests(chrome', | |
70 'python_tests(chrome', | |
71 'run_all_tests.py', | |
72 'test_report', | |
73 'test CronetSample', | |
74 'test_mini_installer', | |
75 'telemetry_unittests', | |
76 'webkit_python_tests', | |
77 'webkit_unit_tests', | |
78 ] | |
51 | 79 |
52 class FetchBuildersException(Exception): pass | 80 class FetchBuildersException(Exception): pass |
53 | 81 |
54 | 82 |
55 def master_json_url(master_url): | 83 def master_json_url(master_url): |
56 return master_url + '/json/builders' | 84 return master_url + '/json/builders' |
57 | 85 |
58 | 86 |
59 def builder_json_url(master_url, builder): | 87 def builder_json_url(master_url, builder): |
60 return master_json_url(master_url) + '/' + urllib2.quote(builder) | 88 return master_json_url(master_url) + '/' + urllib2.quote(builder) |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
135 latest_build = get_latest_build(build_data) | 163 latest_build = get_latest_build(build_data) |
136 if not latest_build: | 164 if not latest_build: |
137 logging.info('Skipping builder %s because it lacked cached or cu rrent builds.', builder) | 165 logging.info('Skipping builder %s because it lacked cached or cu rrent builds.', builder) |
138 continue | 166 continue |
139 | 167 |
140 build = fetch_json(cached_build_json_url(master_url, builder, latest _build)) | 168 build = fetch_json(cached_build_json_url(master_url, builder, latest _build)) |
141 if not build: | 169 if not build: |
142 logging.info('Skipping build %s on builder %s due to empty data' , latest_build, builder) | 170 logging.info('Skipping build %s on builder %s due to empty data' , latest_build, builder) |
143 for step in build['steps']: | 171 for step in build['steps']: |
144 step_name = step['name'] | 172 step_name = step['name'] |
145 is_test_step = 'test' in step_name and 'archive' not in step_nam e and 'Run tests' not in step_name | 173 |
174 is_test_step = 'test' in step_name | |
175 for name in NON_TEST_STEP_NAMES: | |
Dirk Pranke
2014/06/09 19:06:12
to replace lines 174-183:
if not 'test' in step_n
ojan
2014/06/09 21:39:16
Indeed! Also, I realized I forgot to run the unitt
| |
176 if name in step_name: | |
177 is_test_step = False | |
178 break | |
179 | |
180 # Hackity hack. But there's not a better way to exclude certain test steps without | |
181 # explicitly listing them all. Maybe that would be better? | |
182 if is_test_step and re.search('/_only|_ignore|_perf$/', step_nam e): | |
183 is_test_step = False | |
184 | |
146 if not is_test_step: | 185 if not is_test_step: |
147 continue | 186 continue |
148 | 187 |
149 if step_name == 'webkit_tests': | 188 if step_name == 'webkit_tests': |
150 step_name = 'layout-tests' | 189 step_name = 'layout-tests' |
151 | 190 |
152 tests_object.setdefault(step_name, {'builders': []}) | 191 tests_object.setdefault(step_name, {'builders': []}) |
153 tests_object[step_name]['builders'].append(builder) | 192 tests_object[step_name]['builders'].append(builder) |
154 | 193 |
155 for builders in tests_object.values(): | 194 for builders in tests_object.values(): |
156 builders['builders'].sort() | 195 builders['builders'].sort() |
157 | 196 |
158 output_data = {'masters': master_data} | 197 output_data = {'masters': master_data, 'no_upload_test_types': TEST_STEPS_TH AT_DO_NOT_UPLOAD_YET} |
159 | 198 |
160 delta = datetime.datetime.now() - start_time | 199 delta = datetime.datetime.now() - start_time |
161 | 200 |
162 logging.info('Fetched buildbot data in %s seconds.', delta.seconds) | 201 logging.info('Fetched buildbot data in %s seconds.', delta.seconds) |
163 | 202 |
164 return dump_json(output_data) | 203 return dump_json(output_data) |
165 | 204 |
166 | 205 |
167 class UpdateBuilders(webapp2.RequestHandler): | 206 class UpdateBuilders(webapp2.RequestHandler): |
168 """Fetch and update the cached buildbot data.""" | 207 """Fetch and update the cached buildbot data.""" |
(...skipping 25 matching lines...) Expand all Loading... | |
194 buildbot_data = fetch_buildbot_data(MASTERS, True) | 233 buildbot_data = fetch_buildbot_data(MASTERS, True) |
195 try: | 234 try: |
196 memcache.set('buildbot_data', buildbot_data) | 235 memcache.set('buildbot_data', buildbot_data) |
197 except ValueError, err: | 236 except ValueError, err: |
198 logging.error(str(err)) | 237 logging.error(str(err)) |
199 | 238 |
200 if callback: | 239 if callback: |
201 buildbot_data = callback + '(' + buildbot_data + ');' | 240 buildbot_data = callback + '(' + buildbot_data + ');' |
202 | 241 |
203 self.response.out.write(buildbot_data) | 242 self.response.out.write(buildbot_data) |
OLD | NEW |