blob: 5163ffe738194e571f0c25ffbd323fd1d1d7ee32 [file] [log] [blame]
Masood Malekghassemiaff69362016-09-21 15:10:36 -07001# Copyright 2016, Google Inc.
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are
6# met:
7#
8# * Redistributions of source code must retain the above copyright
9# notice, this list of conditions and the following disclaimer.
10# * Redistributions in binary form must reproduce the above
11# copyright notice, this list of conditions and the following disclaimer
12# in the documentation and/or other materials provided with the
13# distribution.
14# * Neither the name of Google Inc. nor the names of its
15# contributors may be used to endorse or promote products derived from
16# this software without specific prior written permission.
17#
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Masood Malekghassemifb261bf2016-12-12 13:19:31 -080029"""Tests of grpc_reflection.v1alpha.reflection."""
Masood Malekghassemiaff69362016-09-21 15:10:36 -070030
31import unittest
32
33import grpc
34from grpc.framework.foundation import logging_pool
Masood Malekghassemifb261bf2016-12-12 13:19:31 -080035from grpc_reflection.v1alpha import reflection
36from grpc_reflection.v1alpha import reflection_pb2
Nathaniel Manistabb7484c2017-03-17 23:42:39 +000037from grpc_reflection.v1alpha import reflection_pb2_grpc
Masood Malekghassemiaff69362016-09-21 15:10:36 -070038
39from google.protobuf import descriptor_pool
40from google.protobuf import descriptor_pb2
41
Masood Malekghassemiaff69362016-09-21 15:10:36 -070042from src.proto.grpc.testing import empty_pb2
Mehrdad Afsharia0cbe8c2017-03-17 17:15:05 +000043
44from src.proto.grpc.testing.proto2 import empty2_pb2
45from src.proto.grpc.testing.proto2 import empty2_extensions_pb2
46
Masood Malekghassemiaff69362016-09-21 15:10:36 -070047from tests.unit.framework.common import test_constants
48
49_EMPTY_PROTO_FILE_NAME = 'src/proto/grpc/testing/empty.proto'
50_EMPTY_PROTO_SYMBOL_NAME = 'grpc.testing.Empty'
Masood Malekghassemicc793702017-01-13 19:20:10 -080051_SERVICE_NAMES = ('Angstrom', 'Bohr', 'Curie', 'Dyson', 'Einstein', 'Feynman',
52 'Galilei')
Mehrdad Afsharia0cbe8c2017-03-17 17:15:05 +000053_EMPTY_EXTENSIONS_SYMBOL_NAME = 'grpc.testing.proto2.EmptyWithExtensions'
Masood Malekghassemicc793702017-01-13 19:20:10 -080054
Masood Malekghassemiaff69362016-09-21 15:10:36 -070055
56def _file_descriptor_to_proto(descriptor):
Masood Malekghassemicc793702017-01-13 19:20:10 -080057 proto = descriptor_pb2.FileDescriptorProto()
58 descriptor.CopyToProto(proto)
59 return proto.SerializeToString()
60
Masood Malekghassemiaff69362016-09-21 15:10:36 -070061
62class ReflectionServicerTest(unittest.TestCase):
63
Masood Malekghassemicc793702017-01-13 19:20:10 -080064 def setUp(self):
65 servicer = reflection.ReflectionServicer(service_names=_SERVICE_NAMES)
66 server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY)
67 self._server = grpc.server(server_pool)
68 port = self._server.add_insecure_port('[::]:0')
Nathaniel Manistabb7484c2017-03-17 23:42:39 +000069 reflection_pb2_grpc.add_ServerReflectionServicer_to_server(servicer,
70 self._server)
Masood Malekghassemicc793702017-01-13 19:20:10 -080071 self._server.start()
Masood Malekghassemiaff69362016-09-21 15:10:36 -070072
Masood Malekghassemicc793702017-01-13 19:20:10 -080073 channel = grpc.insecure_channel('localhost:%d' % port)
Nathaniel Manistabb7484c2017-03-17 23:42:39 +000074 self._stub = reflection_pb2_grpc.ServerReflectionStub(channel)
Masood Malekghassemiaff69362016-09-21 15:10:36 -070075
Masood Malekghassemicc793702017-01-13 19:20:10 -080076 def testFileByName(self):
Ken Payson2fa5f2f2017-02-06 10:27:09 -080077 requests = (reflection_pb2.ServerReflectionRequest(
78 file_by_filename=_EMPTY_PROTO_FILE_NAME),
79 reflection_pb2.ServerReflectionRequest(
80 file_by_filename='i-donut-exist'),)
Masood Malekghassemicc793702017-01-13 19:20:10 -080081 responses = tuple(self._stub.ServerReflectionInfo(iter(requests)))
82 expected_responses = (
83 reflection_pb2.ServerReflectionResponse(
84 valid_host='',
85 file_descriptor_response=reflection_pb2.FileDescriptorResponse(
86 file_descriptor_proto=(
87 _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),))),
88 reflection_pb2.ServerReflectionResponse(
89 valid_host='',
90 error_response=reflection_pb2.ErrorResponse(
91 error_code=grpc.StatusCode.NOT_FOUND.value[0],
92 error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
93 )),)
94 self.assertSequenceEqual(expected_responses, responses)
Masood Malekghassemiaff69362016-09-21 15:10:36 -070095
Masood Malekghassemicc793702017-01-13 19:20:10 -080096 def testFileBySymbol(self):
Ken Payson2fa5f2f2017-02-06 10:27:09 -080097 requests = (reflection_pb2.ServerReflectionRequest(
98 file_containing_symbol=_EMPTY_PROTO_SYMBOL_NAME
99 ), reflection_pb2.ServerReflectionRequest(
100 file_containing_symbol='i.donut.exist.co.uk.org.net.me.name.foo'),)
Masood Malekghassemicc793702017-01-13 19:20:10 -0800101 responses = tuple(self._stub.ServerReflectionInfo(iter(requests)))
102 expected_responses = (
103 reflection_pb2.ServerReflectionResponse(
104 valid_host='',
105 file_descriptor_response=reflection_pb2.FileDescriptorResponse(
106 file_descriptor_proto=(
107 _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),))),
108 reflection_pb2.ServerReflectionResponse(
109 valid_host='',
110 error_response=reflection_pb2.ErrorResponse(
111 error_code=grpc.StatusCode.NOT_FOUND.value[0],
112 error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
113 )),)
114 self.assertSequenceEqual(expected_responses, responses)
Masood Malekghassemiaff69362016-09-21 15:10:36 -0700115
Masood Malekghassemicc793702017-01-13 19:20:10 -0800116 def testFileContainingExtension(self):
Ken Payson2fa5f2f2017-02-06 10:27:09 -0800117 requests = (reflection_pb2.ServerReflectionRequest(
118 file_containing_extension=reflection_pb2.ExtensionRequest(
Mehrdad Afsharia0cbe8c2017-03-17 17:15:05 +0000119 containing_type=_EMPTY_EXTENSIONS_SYMBOL_NAME,
Ken Payson2fa5f2f2017-02-06 10:27:09 -0800120 extension_number=125,),
121 ), reflection_pb2.ServerReflectionRequest(
122 file_containing_extension=reflection_pb2.ExtensionRequest(
123 containing_type='i.donut.exist.co.uk.org.net.me.name.foo',
124 extension_number=55,),),)
Masood Malekghassemicc793702017-01-13 19:20:10 -0800125 responses = tuple(self._stub.ServerReflectionInfo(iter(requests)))
126 expected_responses = (
127 reflection_pb2.ServerReflectionResponse(
128 valid_host='',
129 file_descriptor_response=reflection_pb2.FileDescriptorResponse(
130 file_descriptor_proto=(_file_descriptor_to_proto(
Mehrdad Afsharia0cbe8c2017-03-17 17:15:05 +0000131 empty2_extensions_pb2.DESCRIPTOR),))),
Masood Malekghassemicc793702017-01-13 19:20:10 -0800132 reflection_pb2.ServerReflectionResponse(
133 valid_host='',
134 error_response=reflection_pb2.ErrorResponse(
135 error_code=grpc.StatusCode.NOT_FOUND.value[0],
136 error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(),
137 )),)
138 self.assertSequenceEqual(expected_responses, responses)
Masood Malekghassemiaff69362016-09-21 15:10:36 -0700139
Masood Malekghassemicc793702017-01-13 19:20:10 -0800140 def testListServices(self):
Ken Payson2fa5f2f2017-02-06 10:27:09 -0800141 requests = (reflection_pb2.ServerReflectionRequest(
142 list_services='',),)
Masood Malekghassemicc793702017-01-13 19:20:10 -0800143 responses = tuple(self._stub.ServerReflectionInfo(iter(requests)))
144 expected_responses = (reflection_pb2.ServerReflectionResponse(
145 valid_host='',
146 list_services_response=reflection_pb2.ListServiceResponse(
147 service=tuple(
148 reflection_pb2.ServiceResponse(name=name)
149 for name in _SERVICE_NAMES))),)
150 self.assertSequenceEqual(expected_responses, responses)
151
Masood Malekghassemiaff69362016-09-21 15:10:36 -0700152
153if __name__ == '__main__':
Masood Malekghassemicc793702017-01-13 19:20:10 -0800154 unittest.main(verbosity=2)