Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: appengine/findit/waterfall/flake/test/recursive_flake_pipeline_test.py

Issue 2538533002: [Findit] Report the error from the last flake swarming task that failed in master_flake_analysis.py (Closed)
Patch Set: Addressing comments Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « appengine/findit/waterfall/flake/recursive_flake_pipeline.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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])
OLDNEW
« no previous file with comments | « appengine/findit/waterfall/flake/recursive_flake_pipeline.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698