def test_invoke_user_raises(self): handler = ApplicationSession() handler.traceback_app = True MockTransport(handler) errors = [] def log_error(e, msg): errors.append((e.value, msg)) handler.onUserError = log_error name_error = NameError('foo') def bing(): raise name_error # see MockTransport, must start with "com.myapp.myproc" yield handler.register(bing, u'com.myapp.myproc99') try: yield handler.call(u'com.myapp.myproc99') self.fail("Expected an error") except Exception as e: # XXX should/could we export all the builtin types? # right now, we always get ApplicationError # self.assertTrue(isinstance(e, NameError)) self.assertTrue(isinstance(e, RuntimeError)) # also, we should have logged the real NameError to # Twisted. self.assertEqual(1, len(errors)) self.assertEqual(name_error, errors[0][0])
def test_publish_callback_exception(self): """ Ensure we handle an exception from the user code. """ handler = ApplicationSession() MockTransport(handler) error_instance = RuntimeError("we have a problem") got_err_d = Deferred() def observer(e, msg): if error_instance == e.value: got_err_d.callback(True) handler.onUserError = observer def boom(): raise error_instance sub = yield handler.subscribe(boom, u'com.myapp.topic1') # MockTransport gives us the ack reply and then we do our # own event message publish = yield handler.publish( u'com.myapp.topic1', options=types.PublishOptions(acknowledge=True, exclude_me=False), ) msg = message.Event(sub.id, publish.id) handler.onMessage(msg) # we know it worked if our observer worked and did # .callback on our Deferred above. self.assertTrue(got_err_d.called)
def test_invoke_progressive_result_error(self): handler = ApplicationSession() MockTransport(handler) @inlineCallbacks def bing(arg, details=None, key=None): self.assertTrue(details is not None) self.assertTrue(details.progress is not None) self.assertEqual(key, 'word') self.assertEqual('arg', arg) details.progress('life', something='nothing') yield succeed('meaning of') returnValue(42) got_progress = Deferred() progress_error = NameError('foo') logged_errors = [] def got_error(e, msg): logged_errors.append((e.value, msg)) handler.onUserError = got_error def progress(arg, something=None): self.assertEqual('nothing', something) got_progress.callback(arg) raise progress_error # see MockTransport, must start with "com.myapp.myproc" yield handler.register( bing, u'com.myapp.myproc2', types.RegisterOptions(details_arg='details'), ) res = yield handler.call( u'com.myapp.myproc2', 'arg', options=types.CallOptions(on_progress=progress), key='word', ) self.assertEqual(42, res) # our progress handler raised an error, but not before # recording success. self.assertTrue(got_progress.called) self.assertEqual('life', got_progress.result) # make sure our progress-handler error was logged self.assertEqual(1, len(logged_errors)) self.assertEqual(progress_error, logged_errors[0][0])