1a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#! /usr/bin/python 2a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# -*- coding: utf-8 -*- 3a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# 4a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# Protocol Buffers - Google's data interchange format 5a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# Copyright 2008 Google Inc. All rights reserved. 6afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson# https://developers.google.com/protocol-buffers/ 7a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# 8a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# Redistribution and use in source and binary forms, with or without 9a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# modification, are permitted provided that the following conditions are 10a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# met: 11a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# 12a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# * Redistributions of source code must retain the above copyright 13a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# notice, this list of conditions and the following disclaimer. 14a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# * Redistributions in binary form must reproduce the above 15a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# copyright notice, this list of conditions and the following disclaimer 16a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# in the documentation and/or other materials provided with the 17a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# distribution. 18a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# * Neither the name of Google Inc. nor the names of its 19a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# contributors may be used to endorse or promote products derived from 20a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# this software without specific prior written permission. 21a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# 22a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 25a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 26a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 28a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 32a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 34a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson"""Test for preservation of unknown fields in the pure Python implementation.""" 35a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 36a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson__author__ = 'bohdank@google.com (Bohdan Koval)' 37a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 38a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.apputils import basetest 39a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import unittest_mset_pb2 40a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import unittest_pb2 41a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import encoder 42a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import missing_enum_values_pb2 43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import test_util 44a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import type_checkers 45a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 47a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass UnknownFieldsTest(basetest.TestCase): 48a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 49a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def setUp(self): 50a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR 51a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.all_fields = unittest_pb2.TestAllTypes() 52a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson test_util.SetAllFields(self.all_fields) 53a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.all_fields_data = self.all_fields.SerializeToString() 54a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.empty_message = unittest_pb2.TestEmptyMessage() 55a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.empty_message.ParseFromString(self.all_fields_data) 56a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.unknown_fields = self.empty_message._unknown_fields 57a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 58a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def GetField(self, name): 59a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field_descriptor = self.descriptor.fields_by_name[name] 60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson wire_type = type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type] 61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field_tag = encoder.TagBytes(field_descriptor.number, wire_type) 62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson result_dict = {} 63a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for tag_bytes, value in self.unknown_fields: 64a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if tag_bytes == field_tag: 65afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson decoder = unittest_pb2.TestAllTypes._decoders_by_tag[tag_bytes][0] 66a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson decoder(value, 0, len(value), self.all_fields, result_dict) 67a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return result_dict[field_descriptor] 68a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 69a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testEnum(self): 70a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optional_nested_enum') 71a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.optional_nested_enum, value) 72a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 73a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testRepeatedEnum(self): 74a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('repeated_nested_enum') 75a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.repeated_nested_enum, value) 76a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 77a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testVarint(self): 78a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optional_int32') 79a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.optional_int32, value) 80a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 81a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testFixed32(self): 82a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optional_fixed32') 83a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.optional_fixed32, value) 84a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 85a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testFixed64(self): 86a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optional_fixed64') 87a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.optional_fixed64, value) 88a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testLengthDelimited(self): 90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optional_string') 91a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.optional_string, value) 92a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 93a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testGroup(self): 94a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optionalgroup') 95a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.optionalgroup, value) 96a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 97a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testSerialize(self): 98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson data = self.empty_message.SerializeToString() 99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Don't use assertEqual because we don't want to dump raw binary data to 101a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # stdout. 102a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertTrue(data == self.all_fields_data) 103a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testCopyFrom(self): 105a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message = unittest_pb2.TestEmptyMessage() 106a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.CopyFrom(self.empty_message) 107a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.unknown_fields, message._unknown_fields) 108a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 109a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testMergeFrom(self): 110a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message = unittest_pb2.TestAllTypes() 111a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.optional_int32 = 1 112a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.optional_uint32 = 2 113a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson source = unittest_pb2.TestEmptyMessage() 114a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson source.ParseFromString(message.SerializeToString()) 115a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 116a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.ClearField('optional_int32') 117a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.optional_int64 = 3 118a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.optional_uint32 = 4 119a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson destination = unittest_pb2.TestEmptyMessage() 120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson destination.ParseFromString(message.SerializeToString()) 121a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unknown_fields = destination._unknown_fields[:] 122a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson destination.MergeFrom(source) 124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(unknown_fields + source._unknown_fields, 125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson destination._unknown_fields) 126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 127a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testClear(self): 128a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.empty_message.Clear() 129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(0, len(self.empty_message._unknown_fields)) 130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testByteSize(self): 132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.ByteSize(), self.empty_message.ByteSize()) 133a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 134a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testUnknownExtensions(self): 135a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message = unittest_pb2.TestEmptyMessageWithExtensions() 136a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.ParseFromString(self.all_fields_data) 137a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.empty_message._unknown_fields, 138a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message._unknown_fields) 139a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 140a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testListFields(self): 141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Make sure ListFields doesn't return unknown fields. 142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(0, len(self.empty_message.ListFields())) 143a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testSerializeMessageSetWireFormatUnknownExtension(self): 145a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Create a message using the message set wire format with an unknown 146a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # message. 147a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson raw = unittest_mset_pb2.RawMessageSet() 148a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Add an unknown extension. 150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson item = raw.item.add() 151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson item.type_id = 1545009 152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message1 = unittest_mset_pb2.TestMessageSetExtension1() 153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message1.i = 12345 154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson item.message = message1.SerializeToString() 155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson serialized = raw.SerializeToString() 157a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Parse message using the message set wire format. 159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson proto = unittest_mset_pb2.TestMessageSet() 160a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson proto.MergeFromString(serialized) 161a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Verify that the unknown extension is serialized unchanged 163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson reserialized = proto.SerializeToString() 164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson new_raw = unittest_mset_pb2.RawMessageSet() 165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson new_raw.MergeFromString(reserialized) 166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(raw, new_raw) 167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testEquals(self): 169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message = unittest_pb2.TestEmptyMessage() 170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.ParseFromString(self.all_fields_data) 171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.empty_message, message) 172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.all_fields.ClearField('optional_string') 174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.ParseFromString(self.all_fields.SerializeToString()) 175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertNotEqual(self.empty_message, message) 176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass UnknownFieldsTest(basetest.TestCase): 179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def setUp(self): 181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.descriptor = missing_enum_values_pb2.TestEnumValues.DESCRIPTOR 182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.message = missing_enum_values_pb2.TestEnumValues() 184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.message.optional_nested_enum = ( 185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson missing_enum_values_pb2.TestEnumValues.ZERO) 186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.message.repeated_nested_enum.extend([ 187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson missing_enum_values_pb2.TestEnumValues.ZERO, 188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson missing_enum_values_pb2.TestEnumValues.ONE, 189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ]) 190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.message.packed_nested_enum.extend([ 191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson missing_enum_values_pb2.TestEnumValues.ZERO, 192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson missing_enum_values_pb2.TestEnumValues.ONE, 193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ]) 194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.message_data = self.message.SerializeToString() 195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.missing_message = missing_enum_values_pb2.TestMissingEnumValues() 196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.missing_message.ParseFromString(self.message_data) 197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.unknown_fields = self.missing_message._unknown_fields 198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def GetField(self, name): 200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field_descriptor = self.descriptor.fields_by_name[name] 201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson wire_type = type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type] 202a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field_tag = encoder.TagBytes(field_descriptor.number, wire_type) 203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson result_dict = {} 204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for tag_bytes, value in self.unknown_fields: 205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if tag_bytes == field_tag: 206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson decoder = missing_enum_values_pb2.TestEnumValues._decoders_by_tag[ 207afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson tag_bytes][0] 208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson decoder(value, 0, len(value), self.message, result_dict) 209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return result_dict[field_descriptor] 210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testUnknownEnumValue(self): 212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertFalse(self.missing_message.HasField('optional_nested_enum')) 213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optional_nested_enum') 214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.message.optional_nested_enum, value) 215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testUnknownRepeatedEnumValue(self): 217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('repeated_nested_enum') 218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.message.repeated_nested_enum, value) 219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testUnknownPackedEnumValue(self): 221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('packed_nested_enum') 222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.message.packed_nested_enum, value) 223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testRoundTrip(self): 225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson new_message = missing_enum_values_pb2.TestEnumValues() 226a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson new_message.ParseFromString(self.missing_message.SerializeToString()) 227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.message, new_message) 228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonif __name__ == '__main__': 231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson basetest.main() 232