33 """Tests for google.protobuf.descriptor_pool."""
35 __author__ =
'matthewtoia@google.com (Matt Toia)'
41 import unittest2
as unittest
69 name1 =
'google/protobuf/internal/factory_test1.proto'
72 self.assertEqual(name1, file_desc1.name)
73 self.assertEqual(
'google.protobuf.python.internal', file_desc1.package)
74 self.assertIn(
'Factory1Message', file_desc1.message_types_by_name)
76 name2 =
'google/protobuf/internal/factory_test2.proto'
79 self.assertEqual(name2, file_desc2.name)
80 self.assertEqual(
'google.protobuf.python.internal', file_desc2.package)
81 self.assertIn(
'Factory2Message', file_desc2.message_types_by_name)
84 with self.assertRaises(KeyError):
89 'google.protobuf.python.internal.Factory1Message')
91 self.assertEqual(
'google/protobuf/internal/factory_test1.proto',
93 self.assertEqual(
'google.protobuf.python.internal', file_desc1.package)
94 self.assertIn(
'Factory1Message', file_desc1.message_types_by_name)
97 'google.protobuf.python.internal.Factory2Message')
99 self.assertEqual(
'google/protobuf/internal/factory_test2.proto',
101 self.assertEqual(
'google.protobuf.python.internal', file_desc2.package)
102 self.assertIn(
'Factory2Message', file_desc2.message_types_by_name)
106 'google.protobuf.python.internal.another_field')
108 self.assertEqual(
'google/protobuf/internal/factory_test2.proto',
113 'google.protobuf.python.internal.Factory2Message.one_more_field')
115 self.assertEqual(
'google/protobuf/internal/factory_test2.proto',
119 'protobuf_unittest.TestService')
121 self.assertEqual(
'google/protobuf/unittest.proto',
125 'google.protobuf.python.internal.Factory2Message.one_more_field')
127 'google.protobuf.python.internal.another_field')
129 'protobuf_unittest.TestService')
133 'google.protobuf.python.internal.Factory1Message.list_value')
135 self.assertEqual(
'google/protobuf/internal/factory_test1.proto',
140 'google.protobuf.python.internal.FACTORY_1_VALUE_0')
142 self.assertEqual(
'google/protobuf/internal/factory_test1.proto',
147 'protobuf_unittest.TestAllTypes.FOO')
149 self.assertEqual(
'google/protobuf/unittest.proto',
154 self.assertRaises(KeyError, self.
pool.FindFileContainingSymbol,
155 'google.protobuf.python.internal.Factory1Message.none_field')
158 with self.assertRaises(KeyError):
162 msg1 = self.
pool.FindMessageTypeByName(
163 'google.protobuf.python.internal.Factory1Message')
165 self.assertEqual(
'Factory1Message', msg1.name)
166 self.assertEqual(
'google.protobuf.python.internal.Factory1Message',
168 self.assertEqual(
None, msg1.containing_type)
169 self.assertFalse(msg1.has_options)
171 nested_msg1 = msg1.nested_types[0]
172 self.assertEqual(
'NestedFactory1Message', nested_msg1.name)
173 self.assertEqual(msg1, nested_msg1.containing_type)
175 nested_enum1 = msg1.enum_types[0]
176 self.assertEqual(
'NestedFactory1Enum', nested_enum1.name)
177 self.assertEqual(msg1, nested_enum1.containing_type)
179 self.assertEqual(nested_msg1, msg1.fields_by_name[
180 'nested_factory_1_message'].message_type)
181 self.assertEqual(nested_enum1, msg1.fields_by_name[
182 'nested_factory_1_enum'].enum_type)
184 msg2 = self.
pool.FindMessageTypeByName(
185 'google.protobuf.python.internal.Factory2Message')
187 self.assertEqual(
'Factory2Message', msg2.name)
188 self.assertEqual(
'google.protobuf.python.internal.Factory2Message',
190 self.assertIsNone(msg2.containing_type)
192 nested_msg2 = msg2.nested_types[0]
193 self.assertEqual(
'NestedFactory2Message', nested_msg2.name)
194 self.assertEqual(msg2, nested_msg2.containing_type)
196 nested_enum2 = msg2.enum_types[0]
197 self.assertEqual(
'NestedFactory2Enum', nested_enum2.name)
198 self.assertEqual(msg2, nested_enum2.containing_type)
200 self.assertEqual(nested_msg2, msg2.fields_by_name[
201 'nested_factory_2_message'].message_type)
202 self.assertEqual(nested_enum2, msg2.fields_by_name[
203 'nested_factory_2_enum'].enum_type)
205 self.assertTrue(msg2.fields_by_name[
'int_with_default'].has_default_value)
207 1776, msg2.fields_by_name[
'int_with_default'].default_value)
210 msg2.fields_by_name[
'double_with_default'].has_default_value)
212 9.99, msg2.fields_by_name[
'double_with_default'].default_value)
215 msg2.fields_by_name[
'string_with_default'].has_default_value)
217 'hello world', msg2.fields_by_name[
'string_with_default'].default_value)
219 self.assertTrue(msg2.fields_by_name[
'bool_with_default'].has_default_value)
220 self.assertFalse(msg2.fields_by_name[
'bool_with_default'].default_value)
222 self.assertTrue(msg2.fields_by_name[
'enum_with_default'].has_default_value)
224 1, msg2.fields_by_name[
'enum_with_default'].default_value)
226 msg3 = self.
pool.FindMessageTypeByName(
227 'google.protobuf.python.internal.Factory2Message.NestedFactory2Message')
228 self.assertEqual(nested_msg2, msg3)
230 self.assertTrue(msg2.fields_by_name[
'bytes_with_default'].has_default_value)
233 msg2.fields_by_name[
'bytes_with_default'].default_value)
235 self.assertEqual(1,
len(msg2.oneofs))
236 self.assertEqual(1,
len(msg2.oneofs_by_name))
237 self.assertEqual(2,
len(msg2.oneofs[0].fields))
238 for name
in [
'oneof_int',
'oneof_string']:
239 self.assertEqual(msg2.oneofs[0],
240 msg2.fields_by_name[name].containing_oneof)
241 self.assertIn(msg2.fields_by_name[name], msg2.oneofs[0].fields)
244 self.assertRaises(TypeError, self.
pool.FindExtensionByNumber,
'')
245 self.assertRaises(KeyError, self.
pool.FindMethodByName,
'')
248 if api_implementation.Type() ==
'cpp':
249 error_type = TypeError
251 error_type = AttributeError
252 self.assertRaises(error_type, self.
pool.FindMessageTypeByName, 0)
253 self.assertRaises(error_type, self.
pool.FindFieldByName, 0)
254 self.assertRaises(error_type, self.
pool.FindExtensionByName, 0)
255 self.assertRaises(error_type, self.
pool.FindEnumTypeByName, 0)
256 self.assertRaises(error_type, self.
pool.FindOneofByName, 0)
257 self.assertRaises(error_type, self.
pool.FindServiceByName, 0)
258 self.assertRaises(error_type, self.
pool.FindMethodByName, 0)
259 self.assertRaises(error_type, self.
pool.FindFileContainingSymbol, 0)
260 if api_implementation.Type() ==
'python':
261 error_type = KeyError
262 self.assertRaises(error_type, self.
pool.FindFileByName, 0)
265 with self.assertRaises(KeyError):
266 self.
pool.FindMessageTypeByName(
'Does not exist')
270 'google.protobuf.python.internal.Factory1Enum')
272 self.assertEqual(0, enum1.values_by_name[
'FACTORY_1_VALUE_0'].number)
273 self.assertEqual(1, enum1.values_by_name[
'FACTORY_1_VALUE_1'].number)
274 self.assertFalse(enum1.has_options)
277 'google.protobuf.python.internal.Factory1Message.NestedFactory1Enum')
280 0, nested_enum1.values_by_name[
'NESTED_FACTORY_1_VALUE_0'].number)
282 1, nested_enum1.values_by_name[
'NESTED_FACTORY_1_VALUE_1'].number)
285 'google.protobuf.python.internal.Factory2Enum')
287 self.assertEqual(0, enum2.values_by_name[
'FACTORY_2_VALUE_0'].number)
288 self.assertEqual(1, enum2.values_by_name[
'FACTORY_2_VALUE_1'].number)
291 'google.protobuf.python.internal.Factory2Message.NestedFactory2Enum')
294 0, nested_enum2.values_by_name[
'NESTED_FACTORY_2_VALUE_0'].number)
296 1, nested_enum2.values_by_name[
'NESTED_FACTORY_2_VALUE_1'].number)
299 with self.assertRaises(KeyError):
304 'google.protobuf.python.internal.Factory1Message.list_value')
305 self.assertEqual(field.name,
'list_value')
306 self.assertEqual(field.label, field.LABEL_REPEATED)
307 self.assertFalse(field.has_options)
309 with self.assertRaises(KeyError):
314 'google.protobuf.python.internal.Factory2Message.oneof_field')
315 self.assertEqual(oneof.name,
'oneof_field')
316 with self.assertRaises(KeyError):
322 'google.protobuf.python.internal.Factory2Message.one_more_field')
323 self.assertEqual(extension.name,
'one_more_field')
326 'google.protobuf.python.internal.another_field')
327 self.assertEqual(extension.name,
'another_field')
328 self.assertEqual(extension.number, 1002)
329 with self.assertRaises(KeyError):
333 factory1_message = self.
pool.FindMessageTypeByName(
334 'google.protobuf.python.internal.Factory1Message')
335 factory2_message = self.
pool.FindMessageTypeByName(
336 'google.protobuf.python.internal.Factory2Message')
338 one_more_field = factory2_message.extensions_by_name[
'one_more_field']
342 'google/protobuf/internal/factory_test2.proto')
343 another_field = factory_test2.extensions_by_name[
'another_field']
347 expected_extension_numbers =
set([one_more_field, another_field])
348 self.assertEqual(expected_extension_numbers,
set(extensions))
350 extensions.append(
'unexpected_element')
354 self.assertEqual(expected_extension_numbers,
set(extensions))
357 factory1_message = self.
pool.FindMessageTypeByName(
358 'google.protobuf.python.internal.Factory1Message')
359 factory2_message = self.
pool.FindMessageTypeByName(
360 'google.protobuf.python.internal.Factory2Message')
362 one_more_field = factory2_message.extensions_by_name[
'one_more_field']
366 'google/protobuf/internal/factory_test2.proto')
367 another_field = factory_test2.extensions_by_name[
'another_field']
372 self.assertEqual(extension.name,
'one_more_field')
375 self.assertEqual(extension.name,
'another_field')
376 with self.assertRaises(KeyError):
380 with self.assertRaises(KeyError):
382 with self.assertRaises(KeyError):
384 'google.protobuf.python.internal.Factory2Message.one_more_field')
385 with self.assertRaises(KeyError):
387 'google.protobuf.python.internal.Factory1Message.list_value')
391 self.assertEqual(service.full_name,
'protobuf_unittest.TestService')
392 with self.assertRaises(KeyError):
396 self.assertIs(method.containing_service, service)
397 with self.assertRaises(KeyError):
403 db.Add(self.factory_test1_fd)
404 db.Add(self.factory_test2_fd)
408 if isinstance(self, SecondaryDescriptorFromDescriptorDB):
409 if api_implementation.Type() ==
'cpp':
421 """Test the default value of enums which don't start at zero."""
422 def _CheckDefaultValue(file_descriptor):
423 default_value = (file_descriptor
424 .message_types_by_name[
'DescriptorPoolTest1']
425 .fields_by_name[
'nested_enum']
427 self.assertEqual(default_value,
428 descriptor_pool_test1_pb2.DescriptorPoolTest1.BETA)
430 _CheckDefaultValue(descriptor_pool_test1_pb2.DESCRIPTOR)
432 file_descriptor = symbol_database.Default().pool.FindFileByName(
433 'google/protobuf/internal/descriptor_pool_test1.proto')
434 self.assertIs(file_descriptor, descriptor_pool_test1_pb2.DESCRIPTOR)
435 _CheckDefaultValue(file_descriptor)
437 if isinstance(self, SecondaryDescriptorFromDescriptorDB):
438 if api_implementation.Type() ==
'cpp':
444 descriptor_proto = descriptor_pb2.FileDescriptorProto.FromString(
445 descriptor_pool_test1_pb2.DESCRIPTOR.serialized_pb)
446 self.
pool.
Add(descriptor_proto)
449 'google/protobuf/internal/descriptor_pool_test1.proto')
450 _CheckDefaultValue(file_descriptor)
453 """Check the value returned by non-existent fields."""
454 def _CheckValueAndType(value, expected_value, expected_type):
455 self.assertEqual(value, expected_value)
456 self.assertIsInstance(value, expected_type)
458 def _CheckDefaultValues(msg):
464 unicode_type = unicode
467 _CheckValueAndType(msg.optional_int32, 0, int)
468 _CheckValueAndType(msg.optional_uint64, 0, (int64, int))
469 _CheckValueAndType(msg.optional_float, 0, (float, int))
470 _CheckValueAndType(msg.optional_double, 0, (float, int))
471 _CheckValueAndType(msg.optional_bool,
False, bool)
472 _CheckValueAndType(msg.optional_string,
u'', unicode_type)
473 _CheckValueAndType(msg.optional_bytes, b
'', bytes)
474 _CheckValueAndType(msg.optional_nested_enum, msg.FOO, int)
476 _CheckDefaultValues(unittest_pb2.TestAllTypes())
479 pool.Add(descriptor_pb2.FileDescriptorProto.FromString(
480 unittest_import_public_pb2.DESCRIPTOR.serialized_pb))
481 pool.Add(descriptor_pb2.FileDescriptorProto.FromString(
482 unittest_import_pb2.DESCRIPTOR.serialized_pb))
483 pool.Add(descriptor_pb2.FileDescriptorProto.FromString(
484 unittest_pb2.DESCRIPTOR.serialized_pb))
486 pool.FindMessageTypeByName(
487 unittest_pb2.TestAllTypes.DESCRIPTOR.full_name))
488 _CheckDefaultValues(message_class())
491 if isinstance(self, SecondaryDescriptorFromDescriptorDB):
492 if api_implementation.Type() ==
'cpp':
497 file_desc = descriptor_pb2.FileDescriptorProto(name=
'some/file.proto')
502 if isinstance(self, SecondaryDescriptorFromDescriptorDB):
503 if api_implementation.Type() ==
'cpp':
508 more_messages_desc = descriptor_pb2.FileDescriptorProto.FromString(
509 more_messages_pb2.DESCRIPTOR.serialized_pb)
510 test1_desc = descriptor_pb2.FileDescriptorProto.FromString(
511 descriptor_pool_test1_pb2.DESCRIPTOR.serialized_pb)
512 test2_desc = descriptor_pb2.FileDescriptorProto.FromString(
513 descriptor_pool_test2_pb2.DESCRIPTOR.serialized_pb)
514 self.
pool.
Add(more_messages_desc)
517 TEST1_FILE.CheckFile(self, self.
pool)
518 TEST2_FILE.CheckFile(self, self.
pool)
521 if isinstance(self, SecondaryDescriptorFromDescriptorDB):
522 if api_implementation.Type() ==
'cpp':
527 unittest_fd = descriptor_pb2.FileDescriptorProto.FromString(
528 unittest_pb2.DESCRIPTOR.serialized_pb)
529 conflict_fd = copy.deepcopy(unittest_fd)
530 conflict_fd.name =
'other_file'
531 if api_implementation.Type() ==
'cpp':
534 pool = copy.deepcopy(self.
pool)
535 file_descriptor = unittest_pb2.DESCRIPTOR
537 file_descriptor.message_types_by_name[
'TestAllTypes'])
538 pool.AddEnumDescriptor(
539 file_descriptor.enum_types_by_name[
'ForeignEnum'])
540 pool.AddServiceDescriptor(
541 file_descriptor.services_by_name[
'TestService'])
542 pool.AddExtensionDescriptor(
543 file_descriptor.extensions_by_name[
'optional_int32_extension'])
544 pool.Add(unittest_fd)
545 pool.Add(conflict_fd)
546 pool.FindFileByName(unittest_fd.name)
547 with self.assertRaises(TypeError):
548 pool.FindFileByName(conflict_fd.name)
551 @testing_refleaks.TestCase
555 self.
pool = descriptor_pool.Default()
557 factory_test1_pb2.DESCRIPTOR.serialized_pb)
559 factory_test2_pb2.DESCRIPTOR.serialized_pb)
564 unittest_pb2.DESCRIPTOR)
566 self.
pool.FindMessageTypeByName(
'protobuf_unittest.TestAllTypes'),
567 unittest_pb2.TestAllTypes.DESCRIPTOR)
570 'protobuf_unittest.TestAllTypes.optional_int32'),
571 unittest_pb2.TestAllTypes.DESCRIPTOR.fields_by_name[
'optional_int32'])
574 unittest_pb2.ForeignEnum.DESCRIPTOR)
577 'protobuf_unittest.optional_int32_extension'),
578 unittest_pb2.DESCRIPTOR.extensions_by_name[
'optional_int32_extension'])
581 unittest_pb2.TestAllTypes.DESCRIPTOR.oneofs_by_name[
'oneof_field'])
584 unittest_pb2.DESCRIPTOR.services_by_name[
'TestService'])
587 @testing_refleaks.TestCase
593 factory_test1_pb2.DESCRIPTOR.serialized_pb)
595 factory_test2_pb2.DESCRIPTOR.serialized_pb)
599 self.
pool.
Add(descriptor_pb2.FileDescriptorProto.FromString(
600 unittest_import_public_pb2.DESCRIPTOR.serialized_pb))
601 self.
pool.
Add(descriptor_pb2.FileDescriptorProto.FromString(
602 unittest_import_pb2.DESCRIPTOR.serialized_pb))
603 self.
pool.
Add(descriptor_pb2.FileDescriptorProto.FromString(
604 unittest_pb2.DESCRIPTOR.serialized_pb))
605 self.
pool.
Add(descriptor_pb2.FileDescriptorProto.FromString(
606 no_package_pb2.DESCRIPTOR.serialized_pb))
609 @testing_refleaks.TestCase
615 factory_test1_pb2.DESCRIPTOR.serialized_pb)
617 factory_test2_pb2.DESCRIPTOR.serialized_pb)
621 self.
db.
Add(descriptor_pb2.FileDescriptorProto.FromString(
622 unittest_import_public_pb2.DESCRIPTOR.serialized_pb))
623 self.
db.
Add(descriptor_pb2.FileDescriptorProto.FromString(
624 unittest_import_pb2.DESCRIPTOR.serialized_pb))
625 self.
db.
Add(descriptor_pb2.FileDescriptorProto.FromString(
626 unittest_pb2.DESCRIPTOR.serialized_pb))
627 self.
db.
Add(descriptor_pb2.FileDescriptorProto.FromString(
628 no_package_pb2.DESCRIPTOR.serialized_pb))
632 file_proto = descriptor_pb2.FileDescriptorProto()
633 file_proto.package =
'collector'
634 file_proto.name =
'error_file'
635 message_type = file_proto.message_type.add()
636 message_type.name =
'ErrorMessage'
637 field = message_type.field.add()
639 field.name =
'nested_message_field'
640 field.label = descriptor.FieldDescriptor.LABEL_OPTIONAL
641 field.type = descriptor.FieldDescriptor.TYPE_MESSAGE
642 field.type_name =
'SubMessage'
643 oneof = message_type.oneof_decl.add()
644 oneof.name =
'MyOneof'
645 enum_type = file_proto.enum_type.add()
646 enum_type.name =
'MyEnum'
647 enum_value = enum_type.value.add()
648 enum_value.name =
'MyEnumValue'
649 enum_value.number = 0
650 self.
db.
Add(file_proto)
652 self.assertRaisesRegexp(KeyError,
'SubMessage',
653 self.
pool.FindMessageTypeByName,
654 'collector.ErrorMessage')
655 self.assertRaisesRegexp(KeyError,
'SubMessage',
656 self.
pool.FindFileByName,
'error_file')
657 with self.assertRaises(KeyError)
as exc:
659 self.assertIn(
str(exc.exception), (
'\'none_file\'',
660 '\"Couldn\'t find file none_file\"'))
668 if api_implementation.Type() ==
'cpp':
669 error_msg = (
'Invalid proto descriptor for file "error_file":\\n '
670 'collector.ErrorMessage.nested_message_field: "SubMessage" '
671 'is not defined.\\n collector.ErrorMessage.MyOneof: Oneof '
672 'must have at least one field.\\n\'')
673 with self.assertRaises(KeyError)
as exc:
674 self.
pool.FindMessageTypeByName(
'collector.ErrorMessage')
675 self.assertEqual(
str(exc.exception),
'\'Couldn\\\'t build file for '
676 'message collector.ErrorMessage\\n' + error_msg)
678 with self.assertRaises(KeyError)
as exc:
680 self.assertEqual(
str(exc.exception),
'\'Couldn\\\'t build file for field'
681 ' collector.ErrorMessage.nested_message_field\\n'
684 with self.assertRaises(KeyError)
as exc:
686 self.assertEqual(
str(exc.exception),
'\'Couldn\\\'t build file for enum'
687 ' collector.MyEnum\\n' + error_msg)
689 with self.assertRaises(KeyError)
as exc:
691 self.assertEqual(
str(exc.exception),
'\'Couldn\\\'t build file for symbol'
692 ' collector.MyEnumValue\\n' + error_msg)
694 with self.assertRaises(KeyError)
as exc:
696 self.assertEqual(
str(exc.exception),
'\'Couldn\\\'t build file for oneof'
697 ' collector.ErrorMessage.MyOneof\\n' + error_msg)
702 def __init__(self, name, package, messages, dependencies=None,
703 public_dependencies=None):
711 file_desc = pool.FindFileByName(self.
name)
712 test.assertEqual(self.
name, file_desc.name)
713 test.assertEqual(self.
package, file_desc.package)
714 dependencies_names = [f.name
for f
in file_desc.dependencies]
716 public_dependencies_names = [f.name
for f
in file_desc.public_dependencies]
718 for name, msg_type
in self.
messages.items():
719 msg_type.CheckType(test,
None, name, file_desc)
728 enum_desc = msg_desc.enum_types_by_name[name]
729 test.assertEqual(name, enum_desc.name)
730 expected_enum_full_name =
'.'.join([msg_desc.full_name, name])
731 test.assertEqual(expected_enum_full_name, enum_desc.full_name)
732 test.assertEqual(msg_desc, enum_desc.containing_type)
733 test.assertEqual(file_desc, enum_desc.file)
734 for index, (value, number)
in enumerate(self.
values):
735 value_desc = enum_desc.values_by_name[value]
736 test.assertEqual(value, value_desc.name)
737 test.assertEqual(index, value_desc.index)
738 test.assertEqual(number, value_desc.number)
739 test.assertEqual(enum_desc, value_desc.type)
740 test.assertIn(value, msg_desc.enum_values_by_name)
745 def __init__(self, type_dict, field_list, is_extendable=False,
752 def CheckType(self, test, containing_type_desc, name, file_desc):
753 if containing_type_desc
is None:
754 desc = file_desc.message_types_by_name[name]
755 expected_full_name =
'.'.join([file_desc.package, name])
757 desc = containing_type_desc.nested_types_by_name[name]
758 expected_full_name =
'.'.join([containing_type_desc.full_name, name])
760 test.assertEqual(name, desc.name)
761 test.assertEqual(expected_full_name, desc.full_name)
762 test.assertEqual(containing_type_desc, desc.containing_type)
763 test.assertEqual(desc.file, file_desc)
765 for name, subtype
in self.
type_dict.items():
766 subtype.CheckType(test, desc, name, file_desc)
768 for index, (name, field)
in enumerate(self.
field_list):
769 field.CheckField(test, desc, name, index, file_desc)
771 for index, (name, field)
in enumerate(self.
extensions):
772 field.CheckField(test, desc, name, index, file_desc)
777 def __init__(self, number, type_name, default_value):
782 def CheckField(self, test, msg_desc, name, index, file_desc):
783 field_desc = msg_desc.fields_by_name[name]
784 enum_desc = msg_desc.enum_types_by_name[self.
type_name]
785 test.assertEqual(name, field_desc.name)
786 expected_field_full_name =
'.'.join([msg_desc.full_name, name])
787 test.assertEqual(expected_field_full_name, field_desc.full_name)
788 test.assertEqual(index, field_desc.index)
789 test.assertEqual(self.
number, field_desc.number)
790 test.assertEqual(descriptor.FieldDescriptor.TYPE_ENUM, field_desc.type)
791 test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_ENUM,
793 test.assertTrue(field_desc.has_default_value)
794 test.assertEqual(enum_desc.values_by_name[self.
default_value].number,
795 field_desc.default_value)
796 test.assertFalse(enum_desc.values_by_name[self.
default_value].has_options)
797 test.assertEqual(msg_desc, field_desc.containing_type)
798 test.assertEqual(enum_desc, field_desc.enum_type)
799 test.assertEqual(file_desc, enum_desc.file)
808 def CheckField(self, test, msg_desc, name, index, file_desc):
809 field_desc = msg_desc.fields_by_name[name]
810 field_type_desc = msg_desc.nested_types_by_name[self.
type_name]
811 test.assertEqual(name, field_desc.name)
812 expected_field_full_name =
'.'.join([msg_desc.full_name, name])
813 test.assertEqual(expected_field_full_name, field_desc.full_name)
814 test.assertEqual(index, field_desc.index)
815 test.assertEqual(self.
number, field_desc.number)
816 test.assertEqual(descriptor.FieldDescriptor.TYPE_MESSAGE, field_desc.type)
817 test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_MESSAGE,
819 test.assertFalse(field_desc.has_default_value)
820 test.assertEqual(msg_desc, field_desc.containing_type)
821 test.assertEqual(field_type_desc, field_desc.message_type)
822 test.assertEqual(file_desc, field_desc.file)
823 test.assertEqual(field_desc.default_value,
None)
832 def CheckField(self, test, msg_desc, name, index, file_desc):
833 field_desc = msg_desc.fields_by_name[name]
834 test.assertEqual(name, field_desc.name)
835 expected_field_full_name =
'.'.join([msg_desc.full_name, name])
836 test.assertEqual(expected_field_full_name, field_desc.full_name)
837 test.assertEqual(index, field_desc.index)
838 test.assertEqual(self.
number, field_desc.number)
839 test.assertEqual(descriptor.FieldDescriptor.TYPE_STRING, field_desc.type)
840 test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_STRING,
842 test.assertTrue(field_desc.has_default_value)
843 test.assertEqual(self.
default_value, field_desc.default_value)
844 test.assertEqual(file_desc, field_desc.file)
853 def CheckField(self, test, msg_desc, name, index, file_desc):
854 field_desc = msg_desc.extensions_by_name[name]
855 test.assertEqual(name, field_desc.name)
856 expected_field_full_name =
'.'.join([msg_desc.full_name, name])
857 test.assertEqual(expected_field_full_name, field_desc.full_name)
858 test.assertEqual(self.
number, field_desc.number)
859 test.assertEqual(index, field_desc.index)
860 test.assertEqual(descriptor.FieldDescriptor.TYPE_MESSAGE, field_desc.type)
861 test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_MESSAGE,
863 test.assertFalse(field_desc.has_default_value)
864 test.assertTrue(field_desc.is_extension)
865 test.assertEqual(msg_desc, field_desc.extension_scope)
866 test.assertEqual(msg_desc, field_desc.message_type)
867 test.assertEqual(self.
extended_type, field_desc.containing_type.name)
868 test.assertEqual(file_desc, field_desc.file)
871 @testing_refleaks.TestCase
876 pool.AddDescriptor(unittest_pb2.TestAllTypes.DESCRIPTOR)
878 'protobuf_unittest.TestAllTypes',
879 pool.FindMessageTypeByName(
880 prefix +
'protobuf_unittest.TestAllTypes').full_name)
883 with self.assertRaises(KeyError):
884 pool.FindMessageTypeByName(
885 prefix +
'protobuf_unittest.TestAllTypes.NestedMessage')
887 pool.AddDescriptor(unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR)
889 'protobuf_unittest.TestAllTypes.NestedMessage',
890 pool.FindMessageTypeByName(
891 prefix +
'protobuf_unittest.TestAllTypes.NestedMessage').full_name)
895 'google/protobuf/unittest.proto',
897 'google/protobuf/unittest.proto').name)
900 'google/protobuf/unittest.proto',
901 pool.FindFileContainingSymbol(
902 prefix +
'protobuf_unittest.TestAllTypes.NestedMessage').name)
904 @unittest.skipIf(api_implementation.Type() ==
'cpp',
905 'With the cpp implementation, Add() must be called first')
912 pool.AddEnumDescriptor(unittest_pb2.ForeignEnum.DESCRIPTOR)
914 'protobuf_unittest.ForeignEnum',
915 pool.FindEnumTypeByName(
916 prefix +
'protobuf_unittest.ForeignEnum').full_name)
919 with self.assertRaises(KeyError):
920 pool.FindEnumTypeByName(
921 prefix +
'protobuf_unittest.ForeignEnum.NestedEnum')
923 pool.AddEnumDescriptor(unittest_pb2.TestAllTypes.NestedEnum.DESCRIPTOR)
925 'protobuf_unittest.TestAllTypes.NestedEnum',
926 pool.FindEnumTypeByName(
927 prefix +
'protobuf_unittest.TestAllTypes.NestedEnum').full_name)
931 'google/protobuf/unittest.proto',
933 'google/protobuf/unittest.proto').name)
936 'google/protobuf/unittest.proto',
937 pool.FindFileContainingSymbol(
938 prefix +
'protobuf_unittest.TestAllTypes.NestedEnum').name)
940 @unittest.skipIf(api_implementation.Type() ==
'cpp',
941 'With the cpp implementation, Add() must be called first')
946 @unittest.skipIf(api_implementation.Type() ==
'cpp',
947 'With the cpp implementation, Add() must be called first')
950 with self.assertRaises(KeyError):
951 pool.FindServiceByName(
'protobuf_unittest.TestService')
952 pool.AddServiceDescriptor(unittest_pb2._TESTSERVICE)
954 'protobuf_unittest.TestService',
955 pool.FindServiceByName(
'protobuf_unittest.TestService').full_name)
957 @unittest.skipIf(api_implementation.Type() ==
'cpp',
958 'With the cpp implementation, Add() must be called first')
961 pool.AddFileDescriptor(unittest_pb2.DESCRIPTOR)
963 'google/protobuf/unittest.proto',
965 'google/protobuf/unittest.proto').name)
969 with self.assertRaises(KeyError):
970 pool.FindFileContainingSymbol(
971 'protobuf_unittest.TestAllTypes')
976 proto_file_name = descriptor_pb2.DESCRIPTOR.name
977 self.assertRaises(KeyError, pool.FindFileByName, proto_file_name)
979 file_descriptor = descriptor_pb2.FileDescriptorProto()
980 descriptor_pb2.DESCRIPTOR.CopyToProto(file_descriptor)
981 pool.Add(file_descriptor)
983 self.assertTrue(pool.FindFileByName(proto_file_name))
988 file_desc = descriptor_pb2.FileDescriptorProto(
989 name=
'some/file.proto', package=
'package')
990 file_desc.message_type.add(name=
'Message')
992 self.assertEqual(pool.FindFileByName(
'some/file.proto').name,
994 self.assertEqual(pool.FindMessageTypeByName(
'package.Message').name,
997 file_proto = descriptor_pb2.FileDescriptorProto(
998 name=
'some/filename/container.proto')
999 message_proto = file_proto.message_type.add(
1001 message_proto.field.add(
1004 type=descriptor_pb2.FieldDescriptorProto.TYPE_INT32,
1005 label=descriptor_pb2.FieldDescriptorProto.LABEL_OPTIONAL)
1006 enum_proto = file_proto.enum_type.add(name=
'TopEnum')
1007 enum_proto.value.add(name=
'FOREIGN_FOO', number=4)
1008 file_proto.service.add(name=
'TopService')
1010 pool.Add(file_proto)
1011 self.assertEqual(
'TopMessage',
1012 pool.FindMessageTypeByName(
'TopMessage').name)
1013 self.assertEqual(
'TopEnum', pool.FindEnumTypeByName(
'TopEnum').name)
1014 self.assertEqual(
'TopService', pool.FindServiceByName(
'TopService').name)
1019 file_name =
'file_descriptor_options_with_custom_descriptor_pool.proto'
1020 file_descriptor_proto = descriptor_pb2.FileDescriptorProto(name=file_name)
1021 extension_id = file_options_test_pb2.foo_options
1022 file_descriptor_proto.options.Extensions[extension_id].foo_name =
'foo'
1023 pool.Add(file_descriptor_proto)
1027 file_descriptor = pool.FindFileByName(file_name)
1028 options = file_descriptor.GetOptions()
1029 self.assertEqual(
'foo', options.Extensions[extension_id].foo_name)
1031 self.assertIs(options, file_descriptor.GetOptions())
1035 with self.assertRaises(TypeError):
1036 pool.AddDescriptor(0)
1037 with self.assertRaises(TypeError):
1038 pool.AddEnumDescriptor(0)
1039 with self.assertRaises(TypeError):
1040 pool.AddServiceDescriptor(0)
1041 with self.assertRaises(TypeError):
1042 pool.AddExtensionDescriptor(0)
1043 with self.assertRaises(TypeError):
1044 pool.AddFileDescriptor(0)
1048 'google/protobuf/internal/descriptor_pool_test1.proto',
1049 'google.protobuf.python.internal',
1052 'NestedEnum':
EnumType([(
'ALPHA', 1), (
'BETA', 2)]),
1054 'NestedEnum':
EnumType([(
'EPSILON', 5), (
'ZETA', 6)]),
1056 'NestedEnum':
EnumType([(
'ETA', 7), (
'THETA', 8)]),
1058 (
'nested_enum',
EnumField(1,
'NestedEnum',
'ETA')),
1062 (
'nested_enum',
EnumField(1,
'NestedEnum',
'ZETA')),
1064 (
'deep_nested_message',
MessageField(3,
'DeepNestedMessage')),
1067 (
'nested_enum',
EnumField(1,
'NestedEnum',
'BETA')),
1069 ], is_extendable=
True),
1072 'NestedEnum':
EnumType([(
'GAMMA', 3), (
'DELTA', 4)]),
1074 'NestedEnum':
EnumType([(
'IOTA', 9), (
'KAPPA', 10)]),
1076 'NestedEnum':
EnumType([(
'LAMBDA', 11), (
'MU', 12)]),
1078 (
'nested_enum',
EnumField(1,
'NestedEnum',
'MU')),
1082 (
'nested_enum',
EnumField(1,
'NestedEnum',
'IOTA')),
1084 (
'deep_nested_message',
MessageField(3,
'DeepNestedMessage')),
1087 (
'nested_enum',
EnumField(1,
'NestedEnum',
'GAMMA')),
1094 'google/protobuf/internal/descriptor_pool_test2.proto',
1095 'google.protobuf.python.internal',
1098 'NestedEnum':
EnumType([(
'NU', 13), (
'XI', 14)]),
1100 'NestedEnum':
EnumType([(
'OMICRON', 15), (
'PI', 16)]),
1102 'NestedEnum':
EnumType([(
'RHO', 17), (
'SIGMA', 18)]),
1104 (
'nested_enum',
EnumField(1,
'NestedEnum',
'RHO')),
1108 (
'nested_enum',
EnumField(1,
'NestedEnum',
'PI')),
1110 (
'deep_nested_message',
MessageField(3,
'DeepNestedMessage')),
1113 (
'nested_enum',
EnumField(1,
'NestedEnum',
'XI')),
1116 (
'descriptor_pool_test',
1120 dependencies=[
'google/protobuf/internal/descriptor_pool_test1.proto',
1121 'google/protobuf/internal/more_messages.proto'],
1122 public_dependencies=[
'google/protobuf/internal/more_messages.proto'])
1125 if __name__ ==
'__main__':