def testGetLaterBuildsWithSameTestFailures(self, mock_log, _): master_name = 'm' builder_name = 'b' build_number = 123 failure_to_culprit_map = FailureToCulpritMap.FromSerializable({ 'a': { 't1': 'r1', 't2': 'r1', 't3': 'r2', 't4': 'r2' }, 'b': { 't1': 'r3' } }) mock_log.side_effect = [{ 't1': 'log', 't2': 'log', 't3': 'log' }, { 't1': 'log' }, { 't1': 'log', 't2': 'log', }] expected_result = {'a': set(['t1', 't2'])} self.assertEqual( expected_result, ci_test_failure.GetContinuouslyFailedTestsInLaterBuilds( master_name, builder_name, build_number, failure_to_culprit_map))
def GetCulpritsShouldTakeActions(parameters): """Gets culprits that Findit should take actions. Checks following builds and finds out if the step/test failures caused by each culprit are still failing. Takes actions on the culprit if yes, otherwise skip actions. Args: parameters(CulpritActionParameters): parameters for culprit action. Returns: A set of culprit keys Findit should take action on because the failures they are responsible for are still failing. """ assert parameters.culprits master_name, builder_name, build_number = parameters.build_key.GetParts() failure_to_culprit_map = parameters.failure_to_culprit_map tests_failing_continuously = ( ci_test_failure.GetContinuouslyFailedTestsInLaterBuilds( master_name, builder_name, build_number, failure_to_culprit_map)) if not tests_failing_continuously: # All tests has passed in following builds, don't need to revert or send # notification. logging.info( 'No revert or notification needed for culprit(s) for %s/%s/%s since the' ' failure has stopped.', master_name, builder_name, build_number) return set([]) culprits_should_take_actions = set(parameters.culprits.keys()) for step_name, test_culprit_map in failure_to_culprit_map.iteritems(): if not tests_failing_continuously.get(step_name): # All failed tests in the step have passed in following builds. culprits_should_take_actions -= set(test_culprit_map.values()) continue originally_failed_tests = set(test_culprit_map.keys()) passed_in_later_builds_tests = (originally_failed_tests - tests_failing_continuously[step_name]) no_actions_culprits = set( [test_culprit_map[t] for t in passed_in_later_builds_tests]) culprits_should_take_actions -= no_actions_culprits return culprits_should_take_actions
def testGetLaterBuildsWithSameTestFailuresAllStepsPass(self, _): master_name = 'm' builder_name = 'b' build_number = 123 failure_to_culprit_map = FailureToCulpritMap.FromSerializable({ 'a': { 't1': 'r1', 't2': 'r1', 't3': 'r2', 't4': 'r2' }, 'b': { 't1': 'r3' } }) self.assertEqual( {}, ci_test_failure.GetContinuouslyFailedTestsInLaterBuilds( master_name, builder_name, build_number, failure_to_culprit_map))