Index: third_party/protobuf/python/google/protobuf/internal/descriptor_pool_test.py |
diff --git a/third_party/protobuf/python/google/protobuf/internal/descriptor_pool_test.py b/third_party/protobuf/python/google/protobuf/internal/descriptor_pool_test.py |
index 6a13e0bcf0b9796d8a9e734af22e797850df2b8e..1e710dcf82b1a8f57e8ae697b647b24ab7a0dc7b 100644 |
--- a/third_party/protobuf/python/google/protobuf/internal/descriptor_pool_test.py |
+++ b/third_party/protobuf/python/google/protobuf/internal/descriptor_pool_test.py |
@@ -51,6 +51,7 @@ from google.protobuf.internal import descriptor_pool_test1_pb2 |
from google.protobuf.internal import descriptor_pool_test2_pb2 |
from google.protobuf.internal import factory_test1_pb2 |
from google.protobuf.internal import factory_test2_pb2 |
+from google.protobuf.internal import file_options_test_pb2 |
from google.protobuf.internal import more_messages_pb2 |
from google.protobuf import descriptor |
from google.protobuf import descriptor_database |
@@ -118,6 +119,7 @@ class DescriptorPoolTest(unittest.TestCase): |
self.assertEqual('google.protobuf.python.internal.Factory1Message', |
msg1.full_name) |
self.assertEqual(None, msg1.containing_type) |
+ self.assertFalse(msg1.has_options) |
nested_msg1 = msg1.nested_types[0] |
self.assertEqual('NestedFactory1Message', nested_msg1.name) |
@@ -201,6 +203,7 @@ class DescriptorPoolTest(unittest.TestCase): |
self.assertIsInstance(enum1, descriptor.EnumDescriptor) |
self.assertEqual(0, enum1.values_by_name['FACTORY_1_VALUE_0'].number) |
self.assertEqual(1, enum1.values_by_name['FACTORY_1_VALUE_1'].number) |
+ self.assertFalse(enum1.has_options) |
nested_enum1 = self.pool.FindEnumTypeByName( |
'google.protobuf.python.internal.Factory1Message.NestedFactory1Enum') |
@@ -233,6 +236,8 @@ class DescriptorPoolTest(unittest.TestCase): |
'google.protobuf.python.internal.Factory1Message.list_value') |
self.assertEqual(field.name, 'list_value') |
self.assertEqual(field.label, field.LABEL_REPEATED) |
+ self.assertFalse(field.has_options) |
+ |
with self.assertRaises(KeyError): |
self.pool.FindFieldByName('Does not exist') |
@@ -249,6 +254,53 @@ class DescriptorPoolTest(unittest.TestCase): |
with self.assertRaises(KeyError): |
self.pool.FindFieldByName('Does not exist') |
+ def testFindAllExtensions(self): |
+ factory1_message = self.pool.FindMessageTypeByName( |
+ 'google.protobuf.python.internal.Factory1Message') |
+ factory2_message = self.pool.FindMessageTypeByName( |
+ 'google.protobuf.python.internal.Factory2Message') |
+ # An extension defined in a message. |
+ one_more_field = factory2_message.extensions_by_name['one_more_field'] |
+ self.pool.AddExtensionDescriptor(one_more_field) |
+ # An extension defined at file scope. |
+ factory_test2 = self.pool.FindFileByName( |
+ 'google/protobuf/internal/factory_test2.proto') |
+ another_field = factory_test2.extensions_by_name['another_field'] |
+ self.pool.AddExtensionDescriptor(another_field) |
+ |
+ extensions = self.pool.FindAllExtensions(factory1_message) |
+ expected_extension_numbers = set([one_more_field, another_field]) |
+ self.assertEqual(expected_extension_numbers, set(extensions)) |
+ # Verify that mutating the returned list does not affect the pool. |
+ extensions.append('unexpected_element') |
+ # Get the extensions again, the returned value does not contain the |
+ # 'unexpected_element'. |
+ extensions = self.pool.FindAllExtensions(factory1_message) |
+ self.assertEqual(expected_extension_numbers, set(extensions)) |
+ |
+ def testFindExtensionByNumber(self): |
+ factory1_message = self.pool.FindMessageTypeByName( |
+ 'google.protobuf.python.internal.Factory1Message') |
+ factory2_message = self.pool.FindMessageTypeByName( |
+ 'google.protobuf.python.internal.Factory2Message') |
+ # An extension defined in a message. |
+ one_more_field = factory2_message.extensions_by_name['one_more_field'] |
+ self.pool.AddExtensionDescriptor(one_more_field) |
+ # An extension defined at file scope. |
+ factory_test2 = self.pool.FindFileByName( |
+ 'google/protobuf/internal/factory_test2.proto') |
+ another_field = factory_test2.extensions_by_name['another_field'] |
+ self.pool.AddExtensionDescriptor(another_field) |
+ |
+ # An extension defined in a message. |
+ extension = self.pool.FindExtensionByNumber(factory1_message, 1001) |
+ self.assertEqual(extension.name, 'one_more_field') |
+ # An extension defined at file scope. |
+ extension = self.pool.FindExtensionByNumber(factory1_message, 1002) |
+ self.assertEqual(extension.name, 'another_field') |
+ with self.assertRaises(KeyError): |
+ extension = self.pool.FindExtensionByNumber(factory1_message, 1234567) |
+ |
def testExtensionsAreNotFields(self): |
with self.assertRaises(KeyError): |
self.pool.FindFieldByName('google.protobuf.python.internal.another_field') |
@@ -447,6 +499,7 @@ class EnumField(object): |
test.assertTrue(field_desc.has_default_value) |
test.assertEqual(enum_desc.values_by_name[self.default_value].number, |
field_desc.default_value) |
+ test.assertFalse(enum_desc.values_by_name[self.default_value].has_options) |
test.assertEqual(msg_desc, field_desc.containing_type) |
test.assertEqual(enum_desc, field_desc.enum_type) |
@@ -630,6 +683,23 @@ class AddDescriptorTest(unittest.TestCase): |
self.assertEqual(pool.FindMessageTypeByName('package.Message').name, |
'Message') |
+ def testFileDescriptorOptionsWithCustomDescriptorPool(self): |
+ # Create a descriptor pool, and add a new FileDescriptorProto to it. |
+ pool = descriptor_pool.DescriptorPool() |
+ file_name = 'file_descriptor_options_with_custom_descriptor_pool.proto' |
+ file_descriptor_proto = descriptor_pb2.FileDescriptorProto(name=file_name) |
+ extension_id = file_options_test_pb2.foo_options |
+ file_descriptor_proto.options.Extensions[extension_id].foo_name = 'foo' |
+ pool.Add(file_descriptor_proto) |
+ # The options set on the FileDescriptorProto should be available in the |
+ # descriptor even if they contain extensions that cannot be deserialized |
+ # using the pool. |
+ file_descriptor = pool.FindFileByName(file_name) |
+ options = file_descriptor.GetOptions() |
+ self.assertEqual('foo', options.Extensions[extension_id].foo_name) |
+ # The object returned by GetOptions() is cached. |
+ self.assertIs(options, file_descriptor.GetOptions()) |
+ |
@unittest.skipIf( |
api_implementation.Type() != 'cpp', |