예제 #1
0
파일: asserts.py 프로젝트: qvas1r/mobly
def assert_equal(first, second, msg=None, extras=None):
    """Assert the equality of objects, otherwise fail the test.

  Error message is "first != second" by default. Additional explanation can
  be supplied in the message.

  Args:
    first: The first object to compare.
    second: The second object to compare.
    msg: A string that adds additional info about the failure.
    extras: An optional field for extra information to be included in
      test result.
  """
    my_msg = None
    try:
        _pyunit_proxy.assertEqual(first, second)
    except AssertionError as e:
        my_msg = str(e)
        if msg:
            my_msg = "%s %s" % (my_msg, msg)

    # This raise statement is outside of the above except statement to prevent
    # Python3's exception message from having two tracebacks.
    if my_msg is not None:
        raise signals.TestFailure(my_msg, extras=extras)
예제 #2
0
def _call_unittest_assertion(assertion_method,
                             *args,
                             msg=None,
                             extras=None,
                             **kwargs):
    """Wrapper for converting a unittest assertion into a Mobly one.

  Args:
    assertion_method: unittest.TestCase assertion method to call.
    *args: Positional arguments for the assertion call.
    msg: A string that adds additional info about the failure.
    extras: An optional field for extra information to be included in
      test result.
    **kwargs: Keyword arguments for the assertion call.
  """
    my_msg = None
    try:
        assertion_method(*args, **kwargs)
    except AssertionError as e:
        my_msg = str(e)
        if msg:
            my_msg = f'{my_msg} {msg}'

    # This raise statement is outside of the above except statement to
    # prevent Python3's exception message from having two tracebacks.
    if my_msg is not None:
        raise signals.TestFailure(my_msg, extras=extras)
예제 #3
0
 def test_result_record_fail_with_json_extra(self):
     record = records.TestResultRecord(self.tn)
     record.test_begin()
     s = signals.TestFailure(self.details, self.json_extra)
     record.test_fail(s)
     self.verify_record(record=record,
                        result=records.TestResultEnums.TEST_RESULT_FAIL,
                        details=self.details,
                        extras=self.json_extra)
예제 #4
0
 def test_result_record_fail_with_unicode_test_signal(self):
     record = records.TestResultRecord(self.tn)
     record.test_begin()
     details = u'\u2022'
     s = signals.TestFailure(details, self.float_extra)
     record.test_fail(s)
     self.verify_record(record=record,
                        result=records.TestResultEnums.TEST_RESULT_FAIL,
                        details=details,
                        extras=self.float_extra)
예제 #5
0
 def test_result_record_fail_with_float_extra(self):
     record = records.TestResultRecord(self.tn)
     record.test_begin()
     s = signals.TestFailure(self.details, self.float_extra)
     record.test_fail(s)
     self.verify_record(record=record,
                        result=records.TestResultEnums.TEST_RESULT_FAIL,
                        details=self.details,
                        termination_signal_type='TestFailure',
                        extras=self.float_extra)
예제 #6
0
 def emits(self, *match_fns, at_least_times=1, timeout=DEFAULT_TIMEOUT):
     if len(match_fns) == 0:
         raise signals.TestFailure("Must specify a match function")
     elif len(match_fns) == 1:
         NOT_FOR_YOU_assert_event_occurs(self._value,
                                         match_fns[0],
                                         at_least_times=at_least_times,
                                         timeout=timeout)
         return EventStreamContinuationSubject(self._value)
     else:
         return MultiMatchStreamSubject(self._value, match_fns, timeout)
예제 #7
0
 def emitsNone(self, *match_fns, timeout=DEFAULT_TIMEOUT):
     if len(match_fns) == 0:
         NOT_FOR_YOU_assert_none(self._value, timeout=timeout)
         return EventStreamContinuationSubject(self._value)
     elif len(match_fns) == 1:
         NOT_FOR_YOU_assert_none_matching(self._value,
                                          match_fns[0],
                                          timeout=timeout)
         return EventStreamContinuationSubject(self._value)
     else:
         raise signals.TestFailure(
             "Cannot specify multiple match functions")
예제 #8
0
 def test_is_all_pass_negative(self):
     s = signals.TestFailure(self.details, self.float_extra)
     record1 = records.TestResultRecord(self.tn)
     record1.test_begin()
     record1.test_fail(s)
     record2 = records.TestResultRecord(self.tn)
     record2.test_begin()
     record2.test_error(s)
     tr = records.TestResult()
     tr.add_record(record1)
     tr.add_record(record2)
     self.assertFalse(tr.is_all_pass)
예제 #9
0
def fail(msg, extras=None):
    """Explicitly fail a test.

    Args:
        msg: A string explaining the details of the failure.
        extras: An optional field for extra information to be included in
            test result.

    Raises:
        signals.TestFailure: Mark a test as failed.
    """
    raise signals.TestFailure(msg, extras)
예제 #10
0
 def test_summary_write_dump(self):
     s = signals.TestFailure(self.details, self.float_extra)
     record1 = records.TestResultRecord(self.tn)
     record1.test_begin()
     record1.test_fail(s)
     dump_path = os.path.join(self.tmp_path, 'ha.yaml')
     writer = records.TestSummaryWriter(dump_path)
     writer.dump(record1.to_dict(), records.TestSummaryEntryType.RECORD)
     with open(dump_path, 'r') as f:
         content = yaml.load(f)
         self.assertEqual(content['Type'],
                          records.TestSummaryEntryType.RECORD.value)
