33
34
def test_received_header(self):
34
35
response_handler = client.StructureToResponse()
35
36
response_handler.received_header(
36
{'server_version': '1', 'request': 'hello', 'status': 'success'})
37
{'server_version': '1', 'request': 'hello'})
37
38
self.assertEqual('hello', response_handler.request_name)
38
39
self.assertEqual('1', response_handler.server_version)
39
self.assertEqual('success', response_handler.status)
40
40
self.assertEqual(None, response_handler.kwargs)
41
41
self.assertFalse(response_handler.finished)
43
43
def test_received_args(self):
44
44
response_handler = client.StructureToResponse()
45
45
response_handler.received_header(
46
{'server_version': '1', 'request': 'hello', 'status': 'success'})
46
{'server_version': '1', 'request': 'hello'})
47
47
response_handler.received_args({'arg': 2, 'arg2': 'value'})
48
self.assertEqual('success', response_handler.status)
48
49
self.assertEqual({'arg': 2, 'arg2': 'value'}, response_handler.kwargs)
49
50
self.assertFalse(response_handler.finished)
52
def test_received_stream_entry(self):
54
def take_entry(entry):
56
response_handler = client.StructureToResponse(take_entry)
57
response_handler.received_header(
58
{'server_version': '1', 'request': 'hello'})
59
response_handler.received_stream_entry({'entry': True})
60
self.assertEqual([{'entry': True}], entries)
61
self.assertFalse(response_handler.finished)
51
63
def test_received_end(self):
52
64
response_handler = client.StructureToResponse()
53
65
response_handler.received_header(
54
{'server_version': '1', 'request': 'hello', 'status': 'success'})
66
{'server_version': '1', 'request': 'hello'})
55
67
response_handler.received_args({'arg': 2, 'arg2': 'value'})
56
68
response_handler.received_end()
57
69
self.assertTrue(response_handler.finished)
72
class WithStreamRequest(requests.RPCRequest):
76
def __init__(self, state, responder):
77
super(WithStreamRequest, self).__init__(state, responder)
79
def handle_args(self, **kwargs):
80
self.responder.send_response(**kwargs)
82
def handle_stream_entry(self, entry):
83
v = entry['outgoing'] * 5
84
self.responder.stream_entry({'incoming': v})
60
91
class TestClient(tests.TestCase):
62
93
def test__encode_request(self):
82
113
+ 'e\x00\x00\x00\x00',
83
114
server_sock.recv(4096))
116
def test__encode_request_with_stream(self):
117
server_sock, client_sock = tests.socket_pair()
118
cli = client.Client(client_sock)
120
yield {'stream_entry': 1}
121
yield {'stream_entry': 2}
122
cli._encode_request('name', dict(a=1), stream=stream())
125
'h%s{"client_version": "%s", "request": "name"}'
126
% (struct.pack('!L', 41 + len(_u1db_version)), _u1db_version)
127
+ 'a\x00\x00\x00\x08{"a": 1}'
128
+ 'x\x00\x00\x00\x13{"stream_entry": 1}'
129
+ 'x\x00\x00\x00\x13{"stream_entry": 2}'
130
+ 'e\x00\x00\x00\x00',
131
server_sock.recv(4096))
85
133
def test_client_to_server_and_back(self):
86
134
server_sock, client_sock = tests.socket_pair()
87
135
cli = client.Client(client_sock)
105
153
content = client_sock.recv(4096)
106
154
self.assertEqual(
108
'h%s{"server_version": "%s", "request": "arg", "status": "success"}'
109
% (struct.pack('!L', 61 + len(_u1db_version)), _u1db_version)
156
'h%s{"server_version": "%s", "request": "arg"}'
157
% (struct.pack('!L', 40 + len(_u1db_version)), _u1db_version)
110
158
+ 'a\x00\x00\x00\x0a{"one": 1}'
111
159
+ 'e\x00\x00\x00\x00',
118
166
self.assertEqual(_u1db_version, response_handler.server_version)
119
167
self.assertEqual('success', response_handler.status)
120
168
self.assertTrue(response_handler.finished)
170
def test_client_to_server_and_back_with_streaming(self):
171
server_sock, client_sock = tests.socket_pair()
172
cli = client.Client(client_sock)
174
yield {'outgoing': 10}
175
yield {'outgoing': 20}
176
cli._encode_request('withstream', {'one': 1}, stream())
177
reqs = {'withstream': WithStreamRequest}
178
responder = sync_server.Responder(server_sock)
179
handler = sync_server.StructureToRequest(reqs, responder,
180
tests.ServerStateForTests())
181
decoder = protocol.ProtocolDecoder(handler)
182
# This should be the message from the client to the server
183
content = server_sock.recv(4096)
186
'h%s{"client_version": "%s", "request": "withstream"}'
187
% (struct.pack('!L', 47 + len(_u1db_version)), _u1db_version)
188
+ 'a\x00\x00\x00\x0a{"one": 1}'
189
+ 'x\x00\x00\x00\x10{"outgoing": 10}'
190
+ 'x\x00\x00\x00\x10{"outgoing": 20}'
191
+ 'e\x00\x00\x00\x00',
193
decoder.accept_bytes(content)
194
# The response from the server
195
content = client_sock.recv(4096)
198
'h%s{"server_version": "%s", "request": "withstream"}'
199
% (struct.pack('!L', 47 + len(_u1db_version)), _u1db_version)
200
+ 'a\x00\x00\x00\x0a{"one": 1}'
201
+ 'x\x00\x00\x00\x10{"incoming": 50}'
202
+ 'x\x00\x00\x00\x11{"incoming": 100}'
203
+ 'e\x00\x00\x00\x00',
206
def take_entry(entry):
207
entries.append(entry)
208
response_handler = client.StructureToResponse(take_entry)
209
decoder = protocol.ProtocolDecoder(response_handler)
210
decoder.accept_bytes(content)
211
self.assertEqual([{'incoming': 50}, {'incoming': 100}], entries)
212
self.assertEqual({'one': 1}, response_handler.kwargs)
213
self.assertEqual('withstream', response_handler.request_name)
214
self.assertEqual(_u1db_version, response_handler.server_version)
215
self.assertEqual('success', response_handler.status)
216
self.assertTrue(response_handler.finished)