reflection_servicer_test.py
Go to the documentation of this file.
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 """Tests of grpc_reflection.v1alpha.reflection."""
15 
16 import logging
17 import unittest
18 
19 from google.protobuf import descriptor_pb2
20 import grpc
21 from grpc.experimental import aio
22 from grpc_reflection.v1alpha import reflection
23 from grpc_reflection.v1alpha import reflection_pb2
24 from grpc_reflection.v1alpha import reflection_pb2_grpc
25 
26 from src.proto.grpc.testing import empty_pb2
27 from src.proto.grpc.testing.proto2 import empty2_extensions_pb2
28 from tests_aio.unit._test_base import AioTestBase
29 
30 _EMPTY_PROTO_FILE_NAME = 'src/proto/grpc/testing/empty.proto'
31 _EMPTY_PROTO_SYMBOL_NAME = 'grpc.testing.Empty'
32 _SERVICE_NAMES = ('Angstrom', 'Bohr', 'Curie', 'Dyson', 'Einstein', 'Feynman',
33  'Galilei')
34 _EMPTY_EXTENSIONS_SYMBOL_NAME = 'grpc.testing.proto2.EmptyWithExtensions'
35 _EMPTY_EXTENSIONS_NUMBERS = (
36  124,
37  125,
38  126,
39  127,
40  128,
41 )
42 
43 
44 def _file_descriptor_to_proto(descriptor):
45  proto = descriptor_pb2.FileDescriptorProto()
46  descriptor.CopyToProto(proto)
47  return proto.SerializeToString()
48 
49 
51 
52  async def setUp(self):
53  self._server = aio.server()
54  reflection.enable_server_reflection(_SERVICE_NAMES, self._server)
55  port = self._server.add_insecure_port('[::]:0')
56  await self._server.start()
57 
58  self._channel = aio.insecure_channel('localhost:%d' % port)
59  self._stub = reflection_pb2_grpc.ServerReflectionStub(self._channel)
60 
61  async def tearDown(self):
62  await self._server.stop(None)
63  await self._channel.close()
64 
65  async def test_file_by_name(self):
66  requests = (
67  reflection_pb2.ServerReflectionRequest(
68  file_by_filename=_EMPTY_PROTO_FILE_NAME),
69  reflection_pb2.ServerReflectionRequest(
70  file_by_filename='i-donut-exist'),
71  )
72  responses = []
73  async for response in self._stub.ServerReflectionInfo(iter(requests)):
74  responses.append(response)
75  expected_responses = (
76  reflection_pb2.ServerReflectionResponse(
77  valid_host='',
78  file_descriptor_response=reflection_pb2.FileDescriptorResponse(
79  file_descriptor_proto=(
80  _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),))),
81  reflection_pb2.ServerReflectionResponse(
82  valid_host='',
83  error_response=reflection_pb2.ErrorResponse(
84  error_code=grpc.StatusCode.NOT_FOUND.value[0],
85  error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
86  )),
87  )
88  self.assertSequenceEqual(expected_responses, responses)
89 
90  async def test_file_by_symbol(self):
91  requests = (
92  reflection_pb2.ServerReflectionRequest(
93  file_containing_symbol=_EMPTY_PROTO_SYMBOL_NAME),
94  reflection_pb2.ServerReflectionRequest(
95  file_containing_symbol='i.donut.exist.co.uk.org.net.me.name.foo'
96  ),
97  )
98  responses = []
99  async for response in self._stub.ServerReflectionInfo(iter(requests)):
100  responses.append(response)
101  expected_responses = (
102  reflection_pb2.ServerReflectionResponse(
103  valid_host='',
104  file_descriptor_response=reflection_pb2.FileDescriptorResponse(
105  file_descriptor_proto=(
106  _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),))),
107  reflection_pb2.ServerReflectionResponse(
108  valid_host='',
109  error_response=reflection_pb2.ErrorResponse(
110  error_code=grpc.StatusCode.NOT_FOUND.value[0],
111  error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
112  )),
113  )
114  self.assertSequenceEqual(expected_responses, responses)
115 
116  async def test_file_containing_extension(self):
117  requests = (
118  reflection_pb2.ServerReflectionRequest(
119  file_containing_extension=reflection_pb2.ExtensionRequest(
120  containing_type=_EMPTY_EXTENSIONS_SYMBOL_NAME,
121  extension_number=125,
122  ),),
123  reflection_pb2.ServerReflectionRequest(
124  file_containing_extension=reflection_pb2.ExtensionRequest(
125  containing_type='i.donut.exist.co.uk.org.net.me.name.foo',
126  extension_number=55,
127  ),),
128  )
129  responses = []
130  async for response in self._stub.ServerReflectionInfo(iter(requests)):
131  responses.append(response)
132  expected_responses = (
133  reflection_pb2.ServerReflectionResponse(
134  valid_host='',
135  file_descriptor_response=reflection_pb2.FileDescriptorResponse(
136  file_descriptor_proto=(_file_descriptor_to_proto(
137  empty2_extensions_pb2.DESCRIPTOR),))),
138  reflection_pb2.ServerReflectionResponse(
139  valid_host='',
140  error_response=reflection_pb2.ErrorResponse(
141  error_code=grpc.StatusCode.NOT_FOUND.value[0],
142  error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
143  )),
144  )
145  self.assertSequenceEqual(expected_responses, responses)
146 
147  async def test_extension_numbers_of_type(self):
148  requests = (
149  reflection_pb2.ServerReflectionRequest(
150  all_extension_numbers_of_type=_EMPTY_EXTENSIONS_SYMBOL_NAME),
151  reflection_pb2.ServerReflectionRequest(
152  all_extension_numbers_of_type='i.donut.exist.co.uk.net.name.foo'
153  ),
154  )
155  responses = []
156  async for response in self._stub.ServerReflectionInfo(iter(requests)):
157  responses.append(response)
158  expected_responses = (
159  reflection_pb2.ServerReflectionResponse(
160  valid_host='',
161  all_extension_numbers_response=reflection_pb2.
162  ExtensionNumberResponse(
163  base_type_name=_EMPTY_EXTENSIONS_SYMBOL_NAME,
164  extension_number=_EMPTY_EXTENSIONS_NUMBERS)),
165  reflection_pb2.ServerReflectionResponse(
166  valid_host='',
167  error_response=reflection_pb2.ErrorResponse(
168  error_code=grpc.StatusCode.NOT_FOUND.value[0],
169  error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
170  )),
171  )
172  self.assertSequenceEqual(expected_responses, responses)
173 
174  async def test_list_services(self):
175  requests = (reflection_pb2.ServerReflectionRequest(list_services='',),)
176  responses = []
177  async for response in self._stub.ServerReflectionInfo(iter(requests)):
178  responses.append(response)
179  expected_responses = (reflection_pb2.ServerReflectionResponse(
180  valid_host='',
181  list_services_response=reflection_pb2.ListServiceResponse(
182  service=tuple(
183  reflection_pb2.ServiceResponse(name=name)
184  for name in _SERVICE_NAMES))),)
185  self.assertSequenceEqual(expected_responses, responses)
186 
187  def test_reflection_service_name(self):
188  self.assertEqual(reflection.SERVICE_NAME,
189  'grpc.reflection.v1alpha.ServerReflection')
190 
191 
192 if __name__ == '__main__':
193  logging.basicConfig(level=logging.DEBUG)
194  unittest.main(verbosity=2)
tests_aio.reflection.reflection_servicer_test.ReflectionServicerTest._server
_server
Definition: reflection_servicer_test.py:53
tests_aio.unit._test_base
Definition: _test_base.py:1
google::protobuf
Definition: bloaty/third_party/protobuf/benchmarks/util/data_proto2_to_proto3_util.h:12
tests_aio.reflection.reflection_servicer_test.ReflectionServicerTest
Definition: reflection_servicer_test.py:50
grpc._common.encode
def encode(s)
Definition: grpc/_common.py:68
grpc_reflection.v1alpha
Definition: src/python/grpcio_reflection/grpc_reflection/v1alpha/__init__.py:1
tests_aio.reflection.reflection_servicer_test.ReflectionServicerTest._stub
_stub
Definition: reflection_servicer_test.py:59
start
static uint64_t start
Definition: benchmark-pound.c:74
grpc::experimental
Definition: include/grpcpp/channel.h:46
close
#define close
Definition: test-fs.c:48
tests_aio.reflection.reflection_servicer_test.ReflectionServicerTest._channel
_channel
Definition: reflection_servicer_test.py:58
tests_aio.reflection.reflection_servicer_test._file_descriptor_to_proto
def _file_descriptor_to_proto(descriptor)
Definition: reflection_servicer_test.py:44
tests_aio.reflection.reflection_servicer_test.ReflectionServicerTest.setUp
def setUp(self)
Definition: reflection_servicer_test.py:52
stop
static const char stop[]
Definition: benchmark-async-pummel.c:35
iter
Definition: test_winkernel.cpp:47
tests_aio.unit._test_base.AioTestBase
Definition: _test_base.py:49


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:07