14 """Tests application-provided metadata, status code, and details."""
26 _SERIALIZED_REQUEST = b
'\x46\x47\x48'
27 _SERIALIZED_RESPONSE = b
'\x49\x50\x51'
29 _REQUEST_SERIALIZER =
lambda unused_request: _SERIALIZED_REQUEST
30 _REQUEST_DESERIALIZER =
lambda unused_serialized_request: object()
31 _RESPONSE_SERIALIZER =
lambda unused_response: _SERIALIZED_RESPONSE
32 _RESPONSE_DESERIALIZER =
lambda unused_serialized_response: object()
34 _SERVICE =
'test.TestService'
35 _UNARY_UNARY =
'UnaryUnary'
36 _UNARY_STREAM =
'UnaryStream'
37 _STREAM_UNARY =
'StreamUnary'
38 _STREAM_STREAM =
'StreamStream'
40 _CLIENT_METADATA = ((
'client-md-key',
'client-md-key'), (
'client-md-key-bin',
43 _SERVER_INITIAL_METADATA = ((
'server-initial-md-key',
44 'server-initial-md-value'),
45 (
'server-initial-md-key-bin', b
'\x00\x02'))
47 _SERVER_TRAILING_METADATA = ((
'server-trailing-md-key',
48 'server-trailing-md-value'),
49 (
'server-trailing-md-key-bin', b
'\x00\x03'))
51 _NON_OK_CODE = grpc.StatusCode.NOT_FOUND
52 _DETAILS =
'Test details!'
55 _ABORT_CODES = (_NON_OK_CODE, 3, grpc.StatusCode.OK)
56 _EXPECTED_CLIENT_CODES = (_NON_OK_CODE, grpc.StatusCode.UNKNOWN,
57 grpc.StatusCode.UNKNOWN)
58 _EXPECTED_DETAILS = (_DETAILS, _DETAILS,
'')
75 context.send_initial_metadata(_SERVER_INITIAL_METADATA)
76 context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
80 if self.
_code is not None:
81 context.set_code(self.
_code)
85 raise test_control.Defect()
92 context.send_initial_metadata(_SERVER_INITIAL_METADATA)
93 context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
97 if self.
_code is not None:
98 context.set_code(self.
_code)
101 for _
in range(test_constants.STREAM_LENGTH // 2):
102 yield _SERIALIZED_RESPONSE
104 raise test_control.Defect()
109 context.send_initial_metadata(_SERVER_INITIAL_METADATA)
110 context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
113 list(request_iterator)
117 if self.
_code is not None:
118 context.set_code(self.
_code)
122 raise test_control.Defect()
124 return None if self.
_return_none else _SERIALIZED_RESPONSE
129 context.send_initial_metadata(_SERVER_INITIAL_METADATA)
130 context.set_trailing_metadata(_SERVER_TRAILING_METADATA)
133 list(request_iterator)
137 if self.
_code is not None:
138 context.set_code(self.
_code)
141 for _
in range(test_constants.STREAM_LENGTH // 3):
144 raise test_control.Defect()
175 servicer.unary_unary,
176 request_deserializer=_REQUEST_DESERIALIZER,
177 response_serializer=_RESPONSE_SERIALIZER),
184 servicer.stream_stream,
185 request_deserializer=_REQUEST_DESERIALIZER,
186 response_serializer=_RESPONSE_SERIALIZER),
196 self.
_server.add_generic_rpc_handlers(
198 port = self.
_server.add_insecure_port(
'[::]:0')
208 request_serializer=_REQUEST_SERIALIZER,
209 response_deserializer=_RESPONSE_DESERIALIZER,
229 request_serializer=_REQUEST_SERIALIZER,
230 response_deserializer=_RESPONSE_DESERIALIZER,
241 object(), metadata=_CLIENT_METADATA)
244 test_common.metadata_transmitted(
245 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
247 test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
248 call.initial_metadata()))
250 test_common.metadata_transmitted(_SERVER_TRAILING_METADATA,
251 call.trailing_metadata()))
252 self.assertIs(grpc.StatusCode.OK, call.code())
257 response_iterator_call = self.
_unary_stream(_SERIALIZED_REQUEST,
258 metadata=_CLIENT_METADATA)
259 received_initial_metadata = response_iterator_call.initial_metadata()
260 list(response_iterator_call)
263 test_common.metadata_transmitted(
264 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
266 test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
267 received_initial_metadata))
269 test_common.metadata_transmitted(
270 _SERVER_TRAILING_METADATA,
271 response_iterator_call.trailing_metadata()))
272 self.assertIs(grpc.StatusCode.OK, response_iterator_call.code())
278 iter([_SERIALIZED_REQUEST] * test_constants.STREAM_LENGTH),
279 metadata=_CLIENT_METADATA)
282 test_common.metadata_transmitted(
283 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
285 test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
286 call.initial_metadata()))
288 test_common.metadata_transmitted(_SERVER_TRAILING_METADATA,
289 call.trailing_metadata()))
290 self.assertIs(grpc.StatusCode.OK, call.code())
296 [object()] * test_constants.STREAM_LENGTH),
297 metadata=_CLIENT_METADATA)
298 received_initial_metadata = response_iterator_call.initial_metadata()
299 list(response_iterator_call)
302 test_common.metadata_transmitted(
303 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
305 test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
306 received_initial_metadata))
308 test_common.metadata_transmitted(
309 _SERVER_TRAILING_METADATA,
310 response_iterator_call.trailing_metadata()))
311 self.assertIs(grpc.StatusCode.OK, response_iterator_call.code())
314 test_cases = zip(_ABORT_CODES, _EXPECTED_CLIENT_CODES,
316 for abort_code, expected_code, expected_details
in test_cases:
322 self.
_unary_unary.with_call(object(), metadata=_CLIENT_METADATA)
325 test_common.metadata_transmitted(
327 self.
_servicer.received_client_metadata()))
329 test_common.metadata_transmitted(
330 _SERVER_INITIAL_METADATA,
331 exception_context.exception.initial_metadata()))
333 test_common.metadata_transmitted(
334 _SERVER_TRAILING_METADATA,
335 exception_context.exception.trailing_metadata()))
336 self.assertIs(expected_code, exception_context.exception.code())
337 self.assertEqual(expected_details,
338 exception_context.exception.details())
341 test_cases = zip(_ABORT_CODES, _EXPECTED_CLIENT_CODES,
343 for abort_code, expected_code, expected_details
in test_cases:
349 _SERIALIZED_REQUEST, metadata=_CLIENT_METADATA)
350 received_initial_metadata = \
351 response_iterator_call.initial_metadata()
353 self.assertEqual(
len(list(response_iterator_call)), 0)
356 test_common.metadata_transmitted(
358 self.
_servicer.received_client_metadata()))
360 test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
361 received_initial_metadata))
363 test_common.metadata_transmitted(
364 _SERVER_TRAILING_METADATA,
365 response_iterator_call.trailing_metadata()))
366 self.assertIs(expected_code, response_iterator_call.code())
367 self.assertEqual(expected_details, response_iterator_call.details())
370 test_cases = zip(_ABORT_CODES, _EXPECTED_CLIENT_CODES,
372 for abort_code, expected_code, expected_details
in test_cases:
379 test_constants.STREAM_LENGTH),
380 metadata=_CLIENT_METADATA)
383 test_common.metadata_transmitted(
385 self.
_servicer.received_client_metadata()))
387 test_common.metadata_transmitted(
388 _SERVER_INITIAL_METADATA,
389 exception_context.exception.initial_metadata()))
391 test_common.metadata_transmitted(
392 _SERVER_TRAILING_METADATA,
393 exception_context.exception.trailing_metadata()))
394 self.assertIs(expected_code, exception_context.exception.code())
395 self.assertEqual(expected_details,
396 exception_context.exception.details())
399 test_cases = zip(_ABORT_CODES, _EXPECTED_CLIENT_CODES,
401 for abort_code, expected_code, expected_details
in test_cases:
407 iter([object()] * test_constants.STREAM_LENGTH),
408 metadata=_CLIENT_METADATA)
409 received_initial_metadata = \
410 response_iterator_call.initial_metadata()
412 self.assertEqual(
len(list(response_iterator_call)), 0)
415 test_common.metadata_transmitted(
417 self.
_servicer.received_client_metadata()))
419 test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
420 received_initial_metadata))
422 test_common.metadata_transmitted(
423 _SERVER_TRAILING_METADATA,
424 response_iterator_call.trailing_metadata()))
425 self.assertIs(expected_code, response_iterator_call.code())
426 self.assertEqual(expected_details, response_iterator_call.details())
433 self.
_unary_unary.with_call(object(), metadata=_CLIENT_METADATA)
436 test_common.metadata_transmitted(
437 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
439 test_common.metadata_transmitted(
440 _SERVER_INITIAL_METADATA,
441 exception_context.exception.initial_metadata()))
443 test_common.metadata_transmitted(
444 _SERVER_TRAILING_METADATA,
445 exception_context.exception.trailing_metadata()))
446 self.assertIs(_NON_OK_CODE, exception_context.exception.code())
447 self.assertEqual(_DETAILS, exception_context.exception.details())
453 response_iterator_call = self.
_unary_stream(_SERIALIZED_REQUEST,
454 metadata=_CLIENT_METADATA)
455 received_initial_metadata = response_iterator_call.initial_metadata()
457 list(response_iterator_call)
460 test_common.metadata_transmitted(
461 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
463 test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
464 received_initial_metadata))
466 test_common.metadata_transmitted(
467 _SERVER_TRAILING_METADATA,
468 response_iterator_call.trailing_metadata()))
469 self.assertIs(_NON_OK_CODE, response_iterator_call.code())
470 self.assertEqual(_DETAILS, response_iterator_call.details())
478 test_constants.STREAM_LENGTH),
479 metadata=_CLIENT_METADATA)
482 test_common.metadata_transmitted(
483 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
485 test_common.metadata_transmitted(
486 _SERVER_INITIAL_METADATA,
487 exception_context.exception.initial_metadata()))
489 test_common.metadata_transmitted(
490 _SERVER_TRAILING_METADATA,
491 exception_context.exception.trailing_metadata()))
492 self.assertIs(_NON_OK_CODE, exception_context.exception.code())
493 self.assertEqual(_DETAILS, exception_context.exception.details())
500 [object()] * test_constants.STREAM_LENGTH),
501 metadata=_CLIENT_METADATA)
502 received_initial_metadata = response_iterator_call.initial_metadata()
504 list(response_iterator_call)
507 test_common.metadata_transmitted(
508 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
510 test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
511 received_initial_metadata))
513 test_common.metadata_transmitted(
514 _SERVER_TRAILING_METADATA,
515 exception_context.exception.trailing_metadata()))
516 self.assertIs(_NON_OK_CODE, exception_context.exception.code())
517 self.assertEqual(_DETAILS, exception_context.exception.details())
525 self.
_unary_unary.with_call(object(), metadata=_CLIENT_METADATA)
528 test_common.metadata_transmitted(
529 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
531 test_common.metadata_transmitted(
532 _SERVER_INITIAL_METADATA,
533 exception_context.exception.initial_metadata()))
535 test_common.metadata_transmitted(
536 _SERVER_TRAILING_METADATA,
537 exception_context.exception.trailing_metadata()))
538 self.assertIs(_NON_OK_CODE, exception_context.exception.code())
539 self.assertEqual(_DETAILS, exception_context.exception.details())
546 response_iterator_call = self.
_unary_stream(_SERIALIZED_REQUEST,
547 metadata=_CLIENT_METADATA)
548 received_initial_metadata = response_iterator_call.initial_metadata()
550 list(response_iterator_call)
553 test_common.metadata_transmitted(
554 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
556 test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
557 received_initial_metadata))
559 test_common.metadata_transmitted(
560 _SERVER_TRAILING_METADATA,
561 response_iterator_call.trailing_metadata()))
562 self.assertIs(_NON_OK_CODE, response_iterator_call.code())
563 self.assertEqual(_DETAILS, response_iterator_call.details())
572 test_constants.STREAM_LENGTH),
573 metadata=_CLIENT_METADATA)
576 test_common.metadata_transmitted(
577 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
579 test_common.metadata_transmitted(
580 _SERVER_INITIAL_METADATA,
581 exception_context.exception.initial_metadata()))
583 test_common.metadata_transmitted(
584 _SERVER_TRAILING_METADATA,
585 exception_context.exception.trailing_metadata()))
586 self.assertIs(_NON_OK_CODE, exception_context.exception.code())
587 self.assertEqual(_DETAILS, exception_context.exception.details())
595 [object()] * test_constants.STREAM_LENGTH),
596 metadata=_CLIENT_METADATA)
597 received_initial_metadata = response_iterator_call.initial_metadata()
599 list(response_iterator_call)
602 test_common.metadata_transmitted(
603 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
605 test_common.metadata_transmitted(_SERVER_INITIAL_METADATA,
606 received_initial_metadata))
608 test_common.metadata_transmitted(
609 _SERVER_TRAILING_METADATA,
610 response_iterator_call.trailing_metadata()))
611 self.assertIs(_NON_OK_CODE, response_iterator_call.code())
612 self.assertEqual(_DETAILS, response_iterator_call.details())
620 self.
_unary_unary.with_call(object(), metadata=_CLIENT_METADATA)
623 test_common.metadata_transmitted(
624 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
626 test_common.metadata_transmitted(
627 _SERVER_INITIAL_METADATA,
628 exception_context.exception.initial_metadata()))
630 test_common.metadata_transmitted(
631 _SERVER_TRAILING_METADATA,
632 exception_context.exception.trailing_metadata()))
633 self.assertIs(_NON_OK_CODE, exception_context.exception.code())
634 self.assertEqual(_DETAILS, exception_context.exception.details())
643 test_constants.STREAM_LENGTH),
644 metadata=_CLIENT_METADATA)
647 test_common.metadata_transmitted(
648 _CLIENT_METADATA, self.
_servicer.received_client_metadata()))
650 test_common.metadata_transmitted(
651 _SERVER_INITIAL_METADATA,
652 exception_context.exception.initial_metadata()))
654 test_common.metadata_transmitted(
655 _SERVER_TRAILING_METADATA,
656 exception_context.exception.trailing_metadata()))
657 self.assertIs(_NON_OK_CODE, exception_context.exception.code())
658 self.assertEqual(_DETAILS, exception_context.exception.details())
664 super(_InspectServicer, self).
__init__()
670 super(_InspectServicer, self).
unary_unary(request, context)
682 self.
_server.add_generic_rpc_handlers(
684 port = self.
_server.add_insecure_port(
'[::]:0')
694 request_serializer=_REQUEST_SERIALIZER,
695 response_deserializer=_RESPONSE_DESERIALIZER,
707 self.
_unary_unary.with_call(object(), metadata=_CLIENT_METADATA)
709 err = exc_info.exception
710 self.assertEqual(_NON_OK_CODE, err.code())
712 self.assertEqual(self.
_servicer.actual_code, _NON_OK_CODE)
713 self.assertEqual(self.
_servicer.actual_details.decode(
'utf-8'),
715 self.assertEqual(self.
_servicer.actual_trailing_metadata,
716 _SERVER_TRAILING_METADATA)
719 if __name__ ==
'__main__':
720 logging.basicConfig()
721 unittest.main(verbosity=2)