示例#1
0
    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))
示例#2
0
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
示例#3
0
    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))