| 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 15 matching lines...) Expand all Loading... |
| 26 def _CreateAndSaveMasterFlakeAnalysis( | 26 def _CreateAndSaveMasterFlakeAnalysis( |
| 27 self, master_name, builder_name, build_number, step_name, | 27 self, master_name, builder_name, build_number, step_name, |
| 28 test_name, status): | 28 test_name, status): |
| 29 analysis = MasterFlakeAnalysis.Create( | 29 analysis = MasterFlakeAnalysis.Create( |
| 30 master_name, builder_name, build_number, step_name, test_name) | 30 master_name, builder_name, build_number, step_name, test_name) |
| 31 analysis.status = status | 31 analysis.status = status |
| 32 analysis.Save() | 32 analysis.Save() |
| 33 | 33 |
| 34 def _CreateAndSaveFlakeSwarmingTask( | 34 def _CreateAndSaveFlakeSwarmingTask( |
| 35 self, master_name, builder_name, build_number, step_name, test_name, | 35 self, master_name, builder_name, build_number, step_name, test_name, |
| 36 status=analysis_status.PENDING, number_of_iterations=0): | 36 status=analysis_status.PENDING, number_of_iterations=0, error=None): |
| 37 flake_swarming_task = FlakeSwarmingTask.Create( | 37 flake_swarming_task = FlakeSwarmingTask.Create( |
| 38 master_name, builder_name, build_number, step_name, test_name) | 38 master_name, builder_name, build_number, step_name, test_name) |
| 39 flake_swarming_task.status = status | 39 flake_swarming_task.status = status |
| 40 flake_swarming_task.tries = number_of_iterations | 40 flake_swarming_task.tries = number_of_iterations |
| 41 flake_swarming_task.error = error |
| 41 flake_swarming_task.put() | 42 flake_swarming_task.put() |
| 42 | 43 |
| 43 def _GenerateDataPoints(self, pass_rates, build_numbers): | 44 def _GenerateDataPoints(self, pass_rates, build_numbers): |
| 44 data_points = [] | 45 data_points = [] |
| 45 for i in range(0, len(pass_rates)): | 46 for i in range(0, len(pass_rates)): |
| 46 data_point = DataPoint() | 47 data_point = DataPoint() |
| 47 data_point.pass_rate = pass_rates[i] | 48 data_point.pass_rate = pass_rates[i] |
| 48 data_point.build_number = build_numbers[i] | 49 data_point.build_number = build_numbers[i] |
| 49 data_points.append(data_point) | 50 data_points.append(data_point) |
| 50 return data_points | 51 return data_points |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 @mock.patch.object( | 412 @mock.patch.object( |
| 412 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) | 413 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 413 def testNextBuildPipelineForFailedSwarmingTask(self, *_): | 414 def testNextBuildPipelineForFailedSwarmingTask(self, *_): |
| 414 master_name = 'm' | 415 master_name = 'm' |
| 415 builder_name = 'b' | 416 builder_name = 'b' |
| 416 master_build_number = 100 | 417 master_build_number = 100 |
| 417 build_number = 100 | 418 build_number = 100 |
| 418 step_name = 's' | 419 step_name = 's' |
| 419 test_name = 't' | 420 test_name = 't' |
| 420 test_result_future = 'trf' | 421 test_result_future = 'trf' |
| 422 swarming_task_error = { |
| 423 'code': 1, |
| 424 'message': 'some failure message', |
| 425 } |
| 421 flakiness_algorithm_results_dict = { | 426 flakiness_algorithm_results_dict = { |
| 422 'flakes_in_a_row': 0, | 427 'flakes_in_a_row': 0, |
| 423 'stable_in_a_row': 0, | 428 'stable_in_a_row': 0, |
| 424 'stabled_out': False, | 429 'stabled_out': False, |
| 425 'flaked_out': False, | 430 'flaked_out': False, |
| 426 'last_build_number': 0, | 431 'last_build_number': 0, |
| 427 'lower_boundary': None, | 432 'lower_boundary': None, |
| 428 'upper_boundary': None, | 433 'upper_boundary': None, |
| 429 'lower_boundary_result': None, | 434 'lower_boundary_result': None, |
| 430 'sequential_run_index': 0 | 435 'sequential_run_index': 0 |
| 431 | 436 |
| 432 } | 437 } |
| 433 self._CreateAndSaveMasterFlakeAnalysis( | 438 self._CreateAndSaveMasterFlakeAnalysis( |
| 434 master_name, builder_name, build_number, step_name, | 439 master_name, builder_name, build_number, step_name, |
| 435 test_name, status=analysis_status.PENDING | 440 test_name, status=analysis_status.PENDING |
| 436 ) | 441 ) |
| 437 self._CreateAndSaveFlakeSwarmingTask( | 442 self._CreateAndSaveFlakeSwarmingTask( |
| 438 master_name, builder_name, build_number, step_name, | 443 master_name, builder_name, build_number, step_name, |
| 439 test_name, status=analysis_status.ERROR | 444 test_name, status=analysis_status.ERROR, error=swarming_task_error |
| 440 ) | 445 ) |
| 441 analysis = MasterFlakeAnalysis.GetVersion( | 446 analysis = MasterFlakeAnalysis.GetVersion( |
| 442 master_name, builder_name, build_number, step_name, test_name) | 447 master_name, builder_name, build_number, step_name, test_name) |
| 443 data_point = DataPoint() | 448 data_point = DataPoint() |
| 444 data_point.pass_rate = .5 | 449 data_point.pass_rate = .5 |
| 445 data_point.build_number = 100 | 450 data_point.build_number = 100 |
| 446 analysis.data_points.append(data_point) | 451 analysis.data_points.append(data_point) |
| 447 analysis.put() | 452 analysis.put() |
| 448 | 453 |
| 449 queue_name = {'x': False} | 454 queue_name = {'x': False} |
| 450 def my_mocked_run(*_, **__): | 455 def my_mocked_run(*_, **__): |
| 451 queue_name['x'] = True # pragma: no cover | 456 queue_name['x'] = True # pragma: no cover |
| 452 | 457 |
| 453 self.mock( | 458 self.mock( |
| 454 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) | 459 recursive_flake_pipeline.RecursiveFlakePipeline, 'start', my_mocked_run) |
| 455 NextBuildNumberPipeline.run( | 460 NextBuildNumberPipeline.run( |
| 456 NextBuildNumberPipeline(), master_name, builder_name, | 461 NextBuildNumberPipeline(), master_name, builder_name, |
| 457 master_build_number, build_number, step_name, test_name, 1, | 462 master_build_number, build_number, step_name, test_name, 1, |
| 458 test_result_future, flakiness_algorithm_results_dict) | 463 test_result_future, flakiness_algorithm_results_dict) |
| 459 self.assertFalse(queue_name['x']) | 464 self.assertFalse(queue_name['x']) |
| 465 self.assertEqual(swarming_task_error, analysis.error) |
| 460 | 466 |
| 461 @mock.patch.object( | 467 @mock.patch.object( |
| 462 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) | 468 recursive_flake_pipeline, '_GetETAToStartAnalysis', return_value=None) |
| 463 @mock.patch.object( | 469 @mock.patch.object( |
| 464 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) | 470 recursive_flake_pipeline, '_UpdateBugWithResult', return_value=None) |
| 465 def testNextBuildPipelineForNewRecursionStabledFlakedOut(self, *_): | 471 def testNextBuildPipelineForNewRecursionStabledFlakedOut(self, *_): |
| 466 master_name = 'm' | 472 master_name = 'm' |
| 467 builder_name = 'b' | 473 builder_name = 'b' |
| 468 master_build_number = 100 | 474 master_build_number = 100 |
| 469 build_number = 100 | 475 build_number = 100 |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 master_name, builder_name, master_build_number, step_name, test_name) | 865 master_name, builder_name, master_build_number, step_name, test_name) |
| 860 self.assertEqual(analysis_status.COMPLETED, analysis.status) | 866 self.assertEqual(analysis_status.COMPLETED, analysis.status) |
| 861 | 867 |
| 862 def testUpdateAnalysisUponCompletionFound(self): | 868 def testUpdateAnalysisUponCompletionFound(self): |
| 863 analysis = MasterFlakeAnalysis.Create('m', 'b', 123, 's', 't') | 869 analysis = MasterFlakeAnalysis.Create('m', 'b', 123, 's', 't') |
| 864 analysis.suspected_flake_build_number = 100 | 870 analysis.suspected_flake_build_number = 100 |
| 865 recursive_flake_pipeline._UpdateAnalysisStatusUponCompletion( | 871 recursive_flake_pipeline._UpdateAnalysisStatusUponCompletion( |
| 866 analysis, analysis_status.COMPLETED, None) | 872 analysis, analysis_status.COMPLETED, None) |
| 867 self.assertEqual(analysis.result_status, result_status.FOUND_UNTRIAGED) | 873 self.assertEqual(analysis.result_status, result_status.FOUND_UNTRIAGED) |
| 868 | 874 |
| 875 def testUpdateAnalysisUponCompletionError(self): |
| 876 expected_error = { |
| 877 'code': 1, |
| 878 'message': 'some error message' |
| 879 } |
| 880 analysis = MasterFlakeAnalysis.Create('m', 'b', 123, 's', 't') |
| 881 analysis.suspected_flake_build_number = 100 |
| 882 recursive_flake_pipeline._UpdateAnalysisStatusUponCompletion( |
| 883 analysis, analysis_status.COMPLETED, expected_error) |
| 884 self.assertEqual(expected_error, analysis.error) |
| 885 |
| 869 def testGetListOfNearbyBuildNumbers(self): | 886 def testGetListOfNearbyBuildNumbers(self): |
| 870 self.assertEqual( | 887 self.assertEqual( |
| 871 [1], | 888 [1], |
| 872 recursive_flake_pipeline._GetListOfNearbyBuildNumbers(1, 0)) | 889 recursive_flake_pipeline._GetListOfNearbyBuildNumbers(1, 0)) |
| 873 self.assertEqual( | 890 self.assertEqual( |
| 874 [1], | 891 [1], |
| 875 recursive_flake_pipeline._GetListOfNearbyBuildNumbers(1, -1)) | 892 recursive_flake_pipeline._GetListOfNearbyBuildNumbers(1, -1)) |
| 876 self.assertEqual( | 893 self.assertEqual( |
| 877 [1, 2], | 894 [1, 2], |
| 878 recursive_flake_pipeline._GetListOfNearbyBuildNumbers(1, 1)) | 895 recursive_flake_pipeline._GetListOfNearbyBuildNumbers(1, 1)) |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1109 calls = mocked_pipeline.mock_calls | 1126 calls = mocked_pipeline.mock_calls |
| 1110 self.assertEqual(2, len(calls)) | 1127 self.assertEqual(2, len(calls)) |
| 1111 | 1128 |
| 1112 _, args, __ = calls[0] | 1129 _, args, __ = calls[0] |
| 1113 bug_id, comment, labels = args | 1130 bug_id, comment, labels = args |
| 1114 self.assertEqual(123, bug_id) | 1131 self.assertEqual(123, bug_id) |
| 1115 self.assertEqual(['AnalyzedByFindit'], labels) | 1132 self.assertEqual(['AnalyzedByFindit'], labels) |
| 1116 self.assertTrue('om / ob / os' in comment) | 1133 self.assertTrue('om / ob / os' in comment) |
| 1117 | 1134 |
| 1118 self.assertEqual(mock.call().start(queue_name='queue'), calls[1]) | 1135 self.assertEqual(mock.call().start(queue_name='queue'), calls[1]) |
| OLD | NEW |