def testFileContainingExtension(self): requests = ( reflection_pb2.ServerReflectionRequest( file_containing_extension=reflection_pb2.ExtensionRequest( containing_type='grpc.testing.proto2.Empty', extension_number=125, ), ), reflection_pb2.ServerReflectionRequest( file_containing_extension=reflection_pb2.ExtensionRequest( containing_type='i.donut.exist.co.uk.org.net.me.name.foo', extension_number=55, ), ), ) responses = tuple(self._stub.ServerReflectionInfo(requests)) expected_responses = ( reflection_pb2.ServerReflectionResponse( valid_host='', file_descriptor_response=reflection_pb2.FileDescriptorResponse( file_descriptor_proto=(_file_descriptor_to_proto( empty_extensions_pb2.DESCRIPTOR), ))), reflection_pb2.ServerReflectionResponse( valid_host='', error_response=reflection_pb2.ErrorResponse( error_code=grpc.StatusCode.NOT_FOUND.value[0], error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), )), ) self.assertEqual(expected_responses, responses)
def _not_found_error(): return reflection_pb2.ServerReflectionResponse( error_response=reflection_pb2.ErrorResponse( error_code=grpc.StatusCode.NOT_FOUND.value[0], error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), ) )
def _file_containing_extension(containing_type, extension_number): # TODO(atash) Python protobuf currently doesn't support querying extensions. # https://github.com/google/protobuf/issues/2248 return reflection_pb2.ServerReflectionResponse( error_response=reflection_pb2.ErrorResponse( error_code=grpc.StatusCode.UNIMPLEMENTED.value[0], error_message=grpc.StatusCode.UNIMPLMENTED.value[1].encode(), ) )
def _file_descriptor_response(descriptor): proto = descriptor_pb2.FileDescriptorProto() descriptor.CopyToProto(proto) serialized_proto = proto.SerializeToString() return reflection_pb2.ServerReflectionResponse( file_descriptor_response=reflection_pb2.FileDescriptorResponse( file_descriptor_proto=(serialized_proto,) ), )
def _list_services(self): return reflection_pb2.ServerReflectionResponse( list_services_response=reflection_pb2.ListServiceResponse( service=[ reflection_pb2.ServiceResponse(name=service_name) for service_name in self._service_names ] ) )
def _extension_numbers_of_type(fully_qualified_name): # TODO(atash) We're allowed to leave this unsupported according to the # protocol, but we should still eventually implement it. Hits the same issue # as `_file_containing_extension`, however. # https://github.com/google/protobuf/issues/2248 return reflection_pb2.ServerReflectionResponse( error_response=reflection_pb2.ErrorResponse( error_code=grpc.StatusCode.UNIMPLEMENTED.value[0], error_message=grpc.StatusCode.UNIMPLMENTED.value[1].encode(), ) )
def testListServices(self): requests = (reflection_pb2.ServerReflectionRequest( list_services='', ), ) responses = tuple(self._stub.ServerReflectionInfo(requests)) expected_responses = (reflection_pb2.ServerReflectionResponse( valid_host='', list_services_response=reflection_pb2.ListServiceResponse( service=tuple( reflection_pb2.ServiceResponse(name=name) for name in _SERVICE_NAMES))), ) self.assertEqual(expected_responses, responses)
def testFileByName(self): requests = ( reflection_pb2.ServerReflectionRequest( file_by_filename=_EMPTY_PROTO_FILE_NAME), reflection_pb2.ServerReflectionRequest( file_by_filename='i-donut-exist'), ) responses = tuple(self._stub.ServerReflectionInfo(requests)) expected_responses = ( reflection_pb2.ServerReflectionResponse( valid_host='', file_descriptor_response=reflection_pb2.FileDescriptorResponse( file_descriptor_proto=( _file_descriptor_to_proto(empty_pb2.DESCRIPTOR), ))), reflection_pb2.ServerReflectionResponse( valid_host='', error_response=reflection_pb2.ErrorResponse( error_code=grpc.StatusCode.NOT_FOUND.value[0], error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), )), ) self.assertEqual(expected_responses, responses)
def testFileBySymbol(self): requests = ( reflection_pb2.ServerReflectionRequest( file_containing_symbol=_EMPTY_PROTO_SYMBOL_NAME), reflection_pb2.ServerReflectionRequest( file_containing_symbol='i.donut.exist.co.uk.org.net.me.name.foo' ), ) responses = tuple(self._stub.ServerReflectionInfo(requests)) expected_responses = ( reflection_pb2.ServerReflectionResponse( valid_host='', file_descriptor_response=reflection_pb2.FileDescriptorResponse( file_descriptor_proto=( _file_descriptor_to_proto(empty_pb2.DESCRIPTOR), ))), reflection_pb2.ServerReflectionResponse( valid_host='', error_response=reflection_pb2.ErrorResponse( error_code=grpc.StatusCode.NOT_FOUND.value[0], error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), )), ) self.assertEqual(expected_responses, responses)
def ServerReflectionInfo(self, request_iterator, context): for request in request_iterator: if request.HasField('file_by_filename'): yield self._file_by_filename(request.file_by_filename) elif request.HasField('file_containing_symbol'): yield self._file_containing_symbol(request.file_containing_symbol) elif request.HasField('file_containing_extension'): yield self._file_containing_extension( request.file_containing_extension.containing_type, request.file_containing_extension.extension_number) elif request.HasField('all_extension_numbers_of_type'): yield _all_extension_numbers_of_type( request.all_extension_numbers_of_type) elif request.HasField('list_services'): yield self._list_services() else: yield reflection_pb2.ServerReflectionResponse( error_response=reflection_pb2.ErrorResponse( error_code=grpc.StatusCode.INVALID_ARGUMENT.value[0], error_message=grpc.StatusCode.INVALID_ARGUMENT.value[1].encode(), ) )