34 """Test for preservation of unknown fields in the pure Python implementation."""
36 __author__ =
'bohdank@google.com (Bohdan Koval)'
39 import unittest2
as unittest
56 @testing_refleaks.TestCase
76 message = unittest_proto3_arena_pb2.TestEmptyMessage()
90 raw = unittest_mset_pb2.RawMessageSet()
94 item.type_id = 98418603
95 message1 = message_set_extensions_pb2.TestMessageSetExtension1()
97 item.message = message1.SerializeToString()
99 serialized = raw.SerializeToString()
102 proto = message_set_extensions_pb2.TestMessageSet()
103 proto.MergeFromString(serialized)
106 reserialized = proto.SerializeToString()
107 new_raw = unittest_mset_pb2.RawMessageSet()
108 new_raw.MergeFromString(reserialized)
109 self.assertEqual(raw, new_raw)
112 message = unittest_pb2.TestEmptyMessage()
124 message = unittest_pb2.TestAllTypes()
125 other_message = unittest_pb2.TestAllTypes()
126 other_message.optional_string =
'discard'
127 message.optional_nested_message.ParseFromString(
128 other_message.SerializeToString())
130 other_message.SerializeToString())
132 b
'', message.optional_nested_message.SerializeToString())
135 message.DiscardUnknownFields()
136 self.assertEqual(b
'', message.optional_nested_message.SerializeToString())
140 msg = map_unittest_pb2.TestMap()
141 msg.map_int32_all_types[1].optional_nested_message.ParseFromString(
142 other_message.SerializeToString())
143 msg.map_string_string[
'1'] =
'test'
146 msg.map_int32_all_types[1].optional_nested_message.SerializeToString())
147 msg.DiscardUnknownFields()
150 msg.map_int32_all_types[1].optional_nested_message.SerializeToString())
153 @testing_refleaks.TestCase
171 if api_implementation.Type() ==
'cpp':
173 field_descriptor = self.
descriptor.fields_by_name[name]
174 wire_type = type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type]
175 field_tag = encoder.TagBytes(field_descriptor.number, wire_type)
178 if tag_bytes == field_tag:
179 decoder = unittest_pb2.TestAllTypes._decoders_by_tag[tag_bytes][0]
181 self.assertEqual(expected_value, result_dict[field_descriptor])
184 field_descriptor = self.
descriptor.fields_by_name[name]
185 expected_type = type_checkers.FIELD_TYPE_TO_WIRE_TYPE[
186 field_descriptor.type]
187 for unknown_field
in unknown_fields:
188 if unknown_field.field_number == field_descriptor.number:
189 self.assertEqual(expected_type, unknown_field.wire_type)
190 if expected_type == 3:
192 self.assertEqual(expected_value[0],
193 unknown_field.data[0].field_number)
194 self.assertEqual(expected_value[1], unknown_field.data[0].wire_type)
195 self.assertEqual(expected_value[2], unknown_field.data[0].data)
197 if field_descriptor.label == descriptor.FieldDescriptor.LABEL_REPEATED:
198 self.assertIn(unknown_field.data, expected_value)
200 self.assertEqual(expected_value, unknown_field.data)
242 self.
all_fields.optional_string.encode(
'utf-8'))
253 self.assertEqual(97,
len(unknown_fields))
256 message = unittest_pb2.TestEmptyMessage()
261 message = unittest_pb2.TestAllTypes()
262 message.optional_int32 = 1
263 message.optional_uint32 = 2
264 source = unittest_pb2.TestEmptyMessage()
265 source.ParseFromString(message.SerializeToString())
267 message.ClearField(
'optional_int32')
268 message.optional_int64 = 3
269 message.optional_uint32 = 4
270 destination = unittest_pb2.TestEmptyMessage()
271 unknown_fields = destination.UnknownFields()
272 self.assertEqual(0,
len(unknown_fields))
273 destination.ParseFromString(message.SerializeToString())
275 with self.assertRaises(ValueError)
as context:
277 self.assertIn(
'UnknownFields does not exist.',
278 str(context.exception))
279 unknown_fields = destination.UnknownFields()
280 self.assertEqual(2,
len(unknown_fields))
281 destination.MergeFrom(source)
282 self.assertEqual(4,
len(unknown_fields))
285 message.ParseFromString(destination.SerializeToString())
286 self.assertEqual(message.optional_int32, 1)
287 self.assertEqual(message.optional_uint32, 2)
288 self.assertEqual(message.optional_int64, 3)
295 with self.assertRaises(ValueError)
as context:
297 self.assertIn(
'UnknownFields does not exist.',
298 str(context.exception))
301 message = unittest_pb2.TestAllTypes()
302 message.optionalgroup.a = 123
303 destination = unittest_pb2.TestEmptyMessage()
304 destination.ParseFromString(message.SerializeToString())
305 sub_unknown_fields = destination.UnknownFields()[0].data
306 self.assertEqual(1,
len(sub_unknown_fields))
307 self.assertEqual(sub_unknown_fields[0].data, 123)
309 with self.assertRaises(ValueError)
as context:
310 len(sub_unknown_fields)
311 self.assertIn(
'UnknownFields does not exist.',
312 str(context.exception))
313 with self.assertRaises(ValueError)
as context:
315 sub_unknown_fields[0]
316 self.assertIn(
'UnknownFields does not exist.',
317 str(context.exception))
319 message.optional_uint32 = 456
320 nested_message = unittest_pb2.NestedTestAllTypes()
321 nested_message.payload.optional_nested_message.ParseFromString(
322 message.SerializeToString())
324 nested_message.payload.optional_nested_message.UnknownFields())
325 self.assertEqual(unknown_fields[0].data, 456)
326 nested_message.ClearField(
'payload')
327 self.assertEqual(unknown_fields[0].data, 456)
329 nested_message.payload.optional_nested_message.UnknownFields())
330 self.assertEqual(0,
len(unknown_fields))
333 message = unittest_pb2.TestAllTypes()
334 message.optional_int32 = 123
335 destination = unittest_pb2.TestEmptyMessage()
336 destination.ParseFromString(message.SerializeToString())
337 unknown_field = destination.UnknownFields()[0]
339 with self.assertRaises(ValueError)
as context:
341 self.assertIn(
'The parent message might be cleared.',
342 str(context.exception))
345 message = unittest_pb2.TestEmptyMessageWithExtensions()
350 @testing_refleaks.TestCase
354 self.
descriptor = missing_enum_values_pb2.TestEnumValues.DESCRIPTOR
356 self.
message = missing_enum_values_pb2.TestEnumValues()
358 self.
message.optional_nested_enum = (
359 missing_enum_values_pb2.TestEnumValues.ZERO)
360 self.
message.repeated_nested_enum.extend([
361 missing_enum_values_pb2.TestEnumValues.ZERO,
362 missing_enum_values_pb2.TestEnumValues.ONE,
364 self.
message.packed_nested_enum.extend([
365 missing_enum_values_pb2.TestEnumValues.ZERO,
366 missing_enum_values_pb2.TestEnumValues.ONE,
379 field_descriptor = self.
descriptor.fields_by_name[name]
381 for field
in unknown_fields:
382 if field.field_number == field_descriptor.number:
383 if field_descriptor.label == descriptor.FieldDescriptor.LABEL_REPEATED:
384 self.assertIn(field.data, expected_value)
386 self.assertEqual(expected_value, field.data)
389 just_string = missing_enum_values_pb2.JustString()
390 just_string.dummy =
'blah'
392 missing = missing_enum_values_pb2.TestEnumValues()
395 missing.ParseFromString(just_string.SerializeToString())
399 self.assertEqual(missing.optional_nested_enum, 0)
417 self.
message.optional_nested_enum)
419 self.
message.repeated_nested_enum)
421 self.
message.packed_nested_enum)
424 new_message = missing_enum_values_pb2.TestEnumValues()
426 self.assertEqual(self.
message, new_message)
429 if __name__ ==
'__main__':