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 | |
55 from google.protobuf.internal import more_messages_pb2 | 54 from google.protobuf.internal import more_messages_pb2 |
56 from google.protobuf import descriptor | 55 from google.protobuf import descriptor |
57 from google.protobuf import descriptor_database | 56 from google.protobuf import descriptor_database |
58 from google.protobuf import descriptor_pool | 57 from google.protobuf import descriptor_pool |
59 from google.protobuf import message_factory | 58 from google.protobuf import message_factory |
60 from google.protobuf import symbol_database | 59 from google.protobuf import symbol_database |
61 | 60 |
62 | 61 |
63 class DescriptorPoolTest(unittest.TestCase): | 62 class DescriptorPoolTest(unittest.TestCase): |
64 | 63 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 self.pool.FindFileContainingSymbol('Does not exist') | 111 self.pool.FindFileContainingSymbol('Does not exist') |
113 | 112 |
114 def testFindMessageTypeByName(self): | 113 def testFindMessageTypeByName(self): |
115 msg1 = self.pool.FindMessageTypeByName( | 114 msg1 = self.pool.FindMessageTypeByName( |
116 'google.protobuf.python.internal.Factory1Message') | 115 'google.protobuf.python.internal.Factory1Message') |
117 self.assertIsInstance(msg1, descriptor.Descriptor) | 116 self.assertIsInstance(msg1, descriptor.Descriptor) |
118 self.assertEqual('Factory1Message', msg1.name) | 117 self.assertEqual('Factory1Message', msg1.name) |
119 self.assertEqual('google.protobuf.python.internal.Factory1Message', | 118 self.assertEqual('google.protobuf.python.internal.Factory1Message', |
120 msg1.full_name) | 119 msg1.full_name) |
121 self.assertEqual(None, msg1.containing_type) | 120 self.assertEqual(None, msg1.containing_type) |
122 self.assertFalse(msg1.has_options) | |
123 | 121 |
124 nested_msg1 = msg1.nested_types[0] | 122 nested_msg1 = msg1.nested_types[0] |
125 self.assertEqual('NestedFactory1Message', nested_msg1.name) | 123 self.assertEqual('NestedFactory1Message', nested_msg1.name) |
126 self.assertEqual(msg1, nested_msg1.containing_type) | 124 self.assertEqual(msg1, nested_msg1.containing_type) |
127 | 125 |
128 nested_enum1 = msg1.enum_types[0] | 126 nested_enum1 = msg1.enum_types[0] |
129 self.assertEqual('NestedFactory1Enum', nested_enum1.name) | 127 self.assertEqual('NestedFactory1Enum', nested_enum1.name) |
130 self.assertEqual(msg1, nested_enum1.containing_type) | 128 self.assertEqual(msg1, nested_enum1.containing_type) |
131 | 129 |
132 self.assertEqual(nested_msg1, msg1.fields_by_name[ | 130 self.assertEqual(nested_msg1, msg1.fields_by_name[ |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 def testFindMessageTypeByNameFailure(self): | 194 def testFindMessageTypeByNameFailure(self): |
197 with self.assertRaises(KeyError): | 195 with self.assertRaises(KeyError): |
198 self.pool.FindMessageTypeByName('Does not exist') | 196 self.pool.FindMessageTypeByName('Does not exist') |
199 | 197 |
200 def testFindEnumTypeByName(self): | 198 def testFindEnumTypeByName(self): |
201 enum1 = self.pool.FindEnumTypeByName( | 199 enum1 = self.pool.FindEnumTypeByName( |
202 'google.protobuf.python.internal.Factory1Enum') | 200 'google.protobuf.python.internal.Factory1Enum') |
203 self.assertIsInstance(enum1, descriptor.EnumDescriptor) | 201 self.assertIsInstance(enum1, descriptor.EnumDescriptor) |
204 self.assertEqual(0, enum1.values_by_name['FACTORY_1_VALUE_0'].number) | 202 self.assertEqual(0, enum1.values_by_name['FACTORY_1_VALUE_0'].number) |
205 self.assertEqual(1, enum1.values_by_name['FACTORY_1_VALUE_1'].number) | 203 self.assertEqual(1, enum1.values_by_name['FACTORY_1_VALUE_1'].number) |
206 self.assertFalse(enum1.has_options) | |
207 | 204 |
208 nested_enum1 = self.pool.FindEnumTypeByName( | 205 nested_enum1 = self.pool.FindEnumTypeByName( |
209 'google.protobuf.python.internal.Factory1Message.NestedFactory1Enum') | 206 'google.protobuf.python.internal.Factory1Message.NestedFactory1Enum') |
210 self.assertIsInstance(nested_enum1, descriptor.EnumDescriptor) | 207 self.assertIsInstance(nested_enum1, descriptor.EnumDescriptor) |
211 self.assertEqual( | 208 self.assertEqual( |
212 0, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_0'].number) | 209 0, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_0'].number) |
213 self.assertEqual( | 210 self.assertEqual( |
214 1, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_1'].number) | 211 1, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_1'].number) |
215 | 212 |
216 enum2 = self.pool.FindEnumTypeByName( | 213 enum2 = self.pool.FindEnumTypeByName( |
(...skipping 12 matching lines...) Expand all Loading... |
229 | 226 |
230 def testFindEnumTypeByNameFailure(self): | 227 def testFindEnumTypeByNameFailure(self): |
231 with self.assertRaises(KeyError): | 228 with self.assertRaises(KeyError): |
232 self.pool.FindEnumTypeByName('Does not exist') | 229 self.pool.FindEnumTypeByName('Does not exist') |
233 | 230 |
234 def testFindFieldByName(self): | 231 def testFindFieldByName(self): |
235 field = self.pool.FindFieldByName( | 232 field = self.pool.FindFieldByName( |
236 'google.protobuf.python.internal.Factory1Message.list_value') | 233 'google.protobuf.python.internal.Factory1Message.list_value') |
237 self.assertEqual(field.name, 'list_value') | 234 self.assertEqual(field.name, 'list_value') |
238 self.assertEqual(field.label, field.LABEL_REPEATED) | 235 self.assertEqual(field.label, field.LABEL_REPEATED) |
239 self.assertFalse(field.has_options) | |
240 | |
241 with self.assertRaises(KeyError): | 236 with self.assertRaises(KeyError): |
242 self.pool.FindFieldByName('Does not exist') | 237 self.pool.FindFieldByName('Does not exist') |
243 | 238 |
244 def testFindExtensionByName(self): | 239 def testFindExtensionByName(self): |
245 # An extension defined in a message. | 240 # An extension defined in a message. |
246 extension = self.pool.FindExtensionByName( | 241 extension = self.pool.FindExtensionByName( |
247 'google.protobuf.python.internal.Factory2Message.one_more_field') | 242 'google.protobuf.python.internal.Factory2Message.one_more_field') |
248 self.assertEqual(extension.name, 'one_more_field') | 243 self.assertEqual(extension.name, 'one_more_field') |
249 # An extension defined at file scope. | 244 # An extension defined at file scope. |
250 extension = self.pool.FindExtensionByName( | 245 extension = self.pool.FindExtensionByName( |
251 'google.protobuf.python.internal.another_field') | 246 'google.protobuf.python.internal.another_field') |
252 self.assertEqual(extension.name, 'another_field') | 247 self.assertEqual(extension.name, 'another_field') |
253 self.assertEqual(extension.number, 1002) | 248 self.assertEqual(extension.number, 1002) |
254 with self.assertRaises(KeyError): | 249 with self.assertRaises(KeyError): |
255 self.pool.FindFieldByName('Does not exist') | 250 self.pool.FindFieldByName('Does not exist') |
256 | 251 |
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 | |
304 def testExtensionsAreNotFields(self): | 252 def testExtensionsAreNotFields(self): |
305 with self.assertRaises(KeyError): | 253 with self.assertRaises(KeyError): |
306 self.pool.FindFieldByName('google.protobuf.python.internal.another_field') | 254 self.pool.FindFieldByName('google.protobuf.python.internal.another_field') |
307 with self.assertRaises(KeyError): | 255 with self.assertRaises(KeyError): |
308 self.pool.FindFieldByName( | 256 self.pool.FindFieldByName( |
309 'google.protobuf.python.internal.Factory2Message.one_more_field') | 257 'google.protobuf.python.internal.Factory2Message.one_more_field') |
310 with self.assertRaises(KeyError): | 258 with self.assertRaises(KeyError): |
311 self.pool.FindExtensionByName( | 259 self.pool.FindExtensionByName( |
312 'google.protobuf.python.internal.Factory1Message.list_value') | 260 'google.protobuf.python.internal.Factory1Message.list_value') |
313 | 261 |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 expected_field_full_name = '.'.join([msg_desc.full_name, name]) | 440 expected_field_full_name = '.'.join([msg_desc.full_name, name]) |
493 test.assertEqual(expected_field_full_name, field_desc.full_name) | 441 test.assertEqual(expected_field_full_name, field_desc.full_name) |
494 test.assertEqual(index, field_desc.index) | 442 test.assertEqual(index, field_desc.index) |
495 test.assertEqual(self.number, field_desc.number) | 443 test.assertEqual(self.number, field_desc.number) |
496 test.assertEqual(descriptor.FieldDescriptor.TYPE_ENUM, field_desc.type) | 444 test.assertEqual(descriptor.FieldDescriptor.TYPE_ENUM, field_desc.type) |
497 test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_ENUM, | 445 test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_ENUM, |
498 field_desc.cpp_type) | 446 field_desc.cpp_type) |
499 test.assertTrue(field_desc.has_default_value) | 447 test.assertTrue(field_desc.has_default_value) |
500 test.assertEqual(enum_desc.values_by_name[self.default_value].number, | 448 test.assertEqual(enum_desc.values_by_name[self.default_value].number, |
501 field_desc.default_value) | 449 field_desc.default_value) |
502 test.assertFalse(enum_desc.values_by_name[self.default_value].has_options) | |
503 test.assertEqual(msg_desc, field_desc.containing_type) | 450 test.assertEqual(msg_desc, field_desc.containing_type) |
504 test.assertEqual(enum_desc, field_desc.enum_type) | 451 test.assertEqual(enum_desc, field_desc.enum_type) |
505 | 452 |
506 | 453 |
507 class MessageField(object): | 454 class MessageField(object): |
508 | 455 |
509 def __init__(self, number, type_name): | 456 def __init__(self, number, type_name): |
510 self.number = number | 457 self.number = number |
511 self.type_name = type_name | 458 self.type_name = type_name |
512 | 459 |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 pool = descriptor_pool.DescriptorPool() | 623 pool = descriptor_pool.DescriptorPool() |
677 file_desc = descriptor_pb2.FileDescriptorProto( | 624 file_desc = descriptor_pb2.FileDescriptorProto( |
678 name='some/file.proto', package='package') | 625 name='some/file.proto', package='package') |
679 file_desc.message_type.add(name='Message') | 626 file_desc.message_type.add(name='Message') |
680 pool.Add(file_desc) | 627 pool.Add(file_desc) |
681 self.assertEqual(pool.FindFileByName('some/file.proto').name, | 628 self.assertEqual(pool.FindFileByName('some/file.proto').name, |
682 'some/file.proto') | 629 'some/file.proto') |
683 self.assertEqual(pool.FindMessageTypeByName('package.Message').name, | 630 self.assertEqual(pool.FindMessageTypeByName('package.Message').name, |
684 'Message') | 631 'Message') |
685 | 632 |
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 | |
703 | 633 |
704 @unittest.skipIf( | 634 @unittest.skipIf( |
705 api_implementation.Type() != 'cpp', | 635 api_implementation.Type() != 'cpp', |
706 'default_pool is only supported by the C++ implementation') | 636 'default_pool is only supported by the C++ implementation') |
707 class DefaultPoolTest(unittest.TestCase): | 637 class DefaultPoolTest(unittest.TestCase): |
708 | 638 |
709 def testFindMethods(self): | 639 def testFindMethods(self): |
710 # pylint: disable=g-import-not-at-top | 640 # pylint: disable=g-import-not-at-top |
711 from google.protobuf.pyext import _message | 641 from google.protobuf.pyext import _message |
712 pool = _message.default_pool | 642 pool = _message.default_pool |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 ExtensionField(1001, 'DescriptorPoolTest1')), | 741 ExtensionField(1001, 'DescriptorPoolTest1')), |
812 ]), | 742 ]), |
813 }, | 743 }, |
814 dependencies=['google/protobuf/internal/descriptor_pool_test1.proto', | 744 dependencies=['google/protobuf/internal/descriptor_pool_test1.proto', |
815 'google/protobuf/internal/more_messages.proto'], | 745 'google/protobuf/internal/more_messages.proto'], |
816 public_dependencies=['google/protobuf/internal/more_messages.proto']) | 746 public_dependencies=['google/protobuf/internal/more_messages.proto']) |
817 | 747 |
818 | 748 |
819 if __name__ == '__main__': | 749 if __name__ == '__main__': |
820 unittest.main() | 750 unittest.main() |
OLD | NEW |