While msgpack has default binary-unicode conversion, the feature is somehow disabled in ryu. As the other parts of ryu requires binary_type data where they directly appear on-wire, simply follow the policy.
Signed-off-by: IWAMOTO Toshihiro <[email protected]> --- ryu/lib/rpc.py | 5 +- ryu/services/protocols/vrrp/rpc_manager.py | 6 +- ryu/tests/unit/lib/test_rpc.py | 98 +++++++++++++++--------------- 3 files changed, 56 insertions(+), 53 deletions(-) diff --git a/ryu/lib/rpc.py b/ryu/lib/rpc.py index adbcb9a..57ba00c 100644 --- a/ryu/lib/rpc.py +++ b/ryu/lib/rpc.py @@ -20,6 +20,7 @@ # http://wiki.msgpack.org/display/MSGPACK/RPC+specification import msgpack +import six class MessageType(object): @@ -49,7 +50,7 @@ class MessageEncoder(object): return this_id def create_request(self, method, params): - assert isinstance(method, str) + assert isinstance(method, six.binary_type) assert isinstance(params, list) msgid = self._create_msgid() return (self._packer.pack([MessageType.REQUEST, msgid, method, @@ -62,7 +63,7 @@ class MessageEncoder(object): return self._packer.pack([MessageType.RESPONSE, msgid, error, result]) def create_notification(self, method, params): - assert isinstance(method, str) + assert isinstance(method, six.binary_type) assert isinstance(params, list) return self._packer.pack([MessageType.NOTIFY, method, params]) diff --git a/ryu/services/protocols/vrrp/rpc_manager.py b/ryu/services/protocols/vrrp/rpc_manager.py index 93426b1..c532e7b 100644 --- a/ryu/services/protocols/vrrp/rpc_manager.py +++ b/ryu/services/protocols/vrrp/rpc_manager.py @@ -62,11 +62,11 @@ class RpcVRRPManager(app_manager.RyuApp): error = None result = None try: - if target_method == "vrrp_config": + if target_method == b'vrrp_config': result = self._config(msgid, params) - elif target_method == "vrrp_list": + elif target_method == b'vrrp_list': result = self._list(msgid, params) - elif target_method == "vrrp_config_change": + elif target_method == b'vrrp_config_change': result = self._config_change(msgid, params) else: error = 'Unknown method %s' % (target_method) diff --git a/ryu/tests/unit/lib/test_rpc.py b/ryu/tests/unit/lib/test_rpc.py index 69cd896..995320b 100644 --- a/ryu/tests/unit/lib/test_rpc.py +++ b/ryu/tests/unit/lib/test_rpc.py @@ -36,20 +36,22 @@ class Test_rpc(unittest.TestCase): def _handle_request(self, m): e = self._server_endpoint msgid, method, params = m - if method == "resp": + if method == b'resp': e.send_response(msgid, result=params[0]) - elif method == "err": + elif method == b'err': e.send_response(msgid, error=params[0]) - elif method == "callback": + elif method == b'callback': n, cb, v = params assert n > 0 self._requests.add(e.send_request(cb, [msgid, n, cb, v])) - elif method == "notify1": + elif method == b'notify1': e.send_notification(params[1], params[2]) e.send_response(msgid, result=params[0]) - elif method == "shutdown": + elif method == b'shutdown': import socket - how = getattr(socket, params[0]) + # Though six.text_type is not needed in python2, it is + # unconditionally applied for code simplicityp + how = getattr(socket, six.text_type(params[0], 'utf-8')) self._server_sock.shutdown(how) e.send_response(msgid, result=method) else: @@ -58,7 +60,7 @@ class Test_rpc(unittest.TestCase): def _handle_notification(self, m): e = self._server_endpoint method, params = m - if method == "notify2": + if method == b'notify2': e.send_notification(params[0], params[1]) def _handle_response(self, m): @@ -94,8 +96,8 @@ class Test_rpc(unittest.TestCase): def test_0_call_str(self): c = rpc.Client(self._client_sock) - obj = "hoge" - result = c.call("resp", [obj]) + obj = b'hoge' + result = c.call(b'resp', [obj]) assert result == obj assert isinstance(result, bytes) @@ -103,7 +105,7 @@ class Test_rpc(unittest.TestCase): c = rpc.Client(self._client_sock) obj = 12345 assert isinstance(obj, int) - result = c.call("resp", [obj]) + result = c.call(b'resp', [obj]) assert result == obj assert isinstance(result, type(obj)) @@ -111,7 +113,7 @@ class Test_rpc(unittest.TestCase): c = rpc.Client(self._client_sock) obj = six.MAXSIZE assert isinstance(obj, int) - result = c.call("resp", [obj]) + result = c.call(b'resp', [obj]) assert result == obj assert isinstance(result, type(obj)) @@ -119,7 +121,7 @@ class Test_rpc(unittest.TestCase): c = rpc.Client(self._client_sock) obj = - six.MAXSIZE - 1 assert isinstance(obj, int) - result = c.call("resp", [obj]) + result = c.call(b'resp', [obj]) assert result == obj assert isinstance(result, type(obj)) @@ -128,7 +130,7 @@ class Test_rpc(unittest.TestCase): obj = 0xffffffffffffffff # max value for msgpack _long = int if six.PY3 else long assert isinstance(obj, _long) - result = c.call("resp", [obj]) + result = c.call(b'resp', [obj]) assert result == obj assert isinstance(result, type(obj)) @@ -137,15 +139,15 @@ class Test_rpc(unittest.TestCase): # NOTE: the python type of this value is int for 64-bit arch obj = -0x8000000000000000 # min value for msgpack assert isinstance(obj, numbers.Integral) - result = c.call("resp", [obj]) + result = c.call(b'resp', [obj]) assert result == obj assert isinstance(result, type(obj)) @raises(TypeError) def test_0_call_bytearray(self): c = rpc.Client(self._client_sock) - obj = bytearray("foo") - result = c.call("resp", [obj]) + obj = bytearray(b'foo') + result = c.call(b'resp', [obj]) assert result == obj assert isinstance(result, bytes) @@ -158,48 +160,48 @@ class Test_rpc(unittest.TestCase): @raises(EOFError) def test_1_client_shutdown_wr(self): c = rpc.Client(self._client_sock) - c.call("shutdown", ["SHUT_WR"]) + c.call(b'shutdown', [b'SHUT_WR']) def test_1_call_True(self): c = rpc.Client(self._client_sock) obj = True - assert c.call("resp", [obj]) == obj + assert c.call(b'resp', [obj]) == obj def test_2_call_None(self): c = rpc.Client(self._client_sock) obj = None - assert c.call("resp", [obj]) is None + assert c.call(b'resp', [obj]) is None def test_2_call_False(self): c = rpc.Client(self._client_sock) obj = False - assert c.call("resp", [obj]) == obj + assert c.call(b'resp', [obj]) == obj def test_2_call_dict(self): c = rpc.Client(self._client_sock) - obj = {"hoge": 1, "fuga": 2} - assert c.call("resp", [obj]) == obj + obj = {b'hoge': 1, b'fuga': 2} + assert c.call(b'resp', [obj]) == obj def test_2_call_empty_dict(self): c = rpc.Client(self._client_sock) obj = {} - assert c.call("resp", [obj]) == obj + assert c.call(b'resp', [obj]) == obj def test_2_call_array(self): c = rpc.Client(self._client_sock) obj = [1, 2, 3, 4] - assert c.call("resp", [obj]) == obj + assert c.call(b'resp', [obj]) == obj def test_2_call_empty_array(self): c = rpc.Client(self._client_sock) obj = [] - assert c.call("resp", [obj]) == obj + assert c.call(b'resp', [obj]) == obj def test_2_call_tuple(self): c = rpc.Client(self._client_sock) # note: msgpack library implicitly convert a tuple into a list obj = (1, 2, 3) - assert c.call("resp", [obj]) == list(obj) + assert c.call(b'resp', [obj]) == list(obj) @raises(TypeError) def test_2_call_unicode(self): @@ -211,7 +213,7 @@ class Test_rpc(unittest.TestCase): # it seems to be going to change. # https://gist.github.com/methane/5022403 obj = u"hoge" - result = c.call("resp", [obj]) + result = c.call(b'resp', [obj]) assert result == obj assert isinstance(result, bytes) @@ -219,21 +221,21 @@ class Test_rpc(unittest.TestCase): import struct c = rpc.Client(self._client_sock) obj = struct.pack("100x") - result = c.call("resp", [obj]) + result = c.call(b'resp', [obj]) assert result == obj assert isinstance(result, bytes) def test_3_call_complex(self): c = rpc.Client(self._client_sock) - obj = [1, "hoge", {"foo": 1, 3: "bar"}] - assert c.call("resp", [obj]) == list(obj) + obj = [1, b'hoge', {b'foo': 1, 3: b'bar'}] + assert c.call(b'resp', [obj]) == list(obj) def test_4_call_large_binary(self): import struct c = rpc.Client(self._client_sock) obj = struct.pack("10000000x") - result = c.call("resp", [obj]) + result = c.call(b'resp', [obj]) assert result == obj assert isinstance(result, bytes) @@ -243,15 +245,15 @@ class Test_rpc(unittest.TestCase): def callback(n): l.append(n) c = rpc.Client(self._client_sock, notification_callback=callback) - obj = "hogehoge" - robj = "fugafuga" - assert c.call("notify1", [robj, "notify_hoge", [obj]]) == robj + obj = b'hogehoge' + robj = b'fugafuga' + assert c.call(b'notify1', [robj, b'notify_hoge', [obj]]) == robj c.receive_notification() assert len(l) == 1 n = l.pop(0) assert n is not None method, params = n - assert method == "notify_hoge" + assert method == b'notify_hoge' assert params[0] == obj def test_0_notification2(self): @@ -260,21 +262,21 @@ class Test_rpc(unittest.TestCase): def callback(n): l.append(n) c = rpc.Client(self._client_sock, notification_callback=callback) - obj = "hogehogehoge" - c.send_notification("notify2", ["notify_hoge", [obj]]) + obj = b'hogehogehoge' + c.send_notification(b'notify2', [b'notify_hoge', [obj]]) c.receive_notification() assert len(l) == 1 n = l.pop(0) assert n is not None method, params = n - assert method == "notify_hoge" + assert method == b'notify_hoge' assert params[0] == obj def test_0_call_error(self): c = rpc.Client(self._client_sock) - obj = "hoge" + obj = b'hoge' try: - c.call("err", [obj]) + c.call(b'err', [obj]) raise Exception("unexpected") except rpc.RPCError as e: assert e.get_value() == obj @@ -285,18 +287,18 @@ class Test_rpc(unittest.TestCase): def callback(n): l.append(n) c = rpc.Client(self._client_sock, notification_callback=callback) - c.send_notification("notify2", ["notify_foo", []]) + c.send_notification(b'notify2', [b'notify_foo', []]) hub.sleep(0.5) # give the peer a chance to run - obj = "hoge" + obj = b'hoge' try: - c.call("err", [obj]) + c.call(b'err', [obj]) raise Exception("unexpected") except rpc.RPCError as e: assert e.get_value() == obj assert len(l) == 1 n = l.pop(0) method, params = n - assert method == "notify_foo" + assert method == b'notify_foo' assert params == [] def test_4_async_call(self): @@ -308,7 +310,7 @@ class Test_rpc(unittest.TestCase): e = rpc.EndPoint(self._client_sock) s = set() for i in range(1, num_calls + 1): - s.add(e.send_request("resp", [i])) + s.add(e.send_request(b'resp', [i])) sum = 0 while s: e.block() @@ -338,7 +340,7 @@ class Test_rpc(unittest.TestCase): e = rpc.EndPoint(self._client_sock) s = set() for i in range(1, num_calls + 1): - s.add(e.send_request("callback", [i, "ourcallback", 0])) + s.add(e.send_request(b'callback', [i, b'ourcallback', 0])) sum = 0 while s: e.block() @@ -357,10 +359,10 @@ class Test_rpc(unittest.TestCase): r = e.get_request() if r is not None: msgid, method, params = r - assert method == "ourcallback" + assert method == b'ourcallback' omsgid, n, cb, v = params assert omsgid in s - assert cb == "ourcallback" + assert cb == b'ourcallback' assert n > 0 e.send_response(msgid, result=[omsgid, n - 1, cb, v + 1]) assert sum == (1 + num_calls) * num_calls / 2 -- 2.1.4 ------------------------------------------------------------------------------ Don't Limit Your Business. Reach for the Cloud. GigeNET's Cloud Solutions provide you with the tools and support that you need to offload your IT needs and focus on growing your business. Configured For All Businesses. Start Your Cloud Today. https://www.gigenetcloud.com/ _______________________________________________ Ryu-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ryu-devel