예제 #11
0
 def test_result_fail_class_with_test_signal(self):
     record1 = records.TestResultRecord(self.tn)
     record1.test_begin()
     s = signals.TestPass(self.details, self.float_extra)
     record1.test_pass(s)
     tr = records.TestResult()
     tr.add_record(record1)
     s = signals.TestFailure(self.details, self.float_extra)
     record2 = records.TestResultRecord("SomeTest", s)
     tr.fail_class(record2)
     self.assertEqual(len(tr.passed), 1)
     self.assertEqual(len(tr.failed), 1)
     self.assertEqual(len(tr.executed), 2)
예제 #12
0
 def run(self, obj):
     for instance in self._instances:
         if instance.try_run(obj):
             self.__obj_invoked(obj)
             return
     if self._default_fn is not None:
         # IGNORE_UNHANDLED is also a default fn
         self._default_fn(obj)
         self.__obj_invoked(obj)
     else:
         raise signals.TestFailure(
             "%s: behavior for %s went unhandled" % (self._reply_stage_factory().__class__.__name__, obj),
             extras=None)
예제 #13
0
    def __exit__(self, exc_type, exc_value, tb):
        if exc_type is None:
            try:
                exc_name = self.expected.__name__
            except AttributeError:
                exc_name = str(self.expected)
            raise signals.TestFailure('%s not raised' % exc_name,
                                      extras=self.extras)
        if not issubclass(exc_type, self.expected):
            # let unexpected exceptions pass through
            return False
        self.exception = exc_value  # store for later retrieval
        if self.expected_regexp is None:
            return True

        expected_regexp = self.expected_regexp
        if isinstance(expected_regexp, str):
            expected_regexp = re.compile(expected_regexp)
        if not expected_regexp.search(str(exc_value)):
            raise signals.TestFailure(
                '"%s" does not match "%s"' %
                (expected_regexp.pattern, str(exc_value)),
                extras=self.extras)
        return True
예제 #14
0
 def test_summary_write_dump(self):
     s = signals.TestFailure(self.details, self.float_extra)
     record1 = records.TestResultRecord(self.tn)
     record1.test_begin()
     record1.test_fail(s)
     dump_path = os.path.join(self.tmp_path, 'ha.yaml')
     writer = records.TestSummaryWriter(dump_path)
     writer.dump(record1.to_dict(), records.TestSummaryEntryType.RECORD)
     with io.open(dump_path, 'r', encoding='utf-8') as f:
         content = yaml.safe_load(f)
         self.assertEqual(content['Type'],
                          records.TestSummaryEntryType.RECORD.value)
         self.assertEqual(content[records.TestResultEnums.RECORD_DETAILS],
                          self.details)
         self.assertEqual(content[records.TestResultEnums.RECORD_EXTRAS],
                          self.float_extra)
예제 #15
0
 def test_summary_write_dump_with_unicode(self):
     unicode_details = u'\u901a'  # utf-8 -> b'\xe9\x80\x9a'
     unicode_extras = u'\u8fc7'  # utf-8 -> b'\xe8\xbf\x87'
     s = signals.TestFailure(unicode_details, unicode_extras)
     record1 = records.TestResultRecord(self.tn)
     record1.test_begin()
     record1.test_fail(s)
     dump_path = os.path.join(self.tmp_path, 'ha.yaml')
     writer = records.TestSummaryWriter(dump_path)
     writer.dump(record1.to_dict(), records.TestSummaryEntryType.RECORD)
     with io.open(dump_path, 'r', encoding='utf-8') as f:
         content = yaml.load(f)
         self.assertEqual(content['Type'],
                          records.TestSummaryEntryType.RECORD.value)
         self.assertEqual(content[records.TestResultEnums.RECORD_DETAILS],
                          unicode_details)
         self.assertEqual(content[records.TestResultEnums.RECORD_EXTRAS],
                          unicode_extras)
예제 #16
0
    def create_test_record(self, mobly_test_class):
        """Creates a TestResultRecord for the instrumentation block.

    Args:
      mobly_test_class: string, the name of the Mobly test case
        executing the instrumentation run.

    Returns:
      A TestResultRecord with an appropriate signals exception
      representing the instrumentation test method's result status.
    """
        details = self._get_details()
        extras = self._get_extras()

        tr_record = records.TestResultRecord(
            t_name=self._get_full_name(),
            t_class=mobly_test_class,
        )
        if self._begin_time:
            tr_record.begin_time = self._begin_time

        if self._is_failed():
            tr_record.test_fail(
                e=signals.TestFailure(details=details, extras=extras))
        elif self._status_code in _InstrumentationStatusCodeCategories.SKIPPED:
            tr_record.test_skip(
                e=signals.TestSkip(details=details, extras=extras))
        elif self._status_code in _InstrumentationStatusCodeCategories.PASS:
            tr_record.test_pass(
                e=signals.TestPass(details=details, extras=extras))
        elif self._status_code in _InstrumentationStatusCodeCategories.TIMING:
            if self._error_message:
                tr_record.test_error(
                    e=signals.TestError(details=details, extras=extras))
            else:
                tr_record = None
        else:
            tr_record.test_error(
                e=signals.TestError(details=details, extras=extras))
        if self._known_keys[_InstrumentationKnownStatusKeys.STACK]:
            tr_record.termination_signal.stacktrace = self._known_keys[
                _InstrumentationKnownStatusKeys.STACK]
        return tr_record
예제 #17
0
 def setup_test(self):
     raise signals.TestFailure(MSG_EXPECTED_EXCEPTION)
예제 #18
0
 def isNotEqualTo(self, other):
     if self._value == other:
         raise signals.TestFailure(
             "Expected \"%s\" to not be equal to \"%s\"" %
             (self._value, other),
             extras=None)
예제 #19
0
 def isNotNone(self):
     if self._value is None:
         raise signals.TestFailure("Expected \"%s\" to not be None" %
                                   self._value,
                                   extras=None)