| OLD | NEW |
| (Empty) | |
| 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 |
| 3 # found in the LICENSE file. |
| 4 |
| 5 from datetime import datetime |
| 6 import mock |
| 7 |
| 8 from common import constants |
| 9 from model.flake.flake_analysis_request import BuildStep |
| 10 from model.flake.flake_analysis_request import FlakeAnalysisRequest |
| 11 from waterfall.flake import flake_analysis_service |
| 12 from waterfall.test import wf_testcase |
| 13 |
| 14 |
| 15 class FlakeAnalysisServiceTest(wf_testcase.WaterfallTestCase): |
| 16 |
| 17 def testCheckFlakeSwarmedAndSupportedWhenNotSupported(self): |
| 18 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 19 step1 = BuildStep.Create('m', 'b1', 10, 's', datetime(2016, 10, 01)) |
| 20 step1.swarmed = False |
| 21 step1.supported = False |
| 22 step2 = BuildStep.Create('m', 'b2', 10, 's', datetime(2016, 10, 01)) |
| 23 step2.swarmed = False |
| 24 step2.supported = False |
| 25 request.build_steps = [step1, step2] |
| 26 |
| 27 self.assertEqual( |
| 28 (False, False, None), |
| 29 flake_analysis_service._CheckFlakeSwarmedAndSupported(request)) |
| 30 |
| 31 |
| 32 def testNeedNewAnalysisWhenNoPreviousOneAndNotStepLevelFlake(self): |
| 33 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 34 step1 = BuildStep.Create('m', 'b1', 10, 's', datetime(2016, 10, 01)) |
| 35 step1.swarmed = False |
| 36 step1.supported = False |
| 37 step2 = BuildStep.Create('m', 'b2', 10, 's', datetime(2016, 10, 01)) |
| 38 step2.swarmed = True |
| 39 step2.supported = True |
| 40 request.build_steps = [step1, step2] |
| 41 |
| 42 version, step = flake_analysis_service._CheckForNewAnalysis(request) |
| 43 |
| 44 self.assertEqual(1, version) |
| 45 self.assertIsNotNone(step) |
| 46 self.assertTrue(step.scheduled) |
| 47 |
| 48 def testNeedNewAnalysisWhenPreviousOneWasForAnotherBug(self): |
| 49 previous_request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 50 previous_request.Save() |
| 51 |
| 52 request = FlakeAnalysisRequest.Create('flake', False, 456) |
| 53 step1 = BuildStep.Create('m', 'b1', 10, 's', datetime(2016, 10, 01)) |
| 54 step1.swarmed = False |
| 55 step1.supported = False |
| 56 step2 = BuildStep.Create('m', 'b2', 10, 's', datetime(2016, 10, 01)) |
| 57 step2.swarmed = True |
| 58 step2.supported = True |
| 59 request.build_steps = [step1, step2] |
| 60 |
| 61 version, step = flake_analysis_service._CheckForNewAnalysis(request) |
| 62 |
| 63 self.assertEqual(2, version) |
| 64 self.assertIsNotNone(step) |
| 65 self.assertTrue(step.scheduled) |
| 66 self.assertTrue(step.swarmed) |
| 67 self.assertTrue(step.supported) |
| 68 |
| 69 def testNotNeedNewAnalysisForStepLevelFlake(self): |
| 70 request = FlakeAnalysisRequest.Create('flake', True, 123) |
| 71 step1 = BuildStep.Create('m', 'b1', 10, 's', datetime(2016, 10, 01)) |
| 72 step1.swarmed = True |
| 73 step1.supported = True |
| 74 request.build_steps = [step1] |
| 75 |
| 76 version, step = flake_analysis_service._CheckForNewAnalysis(request) |
| 77 |
| 78 self.assertEqual(0, version) |
| 79 self.assertIsNone(step) |
| 80 |
| 81 def testNeedNewAnalysisWithADifferentNewStep(self): |
| 82 previous_request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 83 step1 = BuildStep.Create('m', 'b1', 11, 's', datetime(2016, 10, 01)) |
| 84 step1.swarmed = True |
| 85 step1.supported = True |
| 86 step1.scheduled = True |
| 87 step2 = BuildStep.Create('m', 'b2', 12, 's', datetime(2016, 10, 01)) |
| 88 step2.swarmed = True |
| 89 step2.supported = True |
| 90 step2.scheduled = False |
| 91 previous_request.supported = True |
| 92 previous_request.swarmed = True |
| 93 previous_request.build_steps = [step1, step2] |
| 94 previous_request.Save() |
| 95 |
| 96 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 97 step3 = BuildStep.Create('m', 'b3', 13, 's', datetime(2016, 10, 01)) |
| 98 step3.swarmed = True |
| 99 step3.supported = True |
| 100 request.build_steps = [step3] |
| 101 |
| 102 version, step = flake_analysis_service._CheckForNewAnalysis(request) |
| 103 |
| 104 self.assertEqual(1, version) |
| 105 self.assertIsNotNone(step) |
| 106 self.assertTrue(step.scheduled) |
| 107 self.assertEqual('b3', step.builder_name) |
| 108 |
| 109 def testNeedNewAnalysisWithADifferentFormerReportedStep(self): |
| 110 previous_request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 111 step1 = BuildStep.Create('m', 'b1', 11, 's', datetime(2016, 10, 01)) |
| 112 step1.swarmed = True |
| 113 step1.supported = True |
| 114 step1.scheduled = True |
| 115 step2 = BuildStep.Create('m', 'b2', 12, 's', datetime(2016, 10, 01)) |
| 116 step2.swarmed = True |
| 117 step2.supported = True |
| 118 step2.scheduled = False |
| 119 previous_request.supported = True |
| 120 previous_request.swarmed = True |
| 121 previous_request.build_steps = [step1, step2] |
| 122 previous_request.Save() |
| 123 |
| 124 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 125 step3 = BuildStep.Create('m', 'b3', 13, 's', datetime(2016, 10, 01)) |
| 126 step3.swarmed = False |
| 127 step3.supported = False |
| 128 request.build_steps = [step3] |
| 129 |
| 130 version, step = flake_analysis_service._CheckForNewAnalysis(request) |
| 131 |
| 132 self.assertEqual(1, version) |
| 133 self.assertIsNotNone(step) |
| 134 self.assertTrue(step.scheduled) |
| 135 self.assertEqual('b2', step.builder_name) |
| 136 |
| 137 def testNotNeedNewAnalysisWithFreshEnoughPreviousAnalysis(self): |
| 138 previous_request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 139 step1 = BuildStep.Create('m', 'b1', 11, 's', datetime(2016, 10, 01)) |
| 140 step1.swarmed = True |
| 141 step1.supported = True |
| 142 step1.scheduled = True |
| 143 step2 = BuildStep.Create('m', 'b2', 12, 's', datetime(2016, 10, 01)) |
| 144 step2.swarmed = True |
| 145 step2.supported = True |
| 146 step2.scheduled = True |
| 147 previous_request.supported = True |
| 148 previous_request.swarmed = True |
| 149 previous_request.build_steps = [step1, step2] |
| 150 previous_request.Save() |
| 151 |
| 152 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 153 step3 = BuildStep.Create('m', 'b2', 20, 's', datetime(2016, 10, 03)) |
| 154 step3.swarmed = True |
| 155 step3.supported = True |
| 156 request.build_steps = [step3] |
| 157 |
| 158 version, step = flake_analysis_service._CheckForNewAnalysis(request) |
| 159 |
| 160 self.assertEqual(0, version) |
| 161 self.assertIsNone(step) |
| 162 |
| 163 def testNeedNewAnalysisWithTooOldPreviousAnalysis(self): |
| 164 previous_request = FlakeAnalysisRequest.Create('flake', False, None) |
| 165 step1 = BuildStep.Create('m', 'b1', 11, 's', datetime(2016, 10, 01)) |
| 166 step1.swarmed = True |
| 167 step1.supported = True |
| 168 step1.scheduled = True |
| 169 step2 = BuildStep.Create('m', 'b2', 12, 's', datetime(2016, 10, 01)) |
| 170 step2.swarmed = True |
| 171 step2.supported = True |
| 172 step2.scheduled = True |
| 173 previous_request.supported = True |
| 174 previous_request.swarmed = True |
| 175 previous_request.build_steps = [step1, step2] |
| 176 previous_request.Save() |
| 177 |
| 178 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 179 step3 = BuildStep.Create('m', 'b2', 80, 's', datetime(2016, 10, 20)) |
| 180 step3.swarmed = True |
| 181 step3.supported = True |
| 182 request.build_steps = [step3] |
| 183 |
| 184 version, step = flake_analysis_service._CheckForNewAnalysis(request) |
| 185 |
| 186 self.assertEqual(1, version) |
| 187 self.assertIsNotNone(step) |
| 188 self.assertEqual(80, step.build_number) |
| 189 |
| 190 def testUnauthorizedAccess(self): |
| 191 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 192 step = BuildStep.Create('m', 'b2', 80, 's', datetime(2016, 10, 20)) |
| 193 request.build_steps = [step] |
| 194 |
| 195 self.assertIsNone(flake_analysis_service.ScheduleAnalysisForFlake( |
| 196 request, 'test@chromium.org', False)) |
| 197 |
| 198 @mock.patch.object( |
| 199 flake_analysis_service, '_CheckForNewAnalysis', return_value= (0, None)) |
| 200 @mock.patch.object( |
| 201 flake_analysis_service.step_mapper, 'FindMatchingWaterfallStep') |
| 202 def testAuthorizedAccessButNoNewAnalysisNeeded(self, _mock1, _mock2): |
| 203 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 204 step = BuildStep.Create('m', 'b2', 80, 's', datetime(2016, 10, 20)) |
| 205 request.build_steps = [step] |
| 206 |
| 207 self.assertFalse(flake_analysis_service.ScheduleAnalysisForFlake( |
| 208 request, 'test@chromium.org', True)) |
| 209 |
| 210 @mock.patch.object( |
| 211 flake_analysis_service.step_mapper, 'FindMatchingWaterfallStep') |
| 212 def testAuthorizedAccessAndNewAnalysisNeededAndTriggered(self, _mock): |
| 213 step = BuildStep.Create('m', 'b', 80, 's', datetime(2016, 10, 20)) |
| 214 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 215 request.build_steps = [step] |
| 216 |
| 217 def CheckForNewAnalysis(*_): |
| 218 step.wf_master_name = 'wf_m' |
| 219 step.wf_builder_name = 'wf_b' |
| 220 step.wf_build_number = 100 |
| 221 step.wf_step_name = 'wf_s' |
| 222 return 1, step |
| 223 |
| 224 mocked_analysis = mock.Mock(key='key') |
| 225 mocked_request = mock.Mock() |
| 226 |
| 227 with mock.patch.object( |
| 228 flake_analysis_service, '_CheckForNewAnalysis', |
| 229 side_effect=CheckForNewAnalysis) as ( |
| 230 mocked_CheckForNewAnalysis), mock.patch.object( |
| 231 flake_analysis_service.initialize_flake_pipeline, |
| 232 'ScheduleAnalysisIfNeeded', return_value=mocked_analysis) as ( |
| 233 mocked_ScheduleAnalysisIfNeeded), mock.patch.object( |
| 234 flake_analysis_service.FlakeAnalysisRequest, |
| 235 'GetVersion', return_value=mocked_request) as mocked_GetVersion: |
| 236 self.assertTrue(flake_analysis_service.ScheduleAnalysisForFlake( |
| 237 request, 'test@chromium.org', True)) |
| 238 mocked_CheckForNewAnalysis.assert_called_once_with(request) |
| 239 mocked_ScheduleAnalysisIfNeeded.assert_called_once_with( |
| 240 'wf_m', 'wf_b', 100, 'wf_s', 'flake', |
| 241 allow_new_analysis=True, manually_triggered=False, |
| 242 queue_name=constants.WATERFALL_ANALYSIS_QUEUE) |
| 243 mocked_GetVersion.assert_called_once_with(key='flake', version=1) |
| 244 mocked_request.assert_has_calls([ |
| 245 mock.call.analyses.append('key'), |
| 246 mock.call.put(), |
| 247 ]) |
| 248 |
| 249 @mock.patch.object( |
| 250 flake_analysis_service.step_mapper, 'FindMatchingWaterfallStep') |
| 251 def testAuthorizedAccessAndNewAnalysisNeededButNotTriggered(self, _mock): |
| 252 step = BuildStep.Create('m', 'b', 80, 's', datetime(2016, 10, 20)) |
| 253 request = FlakeAnalysisRequest.Create('flake', False, 123) |
| 254 request.build_steps = [step] |
| 255 |
| 256 def CheckForNewAnalysis(*_): |
| 257 step.wf_master_name = 'wf_m' |
| 258 step.wf_builder_name = 'wf_b' |
| 259 step.wf_build_number = 100 |
| 260 step.wf_step_name = 'wf_s' |
| 261 return 1, step |
| 262 |
| 263 with mock.patch.object( |
| 264 flake_analysis_service, '_CheckForNewAnalysis', |
| 265 side_effect=CheckForNewAnalysis) as ( |
| 266 mocked_CheckForNewAnalysis), mock.patch.object( |
| 267 flake_analysis_service.initialize_flake_pipeline, |
| 268 'ScheduleAnalysisIfNeeded', return_value=None) as ( |
| 269 mocked_ScheduleAnalysisIfNeeded), mock.patch.object( |
| 270 flake_analysis_service.FlakeAnalysisRequest, |
| 271 'GetVersion', return_value=None) as mocked_GetVersion: |
| 272 self.assertFalse(flake_analysis_service.ScheduleAnalysisForFlake( |
| 273 request, 'test@chromium.org', True)) |
| 274 mocked_CheckForNewAnalysis.assert_called_once_with(request) |
| 275 mocked_ScheduleAnalysisIfNeeded.assert_called_once_with( |
| 276 'wf_m', 'wf_b', 100, 'wf_s', 'flake', |
| 277 allow_new_analysis=True, manually_triggered=False, |
| 278 queue_name=constants.WATERFALL_ANALYSIS_QUEUE) |
| 279 mocked_GetVersion.assert_not_called() |
| OLD | NEW |