Skip to content

Commit edb8667

Browse files
committed
Improve error handling and add its tests. fixes #12
1 parent 1e86c9f commit edb8667

4 files changed

Lines changed: 38 additions & 4 deletions

File tree

msgpackrpc/future.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ def get(self):
3939
if self._error_handler is not None:
4040
self._error_handler(self._error)
4141
else:
42-
raise error.RPCError(self._error)
42+
if isinstance(self._error, error.RPCError):
43+
raise self._error
44+
else:
45+
raise error.RPCError(self._error)
4346
else:
4447
return self._result
4548

msgpackrpc/session.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from msgpackrpc.future import Future
44
from msgpackrpc.transport import tcp
55
from msgpackrpc.compat import iteritems
6+
from msgpackrpc.error import TimeoutError
67

78

89
class Session(object):
@@ -109,7 +110,7 @@ def step_timeout(self):
109110
self._loop.stop()
110111
for timeout in timeouts:
111112
future = self._request_table.pop(timeout)
112-
future.set_error("Request timed out")
113+
future.set_error(TimeoutError("Request timed out"))
113114
self._loop.start()
114115

115116

msgpackrpc/transport/tcp.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from tornado.iostream import IOStream
44

55
import msgpackrpc.message
6-
from msgpackrpc.error import RPCError
6+
from msgpackrpc.error import RPCError, TransportError
77

88

99
class BaseSocket(object):
@@ -120,7 +120,7 @@ def on_connect_failed(self, sock):
120120
else:
121121
self._connecting = 0
122122
self._pending = []
123-
self._session.on_connect_failed("Retry connection over the limit")
123+
self._session.on_connect_failed(TransportError("Retry connection over the limit"))
124124

125125
def on_close(self, sock):
126126
# Avoid calling self.on_connect_failed after self.close called.

test/test_msgpackrpc.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from time import sleep
12
import threading
23
try:
34
import unittest2 as unittest
@@ -10,6 +11,7 @@
1011

1112

1213
class TestMessagePackRPC(unittest.TestCase):
14+
ENABLE_TIMEOUT_TEST = False
1315

1416
class TestArg:
1517
''' this class must know completely how to deserialize '''
@@ -52,6 +54,9 @@ def add_arg(self, arg0, arg1):
5254
def raise_error(self):
5355
raise Exception('error')
5456

57+
def long_exec(self):
58+
sleep(3)
59+
return 'finish!'
5560

5661
def setUp(self):
5762
self._address = msgpackrpc.Address('localhost', helper.unused_port())
@@ -141,5 +146,30 @@ def test_unknown_method(self):
141146
message = e.args[0]
142147
self.assertEqual(message, "'unknown' method not found", "Error message mismatched")
143148

149+
def test_connect_failed(self):
150+
client = self.setup_env();
151+
client = msgpackrpc.Client(msgpackrpc.Address('localhost', self._address.port - 10), unpack_encoding='utf-8')
152+
self.assertRaises(error.TransportError, lambda: client.call('hello'))
153+
154+
def test_timeout(self):
155+
client = self.setup_env();
156+
157+
if self.__class__.ENABLE_TIMEOUT_TEST:
158+
self.assertEqual(client.call('long_exec'), 'finish!', "'long_exec' result is incorrect")
159+
160+
client = msgpackrpc.Client(self._address, timeout=1, unpack_encoding='utf-8')
161+
self.assertRaises(error.TimeoutError, lambda: client.call('long_exec'))
162+
else:
163+
print("Skip test_timeout")
164+
165+
144166
if __name__ == '__main__':
167+
import sys
168+
169+
try:
170+
sys.argv.remove('--timeout-test')
171+
TestMessagePackRPC.ENABLE_TIMEOUT_TEST = True
172+
except:
173+
pass
174+
145175
unittest.main()

0 commit comments

Comments
 (0)