15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#! /usr/bin/python 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# -*- coding: utf-8 -*- 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Protocol Buffers - Google's data interchange format 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2008 Google Inc. All rights reserved. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# http://code.google.com/p/protobuf/ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Redistribution and use in source and binary forms, with or without 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# modification, are permitted provided that the following conditions are 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# met: 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Redistributions of source code must retain the above copyright 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# notice, this list of conditions and the following disclaimer. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Redistributions in binary form must reproduce the above 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# in the documentation and/or other materials provided with the 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# distribution. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Neither the name of Google Inc. nor the names of its 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# contributors may be used to endorse or promote products derived from 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# this software without specific prior written permission. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Unittest for reflection.py, which also indirectly tests the output of the 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pure-Python protocol compiler. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__author__ = 'robinson@google.com (Will Robinson)' 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochimport gc 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import operator 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import struct 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import unittest_import_pb2 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import unittest_mset_pb2 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import unittest_pb2 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import descriptor_pb2 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import descriptor 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import message 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import reflection 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import api_implementation 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import more_extensions_pb2 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import more_messages_pb2 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import wire_format 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import test_util 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import decoder 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class _MiniDecoder(object): 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Decodes a stream of values from a string. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Once upon a time we actually had a class called decoder.Decoder. Then we 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) got rid of it during a redesign that made decoding much, much faster overall. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) But a couple tests in this file used it to check that the serialized form of 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a message was correct. So, this class implements just the methods that were 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) used by said tests, so that we don't have to rewrite the tests. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, bytes): 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._bytes = bytes 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._pos = 0 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def ReadVarint(self): 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result, self._pos = decoder._DecodeVarint(self._bytes, self._pos) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadInt32 = ReadVarint 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadInt64 = ReadVarint 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadUInt32 = ReadVarint 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadUInt64 = ReadVarint 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def ReadSInt64(self): 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return wire_format.ZigZagDecode(self.ReadVarint()) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadSInt32 = ReadSInt64 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def ReadFieldNumberAndWireType(self): 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return wire_format.UnpackTag(self.ReadVarint()) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def ReadFloat(self): 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = struct.unpack("<f", self._bytes[self._pos:self._pos+4])[0] 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._pos += 4 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def ReadDouble(self): 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = struct.unpack("<d", self._bytes[self._pos:self._pos+8])[0] 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._pos += 8 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def EndOfStream(self): 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return self._pos == len(self._bytes) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ReflectionTest(unittest.TestCase): 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def assertListsEqual(self, values, others): 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(len(values), len(others)) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for i in range(len(values)): 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(values[i], others[i]) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testScalarConstructor(self): 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Constructor with only scalar types should succeed. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes( 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_int32=24, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_double=54.321, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_string='optional_string') 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(24, proto.optional_int32) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(54.321, proto.optional_double) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual('optional_string', proto.optional_string) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedScalarConstructor(self): 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Constructor with only repeated scalar types should succeed. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes( 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated_int32=[1, 2, 3, 4], 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated_double=[1.23, 54.321], 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated_bool=[True, False, False], 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated_string=["optional_string"]) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals([1, 2, 3, 4], list(proto.repeated_int32)) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals([1.23, 54.321], list(proto.repeated_double)) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals([True, False, False], list(proto.repeated_bool)) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals(["optional_string"], list(proto.repeated_string)) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedCompositeConstructor(self): 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Constructor with only repeated composite types should succeed. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes( 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated_nested_message=[ 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.NestedMessage( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bb=unittest_pb2.TestAllTypes.FOO), 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.NestedMessage( 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bb=unittest_pb2.TestAllTypes.BAR)], 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated_foreign_message=[ 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.ForeignMessage(c=-43), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.ForeignMessage(c=45324), 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.ForeignMessage(c=12)], 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeatedgroup=[ 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.RepeatedGroup(), 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.RepeatedGroup(a=1), 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.RepeatedGroup(a=2)]) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals( 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [unittest_pb2.TestAllTypes.NestedMessage( 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bb=unittest_pb2.TestAllTypes.FOO), 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.NestedMessage( 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bb=unittest_pb2.TestAllTypes.BAR)], 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list(proto.repeated_nested_message)) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals( 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [unittest_pb2.ForeignMessage(c=-43), 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.ForeignMessage(c=45324), 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.ForeignMessage(c=12)], 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list(proto.repeated_foreign_message)) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals( 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [unittest_pb2.TestAllTypes.RepeatedGroup(), 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.RepeatedGroup(a=1), 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.RepeatedGroup(a=2)], 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list(proto.repeatedgroup)) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMixedConstructor(self): 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Constructor with only mixed types should succeed. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes( 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_int32=24, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_string='optional_string', 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated_double=[1.23, 54.321], 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated_bool=[True, False, False], 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated_nested_message=[ 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.NestedMessage( 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bb=unittest_pb2.TestAllTypes.FOO), 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.NestedMessage( 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bb=unittest_pb2.TestAllTypes.BAR)], 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated_foreign_message=[ 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.ForeignMessage(c=-43), 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.ForeignMessage(c=45324), 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.ForeignMessage(c=12)]) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(24, proto.optional_int32) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual('optional_string', proto.optional_string) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals([1.23, 54.321], list(proto.repeated_double)) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals([True, False, False], list(proto.repeated_bool)) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals( 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [unittest_pb2.TestAllTypes.NestedMessage( 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bb=unittest_pb2.TestAllTypes.FOO), 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.NestedMessage( 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bb=unittest_pb2.TestAllTypes.BAR)], 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list(proto.repeated_nested_message)) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals( 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [unittest_pb2.ForeignMessage(c=-43), 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.ForeignMessage(c=45324), 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.ForeignMessage(c=12)], 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list(proto.repeated_foreign_message)) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testConstructorTypeError(self): 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises( 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeError, unittest_pb2.TestAllTypes, optional_int32="foo") 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises( 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeError, unittest_pb2.TestAllTypes, optional_string=1234) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises( 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeError, unittest_pb2.TestAllTypes, optional_nested_message=1234) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises( 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeError, unittest_pb2.TestAllTypes, repeated_int32=1234) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises( 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeError, unittest_pb2.TestAllTypes, repeated_int32=["foo"]) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises( 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeError, unittest_pb2.TestAllTypes, repeated_string=1234) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises( 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeError, unittest_pb2.TestAllTypes, repeated_string=[1234]) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises( 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=1234) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises( 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=[1234]) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testConstructorInvalidatesCachedByteSize(self): 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message = unittest_pb2.TestAllTypes(optional_int32 = 12) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals(2, message.ByteSize()) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message = unittest_pb2.TestAllTypes( 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_nested_message = unittest_pb2.TestAllTypes.NestedMessage()) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals(3, message.ByteSize()) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message = unittest_pb2.TestAllTypes(repeated_int32 = [12]) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals(3, message.ByteSize()) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message = unittest_pb2.TestAllTypes( 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated_nested_message = [unittest_pb2.TestAllTypes.NestedMessage()]) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals(3, message.ByteSize()) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSimpleHasBits(self): 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test a scalar. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.HasField('optional_int32')) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_int32) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # HasField() shouldn't be true if all we've done is 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # read the default value. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.HasField('optional_int32')) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_int32 = 1 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Setting a value however *should* set the "has" bit. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_int32')) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ClearField('optional_int32') 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # And clearing that value should unset the "has" bit. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.HasField('optional_int32')) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testHasBitsWithSinglyNestedScalar(self): 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Helper used to test foreign messages and groups. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # composite_field_name should be the name of a non-repeated 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # composite (i.e., foreign or group) field in TestAllTypes, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # and scalar_field_name should be the name of an integer-valued 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # scalar field within that composite. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # I never thought I'd miss C++ macros and templates so much. :( 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # This helper is semantically just: 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # assert proto.composite_field.scalar_field == 0 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # assert not proto.composite_field.HasField('scalar_field') 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # assert not proto.HasField('composite_field') 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # proto.composite_field.scalar_field = 10 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # old_composite_field = proto.composite_field 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # assert proto.composite_field.scalar_field == 10 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # assert proto.composite_field.HasField('scalar_field') 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # assert proto.HasField('composite_field') 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # proto.ClearField('composite_field') 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # assert not proto.composite_field.HasField('scalar_field') 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # assert not proto.HasField('composite_field') 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # assert proto.composite_field.scalar_field == 0 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # # Now ensure that ClearField('composite_field') disconnected 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # # the old field object from the object tree... 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # assert old_composite_field is not proto.composite_field 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # old_composite_field.scalar_field = 20 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # assert not proto.composite_field.HasField('scalar_field') 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # assert not proto.HasField('composite_field') 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def TestCompositeHasBits(composite_field_name, scalar_field_name): 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # First, check that we can get the scalar value, and see that it's the 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # default (0), but that proto.HasField('omposite') and 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # proto.composite.HasField('scalar') will still return False. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) composite_field = getattr(proto, composite_field_name) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_scalar_value = getattr(composite_field, scalar_field_name) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, original_scalar_value) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Assert that the composite object does not "have" the scalar. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not composite_field.HasField(scalar_field_name)) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Assert that proto does not "have" the composite field. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.HasField(composite_field_name)) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Now set the scalar within the composite field. Ensure that the setting 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # is reflected, and that proto.HasField('composite') and 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # proto.composite.HasField('scalar') now both return True. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_val = 20 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setattr(composite_field, scalar_field_name, new_val) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(new_val, getattr(composite_field, scalar_field_name)) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Hold on to a reference to the current composite_field object. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_composite_field = composite_field 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Assert that the has methods now return true. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(composite_field.HasField(scalar_field_name)) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField(composite_field_name)) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Now call the clear method... 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ClearField(composite_field_name) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # ...and ensure that the "has" bits are all back to False... 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) composite_field = getattr(proto, composite_field_name) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not composite_field.HasField(scalar_field_name)) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.HasField(composite_field_name)) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # ...and ensure that the scalar field has returned to its default. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, getattr(composite_field, scalar_field_name)) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(old_composite_field is not composite_field) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setattr(old_composite_field, scalar_field_name, new_val) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not composite_field.HasField(scalar_field_name)) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.HasField(composite_field_name)) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, getattr(composite_field, scalar_field_name)) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test simple, single-level nesting when we set a scalar. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompositeHasBits('optionalgroup', 'a') 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompositeHasBits('optional_nested_message', 'bb') 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompositeHasBits('optional_foreign_message', 'c') 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompositeHasBits('optional_import_message', 'd') 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testReferencesToNestedMessage(self): 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested = proto.optional_nested_message 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del proto 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # A previous version had a bug where this would raise an exception when 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # hitting a now-dead weak reference. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested.bb = 23 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testDisconnectingNestedMessageBeforeSettingField(self): 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested = proto.optional_nested_message 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ClearField('optional_nested_message') # Should disconnect from parent 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(nested is not proto.optional_nested_message) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested.bb = 23 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.HasField('optional_nested_message')) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_nested_message.bb) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def testGetDefaultMessageAfterDisconnectingDefaultMessage(self): 352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto = unittest_pb2.TestAllTypes() 353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nested = proto.optional_nested_message 354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.ClearField('optional_nested_message') 355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch del proto 356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch del nested 357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # Force a garbage collect so that the underlying CMessages are freed along 358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # with the Messages they point to. This is to make sure we're not deleting 359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # default message instances. 360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gc.collect() 361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto = unittest_pb2.TestAllTypes() 362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nested = proto.optional_nested_message 363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def testDisconnectingNestedMessageAfterSettingField(self): 365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto = unittest_pb2.TestAllTypes() 366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nested = proto.optional_nested_message 367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nested.bb = 5 368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(proto.HasField('optional_nested_message')) 369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.ClearField('optional_nested_message') # Should disconnect from parent 370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(5, nested.bb) 371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(0, proto.optional_nested_message.bb) 372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(nested is not proto.optional_nested_message) 373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nested.bb = 23 374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(not proto.HasField('optional_nested_message')) 375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(0, proto.optional_nested_message.bb) 376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def testDisconnectingNestedMessageBeforeGettingField(self): 378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto = unittest_pb2.TestAllTypes() 379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(not proto.HasField('optional_nested_message')) 380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.ClearField('optional_nested_message') 381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(not proto.HasField('optional_nested_message')) 382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def testDisconnectingNestedMessageAfterMerge(self): 384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # This test exercises the code path that does not use ReleaseMessage(). 385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # The underlying fear is that if we use ReleaseMessage() incorrectly, 386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # we will have memory leaks. It's hard to check that that doesn't happen, 387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # but at least we can exercise that code path to make sure it works. 388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto1 = unittest_pb2.TestAllTypes() 389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto2 = unittest_pb2.TestAllTypes() 390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto2.optional_nested_message.bb = 5 391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto1.MergeFrom(proto2) 392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(proto1.HasField('optional_nested_message')) 393ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto1.ClearField('optional_nested_message') 394ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(not proto1.HasField('optional_nested_message')) 395ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def testDisconnectingLazyNestedMessage(self): 397ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # This test exercises releasing a nested message that is lazy. This test 398ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # only exercises real code in the C++ implementation as Python does not 399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # support lazy parsing, but the current C++ implementation results in 400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # memory corruption and a crash. 401ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if api_implementation.Type() != 'python': 402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return 403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto = unittest_pb2.TestAllTypes() 404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.optional_lazy_message.bb = 5 405ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.ClearField('optional_lazy_message') 406ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch del proto 407ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch gc.collect() 408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testHasBitsWhenModifyingRepeatedFields(self): 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test nesting when we add an element to a repeated field in a submessage. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestNestedMessageHasBits() 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_nested_message.nestedmessage_repeated_int32.append(5) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [5], proto.optional_nested_message.nestedmessage_repeated_int32) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_nested_message')) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Do the same test, but with a repeated composite field within the 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # submessage. 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ClearField('optional_nested_message') 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.HasField('optional_nested_message')) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_nested_message.nestedmessage_repeated_foreignmessage.add() 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_nested_message')) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testHasBitsForManyLevelsOfNesting(self): 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test nesting many levels deep. 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) recursive_proto = unittest_pb2.TestMutualRecursionA() 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not recursive_proto.HasField('bb')) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, recursive_proto.bb.a.bb.a.bb.optional_int32) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not recursive_proto.HasField('bb')) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) recursive_proto.bb.a.bb.a.bb.optional_int32 = 5 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(5, recursive_proto.bb.a.bb.a.bb.optional_int32) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(recursive_proto.HasField('bb')) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(recursive_proto.bb.HasField('a')) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(recursive_proto.bb.a.HasField('bb')) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(recursive_proto.bb.a.bb.HasField('a')) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(recursive_proto.bb.a.bb.a.HasField('bb')) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not recursive_proto.bb.a.bb.a.bb.HasField('a')) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(recursive_proto.bb.a.bb.a.bb.HasField('optional_int32')) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSingularListFields(self): 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_fixed32 = 1 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_int32 = 5 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_string = 'foo' 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Access sub-message but don't set it yet. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested_message = proto.optional_nested_message 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [ (proto.DESCRIPTOR.fields_by_name['optional_int32' ], 5), 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1), 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo') ], 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ListFields()) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_nested_message.bb = 123 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [ (proto.DESCRIPTOR.fields_by_name['optional_int32' ], 5), 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1), 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo'), 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (proto.DESCRIPTOR.fields_by_name['optional_nested_message' ], 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested_message) ], 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ListFields()) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedListFields(self): 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_fixed32.append(1) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.append(5) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.append(11) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_string.extend(['foo', 'bar']) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_string.extend([]) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_string.append('baz') 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_string.extend(str(x) for x in xrange(2)) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_int32 = 21 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_bool # Access but don't set anything; should not be listed. 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [ (proto.DESCRIPTOR.fields_by_name['optional_int32' ], 21), 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (proto.DESCRIPTOR.fields_by_name['repeated_int32' ], [5, 11]), 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (proto.DESCRIPTOR.fields_by_name['repeated_fixed32'], [1]), 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (proto.DESCRIPTOR.fields_by_name['repeated_string' ], 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ['foo', 'bar', 'baz', '0', '1']) ], 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ListFields()) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSingularListExtensions(self): 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllExtensions() 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[unittest_pb2.optional_fixed32_extension] = 1 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[unittest_pb2.optional_int32_extension ] = 5 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[unittest_pb2.optional_string_extension ] = 'foo' 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [ (unittest_pb2.optional_int32_extension , 5), 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (unittest_pb2.optional_fixed32_extension, 1), 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (unittest_pb2.optional_string_extension , 'foo') ], 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ListFields()) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedListExtensions(self): 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllExtensions() 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[unittest_pb2.repeated_fixed32_extension].append(1) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[unittest_pb2.repeated_int32_extension ].append(5) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[unittest_pb2.repeated_int32_extension ].append(11) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[unittest_pb2.repeated_string_extension ].append('foo') 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[unittest_pb2.repeated_string_extension ].append('bar') 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[unittest_pb2.repeated_string_extension ].append('baz') 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[unittest_pb2.optional_int32_extension ] = 21 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [ (unittest_pb2.optional_int32_extension , 21), 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (unittest_pb2.repeated_int32_extension , [5, 11]), 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (unittest_pb2.repeated_fixed32_extension, [1]), 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (unittest_pb2.repeated_string_extension , ['foo', 'bar', 'baz']) ], 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ListFields()) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testListFieldsAndExtensions(self): 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestFieldOrderings() 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllFieldsAndExtensions(proto) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.my_extension_int 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [ (proto.DESCRIPTOR.fields_by_name['my_int' ], 1), 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (unittest_pb2.my_extension_int , 23), 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (proto.DESCRIPTOR.fields_by_name['my_string'], 'foo'), 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (unittest_pb2.my_extension_string , 'bar'), 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (proto.DESCRIPTOR.fields_by_name['my_float' ], 1.0) ], 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ListFields()) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testDefaultValues(self): 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_int32) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_int64) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_uint32) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_uint64) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_sint32) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_sint64) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_fixed32) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_fixed64) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_sfixed32) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_sfixed64) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0.0, proto.optional_float) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0.0, proto.optional_double) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(False, proto.optional_bool) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual('', proto.optional_string) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual('', proto.optional_bytes) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(41, proto.default_int32) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(42, proto.default_int64) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(43, proto.default_uint32) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(44, proto.default_uint64) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(-45, proto.default_sint32) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(46, proto.default_sint64) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(47, proto.default_fixed32) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(48, proto.default_fixed64) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(49, proto.default_sfixed32) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(-50, proto.default_sfixed64) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(51.5, proto.default_float) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(52e3, proto.default_double) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(True, proto.default_bool) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual('hello', proto.default_string) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual('world', proto.default_bytes) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.TestAllTypes.BAR, proto.default_nested_enum) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.FOREIGN_BAR, proto.default_foreign_enum) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_import_pb2.IMPORT_BAR, 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.default_import_enum) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestExtremeDefaultValues() 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(u'\u1234', proto.utf8_string) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testHasFieldWithUnknownFieldName(self): 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(ValueError, proto.HasField, 'nonexistent_field') 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testClearFieldWithUnknownFieldName(self): 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(ValueError, proto.ClearField, 'nonexistent_field') 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testDisallowedAssignments(self): 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # It's illegal to assign values directly to repeated fields 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # or to nonrepeated composite fields. Ensure that this fails. 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Repeated fields. 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', 10) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Lists shouldn't work, either. 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', [10]) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Composite fields. 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(AttributeError, setattr, proto, 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'optional_nested_message', 23) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Assignment to a repeated nested message field without specifying 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # the index in the array of nested messages. 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(AttributeError, setattr, proto.repeated_nested_message, 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'bb', 34) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Assignment to an attribute of a repeated field. 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(AttributeError, setattr, proto.repeated_float, 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'some_attribute', 34) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # proto.nonexistent_field = 23 should fail as well. 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(AttributeError, setattr, proto, 'nonexistent_field', 23) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSingleScalarTypeSafety(self): 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, setattr, proto, 'optional_int32', 1.1) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, setattr, proto, 'optional_int32', 'foo') 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, setattr, proto, 'optional_string', 10) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, setattr, proto, 'optional_bytes', 10) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSingleScalarBoundsChecking(self): 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def TestMinAndMaxIntegers(field_name, expected_min, expected_max): 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb = unittest_pb2.TestAllTypes() 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setattr(pb, field_name, expected_min) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(expected_min, getattr(pb, field_name)) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setattr(pb, field_name, expected_max) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(expected_max, getattr(pb, field_name)) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(ValueError, setattr, pb, field_name, expected_min - 1) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(ValueError, setattr, pb, field_name, expected_max + 1) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestMinAndMaxIntegers('optional_int32', -(1 << 31), (1 << 31) - 1) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestMinAndMaxIntegers('optional_uint32', 0, 0xffffffff) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestMinAndMaxIntegers('optional_int64', -(1 << 63), (1 << 63) - 1) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestMinAndMaxIntegers('optional_uint64', 0, 0xffffffffffffffff) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb = unittest_pb2.TestAllTypes() 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb.optional_nested_enum = 1 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, pb.optional_nested_enum) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Invalid enum values. 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb.optional_nested_enum = 0 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, pb.optional_nested_enum) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_size_before = pb.ByteSize() 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb.optional_nested_enum = 4 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(4, pb.optional_nested_enum) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb.optional_nested_enum = 0 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, pb.optional_nested_enum) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Make sure that setting the same enum field doesn't just add unknown 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # fields (but overwrites them). 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(bytes_size_before, pb.ByteSize()) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Is the invalid value preserved after serialization? 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = pb.SerializeToString() 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb2 = unittest_pb2.TestAllTypes() 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pb2.ParseFromString(serialized) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, pb2.optional_nested_enum) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(pb, pb2) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedScalarTypeSafety(self): 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, proto.repeated_int32.append, 1.1) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, proto.repeated_int32.append, 'foo') 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, proto.repeated_string, 10) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, proto.repeated_bytes, 10) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.append(10) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32[0] = 23 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(IndexError, proto.repeated_int32.__setitem__, 500, 23) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, proto.repeated_int32.__setitem__, 0, 'abc') 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Repeated enums tests. 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #proto.repeated_nested_enum.append(0) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSingleScalarGettersAndSetters(self): 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_int32) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_int32 = 1 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto.optional_int32) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_uint64 = 0xffffffffffff 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0xffffffffffff, proto.optional_uint64) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_uint64 = 0xffffffffffffffff 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0xffffffffffffffff, proto.optional_uint64) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # TODO(robinson): Test all other scalar field types. 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSingleScalarClearField(self): 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Should be allowed to clear something that's not there (a no-op). 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ClearField('optional_int32') 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_int32 = 1 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_int32')) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ClearField('optional_int32') 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.optional_int32) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.HasField('optional_int32')) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # TODO(robinson): Test all other scalar field types. 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testEnums(self): 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto.FOO) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, unittest_pb2.TestAllTypes.FOO) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, proto.BAR) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, unittest_pb2.TestAllTypes.BAR) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, proto.BAZ) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 686ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def testEnum_Name(self): 687ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual('FOREIGN_FOO', 688ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_FOO)) 689ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual('FOREIGN_BAR', 690ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_BAR)) 691ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual('FOREIGN_BAZ', 692ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_BAZ)) 693ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertRaises(ValueError, 694ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.ForeignEnum.Name, 11312) 695ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 696ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto = unittest_pb2.TestAllTypes() 697ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual('FOO', 698ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.NestedEnum.Name(proto.FOO)) 699ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual('FOO', 700ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.TestAllTypes.NestedEnum.Name(proto.FOO)) 701ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual('BAR', 702ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.NestedEnum.Name(proto.BAR)) 703ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual('BAR', 704ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.TestAllTypes.NestedEnum.Name(proto.BAR)) 705ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual('BAZ', 706ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.NestedEnum.Name(proto.BAZ)) 707ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual('BAZ', 708ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.TestAllTypes.NestedEnum.Name(proto.BAZ)) 709ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertRaises(ValueError, 710ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.NestedEnum.Name, 11312) 711ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertRaises(ValueError, 712ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.TestAllTypes.NestedEnum.Name, 11312) 713ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 714ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def testEnum_Value(self): 715ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(unittest_pb2.FOREIGN_FOO, 716ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.ForeignEnum.Value('FOREIGN_FOO')) 717ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(unittest_pb2.FOREIGN_BAR, 718ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.ForeignEnum.Value('FOREIGN_BAR')) 719ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(unittest_pb2.FOREIGN_BAZ, 720ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.ForeignEnum.Value('FOREIGN_BAZ')) 721ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertRaises(ValueError, 722ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.ForeignEnum.Value, 'FO') 723ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 724ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto = unittest_pb2.TestAllTypes() 725ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(proto.FOO, 726ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.NestedEnum.Value('FOO')) 727ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(proto.FOO, 728ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.TestAllTypes.NestedEnum.Value('FOO')) 729ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(proto.BAR, 730ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.NestedEnum.Value('BAR')) 731ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(proto.BAR, 732ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.TestAllTypes.NestedEnum.Value('BAR')) 733ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(proto.BAZ, 734ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.NestedEnum.Value('BAZ')) 735ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(proto.BAZ, 736ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.TestAllTypes.NestedEnum.Value('BAZ')) 737ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertRaises(ValueError, 738ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.NestedEnum.Value, 'Foo') 739ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertRaises(ValueError, 740ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.TestAllTypes.NestedEnum.Value, 'Foo') 741ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 742ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def testEnum_KeysAndValues(self): 743ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(['FOREIGN_FOO', 'FOREIGN_BAR', 'FOREIGN_BAZ'], 744ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.ForeignEnum.keys()) 745ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual([4, 5, 6], 746ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.ForeignEnum.values()) 747ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual([('FOREIGN_FOO', 4), ('FOREIGN_BAR', 5), 748ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ('FOREIGN_BAZ', 6)], 749ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch unittest_pb2.ForeignEnum.items()) 750ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 751ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto = unittest_pb2.TestAllTypes() 752ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(['FOO', 'BAR', 'BAZ'], proto.NestedEnum.keys()) 753ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual([1, 2, 3], proto.NestedEnum.values()) 754ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual([('FOO', 1), ('BAR', 2), ('BAZ', 3)], 755ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.NestedEnum.items()) 756ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedScalars(self): 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.repeated_int32) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, len(proto.repeated_int32)) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.append(5) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.append(10) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.append(15) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.repeated_int32) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, len(proto.repeated_int32)) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([5, 10, 15], proto.repeated_int32) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test single retrieval. 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(5, proto.repeated_int32[0]) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(15, proto.repeated_int32[-1]) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test out-of-bounds indices. 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(IndexError, proto.repeated_int32.__getitem__, 1234) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(IndexError, proto.repeated_int32.__getitem__, -1234) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test incorrect types passed to __getitem__. 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, proto.repeated_int32.__getitem__, 'foo') 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, proto.repeated_int32.__getitem__, None) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test single assignment. 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32[1] = 20 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([5, 20, 15], proto.repeated_int32) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test insertion. 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.insert(1, 25) 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([5, 25, 20, 15], proto.repeated_int32) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test slice retrieval. 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.append(30) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([25, 20, 15], proto.repeated_int32[1:4]) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([5, 25, 20, 15, 30], proto.repeated_int32[:]) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test slice assignment with an iterator 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32[1:4] = (i for i in xrange(3)) 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([5, 0, 1, 2, 30], proto.repeated_int32) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test slice assignment. 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32[1:4] = [35, 40, 45] 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([5, 35, 40, 45, 30], proto.repeated_int32) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test that we can use the field as an iterator. 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = [] 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for i in proto.repeated_int32: 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.append(i) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([5, 35, 40, 45, 30], result) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test single deletion. 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del proto.repeated_int32[2] 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([5, 35, 45, 30], proto.repeated_int32) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test slice deletion. 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del proto.repeated_int32[2:] 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([5, 35], proto.repeated_int32) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test extending. 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.extend([3, 13]) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([5, 35, 3, 13], proto.repeated_int32) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test clearing. 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ClearField('repeated_int32') 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.repeated_int32) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, len(proto.repeated_int32)) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.append(1) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto.repeated_int32[-1]) 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test assignment to a negative index. 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32[-1] = 2 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, proto.repeated_int32[-1]) 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test deletion at negative indices. 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32[:] = [0, 1, 2, 3] 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del proto.repeated_int32[-1] 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([0, 1, 2], proto.repeated_int32) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del proto.repeated_int32[-2] 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([0, 2], proto.repeated_int32) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(IndexError, proto.repeated_int32.__delitem__, -3) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(IndexError, proto.repeated_int32.__delitem__, 300) 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del proto.repeated_int32[-2:-1] 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([2], proto.repeated_int32) 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del proto.repeated_int32[100:10000] 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([2], proto.repeated_int32) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedScalarsRemove(self): 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.repeated_int32) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, len(proto.repeated_int32)) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.append(5) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.append(10) 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.append(5) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.append(5) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(4, len(proto.repeated_int32)) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.remove(5) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, len(proto.repeated_int32)) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(10, proto.repeated_int32[0]) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(5, proto.repeated_int32[1]) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(5, proto.repeated_int32[2]) 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.remove(5) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, len(proto.repeated_int32)) 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(10, proto.repeated_int32[0]) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(5, proto.repeated_int32[1]) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_int32.remove(10) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, len(proto.repeated_int32)) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(5, proto.repeated_int32[0]) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Remove a non-existent element. 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(ValueError, proto.repeated_int32.remove, 123) 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedComposites(self): 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.repeated_nested_message) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, len(proto.repeated_nested_message)) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m0 = proto.repeated_nested_message.add() 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m1 = proto.repeated_nested_message.add() 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.repeated_nested_message) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, len(proto.repeated_nested_message)) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertListsEqual([m0, m1], proto.repeated_nested_message) 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(isinstance(m0, unittest_pb2.TestAllTypes.NestedMessage)) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test out-of-bounds indices. 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__, 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1234) 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__, 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -1234) 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test incorrect types passed to __getitem__. 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__, 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'foo') 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__, 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) None) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test slice retrieval. 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m2 = proto.repeated_nested_message.add() 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m3 = proto.repeated_nested_message.add() 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m4 = proto.repeated_nested_message.add() 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertListsEqual( 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [m1, m2, m3], proto.repeated_nested_message[1:4]) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertListsEqual( 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [m0, m1, m2, m3, m4], proto.repeated_nested_message[:]) 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertListsEqual( 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [m0, m1], proto.repeated_nested_message[:2]) 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertListsEqual( 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [m2, m3, m4], proto.repeated_nested_message[2:]) 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m0, proto.repeated_nested_message[0]) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertListsEqual( 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [m0], proto.repeated_nested_message[:1]) 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test that we can use the field as an iterator. 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = [] 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for i in proto.repeated_nested_message: 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.append(i) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertListsEqual([m0, m1, m2, m3, m4], result) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test single deletion. 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del proto.repeated_nested_message[2] 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertListsEqual([m0, m1, m3, m4], proto.repeated_nested_message) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test slice deletion. 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del proto.repeated_nested_message[2:] 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertListsEqual([m0, m1], proto.repeated_nested_message) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test extending. 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n1 = unittest_pb2.TestAllTypes.NestedMessage(bb=1) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n2 = unittest_pb2.TestAllTypes.NestedMessage(bb=2) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_nested_message.extend([n1,n2]) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(4, len(proto.repeated_nested_message)) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(n1, proto.repeated_nested_message[2]) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(n2, proto.repeated_nested_message[3]) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test clearing. 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.ClearField('repeated_nested_message') 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.repeated_nested_message) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, len(proto.repeated_nested_message)) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test constructing an element while adding it. 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_nested_message.add(bb=23) 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, len(proto.repeated_nested_message)) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(23, proto.repeated_nested_message[0].bb) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 948ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def testRepeatedCompositeRemove(self): 949ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto = unittest_pb2.TestAllTypes() 950ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 951ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(0, len(proto.repeated_nested_message)) 952ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch m0 = proto.repeated_nested_message.add() 953ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # Need to set some differentiating variable so m0 != m1 != m2: 954ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch m0.bb = len(proto.repeated_nested_message) 955ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch m1 = proto.repeated_nested_message.add() 956ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch m1.bb = len(proto.repeated_nested_message) 957ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(m0 != m1) 958ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch m2 = proto.repeated_nested_message.add() 959ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch m2.bb = len(proto.repeated_nested_message) 960ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertListsEqual([m0, m1, m2], proto.repeated_nested_message) 961ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 962ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(3, len(proto.repeated_nested_message)) 963ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.repeated_nested_message.remove(m0) 964ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(2, len(proto.repeated_nested_message)) 965ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(m1, proto.repeated_nested_message[0]) 966ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(m2, proto.repeated_nested_message[1]) 967ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 968ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # Removing m0 again or removing None should raise error 969ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertRaises(ValueError, proto.repeated_nested_message.remove, m0) 970ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertRaises(ValueError, proto.repeated_nested_message.remove, None) 971ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(2, len(proto.repeated_nested_message)) 972ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 973ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.repeated_nested_message.remove(m2) 974ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(1, len(proto.repeated_nested_message)) 975ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(m1, proto.repeated_nested_message[0]) 976ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testHandWrittenReflection(self): 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Hand written extensions are only supported by the pure-Python 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # implementation of the API. 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if api_implementation.Type() != 'python': 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldDescriptor = descriptor.FieldDescriptor 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foo_field_descriptor = FieldDescriptor( 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name='foo_field', full_name='MyProto.foo_field', 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index=0, number=1, type=FieldDescriptor.TYPE_INT64, 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cpp_type=FieldDescriptor.CPPTYPE_INT64, 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label=FieldDescriptor.LABEL_OPTIONAL, default_value=0, 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containing_type=None, message_type=None, enum_type=None, 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_extension=False, extension_scope=None, 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options=descriptor_pb2.FieldOptions()) 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mydescriptor = descriptor.Descriptor( 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name='MyProto', full_name='MyProto', filename='ignored', 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containing_type=None, nested_types=[], enum_types=[], 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fields=[foo_field_descriptor], extensions=[], 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options=descriptor_pb2.MessageOptions()) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MyProtoClass(message.Message): 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DESCRIPTOR = mydescriptor 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __metaclass__ = reflection.GeneratedProtocolMessageType 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) myproto_instance = MyProtoClass() 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, myproto_instance.foo_field) 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not myproto_instance.HasField('foo_field')) 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) myproto_instance.foo_field = 23 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(23, myproto_instance.foo_field) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(myproto_instance.HasField('foo_field')) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1007ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def testDescriptorProtoSupport(self): 1008ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # Hand written descriptors/reflection are only supported by the pure-Python 1009ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # implementation of the API. 1010ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if api_implementation.Type() != 'python': 1011ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return 1012ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1013ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def AddDescriptorField(proto, field_name, field_type): 1014ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddDescriptorField.field_index += 1 1015ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_field = proto.field.add() 1016ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_field.name = field_name 1017ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_field.type = field_type 1018ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_field.number = AddDescriptorField.field_index 1019ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_field.label = descriptor_pb2.FieldDescriptorProto.LABEL_OPTIONAL 1020ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1021ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddDescriptorField.field_index = 0 1022ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1023ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch desc_proto = descriptor_pb2.DescriptorProto() 1024ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch desc_proto.name = 'Car' 1025ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch fdp = descriptor_pb2.FieldDescriptorProto 1026ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddDescriptorField(desc_proto, 'name', fdp.TYPE_STRING) 1027ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddDescriptorField(desc_proto, 'year', fdp.TYPE_INT64) 1028ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddDescriptorField(desc_proto, 'automatic', fdp.TYPE_BOOL) 1029ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddDescriptorField(desc_proto, 'price', fdp.TYPE_DOUBLE) 1030ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # Add a repeated field 1031ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch AddDescriptorField.field_index += 1 1032ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_field = desc_proto.field.add() 1033ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_field.name = 'owners' 1034ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_field.type = fdp.TYPE_STRING 1035ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_field.number = AddDescriptorField.field_index 1036ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_field.label = descriptor_pb2.FieldDescriptorProto.LABEL_REPEATED 1037ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1038ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch desc = descriptor.MakeDescriptor(desc_proto) 1039ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(desc.fields_by_name.has_key('name')) 1040ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(desc.fields_by_name.has_key('year')) 1041ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(desc.fields_by_name.has_key('automatic')) 1042ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(desc.fields_by_name.has_key('price')) 1043ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(desc.fields_by_name.has_key('owners')) 1044ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1045ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch class CarMessage(message.Message): 1046ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch __metaclass__ = reflection.GeneratedProtocolMessageType 1047ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DESCRIPTOR = desc 1048ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1049ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch prius = CarMessage() 1050ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch prius.name = 'prius' 1051ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch prius.year = 2010 1052ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch prius.automatic = True 1053ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch prius.price = 25134.75 1054ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch prius.owners.extend(['bob', 'susan']) 1055ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1056ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch serialized_prius = prius.SerializeToString() 1057ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_prius = reflection.ParseMessage(desc, serialized_prius) 1058ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(new_prius is not prius) 1059ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(prius, new_prius) 1060ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1061ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # these are unnecessary assuming message equality works as advertised but 1062ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # explicitly check to be safe since we're mucking about in metaclass foo 1063ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(prius.name, new_prius.name) 1064ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(prius.year, new_prius.year) 1065ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(prius.automatic, new_prius.automatic) 1066ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(prius.price, new_prius.price) 1067ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(prius.owners, new_prius.owners) 1068ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testTopLevelExtensionsForOptionalScalar(self): 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto = unittest_pb2.TestAllExtensions() 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = unittest_pb2.optional_int32_extension 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not extendee_proto.HasExtension(extension)) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, extendee_proto.Extensions[extension]) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # As with normal scalar fields, just doing a read doesn't actually set the 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # "has" bit. 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not extendee_proto.HasExtension(extension)) 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Actually set the thing. 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto.Extensions[extension] = 23 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(23, extendee_proto.Extensions[extension]) 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(extendee_proto.HasExtension(extension)) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Ensure that clearing works as well. 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto.ClearExtension(extension) 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, extendee_proto.Extensions[extension]) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not extendee_proto.HasExtension(extension)) 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testTopLevelExtensionsForRepeatedScalar(self): 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto = unittest_pb2.TestAllExtensions() 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = unittest_pb2.repeated_string_extension 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, len(extendee_proto.Extensions[extension])) 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto.Extensions[extension].append('foo') 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(['foo'], extendee_proto.Extensions[extension]) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_list = extendee_proto.Extensions[extension] 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto.ClearExtension(extension) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, len(extendee_proto.Extensions[extension])) 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(string_list is not extendee_proto.Extensions[extension]) 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Shouldn't be allowed to do Extensions[extension] = 'a' 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions, 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension, 'a') 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testTopLevelExtensionsForOptionalMessage(self): 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto = unittest_pb2.TestAllExtensions() 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = unittest_pb2.optional_foreign_message_extension 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not extendee_proto.HasExtension(extension)) 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, extendee_proto.Extensions[extension].c) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # As with normal (non-extension) fields, merely reading from the 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # thing shouldn't set the "has" bit. 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not extendee_proto.HasExtension(extension)) 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto.Extensions[extension].c = 23 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(23, extendee_proto.Extensions[extension].c) 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(extendee_proto.HasExtension(extension)) 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Save a reference here. 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foreign_message = extendee_proto.Extensions[extension] 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto.ClearExtension(extension) 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(foreign_message is not extendee_proto.Extensions[extension]) 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Setting a field on foreign_message now shouldn't set 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # any "has" bits on extendee_proto. 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foreign_message.c = 42 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(42, foreign_message.c) 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(foreign_message.HasField('c')) 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not extendee_proto.HasExtension(extension)) 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Shouldn't be allowed to do Extensions[extension] = 'a' 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions, 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension, 'a') 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testTopLevelExtensionsForRepeatedMessage(self): 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto = unittest_pb2.TestAllExtensions() 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = unittest_pb2.repeatedgroup_extension 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, len(extendee_proto.Extensions[extension])) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group = extendee_proto.Extensions[extension].add() 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group.a = 23 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(23, extendee_proto.Extensions[extension][0].a) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group.a = 42 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(42, extendee_proto.Extensions[extension][0].a) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_list = extendee_proto.Extensions[extension] 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto.ClearExtension(extension) 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, len(extendee_proto.Extensions[extension])) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(group_list is not extendee_proto.Extensions[extension]) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Shouldn't be allowed to do Extensions[extension] = 'a' 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions, 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension, 'a') 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testNestedExtensions(self): 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto = unittest_pb2.TestAllExtensions() 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = unittest_pb2.TestRequired.single 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # We just test the non-repeated case. 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not extendee_proto.HasExtension(extension)) 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) required = extendee_proto.Extensions[extension] 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, required.a) 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not extendee_proto.HasExtension(extension)) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) required.a = 23 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(23, extendee_proto.Extensions[extension].a) 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(extendee_proto.HasExtension(extension)) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto.ClearExtension(extension) 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(required is not extendee_proto.Extensions[extension]) 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not extendee_proto.HasExtension(extension)) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # If message A directly contains message B, and 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # a.HasField('b') is currently False, then mutating any 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # extension in B should change a.HasField('b') to True 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # (and so on up the object tree). 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testHasBitsForAncestorsOfExtendedMessage(self): 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Optional scalar extension. 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel = more_extensions_pb2.TopLevelMessage() 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not toplevel.HasField('submessage')) 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, toplevel.submessage.Extensions[ 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_extensions_pb2.optional_int_extension]) 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not toplevel.HasField('submessage')) 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel.submessage.Extensions[ 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_extensions_pb2.optional_int_extension] = 23 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(23, toplevel.submessage.Extensions[ 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_extensions_pb2.optional_int_extension]) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(toplevel.HasField('submessage')) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Repeated scalar extension. 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel = more_extensions_pb2.TopLevelMessage() 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not toplevel.HasField('submessage')) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([], toplevel.submessage.Extensions[ 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_extensions_pb2.repeated_int_extension]) 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not toplevel.HasField('submessage')) 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel.submessage.Extensions[ 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_extensions_pb2.repeated_int_extension].append(23) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([23], toplevel.submessage.Extensions[ 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_extensions_pb2.repeated_int_extension]) 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(toplevel.HasField('submessage')) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Optional message extension. 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel = more_extensions_pb2.TopLevelMessage() 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not toplevel.HasField('submessage')) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, toplevel.submessage.Extensions[ 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_extensions_pb2.optional_message_extension].foreign_message_int) 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not toplevel.HasField('submessage')) 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel.submessage.Extensions[ 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_extensions_pb2.optional_message_extension].foreign_message_int = 23 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(23, toplevel.submessage.Extensions[ 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_extensions_pb2.optional_message_extension].foreign_message_int) 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(toplevel.HasField('submessage')) 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Repeated message extension. 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel = more_extensions_pb2.TopLevelMessage() 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not toplevel.HasField('submessage')) 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, len(toplevel.submessage.Extensions[ 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_extensions_pb2.repeated_message_extension])) 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not toplevel.HasField('submessage')) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foreign = toplevel.submessage.Extensions[ 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_extensions_pb2.repeated_message_extension].add() 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(foreign, toplevel.submessage.Extensions[ 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_extensions_pb2.repeated_message_extension][0]) 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(toplevel.HasField('submessage')) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testDisconnectionAfterClearingEmptyMessage(self): 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) toplevel = more_extensions_pb2.TopLevelMessage() 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto = toplevel.submessage 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = more_extensions_pb2.optional_message_extension 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_proto = extendee_proto.Extensions[extension] 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto.ClearExtension(extension) 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_proto.foreign_message_int = 23 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(extension_proto is not extendee_proto.Extensions[extension]) 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testExtensionFailureModes(self): 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extendee_proto = unittest_pb2.TestAllExtensions() 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Try non-extension-handle arguments to HasExtension, 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # ClearExtension(), and Extensions[]... 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(KeyError, extendee_proto.HasExtension, 1234) 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(KeyError, extendee_proto.ClearExtension, 1234) 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__, 1234) 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__, 1234, 5) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Try something that *is* an extension handle, just not for 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # this message... 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unknown_handle = more_extensions_pb2.optional_int_extension 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(KeyError, extendee_proto.HasExtension, 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unknown_handle) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(KeyError, extendee_proto.ClearExtension, 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unknown_handle) 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__, 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unknown_handle) 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__, 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unknown_handle, 5) 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Try call HasExtension() with a valid handle, but for a 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # *repeated* field. (Just as with non-extension repeated 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # fields, Has*() isn't supported for extension repeated fields). 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(KeyError, extendee_proto.HasExtension, 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.repeated_string_extension) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testStaticParseFrom(self): 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllTypes() 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllFields(proto1) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string1 = proto1.SerializeToString() 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllTypes.FromString(string1) 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Messages should be equal. 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(proto2, proto1) 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMergeFromSingularField(self): 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test merge with just a singular field. 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllTypes() 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.optional_int32 = 1 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllTypes() 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # This shouldn't get overwritten. 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.optional_string = 'value' 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.MergeFrom(proto1) 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto2.optional_int32) 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual('value', proto2.optional_string) 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMergeFromRepeatedField(self): 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test merge with just a repeated field. 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllTypes() 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.repeated_int32.append(1) 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.repeated_int32.append(2) 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllTypes() 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.repeated_int32.append(0) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.MergeFrom(proto1) 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto2.repeated_int32[0]) 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto2.repeated_int32[1]) 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, proto2.repeated_int32[2]) 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMergeFromOptionalGroup(self): 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test merge with an optional group. 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllTypes() 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.optionalgroup.a = 12 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllTypes() 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.MergeFrom(proto1) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(12, proto2.optionalgroup.a) 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMergeFromRepeatedNestedMessage(self): 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test merge with a repeated nested message. 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllTypes() 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m = proto1.repeated_nested_message.add() 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m.bb = 123 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m = proto1.repeated_nested_message.add() 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m.bb = 321 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllTypes() 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m = proto2.repeated_nested_message.add() 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m.bb = 999 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.MergeFrom(proto1) 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(999, proto2.repeated_nested_message[0].bb) 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(123, proto2.repeated_nested_message[1].bb) 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(321, proto2.repeated_nested_message[2].bb) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto3 = unittest_pb2.TestAllTypes() 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto3.repeated_nested_message.MergeFrom(proto2.repeated_nested_message) 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(999, proto3.repeated_nested_message[0].bb) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(123, proto3.repeated_nested_message[1].bb) 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(321, proto3.repeated_nested_message[2].bb) 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMergeFromAllFields(self): 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # With all fields set. 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllTypes() 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllFields(proto1) 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllTypes() 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.MergeFrom(proto1) 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Messages should be equal. 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(proto2, proto1) 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Serialized string should be equal too. 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string1 = proto1.SerializeToString() 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string2 = proto2.SerializeToString() 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(string1, string2) 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMergeFromExtensionsSingular(self): 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllExtensions() 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.Extensions[unittest_pb2.optional_int32_extension] = 1 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllExtensions() 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.MergeFrom(proto1) 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, proto2.Extensions[unittest_pb2.optional_int32_extension]) 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMergeFromExtensionsRepeated(self): 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllExtensions() 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.Extensions[unittest_pb2.repeated_int32_extension].append(1) 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.Extensions[unittest_pb2.repeated_int32_extension].append(2) 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllExtensions() 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.Extensions[unittest_pb2.repeated_int32_extension].append(0) 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.MergeFrom(proto1) 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, len(proto2.Extensions[unittest_pb2.repeated_int32_extension])) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, proto2.Extensions[unittest_pb2.repeated_int32_extension][0]) 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, proto2.Extensions[unittest_pb2.repeated_int32_extension][1]) 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2, proto2.Extensions[unittest_pb2.repeated_int32_extension][2]) 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMergeFromExtensionsNestedMessage(self): 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllExtensions() 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext1 = proto1.Extensions[ 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.repeated_nested_message_extension] 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m = ext1.add() 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m.bb = 222 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m = ext1.add() 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m.bb = 333 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllExtensions() 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2 = proto2.Extensions[ 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.repeated_nested_message_extension] 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m = ext2.add() 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) m.bb = 111 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.MergeFrom(proto1) 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ext2 = proto2.Extensions[ 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.repeated_nested_message_extension] 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, len(ext2)) 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(111, ext2[0].bb) 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(222, ext2[1].bb) 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(333, ext2[2].bb) 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMergeFromBug(self): 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1 = unittest_pb2.TestAllTypes() 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2 = unittest_pb2.TestAllTypes() 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Cause optional_nested_message to be instantiated within message1, even 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # though it is not considered to be "present". 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.optional_nested_message 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertFalse(message1.HasField('optional_nested_message')) 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Merge into message2. This should not instantiate the field is message2. 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.MergeFrom(message1) 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertFalse(message2.HasField('optional_nested_message')) 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testCopyFromSingularField(self): 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test copy with just a singular field. 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllTypes() 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.optional_int32 = 1 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.optional_string = 'important-text' 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllTypes() 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.optional_string = 'value' 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.CopyFrom(proto1) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto2.optional_int32) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual('important-text', proto2.optional_string) 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testCopyFromRepeatedField(self): 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test copy with a repeated field. 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllTypes() 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.repeated_int32.append(1) 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.repeated_int32.append(2) 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllTypes() 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.repeated_int32.append(0) 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.CopyFrom(proto1) 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto2.repeated_int32[0]) 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, proto2.repeated_int32[1]) 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testCopyFromAllFields(self): 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # With all fields set. 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllTypes() 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllFields(proto1) 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllTypes() 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.CopyFrom(proto1) 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Messages should be equal. 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(proto2, proto1) 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Serialized string should be equal too. 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string1 = proto1.SerializeToString() 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string2 = proto2.SerializeToString() 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(string1, string2) 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testCopyFromSelf(self): 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllTypes() 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.repeated_int32.append(1) 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.optional_int32 = 2 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.optional_string = 'important-text' 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1.CopyFrom(proto1) 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto1.repeated_int32[0]) 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, proto1.optional_int32) 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual('important-text', proto1.optional_string) 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testCopyFromBadType(self): 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The python implementation doesn't raise an exception in this 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # case. In theory it should. 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if api_implementation.Type() == 'python': 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto1 = unittest_pb2.TestAllTypes() 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllExtensions() 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, proto1.CopyFrom, proto2) 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testClear(self): 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 1456ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # C++ implementation does not support lazy fields right now so leave it 1457ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # out for now. 1458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if api_implementation.Type() == 'python': 1459ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch test_util.SetAllFields(proto) 1460ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch else: 1461ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch test_util.SetAllNonLazyFields(proto) 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Clear the message. 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Clear() 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals(proto.ByteSize(), 0) 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty_proto = unittest_pb2.TestAllTypes() 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals(proto, empty_proto) 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test if extensions which were set are cleared. 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllExtensions() 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllExtensions(proto) 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Clear the message. 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Clear() 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals(proto.ByteSize(), 0) 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) empty_proto = unittest_pb2.TestAllExtensions() 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals(proto, empty_proto) 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1477ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch def testDisconnectingBeforeClear(self): 1478ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto = unittest_pb2.TestAllTypes() 1479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nested = proto.optional_nested_message 1480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.Clear() 1481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(nested is not proto.optional_nested_message) 1482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nested.bb = 23 1483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(not proto.HasField('optional_nested_message')) 1484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(0, proto.optional_nested_message.bb) 1485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto = unittest_pb2.TestAllTypes() 1487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nested = proto.optional_nested_message 1488ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nested.bb = 5 1489ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch foreign = proto.optional_foreign_message 1490ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch foreign.c = 6 1491ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto.Clear() 1493ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(nested is not proto.optional_nested_message) 1494ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(foreign is not proto.optional_foreign_message) 1495ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(5, nested.bb) 1496ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(6, foreign.c) 1497ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch nested.bb = 15 1498ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch foreign.c = 16 1499ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(not proto.HasField('optional_nested_message')) 1500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(0, proto.optional_nested_message.bb) 1501ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertTrue(not proto.HasField('optional_foreign_message')) 1502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertEqual(0, proto.optional_foreign_message.c) 1503ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def assertInitialized(self, proto): 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.IsInitialized()) 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Neither method should raise an exception. 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.SerializeToString() 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.SerializePartialToString() 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def assertNotInitialized(self, proto): 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertFalse(proto.IsInitialized()) 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(message.EncodeError, proto.SerializeToString) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # "Partial" serialization doesn't care if message is uninitialized. 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.SerializePartialToString() 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testIsInitialized(self): 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Trivial cases - all optional fields and extensions. 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertInitialized(proto) 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllExtensions() 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertInitialized(proto) 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The case of uninitialized required fields. 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestRequired() 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotInitialized(proto) 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.a = proto.b = proto.c = 2 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertInitialized(proto) 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The case of uninitialized submessage. 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestRequiredForeign() 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertInitialized(proto) 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_message.a = 1 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotInitialized(proto) 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_message.b = 0 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_message.c = 0 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertInitialized(proto) 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Uninitialized repeated submessage. 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1 = proto.repeated_message.add() 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotInitialized(proto) 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.a = message1.b = message1.c = 0 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertInitialized(proto) 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Uninitialized repeated group in an extension. 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllExtensions() 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = unittest_pb2.TestRequired.multi 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1 = proto.Extensions[extension].add() 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2 = proto.Extensions[extension].add() 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotInitialized(proto) 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.a = 1 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.b = 1 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.c = 1 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotInitialized(proto) 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.a = 2 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.b = 2 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.c = 2 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertInitialized(proto) 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Uninitialized nonrepeated message in an extension. 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllExtensions() 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = unittest_pb2.TestRequired.single 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[extension].a = 1 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotInitialized(proto) 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[extension].b = 2 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[extension].c = 3 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertInitialized(proto) 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Try passing an errors list. 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errors = [] 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestRequired() 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertFalse(proto.IsInitialized(errors)) 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(errors, ['a', 'b', 'c']) 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testStringUTF8Encoding(self): 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Assignment of a unicode object to a field of type 'bytes' is not allowed. 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setattr, proto, 'optional_bytes', u'unicode object') 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Check that the default value is of python's 'unicode' type. 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(type(proto.optional_string), unicode) 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_string = unicode('Testing') 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(proto.optional_string, str('Testing')) 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Assign a value of type 'str' which can be encoded in UTF-8. 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_string = str('Testing') 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(proto.optional_string, unicode('Testing')) 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if api_implementation.Type() == 'python': 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Values of type 'str' are also accepted as long as they can be 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # encoded in UTF-8. 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(type(proto.optional_string), str) 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Try to assign a 'str' value which contains bytes that aren't 7-bit ASCII. 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(ValueError, 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setattr, proto, 'optional_string', str('a\x80a')) 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Assign a 'str' object which contains a UTF-8 encoded string. 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(ValueError, 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setattr, proto, 'optional_string', 'Тест') 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # No exception thrown. 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_string = 'abc' 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testStringUTF8Serialization(self): 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_mset_pb2.TestMessageSet() 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_message = unittest_mset_pb2.TestMessageSetExtension2 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = extension_message.message_set_extension 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_utf8 = u'Тест' 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_utf8_bytes = test_utf8.encode('utf-8') 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 'Test' in another language, using UTF-8 charset. 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[extension].str = test_utf8 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Serialize using the MessageSet wire format (this is specified in the 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # .proto file). 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = proto.SerializeToString() 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Check byte size. 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(proto.ByteSize(), len(serialized)) 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raw = unittest_mset_pb2.RawMessageSet() 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raw.MergeFromString(serialized) 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2 = unittest_mset_pb2.TestMessageSetExtension2() 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, len(raw.item)) 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Check that the type_id is the same as the tag ID in the .proto file. 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(raw.item[0].type_id, 1547769) 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Check the actual bytes on the wire. 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue( 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raw.item[0].message.endswith(test_utf8_bytes)) 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.MergeFromString(raw.item[0].message) 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(type(message2.str), unicode) 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(message2.str, test_utf8) 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The pure Python API throws an exception on MergeFromString(), 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # if any of the string fields of the message can't be UTF-8 decoded. 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The C++ implementation of the API has no way to check that on 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # MergeFromString and thus has no way to throw the exception. 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The pure Python API always returns objects of type 'unicode' (UTF-8 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # encoded), or 'str' (in 7 bit ASCII). 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes = raw.item[0].message.replace( 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_utf8_bytes, len(test_utf8_bytes) * '\xff') 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unicode_decode_failed = False 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.MergeFromString(bytes) 1653ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch except UnicodeDecodeError as e: 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unicode_decode_failed = True 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string_field = message2.str 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(unicode_decode_failed or type(string_field) == str) 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testEmptyNestedMessage(self): 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_nested_message.MergeFrom( 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.NestedMessage()) 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_nested_message')) 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_nested_message.CopyFrom( 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.NestedMessage()) 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_nested_message')) 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_nested_message.MergeFromString('') 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_nested_message')) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_nested_message.ParseFromString('') 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_nested_message')) 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = proto.SerializeToString() 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestAllTypes() 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.MergeFromString(serialized) 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto2.HasField('optional_nested_message')) 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSetInParent(self): 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertFalse(proto.HasField('optionalgroup')) 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optionalgroup.SetInParent() 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optionalgroup')) 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Since we had so many tests for protocol buffer equality, we broke these out 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# into separate TestCase classes. 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestAllTypesEqualityTest(unittest.TestCase): 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def setUp(self): 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto = unittest_pb2.TestAllTypes() 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.second_proto = unittest_pb2.TestAllTypes() 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testNotHashable(self): 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, hash, self.first_proto) 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSelfEquality(self): 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(self.first_proto, self.first_proto) 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testEmptyProtosEqual(self): 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(self.first_proto, self.second_proto) 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FullProtosEqualityTest(unittest.TestCase): 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Equality tests using completely-full protos as a starting point.""" 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def setUp(self): 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto = unittest_pb2.TestAllTypes() 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.second_proto = unittest_pb2.TestAllTypes() 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllFields(self.first_proto) 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllFields(self.second_proto) 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testNotHashable(self): 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, hash, self.first_proto) 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testNoneNotEqual(self): 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(self.first_proto, None) 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(None, self.second_proto) 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testNotEqualToOtherMessage(self): 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) third_proto = unittest_pb2.TestRequired() 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(self.first_proto, third_proto) 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(third_proto, self.second_proto) 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testAllFieldsFilledEquality(self): 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(self.first_proto, self.second_proto) 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testNonRepeatedScalar(self): 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Nonrepeated scalar field change should cause inequality. 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.optional_int32 += 1 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(self.first_proto, self.second_proto) 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # ...as should clearing a field. 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.ClearField('optional_int32') 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(self.first_proto, self.second_proto) 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testNonRepeatedComposite(self): 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Change a nonrepeated composite field. 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.optional_nested_message.bb += 1 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(self.first_proto, self.second_proto) 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.optional_nested_message.bb -= 1 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(self.first_proto, self.second_proto) 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Clear a field in the nested message. 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.optional_nested_message.ClearField('bb') 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(self.first_proto, self.second_proto) 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.optional_nested_message.bb = ( 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.second_proto.optional_nested_message.bb) 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(self.first_proto, self.second_proto) 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Remove the nested message entirely. 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.ClearField('optional_nested_message') 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(self.first_proto, self.second_proto) 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedScalar(self): 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Change a repeated scalar field. 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.repeated_int32.append(5) 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(self.first_proto, self.second_proto) 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.ClearField('repeated_int32') 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(self.first_proto, self.second_proto) 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedComposite(self): 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Change value within a repeated composite field. 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.repeated_nested_message[0].bb += 1 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(self.first_proto, self.second_proto) 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.repeated_nested_message[0].bb -= 1 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(self.first_proto, self.second_proto) 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Add a value to a repeated composite field. 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.repeated_nested_message.add() 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(self.first_proto, self.second_proto) 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.second_proto.repeated_nested_message.add() 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(self.first_proto, self.second_proto) 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testNonRepeatedScalarHasBits(self): 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Ensure that we test "has" bits as well as value for 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # nonrepeated scalar field. 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.ClearField('optional_int32') 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.second_proto.optional_int32 = 0 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(self.first_proto, self.second_proto) 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testNonRepeatedCompositeHasBits(self): 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Ensure that we test "has" bits as well as value for 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # nonrepeated composite field. 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.ClearField('optional_nested_message') 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.second_proto.optional_nested_message.ClearField('bb') 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(self.first_proto, self.second_proto) 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.optional_nested_message.bb = 0 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.first_proto.optional_nested_message.ClearField('bb') 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(self.first_proto, self.second_proto) 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionEqualityTest(unittest.TestCase): 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testExtensionEquality(self): 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto = unittest_pb2.TestAllExtensions() 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto = unittest_pb2.TestAllExtensions() 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto, second_proto) 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllExtensions(first_proto) 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(first_proto, second_proto) 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllExtensions(second_proto) 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto, second_proto) 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Ensure that we check value equality. 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.Extensions[unittest_pb2.optional_int32_extension] += 1 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(first_proto, second_proto) 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.Extensions[unittest_pb2.optional_int32_extension] -= 1 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto, second_proto) 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Ensure that we also look at "has" bits. 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.ClearExtension(unittest_pb2.optional_int32_extension) 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto.Extensions[unittest_pb2.optional_int32_extension] = 0 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(first_proto, second_proto) 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.Extensions[unittest_pb2.optional_int32_extension] = 0 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto, second_proto) 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Ensure that differences in cached values 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # don't matter if "has" bits are both false. 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto = unittest_pb2.TestAllExtensions() 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto = unittest_pb2.TestAllExtensions() 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, first_proto.Extensions[unittest_pb2.optional_int32_extension]) 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto, second_proto) 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MutualRecursionEqualityTest(unittest.TestCase): 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testEqualityWithMutualRecursion(self): 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto = unittest_pb2.TestMutualRecursionA() 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto = unittest_pb2.TestMutualRecursionA() 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto, second_proto) 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.bb.a.bb.optional_int32 = 23 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertNotEqual(first_proto, second_proto) 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto.bb.a.bb.optional_int32 = 23 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto, second_proto) 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ByteSizeTest(unittest.TestCase): 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def setUp(self): 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto = unittest_pb2.TestAllTypes() 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extended_proto = more_extensions_pb2.ExtendedMessage() 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.packed_proto = unittest_pb2.TestPackedTypes() 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.packed_extended_proto = unittest_pb2.TestPackedExtensions() 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def Size(self): 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return self.proto.ByteSize() 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testEmptyMessage(self): 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.proto.ByteSize()) 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSizedOnKwargs(self): 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Use a separate message to ensure testing right after creation. 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.ByteSize()) 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto_kwargs = unittest_pb2.TestAllTypes(optional_int64 = 1) 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # One byte for the tag, one to encode varint 1. 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, proto_kwargs.ByteSize()) 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testVarints(self): 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def Test(i, expected_varint_size): 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.Clear() 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_int64 = i 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Add one to the varint size for the tag info 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # for tag 1. 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(expected_varint_size + 1, self.Size()) 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Test(0, 1) 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Test(1, 1) 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for i, num_bytes in zip(range(7, 63, 7), range(1, 10000)): 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Test((1 << i) - 1, num_bytes) 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Test(-1, 10) 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Test(-2, 10) 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Test(-(1 << 63), 10) 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testStrings(self): 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_string = '' 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Need one byte for tag info (tag #14), and one byte for length. 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, self.Size()) 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_string = 'abc' 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Need one byte for tag info (tag #14), and one byte for length. 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2 + len(self.proto.optional_string), self.Size()) 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_string = 'x' * 128 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Need one byte for tag info (tag #14), and TWO bytes for length. 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3 + len(self.proto.optional_string), self.Size()) 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testOtherNumerics(self): 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_fixed32 = 1234 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # One byte for tag and 4 bytes for fixed32. 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(5, self.Size()) 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto = unittest_pb2.TestAllTypes() 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_fixed64 = 1234 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # One byte for tag and 8 bytes for fixed64. 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(9, self.Size()) 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto = unittest_pb2.TestAllTypes() 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_float = 1.234 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # One byte for tag and 4 bytes for float. 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(5, self.Size()) 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto = unittest_pb2.TestAllTypes() 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_double = 1.234 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # One byte for tag and 8 bytes for float. 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(9, self.Size()) 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto = unittest_pb2.TestAllTypes() 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_sint32 = 64 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # One byte for tag and 2 bytes for zig-zag-encoded 64. 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, self.Size()) 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto = unittest_pb2.TestAllTypes() 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testComposites(self): 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 3 bytes. 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_nested_message.bb = (1 << 14) 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Plus one byte for bb tag. 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Plus 1 byte for optional_nested_message serialized size. 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Plus two bytes for optional_nested_message tag. 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3 + 1 + 1 + 2, self.Size()) 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testGroups(self): 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 4 bytes. 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optionalgroup.a = (1 << 21) 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Plus two bytes for |a| tag. 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Plus 2 * two bytes for START_GROUP and END_GROUP tags. 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(4 + 2 + 2*2, self.Size()) 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedScalars(self): 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.repeated_int32.append(10) # 1 byte. 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.repeated_int32.append(128) # 2 bytes. 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Also need 2 bytes for each entry for tag. 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1 + 2 + 2*2, self.Size()) 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedScalarsExtend(self): 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.repeated_int32.extend([10, 128]) # 3 bytes. 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Also need 2 bytes for each entry for tag. 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1 + 2 + 2*2, self.Size()) 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedScalarsRemove(self): 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.repeated_int32.append(10) # 1 byte. 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.repeated_int32.append(128) # 2 bytes. 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Also need 2 bytes for each entry for tag. 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1 + 2 + 2*2, self.Size()) 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.repeated_int32.remove(128) 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1 + 2, self.Size()) 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedComposites(self): 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Empty message. 2 bytes tag plus 1 byte length. 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foreign_message_0 = self.proto.repeated_nested_message.add() 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foreign_message_1 = self.proto.repeated_nested_message.add() 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foreign_message_1.bb = 7 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size()) 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedCompositesDelete(self): 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Empty message. 2 bytes tag plus 1 byte length. 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foreign_message_0 = self.proto.repeated_nested_message.add() 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foreign_message_1 = self.proto.repeated_nested_message.add() 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foreign_message_1.bb = 9 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size()) 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del self.proto.repeated_nested_message[0] 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2 + 1 + 1 + 1, self.Size()) 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Now add a new message. 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foreign_message_2 = self.proto.repeated_nested_message.add() 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) foreign_message_2.bb = 12 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2 + 1 + 1 + 1 + 2 + 1 + 1 + 1, self.Size()) 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del self.proto.repeated_nested_message[1] 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2 + 1 + 1 + 1, self.Size()) 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) del self.proto.repeated_nested_message[0] 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.Size()) 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testRepeatedGroups(self): 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2-byte START_GROUP plus 2-byte END_GROUP. 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_0 = self.proto.repeatedgroup.add() 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2-byte START_GROUP plus 2-byte |a| tag + 1-byte |a| 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # plus 2-byte END_GROUP. 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_1 = self.proto.repeatedgroup.add() 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) group_1.a = 7 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2 + 2 + 2 + 2 + 1 + 2, self.Size()) 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testExtensions(self): 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllExtensions() 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, proto.ByteSize()) 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = unittest_pb2.optional_int32_extension # Field #1, 1 byte. 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[extension] = 23 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 1 byte for tag, 1 byte for value. 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, proto.ByteSize()) 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testCacheInvalidationForNonrepeatedScalar(self): 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test non-extension. 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_int32 = 1 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, self.proto.ByteSize()) 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_int32 = 128 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, self.proto.ByteSize()) 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.ClearField('optional_int32') 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.proto.ByteSize()) 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test within extension. 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = more_extensions_pb2.optional_int_extension 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extended_proto.Extensions[extension] = 1 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, self.extended_proto.ByteSize()) 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extended_proto.Extensions[extension] = 128 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, self.extended_proto.ByteSize()) 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extended_proto.ClearExtension(extension) 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.extended_proto.ByteSize()) 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testCacheInvalidationForRepeatedScalar(self): 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test non-extension. 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.repeated_int32.append(1) 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, self.proto.ByteSize()) 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.repeated_int32.append(1) 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(6, self.proto.ByteSize()) 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.repeated_int32[1] = 128 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(7, self.proto.ByteSize()) 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.ClearField('repeated_int32') 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.proto.ByteSize()) 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test within extension. 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = more_extensions_pb2.repeated_int_extension 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated = self.extended_proto.Extensions[extension] 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated.append(1) 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, self.extended_proto.ByteSize()) 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated.append(1) 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(4, self.extended_proto.ByteSize()) 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated[1] = 128 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(5, self.extended_proto.ByteSize()) 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extended_proto.ClearExtension(extension) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.extended_proto.ByteSize()) 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testCacheInvalidationForNonrepeatedMessage(self): 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test non-extension. 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_foreign_message.c = 1 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(5, self.proto.ByteSize()) 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_foreign_message.c = 128 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(6, self.proto.ByteSize()) 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.optional_foreign_message.ClearField('c') 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, self.proto.ByteSize()) 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.ClearField('optional_foreign_message') 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.proto.ByteSize()) 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if api_implementation.Type() == 'python': 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # This is only possible in pure-Python implementation of the API. 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = self.proto.optional_foreign_message 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.ClearField('optional_foreign_message') 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child.c = 128 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.proto.ByteSize()) 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test within extension. 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = more_extensions_pb2.optional_message_extension 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = self.extended_proto.Extensions[extension] 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.extended_proto.ByteSize()) 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child.foreign_message_int = 1 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(4, self.extended_proto.ByteSize()) 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child.foreign_message_int = 128 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(5, self.extended_proto.ByteSize()) 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extended_proto.ClearExtension(extension) 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.extended_proto.ByteSize()) 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testCacheInvalidationForRepeatedMessage(self): 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test non-extension. 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child0 = self.proto.repeated_foreign_message.add() 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, self.proto.ByteSize()) 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.repeated_foreign_message.add() 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(6, self.proto.ByteSize()) 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child0.c = 1 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(8, self.proto.ByteSize()) 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.proto.ClearField('repeated_foreign_message') 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.proto.ByteSize()) 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test within extension. 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = more_extensions_pb2.repeated_message_extension 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_list = self.extended_proto.Extensions[extension] 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child0 = child_list.add() 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, self.extended_proto.ByteSize()) 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child_list.add() 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(4, self.extended_proto.ByteSize()) 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child0.foreign_message_int = 1 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(6, self.extended_proto.ByteSize()) 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child0.ClearField('foreign_message_int') 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(4, self.extended_proto.ByteSize()) 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.extended_proto.ClearExtension(extension) 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.extended_proto.ByteSize()) 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testPackedRepeatedScalars(self): 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.packed_proto.ByteSize()) 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.packed_proto.packed_int32.append(10) # 1 byte. 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.packed_proto.packed_int32.append(128) # 2 bytes. 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The tag is 2 bytes (the field number is 90), and the varint 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # storing the length is 1 byte. 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int_size = 1 + 2 + 3 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(int_size, self.packed_proto.ByteSize()) 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.packed_proto.packed_double.append(4.2) # 8 bytes 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.packed_proto.packed_double.append(3.25) # 8 bytes 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2 more tag bytes, 1 more length byte. 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_size = 8 + 8 + 3 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(int_size+double_size, self.packed_proto.ByteSize()) 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.packed_proto.ClearField('packed_int32') 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(double_size, self.packed_proto.ByteSize()) 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testPackedExtensions(self): 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, self.packed_extended_proto.ByteSize()) 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension = self.packed_extended_proto.Extensions[ 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.packed_fixed32_extension] 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension.extend([1, 2, 3, 4]) # 16 bytes 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Tag is 3 bytes. 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(19, self.packed_extended_proto.ByteSize()) 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Issues to be sure to cover include: 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Handling of unrecognized tags ("uninterpreted_bytes"). 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Handling of MessageSets. 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Consistent ordering of tags in the wire format, 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# including ordering between extensions and non-extension 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# fields. 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Consistent serialization of negative numbers, especially 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# negative int32s. 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Handling of empty submessages (with and without "has" 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# bits set). 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SerializationTest(unittest.TestCase): 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSerializeEmtpyMessage(self): 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto = unittest_pb2.TestAllTypes() 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto = unittest_pb2.TestAllTypes() 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = first_proto.SerializeToString() 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto.ByteSize(), len(serialized)) 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto.MergeFromString(serialized) 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto, second_proto) 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSerializeAllFields(self): 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto = unittest_pb2.TestAllTypes() 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto = unittest_pb2.TestAllTypes() 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllFields(first_proto) 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = first_proto.SerializeToString() 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto.ByteSize(), len(serialized)) 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto.MergeFromString(serialized) 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto, second_proto) 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSerializeAllExtensions(self): 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto = unittest_pb2.TestAllExtensions() 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto = unittest_pb2.TestAllExtensions() 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllExtensions(first_proto) 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = first_proto.SerializeToString() 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto.MergeFromString(serialized) 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto, second_proto) 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSerializeNegativeValues(self): 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto = unittest_pb2.TestAllTypes() 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.optional_int32 = -1 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.optional_int64 = -(2 << 40) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.optional_sint32 = -3 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.optional_sint64 = -(4 << 40) 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.optional_sfixed32 = -5 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.optional_sfixed64 = -(6 << 40) 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto = unittest_pb2.TestAllTypes.FromString( 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.SerializeToString()) 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto, second_proto) 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testParseTruncated(self): 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # This test is only applicable for the Python implementation of the API. 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if api_implementation.Type() != 'python': 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto = unittest_pb2.TestAllTypes() 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllFields(first_proto) 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = first_proto.SerializeToString() 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for truncation_point in xrange(len(serialized) + 1): 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto = unittest_pb2.TestAllTypes() 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unknown_fields = unittest_pb2.TestEmptyMessage() 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pos = second_proto._InternalParse(serialized, 0, truncation_point) 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # If we didn't raise an error then we read exactly the amount expected. 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(truncation_point, pos) 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Parsing to unknown fields should not throw if parsing to known fields 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # did not. 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pos2 = unknown_fields._InternalParse(serialized, 0, truncation_point) 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(truncation_point, pos2) 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except message.DecodeError: 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.fail('Parsing unknown fields failed when parsing known fields ' 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'did not.') 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except message.DecodeError: 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Parsing unknown fields should also fail. 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(message.DecodeError, unknown_fields._InternalParse, 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized, 0, truncation_point) 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testCanonicalSerializationOrder(self): 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = more_messages_pb2.OutOfOrderFields() 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # These are also their tag numbers. Even though we're setting these in 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # reverse-tag order AND they're listed in reverse tag-order in the .proto 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # file, they should nonetheless be serialized in tag order. 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_sint32 = 5 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[more_messages_pb2.optional_uint64] = 4 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_uint32 = 3 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[more_messages_pb2.optional_int64] = 2 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_int32 = 1 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = proto.SerializeToString() 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(proto.ByteSize(), len(serialized)) 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d = _MiniDecoder(serialized) 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadTag = d.ReadFieldNumberAndWireType 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual((1, wire_format.WIRETYPE_VARINT), ReadTag()) 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, d.ReadInt32()) 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual((2, wire_format.WIRETYPE_VARINT), ReadTag()) 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, d.ReadInt64()) 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual((3, wire_format.WIRETYPE_VARINT), ReadTag()) 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, d.ReadUInt32()) 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual((4, wire_format.WIRETYPE_VARINT), ReadTag()) 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(4, d.ReadUInt64()) 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual((5, wire_format.WIRETYPE_VARINT), ReadTag()) 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(5, d.ReadSInt32()) 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testCanonicalSerializationOrderSameAsCpp(self): 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Copy of the same test we use for C++. 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestFieldOrderings() 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllFieldsAndExtensions(proto) 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = proto.SerializeToString() 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.ExpectAllFieldsAndExtensionsInOrder(serialized) 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMergeFromStringWhenFieldsAlreadySet(self): 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto = unittest_pb2.TestAllTypes() 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.repeated_string.append('foobar') 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.optional_int32 = 23 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.optional_nested_message.bb = 42 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = first_proto.SerializeToString() 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto = unittest_pb2.TestAllTypes() 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto.repeated_string.append('baz') 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto.optional_int32 = 100 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto.optional_nested_message.bb = 999 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto.MergeFromString(serialized) 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Ensure that we append to repeated fields. 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(['baz', 'foobar'], list(second_proto.repeated_string)) 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Ensure that we overwrite nonrepeatd scalars. 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(23, second_proto.optional_int32) 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Ensure that we recursively call MergeFromString() on 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # submessages. 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(42, second_proto.optional_nested_message.bb) 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMessageSetWireFormat(self): 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_mset_pb2.TestMessageSet() 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_message1 = unittest_mset_pb2.TestMessageSetExtension1 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_message2 = unittest_mset_pb2.TestMessageSetExtension2 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension1 = extension_message1.message_set_extension 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension2 = extension_message2.message_set_extension 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[extension1].i = 123 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.Extensions[extension2].str = 'foo' 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Serialize using the MessageSet wire format (this is specified in the 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # .proto file). 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = proto.SerializeToString() 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raw = unittest_mset_pb2.RawMessageSet() 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(False, 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raw.DESCRIPTOR.GetOptions().message_set_wire_format) 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raw.MergeFromString(serialized) 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, len(raw.item)) 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1 = unittest_mset_pb2.TestMessageSetExtension1() 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.MergeFromString(raw.item[0].message) 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(123, message1.i) 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2 = unittest_mset_pb2.TestMessageSetExtension2() 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message2.MergeFromString(raw.item[1].message) 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual('foo', message2.str) 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Deserialize using the MessageSet wire format. 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_mset_pb2.TestMessageSet() 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.MergeFromString(serialized) 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(123, proto2.Extensions[extension1].i) 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual('foo', proto2.Extensions[extension2].str) 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Check byte size. 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(proto2.ByteSize(), len(serialized)) 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(proto.ByteSize(), len(serialized)) 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMessageSetWireFormatUnknownExtension(self): 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Create a message using the message set wire format with an unknown 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # message. 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raw = unittest_mset_pb2.RawMessageSet() 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Add an item. 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item = raw.item.add() 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.type_id = 1545008 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_message1 = unittest_mset_pb2.TestMessageSetExtension1 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1 = unittest_mset_pb2.TestMessageSetExtension1() 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.i = 12345 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.message = message1.SerializeToString() 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Add a second, unknown extension. 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item = raw.item.add() 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.type_id = 1545009 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_message1 = unittest_mset_pb2.TestMessageSetExtension1 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1 = unittest_mset_pb2.TestMessageSetExtension1() 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.i = 12346 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.message = message1.SerializeToString() 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Add another unknown extension. 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item = raw.item.add() 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.type_id = 1545010 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1 = unittest_mset_pb2.TestMessageSetExtension2() 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message1.str = 'foo' 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item.message = message1.SerializeToString() 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = raw.SerializeToString() 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Parse message using the message set wire format. 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_mset_pb2.TestMessageSet() 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.MergeFromString(serialized) 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Check that the message parsed well. 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_message1 = unittest_mset_pb2.TestMessageSetExtension1 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension1 = extension_message1.message_set_extension 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEquals(12345, proto.Extensions[extension1].i) 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testUnknownFields(self): 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllFields(proto) 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = proto.SerializeToString() 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The empty message should be parsable with all of the fields 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # unknown. 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestEmptyMessage() 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Parsing this message should succeed. 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.MergeFromString(serialized) 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Now test with a int64 field set. 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_int64 = 0x0fffffffffffffff 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = proto.SerializeToString() 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The empty message should be parsable with all of the fields 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # unknown. 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestEmptyMessage() 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Parsing this message should succeed. 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.MergeFromString(serialized) 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _CheckRaises(self, exc_class, callable_obj, exception): 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """This method checks if the excpetion type and message are as expected.""" 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callable_obj() 2364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch except exc_class as ex: 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Check if the exception message is the right one. 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(exception, str(ex)) 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raise self.failureException('%s not raised' % str(exc_class)) 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSerializeUninitialized(self): 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestRequired() 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._CheckRaises( 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.EncodeError, 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.SerializeToString, 2376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 'Message protobuf_unittest.TestRequired is missing required fields: ' 2377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 'a,b,c') 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Shouldn't raise exceptions. 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partial = proto.SerializePartialToString() 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto2 = unittest_pb2.TestRequired() 2382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertFalse(proto2.HasField('a')) 2383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch # proto2 ParseFromString does not check that required fields are set. 2384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch proto2.ParseFromString(partial) 2385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch self.assertFalse(proto2.HasField('a')) 2386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.a = 1 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._CheckRaises( 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.EncodeError, 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.SerializeToString, 2391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 'Message protobuf_unittest.TestRequired is missing required fields: b,c') 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Shouldn't raise exceptions. 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partial = proto.SerializePartialToString() 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.b = 2 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._CheckRaises( 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.EncodeError, 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.SerializeToString, 2399ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 'Message protobuf_unittest.TestRequired is missing required fields: c') 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Shouldn't raise exceptions. 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partial = proto.SerializePartialToString() 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.c = 3 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = proto.SerializeToString() 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Shouldn't raise exceptions. 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) partial = proto.SerializePartialToString() 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2 = unittest_pb2.TestRequired() 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.MergeFromString(serialized) 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto2.a) 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, proto2.b) 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, proto2.c) 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto2.ParseFromString(partial) 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto2.a) 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, proto2.b) 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, proto2.c) 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSerializeUninitializedSubMessage(self): 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestRequiredForeign() 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Sub-message doesn't exist yet, so this succeeds. 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.SerializeToString() 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_message.a = 1 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._CheckRaises( 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.EncodeError, 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.SerializeToString, 2428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 'Message protobuf_unittest.TestRequiredForeign ' 2429ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 'is missing required fields: ' 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'optional_message.b,optional_message.c') 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_message.b = 2 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_message.c = 3 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.SerializeToString() 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_message.add().a = 1 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_message.add().b = 2 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._CheckRaises( 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message.EncodeError, 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.SerializeToString, 2441ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 'Message protobuf_unittest.TestRequiredForeign is missing required fields: ' 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'repeated_message[0].b,repeated_message[0].c,' 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'repeated_message[1].a,repeated_message[1].c') 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_message[0].b = 2 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_message[0].c = 3 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_message[1].a = 1 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.repeated_message[1].c = 3 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.SerializeToString() 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSerializeAllPackedFields(self): 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto = unittest_pb2.TestPackedTypes() 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto = unittest_pb2.TestPackedTypes() 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllPackedFields(first_proto) 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = first_proto.SerializeToString() 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto.ByteSize(), len(serialized)) 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_read = second_proto.MergeFromString(serialized) 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(second_proto.ByteSize(), bytes_read) 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto, second_proto) 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testSerializeAllPackedExtensions(self): 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto = unittest_pb2.TestPackedExtensions() 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto = unittest_pb2.TestPackedExtensions() 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllPackedExtensions(first_proto) 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = first_proto.SerializeToString() 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bytes_read = second_proto.MergeFromString(serialized) 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(second_proto.ByteSize(), bytes_read) 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(first_proto, second_proto) 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMergePackedFromStringWhenSomeFieldsAlreadySet(self): 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto = unittest_pb2.TestPackedTypes() 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.packed_int32.extend([1, 2]) 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_proto.packed_double.append(3.0) 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = first_proto.SerializeToString() 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto = unittest_pb2.TestPackedTypes() 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto.packed_int32.append(3) 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto.packed_double.extend([1.0, 2.0]) 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto.packed_sint32.append(4) 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) second_proto.MergeFromString(serialized) 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([3, 1, 2], second_proto.packed_int32) 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([1.0, 2.0, 3.0], second_proto.packed_double) 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([4], second_proto.packed_sint32) 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testPackedFieldsWireFormat(self): 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestPackedTypes() 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.packed_int32.extend([1, 2, 150, 3]) # 1 + 1 + 2 + 1 bytes 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.packed_double.extend([1.0, 1000.0]) # 8 + 8 bytes 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.packed_float.append(2.0) # 4 bytes, will be before double 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized = proto.SerializeToString() 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(proto.ByteSize(), len(serialized)) 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) d = _MiniDecoder(serialized) 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReadTag = d.ReadFieldNumberAndWireType 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual((90, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag()) 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1+1+1+2, d.ReadInt32()) 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, d.ReadInt32()) 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, d.ReadInt32()) 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(150, d.ReadInt32()) 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, d.ReadInt32()) 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual((100, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag()) 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(4, d.ReadInt32()) 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2.0, d.ReadFloat()) 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual((101, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag()) 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(8+8, d.ReadInt32()) 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1.0, d.ReadDouble()) 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1000.0, d.ReadDouble()) 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(d.EndOfStream()) 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testParsePackedFromUnpacked(self): 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unpacked = unittest_pb2.TestUnpackedTypes() 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllUnpackedFields(unpacked) 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) packed = unittest_pb2.TestPackedTypes() 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) packed.MergeFromString(unpacked.SerializeToString()) 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected = unittest_pb2.TestPackedTypes() 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllPackedFields(expected) 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(expected, packed) 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testParseUnpackedFromPacked(self): 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) packed = unittest_pb2.TestPackedTypes() 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllPackedFields(packed) 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unpacked = unittest_pb2.TestUnpackedTypes() 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unpacked.MergeFromString(packed.SerializeToString()) 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected = unittest_pb2.TestUnpackedTypes() 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_util.SetAllUnpackedFields(expected) 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(expected, unpacked) 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testFieldNumbers(self): 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1) 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1) 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16) 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18) 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21) 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31) 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46) 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48) 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51) 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testExtensionFieldNumbers(self): 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.TestRequired.single.number, 1000) 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.TestRequired.SINGLE_FIELD_NUMBER, 1000) 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.TestRequired.multi.number, 1001) 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.TestRequired.MULTI_FIELD_NUMBER, 1001) 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.optional_int32_extension.number, 1) 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1) 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.optionalgroup_extension.number, 16) 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16) 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.optional_nested_message_extension.number, 18) 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18) 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.optional_nested_enum_extension.number, 21) 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21) 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.repeated_int32_extension.number, 31) 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31) 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.repeatedgroup_extension.number, 46) 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46) 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.repeated_nested_message_extension.number, 48) 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual( 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest_pb2.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48) 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.repeated_nested_enum_extension.number, 51) 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51) 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testInitKwargs(self): 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes( 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_int32=1, 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_string='foo', 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_bool=True, 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_bytes='bar', 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_nested_message=unittest_pb2.TestAllTypes.NestedMessage(bb=1), 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_foreign_message=unittest_pb2.ForeignMessage(c=1), 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_nested_enum=unittest_pb2.TestAllTypes.FOO, 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_foreign_enum=unittest_pb2.FOREIGN_FOO, 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repeated_int32=[1, 2, 3]) 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.IsInitialized()) 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_int32')) 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_string')) 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_bool')) 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_bytes')) 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_nested_message')) 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_foreign_message')) 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_nested_enum')) 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_foreign_enum')) 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto.optional_int32) 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual('foo', proto.optional_string) 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(True, proto.optional_bool) 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual('bar', proto.optional_bytes) 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto.optional_nested_message.bb) 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto.optional_foreign_message.c) 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.TestAllTypes.FOO, 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_nested_enum) 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.FOREIGN_FOO, proto.optional_foreign_enum) 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual([1, 2, 3], proto.repeated_int32) 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testInitArgsUnknownFieldName(self): 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def InitalizeEmptyMessageWithExtraKeywordArg(): 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unused_proto = unittest_pb2.TestEmptyMessage(unknown='unknown') 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._CheckRaises(ValueError, 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitalizeEmptyMessageWithExtraKeywordArg, 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'Protocol message has no "unknown" field.') 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testInitRequiredKwargs(self): 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestRequired(a=1, b=1, c=1) 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.IsInitialized()) 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('a')) 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('b')) 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('c')) 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.HasField('dummy2')) 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto.a) 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto.b) 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto.c) 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testInitRequiredForeignKwargs(self): 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestRequiredForeign( 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optional_message=unittest_pb2.TestRequired(a=1, b=1, c=1)) 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.IsInitialized()) 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.HasField('optional_message')) 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.optional_message.IsInitialized()) 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.optional_message.HasField('a')) 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.optional_message.HasField('b')) 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.optional_message.HasField('c')) 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(not proto.optional_message.HasField('dummy2')) 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(unittest_pb2.TestRequired(a=1, b=1, c=1), 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_message) 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto.optional_message.a) 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto.optional_message.b) 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto.optional_message.c) 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testInitRepeatedKwargs(self): 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes(repeated_int32=[1, 2, 3]) 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertTrue(proto.IsInitialized()) 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, proto.repeated_int32[0]) 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, proto.repeated_int32[1]) 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, proto.repeated_int32[2]) 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OptionsTest(unittest.TestCase): 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testMessageOptions(self): 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_mset_pb2.TestMessageSet() 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(True, 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.DESCRIPTOR.GetOptions().message_set_wire_format) 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(False, 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.DESCRIPTOR.GetOptions().message_set_wire_format) 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testPackedOptions(self): 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestAllTypes() 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_int32 = 1 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.optional_double = 3.0 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for field_descriptor, _ in proto.ListFields(): 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(False, field_descriptor.GetOptions().packed) 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto = unittest_pb2.TestPackedTypes() 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.packed_int32.append(1) 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) proto.packed_double.append(3.0) 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for field_descriptor, _ in proto.ListFields(): 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(True, field_descriptor.GetOptions().packed) 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(reflection._FieldDescriptor.LABEL_REPEATED, 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_descriptor.label) 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__': 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest.main() 2672