14 """Tests behavior around the metadata mechanism."""
28 _TEST_CLIENT_TO_SERVER =
'/test/TestClientToServer'
29 _TEST_SERVER_TO_CLIENT =
'/test/TestServerToClient'
30 _TEST_TRAILING_METADATA =
'/test/TestTrailingMetadata'
31 _TEST_ECHO_INITIAL_METADATA =
'/test/TestEchoInitialMetadata'
32 _TEST_GENERIC_HANDLER =
'/test/TestGenericHandler'
33 _TEST_UNARY_STREAM =
'/test/TestUnaryStream'
34 _TEST_STREAM_UNARY =
'/test/TestStreamUnary'
35 _TEST_STREAM_STREAM =
'/test/TestStreamStream'
36 _TEST_INSPECT_CONTEXT =
'/test/TestInspectContext'
38 _REQUEST = b
'\x00\x00\x00'
39 _RESPONSE = b
'\x01\x01\x01'
41 _INITIAL_METADATA_FROM_CLIENT_TO_SERVER = aio.Metadata(
42 (
'client-to-server',
'question'),
43 (
'client-to-server-bin', b
'\x07\x07\x07'),
45 _INITIAL_METADATA_FROM_SERVER_TO_CLIENT = aio.Metadata(
46 (
'server-to-client',
'answer'),
47 (
'server-to-client-bin', b
'\x06\x06\x06'),
49 _TRAILING_METADATA = aio.Metadata(
50 (
'a-trailing-metadata',
'stack-trace'),
51 (
'a-trailing-metadata-bin', b
'\x05\x05\x05'),
53 _INITIAL_METADATA_FOR_GENERIC_HANDLER = aio.Metadata(
54 (
'a-must-have-key',
'secret'),)
56 _INVALID_METADATA_TEST_CASES = (
75 ((
'normal', object()),),
79 _NON_OK_CODE = grpc.StatusCode.NOT_FOUND
80 _DETAILS =
'Test details!'
87 _TEST_CLIENT_TO_SERVER:
90 _TEST_SERVER_TO_CLIENT:
93 _TEST_TRAILING_METADATA:
102 _TEST_INSPECT_CONTEXT:
108 assert _REQUEST == request
109 assert _common.seen_metadata(_INITIAL_METADATA_FROM_CLIENT_TO_SERVER,
110 context.invocation_metadata())
115 assert _REQUEST == request
116 await context.send_initial_metadata(
117 _INITIAL_METADATA_FROM_SERVER_TO_CLIENT)
122 assert _REQUEST == request
123 context.set_trailing_metadata(_TRAILING_METADATA)
128 assert _REQUEST == request
129 assert _common.seen_metadata(_INITIAL_METADATA_FROM_CLIENT_TO_SERVER,
130 context.invocation_metadata())
131 await context.send_initial_metadata(
132 _INITIAL_METADATA_FROM_SERVER_TO_CLIENT)
134 context.set_trailing_metadata(_TRAILING_METADATA)
138 assert _common.seen_metadata(_INITIAL_METADATA_FROM_CLIENT_TO_SERVER,
139 context.invocation_metadata())
140 await context.send_initial_metadata(
141 _INITIAL_METADATA_FROM_SERVER_TO_CLIENT)
143 async
for request
in request_iterator:
144 assert _REQUEST == request
146 context.set_trailing_metadata(_TRAILING_METADATA)
151 assert _common.seen_metadata(_INITIAL_METADATA_FROM_CLIENT_TO_SERVER,
152 context.invocation_metadata())
153 await context.send_initial_metadata(
154 _INITIAL_METADATA_FROM_SERVER_TO_CLIENT)
156 async
for request
in request_iterator:
157 assert _REQUEST == request
160 context.set_trailing_metadata(_TRAILING_METADATA)
164 assert _REQUEST == request
165 context.set_code(_NON_OK_CODE)
166 context.set_details(_DETAILS)
167 context.set_trailing_metadata(_TRAILING_METADATA)
170 assert context.get_code() == _NON_OK_CODE
171 assert context.get_details() == _DETAILS
172 assert context.get_trailing_metadata() == _TRAILING_METADATA
183 assert _REQUEST == request
187 assert _common.seen_metadata(_INITIAL_METADATA_FOR_GENERIC_HANDLER,
188 handler_call_details.invocation_metadata)
193 server = aio.server()
194 port = server.add_insecure_port(
'[::]:0')
195 server.add_generic_rpc_handlers((
200 return 'localhost:%d' % port, server
215 call = multicallable(_REQUEST,
216 metadata=_INITIAL_METADATA_FROM_CLIENT_TO_SERVER)
217 self.assertEqual(_RESPONSE, await call)
218 self.assertEqual(grpc.StatusCode.OK, await call.code())
222 call = multicallable(_REQUEST)
224 self.assertEqual(_INITIAL_METADATA_FROM_SERVER_TO_CLIENT, await
225 call.initial_metadata())
226 self.assertEqual(_RESPONSE, await call)
227 self.assertEqual(grpc.StatusCode.OK, await call.code())
231 call = multicallable(_REQUEST)
232 self.assertEqual(_TRAILING_METADATA, await call.trailing_metadata())
233 self.assertEqual(_RESPONSE, await call)
234 self.assertEqual(grpc.StatusCode.OK, await call.code())
238 call = multicallable(
239 _REQUEST, metadata=list(_INITIAL_METADATA_FROM_CLIENT_TO_SERVER))
240 self.assertEqual(_RESPONSE, await call)
241 self.assertEqual(grpc.StatusCode.OK, await call.code())
243 @unittest.skipIf(platform.system() ==
'Windows',
244 'https://github.com/grpc/grpc/issues/21943')
247 for exception_type, metadata
in _INVALID_METADATA_TEST_CASES:
248 with self.subTest(metadata=metadata):
249 with self.assertRaises(exception_type):
250 call = multicallable(_REQUEST, metadata=metadata)
255 call = multicallable(_REQUEST,
256 metadata=_INITIAL_METADATA_FOR_GENERIC_HANDLER)
257 self.assertEqual(_RESPONSE, await call)
258 self.assertEqual(grpc.StatusCode.OK, await call.code())
262 call = multicallable(_REQUEST,
263 metadata=_INITIAL_METADATA_FROM_CLIENT_TO_SERVER)
266 _common.seen_metadata(_INITIAL_METADATA_FROM_SERVER_TO_CLIENT, await
267 call.initial_metadata()))
269 self.assertSequenceEqual([_RESPONSE],
270 [request async
for request
in call])
272 self.assertEqual(_TRAILING_METADATA, await call.trailing_metadata())
273 self.assertEqual(grpc.StatusCode.OK, await call.code())
277 call = multicallable(metadata=_INITIAL_METADATA_FROM_CLIENT_TO_SERVER)
278 await call.write(_REQUEST)
279 await call.done_writing()
282 _common.seen_metadata(_INITIAL_METADATA_FROM_SERVER_TO_CLIENT, await
283 call.initial_metadata()))
284 self.assertEqual(_RESPONSE, await call)
286 self.assertEqual(_TRAILING_METADATA, await call.trailing_metadata())
287 self.assertEqual(grpc.StatusCode.OK, await call.code())
291 call = multicallable(metadata=_INITIAL_METADATA_FROM_CLIENT_TO_SERVER)
292 await call.write(_REQUEST)
293 await call.done_writing()
296 _common.seen_metadata(_INITIAL_METADATA_FROM_SERVER_TO_CLIENT, await
297 call.initial_metadata()))
298 self.assertSequenceEqual([_RESPONSE],
299 [request async
for request
in call])
300 self.assertEqual(_TRAILING_METADATA, await call.trailing_metadata())
301 self.assertEqual(grpc.StatusCode.OK, await call.code())
304 metadata_obj = aio.Metadata((
'key',
'42'), (
'key-2',
'value'))
305 self.assertEqual(metadata_obj, tuple(metadata_obj))
306 self.assertEqual(tuple(metadata_obj), metadata_obj)
308 expected_sum = tuple(metadata_obj) + ((
'third',
'3'),)
309 self.assertEqual(expected_sum, metadata_obj + ((
'third',
'3'),))
310 self.assertEqual(expected_sum, metadata_obj + aio.Metadata(
315 call = multicallable(_REQUEST)
319 err = exc_data.exception
320 self.assertEqual(_NON_OK_CODE, err.code())
323 if __name__ ==
'__main__':
324 logging.basicConfig(level=logging.DEBUG)
325 unittest.main(verbosity=2)