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