forked from ObjectProfile/PythonBridge
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathtest_msgpack_socket_platform.py
More file actions
119 lines (104 loc) · 3.95 KB
/
test_msgpack_socket_platform.py
File metadata and controls
119 lines (104 loc) · 3.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import unittest
import socket
import threading
import time
import msgpack
import msgpack_socket_platform
import stoppable_thread
TEST_PORT = 7777
def wait_a_little():
time.sleep(.05)
def do_nothing(msg):
pass
class TestMsgPackSocket(unittest.TestCase):
def setUp(self):
self.start_stub_server()
self.msg_service = msgpack_socket_platform.MsgPackSocketPlatform(TEST_PORT)
self.msg_service.start()
def tearDown(self):
self.thread.stop()
self.msg_service.stop()
self.server_client.close()
self.server_sock.close()
self.thread.join()
def start_stub_server(self):
# Run a server to listen for a connection and then close it
self.server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# SOL_SOCKET and SOREUSEADDR allow kernel to reuse socket and allow us to rapidly create and destroy sockets
self.server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_sock.bind(('127.0.0.1', TEST_PORT))
self.server_sock.listen(1)
self.server_handler = do_nothing
self.unpacker = msgpack.Unpacker(raw=False)
self.packer = msgpack.Packer(use_bin_type=True)
self.thread = stoppable_thread.StoppableThread(
loop_func= self.prim_handle,
setup_func= self.setup_func)
self.thread.start()
def setup_func(self):
self.server_client, _ = self.server_sock.accept()
def prim_handle(self):
try:
data = self.server_client.recv(2048)
self.unpacker.feed(data)
for msg in self.unpacker:
self.server_handler(msg)
except OSError:
self.thread.stop()
def prim_send_msg(self, msg):
self.server_client.send(self.packer.pack(msg))
def test_connect(self):
self.assertIsNotNone(self.server_client)
self.assertIsNotNone(self.msg_service.client)
def test_send_async_msg(self):
flag = False
def handler(msg):
nonlocal flag
self.assertEqual(msg,{'type': 'FOO', 'val': 33})
flag = True
self.server_handler = handler
self.msg_service.send_async_message({'type': 'FOO', 'val': 33})
wait_a_little()
self.assertTrue(flag)
def test_send_sync_msg(self):
flag = False
sync_id = None
def handler(msg):
nonlocal flag
nonlocal sync_id
sync_id = msg['__sync']
self.assertEqual(msg,{'type': 'FOO', 'val': 33, '__sync': sync_id})
self.prim_send_msg({'type': 'FOO', 'val': 42, '__sync': sync_id})
flag = True
self.server_handler = handler
ans = self.msg_service.send_sync_message({'type': 'FOO', 'val': 33})
self.assertEqual(ans, {'type': 'FOO', 'val': 42, '__sync': sync_id})
self.assertTrue(flag)
def test_handle_async(self):
flag = False
def handler(msg):
nonlocal flag
self.assertEqual(msg,{'type': 'FOO', 'val': 33})
flag = True
self.msg_service.set_handler('FOO',handler)
self.prim_send_msg({'type': 'FOO', 'val': 33})
wait_a_little()
self.assertTrue(flag)
def test_handle_sync(self):
flag1 = False
flag2 = False
def service_handler(msg):
nonlocal flag1
self.assertEqual(msg,{'type': 'FOO', '__sync': 'abcde12345', 'val': 33})
flag1 = True
self.msg_service.send_answer(msg, {'type': 'FOO', 'val': 42})
self.msg_service.set_handler('FOO',service_handler)
def test_handler(msg):
nonlocal flag2
self.assertEqual(msg,{'type': 'FOO', '__sync': 'abcde12345', 'val': 42})
flag2 = True
self.server_handler = test_handler
self.prim_send_msg({'type': 'FOO', '__sync': 'abcde12345', 'val': 33})
wait_a_little()
self.assertTrue(flag1)
self.assertTrue(flag2)