def testDoNotGroupTestsWithDisjointBlameLists(self): master_name = 'm1' builder_name = 'b' build_number = 1 master_name_2 = 'm2' blame_list_1 = ['a'] blame_list_2 = ['b'] failed_steps = { 'step_a': { 'current_failure': 3, 'first_failure': 2, 'last_pass': 1 } } WfAnalysis.Create(master_name, builder_name, build_number).put() # Run pipeline with signals that have certain failed steps. # Observe new group creation. self.assertTrue( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name, builder_name, build_number, failure_type.TEST, blame_list_1, failed_steps, None, None)) self.assertIsNotNone( WfFailureGroup.Get(master_name, builder_name, build_number)) WfAnalysis.Create(master_name_2, builder_name, build_number).put() # Run pipeline with signals that have different failed steps. # Observe new group creation. self.assertTrue( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name_2, builder_name, build_number, failure_type.TEST, blame_list_2, failed_steps, None, None)) self.assertTrue( WfFailureGroup.Get(master_name_2, builder_name, build_number))
def testDoNotGroupCompilesWithDifferentOutputNodes(self): master_name = 'm1' builder_name = 'b' build_number = 1 master_name_2 = 'm2' blame_list = ['a'] signals_1 = {'compile': {'failed_output_nodes': ['abc.obj']}} signals_2 = {'compile': {'failed_output_nodes': ['def.obj']}} WfAnalysis.Create(master_name, builder_name, build_number).put() # Run pipeline with signals that have certain failed output nodes. # Observe new group creation. self.assertTrue( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name, builder_name, build_number, failure_type.COMPILE, blame_list, None, signals_1, None)) self.assertIsNotNone( WfFailureGroup.Get(master_name, builder_name, build_number)) WfAnalysis.Create(master_name_2, builder_name, build_number).put() # Run pipeline with signals that have different failed output nodes. # Observe new group creation. self.assertTrue( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name_2, builder_name, build_number, failure_type.COMPILE, blame_list, None, signals_2, None)) self.assertTrue( WfFailureGroup.Get(master_name_2, builder_name, build_number))
def testGroupTestsWithRelatedStepsWithoutHeuristicResult(self): master_name = 'm1' builder_name = 'b' build_number = 1 master_name_2 = 'm2' blame_list = ['a'] failed_steps = { 'step_a': { 'current_failure': 3, 'first_failure': 2, 'last_pass': 1 } } WfAnalysis.Create(master_name, builder_name, build_number).put() # Run pipeline with signals that have certain failed steps. # Observe new group creation. self.assertTrue( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name, builder_name, build_number, failure_type.TEST, blame_list, failed_steps, None, None)) self.assertIsNotNone( WfFailureGroup.Get(master_name, builder_name, build_number)) WfAnalysis.Create(master_name_2, builder_name, build_number).put() # Run pipeline with signals that have the same failed steps. # Observe no new group creation. self.assertFalse( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name_2, builder_name, build_number, failure_type.TEST, blame_list, failed_steps, None, None)) self.assertIsNone( WfFailureGroup.Get(master_name_2, builder_name, build_number))
def testGroupCompilesWithRelatedFailuresWithoutHeuristicResult(self): master_name = 'm1' builder_name = 'b' build_number = 1 master_name_2 = 'm2' blame_list = ['a'] signals = {'compile': {'failed_output_nodes': ['abc.obj']}} WfAnalysis.Create(master_name, builder_name, build_number).put() # Run pipeline with signals that have certain failed output nodes. # Observe new group creation. self.assertTrue( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name, builder_name, build_number, failure_type.COMPILE, blame_list, None, signals, None)) self.assertIsNotNone( WfFailureGroup.Get(master_name, builder_name, build_number)) WfAnalysis.Create(master_name_2, builder_name, build_number).put() # Run pipeline with signals that have the same failed output nodes. # Observe no new group creation. self.assertFalse( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name_2, builder_name, build_number, failure_type.COMPILE, blame_list, None, signals, None)) self.assertIsNone( WfFailureGroup.Get(master_name_2, builder_name, build_number))
def testDoNotGroupTestsWithDifferentHeuristicResults(self): master_name = 'm1' builder_name = 'b' build_number = 1 master_name_2 = 'm2' blame_list = ['a'] failed_steps = { 'step_a': { 'current_failure': 3, 'first_failure': 2, 'last_pass': 1 } } heuristic_result_1 = { 'failures': [{ 'step_name': 'step1', 'suspected_cls': [{ 'revision': 'rev1', }], }] } heuristic_result_2 = { 'failures': [{ 'step_name': 'step1', 'suspected_cls': [{ 'revision': 'rev2', }], }] } WfAnalysis.Create(master_name, builder_name, build_number).put() # Run pipeline with signals that have certain failed steps. # Observe new group creation. self.assertTrue( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name, builder_name, build_number, failure_type.TEST, blame_list, failed_steps, None, heuristic_result_1)) self.assertIsNotNone( WfFailureGroup.Get(master_name, builder_name, build_number)) WfAnalysis.Create(master_name_2, builder_name, build_number).put() # Run pipeline with signals that have different failed steps. # Observe new group creation. self.assertTrue( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name_2, builder_name, build_number, failure_type.TEST, blame_list, failed_steps, None, heuristic_result_2)) self.assertTrue( WfFailureGroup.Get(master_name_2, builder_name, build_number))
def testDoNotGroupCompilesWithDifferentHeuristicResults(self): master_name = 'm1' builder_name = 'b' build_number = 1 master_name_2 = 'm2' blame_list = ['a'] signals = {'compile': {'failed_output_nodes': ['abc.obj']}} heuristic_result_1 = { 'failures': [{ 'step_name': 'step1', 'suspected_cls': [{ 'revision': 'rev1', }], }] } heuristic_result_2 = { 'failures': [{ 'step_name': 'step1', 'suspected_cls': [{ 'revision': 'rev2', }], }] } WfAnalysis.Create(master_name, builder_name, build_number).put() # Run pipeline with signals that have certain failed output nodes. # Observe new group creation. self.assertTrue( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name, builder_name, build_number, failure_type.COMPILE, blame_list, None, signals, heuristic_result_1)) self.assertIsNotNone( WfFailureGroup.Get(master_name, builder_name, build_number)) WfAnalysis.Create(master_name_2, builder_name, build_number).put() # Run pipeline with signals that have different failed output nodes. # Observe new group creation. self.assertTrue( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name_2, builder_name, build_number, failure_type.COMPILE, blame_list, None, signals, heuristic_result_2)) self.assertTrue( WfFailureGroup.Get(master_name_2, builder_name, build_number))
def _GetMatchingFailureGroups(build_failure_type): earliest_time = time_util.GetUTCNow() - timedelta( seconds=waterfall_config.GetTryJobSettings().get( 'max_seconds_look_back_for_group')) return WfFailureGroup.query( ndb.AND(WfFailureGroup.build_failure_type == build_failure_type, WfFailureGroup.created_time >= earliest_time)).fetch()
def testDoNotGroupInfraBuildFailure(self): master_name = 'm1' builder_name = 'b' build_number = 1 WfAnalysis.Create(master_name, builder_name, build_number).put() # Run pipeline with INFRA failure. # Observe that the build failure is unique, but there is no new group # creation. self.assertTrue( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name, builder_name, build_number, failure_type.INFRA, None, None, None, None)) self.assertIsNone( WfFailureGroup.Get(master_name, builder_name, build_number))
def _CreateBuildFailureGroup(master_name, builder_name, build_number, build_failure_type, blame_list, suspected_tuples, output_nodes=None, failed_steps_and_tests=None): new_group = WfFailureGroup.Create(master_name, builder_name, build_number) new_group.created_time = time_util.GetUTCNow() new_group.build_failure_type = build_failure_type new_group.blame_list = blame_list new_group.suspected_tuples = suspected_tuples new_group.output_nodes = output_nodes new_group.failed_steps_and_tests = failed_steps_and_tests new_group.put()
def testDoNotGroupTestWithNoSteps(self): master_name = 'm1' builder_name = 'b' build_number = 1 blame_list = ['a'] failed_steps = {} WfAnalysis.Create(master_name, builder_name, build_number).put() # Run pipeline with signals that have zero failed steps. # Observe that the build failure is unique, but there is no new group # creation. self.assertTrue( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name, builder_name, build_number, failure_type.TEST, blame_list, failed_steps, None, None)) self.assertIsNone( WfFailureGroup.Get(master_name, builder_name, build_number))
def testDoNotGroupCompileWithNoOutputNodes(self): master_name = 'm1' builder_name = 'b' build_number = 1 blame_list = ['a'] signals = {'compile': {'failed_output_nodes': []}} WfAnalysis.Create(master_name, builder_name, build_number).put() # Run pipeline with signals that have zero failed output nodes. # Observe that the build failure is unique, but there is no new group # creation. self.assertTrue( try_job_util._IsBuildFailureUniqueAcrossPlatforms( master_name, builder_name, build_number, failure_type.COMPILE, blame_list, None, signals, None)) self.assertIsNone( WfFailureGroup.Get(master_name, builder_name, build_number))