1# Copyright 2016 gRPC authors. 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15import logging 16import unittest 17 18import grpc 19 20from tests.unit import test_common 21from tests.unit.framework.common import test_constants 22 23_REQUEST = b"" 24_RESPONSE = b"" 25 26_UNARY_UNARY = "/test/UnaryUnary" 27_UNARY_STREAM = "/test/UnaryStream" 28_STREAM_UNARY = "/test/StreamUnary" 29_STREAM_STREAM = "/test/StreamStream" 30 31 32def handle_unary_unary(request, servicer_context): 33 return _RESPONSE 34 35 36def handle_unary_stream(request, servicer_context): 37 for _ in range(test_constants.STREAM_LENGTH): 38 yield _RESPONSE 39 40 41def handle_stream_unary(request_iterator, servicer_context): 42 for request in request_iterator: 43 pass 44 return _RESPONSE 45 46 47def handle_stream_stream(request_iterator, servicer_context): 48 for request in request_iterator: 49 yield _RESPONSE 50 51 52class _MethodHandler(grpc.RpcMethodHandler): 53 def __init__(self, request_streaming, response_streaming): 54 self.request_streaming = request_streaming 55 self.response_streaming = response_streaming 56 self.request_deserializer = None 57 self.response_serializer = None 58 self.unary_unary = None 59 self.unary_stream = None 60 self.stream_unary = None 61 self.stream_stream = None 62 if self.request_streaming and self.response_streaming: 63 self.stream_stream = handle_stream_stream 64 elif self.request_streaming: 65 self.stream_unary = handle_stream_unary 66 elif self.response_streaming: 67 self.unary_stream = handle_unary_stream 68 else: 69 self.unary_unary = handle_unary_unary 70 71 72class _GenericHandler(grpc.GenericRpcHandler): 73 def service(self, handler_call_details): 74 if handler_call_details.method == _UNARY_UNARY: 75 return _MethodHandler(False, False) 76 elif handler_call_details.method == _UNARY_STREAM: 77 return _MethodHandler(False, True) 78 elif handler_call_details.method == _STREAM_UNARY: 79 return _MethodHandler(True, False) 80 elif handler_call_details.method == _STREAM_STREAM: 81 return _MethodHandler(True, True) 82 else: 83 return None 84 85 86class EmptyMessageTest(unittest.TestCase): 87 def setUp(self): 88 self._server = test_common.test_server() 89 self._server.add_generic_rpc_handlers((_GenericHandler(),)) 90 port = self._server.add_insecure_port("[::]:0") 91 self._server.start() 92 self._channel = grpc.insecure_channel("localhost:%d" % port) 93 94 def tearDown(self): 95 self._server.stop(0) 96 self._channel.close() 97 98 def testUnaryUnary(self): 99 response = self._channel.unary_unary( 100 _UNARY_UNARY, 101 _registered_method=True, 102 )(_REQUEST) 103 self.assertEqual(_RESPONSE, response) 104 105 def testUnaryStream(self): 106 response_iterator = self._channel.unary_stream( 107 _UNARY_STREAM, 108 _registered_method=True, 109 )(_REQUEST) 110 self.assertSequenceEqual( 111 [_RESPONSE] * test_constants.STREAM_LENGTH, list(response_iterator) 112 ) 113 114 def testStreamUnary(self): 115 response = self._channel.stream_unary( 116 _STREAM_UNARY, 117 _registered_method=True, 118 )(iter([_REQUEST] * test_constants.STREAM_LENGTH)) 119 self.assertEqual(_RESPONSE, response) 120 121 def testStreamStream(self): 122 response_iterator = self._channel.stream_stream( 123 _STREAM_STREAM, 124 _registered_method=True, 125 )(iter([_REQUEST] * test_constants.STREAM_LENGTH)) 126 self.assertSequenceEqual( 127 [_RESPONSE] * test_constants.STREAM_LENGTH, list(response_iterator) 128 ) 129 130 131if __name__ == "__main__": 132 logging.basicConfig() 133 unittest.main(verbosity=2) 134