37 """Unittest that directly tests the output of the pure-Python protocol
38 compiler. See //google/protobuf/internal/reflection_test.py for a test which
39 further ensures that we can use Python protocol message objects as we expect.
42 __author__ =
'robinson@google.com (Will Robinson)'
45 import unittest2
as unittest
60 MAX_EXTENSION = 536870912
66 field_name =
'optional_nested_message'
67 proto_type = unittest_pb2.TestAllTypes
69 proto_type.NestedMessage.DESCRIPTOR,
70 proto_type.DESCRIPTOR.fields_by_name[field_name].message_type)
76 self.assertEqual(4, unittest_pb2.FOREIGN_FOO)
77 self.assertEqual(5, unittest_pb2.FOREIGN_BAR)
78 self.assertEqual(6, unittest_pb2.FOREIGN_BAZ)
80 proto = unittest_pb2.TestAllTypes()
81 self.assertEqual(1, proto.FOO)
82 self.assertEqual(1, unittest_pb2.TestAllTypes.FOO)
83 self.assertEqual(2, proto.BAR)
84 self.assertEqual(2, unittest_pb2.TestAllTypes.BAR)
85 self.assertEqual(3, proto.BAZ)
86 self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ)
89 message = unittest_pb2.TestExtremeDefaultValues()
100 self.assertTrue(
isinf(message.inf_double))
101 self.assertTrue(message.inf_double > 0)
102 self.assertTrue(
isinf(message.neg_inf_double))
103 self.assertTrue(message.neg_inf_double < 0)
104 self.assertTrue(
isnan(message.nan_double))
106 self.assertTrue(
isinf(message.inf_float))
107 self.assertTrue(message.inf_float > 0)
108 self.assertTrue(
isinf(message.neg_inf_float))
109 self.assertTrue(message.neg_inf_float < 0)
110 self.assertTrue(
isnan(message.nan_float))
111 self.assertEqual(
"? ? ?? ?? ??? ??/ ??-", message.cpp_trigraph)
114 desc = unittest_pb2.TestAllTypes.DESCRIPTOR
116 expected_has_default_by_name = {
117 'optional_int32':
False,
118 'repeated_int32':
False,
119 'optional_nested_message':
False,
120 'default_int32':
True,
123 has_default_by_name = dict(
124 [(f.name, f.has_default_value)
126 if f.name
in expected_has_default_by_name])
127 self.assertEqual(expected_has_default_by_name, has_default_by_name)
130 self.assertEqual(unittest_pb2.optional_int32_extension.containing_type,
131 unittest_pb2.TestAllExtensions.DESCRIPTOR)
132 self.assertEqual(unittest_pb2.TestRequired.single.containing_type,
133 unittest_pb2.TestAllExtensions.DESCRIPTOR)
136 self.assertEqual(unittest_pb2.optional_int32_extension.extension_scope,
138 self.assertEqual(unittest_pb2.TestRequired.single.extension_scope,
139 unittest_pb2.TestRequired.DESCRIPTOR)
142 self.assertTrue(unittest_pb2.optional_int32_extension.is_extension)
143 self.assertTrue(unittest_pb2.TestRequired.single.is_extension)
145 message_descriptor = unittest_pb2.TestRequired.DESCRIPTOR
146 non_extension_descriptor = message_descriptor.fields_by_name[
'a']
147 self.assertTrue(
not non_extension_descriptor.is_extension)
150 proto = unittest_mset_wire_format_pb2.TestMessageSet()
151 self.assertTrue(proto.DESCRIPTOR.GetOptions().message_set_wire_format)
154 proto = unittest_custom_options_pb2.TestMessageWithCustomOptions()
155 enum_options = proto.DESCRIPTOR.enum_types_by_name[
'AnEnum'].
GetOptions()
156 self.assertTrue(enum_options
is not None)
162 set(unittest_pb2.TestAllTypes.DESCRIPTOR.nested_types),
164 unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR,
165 unittest_pb2.TestAllTypes.OptionalGroup.DESCRIPTOR,
166 unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR,
168 self.assertEqual(unittest_pb2.TestEmptyMessage.DESCRIPTOR.nested_types, [])
170 unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.nested_types, [])
174 unittest_pb2.TestEmptyMessage.DESCRIPTOR.containing_type
is None)
176 unittest_pb2.TestAllTypes.DESCRIPTOR.containing_type
is None)
178 unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type,
179 unittest_pb2.TestAllTypes.DESCRIPTOR)
181 unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type,
182 unittest_pb2.TestAllTypes.DESCRIPTOR)
184 unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR.containing_type,
185 unittest_pb2.TestAllTypes.DESCRIPTOR)
188 self.assertTrue(unittest_pb2._FOREIGNENUM.containing_type
is None)
189 self.assertEqual(unittest_pb2._TESTALLTYPES_NESTEDENUM.containing_type,
190 unittest_pb2.TestAllTypes.DESCRIPTOR)
194 unittest_pb2.TestAllTypes.DESCRIPTOR.file.package,
196 desc = unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR
197 self.assertEqual(desc.file.package,
'protobuf_unittest')
199 unittest_import_pb2.ImportMessage.DESCRIPTOR.file.package,
200 'protobuf_unittest_import')
203 unittest_pb2._FOREIGNENUM.file.package,
'protobuf_unittest')
205 unittest_pb2._TESTALLTYPES_NESTEDENUM.file.package,
208 unittest_import_pb2._IMPORTENUM.file.package,
209 'protobuf_unittest_import')
213 unittest_pb2.TestAllTypes.DESCRIPTOR.extension_ranges, [])
215 unittest_pb2.TestAllExtensions.DESCRIPTOR.extension_ranges,
216 [(1, MAX_EXTENSION)])
218 unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR.extension_ranges,
219 [(42, 43), (4143, 4244), (65536, MAX_EXTENSION)])
222 self.assertEqual(unittest_pb2.DESCRIPTOR.name,
223 'google/protobuf/unittest.proto')
224 self.assertEqual(unittest_pb2.DESCRIPTOR.package,
'protobuf_unittest')
225 self.assertFalse(unittest_pb2.DESCRIPTOR.serialized_pb
is None)
226 self.assertEqual(unittest_pb2.DESCRIPTOR.dependencies,
227 [unittest_import_pb2.DESCRIPTOR])
228 self.assertEqual(unittest_import_pb2.DESCRIPTOR.dependencies,
229 [unittest_import_public_pb2.DESCRIPTOR])
230 self.assertEqual(unittest_import_pb2.DESCRIPTOR.public_dependencies,
231 [unittest_import_public_pb2.DESCRIPTOR])
233 self.assertTrue(hasattr(unittest_no_generic_services_pb2,
"TestMessage"))
234 self.assertTrue(hasattr(unittest_no_generic_services_pb2,
"FOO"))
235 self.assertTrue(hasattr(unittest_no_generic_services_pb2,
"test_extension"))
239 if hasattr(unittest_no_generic_services_pb2,
"TestService"):
240 self.assertFalse(issubclass(unittest_no_generic_services_pb2.TestService,
244 file_type = unittest_pb2.DESCRIPTOR
246 unittest_pb2._TESTALLTYPES,
247 file_type.message_types_by_name[unittest_pb2._TESTALLTYPES.name])
252 unittest_pb2._TESTALLTYPES_NESTEDMESSAGE.name
in
253 file_type.message_types_by_name)
256 file_type = unittest_pb2.DESCRIPTOR
258 unittest_pb2._FOREIGNENUM,
259 file_type.enum_types_by_name[unittest_pb2._FOREIGNENUM.name])
262 file_type = unittest_pb2.DESCRIPTOR
264 unittest_pb2.my_extension_string,
265 file_type.extensions_by_name[unittest_pb2.my_extension_string.name])
269 all_type_proto = unittest_pb2.TestAllTypes()
270 self.assertEqual(0, all_type_proto.optional_public_import_message.e)
274 public_import_proto = unittest_import_pb2.PublicImportMessage()
275 self.assertEqual(0, public_import_proto.e)
276 self.assertTrue(unittest_import_public_pb2.PublicImportMessage
is
277 unittest_import_pb2.PublicImportMessage)
281 message = test_bad_identifiers_pb2.TestBadIdentifiers()
282 self.assertEqual(message.Extensions[test_bad_identifiers_pb2.message],
284 self.assertEqual(message.Extensions[test_bad_identifiers_pb2.descriptor],
286 self.assertEqual(message.Extensions[test_bad_identifiers_pb2.reflection],
288 self.assertEqual(message.Extensions[test_bad_identifiers_pb2.service],
292 desc = unittest_pb2.TestAllTypes.DESCRIPTOR
293 self.assertEqual(1,
len(desc.oneofs))
294 self.assertEqual(
'oneof_field', desc.oneofs[0].name)
295 self.assertEqual(0, desc.oneofs[0].index)
296 self.assertIs(desc, desc.oneofs[0].containing_type)
297 self.assertIs(desc.oneofs[0], desc.oneofs_by_name[
'oneof_field'])
298 nested_names =
set([
'oneof_uint32',
'oneof_nested_message',
299 'oneof_string',
'oneof_bytes'])
302 set([field.name
for field
in desc.oneofs[0].fields]))
303 for field_name, field_desc
in desc.fields_by_name.items():
304 if field_name
in nested_names:
305 self.assertIs(desc.oneofs[0], field_desc.containing_oneof)
307 self.assertIsNone(field_desc.containing_oneof)
310 self.assertEqual(
'FOO1',
311 unittest_pb2.TestEnumWithDupValue.Name(unittest_pb2.FOO1))
312 self.assertEqual(
'FOO1',
313 unittest_pb2.TestEnumWithDupValue.Name(unittest_pb2.FOO2))
314 self.assertEqual(
'BAR1',
315 unittest_pb2.TestEnumWithDupValue.Name(unittest_pb2.BAR1))
316 self.assertEqual(
'BAR1',
317 unittest_pb2.TestEnumWithDupValue.Name(unittest_pb2.BAR2))
321 """Checks that messages, enums and files are correctly registered."""
325 unittest_pb2.TestAllTypes, symbol_database.Default().GetSymbol(
326 'protobuf_unittest.TestAllTypes'))
328 unittest_pb2.TestAllTypes.NestedMessage,
329 symbol_database.Default().GetSymbol(
330 'protobuf_unittest.TestAllTypes.NestedMessage'))
331 with self.assertRaises(KeyError):
332 symbol_database.Default().GetSymbol(
'protobuf_unittest.NestedMessage')
334 unittest_pb2.TestAllTypes.OptionalGroup,
335 symbol_database.Default().GetSymbol(
336 'protobuf_unittest.TestAllTypes.OptionalGroup'))
338 unittest_pb2.TestAllTypes.RepeatedGroup,
339 symbol_database.Default().GetSymbol(
340 'protobuf_unittest.TestAllTypes.RepeatedGroup'))
344 'protobuf_unittest.ForeignEnum',
345 symbol_database.Default().pool.FindEnumTypeByName(
346 'protobuf_unittest.ForeignEnum').full_name)
348 'protobuf_unittest.TestAllTypes.NestedEnum',
349 symbol_database.Default().pool.FindEnumTypeByName(
350 'protobuf_unittest.TestAllTypes.NestedEnum').full_name)
354 'google/protobuf/unittest.proto',
355 symbol_database.Default().pool.FindFileByName(
356 'google/protobuf/unittest.proto').name)
358 if __name__ ==
'__main__':