blob: ada7e54c82f44cb08963fbaf89ebd283daf38218 [file] [log] [blame]
Zsolt Harasztibae12752016-10-10 09:55:30 -07001#
2# Copyright 2016 the original author or authors.
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16from unittest import TestCase
17
18from chameleon.protoc_plugins.descriptor_parser import DescriptorParser
19from tests.utests.chameleon.protoc_plugins.test_utils import \
20 generate_plugin_request, json_rt
21from tests.utests.chameleon.protoc_plugins.test_utils import unindent
22
23
24class DescriptorParserTests(TestCase):
25
26 maxDiff = 10000
27
28 def test_empty(self):
29
30 proto = unindent("""
31 syntax = "proto3";
32 package test;
33 """)
34
35 expected = dict(
36 syntax='proto3',
37 name='test.proto',
38 package='test',
39 source_code_info=dict(
40 location=[
41 dict(span=[1, 0, 2, 13]),
42 dict(span=[1, 0, 18], path=[12]),
43 dict(span=[2, 8, 12], path=[2])
44 ]
45 )
46 )
47
48 request = generate_plugin_request(proto)
49 assert len(request.proto_file) == 1
50 parser = DescriptorParser()
51 native_data = parser.parse_file_descriptor(request.proto_file[0])
52 self.assertEqual(native_data, expected)
53
54 def test_message_with_comment_folding(self):
55
56 proto = unindent("""
57 syntax = "proto3";
58 package test;
59
60 // Sample message
61 message SampleMessage {
62 string name = 1; // inline comment
63
64 // prefix comment
65 repeated int32 number = 2;
66
67 bool bool = 3;
68 // suffix comment
69 }
70 """)
71
72 expected = {
73 u'syntax': u'proto3',
74 u'name': u'test.proto',
75 u'package': u'test',
76 u'message_type': [
77 {
78 u'_description': u'Sample message',
79 u'name': u'SampleMessage',
80 u'field': [{
81 u'_description': u'inline comment',
82 u'json_name': u'name',
83 u'name': u'name',
84 u'label': 1,
85 u'number': 1,
86 u'type': 9
87 }, {
88 u'_description': u'prefix comment',
89 u'json_name': u'number',
90 u'name': u'number',
91 u'label': 3,
92 u'number': 2,
93 u'type': 5
94 }, {
95 u'_description': u'suffix comment',
96 u'json_name': u'bool',
97 u'name': u'bool',
98 u'label': 1,
99 u'number': 3,
100 u'type': 8
101 }],
102 }
103 ]
104 }
105
106 request = generate_plugin_request(proto)
107 assert len(request.proto_file) == 1
108 parser = DescriptorParser()
109 native_data = parser.parse_file_descriptor(request.proto_file[0],
110 fold_comments=True)
111 self.assertEqual(json_rt(native_data), expected)
112
113 def test_message_with_comment_folding_and_type_marking(self):
114
115 proto = unindent("""
116 syntax = "proto3";
117 package test;
118
119 // Sample message
120 message SampleMessage {
121 string name = 1; // inline comment
122
123 // prefix comment
124 repeated int32 number = 2;
125
126 bool bool = 3;
127 // suffix comment
128 }
129 """)
130
131 expected = {
132 u'syntax': u'proto3',
133 u'name': u'test.proto',
134 u'package': u'test',
135 u'_type': u'google.protobuf.FileDescriptorProto',
136 u'message_type': [
137 {
138 u'_type': u'google.protobuf.DescriptorProto',
139 u'_description': u'Sample message',
140 u'name': u'SampleMessage',
141 u'field': [{
142 u'_type': u'google.protobuf.FieldDescriptorProto',
143 u'_description': u'inline comment',
144 u'json_name': u'name',
145 u'name': u'name',
146 u'label': 1,
147 u'number': 1,
148 u'type': 9
149 }, {
150 u'_type': u'google.protobuf.FieldDescriptorProto',
151 u'_description': u'prefix comment',
152 u'json_name': u'number',
153 u'name': u'number',
154 u'label': 3,
155 u'number': 2,
156 u'type': 5
157 }, {
158 u'_type': u'google.protobuf.FieldDescriptorProto',
159 u'_description': u'suffix comment',
160 u'json_name': u'bool',
161 u'name': u'bool',
162 u'label': 1,
163 u'number': 3,
164 u'type': 8
165 }],
166 }
167 ]
168 }
169
170 request = generate_plugin_request(proto)
171 assert len(request.proto_file) == 1
172 parser = DescriptorParser()
173 native_data = parser.parse_file_descriptor(request.proto_file[0],
174 type_tag_name='_type',
175 fold_comments=True)
176 self.assertEqual(json_rt(native_data), expected)
177
178 def test_http_annotations_carry_over(self):
179
180 proto = unindent("""
181 syntax = "proto3";
182 package test;
183 import "google/api/annotations.proto";
184 message Null {}
185 service Test {
186 rpc Call(Null) returns(Null) {
187 option (google.api.http) = {
188 get: "/some/path"
189 };
190 }
191 }
192 """)
193
194 expected = {
195 u'syntax': u'proto3',
196 u'name': u'test.proto',
197 u'package': u'test',
198 u'dependency': [u'google/api/annotations.proto'],
199 u'message_type': [{u'name': u'Null'}],
200 u'service': [{
201 u'name': u'Test',
202 u'method': [{
203 u'name': u'Call',
204 u'input_type': u'.test.Null',
205 u'output_type': u'.test.Null',
206 u'options': {
207 u'http': {
208 u'get': u'/some/path'
209 }
210 }
211 }]
212 }]
213 }
214
215 request = generate_plugin_request(proto)
216 assert len(request.proto_file) == 4
217 parser = DescriptorParser()
218 native_data = parser.parse_file_descriptor(request.proto_file[3],
219 fold_comments=True)
220 self.assertEqual(json_rt(native_data), expected)
221
222 def test_http_annotations_carryover_and_all_components(self):
223
224 proto = unindent("""
225 syntax = "proto3";
226 package test;
227 import "google/api/annotations.proto";
228 message Null {}
229 service Test {
230 rpc Call(Null) returns(Null) {
231 option (google.api.http) = {
232 get: "/some/path"
233 };
234 }
235 }
236 """)
237
238 expected = {
239 u'syntax': 'proto3',
240 u'name': u'test.proto',
241 u'package': u'test',
242 u'dependency': [u'google/api/annotations.proto'],
243 u'message_type': [{u'name': u'Null'}],
244 u'service': [{
245 u'name': u'Test',
246 u'method': [{
247 u'name': u'Call',
248 u'input_type': u'.test.Null',
249 u'output_type': u'.test.Null',
250 u'options': {
251 u'http': {
252 u'get': u'/some/path'
253 }
254 }
255 }]
256 }]
257 }
258
259 request = generate_plugin_request(proto)
260 assert len(request.proto_file) == 4
261 parser = DescriptorParser()
262 native_data = parser.parse_file_descriptors(request.proto_file,
263 fold_comments=True)
264 self.assertEqual([d['name'] for d in native_data], [
265 u'google/api/http.proto',
266 u'google/protobuf/descriptor.proto',
267 u'google/api/annotations.proto',
268 u'test.proto'
269 ])
270 self.assertEqual(json_rt(native_data[3]), expected)