OLD | NEW |
| (Empty) |
1 // Protocol Buffers - Google's data interchange format | |
2 // Copyright 2008 Google Inc. All rights reserved. | |
3 // http://code.google.com/p/protobuf/ | |
4 // | |
5 // Redistribution and use in source and binary forms, with or without | |
6 // modification, are permitted provided that the following conditions are | |
7 // met: | |
8 // | |
9 // * Redistributions of source code must retain the above copyright | |
10 // notice, this list of conditions and the following disclaimer. | |
11 // * Redistributions in binary form must reproduce the above | |
12 // copyright notice, this list of conditions and the following disclaimer | |
13 // in the documentation and/or other materials provided with the | |
14 // distribution. | |
15 // * Neither the name of Google Inc. nor the names of its | |
16 // contributors may be used to endorse or promote products derived from | |
17 // this software without specific prior written permission. | |
18 // | |
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
30 | |
31 package com.google.protobuf.test; | |
32 import com.google.protobuf.*; | |
33 | |
34 import com.google.protobuf.DescriptorProtos.DescriptorProto; | |
35 import com.google.protobuf.DescriptorProtos.EnumDescriptorProto; | |
36 import com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto; | |
37 import com.google.protobuf.DescriptorProtos.FieldDescriptorProto; | |
38 import com.google.protobuf.DescriptorProtos.FileDescriptorProto; | |
39 import com.google.protobuf.Descriptors.DescriptorValidationException; | |
40 import com.google.protobuf.Descriptors.FileDescriptor; | |
41 import com.google.protobuf.Descriptors.Descriptor; | |
42 import com.google.protobuf.Descriptors.FieldDescriptor; | |
43 import com.google.protobuf.Descriptors.EnumDescriptor; | |
44 import com.google.protobuf.Descriptors.EnumValueDescriptor; | |
45 import com.google.protobuf.Descriptors.ServiceDescriptor; | |
46 import com.google.protobuf.Descriptors.MethodDescriptor; | |
47 | |
48 import com.google.protobuf.test.UnittestImport; | |
49 import com.google.protobuf.test.UnittestImport.ImportEnum; | |
50 import com.google.protobuf.test.UnittestImport.ImportMessage; | |
51 import protobuf_unittest.UnittestProto; | |
52 import protobuf_unittest.UnittestProto.ForeignEnum; | |
53 import protobuf_unittest.UnittestProto.ForeignMessage; | |
54 import protobuf_unittest.UnittestProto.TestAllTypes; | |
55 import protobuf_unittest.UnittestProto.TestAllExtensions; | |
56 import protobuf_unittest.UnittestProto.TestExtremeDefaultValues; | |
57 import protobuf_unittest.UnittestProto.TestRequired; | |
58 import protobuf_unittest.UnittestProto.TestService; | |
59 import protobuf_unittest.UnittestCustomOptions; | |
60 | |
61 | |
62 import junit.framework.TestCase; | |
63 | |
64 import java.util.Arrays; | |
65 import java.util.Collections; | |
66 import java.util.List; | |
67 | |
68 /** | |
69 * Unit test for {@link Descriptors}. | |
70 * | |
71 * @author kenton@google.com Kenton Varda | |
72 */ | |
73 public class DescriptorsTest extends TestCase { | |
74 | |
75 // Regression test for bug where referencing a FieldDescriptor.Type value | |
76 // before a FieldDescriptorProto.Type value would yield a | |
77 // ExceptionInInitializerError. | |
78 @SuppressWarnings("unused") | |
79 private static final Object STATIC_INIT_TEST = FieldDescriptor.Type.BOOL; | |
80 | |
81 public void testFieldTypeEnumMapping() throws Exception { | |
82 assertEquals(FieldDescriptor.Type.values().length, | |
83 FieldDescriptorProto.Type.values().length); | |
84 for (FieldDescriptor.Type type : FieldDescriptor.Type.values()) { | |
85 FieldDescriptorProto.Type protoType = type.toProto(); | |
86 assertEquals("TYPE_" + type.name(), protoType.name()); | |
87 assertEquals(type, FieldDescriptor.Type.valueOf(protoType)); | |
88 } | |
89 } | |
90 | |
91 public void testFileDescriptor() throws Exception { | |
92 FileDescriptor file = UnittestProto.getDescriptor(); | |
93 | |
94 assertEquals("google/protobuf/unittest.proto", file.getName()); | |
95 assertEquals("protobuf_unittest", file.getPackage()); | |
96 | |
97 assertEquals("UnittestProto", file.getOptions().getJavaOuterClassname()); | |
98 assertEquals("google/protobuf/unittest.proto", | |
99 file.toProto().getName()); | |
100 | |
101 assertEquals(Arrays.asList(UnittestImport.getDescriptor()), | |
102 file.getDependencies()); | |
103 | |
104 Descriptor messageType = TestAllTypes.getDescriptor(); | |
105 assertEquals(messageType, file.getMessageTypes().get(0)); | |
106 assertEquals(messageType, file.findMessageTypeByName("TestAllTypes")); | |
107 assertNull(file.findMessageTypeByName("NoSuchType")); | |
108 assertNull(file.findMessageTypeByName("protobuf_unittest.TestAllTypes")); | |
109 for (int i = 0; i < file.getMessageTypes().size(); i++) { | |
110 assertEquals(i, file.getMessageTypes().get(i).getIndex()); | |
111 } | |
112 | |
113 EnumDescriptor enumType = ForeignEnum.getDescriptor(); | |
114 assertEquals(enumType, file.getEnumTypes().get(0)); | |
115 assertEquals(enumType, file.findEnumTypeByName("ForeignEnum")); | |
116 assertNull(file.findEnumTypeByName("NoSuchType")); | |
117 assertNull(file.findEnumTypeByName("protobuf_unittest.ForeignEnum")); | |
118 assertEquals(Arrays.asList(ImportEnum.getDescriptor()), | |
119 UnittestImport.getDescriptor().getEnumTypes()); | |
120 for (int i = 0; i < file.getEnumTypes().size(); i++) { | |
121 assertEquals(i, file.getEnumTypes().get(i).getIndex()); | |
122 } | |
123 | |
124 ServiceDescriptor service = TestService.getDescriptor(); | |
125 assertEquals(service, file.getServices().get(0)); | |
126 assertEquals(service, file.findServiceByName("TestService")); | |
127 assertNull(file.findServiceByName("NoSuchType")); | |
128 assertNull(file.findServiceByName("protobuf_unittest.TestService")); | |
129 assertEquals(Collections.emptyList(), | |
130 UnittestImport.getDescriptor().getServices()); | |
131 for (int i = 0; i < file.getServices().size(); i++) { | |
132 assertEquals(i, file.getServices().get(i).getIndex()); | |
133 } | |
134 | |
135 FieldDescriptor extension = | |
136 UnittestProto.optionalInt32Extension.getDescriptor(); | |
137 assertEquals(extension, file.getExtensions().get(0)); | |
138 assertEquals(extension, | |
139 file.findExtensionByName("optional_int32_extension")); | |
140 assertNull(file.findExtensionByName("no_such_ext")); | |
141 assertNull(file.findExtensionByName( | |
142 "protobuf_unittest.optional_int32_extension")); | |
143 assertEquals(Collections.emptyList(), | |
144 UnittestImport.getDescriptor().getExtensions()); | |
145 for (int i = 0; i < file.getExtensions().size(); i++) { | |
146 assertEquals(i, file.getExtensions().get(i).getIndex()); | |
147 } | |
148 } | |
149 | |
150 public void testDescriptor() throws Exception { | |
151 Descriptor messageType = TestAllTypes.getDescriptor(); | |
152 Descriptor nestedType = TestAllTypes.NestedMessage.getDescriptor(); | |
153 | |
154 assertEquals("TestAllTypes", messageType.getName()); | |
155 assertEquals("protobuf_unittest.TestAllTypes", messageType.getFullName()); | |
156 assertEquals(UnittestProto.getDescriptor(), messageType.getFile()); | |
157 assertNull(messageType.getContainingType()); | |
158 assertEquals(DescriptorProtos.MessageOptions.getDefaultInstance(), | |
159 messageType.getOptions()); | |
160 assertEquals("TestAllTypes", messageType.toProto().getName()); | |
161 | |
162 assertEquals("NestedMessage", nestedType.getName()); | |
163 assertEquals("protobuf_unittest.TestAllTypes.NestedMessage", | |
164 nestedType.getFullName()); | |
165 assertEquals(UnittestProto.getDescriptor(), nestedType.getFile()); | |
166 assertEquals(messageType, nestedType.getContainingType()); | |
167 | |
168 FieldDescriptor field = messageType.getFields().get(0); | |
169 assertEquals("optional_int32", field.getName()); | |
170 assertEquals(field, messageType.findFieldByName("optional_int32")); | |
171 assertNull(messageType.findFieldByName("no_such_field")); | |
172 assertEquals(field, messageType.findFieldByNumber(1)); | |
173 assertNull(messageType.findFieldByNumber(571283)); | |
174 for (int i = 0; i < messageType.getFields().size(); i++) { | |
175 assertEquals(i, messageType.getFields().get(i).getIndex()); | |
176 } | |
177 | |
178 assertEquals(nestedType, messageType.getNestedTypes().get(0)); | |
179 assertEquals(nestedType, messageType.findNestedTypeByName("NestedMessage")); | |
180 assertNull(messageType.findNestedTypeByName("NoSuchType")); | |
181 for (int i = 0; i < messageType.getNestedTypes().size(); i++) { | |
182 assertEquals(i, messageType.getNestedTypes().get(i).getIndex()); | |
183 } | |
184 | |
185 EnumDescriptor enumType = TestAllTypes.NestedEnum.getDescriptor(); | |
186 assertEquals(enumType, messageType.getEnumTypes().get(0)); | |
187 assertEquals(enumType, messageType.findEnumTypeByName("NestedEnum")); | |
188 assertNull(messageType.findEnumTypeByName("NoSuchType")); | |
189 for (int i = 0; i < messageType.getEnumTypes().size(); i++) { | |
190 assertEquals(i, messageType.getEnumTypes().get(i).getIndex()); | |
191 } | |
192 } | |
193 | |
194 public void testFieldDescriptor() throws Exception { | |
195 Descriptor messageType = TestAllTypes.getDescriptor(); | |
196 FieldDescriptor primitiveField = | |
197 messageType.findFieldByName("optional_int32"); | |
198 FieldDescriptor enumField = | |
199 messageType.findFieldByName("optional_nested_enum"); | |
200 FieldDescriptor messageField = | |
201 messageType.findFieldByName("optional_foreign_message"); | |
202 FieldDescriptor cordField = | |
203 messageType.findFieldByName("optional_cord"); | |
204 FieldDescriptor extension = | |
205 UnittestProto.optionalInt32Extension.getDescriptor(); | |
206 FieldDescriptor nestedExtension = TestRequired.single.getDescriptor(); | |
207 | |
208 assertEquals("optional_int32", primitiveField.getName()); | |
209 assertEquals("protobuf_unittest.TestAllTypes.optional_int32", | |
210 primitiveField.getFullName()); | |
211 assertEquals(1, primitiveField.getNumber()); | |
212 assertEquals(messageType, primitiveField.getContainingType()); | |
213 assertEquals(UnittestProto.getDescriptor(), primitiveField.getFile()); | |
214 assertEquals(FieldDescriptor.Type.INT32, primitiveField.getType()); | |
215 assertEquals(FieldDescriptor.JavaType.INT, primitiveField.getJavaType()); | |
216 assertEquals(DescriptorProtos.FieldOptions.getDefaultInstance(), | |
217 primitiveField.getOptions()); | |
218 assertFalse(primitiveField.isExtension()); | |
219 assertEquals("optional_int32", primitiveField.toProto().getName()); | |
220 | |
221 assertEquals("optional_nested_enum", enumField.getName()); | |
222 assertEquals(FieldDescriptor.Type.ENUM, enumField.getType()); | |
223 assertEquals(FieldDescriptor.JavaType.ENUM, enumField.getJavaType()); | |
224 assertEquals(TestAllTypes.NestedEnum.getDescriptor(), | |
225 enumField.getEnumType()); | |
226 | |
227 assertEquals("optional_foreign_message", messageField.getName()); | |
228 assertEquals(FieldDescriptor.Type.MESSAGE, messageField.getType()); | |
229 assertEquals(FieldDescriptor.JavaType.MESSAGE, messageField.getJavaType()); | |
230 assertEquals(ForeignMessage.getDescriptor(), messageField.getMessageType()); | |
231 | |
232 assertEquals("optional_cord", cordField.getName()); | |
233 assertEquals(FieldDescriptor.Type.STRING, cordField.getType()); | |
234 assertEquals(FieldDescriptor.JavaType.STRING, cordField.getJavaType()); | |
235 assertEquals(DescriptorProtos.FieldOptions.CType.CORD, | |
236 cordField.getOptions().getCtype()); | |
237 | |
238 assertEquals("optional_int32_extension", extension.getName()); | |
239 assertEquals("protobuf_unittest.optional_int32_extension", | |
240 extension.getFullName()); | |
241 assertEquals(1, extension.getNumber()); | |
242 assertEquals(TestAllExtensions.getDescriptor(), | |
243 extension.getContainingType()); | |
244 assertEquals(UnittestProto.getDescriptor(), extension.getFile()); | |
245 assertEquals(FieldDescriptor.Type.INT32, extension.getType()); | |
246 assertEquals(FieldDescriptor.JavaType.INT, extension.getJavaType()); | |
247 assertEquals(DescriptorProtos.FieldOptions.getDefaultInstance(), | |
248 extension.getOptions()); | |
249 assertTrue(extension.isExtension()); | |
250 assertEquals(null, extension.getExtensionScope()); | |
251 assertEquals("optional_int32_extension", extension.toProto().getName()); | |
252 | |
253 assertEquals("single", nestedExtension.getName()); | |
254 assertEquals("protobuf_unittest.TestRequired.single", | |
255 nestedExtension.getFullName()); | |
256 assertEquals(TestRequired.getDescriptor(), | |
257 nestedExtension.getExtensionScope()); | |
258 } | |
259 | |
260 public void testFieldDescriptorLabel() throws Exception { | |
261 FieldDescriptor requiredField = | |
262 TestRequired.getDescriptor().findFieldByName("a"); | |
263 FieldDescriptor optionalField = | |
264 TestAllTypes.getDescriptor().findFieldByName("optional_int32"); | |
265 FieldDescriptor repeatedField = | |
266 TestAllTypes.getDescriptor().findFieldByName("repeated_int32"); | |
267 | |
268 assertTrue(requiredField.isRequired()); | |
269 assertFalse(requiredField.isRepeated()); | |
270 assertFalse(optionalField.isRequired()); | |
271 assertFalse(optionalField.isRepeated()); | |
272 assertFalse(repeatedField.isRequired()); | |
273 assertTrue(repeatedField.isRepeated()); | |
274 } | |
275 | |
276 public void testFieldDescriptorDefault() throws Exception { | |
277 Descriptor d = TestAllTypes.getDescriptor(); | |
278 assertFalse(d.findFieldByName("optional_int32").hasDefaultValue()); | |
279 assertEquals(0, d.findFieldByName("optional_int32").getDefaultValue()); | |
280 assertTrue(d.findFieldByName("default_int32").hasDefaultValue()); | |
281 assertEquals(41, d.findFieldByName("default_int32").getDefaultValue()); | |
282 | |
283 d = TestExtremeDefaultValues.getDescriptor(); | |
284 assertEquals( | |
285 ByteString.copyFrom( | |
286 "\0\001\007\b\f\n\r\t\013\\\'\"\u00fe".getBytes("ISO-8859-1")), | |
287 d.findFieldByName("escaped_bytes").getDefaultValue()); | |
288 assertEquals(-1, d.findFieldByName("large_uint32").getDefaultValue()); | |
289 assertEquals(-1L, d.findFieldByName("large_uint64").getDefaultValue()); | |
290 } | |
291 | |
292 public void testEnumDescriptor() throws Exception { | |
293 EnumDescriptor enumType = ForeignEnum.getDescriptor(); | |
294 EnumDescriptor nestedType = TestAllTypes.NestedEnum.getDescriptor(); | |
295 | |
296 assertEquals("ForeignEnum", enumType.getName()); | |
297 assertEquals("protobuf_unittest.ForeignEnum", enumType.getFullName()); | |
298 assertEquals(UnittestProto.getDescriptor(), enumType.getFile()); | |
299 assertNull(enumType.getContainingType()); | |
300 assertEquals(DescriptorProtos.EnumOptions.getDefaultInstance(), | |
301 enumType.getOptions()); | |
302 | |
303 assertEquals("NestedEnum", nestedType.getName()); | |
304 assertEquals("protobuf_unittest.TestAllTypes.NestedEnum", | |
305 nestedType.getFullName()); | |
306 assertEquals(UnittestProto.getDescriptor(), nestedType.getFile()); | |
307 assertEquals(TestAllTypes.getDescriptor(), nestedType.getContainingType()); | |
308 | |
309 EnumValueDescriptor value = ForeignEnum.FOREIGN_FOO.getValueDescriptor(); | |
310 assertEquals(value, enumType.getValues().get(0)); | |
311 assertEquals("FOREIGN_FOO", value.getName()); | |
312 assertEquals(4, value.getNumber()); | |
313 assertEquals(value, enumType.findValueByName("FOREIGN_FOO")); | |
314 assertEquals(value, enumType.findValueByNumber(4)); | |
315 assertNull(enumType.findValueByName("NO_SUCH_VALUE")); | |
316 for (int i = 0; i < enumType.getValues().size(); i++) { | |
317 assertEquals(i, enumType.getValues().get(i).getIndex()); | |
318 } | |
319 } | |
320 | |
321 public void testServiceDescriptor() throws Exception { | |
322 ServiceDescriptor service = TestService.getDescriptor(); | |
323 | |
324 assertEquals("TestService", service.getName()); | |
325 assertEquals("protobuf_unittest.TestService", service.getFullName()); | |
326 assertEquals(UnittestProto.getDescriptor(), service.getFile()); | |
327 | |
328 assertEquals(2, service.getMethods().size()); | |
329 | |
330 MethodDescriptor fooMethod = service.getMethods().get(0); | |
331 assertEquals("Foo", fooMethod.getName()); | |
332 assertEquals(UnittestProto.FooRequest.getDescriptor(), | |
333 fooMethod.getInputType()); | |
334 assertEquals(UnittestProto.FooResponse.getDescriptor(), | |
335 fooMethod.getOutputType()); | |
336 assertEquals(fooMethod, service.findMethodByName("Foo")); | |
337 | |
338 MethodDescriptor barMethod = service.getMethods().get(1); | |
339 assertEquals("Bar", barMethod.getName()); | |
340 assertEquals(UnittestProto.BarRequest.getDescriptor(), | |
341 barMethod.getInputType()); | |
342 assertEquals(UnittestProto.BarResponse.getDescriptor(), | |
343 barMethod.getOutputType()); | |
344 assertEquals(barMethod, service.findMethodByName("Bar")); | |
345 | |
346 assertNull(service.findMethodByName("NoSuchMethod")); | |
347 | |
348 for (int i = 0; i < service.getMethods().size(); i++) { | |
349 assertEquals(i, service.getMethods().get(i).getIndex()); | |
350 } | |
351 } | |
352 | |
353 | |
354 public void testCustomOptions() throws Exception { | |
355 Descriptor descriptor = | |
356 UnittestCustomOptions.TestMessageWithCustomOptions.getDescriptor(); | |
357 | |
358 assertTrue( | |
359 descriptor.getOptions().hasExtension(UnittestCustomOptions.messageOpt1)); | |
360 assertEquals(Integer.valueOf(-56), | |
361 descriptor.getOptions().getExtension(UnittestCustomOptions.messageOpt1)); | |
362 | |
363 FieldDescriptor field = descriptor.findFieldByName("field1"); | |
364 assertNotNull(field); | |
365 | |
366 assertTrue( | |
367 field.getOptions().hasExtension(UnittestCustomOptions.fieldOpt1)); | |
368 assertEquals(Long.valueOf(8765432109L), | |
369 field.getOptions().getExtension(UnittestCustomOptions.fieldOpt1)); | |
370 | |
371 EnumDescriptor enumType = | |
372 UnittestCustomOptions.TestMessageWithCustomOptions.AnEnum.getDescriptor(); | |
373 | |
374 assertTrue( | |
375 enumType.getOptions().hasExtension(UnittestCustomOptions.enumOpt1)); | |
376 assertEquals(Integer.valueOf(-789), | |
377 enumType.getOptions().getExtension(UnittestCustomOptions.enumOpt1)); | |
378 | |
379 ServiceDescriptor service = | |
380 UnittestCustomOptions.TestServiceWithCustomOptions.getDescriptor(); | |
381 | |
382 assertTrue( | |
383 service.getOptions().hasExtension(UnittestCustomOptions.serviceOpt1)); | |
384 assertEquals(Long.valueOf(-9876543210L), | |
385 service.getOptions().getExtension(UnittestCustomOptions.serviceOpt1)); | |
386 | |
387 MethodDescriptor method = service.findMethodByName("Foo"); | |
388 assertNotNull(method); | |
389 | |
390 assertTrue( | |
391 method.getOptions().hasExtension(UnittestCustomOptions.methodOpt1)); | |
392 assertEquals(UnittestCustomOptions.MethodOpt1.METHODOPT1_VAL2, | |
393 method.getOptions().getExtension(UnittestCustomOptions.methodOpt1)); | |
394 } | |
395 | |
396 /** | |
397 * Test that the FieldDescriptor.Type enum is the same as the | |
398 * WireFormat.FieldType enum. | |
399 */ | |
400 public void testFieldTypeTablesMatch() throws Exception { | |
401 FieldDescriptor.Type[] values1 = FieldDescriptor.Type.values(); | |
402 WireFormat.FieldType[] values2 = WireFormat.FieldType.values(); | |
403 | |
404 assertEquals(values1.length, values2.length); | |
405 | |
406 for (int i = 0; i < values1.length; i++) { | |
407 assertEquals(values1[i].toString(), values2[i].toString()); | |
408 } | |
409 } | |
410 | |
411 /** | |
412 * Test that the FieldDescriptor.JavaType enum is the same as the | |
413 * WireFormat.JavaType enum. | |
414 */ | |
415 public void testJavaTypeTablesMatch() throws Exception { | |
416 FieldDescriptor.JavaType[] values1 = FieldDescriptor.JavaType.values(); | |
417 WireFormat.JavaType[] values2 = WireFormat.JavaType.values(); | |
418 | |
419 assertEquals(values1.length, values2.length); | |
420 | |
421 for (int i = 0; i < values1.length; i++) { | |
422 assertEquals(values1[i].toString(), values2[i].toString()); | |
423 } | |
424 } | |
425 | |
426 public void testEnormousDescriptor() throws Exception { | |
427 // The descriptor for this file is larger than 64k, yet it did not cause | |
428 // a compiler error due to an over-long string literal. | |
429 assertTrue( | |
430 UnittestEnormousDescriptor.getDescriptor() | |
431 .toProto().getSerializedSize() > 65536); | |
432 } | |
433 | |
434 /** | |
435 * Tests that the DescriptorValidationException works as intended. | |
436 */ | |
437 public void testDescriptorValidatorException() throws Exception { | |
438 FileDescriptorProto fileDescriptorProto = FileDescriptorProto.newBuilder() | |
439 .setName("foo.proto") | |
440 .addMessageType(DescriptorProto.newBuilder() | |
441 .setName("Foo") | |
442 .addField(FieldDescriptorProto.newBuilder() | |
443 .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL) | |
444 .setType(FieldDescriptorProto.Type.TYPE_INT32) | |
445 .setName("foo") | |
446 .setNumber(1) | |
447 .setDefaultValue("invalid") | |
448 .build()) | |
449 .build()) | |
450 .build(); | |
451 try { | |
452 Descriptors.FileDescriptor.buildFrom(fileDescriptorProto, | |
453 new FileDescriptor[0]); | |
454 fail("DescriptorValidationException expected"); | |
455 } catch (DescriptorValidationException e) { | |
456 // Expected; check that the error message contains some useful hints | |
457 assertTrue(e.getMessage().indexOf("foo") != -1); | |
458 assertTrue(e.getMessage().indexOf("Foo") != -1); | |
459 assertTrue(e.getMessage().indexOf("invalid") != -1); | |
460 assertTrue(e.getCause() instanceof NumberFormatException); | |
461 assertTrue(e.getCause().getMessage().indexOf("invalid") != -1); | |
462 } | |
463 } | |
464 | |
465 /** | |
466 * Tests the translate/crosslink for an example where a message field's name | |
467 * and type name are the same. | |
468 */ | |
469 public void testDescriptorComplexCrosslink() throws Exception { | |
470 FileDescriptorProto fileDescriptorProto = FileDescriptorProto.newBuilder() | |
471 .setName("foo.proto") | |
472 .addMessageType(DescriptorProto.newBuilder() | |
473 .setName("Foo") | |
474 .addField(FieldDescriptorProto.newBuilder() | |
475 .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL) | |
476 .setType(FieldDescriptorProto.Type.TYPE_INT32) | |
477 .setName("foo") | |
478 .setNumber(1) | |
479 .build()) | |
480 .build()) | |
481 .addMessageType(DescriptorProto.newBuilder() | |
482 .setName("Bar") | |
483 .addField(FieldDescriptorProto.newBuilder() | |
484 .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL) | |
485 .setTypeName("Foo") | |
486 .setName("Foo") | |
487 .setNumber(1) | |
488 .build()) | |
489 .build()) | |
490 .build(); | |
491 // translate and crosslink | |
492 FileDescriptor file = | |
493 Descriptors.FileDescriptor.buildFrom(fileDescriptorProto, | |
494 new FileDescriptor[0]); | |
495 // verify resulting descriptors | |
496 assertNotNull(file); | |
497 List<Descriptor> msglist = file.getMessageTypes(); | |
498 assertNotNull(msglist); | |
499 assertTrue(msglist.size() == 2); | |
500 boolean barFound = false; | |
501 for (Descriptor desc : msglist) { | |
502 if (desc.getName().equals("Bar")) { | |
503 barFound = true; | |
504 assertNotNull(desc.getFields()); | |
505 List<FieldDescriptor> fieldlist = desc.getFields(); | |
506 assertNotNull(fieldlist); | |
507 assertTrue(fieldlist.size() == 1); | |
508 assertTrue(fieldlist.get(0).getType() == FieldDescriptor.Type.MESSAGE); | |
509 assertTrue(fieldlist.get(0).getMessageType().getName().equals("Foo")); | |
510 } | |
511 } | |
512 assertTrue(barFound); | |
513 } | |
514 | |
515 public void testInvalidPublicDependency() throws Exception { | |
516 FileDescriptorProto fooProto = FileDescriptorProto.newBuilder() | |
517 .setName("foo.proto") .build(); | |
518 FileDescriptorProto barProto = FileDescriptorProto.newBuilder() | |
519 .setName("boo.proto") | |
520 .addDependency("foo.proto") | |
521 .addPublicDependency(1) // Error, should be 0. | |
522 .build(); | |
523 FileDescriptor fooFile = Descriptors.FileDescriptor.buildFrom(fooProto, | |
524 new FileDescriptor[0]); | |
525 try { | |
526 Descriptors.FileDescriptor.buildFrom(barProto, | |
527 new FileDescriptor[] {fooFile}); | |
528 fail("DescriptorValidationException expected"); | |
529 } catch (DescriptorValidationException e) { | |
530 assertTrue( | |
531 e.getMessage().indexOf("Invalid public dependency index.") != -1); | |
532 } | |
533 } | |
534 | |
535 public void testHiddenDependency() throws Exception { | |
536 FileDescriptorProto barProto = FileDescriptorProto.newBuilder() | |
537 .setName("bar.proto") | |
538 .addMessageType(DescriptorProto.newBuilder().setName("Bar")) | |
539 .build(); | |
540 FileDescriptorProto forwardProto = FileDescriptorProto.newBuilder() | |
541 .setName("forward.proto") | |
542 .addDependency("bar.proto") | |
543 .build(); | |
544 FileDescriptorProto fooProto = FileDescriptorProto.newBuilder() | |
545 .setName("foo.proto") | |
546 .addDependency("forward.proto") | |
547 .addMessageType(DescriptorProto.newBuilder() | |
548 .setName("Foo") | |
549 .addField(FieldDescriptorProto.newBuilder() | |
550 .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL) | |
551 .setTypeName("Bar") | |
552 .setName("bar") | |
553 .setNumber(1))) | |
554 .build(); | |
555 FileDescriptor barFile = Descriptors.FileDescriptor.buildFrom( | |
556 barProto, new FileDescriptor[0]); | |
557 FileDescriptor forwardFile = Descriptors.FileDescriptor.buildFrom( | |
558 forwardProto, new FileDescriptor[] {barFile}); | |
559 | |
560 try { | |
561 Descriptors.FileDescriptor.buildFrom( | |
562 fooProto, new FileDescriptor[] {forwardFile}); | |
563 fail("DescriptorValidationException expected"); | |
564 } catch (DescriptorValidationException e) { | |
565 assertTrue(e.getMessage().indexOf("Bar") != -1); | |
566 assertTrue(e.getMessage().indexOf("is not defined") != -1); | |
567 } | |
568 } | |
569 | |
570 public void testPublicDependency() throws Exception { | |
571 FileDescriptorProto barProto = FileDescriptorProto.newBuilder() | |
572 .setName("bar.proto") | |
573 .addMessageType(DescriptorProto.newBuilder().setName("Bar")) | |
574 .build(); | |
575 FileDescriptorProto forwardProto = FileDescriptorProto.newBuilder() | |
576 .setName("forward.proto") | |
577 .addDependency("bar.proto") | |
578 .addPublicDependency(0) | |
579 .build(); | |
580 FileDescriptorProto fooProto = FileDescriptorProto.newBuilder() | |
581 .setName("foo.proto") | |
582 .addDependency("forward.proto") | |
583 .addMessageType(DescriptorProto.newBuilder() | |
584 .setName("Foo") | |
585 .addField(FieldDescriptorProto.newBuilder() | |
586 .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL) | |
587 .setTypeName("Bar") | |
588 .setName("bar") | |
589 .setNumber(1))) | |
590 .build(); | |
591 FileDescriptor barFile = Descriptors.FileDescriptor.buildFrom( | |
592 barProto, new FileDescriptor[0]); | |
593 FileDescriptor forwardFile = Descriptors.FileDescriptor.buildFrom( | |
594 forwardProto, new FileDescriptor[]{barFile}); | |
595 Descriptors.FileDescriptor.buildFrom( | |
596 fooProto, new FileDescriptor[] {forwardFile}); | |
597 } | |
598 | |
599 /** | |
600 * Tests the translate/crosslink for an example with a more complex namespace | |
601 * referencing. | |
602 */ | |
603 public void testComplexNamespacePublicDependency() throws Exception { | |
604 FileDescriptorProto fooProto = FileDescriptorProto.newBuilder() | |
605 .setName("bar.proto") | |
606 .setPackage("a.b.c.d.bar.shared") | |
607 .addEnumType(EnumDescriptorProto.newBuilder() | |
608 .setName("MyEnum") | |
609 .addValue(EnumValueDescriptorProto.newBuilder() | |
610 .setName("BLAH") | |
611 .setNumber(1))) | |
612 .build(); | |
613 FileDescriptorProto barProto = FileDescriptorProto.newBuilder() | |
614 .setName("foo.proto") | |
615 .addDependency("bar.proto") | |
616 .setPackage("a.b.c.d.foo.shared") | |
617 .addMessageType(DescriptorProto.newBuilder() | |
618 .setName("MyMessage") | |
619 .addField(FieldDescriptorProto.newBuilder() | |
620 .setLabel(FieldDescriptorProto.Label.LABEL_REPEATED) | |
621 .setTypeName("bar.shared.MyEnum") | |
622 .setName("MyField") | |
623 .setNumber(1))) | |
624 .build(); | |
625 // translate and crosslink | |
626 FileDescriptor fooFile = Descriptors.FileDescriptor.buildFrom( | |
627 fooProto, new FileDescriptor[0]); | |
628 FileDescriptor barFile = Descriptors.FileDescriptor.buildFrom( | |
629 barProto, new FileDescriptor[]{fooFile}); | |
630 // verify resulting descriptors | |
631 assertNotNull(barFile); | |
632 List<Descriptor> msglist = barFile.getMessageTypes(); | |
633 assertNotNull(msglist); | |
634 assertTrue(msglist.size() == 1); | |
635 Descriptor desc = msglist.get(0); | |
636 if (desc.getName().equals("MyMessage")) { | |
637 assertNotNull(desc.getFields()); | |
638 List<FieldDescriptor> fieldlist = desc.getFields(); | |
639 assertNotNull(fieldlist); | |
640 assertTrue(fieldlist.size() == 1); | |
641 FieldDescriptor field = fieldlist.get(0); | |
642 assertTrue(field.getType() == FieldDescriptor.Type.ENUM); | |
643 assertTrue(field.getEnumType().getName().equals("MyEnum")); | |
644 assertTrue(field.getEnumType().getFile().getName().equals("bar.proto")); | |
645 assertTrue(field.getEnumType().getFile().getPackage().equals( | |
646 "a.b.c.d.bar.shared")); | |
647 } | |
648 } | |
649 } | |
OLD | NEW |