1b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#! /usr/bin/env 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 38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertry: 39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer import unittest2 as unittest #PY26 40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerexcept ImportError: 41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer import unittest 42a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import unittest_mset_pb2 43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import unittest_pb2 44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerfrom google.protobuf import unittest_proto3_arena_pb2 45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerfrom google.protobuf.internal import api_implementation 46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import encoder 47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerfrom google.protobuf.internal import message_set_extensions_pb2 48a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import missing_enum_values_pb2 49a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import test_util 50a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import type_checkers 51a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 52a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerdef SkipIfCppImplementation(func): 54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return unittest.skipIf( 55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer api_implementation.Type() == 'cpp' and api_implementation.Version() == 2, 56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 'C++ implementation does not expose unknown fields to Python')(func) 57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass UnknownFieldsTest(unittest.TestCase): 60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def setUp(self): 62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR 63a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.all_fields = unittest_pb2.TestAllTypes() 64a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson test_util.SetAllFields(self.all_fields) 65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.all_fields_data = self.all_fields.SerializeToString() 66a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.empty_message = unittest_pb2.TestEmptyMessage() 67a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.empty_message.ParseFromString(self.all_fields_data) 68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer def testSerialize(self): 70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer data = self.empty_message.SerializeToString() 71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # Don't use assertEqual because we don't want to dump raw binary data to 73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # stdout. 74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertTrue(data == self.all_fields_data) 75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer def testSerializeProto3(self): 77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # Verify that proto3 doesn't preserve unknown fields. 78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message = unittest_proto3_arena_pb2.TestEmptyMessage() 79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.ParseFromString(self.all_fields_data) 80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(0, len(message.SerializeToString())) 81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer def testByteSize(self): 83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(self.all_fields.ByteSize(), self.empty_message.ByteSize()) 84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer def testListFields(self): 86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # Make sure ListFields doesn't return unknown fields. 87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(0, len(self.empty_message.ListFields())) 88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer def testSerializeMessageSetWireFormatUnknownExtension(self): 90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # Create a message using the message set wire format with an unknown 91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # message. 92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer raw = unittest_mset_pb2.RawMessageSet() 93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # Add an unknown extension. 95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer item = raw.item.add() 96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer item.type_id = 98418603 97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1 = message_set_extensions_pb2.TestMessageSetExtension1() 98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message1.i = 12345 99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer item.message = message1.SerializeToString() 100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer serialized = raw.SerializeToString() 102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # Parse message using the message set wire format. 104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer proto = message_set_extensions_pb2.TestMessageSet() 105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer proto.MergeFromString(serialized) 106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # Verify that the unknown extension is serialized unchanged 108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer reserialized = proto.SerializeToString() 109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer new_raw = unittest_mset_pb2.RawMessageSet() 110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer new_raw.MergeFromString(reserialized) 111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(raw, new_raw) 112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer def testEquals(self): 114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message = unittest_pb2.TestEmptyMessage() 115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.ParseFromString(self.all_fields_data) 116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(self.empty_message, message) 117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.all_fields.ClearField('optional_string') 119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.ParseFromString(self.all_fields.SerializeToString()) 120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertNotEqual(self.empty_message, message) 121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer def testDiscardUnknownFields(self): 123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.empty_message.DiscardUnknownFields() 124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(b'', self.empty_message.SerializeToString()) 125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # Test message field and repeated message field. 126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message = unittest_pb2.TestAllTypes() 127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer other_message = unittest_pb2.TestAllTypes() 128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer other_message.optional_string = 'discard' 129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.optional_nested_message.ParseFromString( 130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer other_message.SerializeToString()) 131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.repeated_nested_message.add().ParseFromString( 132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer other_message.SerializeToString()) 133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertNotEqual( 134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer b'', message.optional_nested_message.SerializeToString()) 135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertNotEqual( 136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer b'', message.repeated_nested_message[0].SerializeToString()) 137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.DiscardUnknownFields() 138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(b'', message.optional_nested_message.SerializeToString()) 139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual( 140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer b'', message.repeated_nested_message[0].SerializeToString()) 141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass UnknownFieldsAccessorsTest(unittest.TestCase): 144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer def setUp(self): 146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR 147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.all_fields = unittest_pb2.TestAllTypes() 148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer test_util.SetAllFields(self.all_fields) 149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.all_fields_data = self.all_fields.SerializeToString() 150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.empty_message = unittest_pb2.TestEmptyMessage() 151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.empty_message.ParseFromString(self.all_fields_data) 152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if api_implementation.Type() != 'cpp': 153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # _unknown_fields is an implementation detail. 154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.unknown_fields = self.empty_message._unknown_fields 155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # All the tests that use GetField() check an implementation detail of the 157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # Python implementation, which stores unknown fields as serialized strings. 158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # These tests are skipped by the C++ implementation: it's enough to check that 159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # the message is correctly serialized. 160a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 161a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def GetField(self, name): 162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field_descriptor = self.descriptor.fields_by_name[name] 163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson wire_type = type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type] 164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field_tag = encoder.TagBytes(field_descriptor.number, wire_type) 165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson result_dict = {} 166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for tag_bytes, value in self.unknown_fields: 167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if tag_bytes == field_tag: 168afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson decoder = unittest_pb2.TestAllTypes._decoders_by_tag[tag_bytes][0] 169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson decoder(value, 0, len(value), self.all_fields, result_dict) 170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return result_dict[field_descriptor] 171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @SkipIfCppImplementation 173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testEnum(self): 174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optional_nested_enum') 175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.optional_nested_enum, value) 176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @SkipIfCppImplementation 178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testRepeatedEnum(self): 179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('repeated_nested_enum') 180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.repeated_nested_enum, value) 181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @SkipIfCppImplementation 183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testVarint(self): 184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optional_int32') 185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.optional_int32, value) 186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @SkipIfCppImplementation 188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testFixed32(self): 189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optional_fixed32') 190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.optional_fixed32, value) 191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @SkipIfCppImplementation 193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testFixed64(self): 194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optional_fixed64') 195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.optional_fixed64, value) 196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @SkipIfCppImplementation 198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testLengthDelimited(self): 199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optional_string') 200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.optional_string, value) 201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @SkipIfCppImplementation 203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testGroup(self): 204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optionalgroup') 205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.all_fields.optionalgroup, value) 206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testCopyFrom(self): 208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message = unittest_pb2.TestEmptyMessage() 209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.CopyFrom(self.empty_message) 210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(message.SerializeToString(), self.all_fields_data) 211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testMergeFrom(self): 213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message = unittest_pb2.TestAllTypes() 214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.optional_int32 = 1 215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.optional_uint32 = 2 216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson source = unittest_pb2.TestEmptyMessage() 217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson source.ParseFromString(message.SerializeToString()) 218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.ClearField('optional_int32') 220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.optional_int64 = 3 221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.optional_uint32 = 4 222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson destination = unittest_pb2.TestEmptyMessage() 223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson destination.ParseFromString(message.SerializeToString()) 224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson destination.MergeFrom(source) 226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # Check that the fields where correctly merged, even stored in the unknown 227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # fields set. 228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer message.ParseFromString(destination.SerializeToString()) 229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(message.optional_int32, 1) 230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(message.optional_uint32, 2) 231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(message.optional_int64, 3) 232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testClear(self): 234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.empty_message.Clear() 235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # All cleared, even unknown fields. 236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(self.empty_message.SerializeToString(), b'') 237a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testUnknownExtensions(self): 239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message = unittest_pb2.TestEmptyMessageWithExtensions() 240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message.ParseFromString(self.all_fields_data) 241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(message.SerializeToString(), self.all_fields_data) 242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass UnknownEnumValuesTest(unittest.TestCase): 245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def setUp(self): 247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.descriptor = missing_enum_values_pb2.TestEnumValues.DESCRIPTOR 248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.message = missing_enum_values_pb2.TestEnumValues() 250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.message.optional_nested_enum = ( 251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson missing_enum_values_pb2.TestEnumValues.ZERO) 252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.message.repeated_nested_enum.extend([ 253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson missing_enum_values_pb2.TestEnumValues.ZERO, 254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson missing_enum_values_pb2.TestEnumValues.ONE, 255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ]) 256a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.message.packed_nested_enum.extend([ 257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson missing_enum_values_pb2.TestEnumValues.ZERO, 258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson missing_enum_values_pb2.TestEnumValues.ONE, 259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ]) 260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.message_data = self.message.SerializeToString() 261a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.missing_message = missing_enum_values_pb2.TestMissingEnumValues() 262a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.missing_message.ParseFromString(self.message_data) 263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if api_implementation.Type() != 'cpp': 264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # _unknown_fields is an implementation detail. 265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.unknown_fields = self.missing_message._unknown_fields 266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # All the tests that use GetField() check an implementation detail of the 268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # Python implementation, which stores unknown fields as serialized strings. 269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # These tests are skipped by the C++ implementation: it's enough to check that 270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # the message is correctly serialized. 271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def GetField(self, name): 273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field_descriptor = self.descriptor.fields_by_name[name] 274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson wire_type = type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type] 275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field_tag = encoder.TagBytes(field_descriptor.number, wire_type) 276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson result_dict = {} 277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for tag_bytes, value in self.unknown_fields: 278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if tag_bytes == field_tag: 279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson decoder = missing_enum_values_pb2.TestEnumValues._decoders_by_tag[ 280afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson tag_bytes][0] 281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson decoder(value, 0, len(value), self.message, result_dict) 282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return result_dict[field_descriptor] 283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer def testUnknownParseMismatchEnumValue(self): 285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer just_string = missing_enum_values_pb2.JustString() 286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer just_string.dummy = 'blah' 287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer missing = missing_enum_values_pb2.TestEnumValues() 289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # The parse is invalid, storing the string proto into the set of 290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # unknown fields. 291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer missing.ParseFromString(just_string.SerializeToString()) 292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # Fetching the enum field shouldn't crash, instead returning the 294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer # default value. 295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer self.assertEqual(missing.optional_nested_enum, 0) 296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @SkipIfCppImplementation 298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testUnknownEnumValue(self): 299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertFalse(self.missing_message.HasField('optional_nested_enum')) 300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('optional_nested_enum') 301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.message.optional_nested_enum, value) 302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @SkipIfCppImplementation 304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testUnknownRepeatedEnumValue(self): 305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('repeated_nested_enum') 306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.message.repeated_nested_enum, value) 307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer @SkipIfCppImplementation 309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testUnknownPackedEnumValue(self): 310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson value = self.GetField('packed_nested_enum') 311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.message.packed_nested_enum, value) 312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testRoundTrip(self): 314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson new_message = missing_enum_values_pb2.TestEnumValues() 315a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson new_message.ParseFromString(self.missing_message.SerializeToString()) 316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(self.message, new_message) 317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 318a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 319a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonif __name__ == '__main__': 320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer unittest.main() 321