| OLD | NEW |
| 1 #! /usr/bin/env python | 1 #! /usr/bin/env python |
| 2 # | 2 # |
| 3 # Protocol Buffers - Google's data interchange format | 3 # Protocol Buffers - Google's data interchange format |
| 4 # Copyright 2008 Google Inc. All rights reserved. | 4 # Copyright 2008 Google Inc. All rights reserved. |
| 5 # https://developers.google.com/protocol-buffers/ | 5 # https://developers.google.com/protocol-buffers/ |
| 6 # | 6 # |
| 7 # Redistribution and use in source and binary forms, with or without | 7 # Redistribution and use in source and binary forms, with or without |
| 8 # modification, are permitted provided that the following conditions are | 8 # modification, are permitted provided that the following conditions are |
| 9 # met: | 9 # met: |
| 10 # | 10 # |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 | 44 |
| 45 from google.protobuf import unittest_import_pb2 | 45 from google.protobuf import unittest_import_pb2 |
| 46 from google.protobuf import unittest_import_public_pb2 | 46 from google.protobuf import unittest_import_public_pb2 |
| 47 from google.protobuf import unittest_pb2 | 47 from google.protobuf import unittest_pb2 |
| 48 from google.protobuf import descriptor_pb2 | 48 from google.protobuf import descriptor_pb2 |
| 49 from google.protobuf.internal import api_implementation | 49 from google.protobuf.internal import api_implementation |
| 50 from google.protobuf.internal import descriptor_pool_test1_pb2 | 50 from google.protobuf.internal import descriptor_pool_test1_pb2 |
| 51 from google.protobuf.internal import descriptor_pool_test2_pb2 | 51 from google.protobuf.internal import descriptor_pool_test2_pb2 |
| 52 from google.protobuf.internal import factory_test1_pb2 | 52 from google.protobuf.internal import factory_test1_pb2 |
| 53 from google.protobuf.internal import factory_test2_pb2 | 53 from google.protobuf.internal import factory_test2_pb2 |
| 54 from google.protobuf.internal import file_options_test_pb2 |
| 54 from google.protobuf.internal import more_messages_pb2 | 55 from google.protobuf.internal import more_messages_pb2 |
| 55 from google.protobuf import descriptor | 56 from google.protobuf import descriptor |
| 56 from google.protobuf import descriptor_database | 57 from google.protobuf import descriptor_database |
| 57 from google.protobuf import descriptor_pool | 58 from google.protobuf import descriptor_pool |
| 58 from google.protobuf import message_factory | 59 from google.protobuf import message_factory |
| 59 from google.protobuf import symbol_database | 60 from google.protobuf import symbol_database |
| 60 | 61 |
| 61 | 62 |
| 62 class DescriptorPoolTest(unittest.TestCase): | 63 class DescriptorPoolTest(unittest.TestCase): |
| 63 | 64 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 self.pool.FindFileContainingSymbol('Does not exist') | 112 self.pool.FindFileContainingSymbol('Does not exist') |
| 112 | 113 |
| 113 def testFindMessageTypeByName(self): | 114 def testFindMessageTypeByName(self): |
| 114 msg1 = self.pool.FindMessageTypeByName( | 115 msg1 = self.pool.FindMessageTypeByName( |
| 115 'google.protobuf.python.internal.Factory1Message') | 116 'google.protobuf.python.internal.Factory1Message') |
| 116 self.assertIsInstance(msg1, descriptor.Descriptor) | 117 self.assertIsInstance(msg1, descriptor.Descriptor) |
| 117 self.assertEqual('Factory1Message', msg1.name) | 118 self.assertEqual('Factory1Message', msg1.name) |
| 118 self.assertEqual('google.protobuf.python.internal.Factory1Message', | 119 self.assertEqual('google.protobuf.python.internal.Factory1Message', |
| 119 msg1.full_name) | 120 msg1.full_name) |
| 120 self.assertEqual(None, msg1.containing_type) | 121 self.assertEqual(None, msg1.containing_type) |
| 122 self.assertFalse(msg1.has_options) |
| 121 | 123 |
| 122 nested_msg1 = msg1.nested_types[0] | 124 nested_msg1 = msg1.nested_types[0] |
| 123 self.assertEqual('NestedFactory1Message', nested_msg1.name) | 125 self.assertEqual('NestedFactory1Message', nested_msg1.name) |
| 124 self.assertEqual(msg1, nested_msg1.containing_type) | 126 self.assertEqual(msg1, nested_msg1.containing_type) |
| 125 | 127 |
| 126 nested_enum1 = msg1.enum_types[0] | 128 nested_enum1 = msg1.enum_types[0] |
| 127 self.assertEqual('NestedFactory1Enum', nested_enum1.name) | 129 self.assertEqual('NestedFactory1Enum', nested_enum1.name) |
| 128 self.assertEqual(msg1, nested_enum1.containing_type) | 130 self.assertEqual(msg1, nested_enum1.containing_type) |
| 129 | 131 |
| 130 self.assertEqual(nested_msg1, msg1.fields_by_name[ | 132 self.assertEqual(nested_msg1, msg1.fields_by_name[ |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 def testFindMessageTypeByNameFailure(self): | 196 def testFindMessageTypeByNameFailure(self): |
| 195 with self.assertRaises(KeyError): | 197 with self.assertRaises(KeyError): |
| 196 self.pool.FindMessageTypeByName('Does not exist') | 198 self.pool.FindMessageTypeByName('Does not exist') |
| 197 | 199 |
| 198 def testFindEnumTypeByName(self): | 200 def testFindEnumTypeByName(self): |
| 199 enum1 = self.pool.FindEnumTypeByName( | 201 enum1 = self.pool.FindEnumTypeByName( |
| 200 'google.protobuf.python.internal.Factory1Enum') | 202 'google.protobuf.python.internal.Factory1Enum') |
| 201 self.assertIsInstance(enum1, descriptor.EnumDescriptor) | 203 self.assertIsInstance(enum1, descriptor.EnumDescriptor) |
| 202 self.assertEqual(0, enum1.values_by_name['FACTORY_1_VALUE_0'].number) | 204 self.assertEqual(0, enum1.values_by_name['FACTORY_1_VALUE_0'].number) |
| 203 self.assertEqual(1, enum1.values_by_name['FACTORY_1_VALUE_1'].number) | 205 self.assertEqual(1, enum1.values_by_name['FACTORY_1_VALUE_1'].number) |
| 206 self.assertFalse(enum1.has_options) |
| 204 | 207 |
| 205 nested_enum1 = self.pool.FindEnumTypeByName( | 208 nested_enum1 = self.pool.FindEnumTypeByName( |
| 206 'google.protobuf.python.internal.Factory1Message.NestedFactory1Enum') | 209 'google.protobuf.python.internal.Factory1Message.NestedFactory1Enum') |
| 207 self.assertIsInstance(nested_enum1, descriptor.EnumDescriptor) | 210 self.assertIsInstance(nested_enum1, descriptor.EnumDescriptor) |
| 208 self.assertEqual( | 211 self.assertEqual( |
| 209 0, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_0'].number) | 212 0, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_0'].number) |
| 210 self.assertEqual( | 213 self.assertEqual( |
| 211 1, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_1'].number) | 214 1, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_1'].number) |
| 212 | 215 |
| 213 enum2 = self.pool.FindEnumTypeByName( | 216 enum2 = self.pool.FindEnumTypeByName( |
| (...skipping 12 matching lines...) Expand all Loading... |
| 226 | 229 |
| 227 def testFindEnumTypeByNameFailure(self): | 230 def testFindEnumTypeByNameFailure(self): |
| 228 with self.assertRaises(KeyError): | 231 with self.assertRaises(KeyError): |
| 229 self.pool.FindEnumTypeByName('Does not exist') | 232 self.pool.FindEnumTypeByName('Does not exist') |
| 230 | 233 |
| 231 def testFindFieldByName(self): | 234 def testFindFieldByName(self): |
| 232 field = self.pool.FindFieldByName( | 235 field = self.pool.FindFieldByName( |
| 233 'google.protobuf.python.internal.Factory1Message.list_value') | 236 'google.protobuf.python.internal.Factory1Message.list_value') |
| 234 self.assertEqual(field.name, 'list_value') | 237 self.assertEqual(field.name, 'list_value') |
| 235 self.assertEqual(field.label, field.LABEL_REPEATED) | 238 self.assertEqual(field.label, field.LABEL_REPEATED) |
| 239 self.assertFalse(field.has_options) |
| 240 |
| 236 with self.assertRaises(KeyError): | 241 with self.assertRaises(KeyError): |
| 237 self.pool.FindFieldByName('Does not exist') | 242 self.pool.FindFieldByName('Does not exist') |
| 238 | 243 |
| 239 def testFindExtensionByName(self): | 244 def testFindExtensionByName(self): |
| 240 # An extension defined in a message. | 245 # An extension defined in a message. |
| 241 extension = self.pool.FindExtensionByName( | 246 extension = self.pool.FindExtensionByName( |
| 242 'google.protobuf.python.internal.Factory2Message.one_more_field') | 247 'google.protobuf.python.internal.Factory2Message.one_more_field') |
| 243 self.assertEqual(extension.name, 'one_more_field') | 248 self.assertEqual(extension.name, 'one_more_field') |
| 244 # An extension defined at file scope. | 249 # An extension defined at file scope. |
| 245 extension = self.pool.FindExtensionByName( | 250 extension = self.pool.FindExtensionByName( |
| 246 'google.protobuf.python.internal.another_field') | 251 'google.protobuf.python.internal.another_field') |
| 247 self.assertEqual(extension.name, 'another_field') | 252 self.assertEqual(extension.name, 'another_field') |
| 248 self.assertEqual(extension.number, 1002) | 253 self.assertEqual(extension.number, 1002) |
| 249 with self.assertRaises(KeyError): | 254 with self.assertRaises(KeyError): |
| 250 self.pool.FindFieldByName('Does not exist') | 255 self.pool.FindFieldByName('Does not exist') |
| 251 | 256 |
| 257 def testFindAllExtensions(self): |
| 258 factory1_message = self.pool.FindMessageTypeByName( |
| 259 'google.protobuf.python.internal.Factory1Message') |
| 260 factory2_message = self.pool.FindMessageTypeByName( |
| 261 'google.protobuf.python.internal.Factory2Message') |
| 262 # An extension defined in a message. |
| 263 one_more_field = factory2_message.extensions_by_name['one_more_field'] |
| 264 self.pool.AddExtensionDescriptor(one_more_field) |
| 265 # An extension defined at file scope. |
| 266 factory_test2 = self.pool.FindFileByName( |
| 267 'google/protobuf/internal/factory_test2.proto') |
| 268 another_field = factory_test2.extensions_by_name['another_field'] |
| 269 self.pool.AddExtensionDescriptor(another_field) |
| 270 |
| 271 extensions = self.pool.FindAllExtensions(factory1_message) |
| 272 expected_extension_numbers = set([one_more_field, another_field]) |
| 273 self.assertEqual(expected_extension_numbers, set(extensions)) |
| 274 # Verify that mutating the returned list does not affect the pool. |
| 275 extensions.append('unexpected_element') |
| 276 # Get the extensions again, the returned value does not contain the |
| 277 # 'unexpected_element'. |
| 278 extensions = self.pool.FindAllExtensions(factory1_message) |
| 279 self.assertEqual(expected_extension_numbers, set(extensions)) |
| 280 |
| 281 def testFindExtensionByNumber(self): |
| 282 factory1_message = self.pool.FindMessageTypeByName( |
| 283 'google.protobuf.python.internal.Factory1Message') |
| 284 factory2_message = self.pool.FindMessageTypeByName( |
| 285 'google.protobuf.python.internal.Factory2Message') |
| 286 # An extension defined in a message. |
| 287 one_more_field = factory2_message.extensions_by_name['one_more_field'] |
| 288 self.pool.AddExtensionDescriptor(one_more_field) |
| 289 # An extension defined at file scope. |
| 290 factory_test2 = self.pool.FindFileByName( |
| 291 'google/protobuf/internal/factory_test2.proto') |
| 292 another_field = factory_test2.extensions_by_name['another_field'] |
| 293 self.pool.AddExtensionDescriptor(another_field) |
| 294 |
| 295 # An extension defined in a message. |
| 296 extension = self.pool.FindExtensionByNumber(factory1_message, 1001) |
| 297 self.assertEqual(extension.name, 'one_more_field') |
| 298 # An extension defined at file scope. |
| 299 extension = self.pool.FindExtensionByNumber(factory1_message, 1002) |
| 300 self.assertEqual(extension.name, 'another_field') |
| 301 with self.assertRaises(KeyError): |
| 302 extension = self.pool.FindExtensionByNumber(factory1_message, 1234567) |
| 303 |
| 252 def testExtensionsAreNotFields(self): | 304 def testExtensionsAreNotFields(self): |
| 253 with self.assertRaises(KeyError): | 305 with self.assertRaises(KeyError): |
| 254 self.pool.FindFieldByName('google.protobuf.python.internal.another_field') | 306 self.pool.FindFieldByName('google.protobuf.python.internal.another_field') |
| 255 with self.assertRaises(KeyError): | 307 with self.assertRaises(KeyError): |
| 256 self.pool.FindFieldByName( | 308 self.pool.FindFieldByName( |
| 257 'google.protobuf.python.internal.Factory2Message.one_more_field') | 309 'google.protobuf.python.internal.Factory2Message.one_more_field') |
| 258 with self.assertRaises(KeyError): | 310 with self.assertRaises(KeyError): |
| 259 self.pool.FindExtensionByName( | 311 self.pool.FindExtensionByName( |
| 260 'google.protobuf.python.internal.Factory1Message.list_value') | 312 'google.protobuf.python.internal.Factory1Message.list_value') |
| 261 | 313 |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 expected_field_full_name = '.'.join([msg_desc.full_name, name]) | 492 expected_field_full_name = '.'.join([msg_desc.full_name, name]) |
| 441 test.assertEqual(expected_field_full_name, field_desc.full_name) | 493 test.assertEqual(expected_field_full_name, field_desc.full_name) |
| 442 test.assertEqual(index, field_desc.index) | 494 test.assertEqual(index, field_desc.index) |
| 443 test.assertEqual(self.number, field_desc.number) | 495 test.assertEqual(self.number, field_desc.number) |
| 444 test.assertEqual(descriptor.FieldDescriptor.TYPE_ENUM, field_desc.type) | 496 test.assertEqual(descriptor.FieldDescriptor.TYPE_ENUM, field_desc.type) |
| 445 test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_ENUM, | 497 test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_ENUM, |
| 446 field_desc.cpp_type) | 498 field_desc.cpp_type) |
| 447 test.assertTrue(field_desc.has_default_value) | 499 test.assertTrue(field_desc.has_default_value) |
| 448 test.assertEqual(enum_desc.values_by_name[self.default_value].number, | 500 test.assertEqual(enum_desc.values_by_name[self.default_value].number, |
| 449 field_desc.default_value) | 501 field_desc.default_value) |
| 502 test.assertFalse(enum_desc.values_by_name[self.default_value].has_options) |
| 450 test.assertEqual(msg_desc, field_desc.containing_type) | 503 test.assertEqual(msg_desc, field_desc.containing_type) |
| 451 test.assertEqual(enum_desc, field_desc.enum_type) | 504 test.assertEqual(enum_desc, field_desc.enum_type) |
| 452 | 505 |
| 453 | 506 |
| 454 class MessageField(object): | 507 class MessageField(object): |
| 455 | 508 |
| 456 def __init__(self, number, type_name): | 509 def __init__(self, number, type_name): |
| 457 self.number = number | 510 self.number = number |
| 458 self.type_name = type_name | 511 self.type_name = type_name |
| 459 | 512 |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 623 pool = descriptor_pool.DescriptorPool() | 676 pool = descriptor_pool.DescriptorPool() |
| 624 file_desc = descriptor_pb2.FileDescriptorProto( | 677 file_desc = descriptor_pb2.FileDescriptorProto( |
| 625 name='some/file.proto', package='package') | 678 name='some/file.proto', package='package') |
| 626 file_desc.message_type.add(name='Message') | 679 file_desc.message_type.add(name='Message') |
| 627 pool.Add(file_desc) | 680 pool.Add(file_desc) |
| 628 self.assertEqual(pool.FindFileByName('some/file.proto').name, | 681 self.assertEqual(pool.FindFileByName('some/file.proto').name, |
| 629 'some/file.proto') | 682 'some/file.proto') |
| 630 self.assertEqual(pool.FindMessageTypeByName('package.Message').name, | 683 self.assertEqual(pool.FindMessageTypeByName('package.Message').name, |
| 631 'Message') | 684 'Message') |
| 632 | 685 |
| 686 def testFileDescriptorOptionsWithCustomDescriptorPool(self): |
| 687 # Create a descriptor pool, and add a new FileDescriptorProto to it. |
| 688 pool = descriptor_pool.DescriptorPool() |
| 689 file_name = 'file_descriptor_options_with_custom_descriptor_pool.proto' |
| 690 file_descriptor_proto = descriptor_pb2.FileDescriptorProto(name=file_name) |
| 691 extension_id = file_options_test_pb2.foo_options |
| 692 file_descriptor_proto.options.Extensions[extension_id].foo_name = 'foo' |
| 693 pool.Add(file_descriptor_proto) |
| 694 # The options set on the FileDescriptorProto should be available in the |
| 695 # descriptor even if they contain extensions that cannot be deserialized |
| 696 # using the pool. |
| 697 file_descriptor = pool.FindFileByName(file_name) |
| 698 options = file_descriptor.GetOptions() |
| 699 self.assertEqual('foo', options.Extensions[extension_id].foo_name) |
| 700 # The object returned by GetOptions() is cached. |
| 701 self.assertIs(options, file_descriptor.GetOptions()) |
| 702 |
| 633 | 703 |
| 634 @unittest.skipIf( | 704 @unittest.skipIf( |
| 635 api_implementation.Type() != 'cpp', | 705 api_implementation.Type() != 'cpp', |
| 636 'default_pool is only supported by the C++ implementation') | 706 'default_pool is only supported by the C++ implementation') |
| 637 class DefaultPoolTest(unittest.TestCase): | 707 class DefaultPoolTest(unittest.TestCase): |
| 638 | 708 |
| 639 def testFindMethods(self): | 709 def testFindMethods(self): |
| 640 # pylint: disable=g-import-not-at-top | 710 # pylint: disable=g-import-not-at-top |
| 641 from google.protobuf.pyext import _message | 711 from google.protobuf.pyext import _message |
| 642 pool = _message.default_pool | 712 pool = _message.default_pool |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 ExtensionField(1001, 'DescriptorPoolTest1')), | 811 ExtensionField(1001, 'DescriptorPoolTest1')), |
| 742 ]), | 812 ]), |
| 743 }, | 813 }, |
| 744 dependencies=['google/protobuf/internal/descriptor_pool_test1.proto', | 814 dependencies=['google/protobuf/internal/descriptor_pool_test1.proto', |
| 745 'google/protobuf/internal/more_messages.proto'], | 815 'google/protobuf/internal/more_messages.proto'], |
| 746 public_dependencies=['google/protobuf/internal/more_messages.proto']) | 816 public_dependencies=['google/protobuf/internal/more_messages.proto']) |
| 747 | 817 |
| 748 | 818 |
| 749 if __name__ == '__main__': | 819 if __name__ == '__main__': |
| 750 unittest.main() | 820 unittest.main() |
| OLD | NEW |