| 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 |
| 6 |
| 7 import pytz |
| 8 |
| 5 from common import constants | 9 from common import constants |
| 6 from common.pipeline_wrapper import pipeline_handlers | 10 from common.pipeline_wrapper import pipeline_handlers |
| 7 from model import analysis_status | 11 from model import analysis_status |
| 8 from model.flake.master_flake_analysis import MasterFlakeAnalysis | 12 from model.flake.master_flake_analysis import MasterFlakeAnalysis |
| 9 from model.flake.flake_swarming_task import FlakeSwarmingTask | 13 from model.flake.flake_swarming_task import FlakeSwarmingTask |
| 10 from waterfall.flake import recursive_flake_pipeline | 14 from waterfall.flake import recursive_flake_pipeline |
| 11 from waterfall.flake.recursive_flake_pipeline import get_next_run | 15 from waterfall.flake.recursive_flake_pipeline import get_next_run |
| 12 from waterfall.flake.recursive_flake_pipeline import NextBuildNumberPipeline | 16 from waterfall.flake.recursive_flake_pipeline import NextBuildNumberPipeline |
| 13 from waterfall.flake.recursive_flake_pipeline import RecursiveFlakePipeline | 17 from waterfall.flake.recursive_flake_pipeline import RecursiveFlakePipeline |
| 14 from waterfall.flake.recursive_flake_pipeline import sequential_next_run | 18 from waterfall.flake.recursive_flake_pipeline import sequential_next_run |
| (...skipping 12 matching lines...) Expand all Loading... |
| 27 analysis.put() | 31 analysis.put() |
| 28 | 32 |
| 29 def _CreateAndSaveFlakeSwarmingTask( | 33 def _CreateAndSaveFlakeSwarmingTask( |
| 30 self, master_name, builder_name, build_number, | 34 self, master_name, builder_name, build_number, |
| 31 step_name, test_name, status): | 35 step_name, test_name, status): |
| 32 flake_swarming_task = FlakeSwarmingTask.Create( | 36 flake_swarming_task = FlakeSwarmingTask.Create( |
| 33 master_name, builder_name, build_number, step_name, test_name) | 37 master_name, builder_name, build_number, step_name, test_name) |
| 34 flake_swarming_task.status = status | 38 flake_swarming_task.status = status |
| 35 flake_swarming_task.put() | 39 flake_swarming_task.put() |
| 36 | 40 |
| 41 def testGetETAToStartAnalysisWhenManuallyTriggered(self): |
| 42 mocked_utcnow = datetime.utcnow() |
| 43 self.MockUTCNow(mocked_utcnow) |
| 44 self.assertEqual(mocked_utcnow, |
| 45 recursive_flake_pipeline._GetETAToStartAnalysis(True)) |
| 46 |
| 47 def testGetETAToStartAnalysisWhenTriggeredOnPSTWeekend(self): |
| 48 # Sunday 1pm in PST. |
| 49 mocked_utcnow = datetime(2016, 9, 04, 20, 0, 0, 0, pytz.utc) |
| 50 self.MockUTCNow(mocked_utcnow) |
| 51 self.MockUTCNowWithTimezone(mocked_utcnow) |
| 52 self.assertEqual(mocked_utcnow, |
| 53 recursive_flake_pipeline._GetETAToStartAnalysis(False)) |
| 54 |
| 55 def testGetETAToStartAnalysisWhenTriggeredOffPeakHoursOnPSTWeekday(self): |
| 56 # Tuesday 1am in PST. |
| 57 mocked_utcnow = datetime(2016, 9, 20, 8, 0, 0, 0, pytz.utc) |
| 58 self.MockUTCNow(mocked_utcnow) |
| 59 self.MockUTCNowWithTimezone(mocked_utcnow) |
| 60 self.assertEqual(mocked_utcnow, |
| 61 recursive_flake_pipeline._GetETAToStartAnalysis(False)) |
| 62 |
| 63 def testGetETAToStartAnalysisWhenTriggeredInPeakHoursOnPSTWeekday(self): |
| 64 # Tuesday 1pm in PST. |
| 65 mocked_utcnow = datetime(2016, 9, 20, 20, 0, 0, 0, pytz.utc) |
| 66 self.MockUTCNow(mocked_utcnow) |
| 67 self.MockUTCNowWithTimezone(mocked_utcnow) |
| 68 eta = recursive_flake_pipeline._GetETAToStartAnalysis(False) |
| 69 self.assertEqual(2016, eta.year) |
| 70 self.assertEqual(9, eta.month) |
| 71 self.assertEqual(21, eta.day) |
| 72 self.assertEqual(1, eta.hour) |
| 73 seconds = eta.minute * 60 + eta.second |
| 74 self.assertTrue(seconds >= 0 and seconds <= 30 * 60) |
| 75 |
| 37 def testRecursiveFlakePipeline(self): | 76 def testRecursiveFlakePipeline(self): |
| 38 master_name = 'm' | 77 master_name = 'm' |
| 39 builder_name = 'b' | 78 builder_name = 'b' |
| 40 master_build_number = 100 | 79 master_build_number = 100 |
| 41 build_number = 100 | 80 build_number = 100 |
| 42 run_build_number = 100 | 81 run_build_number = 100 |
| 43 step_name = 's' | 82 step_name = 's' |
| 44 test_name = 't' | 83 test_name = 't' |
| 45 test_result_future = 'test_result_future' | 84 test_result_future = 'test_result_future' |
| 46 queue_name = constants.DEFAULT_QUEUE | 85 queue_name = constants.DEFAULT_QUEUE |
| (...skipping 30 matching lines...) Expand all Loading... |
| 77 expected_args=[master_name, builder_name, | 116 expected_args=[master_name, builder_name, |
| 78 run_build_number, step_name, task_id, | 117 run_build_number, step_name, task_id, |
| 79 master_build_number, test_name], | 118 master_build_number, test_name], |
| 80 expected_kwargs={}) | 119 expected_kwargs={}) |
| 81 | 120 |
| 82 self.MockPipeline( | 121 self.MockPipeline( |
| 83 recursive_flake_pipeline.NextBuildNumberPipeline, | 122 recursive_flake_pipeline.NextBuildNumberPipeline, |
| 84 '', | 123 '', |
| 85 expected_args=[master_name, builder_name, master_build_number, | 124 expected_args=[master_name, builder_name, master_build_number, |
| 86 build_number, step_name, test_name, | 125 build_number, step_name, test_name, |
| 87 test_result_future, queue_name, | 126 test_result_future, flakiness_algorithm_results_dict], |
| 88 flakiness_algorithm_results_dict], | 127 expected_kwargs={'manually_triggered': False}) |
| 89 expected_kwargs={}) | |
| 90 | 128 |
| 91 rfp = RecursiveFlakePipeline(master_name, builder_name, build_number, | 129 rfp = RecursiveFlakePipeline(master_name, builder_name, build_number, |
| 92 step_name, test_name, master_build_number, | 130 step_name, test_name, master_build_number, |
| 93 flakiness_algorithm_results_dict= | 131 flakiness_algorithm_results_dict= |
| 94 flakiness_algorithm_results_dict, | 132 flakiness_algorithm_results_dict) |
| 95 queue_name=queue_name) | |
| 96 | 133 |
| 97 rfp.start(queue_name=queue_name) | 134 rfp.start(queue_name=queue_name) |
| 98 self.execute_queued_tasks() | 135 self.execute_queued_tasks() |
| 99 | 136 |
| 100 def testNextBuildPipelineForNewRecursionFirstFlake(self): | 137 def testNextBuildPipelineForNewRecursionFirstFlake(self): |
| 101 master_name = 'm' | 138 master_name = 'm' |
| 102 builder_name = 'b' | 139 builder_name = 'b' |
| 103 master_build_number = 100 | 140 master_build_number = 100 |
| 104 build_number = 100 | 141 build_number = 100 |
| 105 step_name = 's' | 142 step_name = 's' |
| 106 test_name = 't' | 143 test_name = 't' |
| 107 test_result_future = 'trf' | 144 test_result_future = 'trf' |
| 108 queue_name = constants.DEFAULT_QUEUE | |
| 109 flakiness_algorithm_results_dict = { | 145 flakiness_algorithm_results_dict = { |
| 110 'flakes_in_a_row': 0, | 146 'flakes_in_a_row': 0, |
| 111 'stable_in_a_row': 0, | 147 'stable_in_a_row': 0, |
| 112 'stabled_out': False, | 148 'stabled_out': False, |
| 113 'flaked_out': False, | 149 'flaked_out': False, |
| 114 'last_build_number': 0, | 150 'last_build_number': 0, |
| 115 'lower_boundary': None, | 151 'lower_boundary': None, |
| 116 'upper_boundary': None, | 152 'upper_boundary': None, |
| 117 'lower_boundary_result': None, | 153 'lower_boundary_result': None, |
| 118 'sequential_run_index': 0 | 154 'sequential_run_index': 0 |
| 119 | 155 |
| 120 } | 156 } |
| 121 self._CreateAndSaveMasterFlakeAnalysis( | 157 self._CreateAndSaveMasterFlakeAnalysis( |
| 122 master_name, builder_name, build_number, step_name, | 158 master_name, builder_name, build_number, step_name, |
| 123 test_name, status=analysis_status.PENDING | 159 test_name, status=analysis_status.PENDING |
| 124 ) | 160 ) |
| 125 self._CreateAndSaveFlakeSwarmingTask( | 161 self._CreateAndSaveFlakeSwarmingTask( |
| 126 master_name, builder_name, build_number, step_name, | 162 master_name, builder_name, build_number, step_name, |
| 127 test_name, status=analysis_status.COMPLETED | 163 test_name, status=analysis_status.COMPLETED |
| 128 ) | 164 ) |
| 129 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 165 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| 130 build_number, step_name, test_name) | 166 build_number, step_name, test_name) |
| 131 analysis.success_rates.append(.08) | 167 analysis.success_rates.append(.08) |
| 132 analysis.build_numbers.append(100) | 168 analysis.build_numbers.append(100) |
| 133 analysis.put() | 169 analysis.put() |
| 134 | 170 |
| 135 NextBuildNumberPipeline.run( | 171 NextBuildNumberPipeline.run( |
| 136 NextBuildNumberPipeline(), master_name, builder_name, | 172 NextBuildNumberPipeline(), master_name, builder_name, |
| 137 master_build_number, build_number, step_name, test_name, | 173 master_build_number, build_number, step_name, test_name, |
| 138 test_result_future, queue_name, flakiness_algorithm_results_dict) | 174 test_result_future, flakiness_algorithm_results_dict) |
| 139 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) | 175 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) |
| 140 | 176 |
| 141 def testNextBuildPipelineForNewRecursionFirstStable(self): | 177 def testNextBuildPipelineForNewRecursionFirstStable(self): |
| 142 master_name = 'm' | 178 master_name = 'm' |
| 143 builder_name = 'b' | 179 builder_name = 'b' |
| 144 master_build_number = 100 | 180 master_build_number = 100 |
| 145 build_number = 100 | 181 build_number = 100 |
| 146 step_name = 's' | 182 step_name = 's' |
| 147 test_name = 't' | 183 test_name = 't' |
| 148 test_result_future = 'trf' | 184 test_result_future = 'trf' |
| 149 queue_name = constants.DEFAULT_QUEUE | |
| 150 flakiness_algorithm_results_dict = { | 185 flakiness_algorithm_results_dict = { |
| 151 'flakes_in_a_row': 0, | 186 'flakes_in_a_row': 0, |
| 152 'stable_in_a_row': 0, | 187 'stable_in_a_row': 0, |
| 153 'stabled_out': False, | 188 'stabled_out': False, |
| 154 'flaked_out': False, | 189 'flaked_out': False, |
| 155 'last_build_number': 0, | 190 'last_build_number': 0, |
| 156 'lower_boundary': None, | 191 'lower_boundary': None, |
| 157 'upper_boundary': None, | 192 'upper_boundary': None, |
| 158 'lower_boundary_result': None, | 193 'lower_boundary_result': None, |
| 159 'sequential_run_index': 0 | 194 'sequential_run_index': 0 |
| 160 | |
| 161 } | 195 } |
| 162 self._CreateAndSaveMasterFlakeAnalysis( | 196 self._CreateAndSaveMasterFlakeAnalysis( |
| 163 master_name, builder_name, build_number, step_name, | 197 master_name, builder_name, build_number, step_name, |
| 164 test_name, status=analysis_status.PENDING | 198 test_name, status=analysis_status.PENDING |
| 165 ) | 199 ) |
| 166 self._CreateAndSaveFlakeSwarmingTask( | 200 self._CreateAndSaveFlakeSwarmingTask( |
| 167 master_name, builder_name, build_number, step_name, | 201 master_name, builder_name, build_number, step_name, |
| 168 test_name, status=analysis_status.COMPLETED | 202 test_name, status=analysis_status.COMPLETED |
| 169 ) | 203 ) |
| 170 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 204 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| 171 build_number, step_name, test_name) | 205 build_number, step_name, test_name) |
| 172 analysis.success_rates.append(0) | 206 analysis.success_rates.append(0) |
| 173 analysis.build_numbers.append(100) | 207 analysis.build_numbers.append(100) |
| 174 analysis.put() | 208 analysis.put() |
| 175 | 209 |
| 176 NextBuildNumberPipeline.run( | 210 NextBuildNumberPipeline.run( |
| 177 NextBuildNumberPipeline(), master_name, builder_name, | 211 NextBuildNumberPipeline(), master_name, builder_name, |
| 178 master_build_number, build_number, step_name, | 212 master_build_number, build_number, step_name, |
| 179 test_name, test_result_future, queue_name, | 213 test_name, test_result_future, |
| 180 flakiness_algorithm_results_dict) | 214 flakiness_algorithm_results_dict) |
| 181 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) | 215 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) |
| 182 | 216 |
| 183 def testNextBuildPipelineForNewRecursionFlakeInARow(self): | 217 def testNextBuildPipelineForNewRecursionFlakeInARow(self): |
| 184 master_name = 'm' | 218 master_name = 'm' |
| 185 builder_name = 'b' | 219 builder_name = 'b' |
| 186 master_build_number = 100 | 220 master_build_number = 100 |
| 187 build_number = 100 | 221 build_number = 100 |
| 188 step_name = 's' | 222 step_name = 's' |
| 189 test_name = 't' | 223 test_name = 't' |
| 190 test_result_future = 'trf' | 224 test_result_future = 'trf' |
| 191 queue_name = constants.DEFAULT_QUEUE | |
| 192 flakiness_algorithm_results_dict = { | 225 flakiness_algorithm_results_dict = { |
| 193 'flakes_in_a_row': 0, | 226 'flakes_in_a_row': 0, |
| 194 'stable_in_a_row': 4, | 227 'stable_in_a_row': 4, |
| 195 'stabled_out': False, | 228 'stabled_out': False, |
| 196 'flaked_out': False, | 229 'flaked_out': False, |
| 197 'last_build_number': 0, | 230 'last_build_number': 0, |
| 198 'lower_boundary': None, | 231 'lower_boundary': None, |
| 199 'upper_boundary': None, | 232 'upper_boundary': None, |
| 200 'lower_boundary_result': None, | 233 'lower_boundary_result': None, |
| 201 'sequential_run_index': 0 | 234 'sequential_run_index': 0 |
| 202 | 235 |
| 203 } | 236 } |
| 204 self._CreateAndSaveMasterFlakeAnalysis( | 237 self._CreateAndSaveMasterFlakeAnalysis( |
| 205 master_name, builder_name, build_number, step_name, | 238 master_name, builder_name, build_number, step_name, |
| 206 test_name, status=analysis_status.PENDING | 239 test_name, status=analysis_status.PENDING |
| 207 ) | 240 ) |
| 208 self._CreateAndSaveFlakeSwarmingTask( | 241 self._CreateAndSaveFlakeSwarmingTask( |
| 209 master_name, builder_name, build_number, step_name, | 242 master_name, builder_name, build_number, step_name, |
| 210 test_name, status=analysis_status.COMPLETED | 243 test_name, status=analysis_status.COMPLETED |
| 211 ) | 244 ) |
| 212 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 245 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| 213 build_number, step_name, test_name) | 246 build_number, step_name, test_name) |
| 214 analysis.success_rates.append(0) | 247 analysis.success_rates.append(0) |
| 215 analysis.build_numbers.append(100) | 248 analysis.build_numbers.append(100) |
| 216 analysis.put() | 249 analysis.put() |
| 217 | 250 |
| 218 NextBuildNumberPipeline.run( | 251 NextBuildNumberPipeline.run( |
| 219 NextBuildNumberPipeline(), master_name, builder_name, | 252 NextBuildNumberPipeline(), master_name, builder_name, |
| 220 master_build_number, build_number, step_name, | 253 master_build_number, build_number, step_name, |
| 221 test_name, test_result_future, queue_name, | 254 test_name, test_result_future, |
| 222 flakiness_algorithm_results_dict) | 255 flakiness_algorithm_results_dict) |
| 223 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) | 256 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) |
| 224 | 257 |
| 225 def testNextBuildPipelineForNewRecursionStableInARow(self): | 258 def testNextBuildPipelineForNewRecursionStableInARow(self): |
| 226 master_name = 'm' | 259 master_name = 'm' |
| 227 builder_name = 'b' | 260 builder_name = 'b' |
| 228 master_build_number = 100 | 261 master_build_number = 100 |
| 229 build_number = 100 | 262 build_number = 100 |
| 230 step_name = 's' | 263 step_name = 's' |
| 231 test_name = 't' | 264 test_name = 't' |
| 232 test_result_future = 'trf' | 265 test_result_future = 'trf' |
| 233 queue_name = constants.DEFAULT_QUEUE | |
| 234 flakiness_algorithm_results_dict = { | 266 flakiness_algorithm_results_dict = { |
| 235 'flakes_in_a_row': 4, | 267 'flakes_in_a_row': 4, |
| 236 'stable_in_a_row': 0, | 268 'stable_in_a_row': 0, |
| 237 'stabled_out': False, | 269 'stabled_out': False, |
| 238 'flaked_out': False, | 270 'flaked_out': False, |
| 239 'last_build_number': 0, | 271 'last_build_number': 0, |
| 240 'lower_boundary': None, | 272 'lower_boundary': None, |
| 241 'upper_boundary': None, | 273 'upper_boundary': None, |
| 242 'lower_boundary_result': None, | 274 'lower_boundary_result': None, |
| 243 'sequential_run_index': 0 | 275 'sequential_run_index': 0 |
| 244 | 276 |
| 245 } | 277 } |
| 246 self._CreateAndSaveMasterFlakeAnalysis( | 278 self._CreateAndSaveMasterFlakeAnalysis( |
| 247 master_name, builder_name, build_number, step_name, | 279 master_name, builder_name, build_number, step_name, |
| 248 test_name, status=analysis_status.PENDING | 280 test_name, status=analysis_status.PENDING |
| 249 ) | 281 ) |
| 250 self._CreateAndSaveFlakeSwarmingTask( | 282 self._CreateAndSaveFlakeSwarmingTask( |
| 251 master_name, builder_name, build_number, step_name, | 283 master_name, builder_name, build_number, step_name, |
| 252 test_name, status=analysis_status.COMPLETED | 284 test_name, status=analysis_status.COMPLETED |
| 253 ) | 285 ) |
| 254 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 286 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| 255 build_number, step_name, test_name) | 287 build_number, step_name, test_name) |
| 256 analysis.success_rates.append(.50) | 288 analysis.success_rates.append(.50) |
| 257 analysis.build_numbers.append(100) | 289 analysis.build_numbers.append(100) |
| 258 analysis.put() | 290 analysis.put() |
| 259 | 291 |
| 260 NextBuildNumberPipeline.run( | 292 NextBuildNumberPipeline.run( |
| 261 NextBuildNumberPipeline(), master_name, builder_name, | 293 NextBuildNumberPipeline(), master_name, builder_name, |
| 262 master_build_number, build_number, step_name, | 294 master_build_number, build_number, step_name, |
| 263 test_name, test_result_future, queue_name, | 295 test_name, test_result_future, |
| 264 flakiness_algorithm_results_dict) | 296 flakiness_algorithm_results_dict) |
| 265 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) | 297 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) |
| 266 | 298 |
| 267 | 299 |
| 268 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self): | 300 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self): |
| 269 master_name = 'm' | 301 master_name = 'm' |
| 270 builder_name = 'b' | 302 builder_name = 'b' |
| 271 master_build_number = 100 | 303 master_build_number = 100 |
| 272 build_number = 100 | 304 build_number = 100 |
| 273 step_name = 's' | 305 step_name = 's' |
| 274 test_name = 't' | 306 test_name = 't' |
| 275 test_result_future = 'trf' | 307 test_result_future = 'trf' |
| 276 queue_name = constants.DEFAULT_QUEUE | |
| 277 flakiness_algorithm_results_dict = { | 308 flakiness_algorithm_results_dict = { |
| 278 'flakes_in_a_row': 0, | 309 'flakes_in_a_row': 0, |
| 279 'stable_in_a_row': 0, | 310 'stable_in_a_row': 0, |
| 280 'stabled_out': False, | 311 'stabled_out': False, |
| 281 'flaked_out': False, | 312 'flaked_out': False, |
| 282 'last_build_number': 200, | 313 'last_build_number': 200, |
| 283 'lower_boundary': None, | 314 'lower_boundary': None, |
| 284 'upper_boundary': None, | 315 'upper_boundary': None, |
| 285 'lower_boundary_result': None, | 316 'lower_boundary_result': None, |
| 286 'sequential_run_index': 0 | 317 'sequential_run_index': 0 |
| 287 } | 318 } |
| 288 self._CreateAndSaveMasterFlakeAnalysis( | 319 self._CreateAndSaveMasterFlakeAnalysis( |
| 289 master_name, builder_name, build_number, step_name, | 320 master_name, builder_name, build_number, step_name, |
| 290 test_name, status=analysis_status.PENDING | 321 test_name, status=analysis_status.PENDING |
| 291 ) | 322 ) |
| 292 self._CreateAndSaveFlakeSwarmingTask( | 323 self._CreateAndSaveFlakeSwarmingTask( |
| 293 master_name, builder_name, build_number, step_name, | 324 master_name, builder_name, build_number, step_name, |
| 294 test_name, status=analysis_status.COMPLETED | 325 test_name, status=analysis_status.COMPLETED |
| 295 ) | 326 ) |
| 296 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 327 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| 297 build_number, step_name, test_name) | 328 build_number, step_name, test_name) |
| 298 analysis.success_rates.append(.50) | 329 analysis.success_rates.append(.50) |
| 299 analysis.build_numbers.append(100) | 330 analysis.build_numbers.append(100) |
| 300 analysis.put() | 331 analysis.put() |
| 301 | 332 |
| 302 queue_name = {'x': False} | 333 queue_name = {'x': False} |
| 303 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument | 334 def my_mocked_run(*_, **__): |
| 304 queue_name['x'] = True # pragma: no cover | 335 queue_name['x'] = True # pragma: no cover |
| 305 | 336 |
| 306 self.mock( | 337 self.mock( |
| 307 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 338 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 308 NextBuildNumberPipeline.run( | 339 NextBuildNumberPipeline.run( |
| 309 NextBuildNumberPipeline(), master_name, builder_name, | 340 NextBuildNumberPipeline(), master_name, builder_name, |
| 310 master_build_number, build_number, step_name, test_name, | 341 master_build_number, build_number, step_name, test_name, |
| 311 test_result_future, queue_name, flakiness_algorithm_results_dict) | 342 test_result_future, flakiness_algorithm_results_dict) |
| 312 self.assertFalse(queue_name['x']) | 343 self.assertFalse(queue_name['x']) |
| 313 | 344 |
| 314 def testNextBuildPipelineForFailedSwarmingTask(self): | 345 def testNextBuildPipelineForFailedSwarmingTask(self): |
| 315 master_name = 'm' | 346 master_name = 'm' |
| 316 builder_name = 'b' | 347 builder_name = 'b' |
| 317 master_build_number = 100 | 348 master_build_number = 100 |
| 318 build_number = 100 | 349 build_number = 100 |
| 319 step_name = 's' | 350 step_name = 's' |
| 320 test_name = 't' | 351 test_name = 't' |
| 321 test_result_future = 'trf' | 352 test_result_future = 'trf' |
| 322 queue_name = constants.DEFAULT_QUEUE | |
| 323 flakiness_algorithm_results_dict = { | 353 flakiness_algorithm_results_dict = { |
| 324 'flakes_in_a_row': 0, | 354 'flakes_in_a_row': 0, |
| 325 'stable_in_a_row': 0, | 355 'stable_in_a_row': 0, |
| 326 'stabled_out': False, | 356 'stabled_out': False, |
| 327 'flaked_out': False, | 357 'flaked_out': False, |
| 328 'last_build_number': 0, | 358 'last_build_number': 0, |
| 329 'lower_boundary': None, | 359 'lower_boundary': None, |
| 330 'upper_boundary': None, | 360 'upper_boundary': None, |
| 331 'lower_boundary_result': None, | 361 'lower_boundary_result': None, |
| 332 'sequential_run_index': 0 | 362 'sequential_run_index': 0 |
| 333 | 363 |
| 334 } | 364 } |
| 335 self._CreateAndSaveMasterFlakeAnalysis( | 365 self._CreateAndSaveMasterFlakeAnalysis( |
| 336 master_name, builder_name, build_number, step_name, | 366 master_name, builder_name, build_number, step_name, |
| 337 test_name, status=analysis_status.PENDING | 367 test_name, status=analysis_status.PENDING |
| 338 ) | 368 ) |
| 339 self._CreateAndSaveFlakeSwarmingTask( | 369 self._CreateAndSaveFlakeSwarmingTask( |
| 340 master_name, builder_name, build_number, step_name, | 370 master_name, builder_name, build_number, step_name, |
| 341 test_name, status=analysis_status.ERROR | 371 test_name, status=analysis_status.ERROR |
| 342 ) | 372 ) |
| 343 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 373 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| 344 build_number, step_name, test_name) | 374 build_number, step_name, test_name) |
| 345 analysis.success_rates.append(.50) | 375 analysis.success_rates.append(.50) |
| 346 analysis.build_numbers.append(100) | 376 analysis.build_numbers.append(100) |
| 347 analysis.put() | 377 analysis.put() |
| 348 | 378 |
| 349 queue_name = {'x': False} | 379 queue_name = {'x': False} |
| 350 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument | 380 def my_mocked_run(*_, **__): |
| 351 queue_name['x'] = True # pragma: no cover | 381 queue_name['x'] = True # pragma: no cover |
| 352 | 382 |
| 353 self.mock( | 383 self.mock( |
| 354 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 384 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 355 NextBuildNumberPipeline.run( | 385 NextBuildNumberPipeline.run( |
| 356 NextBuildNumberPipeline(), master_name, builder_name, | 386 NextBuildNumberPipeline(), master_name, builder_name, |
| 357 master_build_number, build_number, step_name, test_name, | 387 master_build_number, build_number, step_name, test_name, |
| 358 test_result_future, queue_name, flakiness_algorithm_results_dict) | 388 test_result_future, flakiness_algorithm_results_dict) |
| 359 self.assertFalse(queue_name['x']) | 389 self.assertFalse(queue_name['x']) |
| 360 | 390 |
| 361 def testNextBuildPipelineForNewRecursionStabledFlakedOut(self): | 391 def testNextBuildPipelineForNewRecursionStabledFlakedOut(self): |
| 362 master_name = 'm' | 392 master_name = 'm' |
| 363 builder_name = 'b' | 393 builder_name = 'b' |
| 364 master_build_number = 100 | 394 master_build_number = 100 |
| 365 build_number = 100 | 395 build_number = 100 |
| 366 step_name = 's' | 396 step_name = 's' |
| 367 test_name = 't' | 397 test_name = 't' |
| 368 test_result_future = 'trf' | 398 test_result_future = 'trf' |
| (...skipping 17 matching lines...) Expand all Loading... |
| 386 master_name, builder_name, build_number, step_name, | 416 master_name, builder_name, build_number, step_name, |
| 387 test_name, status=analysis_status.COMPLETED | 417 test_name, status=analysis_status.COMPLETED |
| 388 ) | 418 ) |
| 389 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 419 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| 390 build_number, step_name, test_name) | 420 build_number, step_name, test_name) |
| 391 analysis.success_rates.append(.50) | 421 analysis.success_rates.append(.50) |
| 392 analysis.build_numbers.append(100) | 422 analysis.build_numbers.append(100) |
| 393 analysis.put() | 423 analysis.put() |
| 394 | 424 |
| 395 queue_name = {'x': False} | 425 queue_name = {'x': False} |
| 396 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument | 426 def my_mocked_run(*_, **__): |
| 397 queue_name['x'] = True # pragma: no cover | 427 queue_name['x'] = True # pragma: no cover |
| 398 | 428 |
| 399 self.mock( | 429 self.mock( |
| 400 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 430 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 401 NextBuildNumberPipeline.run( | 431 NextBuildNumberPipeline.run( |
| 402 NextBuildNumberPipeline(), master_name, builder_name, | 432 NextBuildNumberPipeline(), master_name, builder_name, |
| 403 master_build_number, build_number, step_name, test_name, | 433 master_build_number, build_number, step_name, test_name, |
| 404 test_result_future, queue_name, flakiness_algorithm_results_dict) | 434 test_result_future, flakiness_algorithm_results_dict) |
| 405 self.assertTrue(queue_name['x']) | 435 self.assertTrue(queue_name['x']) |
| 406 | 436 |
| 407 def testGetNextRunSetStableLowerBoundary(self): | 437 def testGetNextRunSetStableLowerBoundary(self): |
| 408 master_name = 'm' | 438 master_name = 'm' |
| 409 builder_name = 'b' | 439 builder_name = 'b' |
| 410 build_number = 100 | 440 build_number = 100 |
| 411 step_name = 's' | 441 step_name = 's' |
| 412 test_name = 't' | 442 test_name = 't' |
| 413 self._CreateAndSaveMasterFlakeAnalysis( | 443 self._CreateAndSaveMasterFlakeAnalysis( |
| 414 master_name, builder_name, build_number, step_name, | 444 master_name, builder_name, build_number, step_name, |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 self.assertEqual(analysis.suspected_flake_build_number, None) | 625 self.assertEqual(analysis.suspected_flake_build_number, None) |
| 596 | 626 |
| 597 def testNextBuildPipelineStabledOutFlakedOutFirstTime(self): | 627 def testNextBuildPipelineStabledOutFlakedOutFirstTime(self): |
| 598 master_name = 'm' | 628 master_name = 'm' |
| 599 builder_name = 'b' | 629 builder_name = 'b' |
| 600 master_build_number = 100 | 630 master_build_number = 100 |
| 601 build_number = 100 | 631 build_number = 100 |
| 602 step_name = 's' | 632 step_name = 's' |
| 603 test_name = 't' | 633 test_name = 't' |
| 604 test_result_future = 'trf' | 634 test_result_future = 'trf' |
| 605 queue_name = constants.DEFAULT_QUEUE | |
| 606 flakiness_algorithm_results_dict = { | 635 flakiness_algorithm_results_dict = { |
| 607 'flakes_in_a_row': 0, | 636 'flakes_in_a_row': 0, |
| 608 'stable_in_a_row': 0, | 637 'stable_in_a_row': 0, |
| 609 'stabled_out': True, | 638 'stabled_out': True, |
| 610 'flaked_out': True, | 639 'flaked_out': True, |
| 611 'last_build_number': 0, | 640 'last_build_number': 0, |
| 612 'lower_boundary': 100, | 641 'lower_boundary': 100, |
| 613 'upper_boundary': 110, | 642 'upper_boundary': 110, |
| 614 'lower_boundary_result': None, | 643 'lower_boundary_result': None, |
| 615 'sequential_run_index': 0 | 644 'sequential_run_index': 0 |
| 616 | 645 |
| 617 } | 646 } |
| 618 self._CreateAndSaveMasterFlakeAnalysis( | 647 self._CreateAndSaveMasterFlakeAnalysis( |
| 619 master_name, builder_name, build_number, step_name, | 648 master_name, builder_name, build_number, step_name, |
| 620 test_name, status=analysis_status.PENDING | 649 test_name, status=analysis_status.PENDING |
| 621 ) | 650 ) |
| 622 self._CreateAndSaveFlakeSwarmingTask( | 651 self._CreateAndSaveFlakeSwarmingTask( |
| 623 master_name, builder_name, build_number, step_name, | 652 master_name, builder_name, build_number, step_name, |
| 624 test_name, status=analysis_status.COMPLETED | 653 test_name, status=analysis_status.COMPLETED |
| 625 ) | 654 ) |
| 626 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 655 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, |
| 627 build_number, step_name, test_name) | 656 build_number, step_name, test_name) |
| 628 analysis.success_rates.append(1) | 657 analysis.success_rates.append(1) |
| 629 analysis.build_numbers.append(50) | 658 analysis.build_numbers.append(50) |
| 630 analysis.put() | 659 analysis.put() |
| 631 | 660 |
| 632 NextBuildNumberPipeline.run( | 661 NextBuildNumberPipeline.run( |
| 633 NextBuildNumberPipeline(), master_name, builder_name, | 662 NextBuildNumberPipeline(), master_name, builder_name, |
| 634 master_build_number, build_number, step_name, test_name, | 663 master_build_number, build_number, step_name, test_name, |
| 635 test_result_future, queue_name, flakiness_algorithm_results_dict) | 664 test_result_future, flakiness_algorithm_results_dict) |
| 636 self.assertEquals( | 665 self.assertEquals( |
| 637 flakiness_algorithm_results_dict['sequential_run_index'], 1) | 666 flakiness_algorithm_results_dict['sequential_run_index'], 1) |
| 638 | 667 |
| 639 def testNextBuildWhenTestNotExistingAfterStableInARow(self): | 668 def testNextBuildWhenTestNotExistingAfterStableInARow(self): |
| 640 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't') | 669 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't') |
| 641 master.success_rates = [0.8, 1.0, 1.0, -1] | 670 master.success_rates = [0.8, 1.0, 1.0, -1] |
| 642 master.build_numbers = [100, 80, 70, 60] | 671 master.build_numbers = [100, 80, 70, 60] |
| 643 flakiness_algorithm_results_dict = { | 672 flakiness_algorithm_results_dict = { |
| 644 'flakes_in_a_row': 0, | 673 'flakes_in_a_row': 0, |
| 645 'stable_in_a_row': 2, | 674 'stable_in_a_row': 2, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 685 flakiness_algorithm_results_dict['lower_boundary_result']) | 714 flakiness_algorithm_results_dict['lower_boundary_result']) |
| 686 | 715 |
| 687 def testNextBuildNumberIsLargerThanStartingBuildNumber(self): | 716 def testNextBuildNumberIsLargerThanStartingBuildNumber(self): |
| 688 master_name = 'm' | 717 master_name = 'm' |
| 689 builder_name = 'b' | 718 builder_name = 'b' |
| 690 master_build_number = 100 | 719 master_build_number = 100 |
| 691 build_number = 60 | 720 build_number = 60 |
| 692 step_name = 's' | 721 step_name = 's' |
| 693 test_name = 't' | 722 test_name = 't' |
| 694 test_result_future = 'trf' | 723 test_result_future = 'trf' |
| 695 queue_name = constants.DEFAULT_QUEUE | |
| 696 flakiness_algorithm_results_dict = { | 724 flakiness_algorithm_results_dict = { |
| 697 'flakes_in_a_row': 0, | 725 'flakes_in_a_row': 0, |
| 698 'stable_in_a_row': 3, | 726 'stable_in_a_row': 3, |
| 699 'stabled_out': False, | 727 'stabled_out': False, |
| 700 'flaked_out': False, | 728 'flaked_out': False, |
| 701 'last_build_number': 0, | 729 'last_build_number': 0, |
| 702 'lower_boundary': None, | 730 'lower_boundary': None, |
| 703 'upper_boundary': None, | 731 'upper_boundary': None, |
| 704 'lower_boundary_result': None, | 732 'lower_boundary_result': None, |
| 705 'sequential_run_index': 0 | 733 'sequential_run_index': 0 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 716 master_name, builder_name, | 744 master_name, builder_name, |
| 717 master_build_number, step_name, test_name) | 745 master_build_number, step_name, test_name) |
| 718 analysis.success_rates = [1.0, 1.0, 1.0, -1] | 746 analysis.success_rates = [1.0, 1.0, 1.0, -1] |
| 719 analysis.build_numbers = [100, 80, 70, 60] | 747 analysis.build_numbers = [100, 80, 70, 60] |
| 720 analysis.put() | 748 analysis.put() |
| 721 | 749 |
| 722 pipeline = NextBuildNumberPipeline() | 750 pipeline = NextBuildNumberPipeline() |
| 723 pipeline.run( | 751 pipeline.run( |
| 724 master_name, builder_name, | 752 master_name, builder_name, |
| 725 master_build_number, build_number, step_name, test_name, | 753 master_build_number, build_number, step_name, test_name, |
| 726 test_result_future, queue_name, flakiness_algorithm_results_dict) | 754 test_result_future, flakiness_algorithm_results_dict) |
| 727 | 755 |
| 728 analysis = MasterFlakeAnalysis.Get( | 756 analysis = MasterFlakeAnalysis.Get( |
| 729 master_name, builder_name, | 757 master_name, builder_name, |
| 730 master_build_number, step_name, test_name) | 758 master_build_number, step_name, test_name) |
| 731 self.assertEqual(analysis_status.COMPLETED, analysis.status) | 759 self.assertEqual(analysis_status.COMPLETED, analysis.status) |
| 732 | 760 |
| 733 def testNextBuildNumberIsSmallerThanLastBuildNumber(self): | 761 def testNextBuildNumberIsSmallerThanLastBuildNumber(self): |
| 734 master_name = 'm' | 762 master_name = 'm' |
| 735 builder_name = 'b' | 763 builder_name = 'b' |
| 736 master_build_number = 100 | 764 master_build_number = 100 |
| 737 build_number = 60 | 765 build_number = 60 |
| 738 step_name = 's' | 766 step_name = 's' |
| 739 test_name = 't' | 767 test_name = 't' |
| 740 test_result_future = 'trf' | 768 test_result_future = 'trf' |
| 741 queue_name = constants.DEFAULT_QUEUE | |
| 742 flakiness_algorithm_results_dict = { | 769 flakiness_algorithm_results_dict = { |
| 743 'flakes_in_a_row': 0, | 770 'flakes_in_a_row': 0, |
| 744 'stable_in_a_row': 3, | 771 'stable_in_a_row': 3, |
| 745 'stabled_out': False, | 772 'stabled_out': False, |
| 746 'flaked_out': False, | 773 'flaked_out': False, |
| 747 'last_build_number': 59, | 774 'last_build_number': 59, |
| 748 'lower_boundary': None, | 775 'lower_boundary': None, |
| 749 'upper_boundary': None, | 776 'upper_boundary': None, |
| 750 'lower_boundary_result': None, | 777 'lower_boundary_result': None, |
| 751 'sequential_run_index': 0 | 778 'sequential_run_index': 0 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 762 master_name, builder_name, | 789 master_name, builder_name, |
| 763 master_build_number, step_name, test_name) | 790 master_build_number, step_name, test_name) |
| 764 analysis.success_rates = [1.0, 1.0, 1.0, 1.0] | 791 analysis.success_rates = [1.0, 1.0, 1.0, 1.0] |
| 765 analysis.build_numbers = [100, 80, 70, 60] | 792 analysis.build_numbers = [100, 80, 70, 60] |
| 766 analysis.put() | 793 analysis.put() |
| 767 | 794 |
| 768 pipeline = NextBuildNumberPipeline() | 795 pipeline = NextBuildNumberPipeline() |
| 769 pipeline.run( | 796 pipeline.run( |
| 770 master_name, builder_name, | 797 master_name, builder_name, |
| 771 master_build_number, build_number, step_name, test_name, | 798 master_build_number, build_number, step_name, test_name, |
| 772 test_result_future, queue_name, flakiness_algorithm_results_dict) | 799 test_result_future, flakiness_algorithm_results_dict) |
| 773 | 800 |
| 774 analysis = MasterFlakeAnalysis.Get( | 801 analysis = MasterFlakeAnalysis.Get( |
| 775 master_name, builder_name, | 802 master_name, builder_name, |
| 776 master_build_number, step_name, test_name) | 803 master_build_number, step_name, test_name) |
| 777 self.assertEqual(analysis_status.COMPLETED, analysis.status) | 804 self.assertEqual(analysis_status.COMPLETED, analysis.status) |
| OLD | NEW |