| Index: third_party/protobuf/python/google/protobuf/internal/unknown_fields_test.py
|
| diff --git a/third_party/protobuf/python/google/protobuf/internal/unknown_fields_test.py b/third_party/protobuf/python/google/protobuf/internal/unknown_fields_test.py
|
| index 84984b40ff5905cb51980abf8c92aee8bf76fa10..1b81ae79bf084606b268a3f094b6146aba2ef6ac 100644
|
| --- a/third_party/protobuf/python/google/protobuf/internal/unknown_fields_test.py
|
| +++ b/third_party/protobuf/python/google/protobuf/internal/unknown_fields_test.py
|
| @@ -1,9 +1,9 @@
|
| -#! /usr/bin/python
|
| +#! /usr/bin/env python
|
| # -*- coding: utf-8 -*-
|
| #
|
| # Protocol Buffers - Google's data interchange format
|
| # Copyright 2008 Google Inc. All rights reserved.
|
| -# http://code.google.com/p/protobuf/
|
| +# https://developers.google.com/protocol-buffers/
|
| #
|
| # Redistribution and use in source and binary forms, with or without
|
| # modification, are permitted provided that the following conditions are
|
| @@ -38,7 +38,10 @@ __author__ = 'bohdank@google.com (Bohdan Koval)'
|
| import unittest
|
| from google.protobuf import unittest_mset_pb2
|
| from google.protobuf import unittest_pb2
|
| +from google.protobuf import unittest_proto3_arena_pb2
|
| +from google.protobuf.internal import api_implementation
|
| from google.protobuf.internal import encoder
|
| +from google.protobuf.internal import missing_enum_values_pb2
|
| from google.protobuf.internal import test_util
|
| from google.protobuf.internal import type_checkers
|
|
|
| @@ -52,18 +55,100 @@ class UnknownFieldsTest(unittest.TestCase):
|
| self.all_fields_data = self.all_fields.SerializeToString()
|
| self.empty_message = unittest_pb2.TestEmptyMessage()
|
| self.empty_message.ParseFromString(self.all_fields_data)
|
| +
|
| + def testSerialize(self):
|
| + data = self.empty_message.SerializeToString()
|
| +
|
| + # Don't use assertEqual because we don't want to dump raw binary data to
|
| + # stdout.
|
| + self.assertTrue(data == self.all_fields_data)
|
| +
|
| + def testSerializeProto3(self):
|
| + # Verify that proto3 doesn't preserve unknown fields.
|
| + message = unittest_proto3_arena_pb2.TestEmptyMessage()
|
| + message.ParseFromString(self.all_fields_data)
|
| + self.assertEqual(0, len(message.SerializeToString()))
|
| +
|
| + def testByteSize(self):
|
| + self.assertEqual(self.all_fields.ByteSize(), self.empty_message.ByteSize())
|
| +
|
| + def testListFields(self):
|
| + # Make sure ListFields doesn't return unknown fields.
|
| + self.assertEqual(0, len(self.empty_message.ListFields()))
|
| +
|
| + def testSerializeMessageSetWireFormatUnknownExtension(self):
|
| + # Create a message using the message set wire format with an unknown
|
| + # message.
|
| + raw = unittest_mset_pb2.RawMessageSet()
|
| +
|
| + # Add an unknown extension.
|
| + item = raw.item.add()
|
| + item.type_id = 1545009
|
| + message1 = unittest_mset_pb2.TestMessageSetExtension1()
|
| + message1.i = 12345
|
| + item.message = message1.SerializeToString()
|
| +
|
| + serialized = raw.SerializeToString()
|
| +
|
| + # Parse message using the message set wire format.
|
| + proto = unittest_mset_pb2.TestMessageSet()
|
| + proto.MergeFromString(serialized)
|
| +
|
| + # Verify that the unknown extension is serialized unchanged
|
| + reserialized = proto.SerializeToString()
|
| + new_raw = unittest_mset_pb2.RawMessageSet()
|
| + new_raw.MergeFromString(reserialized)
|
| + self.assertEqual(raw, new_raw)
|
| +
|
| + # C++ implementation for proto2 does not currently take into account unknown
|
| + # fields when checking equality.
|
| + #
|
| + # TODO(haberman): fix this.
|
| + @unittest.skipIf(
|
| + api_implementation.Type() == 'cpp' and api_implementation.Version() == 2,
|
| + 'C++ implementation does not expose unknown fields to Python')
|
| + def testEquals(self):
|
| + message = unittest_pb2.TestEmptyMessage()
|
| + message.ParseFromString(self.all_fields_data)
|
| + self.assertEqual(self.empty_message, message)
|
| +
|
| + self.all_fields.ClearField('optional_string')
|
| + message.ParseFromString(self.all_fields.SerializeToString())
|
| + self.assertNotEqual(self.empty_message, message)
|
| +
|
| +
|
| +@unittest.skipIf(
|
| + api_implementation.Type() == 'cpp' and api_implementation.Version() == 2,
|
| + 'C++ implementation does not expose unknown fields to Python')
|
| +class UnknownFieldsAccessorsTest(unittest.TestCase):
|
| +
|
| + def setUp(self):
|
| + self.descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
|
| + self.all_fields = unittest_pb2.TestAllTypes()
|
| + test_util.SetAllFields(self.all_fields)
|
| + self.all_fields_data = self.all_fields.SerializeToString()
|
| + self.empty_message = unittest_pb2.TestEmptyMessage()
|
| + self.empty_message.ParseFromString(self.all_fields_data)
|
| self.unknown_fields = self.empty_message._unknown_fields
|
|
|
| def GetField(self, name):
|
| field_descriptor = self.descriptor.fields_by_name[name]
|
| wire_type = type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type]
|
| field_tag = encoder.TagBytes(field_descriptor.number, wire_type)
|
| + result_dict = {}
|
| for tag_bytes, value in self.unknown_fields:
|
| if tag_bytes == field_tag:
|
| - decoder = unittest_pb2.TestAllTypes._decoders_by_tag[tag_bytes]
|
| - result_dict = {}
|
| + decoder = unittest_pb2.TestAllTypes._decoders_by_tag[tag_bytes][0]
|
| decoder(value, 0, len(value), self.all_fields, result_dict)
|
| - return result_dict[field_descriptor]
|
| + return result_dict[field_descriptor]
|
| +
|
| + def testEnum(self):
|
| + value = self.GetField('optional_nested_enum')
|
| + self.assertEqual(self.all_fields.optional_nested_enum, value)
|
| +
|
| + def testRepeatedEnum(self):
|
| + value = self.GetField('repeated_nested_enum')
|
| + self.assertEqual(self.all_fields.repeated_nested_enum, value)
|
|
|
| def testVarint(self):
|
| value = self.GetField('optional_int32')
|
| @@ -85,13 +170,6 @@ class UnknownFieldsTest(unittest.TestCase):
|
| value = self.GetField('optionalgroup')
|
| self.assertEqual(self.all_fields.optionalgroup, value)
|
|
|
| - def testSerialize(self):
|
| - data = self.empty_message.SerializeToString()
|
| -
|
| - # Don't use assertEqual because we don't want to dump raw binary data to
|
| - # stdout.
|
| - self.assertTrue(data == self.all_fields_data)
|
| -
|
| def testCopyFrom(self):
|
| message = unittest_pb2.TestEmptyMessage()
|
| message.CopyFrom(self.empty_message)
|
| @@ -119,51 +197,67 @@ class UnknownFieldsTest(unittest.TestCase):
|
| self.empty_message.Clear()
|
| self.assertEqual(0, len(self.empty_message._unknown_fields))
|
|
|
| - def testByteSize(self):
|
| - self.assertEqual(self.all_fields.ByteSize(), self.empty_message.ByteSize())
|
| -
|
| def testUnknownExtensions(self):
|
| message = unittest_pb2.TestEmptyMessageWithExtensions()
|
| message.ParseFromString(self.all_fields_data)
|
| self.assertEqual(self.empty_message._unknown_fields,
|
| message._unknown_fields)
|
|
|
| - def testListFields(self):
|
| - # Make sure ListFields doesn't return unknown fields.
|
| - self.assertEqual(0, len(self.empty_message.ListFields()))
|
|
|
| - def testSerializeMessageSetWireFormatUnknownExtension(self):
|
| - # Create a message using the message set wire format with an unknown
|
| - # message.
|
| - raw = unittest_mset_pb2.RawMessageSet()
|
|
|
| - # Add an unknown extension.
|
| - item = raw.item.add()
|
| - item.type_id = 1545009
|
| - message1 = unittest_mset_pb2.TestMessageSetExtension1()
|
| - message1.i = 12345
|
| - item.message = message1.SerializeToString()
|
| +@unittest.skipIf(
|
| + api_implementation.Type() == 'cpp' and api_implementation.Version() == 2,
|
| + 'C++ implementation does not expose unknown fields to Python')
|
| +class UnknownEnumValuesTest(unittest.TestCase):
|
|
|
| - serialized = raw.SerializeToString()
|
| + def setUp(self):
|
| + self.descriptor = missing_enum_values_pb2.TestEnumValues.DESCRIPTOR
|
|
|
| - # Parse message using the message set wire format.
|
| - proto = unittest_mset_pb2.TestMessageSet()
|
| - proto.MergeFromString(serialized)
|
| + self.message = missing_enum_values_pb2.TestEnumValues()
|
| + self.message.optional_nested_enum = (
|
| + missing_enum_values_pb2.TestEnumValues.ZERO)
|
| + self.message.repeated_nested_enum.extend([
|
| + missing_enum_values_pb2.TestEnumValues.ZERO,
|
| + missing_enum_values_pb2.TestEnumValues.ONE,
|
| + ])
|
| + self.message.packed_nested_enum.extend([
|
| + missing_enum_values_pb2.TestEnumValues.ZERO,
|
| + missing_enum_values_pb2.TestEnumValues.ONE,
|
| + ])
|
| + self.message_data = self.message.SerializeToString()
|
| + self.missing_message = missing_enum_values_pb2.TestMissingEnumValues()
|
| + self.missing_message.ParseFromString(self.message_data)
|
| + self.unknown_fields = self.missing_message._unknown_fields
|
|
|
| - # Verify that the unknown extension is serialized unchanged
|
| - reserialized = proto.SerializeToString()
|
| - new_raw = unittest_mset_pb2.RawMessageSet()
|
| - new_raw.MergeFromString(reserialized)
|
| - self.assertEqual(raw, new_raw)
|
| + def GetField(self, name):
|
| + field_descriptor = self.descriptor.fields_by_name[name]
|
| + wire_type = type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type]
|
| + field_tag = encoder.TagBytes(field_descriptor.number, wire_type)
|
| + result_dict = {}
|
| + for tag_bytes, value in self.unknown_fields:
|
| + if tag_bytes == field_tag:
|
| + decoder = missing_enum_values_pb2.TestEnumValues._decoders_by_tag[
|
| + tag_bytes][0]
|
| + decoder(value, 0, len(value), self.message, result_dict)
|
| + return result_dict[field_descriptor]
|
|
|
| - def testEquals(self):
|
| - message = unittest_pb2.TestEmptyMessage()
|
| - message.ParseFromString(self.all_fields_data)
|
| - self.assertEqual(self.empty_message, message)
|
| + def testUnknownEnumValue(self):
|
| + self.assertFalse(self.missing_message.HasField('optional_nested_enum'))
|
| + value = self.GetField('optional_nested_enum')
|
| + self.assertEqual(self.message.optional_nested_enum, value)
|
|
|
| - self.all_fields.ClearField('optional_string')
|
| - message.ParseFromString(self.all_fields.SerializeToString())
|
| - self.assertNotEqual(self.empty_message, message)
|
| + def testUnknownRepeatedEnumValue(self):
|
| + value = self.GetField('repeated_nested_enum')
|
| + self.assertEqual(self.message.repeated_nested_enum, value)
|
| +
|
| + def testUnknownPackedEnumValue(self):
|
| + value = self.GetField('packed_nested_enum')
|
| + self.assertEqual(self.message.packed_nested_enum, value)
|
| +
|
| + def testRoundTrip(self):
|
| + new_message = missing_enum_values_pb2.TestEnumValues()
|
| + new_message.ParseFromString(self.missing_message.SerializeToString())
|
| + self.assertEqual(self.message, new_message)
|
|
|
|
|
| if __name__ == '__main__':
|
|
|