| 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 common import constants | 5 from common import constants |
| 6 from common.pipeline_wrapper import pipeline_handlers | 6 from common.pipeline_wrapper import pipeline_handlers |
| 7 from model import analysis_status | 7 from model import analysis_status |
| 8 from model.flake.flake_swarming_task import FlakeSwarmingTask |
| 8 from model.flake.master_flake_analysis import MasterFlakeAnalysis | 9 from model.flake.master_flake_analysis import MasterFlakeAnalysis |
| 9 from model.flake.flake_swarming_task import FlakeSwarmingTask | |
| 10 from waterfall.flake import recursive_flake_pipeline | 10 from waterfall.flake import recursive_flake_pipeline |
| 11 from waterfall.flake.recursive_flake_pipeline import get_next_run | 11 from waterfall.flake.recursive_flake_pipeline import get_next_run |
| 12 from waterfall.flake.recursive_flake_pipeline import NextBuildNumberPipeline | 12 from waterfall.flake.recursive_flake_pipeline import NextBuildNumberPipeline |
| 13 from waterfall.flake.recursive_flake_pipeline import RecursiveFlakePipeline | 13 from waterfall.flake.recursive_flake_pipeline import RecursiveFlakePipeline |
| 14 from waterfall.flake.recursive_flake_pipeline import sequential_next_run | 14 from waterfall.flake.recursive_flake_pipeline import sequential_next_run |
| 15 from waterfall.test import wf_testcase | 15 from waterfall.test import wf_testcase |
| 16 | 16 |
| 17 | 17 |
| 18 class RecursiveFlakePipelineTest(wf_testcase.WaterfallTestCase): | 18 class RecursiveFlakePipelineTest(wf_testcase.WaterfallTestCase): |
| 19 app_module = pipeline_handlers._APP | 19 app_module = pipeline_handlers._APP |
| 20 | 20 |
| 21 def _CreateAndSaveMasterFlakeAnalysis( | 21 def _CreateAndSaveMasterFlakeAnalysis( |
| 22 self, master_name, builder_name, build_number, | 22 self, master_name, builder_name, build_number, step_name, |
| 23 step_name, test_name, status): | 23 test_name, status): |
| 24 analysis = MasterFlakeAnalysis.Create( | 24 analysis = MasterFlakeAnalysis.Create( |
| 25 master_name, builder_name, build_number, step_name, test_name) | 25 master_name, builder_name, build_number, step_name, test_name) |
| 26 analysis.status = status | 26 analysis.status = status |
| 27 analysis.put() | 27 analysis.Save() |
| 28 | 28 |
| 29 def _CreateAndSaveFlakeSwarmingTask( | 29 def _CreateAndSaveFlakeSwarmingTask( |
| 30 self, master_name, builder_name, build_number, | 30 self, master_name, builder_name, build_number, |
| 31 step_name, test_name, status): | 31 step_name, test_name, status): |
| 32 flake_swarming_task = FlakeSwarmingTask.Create( | 32 flake_swarming_task = FlakeSwarmingTask.Create( |
| 33 master_name, builder_name, build_number, step_name, test_name) | 33 master_name, builder_name, build_number, step_name, test_name) |
| 34 flake_swarming_task.status = status | 34 flake_swarming_task.status = status |
| 35 flake_swarming_task.put() | 35 flake_swarming_task.put() |
| 36 | 36 |
| 37 def testRecursiveFlakePipeline(self): | 37 def testRecursiveFlakePipeline(self): |
| (...skipping 14 matching lines...) Expand all Loading... |
| 52 'stabled_out': False, | 52 'stabled_out': False, |
| 53 'flaked_out': False, | 53 'flaked_out': False, |
| 54 'last_build_number': 0, | 54 'last_build_number': 0, |
| 55 'lower_boundary': None, | 55 'lower_boundary': None, |
| 56 'upper_boundary': None, | 56 'upper_boundary': None, |
| 57 'lower_boundary_result': None, | 57 'lower_boundary_result': None, |
| 58 'sequential_run_index': 0 | 58 'sequential_run_index': 0 |
| 59 | 59 |
| 60 } | 60 } |
| 61 | 61 |
| 62 self._CreateAndSaveMasterFlakeAnalysis( | 62 analysis = MasterFlakeAnalysis.Create( |
| 63 master_name, builder_name, master_build_number, step_name, | 63 master_name, builder_name, master_build_number, step_name, test_name) |
| 64 test_name, status=analysis_status.PENDING | 64 analysis.status = analysis_status.PENDING |
| 65 ) | 65 analysis.Save() |
| 66 | 66 |
| 67 self.MockPipeline( | 67 self.MockPipeline( |
| 68 recursive_flake_pipeline.TriggerFlakeSwarmingTaskPipeline, | 68 recursive_flake_pipeline.TriggerFlakeSwarmingTaskPipeline, |
| 69 'task_id', | 69 'task_id', |
| 70 expected_args=[master_name, builder_name, | 70 expected_args=[master_name, builder_name, |
| 71 run_build_number, step_name, [test_name]], | 71 run_build_number, step_name, [test_name]], |
| 72 expected_kwargs={}) | 72 expected_kwargs={}) |
| 73 | 73 |
| 74 self.MockPipeline( | 74 self.MockPipeline( |
| 75 recursive_flake_pipeline.ProcessFlakeSwarmingTaskResultPipeline, | 75 recursive_flake_pipeline.ProcessFlakeSwarmingTaskResultPipeline, |
| 76 'test_result_future', | 76 'test_result_future', |
| 77 expected_args=[master_name, builder_name, | 77 expected_args=[master_name, builder_name, |
| 78 run_build_number, step_name, task_id, | 78 run_build_number, step_name, task_id, |
| 79 master_build_number, test_name], | 79 master_build_number, test_name, |
| 80 analysis.version_number], |
| 80 expected_kwargs={}) | 81 expected_kwargs={}) |
| 81 | 82 |
| 82 self.MockPipeline( | 83 self.MockPipeline( |
| 83 recursive_flake_pipeline.NextBuildNumberPipeline, | 84 recursive_flake_pipeline.NextBuildNumberPipeline, |
| 84 '', | 85 '', |
| 85 expected_args=[master_name, builder_name, master_build_number, | 86 expected_args=[master_name, builder_name, master_build_number, |
| 86 build_number, step_name, test_name, | 87 build_number, step_name, test_name, |
| 88 analysis.version_number, |
| 87 test_result_future, queue_name, | 89 test_result_future, queue_name, |
| 88 flakiness_algorithm_results_dict], | 90 flakiness_algorithm_results_dict], |
| 89 expected_kwargs={}) | 91 expected_kwargs={}) |
| 90 | 92 |
| 91 rfp = RecursiveFlakePipeline(master_name, builder_name, build_number, | 93 rfp = RecursiveFlakePipeline( |
| 92 step_name, test_name, master_build_number, | 94 master_name, builder_name, build_number, step_name, test_name, |
| 93 flakiness_algorithm_results_dict= | 95 analysis.version_number, master_build_number, |
| 94 flakiness_algorithm_results_dict, | 96 flakiness_algorithm_results_dict=flakiness_algorithm_results_dict, |
| 95 queue_name=queue_name) | 97 queue_name=queue_name) |
| 96 | 98 |
| 97 rfp.start(queue_name=queue_name) | 99 rfp.start(queue_name=queue_name) |
| 98 self.execute_queued_tasks() | 100 self.execute_queued_tasks() |
| 99 | 101 |
| 100 def testNextBuildPipelineForNewRecursionFirstFlake(self): | 102 def testNextBuildPipelineForNewRecursionFirstFlake(self): |
| 101 master_name = 'm' | 103 master_name = 'm' |
| 102 builder_name = 'b' | 104 builder_name = 'b' |
| 103 master_build_number = 100 | 105 master_build_number = 100 |
| 104 build_number = 100 | 106 build_number = 100 |
| 105 step_name = 's' | 107 step_name = 's' |
| (...skipping 13 matching lines...) Expand all Loading... |
| 119 | 121 |
| 120 } | 122 } |
| 121 self._CreateAndSaveMasterFlakeAnalysis( | 123 self._CreateAndSaveMasterFlakeAnalysis( |
| 122 master_name, builder_name, build_number, step_name, | 124 master_name, builder_name, build_number, step_name, |
| 123 test_name, status=analysis_status.PENDING | 125 test_name, status=analysis_status.PENDING |
| 124 ) | 126 ) |
| 125 self._CreateAndSaveFlakeSwarmingTask( | 127 self._CreateAndSaveFlakeSwarmingTask( |
| 126 master_name, builder_name, build_number, step_name, | 128 master_name, builder_name, build_number, step_name, |
| 127 test_name, status=analysis_status.COMPLETED | 129 test_name, status=analysis_status.COMPLETED |
| 128 ) | 130 ) |
| 129 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 131 analysis = MasterFlakeAnalysis.GetVersion( |
| 130 build_number, step_name, test_name) | 132 master_name, builder_name, build_number, step_name, test_name) |
| 131 analysis.success_rates.append(.08) | 133 analysis.pass_rates.append(.08) |
| 132 analysis.build_numbers.append(100) | 134 analysis.build_numbers.append(100) |
| 133 analysis.put() | 135 analysis.put() |
| 134 | 136 |
| 135 NextBuildNumberPipeline.run( | 137 NextBuildNumberPipeline.run( |
| 136 NextBuildNumberPipeline(), master_name, builder_name, | 138 NextBuildNumberPipeline(), master_name, builder_name, |
| 137 master_build_number, build_number, step_name, test_name, | 139 master_build_number, build_number, step_name, test_name, |
| 138 test_result_future, queue_name, flakiness_algorithm_results_dict) | 140 analysis.version_number, test_result_future, queue_name, |
| 141 flakiness_algorithm_results_dict) |
| 139 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) | 142 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) |
| 140 | 143 |
| 141 def testNextBuildPipelineForNewRecursionFirstStable(self): | 144 def testNextBuildPipelineForNewRecursionFirstStable(self): |
| 142 master_name = 'm' | 145 master_name = 'm' |
| 143 builder_name = 'b' | 146 builder_name = 'b' |
| 144 master_build_number = 100 | 147 master_build_number = 100 |
| 145 build_number = 100 | 148 build_number = 100 |
| 146 step_name = 's' | 149 step_name = 's' |
| 147 test_name = 't' | 150 test_name = 't' |
| 148 test_result_future = 'trf' | 151 test_result_future = 'trf' |
| (...skipping 11 matching lines...) Expand all Loading... |
| 160 | 163 |
| 161 } | 164 } |
| 162 self._CreateAndSaveMasterFlakeAnalysis( | 165 self._CreateAndSaveMasterFlakeAnalysis( |
| 163 master_name, builder_name, build_number, step_name, | 166 master_name, builder_name, build_number, step_name, |
| 164 test_name, status=analysis_status.PENDING | 167 test_name, status=analysis_status.PENDING |
| 165 ) | 168 ) |
| 166 self._CreateAndSaveFlakeSwarmingTask( | 169 self._CreateAndSaveFlakeSwarmingTask( |
| 167 master_name, builder_name, build_number, step_name, | 170 master_name, builder_name, build_number, step_name, |
| 168 test_name, status=analysis_status.COMPLETED | 171 test_name, status=analysis_status.COMPLETED |
| 169 ) | 172 ) |
| 170 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 173 analysis = MasterFlakeAnalysis.GetVersion( |
| 171 build_number, step_name, test_name) | 174 master_name, builder_name, build_number, step_name, test_name) |
| 172 analysis.success_rates.append(0) | 175 analysis.pass_rates.append(0) |
| 173 analysis.build_numbers.append(100) | 176 analysis.build_numbers.append(100) |
| 174 analysis.put() | 177 analysis.put() |
| 175 | 178 |
| 176 NextBuildNumberPipeline.run( | 179 NextBuildNumberPipeline.run( |
| 177 NextBuildNumberPipeline(), master_name, builder_name, | 180 NextBuildNumberPipeline(), master_name, builder_name, |
| 178 master_build_number, build_number, step_name, | 181 master_build_number, build_number, step_name, |
| 179 test_name, test_result_future, queue_name, | 182 test_name, analysis.version_number, test_result_future, queue_name, |
| 180 flakiness_algorithm_results_dict) | 183 flakiness_algorithm_results_dict) |
| 181 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) | 184 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) |
| 182 | 185 |
| 183 def testNextBuildPipelineForNewRecursionFlakeInARow(self): | 186 def testNextBuildPipelineForNewRecursionFlakeInARow(self): |
| 184 master_name = 'm' | 187 master_name = 'm' |
| 185 builder_name = 'b' | 188 builder_name = 'b' |
| 186 master_build_number = 100 | 189 master_build_number = 100 |
| 187 build_number = 100 | 190 build_number = 100 |
| 188 step_name = 's' | 191 step_name = 's' |
| 189 test_name = 't' | 192 test_name = 't' |
| (...skipping 12 matching lines...) Expand all Loading... |
| 202 | 205 |
| 203 } | 206 } |
| 204 self._CreateAndSaveMasterFlakeAnalysis( | 207 self._CreateAndSaveMasterFlakeAnalysis( |
| 205 master_name, builder_name, build_number, step_name, | 208 master_name, builder_name, build_number, step_name, |
| 206 test_name, status=analysis_status.PENDING | 209 test_name, status=analysis_status.PENDING |
| 207 ) | 210 ) |
| 208 self._CreateAndSaveFlakeSwarmingTask( | 211 self._CreateAndSaveFlakeSwarmingTask( |
| 209 master_name, builder_name, build_number, step_name, | 212 master_name, builder_name, build_number, step_name, |
| 210 test_name, status=analysis_status.COMPLETED | 213 test_name, status=analysis_status.COMPLETED |
| 211 ) | 214 ) |
| 212 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 215 analysis = MasterFlakeAnalysis.GetVersion( |
| 213 build_number, step_name, test_name) | 216 master_name, builder_name, build_number, step_name, test_name) |
| 214 analysis.success_rates.append(0) | 217 analysis.pass_rates.append(0) |
| 215 analysis.build_numbers.append(100) | 218 analysis.build_numbers.append(100) |
| 216 analysis.put() | 219 analysis.put() |
| 217 | 220 |
| 218 NextBuildNumberPipeline.run( | 221 NextBuildNumberPipeline.run( |
| 219 NextBuildNumberPipeline(), master_name, builder_name, | 222 NextBuildNumberPipeline(), master_name, builder_name, |
| 220 master_build_number, build_number, step_name, | 223 master_build_number, build_number, step_name, |
| 221 test_name, test_result_future, queue_name, | 224 test_name, analysis.version_number, test_result_future, queue_name, |
| 222 flakiness_algorithm_results_dict) | 225 flakiness_algorithm_results_dict) |
| 223 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) | 226 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) |
| 224 | 227 |
| 225 def testNextBuildPipelineForNewRecursionStableInARow(self): | 228 def testNextBuildPipelineForNewRecursionStableInARow(self): |
| 226 master_name = 'm' | 229 master_name = 'm' |
| 227 builder_name = 'b' | 230 builder_name = 'b' |
| 228 master_build_number = 100 | 231 master_build_number = 100 |
| 229 build_number = 100 | 232 build_number = 100 |
| 230 step_name = 's' | 233 step_name = 's' |
| 231 test_name = 't' | 234 test_name = 't' |
| (...skipping 12 matching lines...) Expand all Loading... |
| 244 | 247 |
| 245 } | 248 } |
| 246 self._CreateAndSaveMasterFlakeAnalysis( | 249 self._CreateAndSaveMasterFlakeAnalysis( |
| 247 master_name, builder_name, build_number, step_name, | 250 master_name, builder_name, build_number, step_name, |
| 248 test_name, status=analysis_status.PENDING | 251 test_name, status=analysis_status.PENDING |
| 249 ) | 252 ) |
| 250 self._CreateAndSaveFlakeSwarmingTask( | 253 self._CreateAndSaveFlakeSwarmingTask( |
| 251 master_name, builder_name, build_number, step_name, | 254 master_name, builder_name, build_number, step_name, |
| 252 test_name, status=analysis_status.COMPLETED | 255 test_name, status=analysis_status.COMPLETED |
| 253 ) | 256 ) |
| 254 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 257 analysis = MasterFlakeAnalysis.GetVersion( |
| 255 build_number, step_name, test_name) | 258 master_name, builder_name, build_number, step_name, test_name) |
| 256 analysis.success_rates.append(.50) | 259 analysis.pass_rates.append(.50) |
| 257 analysis.build_numbers.append(100) | 260 analysis.build_numbers.append(100) |
| 258 analysis.put() | 261 analysis.put() |
| 259 | 262 |
| 260 NextBuildNumberPipeline.run( | 263 NextBuildNumberPipeline.run( |
| 261 NextBuildNumberPipeline(), master_name, builder_name, | 264 NextBuildNumberPipeline(), master_name, builder_name, |
| 262 master_build_number, build_number, step_name, | 265 master_build_number, build_number, step_name, |
| 263 test_name, test_result_future, queue_name, | 266 test_name, analysis.version_number, test_result_future, queue_name, |
| 264 flakiness_algorithm_results_dict) | 267 flakiness_algorithm_results_dict) |
| 265 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) | 268 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) |
| 266 | 269 |
| 267 | |
| 268 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self): | 270 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self): |
| 269 master_name = 'm' | 271 master_name = 'm' |
| 270 builder_name = 'b' | 272 builder_name = 'b' |
| 271 master_build_number = 100 | 273 master_build_number = 100 |
| 272 build_number = 100 | 274 build_number = 100 |
| 273 step_name = 's' | 275 step_name = 's' |
| 274 test_name = 't' | 276 test_name = 't' |
| 275 test_result_future = 'trf' | 277 test_result_future = 'trf' |
| 276 queue_name = constants.DEFAULT_QUEUE | 278 queue_name = constants.DEFAULT_QUEUE |
| 277 flakiness_algorithm_results_dict = { | 279 flakiness_algorithm_results_dict = { |
| 278 'flakes_in_a_row': 0, | 280 'flakes_in_a_row': 0, |
| 279 'stable_in_a_row': 0, | 281 'stable_in_a_row': 0, |
| 280 'stabled_out': False, | 282 'stabled_out': False, |
| 281 'flaked_out': False, | 283 'flaked_out': False, |
| 282 'last_build_number': 200, | 284 'last_build_number': 200, |
| 283 'lower_boundary': None, | 285 'lower_boundary': None, |
| 284 'upper_boundary': None, | 286 'upper_boundary': None, |
| 285 'lower_boundary_result': None, | 287 'lower_boundary_result': None, |
| 286 'sequential_run_index': 0 | 288 'sequential_run_index': 0 |
| 287 } | 289 } |
| 288 self._CreateAndSaveMasterFlakeAnalysis( | 290 self._CreateAndSaveMasterFlakeAnalysis( |
| 289 master_name, builder_name, build_number, step_name, | 291 master_name, builder_name, build_number, step_name, |
| 290 test_name, status=analysis_status.PENDING | 292 test_name, status=analysis_status.PENDING |
| 291 ) | 293 ) |
| 292 self._CreateAndSaveFlakeSwarmingTask( | 294 self._CreateAndSaveFlakeSwarmingTask( |
| 293 master_name, builder_name, build_number, step_name, | 295 master_name, builder_name, build_number, step_name, |
| 294 test_name, status=analysis_status.COMPLETED | 296 test_name, status=analysis_status.COMPLETED |
| 295 ) | 297 ) |
| 296 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 298 analysis = MasterFlakeAnalysis.GetVersion( |
| 297 build_number, step_name, test_name) | 299 master_name, builder_name, build_number, step_name, test_name) |
| 298 analysis.success_rates.append(.50) | 300 analysis.pass_rates.append(.50) |
| 299 analysis.build_numbers.append(100) | 301 analysis.build_numbers.append(100) |
| 300 analysis.put() | 302 analysis.put() |
| 301 | 303 |
| 302 queue_name = {'x': False} | 304 queue_name = {'x': False} |
| 303 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument | 305 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument |
| 304 queue_name['x'] = True # pragma: no cover | 306 queue_name['x'] = True # pragma: no cover |
| 305 | 307 |
| 306 self.mock( | 308 self.mock( |
| 307 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 309 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 308 NextBuildNumberPipeline.run( | 310 NextBuildNumberPipeline.run( |
| 309 NextBuildNumberPipeline(), master_name, builder_name, | 311 NextBuildNumberPipeline(), master_name, builder_name, |
| 310 master_build_number, build_number, step_name, test_name, | 312 master_build_number, build_number, step_name, test_name, |
| 311 test_result_future, queue_name, flakiness_algorithm_results_dict) | 313 analysis.version_number, test_result_future, queue_name, |
| 314 flakiness_algorithm_results_dict) |
| 312 self.assertFalse(queue_name['x']) | 315 self.assertFalse(queue_name['x']) |
| 313 | 316 |
| 314 def testNextBuildPipelineForFailedSwarmingTask(self): | 317 def testNextBuildPipelineForFailedSwarmingTask(self): |
| 315 master_name = 'm' | 318 master_name = 'm' |
| 316 builder_name = 'b' | 319 builder_name = 'b' |
| 317 master_build_number = 100 | 320 master_build_number = 100 |
| 318 build_number = 100 | 321 build_number = 100 |
| 319 step_name = 's' | 322 step_name = 's' |
| 320 test_name = 't' | 323 test_name = 't' |
| 321 test_result_future = 'trf' | 324 test_result_future = 'trf' |
| (...skipping 11 matching lines...) Expand all Loading... |
| 333 | 336 |
| 334 } | 337 } |
| 335 self._CreateAndSaveMasterFlakeAnalysis( | 338 self._CreateAndSaveMasterFlakeAnalysis( |
| 336 master_name, builder_name, build_number, step_name, | 339 master_name, builder_name, build_number, step_name, |
| 337 test_name, status=analysis_status.PENDING | 340 test_name, status=analysis_status.PENDING |
| 338 ) | 341 ) |
| 339 self._CreateAndSaveFlakeSwarmingTask( | 342 self._CreateAndSaveFlakeSwarmingTask( |
| 340 master_name, builder_name, build_number, step_name, | 343 master_name, builder_name, build_number, step_name, |
| 341 test_name, status=analysis_status.ERROR | 344 test_name, status=analysis_status.ERROR |
| 342 ) | 345 ) |
| 343 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 346 analysis = MasterFlakeAnalysis.GetVersion( |
| 344 build_number, step_name, test_name) | 347 master_name, builder_name, build_number, step_name, test_name) |
| 345 analysis.success_rates.append(.50) | 348 analysis.pass_rates.append(.50) |
| 346 analysis.build_numbers.append(100) | 349 analysis.build_numbers.append(100) |
| 347 analysis.put() | 350 analysis.put() |
| 348 | 351 |
| 349 queue_name = {'x': False} | 352 queue_name = {'x': False} |
| 350 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument | 353 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument |
| 351 queue_name['x'] = True # pragma: no cover | 354 queue_name['x'] = True # pragma: no cover |
| 352 | 355 |
| 353 self.mock( | 356 self.mock( |
| 354 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 357 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 355 NextBuildNumberPipeline.run( | 358 NextBuildNumberPipeline.run( |
| 356 NextBuildNumberPipeline(), master_name, builder_name, | 359 NextBuildNumberPipeline(), master_name, builder_name, |
| 357 master_build_number, build_number, step_name, test_name, | 360 master_build_number, build_number, step_name, test_name, 1, |
| 358 test_result_future, queue_name, flakiness_algorithm_results_dict) | 361 test_result_future, queue_name, flakiness_algorithm_results_dict) |
| 359 self.assertFalse(queue_name['x']) | 362 self.assertFalse(queue_name['x']) |
| 360 | 363 |
| 361 def testNextBuildPipelineForNewRecursionStabledFlakedOut(self): | 364 def testNextBuildPipelineForNewRecursionStabledFlakedOut(self): |
| 362 master_name = 'm' | 365 master_name = 'm' |
| 363 builder_name = 'b' | 366 builder_name = 'b' |
| 364 master_build_number = 100 | 367 master_build_number = 100 |
| 365 build_number = 100 | 368 build_number = 100 |
| 366 step_name = 's' | 369 step_name = 's' |
| 367 test_name = 't' | 370 test_name = 't' |
| (...skipping 11 matching lines...) Expand all Loading... |
| 379 'sequential_run_index': 0 | 382 'sequential_run_index': 0 |
| 380 } | 383 } |
| 381 self._CreateAndSaveMasterFlakeAnalysis( | 384 self._CreateAndSaveMasterFlakeAnalysis( |
| 382 master_name, builder_name, build_number, step_name, | 385 master_name, builder_name, build_number, step_name, |
| 383 test_name, status=analysis_status.PENDING | 386 test_name, status=analysis_status.PENDING |
| 384 ) | 387 ) |
| 385 self._CreateAndSaveFlakeSwarmingTask( | 388 self._CreateAndSaveFlakeSwarmingTask( |
| 386 master_name, builder_name, build_number, step_name, | 389 master_name, builder_name, build_number, step_name, |
| 387 test_name, status=analysis_status.COMPLETED | 390 test_name, status=analysis_status.COMPLETED |
| 388 ) | 391 ) |
| 389 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 392 analysis = MasterFlakeAnalysis.GetVersion( |
| 390 build_number, step_name, test_name) | 393 master_name, builder_name, build_number, step_name, test_name) |
| 391 analysis.success_rates.append(.50) | 394 analysis.pass_rates.append(.50) |
| 392 analysis.build_numbers.append(100) | 395 analysis.build_numbers.append(100) |
| 393 analysis.put() | 396 analysis.put() |
| 394 | 397 |
| 395 queue_name = {'x': False} | 398 queue_name = {'x': False} |
| 396 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument | 399 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument |
| 397 queue_name['x'] = True # pragma: no cover | 400 queue_name['x'] = True # pragma: no cover |
| 398 | 401 |
| 399 self.mock( | 402 self.mock( |
| 400 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 403 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 401 NextBuildNumberPipeline.run( | 404 NextBuildNumberPipeline.run( |
| 402 NextBuildNumberPipeline(), master_name, builder_name, | 405 NextBuildNumberPipeline(), master_name, builder_name, |
| 403 master_build_number, build_number, step_name, test_name, | 406 master_build_number, build_number, step_name, test_name, |
| 404 test_result_future, queue_name, flakiness_algorithm_results_dict) | 407 analysis.version_number, test_result_future, queue_name, |
| 408 flakiness_algorithm_results_dict) |
| 405 self.assertTrue(queue_name['x']) | 409 self.assertTrue(queue_name['x']) |
| 406 | 410 |
| 407 def testGetNextRunSetStableLowerBoundary(self): | 411 def testGetNextRunSetStableLowerBoundary(self): |
| 408 master_name = 'm' | 412 master_name = 'm' |
| 409 builder_name = 'b' | 413 builder_name = 'b' |
| 410 build_number = 100 | 414 build_number = 100 |
| 411 step_name = 's' | 415 step_name = 's' |
| 412 test_name = 't' | 416 test_name = 't' |
| 413 self._CreateAndSaveMasterFlakeAnalysis( | 417 self._CreateAndSaveMasterFlakeAnalysis( |
| 414 master_name, builder_name, build_number, step_name, | 418 master_name, builder_name, build_number, step_name, |
| 415 test_name, status=analysis_status.PENDING | 419 test_name, status=analysis_status.PENDING |
| 416 ) | 420 ) |
| 417 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 421 analysis = MasterFlakeAnalysis.GetVersion( |
| 418 build_number, step_name, test_name) | 422 master_name, builder_name, build_number, step_name, test_name) |
| 419 analysis.success_rates.append(1) | 423 analysis.pass_rates.append(1) |
| 420 analysis.build_numbers.append(100) | 424 analysis.build_numbers.append(100) |
| 421 analysis.put() | 425 analysis.put() |
| 422 | 426 |
| 423 flakiness_algorithm_results_dict = { | 427 flakiness_algorithm_results_dict = { |
| 424 'flakes_in_a_row': 4, | 428 'flakes_in_a_row': 4, |
| 425 'stable_in_a_row': 0, | 429 'stable_in_a_row': 0, |
| 426 'stabled_out': False, | 430 'stabled_out': False, |
| 427 'flaked_out': True, | 431 'flaked_out': True, |
| 428 'last_build_number': 0, | 432 'last_build_number': 0, |
| 429 'lower_boundary': None, | 433 'lower_boundary': None, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 440 def testGetNextRunSetFlakeLowerBoundary(self): | 444 def testGetNextRunSetFlakeLowerBoundary(self): |
| 441 master_name = 'm' | 445 master_name = 'm' |
| 442 builder_name = 'b' | 446 builder_name = 'b' |
| 443 build_number = 100 | 447 build_number = 100 |
| 444 step_name = 's' | 448 step_name = 's' |
| 445 test_name = 't' | 449 test_name = 't' |
| 446 self._CreateAndSaveMasterFlakeAnalysis( | 450 self._CreateAndSaveMasterFlakeAnalysis( |
| 447 master_name, builder_name, build_number, step_name, | 451 master_name, builder_name, build_number, step_name, |
| 448 test_name, status=analysis_status.PENDING | 452 test_name, status=analysis_status.PENDING |
| 449 ) | 453 ) |
| 450 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 454 analysis = MasterFlakeAnalysis.GetVersion( |
| 451 build_number, step_name, test_name) | 455 master_name, builder_name, build_number, step_name, test_name) |
| 452 analysis.success_rates.append(.5) | 456 analysis.pass_rates.append(.5) |
| 453 analysis.build_numbers.append(100) | 457 analysis.build_numbers.append(100) |
| 454 analysis.put() | 458 analysis.put() |
| 455 | 459 |
| 456 flakiness_algorithm_results_dict = { | 460 flakiness_algorithm_results_dict = { |
| 457 'flakes_in_a_row': 0, | 461 'flakes_in_a_row': 0, |
| 458 'stable_in_a_row': 0, | 462 'stable_in_a_row': 0, |
| 459 'stabled_out': True, | 463 'stabled_out': True, |
| 460 'flaked_out': False, | 464 'flaked_out': False, |
| 461 'last_build_number': 0, | 465 'last_build_number': 0, |
| 462 'lower_boundary': None, | 466 'lower_boundary': None, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 473 def testSequentialNextRunFirstTime(self): | 477 def testSequentialNextRunFirstTime(self): |
| 474 master_name = 'm' | 478 master_name = 'm' |
| 475 builder_name = 'b' | 479 builder_name = 'b' |
| 476 build_number = 100 | 480 build_number = 100 |
| 477 step_name = 's' | 481 step_name = 's' |
| 478 test_name = 't' | 482 test_name = 't' |
| 479 self._CreateAndSaveMasterFlakeAnalysis( | 483 self._CreateAndSaveMasterFlakeAnalysis( |
| 480 master_name, builder_name, build_number, step_name, | 484 master_name, builder_name, build_number, step_name, |
| 481 test_name, status=analysis_status.PENDING | 485 test_name, status=analysis_status.PENDING |
| 482 ) | 486 ) |
| 483 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 487 analysis = MasterFlakeAnalysis.GetVersion( |
| 484 build_number, step_name, test_name) | 488 master_name, builder_name, build_number, step_name, test_name) |
| 485 analysis.success_rates.append(.5) | 489 analysis.pass_rates.append(.5) |
| 486 analysis.build_numbers.append(100) | 490 analysis.build_numbers.append(100) |
| 487 analysis.put() | 491 analysis.put() |
| 488 | 492 |
| 489 flakiness_algorithm_results_dict = { | 493 flakiness_algorithm_results_dict = { |
| 490 'flakes_in_a_row': 0, | 494 'flakes_in_a_row': 0, |
| 491 'stable_in_a_row': 0, | 495 'stable_in_a_row': 0, |
| 492 'stabled_out': True, | 496 'stabled_out': True, |
| 493 'flaked_out': True, | 497 'flaked_out': True, |
| 494 'last_build_number': 0, | 498 'last_build_number': 0, |
| 495 'lower_boundary': 100, | 499 'lower_boundary': 100, |
| 496 'upper_boundary': 110, | 500 'upper_boundary': 110, |
| 497 'lower_boundary_result': 'STABLE', | 501 'lower_boundary_result': 'STABLE', |
| 498 'sequential_run_index': 0 | 502 'sequential_run_index': 0 |
| 499 } | 503 } |
| 500 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) | 504 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) |
| 501 self.assertEqual(next_run, 101) | 505 self.assertEqual(next_run, 101) |
| 502 | 506 |
| 503 def testSequentialFoundBorderFlake(self): | 507 def testSequentialFoundBorderFlake(self): |
| 504 master_name = 'm' | 508 master_name = 'm' |
| 505 builder_name = 'b' | 509 builder_name = 'b' |
| 506 build_number = 100 | 510 build_number = 100 |
| 507 step_name = 's' | 511 step_name = 's' |
| 508 test_name = 't' | 512 test_name = 't' |
| 509 self._CreateAndSaveMasterFlakeAnalysis( | 513 self._CreateAndSaveMasterFlakeAnalysis( |
| 510 master_name, builder_name, build_number, step_name, | 514 master_name, builder_name, build_number, step_name, |
| 511 test_name, status=analysis_status.PENDING | 515 test_name, status=analysis_status.PENDING |
| 512 ) | 516 ) |
| 513 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 517 analysis = MasterFlakeAnalysis.GetVersion( |
| 514 build_number, step_name, test_name) | 518 master_name, builder_name, build_number, step_name, test_name) |
| 515 analysis.success_rates.append(.5) | 519 analysis.pass_rates.append(.5) |
| 516 analysis.build_numbers.append(100) | 520 analysis.build_numbers.append(100) |
| 517 analysis.put() | 521 analysis.put() |
| 518 | 522 |
| 519 flakiness_algorithm_results_dict = { | 523 flakiness_algorithm_results_dict = { |
| 520 'flakes_in_a_row': 0, | 524 'flakes_in_a_row': 0, |
| 521 'stable_in_a_row': 0, | 525 'stable_in_a_row': 0, |
| 522 'stabled_out': True, | 526 'stabled_out': True, |
| 523 'flaked_out': True, | 527 'flaked_out': True, |
| 524 'last_build_number': 0, | 528 'last_build_number': 0, |
| 525 'lower_boundary': 100, | 529 'lower_boundary': 100, |
| 526 'upper_boundary': 110, | 530 'upper_boundary': 110, |
| 527 'lower_boundary_result': 'STABLE', | 531 'lower_boundary_result': 'STABLE', |
| 528 'sequential_run_index': 1 | 532 'sequential_run_index': 1 |
| 529 } | 533 } |
| 530 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) | 534 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) |
| 531 self.assertEqual(next_run, False) | 535 self.assertEqual(next_run, False) |
| 532 self.assertEqual(analysis.suspected_flake_build_number, 101) | 536 self.assertEqual(analysis.suspected_flake_build_number, 101) |
| 533 | 537 |
| 534 def testSequentialFoundBorderStable(self): | 538 def testSequentialFoundBorderStable(self): |
| 535 master_name = 'm' | 539 master_name = 'm' |
| 536 builder_name = 'b' | 540 builder_name = 'b' |
| 537 build_number = 100 | 541 build_number = 100 |
| 538 step_name = 's' | 542 step_name = 's' |
| 539 test_name = 't' | 543 test_name = 't' |
| 540 self._CreateAndSaveMasterFlakeAnalysis( | 544 self._CreateAndSaveMasterFlakeAnalysis( |
| 541 master_name, builder_name, build_number, step_name, | 545 master_name, builder_name, build_number, step_name, |
| 542 test_name, status=analysis_status.PENDING | 546 test_name, status=analysis_status.PENDING |
| 543 ) | 547 ) |
| 544 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 548 analysis = MasterFlakeAnalysis.GetVersion( |
| 545 build_number, step_name, test_name) | 549 master_name, builder_name, build_number, step_name, test_name) |
| 546 analysis.success_rates.append(1) | 550 analysis.pass_rates.append(1) |
| 547 analysis.build_numbers.append(100) | 551 analysis.build_numbers.append(100) |
| 548 analysis.put() | 552 analysis.put() |
| 549 | 553 |
| 550 flakiness_algorithm_results_dict = { | 554 flakiness_algorithm_results_dict = { |
| 551 'flakes_in_a_row': 0, | 555 'flakes_in_a_row': 0, |
| 552 'stable_in_a_row': 0, | 556 'stable_in_a_row': 0, |
| 553 'stabled_out': True, | 557 'stabled_out': True, |
| 554 'flaked_out': True, | 558 'flaked_out': True, |
| 555 'last_build_number': 0, | 559 'last_build_number': 0, |
| 556 'lower_boundary': 100, | 560 'lower_boundary': 100, |
| 557 'upper_boundary': 110, | 561 'upper_boundary': 110, |
| 558 'lower_boundary_result': 'FLAKE', | 562 'lower_boundary_result': 'FLAKE', |
| 559 'sequential_run_index': 1 | 563 'sequential_run_index': 1 |
| 560 } | 564 } |
| 561 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) | 565 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) |
| 562 self.assertEqual(next_run, False) | 566 self.assertEqual(next_run, False) |
| 563 self.assertEqual(analysis.suspected_flake_build_number, 101) | 567 self.assertEqual(analysis.suspected_flake_build_number, 101) |
| 564 | 568 |
| 565 | |
| 566 def testSequentialDidntFindBorderStable(self): | 569 def testSequentialDidntFindBorderStable(self): |
| 567 master_name = 'm' | 570 master_name = 'm' |
| 568 builder_name = 'b' | 571 builder_name = 'b' |
| 569 build_number = 100 | 572 build_number = 100 |
| 570 step_name = 's' | 573 step_name = 's' |
| 571 test_name = 't' | 574 test_name = 't' |
| 572 self._CreateAndSaveMasterFlakeAnalysis( | 575 self._CreateAndSaveMasterFlakeAnalysis( |
| 573 master_name, builder_name, build_number, step_name, | 576 master_name, builder_name, build_number, step_name, |
| 574 test_name, status=analysis_status.PENDING | 577 test_name, status=analysis_status.PENDING |
| 575 ) | 578 ) |
| 576 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 579 analysis = MasterFlakeAnalysis.GetVersion( |
| 577 build_number, step_name, test_name) | 580 master_name, builder_name, build_number, step_name, test_name) |
| 578 analysis.success_rates.append(1) | 581 analysis.pass_rates.append(1) |
| 579 analysis.build_numbers.append(100) | 582 analysis.build_numbers.append(100) |
| 580 analysis.put() | 583 analysis.put() |
| 581 | 584 |
| 582 flakiness_algorithm_results_dict = { | 585 flakiness_algorithm_results_dict = { |
| 583 'flakes_in_a_row': 0, | 586 'flakes_in_a_row': 0, |
| 584 'stable_in_a_row': 0, | 587 'stable_in_a_row': 0, |
| 585 'stabled_out': True, | 588 'stabled_out': True, |
| 586 'flaked_out': True, | 589 'flaked_out': True, |
| 587 'last_build_number': 0, | 590 'last_build_number': 0, |
| 588 'lower_boundary': 100, | 591 'lower_boundary': 100, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 616 | 619 |
| 617 } | 620 } |
| 618 self._CreateAndSaveMasterFlakeAnalysis( | 621 self._CreateAndSaveMasterFlakeAnalysis( |
| 619 master_name, builder_name, build_number, step_name, | 622 master_name, builder_name, build_number, step_name, |
| 620 test_name, status=analysis_status.PENDING | 623 test_name, status=analysis_status.PENDING |
| 621 ) | 624 ) |
| 622 self._CreateAndSaveFlakeSwarmingTask( | 625 self._CreateAndSaveFlakeSwarmingTask( |
| 623 master_name, builder_name, build_number, step_name, | 626 master_name, builder_name, build_number, step_name, |
| 624 test_name, status=analysis_status.COMPLETED | 627 test_name, status=analysis_status.COMPLETED |
| 625 ) | 628 ) |
| 626 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 629 analysis = MasterFlakeAnalysis.GetVersion( |
| 627 build_number, step_name, test_name) | 630 master_name, builder_name, build_number, step_name, test_name) |
| 628 analysis.success_rates.append(1) | 631 analysis.pass_rates.append(1) |
| 629 analysis.build_numbers.append(50) | 632 analysis.build_numbers.append(50) |
| 630 analysis.put() | 633 analysis.put() |
| 631 | 634 |
| 632 NextBuildNumberPipeline.run( | 635 NextBuildNumberPipeline.run( |
| 633 NextBuildNumberPipeline(), master_name, builder_name, | 636 NextBuildNumberPipeline(), master_name, builder_name, |
| 634 master_build_number, build_number, step_name, test_name, | 637 master_build_number, build_number, step_name, test_name, |
| 635 test_result_future, queue_name, flakiness_algorithm_results_dict) | 638 analysis.version_number, test_result_future, queue_name, |
| 639 flakiness_algorithm_results_dict) |
| 636 self.assertEquals( | 640 self.assertEquals( |
| 637 flakiness_algorithm_results_dict['sequential_run_index'], 1) | 641 flakiness_algorithm_results_dict['sequential_run_index'], 1) |
| 638 | 642 |
| 639 def testNextBuildWhenTestNotExistingAfterStableInARow(self): | 643 def testNextBuildWhenTestNotExistingAfterStableInARow(self): |
| 640 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't') | 644 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't') |
| 641 master.success_rates = [0.8, 1.0, 1.0, -1] | 645 master.pass_rates = [0.8, 1.0, 1.0, -1] |
| 642 master.build_numbers = [100, 80, 70, 60] | 646 master.build_numbers = [100, 80, 70, 60] |
| 643 flakiness_algorithm_results_dict = { | 647 flakiness_algorithm_results_dict = { |
| 644 'flakes_in_a_row': 0, | 648 'flakes_in_a_row': 0, |
| 645 'stable_in_a_row': 2, | 649 'stable_in_a_row': 2, |
| 646 'stabled_out': False, | 650 'stabled_out': False, |
| 647 'flaked_out': False, | 651 'flaked_out': False, |
| 648 'last_build_number': 0, | 652 'last_build_number': 0, |
| 649 'lower_boundary': None, | 653 'lower_boundary': None, |
| 650 'upper_boundary': None, | 654 'upper_boundary': None, |
| 651 'lower_boundary_result': None, | 655 'lower_boundary_result': None, |
| 652 'sequential_run_index': 0, | 656 'sequential_run_index': 0, |
| 653 } | 657 } |
| 654 | 658 |
| 655 next_run = get_next_run(master, flakiness_algorithm_results_dict) | 659 next_run = get_next_run(master, flakiness_algorithm_results_dict) |
| 656 self.assertEqual(81, next_run) | 660 self.assertEqual(81, next_run) |
| 657 self.assertTrue(flakiness_algorithm_results_dict['stabled_out']) | 661 self.assertTrue(flakiness_algorithm_results_dict['stabled_out']) |
| 658 self.assertTrue(flakiness_algorithm_results_dict['flaked_out']) | 662 self.assertTrue(flakiness_algorithm_results_dict['flaked_out']) |
| 659 self.assertEqual(80, flakiness_algorithm_results_dict['lower_boundary']) | 663 self.assertEqual(80, flakiness_algorithm_results_dict['lower_boundary']) |
| 660 self.assertEqual('STABLE', | 664 self.assertEqual('STABLE', |
| 661 flakiness_algorithm_results_dict['lower_boundary_result']) | 665 flakiness_algorithm_results_dict['lower_boundary_result']) |
| 662 | 666 |
| 663 def testNextBuildWhenTestNotExistingAfterFlakeInARow(self): | 667 def testNextBuildWhenTestNotExistingAfterFlakeInARow(self): |
| 664 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't') | 668 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't') |
| 665 master.success_rates = [0.8, 0.7, 0.75, -1] | 669 master.pass_rates = [0.8, 0.7, 0.75, -1] |
| 666 master.build_numbers = [100, 80, 70, 60] | 670 master.build_numbers = [100, 80, 70, 60] |
| 667 flakiness_algorithm_results_dict = { | 671 flakiness_algorithm_results_dict = { |
| 668 'flakes_in_a_row': 3, | 672 'flakes_in_a_row': 3, |
| 669 'stable_in_a_row': 0, | 673 'stable_in_a_row': 0, |
| 670 'stabled_out': False, | 674 'stabled_out': False, |
| 671 'flaked_out': False, | 675 'flaked_out': False, |
| 672 'last_build_number': 0, | 676 'last_build_number': 0, |
| 673 'lower_boundary': None, | 677 'lower_boundary': None, |
| 674 'upper_boundary': None, | 678 'upper_boundary': None, |
| 675 'lower_boundary_result': None, | 679 'lower_boundary_result': None, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 699 'stabled_out': False, | 703 'stabled_out': False, |
| 700 'flaked_out': False, | 704 'flaked_out': False, |
| 701 'last_build_number': 0, | 705 'last_build_number': 0, |
| 702 'lower_boundary': None, | 706 'lower_boundary': None, |
| 703 'upper_boundary': None, | 707 'upper_boundary': None, |
| 704 'lower_boundary_result': None, | 708 'lower_boundary_result': None, |
| 705 'sequential_run_index': 0 | 709 'sequential_run_index': 0 |
| 706 } | 710 } |
| 707 self._CreateAndSaveMasterFlakeAnalysis( | 711 self._CreateAndSaveMasterFlakeAnalysis( |
| 708 master_name, builder_name, master_build_number, step_name, | 712 master_name, builder_name, master_build_number, step_name, |
| 709 test_name, status=analysis_status.RUNNING | 713 test_name, status=analysis_status.RUNNING) |
| 710 ) | |
| 711 self._CreateAndSaveFlakeSwarmingTask( | 714 self._CreateAndSaveFlakeSwarmingTask( |
| 712 master_name, builder_name, build_number, step_name, | 715 master_name, builder_name, build_number, step_name, |
| 713 test_name, status=analysis_status.COMPLETED | 716 test_name, status=analysis_status.COMPLETED) |
| 714 ) | 717 |
| 715 analysis = MasterFlakeAnalysis.Get( | 718 analysis = MasterFlakeAnalysis.GetVersion( |
| 716 master_name, builder_name, | 719 master_name, builder_name, master_build_number, step_name, test_name) |
| 717 master_build_number, step_name, test_name) | 720 analysis.pass_rates = [1.0, 1.0, 1.0, -1] |
| 718 analysis.success_rates = [1.0, 1.0, 1.0, -1] | |
| 719 analysis.build_numbers = [100, 80, 70, 60] | 721 analysis.build_numbers = [100, 80, 70, 60] |
| 720 analysis.put() | 722 analysis.put() |
| 721 | 723 |
| 722 pipeline = NextBuildNumberPipeline() | 724 pipeline = NextBuildNumberPipeline() |
| 723 pipeline.run( | 725 pipeline.run( |
| 724 master_name, builder_name, | 726 master_name, builder_name, |
| 725 master_build_number, build_number, step_name, test_name, | 727 master_build_number, build_number, step_name, test_name, |
| 726 test_result_future, queue_name, flakiness_algorithm_results_dict) | 728 analysis.version_number, test_result_future, queue_name, |
| 729 flakiness_algorithm_results_dict) |
| 727 | 730 |
| 728 analysis = MasterFlakeAnalysis.Get( | 731 analysis = MasterFlakeAnalysis.GetVersion( |
| 729 master_name, builder_name, | 732 master_name, builder_name, master_build_number, step_name, test_name) |
| 730 master_build_number, step_name, test_name) | |
| 731 self.assertEqual(analysis_status.COMPLETED, analysis.status) | 733 self.assertEqual(analysis_status.COMPLETED, analysis.status) |
| 732 | 734 |
| 733 def testNextBuildNumberIsSmallerThanLastBuildNumber(self): | 735 def testNextBuildNumberIsSmallerThanLastBuildNumber(self): |
| 734 master_name = 'm' | 736 master_name = 'm' |
| 735 builder_name = 'b' | 737 builder_name = 'b' |
| 736 master_build_number = 100 | 738 master_build_number = 100 |
| 737 build_number = 60 | 739 build_number = 60 |
| 738 step_name = 's' | 740 step_name = 's' |
| 739 test_name = 't' | 741 test_name = 't' |
| 740 test_result_future = 'trf' | 742 test_result_future = 'trf' |
| 741 queue_name = constants.DEFAULT_QUEUE | 743 queue_name = constants.DEFAULT_QUEUE |
| 742 flakiness_algorithm_results_dict = { | 744 flakiness_algorithm_results_dict = { |
| 743 'flakes_in_a_row': 0, | 745 'flakes_in_a_row': 0, |
| 744 'stable_in_a_row': 3, | 746 'stable_in_a_row': 3, |
| 745 'stabled_out': False, | 747 'stabled_out': False, |
| 746 'flaked_out': False, | 748 'flaked_out': False, |
| 747 'last_build_number': 59, | 749 'last_build_number': 59, |
| 748 'lower_boundary': None, | 750 'lower_boundary': None, |
| 749 'upper_boundary': None, | 751 'upper_boundary': None, |
| 750 'lower_boundary_result': None, | 752 'lower_boundary_result': None, |
| 751 'sequential_run_index': 0 | 753 'sequential_run_index': 0 |
| 752 } | 754 } |
| 753 self._CreateAndSaveMasterFlakeAnalysis( | 755 analysis = MasterFlakeAnalysis.Create( |
| 754 master_name, builder_name, master_build_number, step_name, | 756 master_name, builder_name, master_build_number, step_name, test_name) |
| 755 test_name, status=analysis_status.RUNNING | 757 analysis.pass_rates = [1.0, 1.0, 1.0, 1.0] |
| 756 ) | 758 analysis.build_numbers = [100, 80, 70, 60] |
| 759 analysis.status = analysis_status.RUNNING |
| 760 analysis.Save() |
| 761 |
| 757 self._CreateAndSaveFlakeSwarmingTask( | 762 self._CreateAndSaveFlakeSwarmingTask( |
| 758 master_name, builder_name, build_number, step_name, | 763 master_name, builder_name, build_number, step_name, |
| 759 test_name, status=analysis_status.COMPLETED | 764 test_name, status=analysis_status.COMPLETED) |
| 760 ) | |
| 761 analysis = MasterFlakeAnalysis.Get( | |
| 762 master_name, builder_name, | |
| 763 master_build_number, step_name, test_name) | |
| 764 analysis.success_rates = [1.0, 1.0, 1.0, 1.0] | |
| 765 analysis.build_numbers = [100, 80, 70, 60] | |
| 766 analysis.put() | |
| 767 | 765 |
| 768 pipeline = NextBuildNumberPipeline() | 766 pipeline = NextBuildNumberPipeline() |
| 769 pipeline.run( | 767 pipeline.run( |
| 770 master_name, builder_name, | 768 master_name, builder_name, |
| 771 master_build_number, build_number, step_name, test_name, | 769 master_build_number, build_number, step_name, test_name, |
| 772 test_result_future, queue_name, flakiness_algorithm_results_dict) | 770 analysis.version_number, test_result_future, queue_name, |
| 771 flakiness_algorithm_results_dict) |
| 773 | 772 |
| 774 analysis = MasterFlakeAnalysis.Get( | 773 analysis = MasterFlakeAnalysis.GetVersion( |
| 775 master_name, builder_name, | 774 master_name, builder_name, master_build_number, step_name, test_name) |
| 776 master_build_number, step_name, test_name) | |
| 777 self.assertEqual(analysis_status.COMPLETED, analysis.status) | 775 self.assertEqual(analysis_status.COMPLETED, analysis.status) |
| OLD | NEW |