OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 os | 5 import os |
6 import re | 6 import re |
7 | 7 |
8 from google.appengine.ext import testbed | 8 from google.appengine.ext import testbed |
| 9 |
9 import webapp2 | 10 import webapp2 |
10 import webtest | 11 import webtest |
11 | 12 |
12 from testing_utils import testing | |
13 | |
14 from handlers import build_failure | 13 from handlers import build_failure |
15 from handlers import handlers_util | 14 from handlers import handlers_util |
16 from handlers import result_status | 15 from handlers import result_status |
17 from model.wf_analysis import WfAnalysis | 16 from model.wf_analysis import WfAnalysis |
18 from model import wf_analysis_status | 17 from model import wf_analysis_status |
| 18 from model.wf_analysis import WfAnalysis |
19 from waterfall import buildbot | 19 from waterfall import buildbot |
20 from waterfall import waterfall_config | 20 from waterfall.test import wf_testcase |
21 | |
22 | 21 |
23 # Root directory appengine/findit. | 22 # Root directory appengine/findit. |
24 ROOT_DIR = os.path.join(os.path.dirname(__file__), | 23 ROOT_DIR = os.path.join(os.path.dirname(__file__), |
25 os.path.pardir, os.path.pardir) | 24 os.path.pardir, os.path.pardir) |
26 | 25 |
27 SAMPLE_TRY_JOB_INFO = { | 26 SAMPLE_TRY_JOB_INFO = { |
28 'm/b/119': { | 27 'm/b/119': { |
29 'step1 on platform':{ | 28 'step1 on platform':{ |
30 'try_jobs': [ | 29 'try_jobs': [ |
31 { | 30 { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 'commit_position': '2', | 92 'commit_position': '2', |
94 'review_url': 'url_2' | 93 'review_url': 'url_2' |
95 } | 94 } |
96 } | 95 } |
97 ] | 96 ] |
98 } | 97 } |
99 } | 98 } |
100 } | 99 } |
101 | 100 |
102 | 101 |
103 class BuildFailureTest(testing.AppengineTestCase): | 102 class BuildFailureTest(wf_testcase.WaterfallTestCase): |
104 app_module = webapp2.WSGIApplication([ | 103 app_module = webapp2.WSGIApplication([ |
105 ('/build-failure', build_failure.BuildFailure), | 104 ('/build-failure', build_failure.BuildFailure), |
106 ], debug=True) | 105 ], debug=True) |
107 | 106 |
108 def setUp(self): | 107 def setUp(self): |
109 super(BuildFailureTest, self).setUp() | 108 super(BuildFailureTest, self).setUp() |
110 | 109 |
111 # Setup clean task queues. | 110 # Setup clean task queues. |
112 self.testbed.init_taskqueue_stub(root_path=ROOT_DIR) | 111 self.testbed.init_taskqueue_stub(root_path=ROOT_DIR) |
113 self.taskqueue_stub = self.testbed.get_stub(testbed.TASKQUEUE_SERVICE_NAME) | 112 self.taskqueue_stub = self.testbed.get_stub(testbed.TASKQUEUE_SERVICE_NAME) |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 def testInvalidBuildUrl(self): | 148 def testInvalidBuildUrl(self): |
150 build_url = 'abc' | 149 build_url = 'abc' |
151 self.assertRaisesRegexp( | 150 self.assertRaisesRegexp( |
152 webtest.app.AppError, | 151 webtest.app.AppError, |
153 re.compile('.*501 Not Implemented.*Url "%s" ' | 152 re.compile('.*501 Not Implemented.*Url "%s" ' |
154 'is not pointing to a build.*' % build_url, | 153 'is not pointing to a build.*' % build_url, |
155 re.MULTILINE | re.DOTALL), | 154 re.MULTILINE | re.DOTALL), |
156 self.test_app.get, '/build-failure', params={'url': build_url}) | 155 self.test_app.get, '/build-failure', params={'url': build_url}) |
157 | 156 |
158 def testNonAdminCanViewAnalysisOfFailureOnUnsupportedMaster(self): | 157 def testNonAdminCanViewAnalysisOfFailureOnUnsupportedMaster(self): |
159 master_name = 'm' | 158 master_name = 'm2' |
160 builder_name = 'b 1' | 159 builder_name = 'b 1' |
161 build_number = 123 | 160 build_number = 123 |
162 build_url = buildbot.CreateBuildUrl( | 161 build_url = buildbot.CreateBuildUrl( |
163 master_name, builder_name, build_number) | 162 master_name, builder_name, build_number) |
164 | 163 |
165 def MockMasterIsSupported(*_): | |
166 return False | |
167 self.mock(waterfall_config, 'MasterIsSupported', | |
168 MockMasterIsSupported) | |
169 | |
170 analysis = WfAnalysis.Create(master_name, builder_name, build_number) | 164 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
171 analysis.status = wf_analysis_status.ANALYZED | 165 analysis.status = wf_analysis_status.ANALYZED |
172 analysis.put() | 166 analysis.put() |
173 | 167 |
174 response = self.test_app.get('/build-failure', | 168 response = self.test_app.get('/build-failure', |
175 params={'url': build_url}) | 169 params={'url': build_url}) |
176 self.assertEquals(200, response.status_int) | 170 self.assertEquals(200, response.status_int) |
177 self.assertEqual(0, len(self.taskqueue_stub.get_filtered_tasks())) | 171 self.assertEqual(0, len(self.taskqueue_stub.get_filtered_tasks())) |
178 | 172 |
179 def testNonAdminCannotRequestAnalysisOfFailureOnUnsupportedMaster(self): | 173 def testNonAdminCannotRequestAnalysisOfFailureOnUnsupportedMaster(self): |
180 master_name = 'm' | 174 master_name = 'm2' |
181 builder_name = 'b 1' | 175 builder_name = 'b 1' |
182 build_number = 123 | 176 build_number = 123 |
183 build_url = buildbot.CreateBuildUrl( | 177 build_url = buildbot.CreateBuildUrl( |
184 master_name, builder_name, build_number) | 178 master_name, builder_name, build_number) |
185 | 179 |
186 def MockMasterIsSupported(*_): | |
187 return False | |
188 self.mock(waterfall_config, 'MasterIsSupported', MockMasterIsSupported) | |
189 | |
190 self.assertRaisesRegexp( | 180 self.assertRaisesRegexp( |
191 webtest.app.AppError, | 181 webtest.app.AppError, |
192 re.compile('.*501 Not Implemented.*Master "%s" ' | 182 re.compile('.*501 Not Implemented.*Master "%s" ' |
193 'is not supported yet.*' % master_name, | 183 'is not supported yet.*' % master_name, |
194 re.MULTILINE | re.DOTALL), | 184 re.MULTILINE | re.DOTALL), |
195 self.test_app.get, '/build-failure', params={'url': build_url}) | 185 self.test_app.get, '/build-failure', params={'url': build_url}) |
196 | 186 |
197 def testAdminCanRequestAnalysisOfFailureOnUnsupportedMaster(self): | 187 def testAdminCanRequestAnalysisOfFailureOnUnsupportedMaster(self): |
198 master_name = 'm' | 188 master_name = 'm2' |
199 builder_name = 'b' | 189 builder_name = 'b' |
200 build_number = 123 | 190 build_number = 123 |
201 build_url = buildbot.CreateBuildUrl( | 191 build_url = buildbot.CreateBuildUrl( |
202 master_name, builder_name, build_number) | 192 master_name, builder_name, build_number) |
203 | 193 |
204 def MockMasterIsSupported(*_): | |
205 return False | |
206 self.mock(waterfall_config, 'MasterIsSupported', MockMasterIsSupported) | |
207 | |
208 self.mock_current_user(user_email='test@chromium.org', is_admin=True) | 194 self.mock_current_user(user_email='test@chromium.org', is_admin=True) |
209 | 195 |
210 response = self.test_app.get('/build-failure', params={'url': build_url}) | 196 response = self.test_app.get('/build-failure', params={'url': build_url}) |
211 self.assertEquals(200, response.status_int) | 197 self.assertEquals(200, response.status_int) |
212 | 198 |
213 self.assertEqual(1, len(self.taskqueue_stub.get_filtered_tasks())) | 199 self.assertEqual(1, len(self.taskqueue_stub.get_filtered_tasks())) |
214 | 200 |
215 def testAnyoneCanRequestAnalysisOfFailureOnSupportedMaster(self): | 201 def testAnyoneCanRequestAnalysisOfFailureOnSupportedMaster(self): |
216 master_name = 'm' | 202 master_name = 'm' |
217 builder_name = 'b 1' | 203 builder_name = 'b 1' |
218 build_number = 123 | 204 build_number = 123 |
219 build_url = buildbot.CreateBuildUrl( | 205 build_url = buildbot.CreateBuildUrl( |
220 master_name, builder_name, build_number) | 206 master_name, builder_name, build_number) |
221 | 207 |
222 def MockMasterIsSupported(*_): | |
223 return True | |
224 self.mock(waterfall_config, 'MasterIsSupported', MockMasterIsSupported) | |
225 | |
226 response = self.test_app.get('/build-failure', params={'url': build_url}) | 208 response = self.test_app.get('/build-failure', params={'url': build_url}) |
227 self.assertEquals(200, response.status_int) | 209 self.assertEquals(200, response.status_int) |
228 | 210 |
229 self.assertEqual(1, len(self.taskqueue_stub.get_filtered_tasks())) | 211 self.assertEqual(1, len(self.taskqueue_stub.get_filtered_tasks())) |
230 | 212 |
231 def testGetOrganizedAnalysisResultBySuspectedCLNonSwarming(self): | 213 def testGetOrganizedAnalysisResultBySuspectedCLNonSwarming(self): |
232 analysis_result = { | 214 analysis_result = { |
233 'failures': [ | 215 'failures': [ |
234 { | 216 { |
235 'step_name': 'a', | 217 'step_name': 'a', |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 'tests': [], | 609 'tests': [], |
628 'first_failure': 120, | 610 'first_failure': 120, |
629 'last_pass': 119, | 611 'last_pass': 119, |
630 'supported': True | 612 'supported': True |
631 } | 613 } |
632 ] | 614 ] |
633 } | 615 } |
634 } | 616 } |
635 } | 617 } |
636 self.assertEqual(expected_result, result) | 618 self.assertEqual(expected_result, result) |
OLD | NEW |