| OLD | NEW |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 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 from datetime import datetime | 5 from datetime import datetime |
| 6 import mock | 6 import mock |
| 7 | 7 |
| 8 from common import constants | 8 from common import constants |
| 9 from model.flake.flake_analysis_request import BuildStep | 9 from model.flake.flake_analysis_request import BuildStep |
| 10 from model.flake.flake_analysis_request import FlakeAnalysisRequest | 10 from model.flake.flake_analysis_request import FlakeAnalysisRequest |
| 11 from waterfall.flake import flake_analysis_service | 11 from waterfall.flake import flake_analysis_service |
| 12 from waterfall.flake import triggering_sources |
| 12 from waterfall.test import wf_testcase | 13 from waterfall.test import wf_testcase |
| 13 | 14 |
| 14 | 15 |
| 15 class FlakeAnalysisServiceTest(wf_testcase.WaterfallTestCase): | 16 class FlakeAnalysisServiceTest(wf_testcase.WaterfallTestCase): |
| 16 | 17 |
| 17 def testCheckFlakeSwarmedAndSupportedWhenNotSupported(self): | 18 def testCheckFlakeSwarmedAndSupportedWhenNotSupported(self): |
| 18 request = FlakeAnalysisRequest.Create('flake', False, 123) | 19 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 19 step1 = BuildStep.Create('m', 'b1', 10, 's', datetime(2016, 10, 01)) | 20 step1 = BuildStep.Create('m', 'b1', 10, 's', datetime(2016, 10, 01)) |
| 20 step1.swarmed = False | 21 step1.swarmed = False |
| 21 step1.supported = False | 22 step1.supported = False |
| 22 step2 = BuildStep.Create('m', 'b2', 10, 's', datetime(2016, 10, 01)) | 23 step2 = BuildStep.Create('m', 'b2', 10, 's', datetime(2016, 10, 01)) |
| 23 step2.swarmed = False | 24 step2.swarmed = False |
| 24 step2.supported = False | 25 step2.supported = False |
| 25 request.build_steps = [step1, step2] | 26 request.build_steps = [step1, step2] |
| 26 | 27 |
| 27 self.assertEqual( | 28 self.assertEqual( |
| 28 (False, False, None), | 29 (False, False, None), |
| 29 flake_analysis_service._CheckFlakeSwarmedAndSupported(request)) | 30 flake_analysis_service._CheckFlakeSwarmedAndSupported(request)) |
| 30 | 31 |
| 31 | |
| 32 def testNeedNewAnalysisWhenNoPreviousOneAndNotStepLevelFlake(self): | 32 def testNeedNewAnalysisWhenNoPreviousOneAndNotStepLevelFlake(self): |
| 33 request = FlakeAnalysisRequest.Create('flake', False, 123) | 33 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 34 step1 = BuildStep.Create('m', 'b1', 10, 's', datetime(2016, 10, 01)) | 34 step1 = BuildStep.Create('m', 'b1', 10, 's', datetime(2016, 10, 01)) |
| 35 step1.swarmed = False | 35 step1.swarmed = False |
| 36 step1.supported = False | 36 step1.supported = False |
| 37 step2 = BuildStep.Create('m', 'b2', 10, 's', datetime(2016, 10, 01)) | 37 step2 = BuildStep.Create('m', 'b2', 10, 's', datetime(2016, 10, 01)) |
| 38 step2.swarmed = True | 38 step2.swarmed = True |
| 39 step2.supported = True | 39 step2.supported = True |
| 40 request.build_steps = [step1, step2] | 40 request.build_steps = [step1, step2] |
| 41 | 41 |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 self.assertEqual(1, version) | 186 self.assertEqual(1, version) |
| 187 self.assertIsNotNone(step) | 187 self.assertIsNotNone(step) |
| 188 self.assertEqual(80, step.build_number) | 188 self.assertEqual(80, step.build_number) |
| 189 | 189 |
| 190 def testUnauthorizedAccess(self): | 190 def testUnauthorizedAccess(self): |
| 191 request = FlakeAnalysisRequest.Create('flake', False, 123) | 191 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 192 step = BuildStep.Create('m', 'b2', 80, 's', datetime(2016, 10, 20)) | 192 step = BuildStep.Create('m', 'b2', 80, 's', datetime(2016, 10, 20)) |
| 193 request.build_steps = [step] | 193 request.build_steps = [step] |
| 194 | 194 |
| 195 self.assertIsNone(flake_analysis_service.ScheduleAnalysisForFlake( | 195 self.assertIsNone(flake_analysis_service.ScheduleAnalysisForFlake( |
| 196 request, 'test@chromium.org', False)) | 196 request, 'test@chromium.org', False, triggering_sources.FINDIT_UI)) |
| 197 | 197 |
| 198 @mock.patch.object( | 198 @mock.patch.object( |
| 199 flake_analysis_service, '_CheckForNewAnalysis', return_value= (0, None)) | 199 flake_analysis_service, '_CheckForNewAnalysis', return_value=(0, None)) |
| 200 @mock.patch.object( | 200 @mock.patch.object( |
| 201 flake_analysis_service.step_mapper, 'FindMatchingWaterfallStep') | 201 flake_analysis_service.step_mapper, 'FindMatchingWaterfallStep') |
| 202 def testAuthorizedAccessButNoNewAnalysisNeeded(self, _mock1, _mock2): | 202 def testAuthorizedAccessButNoNewAnalysisNeeded(self, _mock1, _mock2): |
| 203 request = FlakeAnalysisRequest.Create('flake', False, 123) | 203 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 204 step = BuildStep.Create('m', 'b2', 80, 's', datetime(2016, 10, 20)) | 204 step = BuildStep.Create('m', 'b2', 80, 's', datetime(2016, 10, 20)) |
| 205 request.build_steps = [step] | 205 request.build_steps = [step] |
| 206 | 206 |
| 207 self.assertFalse(flake_analysis_service.ScheduleAnalysisForFlake( | 207 self.assertFalse(flake_analysis_service.ScheduleAnalysisForFlake( |
| 208 request, 'test@chromium.org', True)) | 208 request, 'test@chromium.org', True, triggering_sources.FINDIT_UI)) |
| 209 | 209 |
| 210 @mock.patch.object( | 210 @mock.patch.object( |
| 211 flake_analysis_service.step_mapper, 'FindMatchingWaterfallStep') | 211 flake_analysis_service.step_mapper, 'FindMatchingWaterfallStep') |
| 212 def testAuthorizedAccessAndNewAnalysisNeededAndTriggered(self, _mock): | 212 def testAuthorizedAccessAndNewAnalysisNeededAndTriggered(self, _mock): |
| 213 step = BuildStep.Create('m', 'b', 80, 's', datetime(2016, 10, 20)) | 213 step = BuildStep.Create('m', 'b', 80, 's', datetime(2016, 10, 20)) |
| 214 request = FlakeAnalysisRequest.Create('flake', False, 123) | 214 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 215 request.build_steps = [step] | 215 request.build_steps = [step] |
| 216 user_email = 'test@chromium.org' |
| 217 triggering_source = triggering_sources.FINDIT_UI |
| 216 | 218 |
| 217 def CheckForNewAnalysis(*_): | 219 def CheckForNewAnalysis(*_): |
| 218 step.wf_master_name = 'wf_m' | 220 step.wf_master_name = 'wf_m' |
| 219 step.wf_builder_name = 'wf_b' | 221 step.wf_builder_name = 'wf_b' |
| 220 step.wf_build_number = 100 | 222 step.wf_build_number = 100 |
| 221 step.wf_step_name = 'wf_s' | 223 step.wf_step_name = 'wf_s' |
| 222 return 1, step | 224 return 1, step |
| 223 | 225 |
| 224 mocked_analysis = mock.Mock(key='key') | 226 mocked_analysis = mock.Mock(key='key') |
| 225 mocked_request = mock.Mock() | 227 mocked_request = mock.Mock() |
| 226 | 228 |
| 227 with mock.patch.object( | 229 with mock.patch.object( |
| 228 flake_analysis_service, '_CheckForNewAnalysis', | 230 flake_analysis_service, '_CheckForNewAnalysis', |
| 229 side_effect=CheckForNewAnalysis) as ( | 231 side_effect=CheckForNewAnalysis) as ( |
| 230 mocked_CheckForNewAnalysis), mock.patch.object( | 232 mocked_CheckForNewAnalysis), mock.patch.object( |
| 231 flake_analysis_service.initialize_flake_pipeline, | 233 flake_analysis_service.initialize_flake_pipeline, |
| 232 'ScheduleAnalysisIfNeeded', return_value=mocked_analysis) as ( | 234 'ScheduleAnalysisIfNeeded', return_value=mocked_analysis) as ( |
| 233 mocked_ScheduleAnalysisIfNeeded), mock.patch.object( | 235 mocked_ScheduleAnalysisIfNeeded), mock.patch.object( |
| 234 flake_analysis_service.FlakeAnalysisRequest, | 236 flake_analysis_service.FlakeAnalysisRequest, |
| 235 'GetVersion', return_value=mocked_request) as mocked_GetVersion: | 237 'GetVersion', return_value=mocked_request) as ( |
| 238 mocked_GetVersion): |
| 236 self.assertTrue(flake_analysis_service.ScheduleAnalysisForFlake( | 239 self.assertTrue(flake_analysis_service.ScheduleAnalysisForFlake( |
| 237 request, 'test@chromium.org', True)) | 240 request, user_email, True, triggering_source)) |
| 238 mocked_CheckForNewAnalysis.assert_called_once_with(request) | 241 mocked_CheckForNewAnalysis.assert_called_once_with(request) |
| 239 mocked_ScheduleAnalysisIfNeeded.assert_called_once_with( | 242 mocked_ScheduleAnalysisIfNeeded.assert_called_once_with( |
| 240 'wf_m', 'wf_b', 100, 'wf_s', 'flake', | 243 'wf_m', 'wf_b', 100, 'wf_s', 'flake', |
| 241 allow_new_analysis=True, manually_triggered=False, | 244 allow_new_analysis=True, manually_triggered=False, |
| 245 user_email=user_email, triggering_source=triggering_source, |
| 242 queue_name=constants.WATERFALL_ANALYSIS_QUEUE) | 246 queue_name=constants.WATERFALL_ANALYSIS_QUEUE) |
| 243 mocked_GetVersion.assert_called_once_with(key='flake', version=1) | 247 mocked_GetVersion.assert_called_once_with(key='flake', version=1) |
| 244 mocked_request.assert_has_calls([ | 248 mocked_request.assert_has_calls([ |
| 245 mock.call.analyses.append('key'), | 249 mock.call.analyses.append('key'), |
| 246 mock.call.put(), | 250 mock.call.put(), |
| 247 ]) | 251 ]) |
| 248 | 252 |
| 249 @mock.patch.object( | 253 @mock.patch.object( |
| 250 flake_analysis_service.step_mapper, 'FindMatchingWaterfallStep') | 254 flake_analysis_service.step_mapper, 'FindMatchingWaterfallStep') |
| 251 def testAuthorizedAccessAndNewAnalysisNeededButNotTriggered(self, _mock): | 255 def testAuthorizedAccessAndNewAnalysisNeededButNotTriggered(self, _mock): |
| 252 step = BuildStep.Create('m', 'b', 80, 's', datetime(2016, 10, 20)) | 256 step = BuildStep.Create('m', 'b', 80, 's', datetime(2016, 10, 20)) |
| 253 request = FlakeAnalysisRequest.Create('flake', False, 123) | 257 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 254 request.build_steps = [step] | 258 request.build_steps = [step] |
| 259 user_email = 'test@chromium.org' |
| 260 triggering_source = triggering_sources.FINDIT_UI |
| 255 | 261 |
| 256 def CheckForNewAnalysis(*_): | 262 def CheckForNewAnalysis(*_): |
| 257 step.wf_master_name = 'wf_m' | 263 step.wf_master_name = 'wf_m' |
| 258 step.wf_builder_name = 'wf_b' | 264 step.wf_builder_name = 'wf_b' |
| 259 step.wf_build_number = 100 | 265 step.wf_build_number = 100 |
| 260 step.wf_step_name = 'wf_s' | 266 step.wf_step_name = 'wf_s' |
| 261 return 1, step | 267 return 1, step |
| 262 | 268 |
| 263 with mock.patch.object( | 269 with mock.patch.object( |
| 264 flake_analysis_service, '_CheckForNewAnalysis', | 270 flake_analysis_service, '_CheckForNewAnalysis', |
| 265 side_effect=CheckForNewAnalysis) as ( | 271 side_effect=CheckForNewAnalysis) as ( |
| 266 mocked_CheckForNewAnalysis), mock.patch.object( | 272 mocked_CheckForNewAnalysis), mock.patch.object( |
| 267 flake_analysis_service.initialize_flake_pipeline, | 273 flake_analysis_service.initialize_flake_pipeline, |
| 268 'ScheduleAnalysisIfNeeded', return_value=None) as ( | 274 'ScheduleAnalysisIfNeeded', return_value=None) as ( |
| 269 mocked_ScheduleAnalysisIfNeeded), mock.patch.object( | 275 mocked_ScheduleAnalysisIfNeeded), mock.patch.object( |
| 270 flake_analysis_service.FlakeAnalysisRequest, | 276 flake_analysis_service.FlakeAnalysisRequest, |
| 271 'GetVersion', return_value=None) as mocked_GetVersion: | 277 'GetVersion', return_value=None) as mocked_GetVersion: |
| 272 self.assertFalse(flake_analysis_service.ScheduleAnalysisForFlake( | 278 self.assertFalse(flake_analysis_service.ScheduleAnalysisForFlake( |
| 273 request, 'test@chromium.org', True)) | 279 request, user_email, True, triggering_sources.FINDIT_UI)) |
| 274 mocked_CheckForNewAnalysis.assert_called_once_with(request) | 280 mocked_CheckForNewAnalysis.assert_called_once_with(request) |
| 275 mocked_ScheduleAnalysisIfNeeded.assert_called_once_with( | 281 mocked_ScheduleAnalysisIfNeeded.assert_called_once_with( |
| 276 'wf_m', 'wf_b', 100, 'wf_s', 'flake', | 282 'wf_m', 'wf_b', 100, 'wf_s', 'flake', |
| 277 allow_new_analysis=True, manually_triggered=False, | 283 allow_new_analysis=True, manually_triggered=False, |
| 284 user_email=user_email, triggering_source=triggering_source, |
| 278 queue_name=constants.WATERFALL_ANALYSIS_QUEUE) | 285 queue_name=constants.WATERFALL_ANALYSIS_QUEUE) |
| 279 mocked_GetVersion.assert_not_called() | 286 mocked_GetVersion.assert_not_called() |
| OLD | NEW |