mirror of https://github.com/grpc/grpc.git
parent
f9397de161
commit
bcf3a1f9e7
2 changed files with 146 additions and 16 deletions
@ -0,0 +1,146 @@ |
||||
# Copyright 2020 The gRPC Authors |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
"""Tests behavior around the metadata mechanism.""" |
||||
|
||||
import asyncio |
||||
import logging |
||||
import platform |
||||
import random |
||||
import unittest |
||||
|
||||
import grpc |
||||
from grpc.experimental import aio |
||||
|
||||
from tests_aio.unit._test_base import AioTestBase |
||||
|
||||
|
||||
_TEST_CLIENT_TO_SERVER = '/test/TestClientToServer' |
||||
_TEST_SERVER_TO_CLIENT = '/test/TestServerToClient' |
||||
_TEST_TRAILING_METADATA = '/test/TestTrailingMetadata' |
||||
_TEST_ECHO_INITIAL_METADATA = '/test/TestEchoInitialMetadata' |
||||
_TEST_GENERIC_HANDLER = '/test/TestGenericHandler' |
||||
|
||||
_REQUEST = b'\x00\x00\x00' |
||||
_RESPONSE = b'\x01\x01\x01' |
||||
|
||||
_INITIAL_METADATA_FROM_CLIENT_TO_SERVER = ('client-to-server', 'question') |
||||
_INITIAL_METADATA_FROM_SERVER_TO_CLIENT = ('server-to-client', 'answer') |
||||
_TRAILING_METADATA = ('a-trailing-metadata', 'stack-trace') |
||||
_INITIAL_METADATA_FOR_GENERIC_HANDLER = ('a-must-have-key', 'secret') |
||||
|
||||
|
||||
def _seen_metadata(expected, actual): |
||||
for key, value in actual: |
||||
if key == expected[0] and value == expected[1]: |
||||
return True |
||||
return False |
||||
|
||||
|
||||
class _TestGenericHandlerForMethods(grpc.GenericRpcHandler): |
||||
|
||||
@staticmethod |
||||
async def _test_client_to_server(request, context): |
||||
assert _REQUEST == request |
||||
assert _seen_metadata(_INITIAL_METADATA_FROM_CLIENT_TO_SERVER, |
||||
context.invocation_metadata()) |
||||
return _RESPONSE |
||||
|
||||
@staticmethod |
||||
async def _test_server_to_client(request, context): |
||||
assert _REQUEST == request |
||||
await context.send_initial_metadata(_INITIAL_METADATA_FROM_SERVER_TO_CLIENT) |
||||
return _RESPONSE |
||||
|
||||
@staticmethod |
||||
async def _test_trailing_metadata(request, context): |
||||
assert _REQUEST == request |
||||
context.set_trailing_metadata(_TRAILING_METADATA) |
||||
return _RESPONSE |
||||
|
||||
def service(self, handler_details): |
||||
if handler_details.method == _TEST_CLIENT_TO_SERVER: |
||||
return grpc.unary_unary_rpc_method_handler(self._test_client_to_server) |
||||
if handler_details.method == _TEST_SERVER_TO_CLIENT: |
||||
return grpc.unary_unary_rpc_method_handler(self._test_server_to_client) |
||||
if handler_details.method == _TEST_TRAILING_METADATA: |
||||
return grpc.unary_unary_rpc_method_handler(self._test_trailing_metadata) |
||||
return None |
||||
|
||||
|
||||
class _TestGenericHandlerItself(grpc.GenericRpcHandler): |
||||
async def _method(self, request, unused_context): |
||||
assert _REQUEST == request |
||||
return _RESPONSE |
||||
|
||||
def service(self, handler_details): |
||||
assert _seen_metadata(_INITIAL_METADATA_FOR_GENERIC_HANDLER, handler_details.invocation_metadata()) |
||||
return |
||||
|
||||
|
||||
async def _start_test_server(): |
||||
server = aio.server() |
||||
port = server.add_secure_port('[::]:0', grpc.local_server_credentials()) |
||||
server.add_generic_rpc_handlers(( |
||||
_TestGenericHandlerForMethods(), |
||||
_TestGenericHandlerItself(), |
||||
)) |
||||
await server.start() |
||||
return 'localhost:%d' % port, server |
||||
|
||||
|
||||
class TestMetadata(AioTestBase): |
||||
|
||||
async def setUp(self): |
||||
address, self._server = await _start_test_server() |
||||
self._client = aio.secure_channel(address, grpc.local_channel_credentials()) |
||||
|
||||
async def tearDown(self): |
||||
await self._client.close() |
||||
await self._server.stop(None) |
||||
|
||||
async def test_from_client_to_server(self): |
||||
multicallable = self._client.unary_unary(_TEST_CLIENT_TO_SERVER) |
||||
call = multicallable(_REQUEST, metadata=_INITIAL_METADATA_FROM_CLIENT_TO_SERVER) |
||||
self.assertEqual(_RESPONSE, await call) |
||||
self.assertEqual(grpc.StatusCode.OK, await call.code()) |
||||
|
||||
async def test_from_server_to_client(self): |
||||
multicallable = self._client.unary_unary(_TEST_SERVER_TO_CLIENT) |
||||
call = multicallable(_REQUEST) |
||||
self.assertEqual(_INITIAL_METADATA_FROM_SERVER_TO_CLIENT, |
||||
await call.initial_metadata) |
||||
self.assertEqual(_RESPONSE, await call) |
||||
self.assertEqual(grpc.StatusCode.OK, await call.code()) |
||||
|
||||
async def test_trailing_metadata(self): |
||||
multicallable = self._client.unary_unary(_TEST_SERVER_TO_CLIENT) |
||||
call = multicallable(_REQUEST) |
||||
self.assertEqual(_TEST_TRAILING_METADATA, |
||||
await call.trailing_metadata) |
||||
self.assertEqual(_RESPONSE, await call) |
||||
self.assertEqual(grpc.StatusCode.OK, await call.code()) |
||||
|
||||
|
||||
async def test_binary_metadata(self): pass |
||||
async def test_invalid_metadata(self): pass |
||||
async def test_generic_handler(self): |
||||
multicallable = self._client.unary_unary(_TEST_GENERIC_HANDLER) |
||||
call = multicallable(_REQUEST, metadata=_INITIAL_METADATA_FOR_GENERIC_HANDLER) |
||||
self.assertEqual(_RESPONSE, await call) |
||||
self.assertEqual(grpc.StatusCode.OK, await call.code()) |
||||
|
||||
|
||||
if __name__ == '__main__': |
||||
logging.basicConfig(level=logging.DEBUG) |
||||
unittest.main(verbosity=2) |
Loading…
Reference in new issue