31 """Unittest for google.protobuf.internal.descriptor."""
33 __author__ =
'robinson@google.com (Will Robinson)'
50 TEST_EMPTY_MESSAGE_DESCRIPTOR_ASCII =
"""
51 name: 'TestEmptyMessage'
55 warnings.simplefilter(
'error', DeprecationWarning)
58 class DescriptorTest(unittest.TestCase):
61 file_proto = descriptor_pb2.FileDescriptorProto(
62 name=
'some/filename/some.proto',
63 package=
'protobuf_unittest')
64 message_proto = file_proto.message_type.add(
66 message_proto.field.add(
69 type=descriptor_pb2.FieldDescriptorProto.TYPE_INT32,
70 label=descriptor_pb2.FieldDescriptorProto.LABEL_OPTIONAL)
71 enum_proto = message_proto.enum_type.add(
73 enum_proto.value.add(name=
'FOREIGN_FOO', number=4)
74 enum_proto.value.add(name=
'FOREIGN_BAR', number=5)
75 enum_proto.value.add(name=
'FOREIGN_BAZ', number=6)
77 file_proto.message_type.add(name=
'ResponseMessage')
78 service_proto = file_proto.service.add(
80 method_proto = service_proto.method.add(
82 input_type=
'.protobuf_unittest.NestedMessage',
83 output_type=
'.protobuf_unittest.ResponseMessage')
97 return symbol_database.Default().pool
105 'ForeignEnum'].values_by_number[4].name,
107 with self.assertRaises(KeyError):
109 with self.assertRaises(KeyError):
111 with self.assertRaises(TypeError):
126 descriptor_pb2.EnumOptions())
128 descriptor_pb2.EnumValueOptions())
130 descriptor_pb2.MessageOptions())
132 descriptor_pb2.FieldOptions())
134 descriptor_pb2.MethodOptions())
136 descriptor_pb2.ServiceOptions())
139 file_descriptor = unittest_custom_options_pb2.DESCRIPTOR
140 message_descriptor = (unittest_custom_options_pb2.
141 TestMessageWithCustomOptions.DESCRIPTOR)
142 field_descriptor = message_descriptor.fields_by_name[
'field1']
143 oneof_descriptor = message_descriptor.oneofs_by_name[
'AnOneof']
144 enum_descriptor = message_descriptor.enum_types_by_name[
'AnEnum']
145 enum_value_descriptor = (message_descriptor.
146 enum_values_by_name[
'ANENUM_VAL2'])
147 other_enum_value_descriptor = (message_descriptor.
148 enum_values_by_name[
'ANENUM_VAL1'])
149 service_descriptor = (unittest_custom_options_pb2.
150 TestServiceWithCustomOptions.DESCRIPTOR)
151 method_descriptor = service_descriptor.FindMethodByName(
'Foo')
153 file_options = file_descriptor.GetOptions()
154 file_opt1 = unittest_custom_options_pb2.file_opt1
155 self.assertEqual(9876543210, file_options.Extensions[file_opt1])
156 message_options = message_descriptor.GetOptions()
157 message_opt1 = unittest_custom_options_pb2.message_opt1
158 self.assertEqual(-56, message_options.Extensions[message_opt1])
159 field_options = field_descriptor.GetOptions()
160 field_opt1 = unittest_custom_options_pb2.field_opt1
161 self.assertEqual(8765432109, field_options.Extensions[field_opt1])
162 field_opt2 = unittest_custom_options_pb2.field_opt2
163 self.assertEqual(42, field_options.Extensions[field_opt2])
164 oneof_options = oneof_descriptor.GetOptions()
165 oneof_opt1 = unittest_custom_options_pb2.oneof_opt1
166 self.assertEqual(-99, oneof_options.Extensions[oneof_opt1])
167 enum_options = enum_descriptor.GetOptions()
168 enum_opt1 = unittest_custom_options_pb2.enum_opt1
169 self.assertEqual(-789, enum_options.Extensions[enum_opt1])
170 enum_value_options = enum_value_descriptor.GetOptions()
171 enum_value_opt1 = unittest_custom_options_pb2.enum_value_opt1
172 self.assertEqual(123, enum_value_options.Extensions[enum_value_opt1])
174 service_options = service_descriptor.GetOptions()
175 service_opt1 = unittest_custom_options_pb2.service_opt1
176 self.assertEqual(-9876543210, service_options.Extensions[service_opt1])
177 method_options = method_descriptor.GetOptions()
178 method_opt1 = unittest_custom_options_pb2.method_opt1
179 self.assertEqual(unittest_custom_options_pb2.METHODOPT1_VAL2,
180 method_options.Extensions[method_opt1])
182 message_descriptor = (
183 unittest_custom_options_pb2.DummyMessageContainingEnum.DESCRIPTOR)
184 self.assertTrue(file_descriptor.has_options)
185 self.assertFalse(message_descriptor.has_options)
186 self.assertTrue(field_descriptor.has_options)
187 self.assertTrue(oneof_descriptor.has_options)
188 self.assertTrue(enum_descriptor.has_options)
189 self.assertTrue(enum_value_descriptor.has_options)
190 self.assertFalse(other_enum_value_descriptor.has_options)
193 message_descriptor = (unittest_custom_options_pb2.
194 TestMessageWithCustomOptions.DESCRIPTOR)
195 message_proto = descriptor_pb2.DescriptorProto()
196 message_descriptor.CopyToProto(message_proto)
197 self.assertEqual(
len(message_proto.options.ListFields()),
203 kint32max = 2**31 - 1
204 kint64max = 2**63 - 1
205 kuint32max = 2**32 - 1
206 kuint64max = 2**64 - 1
208 message_descriptor =\
209 unittest_custom_options_pb2.CustomOptionMinIntegerValues.DESCRIPTOR
210 message_options = message_descriptor.GetOptions()
211 self.assertEqual(
False, message_options.Extensions[
212 unittest_custom_options_pb2.bool_opt])
213 self.assertEqual(kint32min, message_options.Extensions[
214 unittest_custom_options_pb2.int32_opt])
215 self.assertEqual(kint64min, message_options.Extensions[
216 unittest_custom_options_pb2.int64_opt])
217 self.assertEqual(0, message_options.Extensions[
218 unittest_custom_options_pb2.uint32_opt])
219 self.assertEqual(0, message_options.Extensions[
220 unittest_custom_options_pb2.uint64_opt])
221 self.assertEqual(kint32min, message_options.Extensions[
222 unittest_custom_options_pb2.sint32_opt])
223 self.assertEqual(kint64min, message_options.Extensions[
224 unittest_custom_options_pb2.sint64_opt])
225 self.assertEqual(0, message_options.Extensions[
226 unittest_custom_options_pb2.fixed32_opt])
227 self.assertEqual(0, message_options.Extensions[
228 unittest_custom_options_pb2.fixed64_opt])
229 self.assertEqual(kint32min, message_options.Extensions[
230 unittest_custom_options_pb2.sfixed32_opt])
231 self.assertEqual(kint64min, message_options.Extensions[
232 unittest_custom_options_pb2.sfixed64_opt])
234 message_descriptor =\
235 unittest_custom_options_pb2.CustomOptionMaxIntegerValues.DESCRIPTOR
236 message_options = message_descriptor.GetOptions()
237 self.assertEqual(
True, message_options.Extensions[
238 unittest_custom_options_pb2.bool_opt])
239 self.assertEqual(kint32max, message_options.Extensions[
240 unittest_custom_options_pb2.int32_opt])
241 self.assertEqual(kint64max, message_options.Extensions[
242 unittest_custom_options_pb2.int64_opt])
243 self.assertEqual(kuint32max, message_options.Extensions[
244 unittest_custom_options_pb2.uint32_opt])
245 self.assertEqual(kuint64max, message_options.Extensions[
246 unittest_custom_options_pb2.uint64_opt])
247 self.assertEqual(kint32max, message_options.Extensions[
248 unittest_custom_options_pb2.sint32_opt])
249 self.assertEqual(kint64max, message_options.Extensions[
250 unittest_custom_options_pb2.sint64_opt])
251 self.assertEqual(kuint32max, message_options.Extensions[
252 unittest_custom_options_pb2.fixed32_opt])
253 self.assertEqual(kuint64max, message_options.Extensions[
254 unittest_custom_options_pb2.fixed64_opt])
255 self.assertEqual(kint32max, message_options.Extensions[
256 unittest_custom_options_pb2.sfixed32_opt])
257 self.assertEqual(kint64max, message_options.Extensions[
258 unittest_custom_options_pb2.sfixed64_opt])
260 message_descriptor =\
261 unittest_custom_options_pb2.CustomOptionOtherValues.DESCRIPTOR
262 message_options = message_descriptor.GetOptions()
263 self.assertEqual(-100, message_options.Extensions[
264 unittest_custom_options_pb2.int32_opt])
265 self.assertAlmostEqual(12.3456789, message_options.Extensions[
266 unittest_custom_options_pb2.float_opt], 6)
267 self.assertAlmostEqual(1.234567890123456789, message_options.Extensions[
268 unittest_custom_options_pb2.double_opt])
269 self.assertEqual(
"Hello, \"World\"", message_options.Extensions[
270 unittest_custom_options_pb2.string_opt])
271 self.assertEqual(b
"Hello\0World", message_options.Extensions[
272 unittest_custom_options_pb2.bytes_opt])
273 dummy_enum = unittest_custom_options_pb2.DummyMessageContainingEnum
275 dummy_enum.TEST_OPTION_ENUM_TYPE2,
276 message_options.Extensions[unittest_custom_options_pb2.enum_opt])
278 message_descriptor =\
279 unittest_custom_options_pb2.SettingRealsFromPositiveInts.DESCRIPTOR
280 message_options = message_descriptor.GetOptions()
281 self.assertAlmostEqual(12, message_options.Extensions[
282 unittest_custom_options_pb2.float_opt], 6)
283 self.assertAlmostEqual(154, message_options.Extensions[
284 unittest_custom_options_pb2.double_opt])
286 message_descriptor =\
287 unittest_custom_options_pb2.SettingRealsFromNegativeInts.DESCRIPTOR
288 message_options = message_descriptor.GetOptions()
289 self.assertAlmostEqual(-12, message_options.Extensions[
290 unittest_custom_options_pb2.float_opt], 6)
291 self.assertAlmostEqual(-154, message_options.Extensions[
292 unittest_custom_options_pb2.double_opt])
296 unittest_custom_options_pb2.VariousComplexOptions.DESCRIPTOR
297 options = descriptor.GetOptions()
298 self.assertEqual(42, options.Extensions[
299 unittest_custom_options_pb2.complex_opt1].foo)
300 self.assertEqual(324, options.Extensions[
301 unittest_custom_options_pb2.complex_opt1].Extensions[
302 unittest_custom_options_pb2.quux])
303 self.assertEqual(876, options.Extensions[
304 unittest_custom_options_pb2.complex_opt1].Extensions[
305 unittest_custom_options_pb2.corge].qux)
306 self.assertEqual(987, options.Extensions[
307 unittest_custom_options_pb2.complex_opt2].baz)
308 self.assertEqual(654, options.Extensions[
309 unittest_custom_options_pb2.complex_opt2].Extensions[
310 unittest_custom_options_pb2.grault])
311 self.assertEqual(743, options.Extensions[
312 unittest_custom_options_pb2.complex_opt2].bar.foo)
313 self.assertEqual(1999, options.Extensions[
314 unittest_custom_options_pb2.complex_opt2].bar.Extensions[
315 unittest_custom_options_pb2.quux])
316 self.assertEqual(2008, options.Extensions[
317 unittest_custom_options_pb2.complex_opt2].bar.Extensions[
318 unittest_custom_options_pb2.corge].qux)
319 self.assertEqual(741, options.Extensions[
320 unittest_custom_options_pb2.complex_opt2].Extensions[
321 unittest_custom_options_pb2.garply].foo)
322 self.assertEqual(1998, options.Extensions[
323 unittest_custom_options_pb2.complex_opt2].Extensions[
324 unittest_custom_options_pb2.garply].Extensions[
325 unittest_custom_options_pb2.quux])
326 self.assertEqual(2121, options.Extensions[
327 unittest_custom_options_pb2.complex_opt2].Extensions[
328 unittest_custom_options_pb2.garply].Extensions[
329 unittest_custom_options_pb2.corge].qux)
330 self.assertEqual(1971, options.Extensions[
331 unittest_custom_options_pb2.ComplexOptionType2
332 .ComplexOptionType4.complex_opt4].waldo)
333 self.assertEqual(321, options.Extensions[
334 unittest_custom_options_pb2.complex_opt2].fred.waldo)
335 self.assertEqual(9, options.Extensions[
336 unittest_custom_options_pb2.complex_opt3].qux)
337 self.assertEqual(22, options.Extensions[
338 unittest_custom_options_pb2.complex_opt3].complexoptiontype5.plugh)
339 self.assertEqual(24, options.Extensions[
340 unittest_custom_options_pb2.complexopt6].xyzzy)
345 file_descriptor = unittest_custom_options_pb2.DESCRIPTOR
346 message_descriptor =\
347 unittest_custom_options_pb2.AggregateMessage.DESCRIPTOR
348 field_descriptor = message_descriptor.fields_by_name[
"fieldname"]
349 enum_descriptor = unittest_custom_options_pb2.AggregateEnum.DESCRIPTOR
350 enum_value_descriptor = enum_descriptor.values_by_name[
"VALUE"]
351 service_descriptor =\
352 unittest_custom_options_pb2.AggregateService.DESCRIPTOR
353 method_descriptor = service_descriptor.FindMethodByName(
"Method")
356 file_options = file_descriptor.GetOptions().Extensions[
357 unittest_custom_options_pb2.fileopt]
358 self.assertEqual(100, file_options.i)
359 self.assertEqual(
"FileAnnotation", file_options.s)
360 self.assertEqual(
"NestedFileAnnotation", file_options.sub.s)
361 self.assertEqual(
"FileExtensionAnnotation", file_options.file.Extensions[
362 unittest_custom_options_pb2.fileopt].s)
363 self.assertEqual(
"EmbeddedMessageSetElement", file_options.mset.Extensions[
364 unittest_custom_options_pb2.AggregateMessageSetElement
365 .message_set_extension].s)
370 message_descriptor.GetOptions().Extensions[
371 unittest_custom_options_pb2.msgopt].s)
374 field_descriptor.GetOptions().Extensions[
375 unittest_custom_options_pb2.fieldopt].s)
378 enum_descriptor.GetOptions().Extensions[
379 unittest_custom_options_pb2.enumopt].s)
381 "EnumValueAnnotation",
382 enum_value_descriptor.GetOptions().Extensions[
383 unittest_custom_options_pb2.enumvalopt].s)
386 service_descriptor.GetOptions().Extensions[
387 unittest_custom_options_pb2.serviceopt].s)
390 method_descriptor.GetOptions().Extensions[
391 unittest_custom_options_pb2.methodopt].s)
395 unittest_custom_options_pb2.NestedOptionType.NestedMessage.DESCRIPTOR
396 self.assertEqual(1001, nested_message.GetOptions().Extensions[
397 unittest_custom_options_pb2.message_opt1])
398 nested_field = nested_message.fields_by_name[
"nested_field"]
399 self.assertEqual(1002, nested_field.GetOptions().Extensions[
400 unittest_custom_options_pb2.field_opt1])
402 unittest_custom_options_pb2.NestedOptionType.DESCRIPTOR
403 nested_enum = outer_message.enum_types_by_name[
"NestedEnum"]
404 self.assertEqual(1003, nested_enum.GetOptions().Extensions[
405 unittest_custom_options_pb2.enum_opt1])
406 nested_enum_value = outer_message.enum_values_by_name[
"NESTED_ENUM_VALUE"]
407 self.assertEqual(1004, nested_enum_value.GetOptions().Extensions[
408 unittest_custom_options_pb2.enum_value_opt1])
409 nested_extension = outer_message.extensions_by_name[
"nested_extension"]
410 self.assertEqual(1005, nested_extension.GetOptions().Extensions[
411 unittest_custom_options_pb2.field_opt2])
418 self.assertEqual(self.
my_file.name,
'some/filename/some.proto')
419 self.assertEqual(self.
my_file.package,
'protobuf_unittest')
421 self.assertFalse(self.
my_file.has_options)
422 self.assertEqual(
'proto2', self.
my_file.syntax)
423 file_proto = descriptor_pb2.FileDescriptorProto()
425 self.assertEqual(self.
my_file.serialized_pb,
426 file_proto.SerializeToString())
428 self.assertEqual(unittest_pb2.DESCRIPTOR.pool, descriptor_pool.Default())
431 api_implementation.Type() !=
'cpp' or api_implementation.Version() != 2,
432 'Immutability of descriptors is only enforced in v2 implementation')
434 file_descriptor = unittest_pb2.DESCRIPTOR
435 message_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
436 field_descriptor = message_descriptor.fields_by_name[
'optional_int32']
437 enum_descriptor = message_descriptor.enum_types_by_name[
'NestedEnum']
438 oneof_descriptor = message_descriptor.oneofs_by_name[
'oneof_field']
439 with self.assertRaises(AttributeError):
440 message_descriptor.fields_by_name =
None
441 with self.assertRaises(TypeError):
442 message_descriptor.fields_by_name[
'Another'] =
None
443 with self.assertRaises(TypeError):
444 message_descriptor.fields.append(
None)
445 with self.assertRaises(AttributeError):
446 field_descriptor.containing_type = message_descriptor
447 with self.assertRaises(AttributeError):
448 file_descriptor.has_options =
False
449 with self.assertRaises(AttributeError):
450 field_descriptor.has_options =
False
451 with self.assertRaises(AttributeError):
452 oneof_descriptor.has_options =
False
453 with self.assertRaises(AttributeError):
454 enum_descriptor.has_options =
False
455 with self.assertRaises(AttributeError)
as e:
456 message_descriptor.has_options =
True
457 self.assertEqual(
'attribute is not writable: has_options',
461 message_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
462 field = message_descriptor.fields_by_name[
'repeated_int32']
463 self.assertEqual(field.default_value, [])
464 field = message_descriptor.fields_by_name[
'repeated_nested_message']
465 self.assertEqual(field.default_value, [])
466 field = message_descriptor.fields_by_name[
'optionalgroup']
467 self.assertEqual(field.default_value,
None)
468 field = message_descriptor.fields_by_name[
'optional_nested_message']
469 self.assertEqual(field.default_value,
None)
473 """Redo the same tests as above, but with a separate DescriptorPool."""
480 """Tests for the properties of descriptors in generated code."""
484 self.assertEqual(message_descriptor.name,
'TestAllTypes')
485 self.assertEqual(message_descriptor.full_name,
486 'protobuf_unittest.TestAllTypes')
488 self.assertEqual(message_descriptor, message_descriptor)
489 self.assertEqual(message_descriptor.fields[0].containing_type,
491 self.assertIn(message_descriptor, [message_descriptor])
492 self.assertIn(message_descriptor, {message_descriptor:
None})
503 self.assertEqual(message_descriptor.extension_ranges, [])
507 self.assertEqual(field_descriptor.name,
'optional_int32')
508 self.assertEqual(field_descriptor.camelcase_name,
'optionalInt32')
509 self.assertEqual(field_descriptor.full_name,
510 'protobuf_unittest.TestAllTypes.optional_int32')
511 self.assertEqual(field_descriptor.containing_type.name,
'TestAllTypes')
512 self.assertEqual(field_descriptor.file, unittest_pb2.DESCRIPTOR)
514 self.assertEqual(field_descriptor, field_descriptor)
516 field_descriptor.containing_type.fields_by_name[
'optional_int32'],
519 field_descriptor.containing_type.fields_by_camelcase_name[
522 self.assertIn(field_descriptor, [field_descriptor])
523 self.assertIn(field_descriptor, {field_descriptor:
None})
524 self.assertEqual(
None, field_descriptor.extension_scope)
525 self.assertEqual(
None, field_descriptor.enum_type)
526 if api_implementation.Type() ==
'cpp':
528 self.assertEqual(field_descriptor.id, field_descriptor.id)
533 self.assertNotEqual(sequence,
534 unittest_pb2.TestAllExtensions.DESCRIPTOR.fields)
535 self.assertNotEqual(sequence, [])
536 self.assertNotEqual(sequence, 1)
537 self.assertFalse(sequence == 1)
538 self.assertEqual(sequence, sequence)
539 expected_list = list(sequence)
540 self.assertEqual(expected_list, sequence)
541 self.assertGreater(
len(sequence), 0)
542 self.assertEqual(
len(sequence),
len(expected_list))
543 self.assertEqual(sequence[
len(sequence) -1], sequence[-1])
545 self.assertEqual(item, sequence[0])
546 self.assertIn(item, sequence)
547 self.assertEqual(sequence.index(item), 0)
548 self.assertEqual(sequence.count(item), 1)
549 other_item = unittest_pb2.NestedTestAllTypes.DESCRIPTOR.fields[0]
550 self.assertNotIn(other_item, sequence)
551 self.assertEqual(sequence.count(other_item), 0)
552 self.assertRaises(ValueError, sequence.index, other_item)
553 self.assertRaises(ValueError, sequence.index, [])
554 reversed_iterator =
reversed(sequence)
555 self.assertEqual(list(reversed_iterator), list(sequence)[::-1])
556 self.assertRaises(StopIteration, next, reversed_iterator)
557 expected_list[0] =
'change value'
558 self.assertNotEqual(expected_list, sequence)
560 if api_implementation.Type() ==
'python':
561 self.assertEqual(
str(list(sequence)),
str(sequence))
563 self.assertEqual(
str(sequence)[0],
'<')
569 mapping, unittest_pb2.TestAllExtensions.DESCRIPTOR.fields_by_name)
570 self.assertNotEqual(mapping, {})
571 self.assertNotEqual(mapping, 1)
572 self.assertFalse(mapping == 1)
573 excepted_dict = dict(mapping.items())
574 self.assertEqual(mapping, excepted_dict)
575 self.assertEqual(mapping, mapping)
576 self.assertGreater(
len(mapping), 0)
577 self.assertEqual(
len(mapping),
len(excepted_dict))
578 key, item =
next(
iter(mapping.items()))
579 self.assertIn(key, mapping)
580 self.assertEqual(mapping.get(key), item)
581 with self.assertRaises(TypeError):
584 if api_implementation.Type() ==
'python':
585 self.assertRaises(TypeError, mapping.get, [])
587 self.assertEqual(
None, mapping.get([]))
590 self.assertEqual(item,
next(
iter(mapping.items())))
591 excepted_dict[key] =
'change value'
592 self.assertNotEqual(mapping, excepted_dict)
593 del excepted_dict[key]
594 excepted_dict[
'new_key'] =
'new'
595 self.assertNotEqual(mapping, excepted_dict)
596 self.assertRaises(KeyError, mapping.__getitem__,
'key_error')
597 self.assertRaises(KeyError, mapping.__getitem__,
len(mapping) + 1)
599 if api_implementation.Type() ==
'python':
600 self.assertEqual(
len(
str(dict(mapping.items()))),
len(
str(mapping)))
602 self.assertEqual(
str(mapping)[0],
'<')
605 message_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
607 field_descriptor = message_descriptor.fields_by_name[
'optional_int32']
609 field_descriptor = message_descriptor.fields_by_camelcase_name[
612 enum_descriptor = unittest_pb2.DESCRIPTOR.enum_types_by_name[
614 self.assertEqual(
None, enum_descriptor.containing_type)
617 unittest_pb2.TestAllExtensions.DESCRIPTOR.extension_ranges,
620 unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR.extension_ranges,
621 [(42, 43), (4143, 4244), (65536, 536870912)])
624 containing_file = unittest_pb2.DESCRIPTOR
631 unittest_pb2.TestNestedExtension.DESCRIPTOR.extensions_by_name)
635 enum = unittest_pb2.TestAllTypes.DESCRIPTOR.enum_types_by_name[
'NestedEnum']
636 values_iter =
iter(enum.values)
638 self.assertEqual(
'FOO',
next(values_iter).name)
641 message_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
642 nested_message_descriptor = unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR
643 self.assertEqual(
len(message_descriptor.nested_types), 3)
644 self.assertFalse(
None in message_descriptor.nested_types)
646 nested_message_descriptor
in message_descriptor.nested_types)
649 service_descriptor = unittest_pb2.DESCRIPTOR.services_by_name[
'TestService']
650 self.assertEqual(service_descriptor.name,
'TestService')
651 self.assertEqual(service_descriptor.methods[0].name,
'Foo')
652 self.assertIs(service_descriptor.file, unittest_pb2.DESCRIPTOR)
653 self.assertEqual(service_descriptor.index, 0)
657 message_descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
658 oneof_descriptor = message_descriptor.oneofs_by_name[
'oneof_field']
659 self.assertFalse(oneof_descriptor.has_options)
660 self.assertEqual(message_descriptor, oneof_descriptor.containing_type)
661 self.assertEqual(
'oneof_field', oneof_descriptor.name)
662 self.assertEqual(
'protobuf_unittest.TestAllTypes.oneof_field',
663 oneof_descriptor.full_name)
664 self.assertEqual(0, oneof_descriptor.index)
668 """Tests for CopyTo functions of Descriptor."""
671 expected_proto = expected_class()
672 text_format.Merge(expected_ascii, expected_proto)
675 actual_proto, expected_proto,
676 'Not equal,\nActual:\n%s\nExpected:\n%s\n'
677 % (
str(actual_proto),
str(expected_proto)))
680 expected_proto_ascii):
681 actual = expected_proto_class()
682 desc.CopyToProto(actual)
684 actual, expected_proto_class, expected_proto_ascii)
688 unittest_pb2.TestEmptyMessage.DESCRIPTOR,
689 descriptor_pb2.DescriptorProto,
690 TEST_EMPTY_MESSAGE_DESCRIPTOR_ASCII)
693 TEST_NESTED_MESSAGE_ASCII =
"""
694 name: 'NestedMessage'
704 unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR,
705 descriptor_pb2.DescriptorProto,
706 TEST_NESTED_MESSAGE_ASCII)
709 TEST_FOREIGN_NESTED_ASCII =
"""
710 name: 'TestForeignNested'
712 name: 'foreign_nested'
715 type: 11 # TYPE_MESSAGE
716 type_name: '.protobuf_unittest.TestAllTypes.NestedMessage'
721 unittest_pb2.TestForeignNested.DESCRIPTOR,
722 descriptor_pb2.DescriptorProto,
723 TEST_FOREIGN_NESTED_ASCII)
726 TEST_FOREIGN_ENUM_ASCII =
"""
743 unittest_pb2.ForeignEnum.DESCRIPTOR,
744 descriptor_pb2.EnumDescriptorProto,
745 TEST_FOREIGN_ENUM_ASCII)
748 TEST_DEPRECATED_FIELDS_ASCII =
"""
749 name: 'TestDeprecatedFields'
751 name: 'deprecated_int32'
760 name: "deprecated_int32_in_oneof"
762 label: LABEL_OPTIONAL
775 unittest_pb2.TestDeprecatedFields.DESCRIPTOR,
776 descriptor_pb2.DescriptorProto,
777 TEST_DEPRECATED_FIELDS_ASCII)
780 TEST_EMPTY_MESSAGE_WITH_EXTENSIONS_ASCII =
"""
781 name: 'TestEmptyMessageWithExtensions'
789 unittest_pb2.TestEmptyMessageWithExtensions.DESCRIPTOR,
790 descriptor_pb2.DescriptorProto,
791 TEST_EMPTY_MESSAGE_WITH_EXTENSIONS_ASCII)
794 TEST_MESSAGE_WITH_SEVERAL_EXTENSIONS_ASCII =
"""
795 name: 'TestMultipleExtensionRanges'
811 unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR,
812 descriptor_pb2.DescriptorProto,
813 TEST_MESSAGE_WITH_SEVERAL_EXTENSIONS_ASCII)
816 UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII = (
"""
817 name: 'google/protobuf/unittest_import.proto'
818 package: 'protobuf_unittest_import'
819 dependency: 'google/protobuf/unittest_import_public.proto'
821 name: 'ImportMessage'
846 name: 'ImportEnumForMap'
861 java_package: 'com.google.protobuf.test'
862 optimize_for: 1 # SPEED
865 cc_enable_arenas: true
870 unittest_import_pb2.DESCRIPTOR,
871 descriptor_pb2.FileDescriptorProto,
872 UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII)
875 TEST_SERVICE_ASCII =
"""
879 input_type: '.protobuf_unittest.FooRequest'
880 output_type: '.protobuf_unittest.FooResponse'
884 input_type: '.protobuf_unittest.BarRequest'
885 output_type: '.protobuf_unittest.BarResponse'
889 unittest_pb2.TestService.DESCRIPTOR,
890 descriptor_pb2.ServiceDescriptorProto,
896 input_type: '.protobuf_unittest.FooRequest'
897 output_type: '.protobuf_unittest.FooResponse'
899 method_descriptor = unittest_pb2.TestService.DESCRIPTOR.FindMethodByName(
903 descriptor_pb2.MethodDescriptorProto,
907 api_implementation.Type() ==
'python',
908 'Pure python does not raise error.')
911 file_proto = descriptor_pb2.FileDescriptorProto()
912 self.assertRaises(TypeError,
913 unittest_pb2.TestEmptyMessage.DESCRIPTOR.CopyToProto,
915 self.assertRaises(TypeError,
916 unittest_pb2.ForeignEnum.DESCRIPTOR.CopyToProto,
918 self.assertRaises(TypeError,
919 unittest_pb2.TestService.DESCRIPTOR.CopyToProto,
921 proto = descriptor_pb2.DescriptorProto()
922 self.assertRaises(TypeError,
923 unittest_import_pb2.DESCRIPTOR.CopyToProto,
930 file_descriptor_proto = descriptor_pb2.FileDescriptorProto()
931 file_descriptor_proto.name =
'Foo2'
932 message_type = file_descriptor_proto.message_type.add()
933 message_type.name = file_descriptor_proto.name
934 nested_type = message_type.nested_type.add()
935 nested_type.name =
'Sub'
936 enum_type = nested_type.enum_type.add()
937 enum_type.name =
'FOO'
938 enum_type_val = enum_type.value.add()
939 enum_type_val.name =
'BAR'
940 enum_type_val.number = 3
941 field = message_type.field.add()
943 field.name =
'uint64_field'
944 field.label = descriptor.FieldDescriptor.LABEL_REQUIRED
945 field.type = descriptor.FieldDescriptor.TYPE_UINT64
946 field = message_type.field.add()
948 field.name =
'nested_message_field'
949 field.label = descriptor.FieldDescriptor.LABEL_REQUIRED
950 field.type = descriptor.FieldDescriptor.TYPE_MESSAGE
951 field.type_name =
'Sub'
952 enum_field = nested_type.field.add()
953 enum_field.number = 2
954 enum_field.name =
'bar_field'
955 enum_field.label = descriptor.FieldDescriptor.LABEL_REQUIRED
956 enum_field.type = descriptor.FieldDescriptor.TYPE_ENUM
957 enum_field.type_name =
'Foo2.Sub.FOO'
959 result = descriptor.MakeDescriptor(message_type)
960 self.assertEqual(result.fields[0].cpp_type,
961 descriptor.FieldDescriptor.CPPTYPE_UINT64)
962 self.assertEqual(result.fields[1].cpp_type,
963 descriptor.FieldDescriptor.CPPTYPE_MESSAGE)
964 self.assertEqual(result.fields[1].message_type.containing_type,
966 self.assertEqual(result.nested_types[0].fields[0].full_name,
967 'Foo2.Sub.bar_field')
968 self.assertEqual(result.nested_types[0].fields[0].enum_type,
969 result.nested_types[0].enum_types[0])
970 self.assertFalse(result.has_options)
971 self.assertFalse(result.fields[0].has_options)
972 if api_implementation.Type() ==
'cpp':
973 with self.assertRaises(AttributeError):
974 result.fields[0].has_options =
False
977 file_descriptor_proto = descriptor_pb2.FileDescriptorProto()
978 file_descriptor_proto.name =
'Foo'
979 message_type = file_descriptor_proto.message_type.add()
980 message_type.name = file_descriptor_proto.name
981 enum_type = message_type.enum_type.add()
982 enum_type.name =
'FOO'
983 enum_type_val = enum_type.value.add()
984 enum_type_val.name =
'BAR'
985 enum_type_val.number = 3
986 field = message_type.field.add()
988 field.name =
'uint64_field'
989 field.label = descriptor.FieldDescriptor.LABEL_REQUIRED
990 field.type = descriptor.FieldDescriptor.TYPE_UINT64
991 enum_field = message_type.field.add()
992 enum_field.number = 2
993 enum_field.name =
'bar_field'
994 enum_field.label = descriptor.FieldDescriptor.LABEL_REQUIRED
995 enum_field.type = descriptor.FieldDescriptor.TYPE_ENUM
996 enum_field.type_name =
'Foo.FOO'
998 result = descriptor.MakeDescriptor(message_type)
999 self.assertEqual(result.fields[0].cpp_type,
1000 descriptor.FieldDescriptor.CPPTYPE_UINT64)
1004 descriptor_proto = descriptor_pb2.DescriptorProto()
1005 aggregate_message = unittest_custom_options_pb2.AggregateMessage
1006 aggregate_message.DESCRIPTOR.CopyToProto(descriptor_proto)
1007 reformed_descriptor = descriptor.MakeDescriptor(descriptor_proto)
1009 options = reformed_descriptor.GetOptions()
1010 self.assertEqual(101,
1011 options.Extensions[unittest_custom_options_pb2.msgopt].i)
1014 descriptor_proto = descriptor_pb2.DescriptorProto()
1015 descriptor_proto.name =
'Bar'
1016 names = [
'foo_foo',
'FooBar',
'fooBaz',
'fooFoo',
'foobar']
1017 camelcase_names = [
'fooFoo',
'fooBar',
'fooBaz',
'fooFoo',
'foobar']
1019 field = descriptor_proto.field.add()
1020 field.number = index + 1
1021 field.name = names[index]
1022 result = descriptor.MakeDescriptor(descriptor_proto)
1023 for index
in range(
len(camelcase_names)):
1024 self.assertEqual(result.fields[index].camelcase_name,
1025 camelcase_names[index])
1028 descriptor_proto = descriptor_pb2.DescriptorProto()
1029 descriptor_proto.name =
'TestJsonName'
1030 names = [
'field_name',
'fieldName',
'FieldName',
1031 '_field_name',
'FIELD_NAME',
'json_name']
1032 json_names = [
'fieldName',
'fieldName',
'FieldName',
1033 'FieldName',
'FIELDNAME',
'@type']
1035 field = descriptor_proto.field.add()
1036 field.number = index + 1
1037 field.name = names[index]
1038 field.json_name =
'@type'
1039 result = descriptor.MakeDescriptor(descriptor_proto)
1040 for index
in range(
len(json_names)):
1041 self.assertEqual(result.fields[index].json_name,
1045 if __name__ ==
'__main__':