| 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 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 rfp = RecursiveFlakePipeline( | 156 rfp = RecursiveFlakePipeline( |
| 157 master_name, builder_name, build_number, step_name, test_name, | 157 master_name, builder_name, build_number, step_name, test_name, |
| 158 analysis.version_number, master_build_number, | 158 analysis.version_number, master_build_number, |
| 159 flakiness_algorithm_results_dict=flakiness_algorithm_results_dict) | 159 flakiness_algorithm_results_dict=flakiness_algorithm_results_dict) |
| 160 | 160 |
| 161 rfp.start(queue_name=queue_name) | 161 rfp.start(queue_name=queue_name) |
| 162 self.execute_queued_tasks() | 162 self.execute_queued_tasks() |
| 163 | 163 |
| 164 @mock.patch.object( | 164 @mock.patch.object( |
| 165 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 165 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 166 def testNextBuildPipelineForNewRecursionFirstFlake(self, _mocked_eta_func): | 166 @mock.patch.object( |
| 167 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 168 def testNextBuildPipelineForNewRecursionFirstFlake(self, *_): |
| 167 master_name = 'm' | 169 master_name = 'm' |
| 168 builder_name = 'b' | 170 builder_name = 'b' |
| 169 master_build_number = 100 | 171 master_build_number = 100 |
| 170 build_number = 100 | 172 build_number = 100 |
| 171 step_name = 's' | 173 step_name = 's' |
| 172 test_name = 't' | 174 test_name = 't' |
| 173 test_result_future = 'trf' | 175 test_result_future = 'trf' |
| 174 flakiness_algorithm_results_dict = { | 176 flakiness_algorithm_results_dict = { |
| 175 'flakes_in_a_row': 0, | 177 'flakes_in_a_row': 0, |
| 176 'stable_in_a_row': 0, | 178 'stable_in_a_row': 0, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 202 | 204 |
| 203 NextBuildNumberPipeline.run( | 205 NextBuildNumberPipeline.run( |
| 204 NextBuildNumberPipeline(), master_name, builder_name, | 206 NextBuildNumberPipeline(), master_name, builder_name, |
| 205 master_build_number, build_number, step_name, test_name, | 207 master_build_number, build_number, step_name, test_name, |
| 206 analysis.version_number, test_result_future, | 208 analysis.version_number, test_result_future, |
| 207 flakiness_algorithm_results_dict) | 209 flakiness_algorithm_results_dict) |
| 208 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) | 210 self.assertEquals(flakiness_algorithm_results_dict['flakes_in_a_row'], 1) |
| 209 | 211 |
| 210 @mock.patch.object( | 212 @mock.patch.object( |
| 211 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 213 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 212 def testNextBuildPipelineForNewRecursionFirstStable(self, _mocked_eta_func): | 214 @mock.patch.object( |
| 215 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 216 def testNextBuildPipelineForNewRecursionFirstStable(self, *_): |
| 213 master_name = 'm' | 217 master_name = 'm' |
| 214 builder_name = 'b' | 218 builder_name = 'b' |
| 215 master_build_number = 100 | 219 master_build_number = 100 |
| 216 build_number = 100 | 220 build_number = 100 |
| 217 step_name = 's' | 221 step_name = 's' |
| 218 test_name = 't' | 222 test_name = 't' |
| 219 test_result_future = 'trf' | 223 test_result_future = 'trf' |
| 220 flakiness_algorithm_results_dict = { | 224 flakiness_algorithm_results_dict = { |
| 221 'flakes_in_a_row': 0, | 225 'flakes_in_a_row': 0, |
| 222 'stable_in_a_row': 0, | 226 'stable_in_a_row': 0, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 246 | 250 |
| 247 NextBuildNumberPipeline.run( | 251 NextBuildNumberPipeline.run( |
| 248 NextBuildNumberPipeline(), master_name, builder_name, | 252 NextBuildNumberPipeline(), master_name, builder_name, |
| 249 master_build_number, build_number, step_name, | 253 master_build_number, build_number, step_name, |
| 250 test_name, analysis.version_number, test_result_future, | 254 test_name, analysis.version_number, test_result_future, |
| 251 flakiness_algorithm_results_dict) | 255 flakiness_algorithm_results_dict) |
| 252 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) | 256 self.assertEquals(flakiness_algorithm_results_dict['stable_in_a_row'], 1) |
| 253 | 257 |
| 254 @mock.patch.object( | 258 @mock.patch.object( |
| 255 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 259 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 256 def testNextBuildPipelineForNewRecursionFlakeInARow(self, _mocked_eta_func): | 260 @mock.patch.object( |
| 261 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 262 def testNextBuildPipelineForNewRecursionFlakeInARow(self, *_): |
| 257 master_name = 'm' | 263 master_name = 'm' |
| 258 builder_name = 'b' | 264 builder_name = 'b' |
| 259 master_build_number = 100 | 265 master_build_number = 100 |
| 260 build_number = 100 | 266 build_number = 100 |
| 261 step_name = 's' | 267 step_name = 's' |
| 262 test_name = 't' | 268 test_name = 't' |
| 263 test_result_future = 'trf' | 269 test_result_future = 'trf' |
| 264 flakiness_algorithm_results_dict = { | 270 flakiness_algorithm_results_dict = { |
| 265 'flakes_in_a_row': 0, | 271 'flakes_in_a_row': 0, |
| 266 'stable_in_a_row': 4, | 272 'stable_in_a_row': 4, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 291 | 297 |
| 292 NextBuildNumberPipeline.run( | 298 NextBuildNumberPipeline.run( |
| 293 NextBuildNumberPipeline(), master_name, builder_name, | 299 NextBuildNumberPipeline(), master_name, builder_name, |
| 294 master_build_number, build_number, step_name, | 300 master_build_number, build_number, step_name, |
| 295 test_name, analysis.version_number, test_result_future, | 301 test_name, analysis.version_number, test_result_future, |
| 296 flakiness_algorithm_results_dict) | 302 flakiness_algorithm_results_dict) |
| 297 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) | 303 self.assertEquals(flakiness_algorithm_results_dict['stabled_out'], True) |
| 298 | 304 |
| 299 @mock.patch.object( | 305 @mock.patch.object( |
| 300 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 306 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 301 def testNextBuildPipelineForNewRecursionStableInARow(self, _mocked_eta_func): | 307 @mock.patch.object( |
| 308 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 309 def testNextBuildPipelineForNewRecursionStableInARow(self, *_): |
| 302 master_name = 'm' | 310 master_name = 'm' |
| 303 builder_name = 'b' | 311 builder_name = 'b' |
| 304 master_build_number = 100 | 312 master_build_number = 100 |
| 305 build_number = 100 | 313 build_number = 100 |
| 306 step_name = 's' | 314 step_name = 's' |
| 307 test_name = 't' | 315 test_name = 't' |
| 308 test_result_future = 'trf' | 316 test_result_future = 'trf' |
| 309 flakiness_algorithm_results_dict = { | 317 flakiness_algorithm_results_dict = { |
| 310 'flakes_in_a_row': 4, | 318 'flakes_in_a_row': 4, |
| 311 'stable_in_a_row': 0, | 319 'stable_in_a_row': 0, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 336 | 344 |
| 337 NextBuildNumberPipeline.run( | 345 NextBuildNumberPipeline.run( |
| 338 NextBuildNumberPipeline(), master_name, builder_name, | 346 NextBuildNumberPipeline(), master_name, builder_name, |
| 339 master_build_number, build_number, step_name, | 347 master_build_number, build_number, step_name, |
| 340 test_name, analysis.version_number, test_result_future, | 348 test_name, analysis.version_number, test_result_future, |
| 341 flakiness_algorithm_results_dict) | 349 flakiness_algorithm_results_dict) |
| 342 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) | 350 self.assertEquals(flakiness_algorithm_results_dict['flaked_out'], True) |
| 343 | 351 |
| 344 @mock.patch.object( | 352 @mock.patch.object( |
| 345 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 353 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 346 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber( | 354 @mock.patch.object( |
| 347 self, _mocked_eta_func): | 355 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 356 def testNextBuildPipelineForNewRecursionLessThanLastBuildNumber(self, *_): |
| 348 master_name = 'm' | 357 master_name = 'm' |
| 349 builder_name = 'b' | 358 builder_name = 'b' |
| 350 master_build_number = 100 | 359 master_build_number = 100 |
| 351 build_number = 100 | 360 build_number = 100 |
| 352 step_name = 's' | 361 step_name = 's' |
| 353 test_name = 't' | 362 test_name = 't' |
| 354 test_result_future = 'trf' | 363 test_result_future = 'trf' |
| 355 flakiness_algorithm_results_dict = { | 364 flakiness_algorithm_results_dict = { |
| 356 'flakes_in_a_row': 0, | 365 'flakes_in_a_row': 0, |
| 357 'stable_in_a_row': 0, | 366 'stable_in_a_row': 0, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 387 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 396 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 388 NextBuildNumberPipeline.run( | 397 NextBuildNumberPipeline.run( |
| 389 NextBuildNumberPipeline(), master_name, builder_name, | 398 NextBuildNumberPipeline(), master_name, builder_name, |
| 390 master_build_number, build_number, step_name, test_name, | 399 master_build_number, build_number, step_name, test_name, |
| 391 analysis.version_number, test_result_future, | 400 analysis.version_number, test_result_future, |
| 392 flakiness_algorithm_results_dict) | 401 flakiness_algorithm_results_dict) |
| 393 self.assertFalse(queue_name['x']) | 402 self.assertFalse(queue_name['x']) |
| 394 | 403 |
| 395 @mock.patch.object( | 404 @mock.patch.object( |
| 396 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 405 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 397 def testNextBuildPipelineForFailedSwarmingTask(self, _mocked_eta_func): | 406 @mock.patch.object( |
| 407 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 408 def testNextBuildPipelineForFailedSwarmingTask(self, *_): |
| 398 master_name = 'm' | 409 master_name = 'm' |
| 399 builder_name = 'b' | 410 builder_name = 'b' |
| 400 master_build_number = 100 | 411 master_build_number = 100 |
| 401 build_number = 100 | 412 build_number = 100 |
| 402 step_name = 's' | 413 step_name = 's' |
| 403 test_name = 't' | 414 test_name = 't' |
| 404 test_result_future = 'trf' | 415 test_result_future = 'trf' |
| 405 flakiness_algorithm_results_dict = { | 416 flakiness_algorithm_results_dict = { |
| 406 'flakes_in_a_row': 0, | 417 'flakes_in_a_row': 0, |
| 407 'stable_in_a_row': 0, | 418 'stable_in_a_row': 0, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 437 self.mock( | 448 self.mock( |
| 438 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 449 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 439 NextBuildNumberPipeline.run( | 450 NextBuildNumberPipeline.run( |
| 440 NextBuildNumberPipeline(), master_name, builder_name, | 451 NextBuildNumberPipeline(), master_name, builder_name, |
| 441 master_build_number, build_number, step_name, test_name, 1, | 452 master_build_number, build_number, step_name, test_name, 1, |
| 442 test_result_future, flakiness_algorithm_results_dict) | 453 test_result_future, flakiness_algorithm_results_dict) |
| 443 self.assertFalse(queue_name['x']) | 454 self.assertFalse(queue_name['x']) |
| 444 | 455 |
| 445 @mock.patch.object( | 456 @mock.patch.object( |
| 446 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 457 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 447 def testNextBuildPipelineForNewRecursionStabledFlakedOut( | 458 @mock.patch.object( |
| 448 self, _mocked_eta_func): | 459 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 460 def testNextBuildPipelineForNewRecursionStabledFlakedOut(self, *_): |
| 449 master_name = 'm' | 461 master_name = 'm' |
| 450 builder_name = 'b' | 462 builder_name = 'b' |
| 451 master_build_number = 100 | 463 master_build_number = 100 |
| 452 build_number = 100 | 464 build_number = 100 |
| 453 step_name = 's' | 465 step_name = 's' |
| 454 test_name = 't' | 466 test_name = 't' |
| 455 test_result_future = 'trf' | 467 test_result_future = 'trf' |
| 456 queue_name = constants.DEFAULT_QUEUE | 468 queue_name = constants.DEFAULT_QUEUE |
| 457 flakiness_algorithm_results_dict = { | 469 flakiness_algorithm_results_dict = { |
| 458 'flakes_in_a_row': 4, | 470 'flakes_in_a_row': 4, |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 691 'upper_boundary': 110, | 703 'upper_boundary': 110, |
| 692 'lower_boundary_result': 'STABLE', | 704 'lower_boundary_result': 'STABLE', |
| 693 'sequential_run_index': 1 | 705 'sequential_run_index': 1 |
| 694 } | 706 } |
| 695 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) | 707 next_run = sequential_next_run(analysis, flakiness_algorithm_results_dict) |
| 696 self.assertEqual(next_run, 102) | 708 self.assertEqual(next_run, 102) |
| 697 self.assertEqual(analysis.suspected_flake_build_number, None) | 709 self.assertEqual(analysis.suspected_flake_build_number, None) |
| 698 | 710 |
| 699 @mock.patch.object( | 711 @mock.patch.object( |
| 700 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 712 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 701 def testNextBuildPipelineStabledOutFlakedOutFirstTime(self, _mocked_eta_func): | 713 @mock.patch.object( |
| 714 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 715 def testNextBuildPipelineStabledOutFlakedOutFirstTime(self, *_): |
| 702 master_name = 'm' | 716 master_name = 'm' |
| 703 builder_name = 'b' | 717 builder_name = 'b' |
| 704 master_build_number = 100 | 718 master_build_number = 100 |
| 705 build_number = 100 | 719 build_number = 100 |
| 706 step_name = 's' | 720 step_name = 's' |
| 707 test_name = 't' | 721 test_name = 't' |
| 708 test_result_future = 'trf' | 722 test_result_future = 'trf' |
| 709 flakiness_algorithm_results_dict = { | 723 flakiness_algorithm_results_dict = { |
| 710 'flakes_in_a_row': 0, | 724 'flakes_in_a_row': 0, |
| 711 'stable_in_a_row': 0, | 725 'stable_in_a_row': 0, |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 analysis = MasterFlakeAnalysis.GetVersion( | 888 analysis = MasterFlakeAnalysis.GetVersion( |
| 875 master_name, builder_name, master_build_number, step_name, test_name) | 889 master_name, builder_name, master_build_number, step_name, test_name) |
| 876 self.assertEqual(analysis_status.COMPLETED, analysis.status) | 890 self.assertEqual(analysis_status.COMPLETED, analysis.status) |
| 877 | 891 |
| 878 def testUpdateAnalysisUponCompletionFound(self): | 892 def testUpdateAnalysisUponCompletionFound(self): |
| 879 analysis = MasterFlakeAnalysis.Create('m', 'b', 123, 's', 't') | 893 analysis = MasterFlakeAnalysis.Create('m', 'b', 123, 's', 't') |
| 880 analysis.suspected_flake_build_number = 100 | 894 analysis.suspected_flake_build_number = 100 |
| 881 recursive_flake_pipeline._UpdateAnalysisStatusUponCompletion( | 895 recursive_flake_pipeline._UpdateAnalysisStatusUponCompletion( |
| 882 analysis, analysis_status.COMPLETED, None) | 896 analysis, analysis_status.COMPLETED, None) |
| 883 self.assertEqual(analysis.result_status, result_status.FOUND_UNTRIAGED) | 897 self.assertEqual(analysis.result_status, result_status.FOUND_UNTRIAGED) |
| 898 |
| 899 @mock.patch( |
| 900 'waterfall.flake.recursive_flake_pipeline.PostCommentToBugPipeline') |
| 901 def testNotUpdateBugWithResultWithoutAttachedBug(self, mocked_pipeline): |
| 902 master_name = 'm' |
| 903 builder_name = 'b' |
| 904 master_build_number = 100 |
| 905 step_name = 's' |
| 906 test_name = 't' |
| 907 analysis = MasterFlakeAnalysis.Create( |
| 908 master_name, builder_name, master_build_number, step_name, test_name) |
| 909 analysis.algorithm_parameters = {'update_monorail_bug': True} |
| 910 self.assertFalse( |
| 911 recursive_flake_pipeline._UpdateBugWithResult(analysis, None)) |
| 912 mocked_pipeline.assert_not_called() |
| 913 |
| 914 @mock.patch( |
| 915 'waterfall.flake.recursive_flake_pipeline.PostCommentToBugPipeline') |
| 916 def testNotUpdateBugWithResultIfDisabled(self, mocked_pipeline): |
| 917 master_name = 'm' |
| 918 builder_name = 'b' |
| 919 master_build_number = 100 |
| 920 step_name = 's' |
| 921 test_name = 't' |
| 922 analysis = MasterFlakeAnalysis.Create( |
| 923 master_name, builder_name, master_build_number, step_name, test_name) |
| 924 analysis.bug_id = 123 |
| 925 analysis.algorithm_parameters = {'update_monorail_bug': False} |
| 926 self.assertFalse( |
| 927 recursive_flake_pipeline._UpdateBugWithResult(analysis, None)) |
| 928 mocked_pipeline.assert_not_called() |
| 929 |
| 930 @mock.patch( |
| 931 'waterfall.flake.recursive_flake_pipeline.PostCommentToBugPipeline') |
| 932 def testUpdateBugWithResultWithAttachedBug(self, mocked_pipeline): |
| 933 mocked_target = mock.Mock() |
| 934 mocked_pipeline.attach_mock(mocked_target, 'target') |
| 935 master_name = 'm' |
| 936 builder_name = 'b' |
| 937 master_build_number = 100 |
| 938 step_name = 's' |
| 939 test_name = 't' |
| 940 algorithm_parameters = { |
| 941 'update_monorail_bug': True, |
| 942 } |
| 943 analysis = MasterFlakeAnalysis.Create( |
| 944 master_name, builder_name, master_build_number, step_name, test_name) |
| 945 analysis.algorithm_parameters = algorithm_parameters |
| 946 analysis.bug_id = 123 |
| 947 analysis.original_master_name = 'om' |
| 948 analysis.original_builder_name = 'ob' |
| 949 analysis.original_step_name = 'os' |
| 950 self.assertTrue( |
| 951 recursive_flake_pipeline._UpdateBugWithResult(analysis, 'queue')) |
| 952 calls = mocked_pipeline.mock_calls |
| 953 self.assertEqual(2, len(calls)) |
| 954 |
| 955 _, args, __ = calls[0] |
| 956 bug_id, comment, labels = args |
| 957 self.assertEqual(123, bug_id) |
| 958 self.assertEqual(['AnalyzedByFindit'], labels) |
| 959 self.assertTrue('om / ob / os' in comment) |
| 960 |
| 961 self.assertEqual(mock.call().start(queue_name='queue'), calls[1]) |
| OLD | NEW |