35 """Unittest that directly tests the output of the pure-Python protocol
36 compiler. See //google/protobuf/internal/reflection_test.py for a test which
37 further ensures that we can use Python protocol message objects as we expect.
40 __author__ =
'robinson@google.com (Will Robinson)'
43 import unittest2
as unittest
58 MAX_EXTENSION = 536870912
61 class GeneratorTest(unittest.TestCase):
64 field_name =
'optional_nested_message'
65 proto_type = unittest_pb2.TestAllTypes
67 proto_type.NestedMessage.DESCRIPTOR,
68 proto_type.DESCRIPTOR.fields_by_name[field_name].message_type)
74 self.assertEqual(4, unittest_pb2.FOREIGN_FOO)
75 self.assertEqual(5, unittest_pb2.FOREIGN_BAR)
76 self.assertEqual(6, unittest_pb2.FOREIGN_BAZ)
78 proto = unittest_pb2.TestAllTypes()
79 self.assertEqual(1, proto.FOO)
80 self.assertEqual(1, unittest_pb2.TestAllTypes.FOO)
81 self.assertEqual(2, proto.BAR)
82 self.assertEqual(2, unittest_pb2.TestAllTypes.BAR)
83 self.assertEqual(3, proto.BAZ)
84 self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ)
87 message = unittest_pb2.TestExtremeDefaultValues()
98 self.assertTrue(
isinf(message.inf_double))
99 self.assertTrue(message.inf_double > 0)
100 self.assertTrue(
isinf(message.neg_inf_double))
101 self.assertTrue(message.neg_inf_double < 0)
102 self.assertTrue(
isnan(message.nan_double))
104 self.assertTrue(
isinf(message.inf_float))
105 self.assertTrue(message.inf_float > 0)
106 self.assertTrue(
isinf(message.neg_inf_float))
107 self.assertTrue(message.neg_inf_float < 0)
108 self.assertTrue(
isnan(message.nan_float))
109 self.assertEqual(
"? ? ?? ?? ??? ??/ ??-", message.cpp_trigraph)
112 desc = unittest_pb2.TestAllTypes.DESCRIPTOR
114 expected_has_default_by_name = {
115 'optional_int32':
False,
116 'repeated_int32':
False,
117 'optional_nested_message':
False,
118 'default_int32':
True,
121 has_default_by_name = dict(
122 [(f.name, f.has_default_value)
124 if f.name
in expected_has_default_by_name])
125 self.assertEqual(expected_has_default_by_name, has_default_by_name)
128 self.assertEqual(unittest_pb2.optional_int32_extension.containing_type,
129 unittest_pb2.TestAllExtensions.DESCRIPTOR)
130 self.assertEqual(unittest_pb2.TestRequired.single.containing_type,
131 unittest_pb2.TestAllExtensions.DESCRIPTOR)
134 self.assertEqual(unittest_pb2.optional_int32_extension.extension_scope,
136 self.assertEqual(unittest_pb2.TestRequired.single.extension_scope,
137 unittest_pb2.TestRequired.DESCRIPTOR)
140 self.assertTrue(unittest_pb2.optional_int32_extension.is_extension)
141 self.assertTrue(unittest_pb2.TestRequired.single.is_extension)
143 message_descriptor = unittest_pb2.TestRequired.DESCRIPTOR
144 non_extension_descriptor = message_descriptor.fields_by_name[
'a']
145 self.assertTrue(
not non_extension_descriptor.is_extension)
148 proto = unittest_mset_wire_format_pb2.TestMessageSet()
149 self.assertTrue(proto.DESCRIPTOR.GetOptions().message_set_wire_format)
152 proto = unittest_custom_options_pb2.TestMessageWithCustomOptions()
153 enum_options = proto.DESCRIPTOR.enum_types_by_name[
'AnEnum'].
GetOptions()
154 self.assertTrue(enum_options
is not None)
160 set(unittest_pb2.TestAllTypes.DESCRIPTOR.nested_types),
162 unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR,
163 unittest_pb2.TestAllTypes.OptionalGroup.DESCRIPTOR,
164 unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR,
166 self.assertEqual(unittest_pb2.TestEmptyMessage.DESCRIPTOR.nested_types, [])
168 unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.nested_types, [])
172 unittest_pb2.TestEmptyMessage.DESCRIPTOR.containing_type
is None)
174 unittest_pb2.TestAllTypes.DESCRIPTOR.containing_type
is None)
176 unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type,
177 unittest_pb2.TestAllTypes.DESCRIPTOR)
179 unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type,
180 unittest_pb2.TestAllTypes.DESCRIPTOR)
182 unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR.containing_type,
183 unittest_pb2.TestAllTypes.DESCRIPTOR)
186 self.assertTrue(unittest_pb2._FOREIGNENUM.containing_type
is None)
187 self.assertEqual(unittest_pb2._TESTALLTYPES_NESTEDENUM.containing_type,
188 unittest_pb2.TestAllTypes.DESCRIPTOR)
192 unittest_pb2.TestAllTypes.DESCRIPTOR.file.package,
194 desc = unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR
195 self.assertEqual(desc.file.package,
'protobuf_unittest')
197 unittest_import_pb2.ImportMessage.DESCRIPTOR.file.package,
198 'protobuf_unittest_import')
201 unittest_pb2._FOREIGNENUM.file.package,
'protobuf_unittest')
203 unittest_pb2._TESTALLTYPES_NESTEDENUM.file.package,
206 unittest_import_pb2._IMPORTENUM.file.package,
207 'protobuf_unittest_import')
211 unittest_pb2.TestAllTypes.DESCRIPTOR.extension_ranges, [])
213 unittest_pb2.TestAllExtensions.DESCRIPTOR.extension_ranges,
214 [(1, MAX_EXTENSION)])
216 unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR.extension_ranges,
217 [(42, 43), (4143, 4244), (65536, MAX_EXTENSION)])
220 self.assertEqual(unittest_pb2.DESCRIPTOR.name,
221 'google/protobuf/unittest.proto')
222 self.assertEqual(unittest_pb2.DESCRIPTOR.package,
'protobuf_unittest')
223 self.assertFalse(unittest_pb2.DESCRIPTOR.serialized_pb
is None)
224 self.assertEqual(unittest_pb2.DESCRIPTOR.dependencies,
225 [unittest_import_pb2.DESCRIPTOR])
226 self.assertEqual(unittest_import_pb2.DESCRIPTOR.dependencies,
227 [unittest_import_public_pb2.DESCRIPTOR])
228 self.assertEqual(unittest_import_pb2.DESCRIPTOR.public_dependencies,
229 [unittest_import_public_pb2.DESCRIPTOR])
231 self.assertTrue(hasattr(unittest_no_generic_services_pb2,
"TestMessage"))
232 self.assertTrue(hasattr(unittest_no_generic_services_pb2,
"FOO"))
233 self.assertTrue(hasattr(unittest_no_generic_services_pb2,
"test_extension"))
237 if hasattr(unittest_no_generic_services_pb2,
"TestService"):
238 self.assertFalse(issubclass(unittest_no_generic_services_pb2.TestService,
242 file_type = unittest_pb2.DESCRIPTOR
244 unittest_pb2._TESTALLTYPES,
245 file_type.message_types_by_name[unittest_pb2._TESTALLTYPES.name])
250 unittest_pb2._TESTALLTYPES_NESTEDMESSAGE.name
in
251 file_type.message_types_by_name)
254 file_type = unittest_pb2.DESCRIPTOR
256 unittest_pb2._FOREIGNENUM,
257 file_type.enum_types_by_name[unittest_pb2._FOREIGNENUM.name])
260 file_type = unittest_pb2.DESCRIPTOR
262 unittest_pb2.my_extension_string,
263 file_type.extensions_by_name[unittest_pb2.my_extension_string.name])
267 all_type_proto = unittest_pb2.TestAllTypes()
268 self.assertEqual(0, all_type_proto.optional_public_import_message.e)
272 public_import_proto = unittest_import_pb2.PublicImportMessage()
273 self.assertEqual(0, public_import_proto.e)
274 self.assertTrue(unittest_import_public_pb2.PublicImportMessage
is
275 unittest_import_pb2.PublicImportMessage)
279 message = test_bad_identifiers_pb2.TestBadIdentifiers()
280 self.assertEqual(message.Extensions[test_bad_identifiers_pb2.message],
282 self.assertEqual(message.Extensions[test_bad_identifiers_pb2.descriptor],
284 self.assertEqual(message.Extensions[test_bad_identifiers_pb2.reflection],
286 self.assertEqual(message.Extensions[test_bad_identifiers_pb2.service],
290 desc = unittest_pb2.TestAllTypes.DESCRIPTOR
291 self.assertEqual(1,
len(desc.oneofs))
292 self.assertEqual(
'oneof_field', desc.oneofs[0].name)
293 self.assertEqual(0, desc.oneofs[0].index)
294 self.assertIs(desc, desc.oneofs[0].containing_type)
295 self.assertIs(desc.oneofs[0], desc.oneofs_by_name[
'oneof_field'])
296 nested_names =
set([
'oneof_uint32',
'oneof_nested_message',
297 'oneof_string',
'oneof_bytes'])
300 set([field.name
for field
in desc.oneofs[0].fields]))
301 for field_name, field_desc
in desc.fields_by_name.items():
302 if field_name
in nested_names:
303 self.assertIs(desc.oneofs[0], field_desc.containing_oneof)
305 self.assertIsNone(field_desc.containing_oneof)
308 self.assertEqual(
'FOO1',
309 unittest_pb2.TestEnumWithDupValue.Name(unittest_pb2.FOO1))
310 self.assertEqual(
'FOO1',
311 unittest_pb2.TestEnumWithDupValue.Name(unittest_pb2.FOO2))
312 self.assertEqual(
'BAR1',
313 unittest_pb2.TestEnumWithDupValue.Name(unittest_pb2.BAR1))
314 self.assertEqual(
'BAR1',
315 unittest_pb2.TestEnumWithDupValue.Name(unittest_pb2.BAR2))
319 """Checks that messages, enums and files are correctly registered."""
323 unittest_pb2.TestAllTypes, symbol_database.Default().GetSymbol(
324 'protobuf_unittest.TestAllTypes'))
326 unittest_pb2.TestAllTypes.NestedMessage,
327 symbol_database.Default().GetSymbol(
328 'protobuf_unittest.TestAllTypes.NestedMessage'))
329 with self.assertRaises(KeyError):
330 symbol_database.Default().GetSymbol(
'protobuf_unittest.NestedMessage')
332 unittest_pb2.TestAllTypes.OptionalGroup,
333 symbol_database.Default().GetSymbol(
334 'protobuf_unittest.TestAllTypes.OptionalGroup'))
336 unittest_pb2.TestAllTypes.RepeatedGroup,
337 symbol_database.Default().GetSymbol(
338 'protobuf_unittest.TestAllTypes.RepeatedGroup'))
342 'protobuf_unittest.ForeignEnum',
343 symbol_database.Default().pool.FindEnumTypeByName(
344 'protobuf_unittest.ForeignEnum').full_name)
346 'protobuf_unittest.TestAllTypes.NestedEnum',
347 symbol_database.Default().pool.FindEnumTypeByName(
348 'protobuf_unittest.TestAllTypes.NestedEnum').full_name)
352 'google/protobuf/unittest.proto',
353 symbol_database.Default().pool.FindFileByName(
354 'google/protobuf/unittest.proto').name)
356 if __name__ ==
'__main__':