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)
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)
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)
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)
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)
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)
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")
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)
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)
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)
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)
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)
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
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)
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)
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
def setup_test(self): raise signals.TestFailure(MSG_EXPECTED_EXCEPTION)
def isNotEqualTo(self, other): if self._value == other: raise signals.TestFailure( "Expected \"%s\" to not be equal to \"%s\"" % (self._value, other), extras=None)
def isNotNone(self): if self._value is None: raise signals.TestFailure("Expected \"%s\" to not be None" % self._value, extras=None)