| 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 |