Ejemplo n.º 1
0
    def testReportStageFailureOnCompoundFailure(self):
        """Tests ReportStageFailure on CompoundFailure."""
        fake_db = fake_cidb.FakeCIDBConnection()
        inner_exception_1 = failures_lib.TestLabFailure()
        inner_exception_2 = TypeError()
        exc_infos = failures_lib.CreateExceptInfo(inner_exception_1, None)
        exc_infos += failures_lib.CreateExceptInfo(inner_exception_2, None)
        outer_exception = failures_lib.GoBFailure(exc_infos=exc_infos)
        mock_build_stage_id = 9345
        outer_failure_id = failures_lib.ReportStageFailure(
            fake_db, mock_build_stage_id, outer_exception)

        self.assertEqual(3, len(fake_db.failureTable))
        for failure_id, failure in fake_db.failureTable.iteritems():
            self.assertEqual(failure['build_stage_id'], mock_build_stage_id)
            self.assertIsNone(failure['extra_info'])

            if failure_id == outer_failure_id:
                self.assertEqual(failure_id, outer_failure_id)
                self.assertEqual(failure['exception_message'],
                                 outer_exception.ToSummaryString())
            elif failure[
                    'exception_type'] == failures_lib.TestLabFailure.__name__:
                self.assertEqual(failure['outer_failure_id'], outer_failure_id)
                self.assertEqual(failure['exception_category'],
                                 constants.EXCEPTION_CATEGORY_LAB)
            elif failure['exception_type'] == TypeError.__name__:
                self.assertEqual(failure['outer_failure_id'], outer_failure_id)
                self.assertEqual(failure['exception_category'],
                                 constants.EXCEPTION_CATEGORY_UNKNOWN)
 def _GetMessages(self, lab_fail=0, infra_fail=0, other_fail=0):
   """Returns a list of BuildFailureMessage objects."""
   messages = []
   messages.extend(
       [GetFailedMessage([failures_lib.TestLabFailure()])
        for _ in range(lab_fail)])
   messages.extend(
       [GetFailedMessage([failures_lib.InfrastructureFailure()])
        for _ in range(infra_fail)])
   messages.extend(
       [GetFailedMessage(Exception()) for _ in range(other_fail)])
   return messages
Ejemplo n.º 3
0
    def testReportStageFailureToCIDB(self):
        """Tests that the reporting fuction reports all included exceptions."""
        fake_db = fake_cidb.FakeCIDBConnection()
        inner_exception_1 = failures_lib.TestLabFailure()
        inner_exception_2 = TypeError()
        exc_infos = failures_lib.CreateExceptInfo(inner_exception_1, None)
        exc_infos += failures_lib.CreateExceptInfo(inner_exception_2, None)
        outer_exception = failures_lib.GoBFailure(exc_infos=exc_infos)

        mock_build_stage_id = 9345

        failures_lib.ReportStageFailureToCIDB(fake_db, mock_build_stage_id,
                                              outer_exception)
        self.assertEqual(3, len(fake_db.failureTable))
        self.assertEqual(
            set([mock_build_stage_id]),
            set([x['build_stage_id'] for x in fake_db.failureTable.values()]))
        self.assertEqual(
            set([
                constants.EXCEPTION_CATEGORY_INFRA,
                constants.EXCEPTION_CATEGORY_UNKNOWN,
                constants.EXCEPTION_CATEGORY_LAB
            ]),
            set([
                x['exception_category'] for x in fake_db.failureTable.values()
            ]))

        # Find the outer failure id.
        for failure_id, failure in fake_db.failureTable.iteritems():
            if failure['outer_failure_id'] is None:
                outer_failure_id = failure_id
                break

        # Now verify inner failures reference this failure.
        for failure_id, failure in fake_db.failureTable.iteritems():
            if failure_id != outer_failure_id:
                self.assertEqual(outer_failure_id, failure['outer_failure_id'])
Ejemplo n.º 4
0
    def _RunHWTestSuite(self,
                        debug=False,
                        fails=False,
                        warns=False,
                        cmd_fail_mode=None):
        """Verify the stage behavior in various circumstances.

    Args:
      debug: Whether the HWTest suite should be run in debug mode.
      fails: Whether the stage should fail.
      warns: Whether the stage should warn.
      cmd_fail_mode: How commands.RunHWTestSuite() should fail.
        If None, don't fail.
    """
        # We choose to define these mocks in setUp() because they are
        # useful for tests that do not call this method. However, this
        # means we have to reset the mocks before each run.
        self.run_suite_mock.reset_mock()
        self.warning_mock.reset_mock()
        self.failure_mock.reset_mock()

        to_raise = None

        if cmd_fail_mode == None:
            to_raise = None
        elif cmd_fail_mode == 'timeout':
            to_raise = timeout_util.TimeoutError('Timed out')
        elif cmd_fail_mode == 'suite_timeout':
            to_raise = failures_lib.SuiteTimedOut('Suite timed out')
        elif cmd_fail_mode == 'board_not_available':
            to_raise = failures_lib.BoardNotAvailable('Board not available')
        elif cmd_fail_mode == 'lab_fail':
            to_raise = failures_lib.TestLabFailure('Test lab failure')
        elif cmd_fail_mode == 'test_warn':
            to_raise = failures_lib.TestWarning('Suite passed with warnings')
        elif cmd_fail_mode == 'test_fail':
            to_raise = failures_lib.TestFailure('HWTest failed.')
        else:
            raise ValueError('cmd_fail_mode %s not supported' % cmd_fail_mode)

        if cmd_fail_mode == 'timeout':
            self.run_suite_mock.side_effect = to_raise
        else:
            self.run_suite_mock.return_value = commands.HWTestSuiteResult(
                to_raise, None)

        if fails:
            self.assertRaises(failures_lib.StepFailure, self.RunStage)
        else:
            self.RunStage()

        self.run_suite_mock.assert_called_once()
        self.assertEqual(self.run_suite_mock.call_args[1].get('debug'), debug)

        # Make sure we print the buildbot failure/warning messages correctly.
        if fails:
            self.failure_mock.assert_called_once()
        else:
            self.assertFalse(self.failure_mock.called)

        if warns:
            self.warning_mock.assert_called_once()
        else:
            self.assertFalse(self.warning_mock.called)