descriptor_pool_test.py
Go to the documentation of this file.
1 #! /usr/bin/env python
2 #
3 # Protocol Buffers - Google's data interchange format
4 # Copyright 2008 Google Inc. All rights reserved.
5 # https://developers.google.com/protocol-buffers/
6 #
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions are
9 # met:
10 #
11 # * Redistributions of source code must retain the above copyright
12 # notice, this list of conditions and the following disclaimer.
13 # * Redistributions in binary form must reproduce the above
14 # copyright notice, this list of conditions and the following disclaimer
15 # in the documentation and/or other materials provided with the
16 # distribution.
17 # * Neither the name of Google Inc. nor the names of its
18 # contributors may be used to endorse or promote products derived from
19 # this software without specific prior written permission.
20 #
21 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 
33 """Tests for google.protobuf.descriptor_pool."""
34 
35 __author__ = 'matthewtoia@google.com (Matt Toia)'
36 
37 import copy
38 import os
39 
40 try:
41  import unittest2 as unittest #PY26
42 except ImportError:
43  import unittest
44 
45 from google.protobuf import unittest_import_pb2
46 from google.protobuf import unittest_import_public_pb2
47 from google.protobuf import unittest_pb2
48 from google.protobuf import descriptor_pb2
49 from google.protobuf.internal import api_implementation
50 from google.protobuf.internal import descriptor_pool_test1_pb2
51 from google.protobuf.internal import descriptor_pool_test2_pb2
52 from google.protobuf.internal import factory_test1_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
56 from google.protobuf.internal import no_package_pb2
57 from google.protobuf.internal import testing_refleaks
58 from google.protobuf import descriptor
59 from google.protobuf import descriptor_database
60 from google.protobuf import descriptor_pool
61 from google.protobuf import message_factory
62 from google.protobuf import symbol_database
63 
64 
65 
66 class DescriptorPoolTestBase(object):
67 
68  def testFindFileByName(self):
69  name1 = 'google/protobuf/internal/factory_test1.proto'
70  file_desc1 = self.pool.FindFileByName(name1)
71  self.assertIsInstance(file_desc1, descriptor.FileDescriptor)
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)
75 
76  name2 = 'google/protobuf/internal/factory_test2.proto'
77  file_desc2 = self.pool.FindFileByName(name2)
78  self.assertIsInstance(file_desc2, descriptor.FileDescriptor)
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)
82 
84  with self.assertRaises(KeyError):
85  self.pool.FindFileByName('Does not exist')
86 
88  file_desc1 = self.pool.FindFileContainingSymbol(
89  'google.protobuf.python.internal.Factory1Message')
90  self.assertIsInstance(file_desc1, descriptor.FileDescriptor)
91  self.assertEqual('google/protobuf/internal/factory_test1.proto',
92  file_desc1.name)
93  self.assertEqual('google.protobuf.python.internal', file_desc1.package)
94  self.assertIn('Factory1Message', file_desc1.message_types_by_name)
95 
96  file_desc2 = self.pool.FindFileContainingSymbol(
97  'google.protobuf.python.internal.Factory2Message')
98  self.assertIsInstance(file_desc2, descriptor.FileDescriptor)
99  self.assertEqual('google/protobuf/internal/factory_test2.proto',
100  file_desc2.name)
101  self.assertEqual('google.protobuf.python.internal', file_desc2.package)
102  self.assertIn('Factory2Message', file_desc2.message_types_by_name)
103 
104  # Tests top level extension.
105  file_desc3 = self.pool.FindFileContainingSymbol(
106  'google.protobuf.python.internal.another_field')
107  self.assertIsInstance(file_desc3, descriptor.FileDescriptor)
108  self.assertEqual('google/protobuf/internal/factory_test2.proto',
109  file_desc3.name)
110 
111  # Tests nested extension inside a message.
112  file_desc4 = self.pool.FindFileContainingSymbol(
113  'google.protobuf.python.internal.Factory2Message.one_more_field')
114  self.assertIsInstance(file_desc4, descriptor.FileDescriptor)
115  self.assertEqual('google/protobuf/internal/factory_test2.proto',
116  file_desc4.name)
117 
118  file_desc5 = self.pool.FindFileContainingSymbol(
119  'protobuf_unittest.TestService')
120  self.assertIsInstance(file_desc5, descriptor.FileDescriptor)
121  self.assertEqual('google/protobuf/unittest.proto',
122  file_desc5.name)
123  # Tests the generated pool.
124  assert descriptor_pool.Default().FindFileContainingSymbol(
125  'google.protobuf.python.internal.Factory2Message.one_more_field')
126  assert descriptor_pool.Default().FindFileContainingSymbol(
127  'google.protobuf.python.internal.another_field')
128  assert descriptor_pool.Default().FindFileContainingSymbol(
129  'protobuf_unittest.TestService')
130 
131  # Can find field.
132  file_desc6 = self.pool.FindFileContainingSymbol(
133  'google.protobuf.python.internal.Factory1Message.list_value')
134  self.assertIsInstance(file_desc6, descriptor.FileDescriptor)
135  self.assertEqual('google/protobuf/internal/factory_test1.proto',
136  file_desc6.name)
137 
138  # Can find top level Enum value.
139  file_desc7 = self.pool.FindFileContainingSymbol(
140  'google.protobuf.python.internal.FACTORY_1_VALUE_0')
141  self.assertIsInstance(file_desc7, descriptor.FileDescriptor)
142  self.assertEqual('google/protobuf/internal/factory_test1.proto',
143  file_desc7.name)
144 
145  # Can find nested Enum value.
146  file_desc8 = self.pool.FindFileContainingSymbol(
147  'protobuf_unittest.TestAllTypes.FOO')
148  self.assertIsInstance(file_desc8, descriptor.FileDescriptor)
149  self.assertEqual('google/protobuf/unittest.proto',
150  file_desc8.name)
151 
152  # TODO(jieluo): Add tests for no package when b/13860351 is fixed.
153 
154  self.assertRaises(KeyError, self.pool.FindFileContainingSymbol,
155  'google.protobuf.python.internal.Factory1Message.none_field')
156 
158  with self.assertRaises(KeyError):
159  self.pool.FindFileContainingSymbol('Does not exist')
160 
162  msg1 = self.pool.FindMessageTypeByName(
163  'google.protobuf.python.internal.Factory1Message')
164  self.assertIsInstance(msg1, descriptor.Descriptor)
165  self.assertEqual('Factory1Message', msg1.name)
166  self.assertEqual('google.protobuf.python.internal.Factory1Message',
167  msg1.full_name)
168  self.assertEqual(None, msg1.containing_type)
169  self.assertFalse(msg1.has_options)
170 
171  nested_msg1 = msg1.nested_types[0]
172  self.assertEqual('NestedFactory1Message', nested_msg1.name)
173  self.assertEqual(msg1, nested_msg1.containing_type)
174 
175  nested_enum1 = msg1.enum_types[0]
176  self.assertEqual('NestedFactory1Enum', nested_enum1.name)
177  self.assertEqual(msg1, nested_enum1.containing_type)
178 
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)
183 
184  msg2 = self.pool.FindMessageTypeByName(
185  'google.protobuf.python.internal.Factory2Message')
186  self.assertIsInstance(msg2, descriptor.Descriptor)
187  self.assertEqual('Factory2Message', msg2.name)
188  self.assertEqual('google.protobuf.python.internal.Factory2Message',
189  msg2.full_name)
190  self.assertIsNone(msg2.containing_type)
191 
192  nested_msg2 = msg2.nested_types[0]
193  self.assertEqual('NestedFactory2Message', nested_msg2.name)
194  self.assertEqual(msg2, nested_msg2.containing_type)
195 
196  nested_enum2 = msg2.enum_types[0]
197  self.assertEqual('NestedFactory2Enum', nested_enum2.name)
198  self.assertEqual(msg2, nested_enum2.containing_type)
199 
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)
204 
205  self.assertTrue(msg2.fields_by_name['int_with_default'].has_default_value)
206  self.assertEqual(
207  1776, msg2.fields_by_name['int_with_default'].default_value)
208 
209  self.assertTrue(
210  msg2.fields_by_name['double_with_default'].has_default_value)
211  self.assertEqual(
212  9.99, msg2.fields_by_name['double_with_default'].default_value)
213 
214  self.assertTrue(
215  msg2.fields_by_name['string_with_default'].has_default_value)
216  self.assertEqual(
217  'hello world', msg2.fields_by_name['string_with_default'].default_value)
218 
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)
221 
222  self.assertTrue(msg2.fields_by_name['enum_with_default'].has_default_value)
223  self.assertEqual(
224  1, msg2.fields_by_name['enum_with_default'].default_value)
225 
226  msg3 = self.pool.FindMessageTypeByName(
227  'google.protobuf.python.internal.Factory2Message.NestedFactory2Message')
228  self.assertEqual(nested_msg2, msg3)
229 
230  self.assertTrue(msg2.fields_by_name['bytes_with_default'].has_default_value)
231  self.assertEqual(
232  b'a\xfb\x00c',
233  msg2.fields_by_name['bytes_with_default'].default_value)
234 
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)
242 
244  self.assertRaises(TypeError, self.pool.FindExtensionByNumber, '')
245  self.assertRaises(KeyError, self.pool.FindMethodByName, '')
246 
247  # TODO(jieluo): Fix python to raise correct errors.
248  if api_implementation.Type() == 'cpp':
249  error_type = TypeError
250  else:
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)
263 
265  with self.assertRaises(KeyError):
266  self.pool.FindMessageTypeByName('Does not exist')
267 
269  enum1 = self.pool.FindEnumTypeByName(
270  'google.protobuf.python.internal.Factory1Enum')
271  self.assertIsInstance(enum1, descriptor.EnumDescriptor)
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)
275 
276  nested_enum1 = self.pool.FindEnumTypeByName(
277  'google.protobuf.python.internal.Factory1Message.NestedFactory1Enum')
278  self.assertIsInstance(nested_enum1, descriptor.EnumDescriptor)
279  self.assertEqual(
280  0, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_0'].number)
281  self.assertEqual(
282  1, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_1'].number)
283 
284  enum2 = self.pool.FindEnumTypeByName(
285  'google.protobuf.python.internal.Factory2Enum')
286  self.assertIsInstance(enum2, descriptor.EnumDescriptor)
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)
289 
290  nested_enum2 = self.pool.FindEnumTypeByName(
291  'google.protobuf.python.internal.Factory2Message.NestedFactory2Enum')
292  self.assertIsInstance(nested_enum2, descriptor.EnumDescriptor)
293  self.assertEqual(
294  0, nested_enum2.values_by_name['NESTED_FACTORY_2_VALUE_0'].number)
295  self.assertEqual(
296  1, nested_enum2.values_by_name['NESTED_FACTORY_2_VALUE_1'].number)
297 
299  with self.assertRaises(KeyError):
300  self.pool.FindEnumTypeByName('Does not exist')
301 
303  field = self.pool.FindFieldByName(
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)
308 
309  with self.assertRaises(KeyError):
310  self.pool.FindFieldByName('Does not exist')
311 
313  oneof = self.pool.FindOneofByName(
314  'google.protobuf.python.internal.Factory2Message.oneof_field')
315  self.assertEqual(oneof.name, 'oneof_field')
316  with self.assertRaises(KeyError):
317  self.pool.FindOneofByName('Does not exist')
318 
320  # An extension defined in a message.
321  extension = self.pool.FindExtensionByName(
322  'google.protobuf.python.internal.Factory2Message.one_more_field')
323  self.assertEqual(extension.name, 'one_more_field')
324  # An extension defined at file scope.
325  extension = self.pool.FindExtensionByName(
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):
330  self.pool.FindFieldByName('Does not exist')
331 
333  factory1_message = self.pool.FindMessageTypeByName(
334  'google.protobuf.python.internal.Factory1Message')
335  factory2_message = self.pool.FindMessageTypeByName(
336  'google.protobuf.python.internal.Factory2Message')
337  # An extension defined in a message.
338  one_more_field = factory2_message.extensions_by_name['one_more_field']
339  self.pool.AddExtensionDescriptor(one_more_field)
340  # An extension defined at file scope.
341  factory_test2 = self.pool.FindFileByName(
342  'google/protobuf/internal/factory_test2.proto')
343  another_field = factory_test2.extensions_by_name['another_field']
344  self.pool.AddExtensionDescriptor(another_field)
345 
346  extensions = self.pool.FindAllExtensions(factory1_message)
347  expected_extension_numbers = set([one_more_field, another_field])
348  self.assertEqual(expected_extension_numbers, set(extensions))
349  # Verify that mutating the returned list does not affect the pool.
350  extensions.append('unexpected_element')
351  # Get the extensions again, the returned value does not contain the
352  # 'unexpected_element'.
353  extensions = self.pool.FindAllExtensions(factory1_message)
354  self.assertEqual(expected_extension_numbers, set(extensions))
355 
357  factory1_message = self.pool.FindMessageTypeByName(
358  'google.protobuf.python.internal.Factory1Message')
359  factory2_message = self.pool.FindMessageTypeByName(
360  'google.protobuf.python.internal.Factory2Message')
361  # An extension defined in a message.
362  one_more_field = factory2_message.extensions_by_name['one_more_field']
363  self.pool.AddExtensionDescriptor(one_more_field)
364  # An extension defined at file scope.
365  factory_test2 = self.pool.FindFileByName(
366  'google/protobuf/internal/factory_test2.proto')
367  another_field = factory_test2.extensions_by_name['another_field']
368  self.pool.AddExtensionDescriptor(another_field)
369 
370  # An extension defined in a message.
371  extension = self.pool.FindExtensionByNumber(factory1_message, 1001)
372  self.assertEqual(extension.name, 'one_more_field')
373  # An extension defined at file scope.
374  extension = self.pool.FindExtensionByNumber(factory1_message, 1002)
375  self.assertEqual(extension.name, 'another_field')
376  with self.assertRaises(KeyError):
377  extension = self.pool.FindExtensionByNumber(factory1_message, 1234567)
378 
380  with self.assertRaises(KeyError):
381  self.pool.FindFieldByName('google.protobuf.python.internal.another_field')
382  with self.assertRaises(KeyError):
383  self.pool.FindFieldByName(
384  'google.protobuf.python.internal.Factory2Message.one_more_field')
385  with self.assertRaises(KeyError):
387  'google.protobuf.python.internal.Factory1Message.list_value')
388 
389  def testFindService(self):
390  service = self.pool.FindServiceByName('protobuf_unittest.TestService')
391  self.assertEqual(service.full_name, 'protobuf_unittest.TestService')
392  with self.assertRaises(KeyError):
393  self.pool.FindServiceByName('Does not exist')
394 
395  method = self.pool.FindMethodByName('protobuf_unittest.TestService.Foo')
396  self.assertIs(method.containing_service, service)
397  with self.assertRaises(KeyError):
398  self.pool.FindMethodByName('protobuf_unittest.TestService.Doesnotexist')
399 
400  def testUserDefinedDB(self):
403  db.Add(self.factory_test1_fd)
404  db.Add(self.factory_test2_fd)
406 
408  if isinstance(self, SecondaryDescriptorFromDescriptorDB):
409  if api_implementation.Type() == 'cpp':
410  # Cpp extension cannot call Add on a DescriptorPool
411  # that uses a DescriptorDatabase.
412  # TODO(jieluo): Fix python and cpp extension diff.
413  return
415  self.pool.AddSerializedFile(self.factory_test1_fd.SerializeToString())
416  self.pool.AddSerializedFile(self.factory_test2_fd.SerializeToString())
418 
419 
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']
426  .default_value)
427  self.assertEqual(default_value,
428  descriptor_pool_test1_pb2.DescriptorPoolTest1.BETA)
429  # First check what the generated descriptor contains.
430  _CheckDefaultValue(descriptor_pool_test1_pb2.DESCRIPTOR)
431  # Then check the generated pool. Normally this is the same 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)
436 
437  if isinstance(self, SecondaryDescriptorFromDescriptorDB):
438  if api_implementation.Type() == 'cpp':
439  # Cpp extension cannot call Add on a DescriptorPool
440  # that uses a DescriptorDatabase.
441  # TODO(jieluo): Fix python and cpp extension diff.
442  return
443  # Then check the dynamic pool and its internal DescriptorDatabase.
444  descriptor_proto = descriptor_pb2.FileDescriptorProto.FromString(
445  descriptor_pool_test1_pb2.DESCRIPTOR.serialized_pb)
446  self.pool.Add(descriptor_proto)
447  # And do the same check as above
448  file_descriptor = self.pool.FindFileByName(
449  'google/protobuf/internal/descriptor_pool_test1.proto')
450  _CheckDefaultValue(file_descriptor)
451 
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)
457 
458  def _CheckDefaultValues(msg):
459  try:
460  int64 = long
461  except NameError: # Python3
462  int64 = int
463  try:
464  unicode_type = unicode
465  except NameError: # Python3
466  unicode_type = str
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)
475  # First for the generated message
476  _CheckDefaultValues(unittest_pb2.TestAllTypes())
477  # Then for a message built with from the DescriptorPool.
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))
485  message_class = message_factory.MessageFactory(pool).GetPrototype(
486  pool.FindMessageTypeByName(
487  unittest_pb2.TestAllTypes.DESCRIPTOR.full_name))
488  _CheckDefaultValues(message_class())
489 
491  if isinstance(self, SecondaryDescriptorFromDescriptorDB):
492  if api_implementation.Type() == 'cpp':
493  # Cpp extension cannot call Add on a DescriptorPool
494  # that uses a DescriptorDatabase.
495  # TODO(jieluo): Fix python and cpp extension diff.
496  return
497  file_desc = descriptor_pb2.FileDescriptorProto(name='some/file.proto')
498  self.pool.Add(file_desc)
499  self.pool.AddSerializedFile(file_desc.SerializeToString())
500 
502  if isinstance(self, SecondaryDescriptorFromDescriptorDB):
503  if api_implementation.Type() == 'cpp':
504  # Cpp extension cannot call Add on a DescriptorPool
505  # that uses a DescriptorDatabase.
506  # TODO(jieluo): Fix python and cpp extension diff.
507  return
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)
515  self.pool.Add(test1_desc)
516  self.pool.Add(test2_desc)
517  TEST1_FILE.CheckFile(self, self.pool)
518  TEST2_FILE.CheckFile(self, self.pool)
519 
521  if isinstance(self, SecondaryDescriptorFromDescriptorDB):
522  if api_implementation.Type() == 'cpp':
523  # Cpp extension cannot call Add on a DescriptorPool
524  # that uses a DescriptorDatabase.
525  # TODO(jieluo): Fix python and cpp extension diff.
526  return
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':
532  pass
533  else:
534  pool = copy.deepcopy(self.pool)
535  file_descriptor = unittest_pb2.DESCRIPTOR
536  pool.AddDescriptor(
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)
549 
550 
551 @testing_refleaks.TestCase
553 
554  def setUp(self):
555  self.pool = descriptor_pool.Default()
556  self.factory_test1_fd = descriptor_pb2.FileDescriptorProto.FromString(
557  factory_test1_pb2.DESCRIPTOR.serialized_pb)
558  self.factory_test2_fd = descriptor_pb2.FileDescriptorProto.FromString(
559  factory_test2_pb2.DESCRIPTOR.serialized_pb)
560 
561  def testFindMethods(self):
562  self.assertIs(
563  self.pool.FindFileByName('google/protobuf/unittest.proto'),
564  unittest_pb2.DESCRIPTOR)
565  self.assertIs(
566  self.pool.FindMessageTypeByName('protobuf_unittest.TestAllTypes'),
567  unittest_pb2.TestAllTypes.DESCRIPTOR)
568  self.assertIs(
569  self.pool.FindFieldByName(
570  'protobuf_unittest.TestAllTypes.optional_int32'),
571  unittest_pb2.TestAllTypes.DESCRIPTOR.fields_by_name['optional_int32'])
572  self.assertIs(
573  self.pool.FindEnumTypeByName('protobuf_unittest.ForeignEnum'),
574  unittest_pb2.ForeignEnum.DESCRIPTOR)
575  self.assertIs(
577  'protobuf_unittest.optional_int32_extension'),
578  unittest_pb2.DESCRIPTOR.extensions_by_name['optional_int32_extension'])
579  self.assertIs(
580  self.pool.FindOneofByName('protobuf_unittest.TestAllTypes.oneof_field'),
581  unittest_pb2.TestAllTypes.DESCRIPTOR.oneofs_by_name['oneof_field'])
582  self.assertIs(
583  self.pool.FindServiceByName('protobuf_unittest.TestService'),
584  unittest_pb2.DESCRIPTOR.services_by_name['TestService'])
585 
586 
587 @testing_refleaks.TestCase
589 
590  def setUp(self):
592  self.factory_test1_fd = descriptor_pb2.FileDescriptorProto.FromString(
593  factory_test1_pb2.DESCRIPTOR.serialized_pb)
594  self.factory_test2_fd = descriptor_pb2.FileDescriptorProto.FromString(
595  factory_test2_pb2.DESCRIPTOR.serialized_pb)
596  self.pool.Add(self.factory_test1_fd)
597  self.pool.Add(self.factory_test2_fd)
598 
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))
607 
608 
609 @testing_refleaks.TestCase
611  unittest.TestCase):
612 
613  def setUp(self):
614  self.factory_test1_fd = descriptor_pb2.FileDescriptorProto.FromString(
615  factory_test1_pb2.DESCRIPTOR.serialized_pb)
616  self.factory_test2_fd = descriptor_pb2.FileDescriptorProto.FromString(
617  factory_test2_pb2.DESCRIPTOR.serialized_pb)
619  self.db.Add(self.factory_test1_fd)
620  self.db.Add(self.factory_test2_fd)
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))
629  self.pool = descriptor_pool.DescriptorPool(descriptor_db=self.db)
630 
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()
638  field.number = 1
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)
651 
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:
658  self.pool.FindFileByName('none_file')
659  self.assertIn(str(exc.exception), ('\'none_file\'',
660  '\"Couldn\'t find file none_file\"'))
661 
662  # Pure python _ConvertFileProtoToFileDescriptor() method has side effect
663  # that all the symbols found in the file will load into the pool even the
664  # file can not build. So when FindMessageTypeByName('ErrorMessage') was
665  # called the first time, a KeyError will be raised but call the find
666  # method later will return a descriptor which is not build.
667  # TODO(jieluo): fix pure python to revert the load if file can not be build
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)
677 
678  with self.assertRaises(KeyError) as exc:
679  self.pool.FindFieldByName('collector.ErrorMessage.nested_message_field')
680  self.assertEqual(str(exc.exception), '\'Couldn\\\'t build file for field'
681  ' collector.ErrorMessage.nested_message_field\\n'
682  + error_msg)
683 
684  with self.assertRaises(KeyError) as exc:
685  self.pool.FindEnumTypeByName('collector.MyEnum')
686  self.assertEqual(str(exc.exception), '\'Couldn\\\'t build file for enum'
687  ' collector.MyEnum\\n' + error_msg)
688 
689  with self.assertRaises(KeyError) as exc:
690  self.pool.FindFileContainingSymbol('collector.MyEnumValue')
691  self.assertEqual(str(exc.exception), '\'Couldn\\\'t build file for symbol'
692  ' collector.MyEnumValue\\n' + error_msg)
693 
694  with self.assertRaises(KeyError) as exc:
695  self.pool.FindOneofByName('collector.ErrorMessage.MyOneof')
696  self.assertEqual(str(exc.exception), '\'Couldn\\\'t build file for oneof'
697  ' collector.ErrorMessage.MyOneof\\n' + error_msg)
698 
699 
700 class ProtoFile(object):
701 
702  def __init__(self, name, package, messages, dependencies=None,
703  public_dependencies=None):
704  self.name = name
705  self.package = package
706  self.messages = messages
707  self.dependencies = dependencies or []
708  self.public_dependencies = public_dependencies or []
709 
710  def CheckFile(self, test, pool):
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]
715  test.assertEqual(self.dependencies, dependencies_names)
716  public_dependencies_names = [f.name for f in file_desc.public_dependencies]
717  test.assertEqual(self.public_dependencies, public_dependencies_names)
718  for name, msg_type in self.messages.items():
719  msg_type.CheckType(test, None, name, file_desc)
720 
721 
722 class EnumType(object):
723 
724  def __init__(self, values):
725  self.values = values
726 
727  def CheckType(self, test, msg_desc, 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)
741 
742 
743 class MessageType(object):
744 
745  def __init__(self, type_dict, field_list, is_extendable=False,
746  extensions=None):
747  self.type_dict = type_dict
748  self.field_list = field_list
749  self.is_extendable = is_extendable
750  self.extensions = extensions or []
751 
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])
756  else:
757  desc = containing_type_desc.nested_types_by_name[name]
758  expected_full_name = '.'.join([containing_type_desc.full_name, name])
759 
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)
764  test.assertEqual(self.is_extendable, desc.is_extendable)
765  for name, subtype in self.type_dict.items():
766  subtype.CheckType(test, desc, name, file_desc)
767 
768  for index, (name, field) in enumerate(self.field_list):
769  field.CheckField(test, desc, name, index, file_desc)
770 
771  for index, (name, field) in enumerate(self.extensions):
772  field.CheckField(test, desc, name, index, file_desc)
773 
774 
775 class EnumField(object):
776 
777  def __init__(self, number, type_name, default_value):
778  self.number = number
779  self.type_name = type_name
780  self.default_value = default_value
781 
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,
792  field_desc.cpp_type)
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)
800 
801 
802 class MessageField(object):
803 
804  def __init__(self, number, type_name):
805  self.number = number
806  self.type_name = type_name
807 
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,
818  field_desc.cpp_type)
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)
824 
825 
826 class StringField(object):
827 
828  def __init__(self, number, default_value):
829  self.number = number
830  self.default_value = default_value
831 
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,
841  field_desc.cpp_type)
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)
845 
846 
847 class ExtensionField(object):
848 
849  def __init__(self, number, extended_type):
850  self.number = number
851  self.extended_type = extended_type
852 
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,
862  field_desc.cpp_type)
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)
869 
870 
871 @testing_refleaks.TestCase
872 class AddDescriptorTest(unittest.TestCase):
873 
874  def _TestMessage(self, prefix):
876  pool.AddDescriptor(unittest_pb2.TestAllTypes.DESCRIPTOR)
877  self.assertEqual(
878  'protobuf_unittest.TestAllTypes',
879  pool.FindMessageTypeByName(
880  prefix + 'protobuf_unittest.TestAllTypes').full_name)
881 
882  # AddDescriptor is not recursive.
883  with self.assertRaises(KeyError):
884  pool.FindMessageTypeByName(
885  prefix + 'protobuf_unittest.TestAllTypes.NestedMessage')
886 
887  pool.AddDescriptor(unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR)
888  self.assertEqual(
889  'protobuf_unittest.TestAllTypes.NestedMessage',
890  pool.FindMessageTypeByName(
891  prefix + 'protobuf_unittest.TestAllTypes.NestedMessage').full_name)
892 
893  # Files are implicitly also indexed when messages are added.
894  self.assertEqual(
895  'google/protobuf/unittest.proto',
896  pool.FindFileByName(
897  'google/protobuf/unittest.proto').name)
898 
899  self.assertEqual(
900  'google/protobuf/unittest.proto',
901  pool.FindFileContainingSymbol(
902  prefix + 'protobuf_unittest.TestAllTypes.NestedMessage').name)
903 
904  @unittest.skipIf(api_implementation.Type() == 'cpp',
905  'With the cpp implementation, Add() must be called first')
906  def testMessage(self):
907  self._TestMessage('')
908  self._TestMessage('.')
909 
910  def _TestEnum(self, prefix):
912  pool.AddEnumDescriptor(unittest_pb2.ForeignEnum.DESCRIPTOR)
913  self.assertEqual(
914  'protobuf_unittest.ForeignEnum',
915  pool.FindEnumTypeByName(
916  prefix + 'protobuf_unittest.ForeignEnum').full_name)
917 
918  # AddEnumDescriptor is not recursive.
919  with self.assertRaises(KeyError):
920  pool.FindEnumTypeByName(
921  prefix + 'protobuf_unittest.ForeignEnum.NestedEnum')
922 
923  pool.AddEnumDescriptor(unittest_pb2.TestAllTypes.NestedEnum.DESCRIPTOR)
924  self.assertEqual(
925  'protobuf_unittest.TestAllTypes.NestedEnum',
926  pool.FindEnumTypeByName(
927  prefix + 'protobuf_unittest.TestAllTypes.NestedEnum').full_name)
928 
929  # Files are implicitly also indexed when enums are added.
930  self.assertEqual(
931  'google/protobuf/unittest.proto',
932  pool.FindFileByName(
933  'google/protobuf/unittest.proto').name)
934 
935  self.assertEqual(
936  'google/protobuf/unittest.proto',
937  pool.FindFileContainingSymbol(
938  prefix + 'protobuf_unittest.TestAllTypes.NestedEnum').name)
939 
940  @unittest.skipIf(api_implementation.Type() == 'cpp',
941  'With the cpp implementation, Add() must be called first')
942  def testEnum(self):
943  self._TestEnum('')
944  self._TestEnum('.')
945 
946  @unittest.skipIf(api_implementation.Type() == 'cpp',
947  'With the cpp implementation, Add() must be called first')
948  def testService(self):
950  with self.assertRaises(KeyError):
951  pool.FindServiceByName('protobuf_unittest.TestService')
952  pool.AddServiceDescriptor(unittest_pb2._TESTSERVICE)
953  self.assertEqual(
954  'protobuf_unittest.TestService',
955  pool.FindServiceByName('protobuf_unittest.TestService').full_name)
956 
957  @unittest.skipIf(api_implementation.Type() == 'cpp',
958  'With the cpp implementation, Add() must be called first')
959  def testFile(self):
961  pool.AddFileDescriptor(unittest_pb2.DESCRIPTOR)
962  self.assertEqual(
963  'google/protobuf/unittest.proto',
964  pool.FindFileByName(
965  'google/protobuf/unittest.proto').name)
966 
967  # AddFileDescriptor is not recursive; messages and enums within files must
968  # be explicitly registered.
969  with self.assertRaises(KeyError):
970  pool.FindFileContainingSymbol(
971  'protobuf_unittest.TestAllTypes')
972 
974  # Check that an empty DescriptorPool() contains no messages.
976  proto_file_name = descriptor_pb2.DESCRIPTOR.name
977  self.assertRaises(KeyError, pool.FindFileByName, proto_file_name)
978  # Add the above file to the pool
979  file_descriptor = descriptor_pb2.FileDescriptorProto()
980  descriptor_pb2.DESCRIPTOR.CopyToProto(file_descriptor)
981  pool.Add(file_descriptor)
982  # Now it exists.
983  self.assertTrue(pool.FindFileByName(proto_file_name))
984 
986  # Create a new pool, and add a file descriptor.
988  file_desc = descriptor_pb2.FileDescriptorProto(
989  name='some/file.proto', package='package')
990  file_desc.message_type.add(name='Message')
991  pool.Add(file_desc)
992  self.assertEqual(pool.FindFileByName('some/file.proto').name,
993  'some/file.proto')
994  self.assertEqual(pool.FindMessageTypeByName('package.Message').name,
995  'Message')
996  # Test no package
997  file_proto = descriptor_pb2.FileDescriptorProto(
998  name='some/filename/container.proto')
999  message_proto = file_proto.message_type.add(
1000  name='TopMessage')
1001  message_proto.field.add(
1002  name='bb',
1003  number=1,
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)
1015 
1017  # Create a descriptor pool, and add a new FileDescriptorProto to it.
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)
1024  # The options set on the FileDescriptorProto should be available in the
1025  # descriptor even if they contain extensions that cannot be deserialized
1026  # using the pool.
1027  file_descriptor = pool.FindFileByName(file_name)
1028  options = file_descriptor.GetOptions()
1029  self.assertEqual('foo', options.Extensions[extension_id].foo_name)
1030  # The object returned by GetOptions() is cached.
1031  self.assertIs(options, file_descriptor.GetOptions())
1032 
1033  def testAddTypeError(self):
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)
1045 
1046 
1047 TEST1_FILE = ProtoFile(
1048  'google/protobuf/internal/descriptor_pool_test1.proto',
1049  'google.protobuf.python.internal',
1050  {
1051  'DescriptorPoolTest1': MessageType({
1052  'NestedEnum': EnumType([('ALPHA', 1), ('BETA', 2)]),
1053  'NestedMessage': MessageType({
1054  'NestedEnum': EnumType([('EPSILON', 5), ('ZETA', 6)]),
1055  'DeepNestedMessage': MessageType({
1056  'NestedEnum': EnumType([('ETA', 7), ('THETA', 8)]),
1057  }, [
1058  ('nested_enum', EnumField(1, 'NestedEnum', 'ETA')),
1059  ('nested_field', StringField(2, 'theta')),
1060  ]),
1061  }, [
1062  ('nested_enum', EnumField(1, 'NestedEnum', 'ZETA')),
1063  ('nested_field', StringField(2, 'beta')),
1064  ('deep_nested_message', MessageField(3, 'DeepNestedMessage')),
1065  ])
1066  }, [
1067  ('nested_enum', EnumField(1, 'NestedEnum', 'BETA')),
1068  ('nested_message', MessageField(2, 'NestedMessage')),
1069  ], is_extendable=True),
1070 
1071  'DescriptorPoolTest2': MessageType({
1072  'NestedEnum': EnumType([('GAMMA', 3), ('DELTA', 4)]),
1073  'NestedMessage': MessageType({
1074  'NestedEnum': EnumType([('IOTA', 9), ('KAPPA', 10)]),
1075  'DeepNestedMessage': MessageType({
1076  'NestedEnum': EnumType([('LAMBDA', 11), ('MU', 12)]),
1077  }, [
1078  ('nested_enum', EnumField(1, 'NestedEnum', 'MU')),
1079  ('nested_field', StringField(2, 'lambda')),
1080  ]),
1081  }, [
1082  ('nested_enum', EnumField(1, 'NestedEnum', 'IOTA')),
1083  ('nested_field', StringField(2, 'delta')),
1084  ('deep_nested_message', MessageField(3, 'DeepNestedMessage')),
1085  ])
1086  }, [
1087  ('nested_enum', EnumField(1, 'NestedEnum', 'GAMMA')),
1088  ('nested_message', MessageField(2, 'NestedMessage')),
1089  ]),
1090  })
1091 
1092 
1093 TEST2_FILE = ProtoFile(
1094  'google/protobuf/internal/descriptor_pool_test2.proto',
1095  'google.protobuf.python.internal',
1096  {
1097  'DescriptorPoolTest3': MessageType({
1098  'NestedEnum': EnumType([('NU', 13), ('XI', 14)]),
1099  'NestedMessage': MessageType({
1100  'NestedEnum': EnumType([('OMICRON', 15), ('PI', 16)]),
1101  'DeepNestedMessage': MessageType({
1102  'NestedEnum': EnumType([('RHO', 17), ('SIGMA', 18)]),
1103  }, [
1104  ('nested_enum', EnumField(1, 'NestedEnum', 'RHO')),
1105  ('nested_field', StringField(2, 'sigma')),
1106  ]),
1107  }, [
1108  ('nested_enum', EnumField(1, 'NestedEnum', 'PI')),
1109  ('nested_field', StringField(2, 'nu')),
1110  ('deep_nested_message', MessageField(3, 'DeepNestedMessage')),
1111  ])
1112  }, [
1113  ('nested_enum', EnumField(1, 'NestedEnum', 'XI')),
1114  ('nested_message', MessageField(2, 'NestedMessage')),
1115  ], extensions=[
1116  ('descriptor_pool_test',
1117  ExtensionField(1001, 'DescriptorPoolTest1')),
1118  ]),
1119  },
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'])
1123 
1124 
1125 if __name__ == '__main__':
1126  unittest.main()
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindFileByName
def testFindFileByName(self)
Definition: descriptor_pool_test.py:68
google::protobuf::python::cdescriptor_pool::FindEnumTypeByName
PyObject * FindEnumTypeByName(PyDescriptorPool *self, PyObject *arg)
Definition: descriptor_pool.cc:318
google::protobuf.internal.descriptor_pool_test.AddDescriptorTest
Definition: descriptor_pool_test.py:872
google::protobuf::python::cdescriptor_pool::FindOneofByName
PyObject * FindOneofByName(PyDescriptorPool *self, PyObject *arg)
Definition: descriptor_pool.cc:339
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindExtensionByName
def testFindExtensionByName(self)
Definition: descriptor_pool_test.py:319
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testDefaultValueForCustomMessages
def testDefaultValueForCustomMessages(self)
Definition: descriptor_pool_test.py:452
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testExtensionsAreNotFields
def testExtensionsAreNotFields(self)
Definition: descriptor_pool_test.py:379
google::protobuf.internal.descriptor_pool_test.DefaultDescriptorPoolTest
Definition: descriptor_pool_test.py:552
google::protobuf.internal.descriptor_pool_test.ProtoFile.messages
messages
Definition: descriptor_pool_test.py:705
google::protobuf.internal.descriptor_pool_test.AddDescriptorTest.testFile
def testFile(self)
Definition: descriptor_pool_test.py:959
google::protobuf.descriptor.FileDescriptor
Definition: descriptor.py:844
google::protobuf.internal.descriptor_pool_test.MessageField.__init__
def __init__(self, number, type_name)
Definition: descriptor_pool_test.py:804
google::protobuf::python::cdescriptor_pool::FindFileByName
static PyObject * FindFileByName(PyObject *self, PyObject *arg)
Definition: descriptor_pool.cc:258
google::protobuf.internal.descriptor_pool_test.EnumType.CheckType
def CheckType(self, test, msg_desc, name, file_desc)
Definition: descriptor_pool_test.py:727
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindMessageTypeByName
def testFindMessageTypeByName(self)
Definition: descriptor_pool_test.py:161
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindFieldByName
def testFindFieldByName(self)
Definition: descriptor_pool_test.py:302
google::protobuf.internal.descriptor_pool_test.AddDescriptorTest.testCustomDescriptorPool
def testCustomDescriptorPool(self)
Definition: descriptor_pool_test.py:985
google::protobuf.internal.descriptor_pool_test.AddDescriptorTest.testEmptyDescriptorPool
def testEmptyDescriptorPool(self)
Definition: descriptor_pool_test.py:973
google::protobuf.internal.descriptor_pool_test.CreateDescriptorPoolTest.factory_test1_fd
factory_test1_fd
Definition: descriptor_pool_test.py:592
google::protobuf.descriptor_database.DescriptorDatabase
Definition: descriptor_database.py:46
google::protobuf.internal.descriptor_pool_test.ExtensionField.number
number
Definition: descriptor_pool_test.py:850
google::protobuf.internal.descriptor_pool_test.EnumField.CheckField
def CheckField(self, test, msg_desc, name, index, file_desc)
Definition: descriptor_pool_test.py:782
google::protobuf.internal.descriptor_pool_test.ProtoFile.public_dependencies
public_dependencies
Definition: descriptor_pool_test.py:707
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindExtensionByNumber
def testFindExtensionByNumber(self)
Definition: descriptor_pool_test.py:356
google::protobuf
Definition: data_proto2_to_proto3_util.h:12
google::protobuf.internal.descriptor_pool_test.ProtoFile.package
package
Definition: descriptor_pool_test.py:704
google::protobuf.internal.descriptor_pool_test.DefaultDescriptorPoolTest.factory_test1_fd
factory_test1_fd
Definition: descriptor_pool_test.py:556
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindEnumTypeByNameFailure
def testFindEnumTypeByNameFailure(self)
Definition: descriptor_pool_test.py:298
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testAddFileDescriptor
def testAddFileDescriptor(self)
Definition: descriptor_pool_test.py:490
google::protobuf.internal.descriptor_pool_test.StringField.CheckField
def CheckField(self, test, msg_desc, name, index, file_desc)
Definition: descriptor_pool_test.py:832
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testUserDefinedDB
def testUserDefinedDB(self)
Definition: descriptor_pool_test.py:400
google::protobuf::python::cdescriptor_pool::Add
static PyObject * Add(PyObject *self, PyObject *file_descriptor_proto)
Definition: descriptor_pool.cc:621
google::protobuf.internal.descriptor_pool_test.MessageField
Definition: descriptor_pool_test.py:802
google::protobuf.internal.descriptor_pool_test.DefaultDescriptorPoolTest.setUp
def setUp(self)
Definition: descriptor_pool_test.py:554
google::protobuf.internal.descriptor_pool_test.SecondaryDescriptorFromDescriptorDB.setUp
def setUp(self)
Definition: descriptor_pool_test.py:613
google::protobuf.descriptor.Descriptor
Definition: descriptor.py:222
google::protobuf::python::cdescriptor_pool::FindServiceByName
static PyObject * FindServiceByName(PyObject *self, PyObject *arg)
Definition: descriptor_pool.cc:360
google::protobuf::python::cdescriptor_pool::AddSerializedFile
static PyObject * AddSerializedFile(PyObject *pself, PyObject *serialized_pb)
Definition: descriptor_pool.cc:572
google::protobuf.internal.descriptor_pool_test.AddDescriptorTest.testFileDescriptorOptionsWithCustomDescriptorPool
def testFileDescriptorOptionsWithCustomDescriptorPool(self)
Definition: descriptor_pool_test.py:1016
google::protobuf.internal.descriptor_pool_test.StringField.default_value
default_value
Definition: descriptor_pool_test.py:830
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindMessageTypeByNameFailure
def testFindMessageTypeByNameFailure(self)
Definition: descriptor_pool_test.py:264
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindFileContainingSymbolFailure
def testFindFileContainingSymbolFailure(self)
Definition: descriptor_pool_test.py:157
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindAllExtensions
def testFindAllExtensions(self)
Definition: descriptor_pool_test.py:332
google::protobuf::python::cdescriptor_pool::FindFileContainingSymbol
static PyObject * FindFileContainingSymbol(PyObject *self, PyObject *arg)
Definition: descriptor_pool.cc:400
google::protobuf.internal
Definition: python/google/protobuf/internal/__init__.py:1
google::protobuf::python::cdescriptor_pool::FindExtensionByNumber
static PyObject * FindExtensionByNumber(PyObject *self, PyObject *args)
Definition: descriptor_pool.cc:420
google::protobuf::python::service_descriptor::FindMethodByName
static PyObject * FindMethodByName(PyBaseDescriptor *self, PyObject *arg)
Definition: python/google/protobuf/pyext/descriptor.cc:1685
google::protobuf.internal.descriptor_pool_test.MessageType.__init__
def __init__(self, type_dict, field_list, is_extendable=False, extensions=None)
Definition: descriptor_pool_test.py:745
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.pool
pool
Definition: descriptor_pool_test.py:402
google::protobuf.internal.descriptor_pool_test.MessageField.number
number
Definition: descriptor_pool_test.py:805
google::protobuf.internal.descriptor_pool_test.AddDescriptorTest._TestMessage
def _TestMessage(self, prefix)
Definition: descriptor_pool_test.py:874
google::protobuf::python::cdescriptor_pool::FindFieldByName
PyObject * FindFieldByName(PyDescriptorPool *self, PyObject *arg)
Definition: descriptor_pool.cc:275
google::protobuf.internal.descriptor_pool_test.SecondaryDescriptorFromDescriptorDB.db
db
Definition: descriptor_pool_test.py:618
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase
Definition: descriptor_pool_test.py:66
google::protobuf.internal.descriptor_pool_test.MessageField.type_name
type_name
Definition: descriptor_pool_test.py:806
google::protobuf::python::cdescriptor_pool::FindExtensionByName
PyObject * FindExtensionByName(PyDescriptorPool *self, PyObject *arg)
Definition: descriptor_pool.cc:296
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindFileContainingSymbol
def testFindFileContainingSymbol(self)
Definition: descriptor_pool_test.py:87
google::protobuf.internal.descriptor_pool_test.ProtoFile
Definition: descriptor_pool_test.py:700
google::protobuf.internal.descriptor_pool_test.StringField
Definition: descriptor_pool_test.py:826
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindOneofByName
def testFindOneofByName(self)
Definition: descriptor_pool_test.py:312
google::protobuf.internal.descriptor_pool_test.AddDescriptorTest.testEnum
def testEnum(self)
Definition: descriptor_pool_test.py:942
update_failure_list.str
str
Definition: update_failure_list.py:41
google::protobuf.internal.descriptor_pool_test.ProtoFile.dependencies
dependencies
Definition: descriptor_pool_test.py:706
google::protobuf.internal.descriptor_pool_test.EnumField.number
number
Definition: descriptor_pool_test.py:778
google::protobuf.internal.descriptor_pool_test.EnumField
Definition: descriptor_pool_test.py:775
google::protobuf.internal.descriptor_pool_test.MessageType.field_list
field_list
Definition: descriptor_pool_test.py:747
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindFileByNameFailure
def testFindFileByNameFailure(self)
Definition: descriptor_pool_test.py:83
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testEnumDefaultValue
def testEnumDefaultValue(self)
Definition: descriptor_pool_test.py:420
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindEnumTypeByName
def testFindEnumTypeByName(self)
Definition: descriptor_pool_test.py:268
google::protobuf.internal.descriptor_pool_test.ExtensionField.__init__
def __init__(self, number, extended_type)
Definition: descriptor_pool_test.py:849
google::protobuf.internal.descriptor_pool_test.DefaultDescriptorPoolTest.testFindMethods
def testFindMethods(self)
Definition: descriptor_pool_test.py:561
google::protobuf.internal.descriptor_pool_test.ProtoFile.__init__
def __init__(self, name, package, messages, dependencies=None, public_dependencies=None)
Definition: descriptor_pool_test.py:702
google::protobuf.internal.descriptor_pool_test.ProtoFile.CheckFile
def CheckFile(self, test, pool)
Definition: descriptor_pool_test.py:710
google::protobuf.internal.descriptor_pool_test.MessageField.CheckField
def CheckField(self, test, msg_desc, name, index, file_desc)
Definition: descriptor_pool_test.py:808
google::protobuf.internal.descriptor_pool_test.CreateDescriptorPoolTest
Definition: descriptor_pool_test.py:588
google::protobuf.internal.descriptor_pool_test.AddDescriptorTest._TestEnum
def _TestEnum(self, prefix)
Definition: descriptor_pool_test.py:910
google::protobuf.internal.descriptor_pool_test.DefaultDescriptorPoolTest.factory_test2_fd
factory_test2_fd
Definition: descriptor_pool_test.py:558
google::protobuf.internal.descriptor_pool_test.EnumType.__init__
def __init__(self, values)
Definition: descriptor_pool_test.py:724
len
int len
Definition: php/ext/google/protobuf/map.c:206
google::protobuf.internal.descriptor_pool_test.CreateDescriptorPoolTest.factory_test2_fd
factory_test2_fd
Definition: descriptor_pool_test.py:594
google::protobuf.internal.descriptor_pool_test.EnumField.type_name
type_name
Definition: descriptor_pool_test.py:779
google::protobuf.internal.descriptor_pool_test.SecondaryDescriptorFromDescriptorDB.factory_test2_fd
factory_test2_fd
Definition: descriptor_pool_test.py:616
google::protobuf.internal.descriptor_pool_test.SecondaryDescriptorFromDescriptorDB.testErrorCollector
def testErrorCollector(self)
Definition: descriptor_pool_test.py:631
google::protobuf.internal.descriptor_pool_test.ProtoFile.name
name
Definition: descriptor_pool_test.py:703
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindTypeErrors
def testFindTypeErrors(self)
Definition: descriptor_pool_test.py:243
google::protobuf.internal.descriptor_pool_test.AddDescriptorTest.testMessage
def testMessage(self)
Definition: descriptor_pool_test.py:906
google::protobuf.internal.descriptor_pool_test.MessageType
Definition: descriptor_pool_test.py:743
google::protobuf.descriptor_pool.DescriptorPool
Definition: descriptor_pool.py:102
google::protobuf.internal.descriptor_pool_test.CreateDescriptorPoolTest.setUp
def setUp(self)
Definition: descriptor_pool_test.py:590
cpp.gmock_class.set
set
Definition: gmock_class.py:44
google::protobuf.internal.descriptor_pool_test.MessageType.CheckType
def CheckType(self, test, containing_type_desc, name, file_desc)
Definition: descriptor_pool_test.py:752
google::protobuf.internal.descriptor_pool_test.StringField.number
number
Definition: descriptor_pool_test.py:829
google::protobuf.internal.descriptor_pool_test.AddDescriptorTest.testService
def testService(self)
Definition: descriptor_pool_test.py:948
google::protobuf::python::cdescriptor_pool::FindAllExtensions
static PyObject * FindAllExtensions(PyObject *self, PyObject *arg)
Definition: descriptor_pool.cc:453
google::protobuf.internal.descriptor_pool_test.EnumType
Definition: descriptor_pool_test.py:722
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testConflictRegister
def testConflictRegister(self)
Definition: descriptor_pool_test.py:520
google::protobuf::python::cdescriptor_pool::AddExtensionDescriptor
static PyObject * AddExtensionDescriptor(PyObject *self, PyObject *descriptor)
Definition: descriptor_pool.cc:537
google::protobuf.internal.descriptor_pool_test.ExtensionField.extended_type
extended_type
Definition: descriptor_pool_test.py:851
google::protobuf.internal.descriptor_pool_test.SecondaryDescriptorFromDescriptorDB.factory_test1_fd
factory_test1_fd
Definition: descriptor_pool_test.py:614
google::protobuf.internal.python_message.SerializeToString
SerializeToString
Definition: python_message.py:1081
google::protobuf.internal.descriptor_pool_test.EnumField.__init__
def __init__(self, number, type_name, default_value)
Definition: descriptor_pool_test.py:777
google::protobuf.internal.descriptor_pool_test.MessageType.is_extendable
is_extendable
Definition: descriptor_pool_test.py:748
google::protobuf.internal.descriptor_pool_test.ExtensionField.CheckField
def CheckField(self, test, msg_desc, name, index, file_desc)
Definition: descriptor_pool_test.py:853
google::protobuf.internal.descriptor_pool_test.StringField.__init__
def __init__(self, number, default_value)
Definition: descriptor_pool_test.py:828
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testFindService
def testFindService(self)
Definition: descriptor_pool_test.py:389
google::protobuf.internal.descriptor_pool_test.EnumField.default_value
default_value
Definition: descriptor_pool_test.py:780
google::protobuf.internal.descriptor_pool_test.MessageType.type_dict
type_dict
Definition: descriptor_pool_test.py:746
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testAddSerializedFile
def testAddSerializedFile(self)
Definition: descriptor_pool_test.py:407
google::protobuf.internal.descriptor_pool_test.EnumType.values
values
Definition: descriptor_pool_test.py:725
google::protobuf.internal.descriptor_pool_test.MessageType.extensions
extensions
Definition: descriptor_pool_test.py:749
google::protobuf.descriptor.EnumDescriptor
Definition: descriptor.py:607
google::protobuf.internal.descriptor_pool_test.SecondaryDescriptorFromDescriptorDB
Definition: descriptor_pool_test.py:611
google::protobuf.internal.descriptor_pool_test.ExtensionField
Definition: descriptor_pool_test.py:847
google::protobuf.internal.descriptor_pool_test.AddDescriptorTest.testAddTypeError
def testAddTypeError(self)
Definition: descriptor_pool_test.py:1033
google::protobuf.internal.descriptor_pool_test.DescriptorPoolTestBase.testComplexNesting
def testComplexNesting(self)
Definition: descriptor_pool_test.py:501
google::protobuf.message_factory.MessageFactory
Definition: message_factory.py:56


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:50