| OLD | NEW |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 from datetime import datetime | 5 from datetime import datetime |
| 6 import mock | 6 import mock |
| 7 | 7 |
| 8 from common import constants | 8 from common import constants |
| 9 from common.pipeline_wrapper import pipeline_handlers | 9 from common.pipeline_wrapper import pipeline_handlers |
| 10 from model import analysis_status | 10 from model import analysis_status |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 rfp = RecursiveFlakePipeline( | 155 rfp = RecursiveFlakePipeline( |
| 156 master_name, builder_name, build_number, step_name, test_name, | 156 master_name, builder_name, build_number, step_name, test_name, |
| 157 analysis.version_number, master_build_number, | 157 analysis.version_number, master_build_number, |
| 158 flakiness_algorithm_results_dict=flakiness_algorithm_results_dict) | 158 flakiness_algorithm_results_dict=flakiness_algorithm_results_dict) |
| 159 | 159 |
| 160 rfp.start(queue_name=queue_name) | 160 rfp.start(queue_name=queue_name) |
| 161 self.execute_queued_tasks() | 161 self.execute_queued_tasks() |
| 162 | 162 |
| 163 @mock.patch.object( | 163 @mock.patch.object( |
| 164 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 164 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 165 def testNextBuildPipelineForNewRecursionFirstFlake(self, _mocked_eta_func): | 165 @mock.patch.object( |
| 166 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 167 def testNextBuildPipelineForNewRecursionFirstFlake(self, *_): |
| 166 master_name = 'm' | 168 master_name = 'm' |
| 167 builder_name = 'b' | 169 builder_name = 'b' |
| 168 master_build_number = 100 | 170 master_build_number = 100 |
| 169 build_number = 100 | 171 build_number = 100 |
| 170 step_name = 's' | 172 step_name = 's' |
| 171 test_name = 't' | 173 test_name = 't' |
| 172 test_result_future = 'trf' | 174 test_result_future = 'trf' |
| 173 flakiness_algorithm_results_dict = { | 175 flakiness_algorithm_results_dict = { |
| 174 'flakes_in_a_row': 0, | 176 'flakes_in_a_row': 0, |
| 175 'stable_in_a_row': 0, | 177 'stable_in_a_row': 0, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 201 | 203 |
| 202 NextBuildNumberPipeline.run( | 204 NextBuildNumberPipeline.run( |
| 203 NextBuildNumberPipeline(), master_name, builder_name, | 205 NextBuildNumberPipeline(), master_name, builder_name, |
| 204 master_build_number, build_number, step_name, test_name, | 206 master_build_number, build_number, step_name, test_name, |
| 205 analysis.version_number, test_result_future, | 207 analysis.version_number, test_result_future, |
| 206 flakiness_algorithm_results_dict) | 208 flakiness_algorithm_results_dict) |
| 207 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) | 209 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) |
| 208 | 210 |
| 209 @mock.patch.object( | 211 @mock.patch.object( |
| 210 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 212 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 211 def testNextBuildPipelineForNewRecursionFirstStable(self, _mocked_eta_func): | 213 @mock.patch.object( |
| 214 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 215 def testNextBuildPipelineForNewRecursionFirstStable(self, *_): |
| 212 master_name = 'm' | 216 master_name = 'm' |
| 213 builder_name = 'b' | 217 builder_name = 'b' |
| 214 master_build_number = 100 | 218 master_build_number = 100 |
| 215 build_number = 100 | 219 build_number = 100 |
| 216 step_name = 's' | 220 step_name = 's' |
| 217 test_name = 't' | 221 test_name = 't' |
| 218 test_result_future = 'trf' | 222 test_result_future = 'trf' |
| 219 flakiness_algorithm_results_dict = { | 223 flakiness_algorithm_results_dict = { |
| 220 'flakes_in_a_row': 0, | 224 'flakes_in_a_row': 0, |
| 221 'stable_in_a_row': 0, | 225 'stable_in_a_row': 0, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 245 | 249 |
| 246 NextBuildNumberPipeline.run( | 250 NextBuildNumberPipeline.run( |
| 247 NextBuildNumberPipeline(), master_name, builder_name, | 251 NextBuildNumberPipeline(), master_name, builder_name, |
| 248 master_build_number, build_number, step_name, | 252 master_build_number, build_number, step_name, |
| 249 test_name, analysis.version_number, test_result_future, | 253 test_name, analysis.version_number, test_result_future, |
| 250 flakiness_algorithm_results_dict) | 254 flakiness_algorithm_results_dict) |
| 251 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) | 255 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) |
| 252 | 256 |
| 253 @mock.patch.object( | 257 @mock.patch.object( |
| 254 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 258 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 255 def testNextBuildPipelineForNewRecursionFlakeInARow(self, _mocked_eta_func): | 259 @mock.patch.object( |
| 260 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 261 def testNextBuildPipelineForNewRecursionFlakeInARow(self, *_): |
| 256 master_name = 'm' | 262 master_name = 'm' |
| 257 builder_name = 'b' | 263 builder_name = 'b' |
| 258 master_build_number = 100 | 264 master_build_number = 100 |
| 259 build_number = 100 | 265 build_number = 100 |
| 260 step_name = 's' | 266 step_name = 's' |
| 261 test_name = 't' | 267 test_name = 't' |
| 262 test_result_future = 'trf' | 268 test_result_future = 'trf' |
| 263 flakiness_algorithm_results_dict = { | 269 flakiness_algorithm_results_dict = { |
| 264 'flakes_in_a_row': 0, | 270 'flakes_in_a_row': 0, |
| 265 'stable_in_a_row': 4, | 271 'stable_in_a_row': 4, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 290 | 296 |
| 291 NextBuildNumberPipeline.run( | 297 NextBuildNumberPipeline.run( |
| 292 NextBuildNumberPipeline(), master_name, builder_name, | 298 NextBuildNumberPipeline(), master_name, builder_name, |
| 293 master_build_number, build_number, step_name, | 299 master_build_number, build_number, step_name, |
| 294 test_name, analysis.version_number, test_result_future, | 300 test_name, analysis.version_number, test_result_future, |
| 295 flakiness_algorithm_results_dict) | 301 flakiness_algorithm_results_dict) |
| 296 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) | 302 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) |
| 297 | 303 |
| 298 @mock.patch.object( | 304 @mock.patch.object( |
| 299 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 305 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 300 def testNextBuildPipelineForNewRecursionStableInARow(self, _mocked_eta_func): | 306 @mock.patch.object( |
| 307 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 308 def testNextBuildPipelineForNewRecursionStableInARow(self, *_): |
| 301 master_name = 'm' | 309 master_name = 'm' |
| 302 builder_name = 'b' | 310 builder_name = 'b' |
| 303 master_build_number = 100 | 311 master_build_number = 100 |
| 304 build_number = 100 | 312 build_number = 100 |
| 305 step_name = 's' | 313 step_name = 's' |
| 306 test_name = 't' | 314 test_name = 't' |
| 307 test_result_future = 'trf' | 315 test_result_future = 'trf' |
| 308 flakiness_algorithm_results_dict = { | 316 flakiness_algorithm_results_dict = { |
| 309 'flakes_in_a_row': 4, | 317 'flakes_in_a_row': 4, |
| 310 'stable_in_a_row': 0, | 318 'stable_in_a_row': 0, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 335 | 343 |
| 336 NextBuildNumberPipeline.run( | 344 NextBuildNumberPipeline.run( |
| 337 NextBuildNumberPipeline(), master_name, builder_name, | 345 NextBuildNumberPipeline(), master_name, builder_name, |
| 338 master_build_number, build_number, step_name, | 346 master_build_number, build_number, step_name, |
| 339 test_name, analysis.version_number, test_result_future, | 347 test_name, analysis.version_number, test_result_future, |
| 340 flakiness_algorithm_results_dict) | 348 flakiness_algorithm_results_dict) |
| 341 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) | 349 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) |
| 342 | 350 |
| 343 @mock.patch.object( | 351 @mock.patch.object( |
| 344 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 352 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 345 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber( | 353 @mock.patch.object( |
| 346 self, _mocked_eta_func): | 354 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 355 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self, *_): |
| 347 master_name = 'm' | 356 master_name = 'm' |
| 348 builder_name = 'b' | 357 builder_name = 'b' |
| 349 master_build_number = 100 | 358 master_build_number = 100 |
| 350 build_number = 100 | 359 build_number = 100 |
| 351 step_name = 's' | 360 step_name = 's' |
| 352 test_name = 't' | 361 test_name = 't' |
| 353 test_result_future = 'trf' | 362 test_result_future = 'trf' |
| 354 flakiness_algorithm_results_dict = { | 363 flakiness_algorithm_results_dict = { |
| 355 'flakes_in_a_row': 0, | 364 'flakes_in_a_row': 0, |
| 356 'stable_in_a_row': 0, | 365 'stable_in_a_row': 0, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 386 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 395 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 387 NextBuildNumberPipeline.run( | 396 NextBuildNumberPipeline.run( |
| 388 NextBuildNumberPipeline(), master_name, builder_name, | 397 NextBuildNumberPipeline(), master_name, builder_name, |
| 389 master_build_number, build_number, step_name, test_name, | 398 master_build_number, build_number, step_name, test_name, |
| 390 analysis.version_number, test_result_future, | 399 analysis.version_number, test_result_future, |
| 391 flakiness_algorithm_results_dict) | 400 flakiness_algorithm_results_dict) |
| 392 self.assertFalse(queue_name['x']) | 401 self.assertFalse(queue_name['x']) |
| 393 | 402 |
| 394 @mock.patch.object( | 403 @mock.patch.object( |
| 395 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 404 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 396 def testNextBuildPipelineForFailedSwarmingTask(self, _mocked_eta_func): | 405 @mock.patch.object( |
| 406 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 407 def testNextBuildPipelineForFailedSwarmingTask(self, *_): |
| 397 master_name = 'm' | 408 master_name = 'm' |
| 398 builder_name = 'b' | 409 builder_name = 'b' |
| 399 master_build_number = 100 | 410 master_build_number = 100 |
| 400 build_number = 100 | 411 build_number = 100 |
| 401 step_name = 's' | 412 step_name = 's' |
| 402 test_name = 't' | 413 test_name = 't' |
| 403 test_result_future = 'trf' | 414 test_result_future = 'trf' |
| 404 flakiness_algorithm_results_dict = { | 415 flakiness_algorithm_results_dict = { |
| 405 'flakes_in_a_row': 0, | 416 'flakes_in_a_row': 0, |
| 406 'stable_in_a_row': 0, | 417 'stable_in_a_row': 0, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 436 self.mock( | 447 self.mock( |
| 437 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 448 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 438 NextBuildNumberPipeline.run( | 449 NextBuildNumberPipeline.run( |
| 439 NextBuildNumberPipeline(), master_name, builder_name, | 450 NextBuildNumberPipeline(), master_name, builder_name, |
| 440 master_build_number, build_number, step_name, test_name, 1, | 451 master_build_number, build_number, step_name, test_name, 1, |
| 441 test_result_future, flakiness_algorithm_results_dict) | 452 test_result_future, flakiness_algorithm_results_dict) |
| 442 self.assertFalse(queue_name['x']) | 453 self.assertFalse(queue_name['x']) |
| 443 | 454 |
| 444 @mock.patch.object( | 455 @mock.patch.object( |
| 445 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 456 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 446 def testNextBuildPipelineForNewRecursionStabledFlakedOut( | 457 @mock.patch.object( |
| 447 self, _mocked_eta_func): | 458 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 459 def testNextBuildPipelineForNewRecursionStabledFlakedOut(self, *_): |
| 448 master_name = 'm' | 460 master_name = 'm' |
| 449 builder_name = 'b' | 461 builder_name = 'b' |
| 450 master_build_number = 100 | 462 master_build_number = 100 |
| 451 build_number = 100 | 463 build_number = 100 |
| 452 step_name = 's' | 464 step_name = 's' |
| 453 test_name = 't' | 465 test_name = 't' |
| 454 test_result_future = 'trf' | 466 test_result_future = 'trf' |
| 455 queue_name = constants.DEFAULT_QUEUE | 467 queue_name = constants.DEFAULT_QUEUE |
| 456 flakiness_algorithm_results_dict = { | 468 flakiness_algorithm_results_dict = { |
| 457 'flakes_in_a_row': 4, | 469 'flakes_in_a_row': 4, |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 690 'upper_boundary': 110, | 702 'upper_boundary': 110, |
| 691 'lower_boundary_result': 'STABLE', | 703 'lower_boundary_result': 'STABLE', |
| 692 'sequential_run_index': 1 | 704 'sequential_run_index': 1 |
| 693 } | 705 } |
| 694 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) | 706 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) |
| 695 self.assertEqual(next_run, 102) | 707 self.assertEqual(next_run, 102) |
| 696 self.assertEqual(analysis.suspected_flake_build_number, None) | 708 self.assertEqual(analysis.suspected_flake_build_number, None) |
| 697 | 709 |
| 698 @mock.patch.object( | 710 @mock.patch.object( |
| 699 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 711 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 700 def testNextBuildPipelineStabledOutFlakedOutFirstTime(self, _mocked_eta_func): | 712 @mock.patch.object( |
| 713 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 714 def testNextBuildPipelineStabledOutFlakedOutFirstTime(self, *_): |
| 701 master_name = 'm' | 715 master_name = 'm' |
| 702 builder_name = 'b' | 716 builder_name = 'b' |
| 703 master_build_number = 100 | 717 master_build_number = 100 |
| 704 build_number = 100 | 718 build_number = 100 |
| 705 step_name = 's' | 719 step_name = 's' |
| 706 test_name = 't' | 720 test_name = 't' |
| 707 test_result_future = 'trf' | 721 test_result_future = 'trf' |
| 708 flakiness_algorithm_results_dict = { | 722 flakiness_algorithm_results_dict = { |
| 709 'flakes_in_a_row': 0, | 723 'flakes_in_a_row': 0, |
| 710 'stable_in_a_row': 0, | 724 'stable_in_a_row': 0, |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 866 pipeline = NextBuildNumberPipeline() | 880 pipeline = NextBuildNumberPipeline() |
| 867 pipeline.run( | 881 pipeline.run( |
| 868 master_name, builder_name, | 882 master_name, builder_name, |
| 869 master_build_number, build_number, step_name, test_name, | 883 master_build_number, build_number, step_name, test_name, |
| 870 analysis.version_number, test_result_future, | 884 analysis.version_number, test_result_future, |
| 871 flakiness_algorithm_results_dict) | 885 flakiness_algorithm_results_dict) |
| 872 | 886 |
| 873 analysis = MasterFlakeAnalysis.GetVersion( | 887 analysis = MasterFlakeAnalysis.GetVersion( |
| 874 master_name, builder_name, master_build_number, step_name, test_name) | 888 master_name, builder_name, master_build_number, step_name, test_name) |
| 875 self.assertEqual(analysis_status.COMPLETED, analysis.status) | 889 self.assertEqual(analysis_status.COMPLETED, analysis.status) |
| 890 |
| 891 @mock.patch( |
| 892 'waterfall.flake.recursive_flake_pipeline.PostCommentToBugPipeline') |
| 893 def testUpdateBugWithResultWithoutAttachedBug(self, _): |
| 894 master_name = 'm' |
| 895 builder_name = 'b' |
| 896 master_build_number = 100 |
| 897 step_name = 's' |
| 898 test_name = 't' |
| 899 analysis = MasterFlakeAnalysis.Create( |
| 900 master_name, builder_name, master_build_number, step_name, test_name) |
| 901 self.assertFalse( |
| 902 recursive_flake_pipeline._UpdateBugWithResult(analysis, None)) |
| 903 |
| 904 @mock.patch( |
| 905 'waterfall.flake.recursive_flake_pipeline.PostCommentToBugPipeline') |
| 906 def testUpdateBugWithResultWithAttachedBug(self, mocked_pipeline): |
| 907 mocked_target = mock.Mock() |
| 908 mocked_pipeline.attach_mock(mocked_target, 'target') |
| 909 master_name = 'm' |
| 910 builder_name = 'b' |
| 911 master_build_number = 100 |
| 912 step_name = 's' |
| 913 test_name = 't' |
| 914 analysis = MasterFlakeAnalysis.Create( |
| 915 master_name, builder_name, master_build_number, step_name, test_name) |
| 916 analysis.bug_id = 123 |
| 917 analysis.original_master_name = 'om' |
| 918 analysis.original_builder_name = 'ob' |
| 919 analysis.original_step_name = 'os' |
| 920 self.assertTrue( |
| 921 recursive_flake_pipeline._UpdateBugWithResult(analysis, 'queue')) |
| 922 calls = mocked_pipeline.mock_calls |
| 923 self.assertEqual(2, len(calls)) |
| 924 |
| 925 _, args, __ = calls[0] |
| 926 bug_id, comment, labels = args |
| 927 self.assertEqual(123, bug_id) |
| 928 self.assertEqual(['AnalyzedByFindit'], labels) |
| 929 self.assertTrue('om / ob / os' in comment) |
| 930 |
| 931 self.assertEqual(mock.call().start(queue_name='queue'), calls[1]) |
| OLD | NEW |