| 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, |
| 23 step_name, test_name, status): | 23 step_name, 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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 | 119 |
| 120 } | 120 } |
| 121 self._CreateAndSaveMasterFlakeAnalysis( | 121 self._CreateAndSaveMasterFlakeAnalysis( |
| 122 master_name, builder_name, build_number, step_name, | 122 master_name, builder_name, build_number, step_name, |
| 123 test_name, status=analysis_status.PENDING | 123 test_name, status=analysis_status.PENDING |
| 124 ) | 124 ) |
| 125 self._CreateAndSaveFlakeSwarmingTask( | 125 self._CreateAndSaveFlakeSwarmingTask( |
| 126 master_name, builder_name, build_number, step_name, | 126 master_name, builder_name, build_number, step_name, |
| 127 test_name, status=analysis_status.COMPLETED | 127 test_name, status=analysis_status.COMPLETED |
| 128 ) | 128 ) |
| 129 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 129 analysis = MasterFlakeAnalysis.GetVersion( |
| 130 build_number, step_name, test_name) | 130 master_name, builder_name, build_number, step_name, test_name) |
| 131 analysis.success_rates.append(.08) | 131 analysis.pass_rates.append(.08) |
| 132 analysis.build_numbers.append(100) | 132 analysis.build_numbers.append(100) |
| 133 analysis.put() | 133 analysis.put() |
| 134 | 134 |
| 135 NextBuildNumberPipeline.run( | 135 NextBuildNumberPipeline.run( |
| 136 NextBuildNumberPipeline(), master_name, builder_name, | 136 NextBuildNumberPipeline(), master_name, builder_name, |
| 137 master_build_number, build_number, step_name, test_name, | 137 master_build_number, build_number, step_name, test_name, |
| 138 test_result_future, queue_name, flakiness_algorithm_results_dict) | 138 test_result_future, queue_name, flakiness_algorithm_results_dict) |
| 139 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) | 139 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) |
| 140 | 140 |
| 141 def testNextBuildPipelineForNewRecursionFirstStable(self): | 141 def testNextBuildPipelineForNewRecursionFirstStable(self): |
| (...skipping 18 matching lines...) Expand all Loading... |
| 160 | 160 |
| 161 } | 161 } |
| 162 self._CreateAndSaveMasterFlakeAnalysis( | 162 self._CreateAndSaveMasterFlakeAnalysis( |
| 163 master_name, builder_name, build_number, step_name, | 163 master_name, builder_name, build_number, step_name, |
| 164 test_name, status=analysis_status.PENDING | 164 test_name, status=analysis_status.PENDING |
| 165 ) | 165 ) |
| 166 self._CreateAndSaveFlakeSwarmingTask( | 166 self._CreateAndSaveFlakeSwarmingTask( |
| 167 master_name, builder_name, build_number, step_name, | 167 master_name, builder_name, build_number, step_name, |
| 168 test_name, status=analysis_status.COMPLETED | 168 test_name, status=analysis_status.COMPLETED |
| 169 ) | 169 ) |
| 170 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 170 analysis = MasterFlakeAnalysis.GetVersion( |
| 171 build_number, step_name, test_name) | 171 master_name, builder_name, build_number, step_name, test_name) |
| 172 analysis.success_rates.append(0) | 172 analysis.pass_rates.append(0) |
| 173 analysis.build_numbers.append(100) | 173 analysis.build_numbers.append(100) |
| 174 analysis.put() | 174 analysis.put() |
| 175 | 175 |
| 176 NextBuildNumberPipeline.run( | 176 NextBuildNumberPipeline.run( |
| 177 NextBuildNumberPipeline(), master_name, builder_name, | 177 NextBuildNumberPipeline(), master_name, builder_name, |
| 178 master_build_number, build_number, step_name, | 178 master_build_number, build_number, step_name, |
| 179 test_name, test_result_future, queue_name, | 179 test_name, test_result_future, queue_name, |
| 180 flakiness_algorithm_results_dict) | 180 flakiness_algorithm_results_dict) |
| 181 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) | 181 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) |
| 182 | 182 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 202 | 202 |
| 203 } | 203 } |
| 204 self._CreateAndSaveMasterFlakeAnalysis( | 204 self._CreateAndSaveMasterFlakeAnalysis( |
| 205 master_name, builder_name, build_number, step_name, | 205 master_name, builder_name, build_number, step_name, |
| 206 test_name, status=analysis_status.PENDING | 206 test_name, status=analysis_status.PENDING |
| 207 ) | 207 ) |
| 208 self._CreateAndSaveFlakeSwarmingTask( | 208 self._CreateAndSaveFlakeSwarmingTask( |
| 209 master_name, builder_name, build_number, step_name, | 209 master_name, builder_name, build_number, step_name, |
| 210 test_name, status=analysis_status.COMPLETED | 210 test_name, status=analysis_status.COMPLETED |
| 211 ) | 211 ) |
| 212 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 212 analysis = MasterFlakeAnalysis.GetVersion( |
| 213 build_number, step_name, test_name) | 213 master_name, builder_name, build_number, step_name, test_name) |
| 214 analysis.success_rates.append(0) | 214 analysis.pass_rates.append(0) |
| 215 analysis.build_numbers.append(100) | 215 analysis.build_numbers.append(100) |
| 216 analysis.put() | 216 analysis.put() |
| 217 | 217 |
| 218 NextBuildNumberPipeline.run( | 218 NextBuildNumberPipeline.run( |
| 219 NextBuildNumberPipeline(), master_name, builder_name, | 219 NextBuildNumberPipeline(), master_name, builder_name, |
| 220 master_build_number, build_number, step_name, | 220 master_build_number, build_number, step_name, |
| 221 test_name, test_result_future, queue_name, | 221 test_name, test_result_future, queue_name, |
| 222 flakiness_algorithm_results_dict) | 222 flakiness_algorithm_results_dict) |
| 223 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) | 223 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) |
| 224 | 224 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 244 | 244 |
| 245 } | 245 } |
| 246 self._CreateAndSaveMasterFlakeAnalysis( | 246 self._CreateAndSaveMasterFlakeAnalysis( |
| 247 master_name, builder_name, build_number, step_name, | 247 master_name, builder_name, build_number, step_name, |
| 248 test_name, status=analysis_status.PENDING | 248 test_name, status=analysis_status.PENDING |
| 249 ) | 249 ) |
| 250 self._CreateAndSaveFlakeSwarmingTask( | 250 self._CreateAndSaveFlakeSwarmingTask( |
| 251 master_name, builder_name, build_number, step_name, | 251 master_name, builder_name, build_number, step_name, |
| 252 test_name, status=analysis_status.COMPLETED | 252 test_name, status=analysis_status.COMPLETED |
| 253 ) | 253 ) |
| 254 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 254 analysis = MasterFlakeAnalysis.GetVersion( |
| 255 build_number, step_name, test_name) | 255 master_name, builder_name, build_number, step_name, test_name) |
| 256 analysis.success_rates.append(.50) | 256 analysis.pass_rates.append(.50) |
| 257 analysis.build_numbers.append(100) | 257 analysis.build_numbers.append(100) |
| 258 analysis.put() | 258 analysis.put() |
| 259 | 259 |
| 260 NextBuildNumberPipeline.run( | 260 NextBuildNumberPipeline.run( |
| 261 NextBuildNumberPipeline(), master_name, builder_name, | 261 NextBuildNumberPipeline(), master_name, builder_name, |
| 262 master_build_number, build_number, step_name, | 262 master_build_number, build_number, step_name, |
| 263 test_name, test_result_future, queue_name, | 263 test_name, test_result_future, queue_name, |
| 264 flakiness_algorithm_results_dict) | 264 flakiness_algorithm_results_dict) |
| 265 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) | 265 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) |
| 266 | 266 |
| 267 | |
| 268 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self): | 267 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self): |
| 269 master_name = 'm' | 268 master_name = 'm' |
| 270 builder_name = 'b' | 269 builder_name = 'b' |
| 271 master_build_number = 100 | 270 master_build_number = 100 |
| 272 build_number = 100 | 271 build_number = 100 |
| 273 step_name = 's' | 272 step_name = 's' |
| 274 test_name = 't' | 273 test_name = 't' |
| 275 test_result_future = 'trf' | 274 test_result_future = 'trf' |
| 276 queue_name = constants.DEFAULT_QUEUE | 275 queue_name = constants.DEFAULT_QUEUE |
| 277 flakiness_algorithm_results_dict = { | 276 flakiness_algorithm_results_dict = { |
| 278 'flakes_in_a_row': 0, | 277 'flakes_in_a_row': 0, |
| 279 'stable_in_a_row': 0, | 278 'stable_in_a_row': 0, |
| 280 'stabled_out': False, | 279 'stabled_out': False, |
| 281 'flaked_out': False, | 280 'flaked_out': False, |
| 282 'last_build_number': 200, | 281 'last_build_number': 200, |
| 283 'lower_boundary': None, | 282 'lower_boundary': None, |
| 284 'upper_boundary': None, | 283 'upper_boundary': None, |
| 285 'lower_boundary_result': None, | 284 'lower_boundary_result': None, |
| 286 'sequential_run_index': 0 | 285 'sequential_run_index': 0 |
| 287 } | 286 } |
| 288 self._CreateAndSaveMasterFlakeAnalysis( | 287 self._CreateAndSaveMasterFlakeAnalysis( |
| 289 master_name, builder_name, build_number, step_name, | 288 master_name, builder_name, build_number, step_name, |
| 290 test_name, status=analysis_status.PENDING | 289 test_name, status=analysis_status.PENDING |
| 291 ) | 290 ) |
| 292 self._CreateAndSaveFlakeSwarmingTask( | 291 self._CreateAndSaveFlakeSwarmingTask( |
| 293 master_name, builder_name, build_number, step_name, | 292 master_name, builder_name, build_number, step_name, |
| 294 test_name, status=analysis_status.COMPLETED | 293 test_name, status=analysis_status.COMPLETED |
| 295 ) | 294 ) |
| 296 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 295 analysis = MasterFlakeAnalysis.GetVersion( |
| 297 build_number, step_name, test_name) | 296 master_name, builder_name, build_number, step_name, test_name) |
| 298 analysis.success_rates.append(.50) | 297 analysis.pass_rates.append(.50) |
| 299 analysis.build_numbers.append(100) | 298 analysis.build_numbers.append(100) |
| 300 analysis.put() | 299 analysis.put() |
| 301 | 300 |
| 302 queue_name = {'x': False} | 301 queue_name = {'x': False} |
| 303 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument | 302 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument |
| 304 queue_name['x'] = True # pragma: no cover | 303 queue_name['x'] = True # pragma: no cover |
| 305 | 304 |
| 306 self.mock( | 305 self.mock( |
| 307 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 306 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 308 NextBuildNumberPipeline.run( | 307 NextBuildNumberPipeline.run( |
| (...skipping 24 matching lines...) Expand all Loading... |
| 333 | 332 |
| 334 } | 333 } |
| 335 self._CreateAndSaveMasterFlakeAnalysis( | 334 self._CreateAndSaveMasterFlakeAnalysis( |
| 336 master_name, builder_name, build_number, step_name, | 335 master_name, builder_name, build_number, step_name, |
| 337 test_name, status=analysis_status.PENDING | 336 test_name, status=analysis_status.PENDING |
| 338 ) | 337 ) |
| 339 self._CreateAndSaveFlakeSwarmingTask( | 338 self._CreateAndSaveFlakeSwarmingTask( |
| 340 master_name, builder_name, build_number, step_name, | 339 master_name, builder_name, build_number, step_name, |
| 341 test_name, status=analysis_status.ERROR | 340 test_name, status=analysis_status.ERROR |
| 342 ) | 341 ) |
| 343 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 342 analysis = MasterFlakeAnalysis.GetVersion( |
| 344 build_number, step_name, test_name) | 343 master_name, builder_name, build_number, step_name, test_name) |
| 345 analysis.success_rates.append(.50) | 344 analysis.pass_rates.append(.50) |
| 346 analysis.build_numbers.append(100) | 345 analysis.build_numbers.append(100) |
| 347 analysis.put() | 346 analysis.put() |
| 348 | 347 |
| 349 queue_name = {'x': False} | 348 queue_name = {'x': False} |
| 350 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument | 349 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument |
| 351 queue_name['x'] = True # pragma: no cover | 350 queue_name['x'] = True # pragma: no cover |
| 352 | 351 |
| 353 self.mock( | 352 self.mock( |
| 354 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 353 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 355 NextBuildNumberPipeline.run( | 354 NextBuildNumberPipeline.run( |
| (...skipping 23 matching lines...) Expand all Loading... |
| 379 'sequential_run_index': 0 | 378 'sequential_run_index': 0 |
| 380 } | 379 } |
| 381 self._CreateAndSaveMasterFlakeAnalysis( | 380 self._CreateAndSaveMasterFlakeAnalysis( |
| 382 master_name, builder_name, build_number, step_name, | 381 master_name, builder_name, build_number, step_name, |
| 383 test_name, status=analysis_status.PENDING | 382 test_name, status=analysis_status.PENDING |
| 384 ) | 383 ) |
| 385 self._CreateAndSaveFlakeSwarmingTask( | 384 self._CreateAndSaveFlakeSwarmingTask( |
| 386 master_name, builder_name, build_number, step_name, | 385 master_name, builder_name, build_number, step_name, |
| 387 test_name, status=analysis_status.COMPLETED | 386 test_name, status=analysis_status.COMPLETED |
| 388 ) | 387 ) |
| 389 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 388 analysis = MasterFlakeAnalysis.GetVersion( |
| 390 build_number, step_name, test_name) | 389 master_name, builder_name, build_number, step_name, test_name) |
| 391 analysis.success_rates.append(.50) | 390 analysis.pass_rates.append(.50) |
| 392 analysis.build_numbers.append(100) | 391 analysis.build_numbers.append(100) |
| 393 analysis.put() | 392 analysis.put() |
| 394 | 393 |
| 395 queue_name = {'x': False} | 394 queue_name = {'x': False} |
| 396 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument | 395 def my_mocked_run(arg1, queue_name): # pylint: disable=unused-argument |
| 397 queue_name['x'] = True # pragma: no cover | 396 queue_name['x'] = True # pragma: no cover |
| 398 | 397 |
| 399 self.mock( | 398 self.mock( |
| 400 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 399 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 401 NextBuildNumberPipeline.run( | 400 NextBuildNumberPipeline.run( |
| 402 NextBuildNumberPipeline(), master_name, builder_name, | 401 NextBuildNumberPipeline(), master_name, builder_name, |
| 403 master_build_number, build_number, step_name, test_name, | 402 master_build_number, build_number, step_name, test_name, |
| 404 test_result_future, queue_name, flakiness_algorithm_results_dict) | 403 test_result_future, queue_name, flakiness_algorithm_results_dict) |
| 405 self.assertTrue(queue_name['x']) | 404 self.assertTrue(queue_name['x']) |
| 406 | 405 |
| 407 def testGetNextRunSetStableLowerBoundary(self): | 406 def testGetNextRunSetStableLowerBoundary(self): |
| 408 master_name = 'm' | 407 master_name = 'm' |
| 409 builder_name = 'b' | 408 builder_name = 'b' |
| 410 build_number = 100 | 409 build_number = 100 |
| 411 step_name = 's' | 410 step_name = 's' |
| 412 test_name = 't' | 411 test_name = 't' |
| 413 self._CreateAndSaveMasterFlakeAnalysis( | 412 self._CreateAndSaveMasterFlakeAnalysis( |
| 414 master_name, builder_name, build_number, step_name, | 413 master_name, builder_name, build_number, step_name, |
| 415 test_name, status=analysis_status.PENDING | 414 test_name, status=analysis_status.PENDING |
| 416 ) | 415 ) |
| 417 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 416 analysis = MasterFlakeAnalysis.GetVersion( |
| 418 build_number, step_name, test_name) | 417 master_name, builder_name, build_number, step_name, test_name) |
| 419 analysis.success_rates.append(1) | 418 analysis.pass_rates.append(1) |
| 420 analysis.build_numbers.append(100) | 419 analysis.build_numbers.append(100) |
| 421 analysis.put() | 420 analysis.put() |
| 422 | 421 |
| 423 flakiness_algorithm_results_dict = { | 422 flakiness_algorithm_results_dict = { |
| 424 'flakes_in_a_row': 4, | 423 'flakes_in_a_row': 4, |
| 425 'stable_in_a_row': 0, | 424 'stable_in_a_row': 0, |
| 426 'stabled_out': False, | 425 'stabled_out': False, |
| 427 'flaked_out': True, | 426 'flaked_out': True, |
| 428 'last_build_number': 0, | 427 'last_build_number': 0, |
| 429 'lower_boundary': None, | 428 'lower_boundary': None, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 440 def testGetNextRunSetFlakeLowerBoundary(self): | 439 def testGetNextRunSetFlakeLowerBoundary(self): |
| 441 master_name = 'm' | 440 master_name = 'm' |
| 442 builder_name = 'b' | 441 builder_name = 'b' |
| 443 build_number = 100 | 442 build_number = 100 |
| 444 step_name = 's' | 443 step_name = 's' |
| 445 test_name = 't' | 444 test_name = 't' |
| 446 self._CreateAndSaveMasterFlakeAnalysis( | 445 self._CreateAndSaveMasterFlakeAnalysis( |
| 447 master_name, builder_name, build_number, step_name, | 446 master_name, builder_name, build_number, step_name, |
| 448 test_name, status=analysis_status.PENDING | 447 test_name, status=analysis_status.PENDING |
| 449 ) | 448 ) |
| 450 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 449 analysis = MasterFlakeAnalysis.GetVersion( |
| 451 build_number, step_name, test_name) | 450 master_name, builder_name, build_number, step_name, test_name) |
| 452 analysis.success_rates.append(.5) | 451 analysis.pass_rates.append(.5) |
| 453 analysis.build_numbers.append(100) | 452 analysis.build_numbers.append(100) |
| 454 analysis.put() | 453 analysis.put() |
| 455 | 454 |
| 456 flakiness_algorithm_results_dict = { | 455 flakiness_algorithm_results_dict = { |
| 457 'flakes_in_a_row': 0, | 456 'flakes_in_a_row': 0, |
| 458 'stable_in_a_row': 0, | 457 'stable_in_a_row': 0, |
| 459 'stabled_out': True, | 458 'stabled_out': True, |
| 460 'flaked_out': False, | 459 'flaked_out': False, |
| 461 'last_build_number': 0, | 460 'last_build_number': 0, |
| 462 'lower_boundary': None, | 461 'lower_boundary': None, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 473 def testSequentialNextRunFirstTime(self): | 472 def testSequentialNextRunFirstTime(self): |
| 474 master_name = 'm' | 473 master_name = 'm' |
| 475 builder_name = 'b' | 474 builder_name = 'b' |
| 476 build_number = 100 | 475 build_number = 100 |
| 477 step_name = 's' | 476 step_name = 's' |
| 478 test_name = 't' | 477 test_name = 't' |
| 479 self._CreateAndSaveMasterFlakeAnalysis( | 478 self._CreateAndSaveMasterFlakeAnalysis( |
| 480 master_name, builder_name, build_number, step_name, | 479 master_name, builder_name, build_number, step_name, |
| 481 test_name, status=analysis_status.PENDING | 480 test_name, status=analysis_status.PENDING |
| 482 ) | 481 ) |
| 483 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 482 analysis = MasterFlakeAnalysis.GetVersion( |
| 484 build_number, step_name, test_name) | 483 master_name, builder_name, build_number, step_name, test_name) |
| 485 analysis.success_rates.append(.5) | 484 analysis.pass_rates.append(.5) |
| 486 analysis.build_numbers.append(100) | 485 analysis.build_numbers.append(100) |
| 487 analysis.put() | 486 analysis.put() |
| 488 | 487 |
| 489 flakiness_algorithm_results_dict = { | 488 flakiness_algorithm_results_dict = { |
| 490 'flakes_in_a_row': 0, | 489 'flakes_in_a_row': 0, |
| 491 'stable_in_a_row': 0, | 490 'stable_in_a_row': 0, |
| 492 'stabled_out': True, | 491 'stabled_out': True, |
| 493 'flaked_out': True, | 492 'flaked_out': True, |
| 494 'last_build_number': 0, | 493 'last_build_number': 0, |
| 495 'lower_boundary': 100, | 494 'lower_boundary': 100, |
| 496 'upper_boundary': 110, | 495 'upper_boundary': 110, |
| 497 'lower_boundary_result': 'STABLE', | 496 'lower_boundary_result': 'STABLE', |
| 498 'sequential_run_index': 0 | 497 'sequential_run_index': 0 |
| 499 } | 498 } |
| 500 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) | 499 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) |
| 501 self.assertEqual(next_run, 101) | 500 self.assertEqual(next_run, 101) |
| 502 | 501 |
| 503 def testSequentialFoundBorderFlake(self): | 502 def testSequentialFoundBorderFlake(self): |
| 504 master_name = 'm' | 503 master_name = 'm' |
| 505 builder_name = 'b' | 504 builder_name = 'b' |
| 506 build_number = 100 | 505 build_number = 100 |
| 507 step_name = 's' | 506 step_name = 's' |
| 508 test_name = 't' | 507 test_name = 't' |
| 509 self._CreateAndSaveMasterFlakeAnalysis( | 508 self._CreateAndSaveMasterFlakeAnalysis( |
| 510 master_name, builder_name, build_number, step_name, | 509 master_name, builder_name, build_number, step_name, |
| 511 test_name, status=analysis_status.PENDING | 510 test_name, status=analysis_status.PENDING |
| 512 ) | 511 ) |
| 513 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 512 analysis = MasterFlakeAnalysis.GetVersion( |
| 514 build_number, step_name, test_name) | 513 master_name, builder_name, build_number, step_name, test_name) |
| 515 analysis.success_rates.append(.5) | 514 analysis.pass_rates.append(.5) |
| 516 analysis.build_numbers.append(100) | 515 analysis.build_numbers.append(100) |
| 517 analysis.put() | 516 analysis.put() |
| 518 | 517 |
| 519 flakiness_algorithm_results_dict = { | 518 flakiness_algorithm_results_dict = { |
| 520 'flakes_in_a_row': 0, | 519 'flakes_in_a_row': 0, |
| 521 'stable_in_a_row': 0, | 520 'stable_in_a_row': 0, |
| 522 'stabled_out': True, | 521 'stabled_out': True, |
| 523 'flaked_out': True, | 522 'flaked_out': True, |
| 524 'last_build_number': 0, | 523 'last_build_number': 0, |
| 525 'lower_boundary': 100, | 524 'lower_boundary': 100, |
| 526 'upper_boundary': 110, | 525 'upper_boundary': 110, |
| 527 'lower_boundary_result': 'STABLE', | 526 'lower_boundary_result': 'STABLE', |
| 528 'sequential_run_index': 1 | 527 'sequential_run_index': 1 |
| 529 } | 528 } |
| 530 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) | 529 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) |
| 531 self.assertEqual(next_run, False) | 530 self.assertEqual(next_run, False) |
| 532 self.assertEqual(analysis.suspected_flake_build_number, 101) | 531 self.assertEqual(analysis.suspected_flake_build_number, 101) |
| 533 | 532 |
| 534 def testSequentialFoundBorderStable(self): | 533 def testSequentialFoundBorderStable(self): |
| 535 master_name = 'm' | 534 master_name = 'm' |
| 536 builder_name = 'b' | 535 builder_name = 'b' |
| 537 build_number = 100 | 536 build_number = 100 |
| 538 step_name = 's' | 537 step_name = 's' |
| 539 test_name = 't' | 538 test_name = 't' |
| 540 self._CreateAndSaveMasterFlakeAnalysis( | 539 self._CreateAndSaveMasterFlakeAnalysis( |
| 541 master_name, builder_name, build_number, step_name, | 540 master_name, builder_name, build_number, step_name, |
| 542 test_name, status=analysis_status.PENDING | 541 test_name, status=analysis_status.PENDING |
| 543 ) | 542 ) |
| 544 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 543 analysis = MasterFlakeAnalysis.GetVersion( |
| 545 build_number, step_name, test_name) | 544 master_name, builder_name, build_number, step_name, test_name) |
| 546 analysis.success_rates.append(1) | 545 analysis.pass_rates.append(1) |
| 547 analysis.build_numbers.append(100) | 546 analysis.build_numbers.append(100) |
| 548 analysis.put() | 547 analysis.put() |
| 549 | 548 |
| 550 flakiness_algorithm_results_dict = { | 549 flakiness_algorithm_results_dict = { |
| 551 'flakes_in_a_row': 0, | 550 'flakes_in_a_row': 0, |
| 552 'stable_in_a_row': 0, | 551 'stable_in_a_row': 0, |
| 553 'stabled_out': True, | 552 'stabled_out': True, |
| 554 'flaked_out': True, | 553 'flaked_out': True, |
| 555 'last_build_number': 0, | 554 'last_build_number': 0, |
| 556 'lower_boundary': 100, | 555 'lower_boundary': 100, |
| 557 'upper_boundary': 110, | 556 'upper_boundary': 110, |
| 558 'lower_boundary_result': 'FLAKE', | 557 'lower_boundary_result': 'FLAKE', |
| 559 'sequential_run_index': 1 | 558 'sequential_run_index': 1 |
| 560 } | 559 } |
| 561 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) | 560 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) |
| 562 self.assertEqual(next_run, False) | 561 self.assertEqual(next_run, False) |
| 563 self.assertEqual(analysis.suspected_flake_build_number, 101) | 562 self.assertEqual(analysis.suspected_flake_build_number, 101) |
| 564 | 563 |
| 565 | |
| 566 def testSequentialDidntFindBorderStable(self): | 564 def testSequentialDidntFindBorderStable(self): |
| 567 master_name = 'm' | 565 master_name = 'm' |
| 568 builder_name = 'b' | 566 builder_name = 'b' |
| 569 build_number = 100 | 567 build_number = 100 |
| 570 step_name = 's' | 568 step_name = 's' |
| 571 test_name = 't' | 569 test_name = 't' |
| 572 self._CreateAndSaveMasterFlakeAnalysis( | 570 self._CreateAndSaveMasterFlakeAnalysis( |
| 573 master_name, builder_name, build_number, step_name, | 571 master_name, builder_name, build_number, step_name, |
| 574 test_name, status=analysis_status.PENDING | 572 test_name, status=analysis_status.PENDING |
| 575 ) | 573 ) |
| 576 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 574 analysis = MasterFlakeAnalysis.GetVersion( |
| 577 build_number, step_name, test_name) | 575 master_name, builder_name, build_number, step_name, test_name) |
| 578 analysis.success_rates.append(1) | 576 analysis.pass_rates.append(1) |
| 579 analysis.build_numbers.append(100) | 577 analysis.build_numbers.append(100) |
| 580 analysis.put() | 578 analysis.put() |
| 581 | 579 |
| 582 flakiness_algorithm_results_dict = { | 580 flakiness_algorithm_results_dict = { |
| 583 'flakes_in_a_row': 0, | 581 'flakes_in_a_row': 0, |
| 584 'stable_in_a_row': 0, | 582 'stable_in_a_row': 0, |
| 585 'stabled_out': True, | 583 'stabled_out': True, |
| 586 'flaked_out': True, | 584 'flaked_out': True, |
| 587 'last_build_number': 0, | 585 'last_build_number': 0, |
| 588 'lower_boundary': 100, | 586 'lower_boundary': 100, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 616 | 614 |
| 617 } | 615 } |
| 618 self._CreateAndSaveMasterFlakeAnalysis( | 616 self._CreateAndSaveMasterFlakeAnalysis( |
| 619 master_name, builder_name, build_number, step_name, | 617 master_name, builder_name, build_number, step_name, |
| 620 test_name, status=analysis_status.PENDING | 618 test_name, status=analysis_status.PENDING |
| 621 ) | 619 ) |
| 622 self._CreateAndSaveFlakeSwarmingTask( | 620 self._CreateAndSaveFlakeSwarmingTask( |
| 623 master_name, builder_name, build_number, step_name, | 621 master_name, builder_name, build_number, step_name, |
| 624 test_name, status=analysis_status.COMPLETED | 622 test_name, status=analysis_status.COMPLETED |
| 625 ) | 623 ) |
| 626 analysis = MasterFlakeAnalysis.Get(master_name, builder_name, | 624 analysis = MasterFlakeAnalysis.GetVersion( |
| 627 build_number, step_name, test_name) | 625 master_name, builder_name, build_number, step_name, test_name) |
| 628 analysis.success_rates.append(1) | 626 analysis.pass_rates.append(1) |
| 629 analysis.build_numbers.append(50) | 627 analysis.build_numbers.append(50) |
| 630 analysis.put() | 628 analysis.put() |
| 631 | 629 |
| 632 NextBuildNumberPipeline.run( | 630 NextBuildNumberPipeline.run( |
| 633 NextBuildNumberPipeline(), master_name, builder_name, | 631 NextBuildNumberPipeline(), master_name, builder_name, |
| 634 master_build_number, build_number, step_name, test_name, | 632 master_build_number, build_number, step_name, test_name, |
| 635 test_result_future, queue_name, flakiness_algorithm_results_dict) | 633 test_result_future, queue_name, flakiness_algorithm_results_dict) |
| 636 self.assertEquals( | 634 self.assertEquals( |
| 637 flakiness_algorithm_results_dict['sequential_run_index'], 1) | 635 flakiness_algorithm_results_dict['sequential_run_index'], 1) |
| 638 | 636 |
| 639 def testNextBuildWhenTestNotExistingAfterStableInARow(self): | 637 def testNextBuildWhenTestNotExistingAfterStableInARow(self): |
| 640 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't') | 638 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't') |
| 641 master.success_rates = [0.8, 1.0, 1.0, -1] | 639 master.pass_rates = [0.8, 1.0, 1.0, -1] |
| 642 master.build_numbers = [100, 80, 70, 60] | 640 master.build_numbers = [100, 80, 70, 60] |
| 643 flakiness_algorithm_results_dict = { | 641 flakiness_algorithm_results_dict = { |
| 644 'flakes_in_a_row': 0, | 642 'flakes_in_a_row': 0, |
| 645 'stable_in_a_row': 2, | 643 'stable_in_a_row': 2, |
| 646 'stabled_out': False, | 644 'stabled_out': False, |
| 647 'flaked_out': False, | 645 'flaked_out': False, |
| 648 'last_build_number': 0, | 646 'last_build_number': 0, |
| 649 'lower_boundary': None, | 647 'lower_boundary': None, |
| 650 'upper_boundary': None, | 648 'upper_boundary': None, |
| 651 'lower_boundary_result': None, | 649 'lower_boundary_result': None, |
| 652 'sequential_run_index': 0, | 650 'sequential_run_index': 0, |
| 653 } | 651 } |
| 654 | 652 |
| 655 next_run = get_next_run(master, flakiness_algorithm_results_dict) | 653 next_run = get_next_run(master, flakiness_algorithm_results_dict) |
| 656 self.assertEqual(81, next_run) | 654 self.assertEqual(81, next_run) |
| 657 self.assertTrue(flakiness_algorithm_results_dict['stabled_out']) | 655 self.assertTrue(flakiness_algorithm_results_dict['stabled_out']) |
| 658 self.assertTrue(flakiness_algorithm_results_dict['flaked_out']) | 656 self.assertTrue(flakiness_algorithm_results_dict['flaked_out']) |
| 659 self.assertEqual(80, flakiness_algorithm_results_dict['lower_boundary']) | 657 self.assertEqual(80, flakiness_algorithm_results_dict['lower_boundary']) |
| 660 self.assertEqual('STABLE', | 658 self.assertEqual('STABLE', |
| 661 flakiness_algorithm_results_dict['lower_boundary_result']) | 659 flakiness_algorithm_results_dict['lower_boundary_result']) |
| 662 | 660 |
| 663 def testNextBuildWhenTestNotExistingAfterFlakeInARow(self): | 661 def testNextBuildWhenTestNotExistingAfterFlakeInARow(self): |
| 664 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't') | 662 master = MasterFlakeAnalysis.Create('m', 'b', 100, 's', 't') |
| 665 master.success_rates = [0.8, 0.7, 0.75, -1] | 663 master.pass_rates = [0.8, 0.7, 0.75, -1] |
| 666 master.build_numbers = [100, 80, 70, 60] | 664 master.build_numbers = [100, 80, 70, 60] |
| 667 flakiness_algorithm_results_dict = { | 665 flakiness_algorithm_results_dict = { |
| 668 'flakes_in_a_row': 3, | 666 'flakes_in_a_row': 3, |
| 669 'stable_in_a_row': 0, | 667 'stable_in_a_row': 0, |
| 670 'stabled_out': False, | 668 'stabled_out': False, |
| 671 'flaked_out': False, | 669 'flaked_out': False, |
| 672 'last_build_number': 0, | 670 'last_build_number': 0, |
| 673 'lower_boundary': None, | 671 'lower_boundary': None, |
| 674 'upper_boundary': None, | 672 'upper_boundary': None, |
| 675 'lower_boundary_result': None, | 673 'lower_boundary_result': None, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 705 'sequential_run_index': 0 | 703 'sequential_run_index': 0 |
| 706 } | 704 } |
| 707 self._CreateAndSaveMasterFlakeAnalysis( | 705 self._CreateAndSaveMasterFlakeAnalysis( |
| 708 master_name, builder_name, master_build_number, step_name, | 706 master_name, builder_name, master_build_number, step_name, |
| 709 test_name, status=analysis_status.RUNNING | 707 test_name, status=analysis_status.RUNNING |
| 710 ) | 708 ) |
| 711 self._CreateAndSaveFlakeSwarmingTask( | 709 self._CreateAndSaveFlakeSwarmingTask( |
| 712 master_name, builder_name, build_number, step_name, | 710 master_name, builder_name, build_number, step_name, |
| 713 test_name, status=analysis_status.COMPLETED | 711 test_name, status=analysis_status.COMPLETED |
| 714 ) | 712 ) |
| 715 analysis = MasterFlakeAnalysis.Get( | 713 analysis = MasterFlakeAnalysis.GetVersion( |
| 716 master_name, builder_name, | 714 master_name, builder_name, master_build_number, step_name, test_name) |
| 717 master_build_number, step_name, test_name) | 715 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] | 716 analysis.build_numbers = [100, 80, 70, 60] |
| 720 analysis.put() | 717 analysis.put() |
| 721 | 718 |
| 722 pipeline = NextBuildNumberPipeline() | 719 pipeline = NextBuildNumberPipeline() |
| 723 pipeline.run( | 720 pipeline.run( |
| 724 master_name, builder_name, | 721 master_name, builder_name, |
| 725 master_build_number, build_number, step_name, test_name, | 722 master_build_number, build_number, step_name, test_name, |
| 726 test_result_future, queue_name, flakiness_algorithm_results_dict) | 723 test_result_future, queue_name, flakiness_algorithm_results_dict) |
| 727 | 724 |
| 728 analysis = MasterFlakeAnalysis.Get( | 725 analysis = MasterFlakeAnalysis.GetVersion( |
| 729 master_name, builder_name, | 726 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) | 727 self.assertEqual(analysis_status.COMPLETED, analysis.status) |
| 732 | 728 |
| 733 def testNextBuildNumberIsSmallerThanLastBuildNumber(self): | 729 def testNextBuildNumberIsSmallerThanLastBuildNumber(self): |
| 734 master_name = 'm' | 730 master_name = 'm' |
| 735 builder_name = 'b' | 731 builder_name = 'b' |
| 736 master_build_number = 100 | 732 master_build_number = 100 |
| 737 build_number = 60 | 733 build_number = 60 |
| 738 step_name = 's' | 734 step_name = 's' |
| 739 test_name = 't' | 735 test_name = 't' |
| 740 test_result_future = 'trf' | 736 test_result_future = 'trf' |
| (...skipping 10 matching lines...) Expand all Loading... |
| 751 'sequential_run_index': 0 | 747 'sequential_run_index': 0 |
| 752 } | 748 } |
| 753 self._CreateAndSaveMasterFlakeAnalysis( | 749 self._CreateAndSaveMasterFlakeAnalysis( |
| 754 master_name, builder_name, master_build_number, step_name, | 750 master_name, builder_name, master_build_number, step_name, |
| 755 test_name, status=analysis_status.RUNNING | 751 test_name, status=analysis_status.RUNNING |
| 756 ) | 752 ) |
| 757 self._CreateAndSaveFlakeSwarmingTask( | 753 self._CreateAndSaveFlakeSwarmingTask( |
| 758 master_name, builder_name, build_number, step_name, | 754 master_name, builder_name, build_number, step_name, |
| 759 test_name, status=analysis_status.COMPLETED | 755 test_name, status=analysis_status.COMPLETED |
| 760 ) | 756 ) |
| 761 analysis = MasterFlakeAnalysis.Get( | 757 analysis = MasterFlakeAnalysis.GetVersion( |
| 762 master_name, builder_name, | 758 master_name, builder_name, master_build_number, step_name, test_name) |
| 763 master_build_number, step_name, test_name) | 759 analysis.pass_rates = [1.0, 1.0, 1.0, 1.0] |
| 764 analysis.success_rates = [1.0, 1.0, 1.0, 1.0] | |
| 765 analysis.build_numbers = [100, 80, 70, 60] | 760 analysis.build_numbers = [100, 80, 70, 60] |
| 766 analysis.put() | 761 analysis.put() |
| 767 | 762 |
| 768 pipeline = NextBuildNumberPipeline() | 763 pipeline = NextBuildNumberPipeline() |
| 769 pipeline.run( | 764 pipeline.run( |
| 770 master_name, builder_name, | 765 master_name, builder_name, |
| 771 master_build_number, build_number, step_name, test_name, | 766 master_build_number, build_number, step_name, test_name, |
| 772 test_result_future, queue_name, flakiness_algorithm_results_dict) | 767 test_result_future, queue_name, flakiness_algorithm_results_dict) |
| 773 | 768 |
| 774 analysis = MasterFlakeAnalysis.Get( | 769 analysis = MasterFlakeAnalysis.GetVersion( |
| 775 master_name, builder_name, | 770 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) | 771 self.assertEqual(analysis_status.COMPLETED, analysis.status) |
| OLD | NEW |