reflection_test.py revision fbaaef999ba563838ebd00874ed8a1c01fbf286d
1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#! /usr/bin/python 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# -*- coding: utf-8 -*- 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Protocol Buffers - Google's data interchange format 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2008 Google Inc. All rights reserved. 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# http://code.google.com/p/protobuf/ 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met: 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Redistributions of source code must retain the above copyright 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer. 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Redistributions in binary form must reproduce the above 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Neither the name of Google Inc. nor the names of its 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission. 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""Unittest for reflection.py, which also indirectly tests the output of the 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepure-Python protocol compiler. 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'robinson@google.com (Will Robinson)' 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport operator 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport unittest 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): When we split this test in two, only some of these imports 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# will be necessary in each test. 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import unittest_import_pb2 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import unittest_mset_pb2 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import unittest_pb2 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import descriptor_pb2 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import descriptor 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import message 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import reflection 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf.internal import more_extensions_pb2 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf.internal import more_messages_pb2 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf.internal import wire_format 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf.internal import test_util 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf.internal import decoder 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ReflectionTest(unittest.TestCase): 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def assertIs(self, values, others): 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(len(values), len(others)) 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for i in range(len(values)): 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(values[i] is others[i]) 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSimpleHasBits(self): 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test a scalar. 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.HasField('optional_int32')) 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_int32) 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # HasField() shouldn't be true if all we've done is 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # read the default value. 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.HasField('optional_int32')) 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_int32 = 1 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Setting a value however *should* set the "has" bit. 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('optional_int32')) 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.ClearField('optional_int32') 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # And clearing that value should unset the "has" bit. 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.HasField('optional_int32')) 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testHasBitsWithSinglyNestedScalar(self): 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Helper used to test foreign messages and groups. 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # composite_field_name should be the name of a non-repeated 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # composite (i.e., foreign or group) field in TestAllTypes, 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # and scalar_field_name should be the name of an integer-valued 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # scalar field within that composite. 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # I never thought I'd miss C++ macros and templates so much. :( 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # This helper is semantically just: 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # assert proto.composite_field.scalar_field == 0 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # assert not proto.composite_field.HasField('scalar_field') 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # assert not proto.HasField('composite_field') 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # proto.composite_field.scalar_field = 10 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # old_composite_field = proto.composite_field 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # assert proto.composite_field.scalar_field == 10 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # assert proto.composite_field.HasField('scalar_field') 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # assert proto.HasField('composite_field') 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # proto.ClearField('composite_field') 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # assert not proto.composite_field.HasField('scalar_field') 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # assert not proto.HasField('composite_field') 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # assert proto.composite_field.scalar_field == 0 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # # Now ensure that ClearField('composite_field') disconnected 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # # the old field object from the object tree... 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # assert old_composite_field is not proto.composite_field 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # old_composite_field.scalar_field = 20 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # assert not proto.composite_field.HasField('scalar_field') 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # assert not proto.HasField('composite_field') 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def TestCompositeHasBits(composite_field_name, scalar_field_name): 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # First, check that we can get the scalar value, and see that it's the 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # default (0), but that proto.HasField('omposite') and 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # proto.composite.HasField('scalar') will still return False. 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville composite_field = getattr(proto, composite_field_name) 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville original_scalar_value = getattr(composite_field, scalar_field_name) 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, original_scalar_value) 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Assert that the composite object does not "have" the scalar. 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not composite_field.HasField(scalar_field_name)) 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Assert that proto does not "have" the composite field. 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.HasField(composite_field_name)) 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Now set the scalar within the composite field. Ensure that the setting 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # is reflected, and that proto.HasField('composite') and 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # proto.composite.HasField('scalar') now both return True. 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville new_val = 20 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville setattr(composite_field, scalar_field_name, new_val) 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(new_val, getattr(composite_field, scalar_field_name)) 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Hold on to a reference to the current composite_field object. 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville old_composite_field = composite_field 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Assert that the has methods now return true. 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(composite_field.HasField(scalar_field_name)) 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField(composite_field_name)) 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Now call the clear method... 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.ClearField(composite_field_name) 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # ...and ensure that the "has" bits are all back to False... 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville composite_field = getattr(proto, composite_field_name) 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not composite_field.HasField(scalar_field_name)) 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.HasField(composite_field_name)) 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # ...and ensure that the scalar field has returned to its default. 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, getattr(composite_field, scalar_field_name)) 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Finally, ensure that modifications to the old composite field object 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # don't have any effect on the parent. 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # (NOTE that when we clear the composite field in the parent, we actually 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # don't recursively clear down the tree. Instead, we just disconnect the 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # cleared composite from the tree.) 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(old_composite_field is not composite_field) 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville setattr(old_composite_field, scalar_field_name, new_val) 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not composite_field.HasField(scalar_field_name)) 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.HasField(composite_field_name)) 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, getattr(composite_field, scalar_field_name)) 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test simple, single-level nesting when we set a scalar. 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestCompositeHasBits('optionalgroup', 'a') 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestCompositeHasBits('optional_nested_message', 'bb') 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestCompositeHasBits('optional_foreign_message', 'c') 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestCompositeHasBits('optional_import_message', 'd') 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testReferencesToNestedMessage(self): 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville nested = proto.optional_nested_message 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville del proto 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # A previous version had a bug where this would raise an exception when 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # hitting a now-dead weak reference. 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville nested.bb = 23 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testDisconnectingNestedMessageBeforeSettingField(self): 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville nested = proto.optional_nested_message 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.ClearField('optional_nested_message') # Should disconnect from parent 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(nested is not proto.optional_nested_message) 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville nested.bb = 23 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.HasField('optional_nested_message')) 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_nested_message.bb) 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testHasBitsWhenModifyingRepeatedFields(self): 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test nesting when we add an element to a repeated field in a submessage. 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestNestedMessageHasBits() 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_nested_message.nestedmessage_repeated_int32.append(5) 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville [5], proto.optional_nested_message.nestedmessage_repeated_int32) 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('optional_nested_message')) 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Do the same test, but with a repeated composite field within the 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # submessage. 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.ClearField('optional_nested_message') 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.HasField('optional_nested_message')) 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_nested_message.nestedmessage_repeated_foreignmessage.add() 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('optional_nested_message')) 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testHasBitsForManyLevelsOfNesting(self): 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test nesting many levels deep. 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville recursive_proto = unittest_pb2.TestMutualRecursionA() 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not recursive_proto.HasField('bb')) 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, recursive_proto.bb.a.bb.a.bb.optional_int32) 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not recursive_proto.HasField('bb')) 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville recursive_proto.bb.a.bb.a.bb.optional_int32 = 5 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(5, recursive_proto.bb.a.bb.a.bb.optional_int32) 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(recursive_proto.HasField('bb')) 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(recursive_proto.bb.HasField('a')) 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(recursive_proto.bb.a.HasField('bb')) 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(recursive_proto.bb.a.bb.HasField('a')) 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(recursive_proto.bb.a.bb.a.HasField('bb')) 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not recursive_proto.bb.a.bb.a.bb.HasField('a')) 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(recursive_proto.bb.a.bb.a.bb.HasField('optional_int32')) 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSingularListFields(self): 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_fixed32 = 1 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_int32 = 5 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_string = 'foo' 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville [ (proto.DESCRIPTOR.fields_by_name['optional_int32' ], 5), 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1), 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo') ], 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.ListFields()) 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedListFields(self): 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_fixed32.append(1) 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.append(5) 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.append(11) 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_string.extend(['foo', 'bar']) 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_string.extend([]) 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_string.append('baz') 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_string.extend(str(x) for x in xrange(2)) 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_int32 = 21 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville [ (proto.DESCRIPTOR.fields_by_name['optional_int32' ], 21), 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (proto.DESCRIPTOR.fields_by_name['repeated_int32' ], [5, 11]), 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (proto.DESCRIPTOR.fields_by_name['repeated_fixed32'], [1]), 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (proto.DESCRIPTOR.fields_by_name['repeated_string' ], 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ['foo', 'bar', 'baz', '0', '1']) ], 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.ListFields()) 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSingularListExtensions(self): 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllExtensions() 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[unittest_pb2.optional_fixed32_extension] = 1 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[unittest_pb2.optional_int32_extension ] = 5 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[unittest_pb2.optional_string_extension ] = 'foo' 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville [ (unittest_pb2.optional_int32_extension , 5), 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (unittest_pb2.optional_fixed32_extension, 1), 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (unittest_pb2.optional_string_extension , 'foo') ], 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.ListFields()) 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedListExtensions(self): 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllExtensions() 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[unittest_pb2.repeated_fixed32_extension].append(1) 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[unittest_pb2.repeated_int32_extension ].append(5) 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[unittest_pb2.repeated_int32_extension ].append(11) 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[unittest_pb2.repeated_string_extension ].append('foo') 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[unittest_pb2.repeated_string_extension ].append('bar') 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[unittest_pb2.repeated_string_extension ].append('baz') 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[unittest_pb2.optional_int32_extension ] = 21 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville [ (unittest_pb2.optional_int32_extension , 21), 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (unittest_pb2.repeated_int32_extension , [5, 11]), 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (unittest_pb2.repeated_fixed32_extension, [1]), 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (unittest_pb2.repeated_string_extension , ['foo', 'bar', 'baz']) ], 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.ListFields()) 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testListFieldsAndExtensions(self): 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestFieldOrderings() 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllFieldsAndExtensions(proto) 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.my_extension_int 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville [ (proto.DESCRIPTOR.fields_by_name['my_int' ], 1), 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (unittest_pb2.my_extension_int , 23), 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (proto.DESCRIPTOR.fields_by_name['my_string'], 'foo'), 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (unittest_pb2.my_extension_string , 'bar'), 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (proto.DESCRIPTOR.fields_by_name['my_float' ], 1.0) ], 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.ListFields()) 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testDefaultValues(self): 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_int32) 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_int64) 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_uint32) 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_uint64) 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_sint32) 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_sint64) 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_fixed32) 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_fixed64) 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_sfixed32) 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_sfixed64) 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0.0, proto.optional_float) 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0.0, proto.optional_double) 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(False, proto.optional_bool) 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual('', proto.optional_string) 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual('', proto.optional_bytes) 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(41, proto.default_int32) 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(42, proto.default_int64) 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(43, proto.default_uint32) 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(44, proto.default_uint64) 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(-45, proto.default_sint32) 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(46, proto.default_sint64) 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(47, proto.default_fixed32) 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(48, proto.default_fixed64) 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(49, proto.default_sfixed32) 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(-50, proto.default_sfixed64) 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(51.5, proto.default_float) 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(52e3, proto.default_double) 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(True, proto.default_bool) 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual('hello', proto.default_string) 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual('world', proto.default_bytes) 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestAllTypes.BAR, proto.default_nested_enum) 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.FOREIGN_BAR, proto.default_foreign_enum) 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_import_pb2.IMPORT_BAR, 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.default_import_enum) 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestExtremeDefaultValues() 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(u'\u1234', proto.utf8_string) 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testHasFieldWithUnknownFieldName(self): 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(ValueError, proto.HasField, 'nonexistent_field') 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testClearFieldWithUnknownFieldName(self): 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(ValueError, proto.ClearField, 'nonexistent_field') 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testDisallowedAssignments(self): 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # It's illegal to assign values directly to repeated fields 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # or to nonrepeated composite fields. Ensure that this fails. 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Repeated fields. 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', 10) 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Lists shouldn't work, either. 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', [10]) 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Composite fields. 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(AttributeError, setattr, proto, 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'optional_nested_message', 23) 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Assignment to a repeated nested message field without specifying 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # the index in the array of nested messages. 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(AttributeError, setattr, proto.repeated_nested_message, 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'bb', 34) 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Assignment to an attribute of a repeated field. 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(AttributeError, setattr, proto.repeated_float, 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'some_attribute', 34) 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # proto.nonexistent_field = 23 should fail as well. 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(AttributeError, setattr, proto, 'nonexistent_field', 23) 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # TODO(robinson): Add type-safety check for enums. 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSingleScalarTypeSafety(self): 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, setattr, proto, 'optional_int32', 1.1) 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, setattr, proto, 'optional_int32', 'foo') 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, setattr, proto, 'optional_string', 10) 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, setattr, proto, 'optional_bytes', 10) 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSingleScalarBoundsChecking(self): 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def TestMinAndMaxIntegers(field_name, expected_min, expected_max): 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville pb = unittest_pb2.TestAllTypes() 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville setattr(pb, field_name, expected_min) 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville setattr(pb, field_name, expected_max) 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(ValueError, setattr, pb, field_name, expected_min - 1) 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(ValueError, setattr, pb, field_name, expected_max + 1) 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMinAndMaxIntegers('optional_int32', -(1 << 31), (1 << 31) - 1) 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMinAndMaxIntegers('optional_uint32', 0, 0xffffffff) 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMinAndMaxIntegers('optional_int64', -(1 << 63), (1 << 63) - 1) 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMinAndMaxIntegers('optional_uint64', 0, 0xffffffffffffffff) 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestMinAndMaxIntegers('optional_nested_enum', -(1 << 31), (1 << 31) - 1) 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedScalarTypeSafety(self): 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, proto.repeated_int32.append, 1.1) 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, proto.repeated_int32.append, 'foo') 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, proto.repeated_string, 10) 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, proto.repeated_bytes, 10) 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.append(10) 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32[0] = 23 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(IndexError, proto.repeated_int32.__setitem__, 500, 23) 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, proto.repeated_int32.__setitem__, 0, 'abc') 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSingleScalarGettersAndSetters(self): 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_int32) 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_int32 = 1 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto.optional_int32) 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # TODO(robinson): Test all other scalar field types. 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSingleScalarClearField(self): 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Should be allowed to clear something that's not there (a no-op). 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.ClearField('optional_int32') 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_int32 = 1 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('optional_int32')) 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.ClearField('optional_int32') 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.optional_int32) 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.HasField('optional_int32')) 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # TODO(robinson): Test all other scalar field types. 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testEnums(self): 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto.FOO) 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, unittest_pb2.TestAllTypes.FOO) 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, proto.BAR) 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, unittest_pb2.TestAllTypes.BAR) 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, proto.BAZ) 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ) 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedScalars(self): 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.repeated_int32) 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, len(proto.repeated_int32)) 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.append(5) 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.append(10) 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.append(15) 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.repeated_int32) 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, len(proto.repeated_int32)) 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([5, 10, 15], proto.repeated_int32) 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test single retrieval. 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(5, proto.repeated_int32[0]) 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(15, proto.repeated_int32[-1]) 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test out-of-bounds indices. 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(IndexError, proto.repeated_int32.__getitem__, 1234) 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(IndexError, proto.repeated_int32.__getitem__, -1234) 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test incorrect types passed to __getitem__. 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, proto.repeated_int32.__getitem__, 'foo') 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, proto.repeated_int32.__getitem__, None) 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test single assignment. 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32[1] = 20 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([5, 20, 15], proto.repeated_int32) 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test insertion. 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.insert(1, 25) 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([5, 25, 20, 15], proto.repeated_int32) 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test slice retrieval. 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.append(30) 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([25, 20, 15], proto.repeated_int32[1:4]) 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([5, 25, 20, 15, 30], proto.repeated_int32[:]) 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test slice assignment with an iterator 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32[1:4] = (i for i in xrange(3)) 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([5, 0, 1, 2, 30], proto.repeated_int32) 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test slice assignment. 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32[1:4] = [35, 40, 45] 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([5, 35, 40, 45, 30], proto.repeated_int32) 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test that we can use the field as an iterator. 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result = [] 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for i in proto.repeated_int32: 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result.append(i) 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([5, 35, 40, 45, 30], result) 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test single deletion. 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville del proto.repeated_int32[2] 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([5, 35, 45, 30], proto.repeated_int32) 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test slice deletion. 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville del proto.repeated_int32[2:] 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([5, 35], proto.repeated_int32) 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test clearing. 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.ClearField('repeated_int32') 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.repeated_int32) 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, len(proto.repeated_int32)) 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedScalarsRemove(self): 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.repeated_int32) 482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, len(proto.repeated_int32)) 483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.append(5) 484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.append(10) 485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.append(5) 486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.append(5) 487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(4, len(proto.repeated_int32)) 489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.remove(5) 490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, len(proto.repeated_int32)) 491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(10, proto.repeated_int32[0]) 492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(5, proto.repeated_int32[1]) 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(5, proto.repeated_int32[2]) 494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.remove(5) 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, len(proto.repeated_int32)) 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(10, proto.repeated_int32[0]) 498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(5, proto.repeated_int32[1]) 499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.repeated_int32.remove(10) 501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, len(proto.repeated_int32)) 502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(5, proto.repeated_int32[0]) 503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Remove a non-existent element. 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(ValueError, proto.repeated_int32.remove, 123) 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedComposites(self): 508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.repeated_nested_message) 510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, len(proto.repeated_nested_message)) 511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m0 = proto.repeated_nested_message.add() 512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m1 = proto.repeated_nested_message.add() 513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.repeated_nested_message) 514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, len(proto.repeated_nested_message)) 515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertIs([m0, m1], proto.repeated_nested_message) 516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(isinstance(m0, unittest_pb2.TestAllTypes.NestedMessage)) 517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test out-of-bounds indices. 519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__, 520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1234) 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__, 522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville -1234) 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test incorrect types passed to __getitem__. 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__, 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'foo') 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__, 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville None) 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test slice retrieval. 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m2 = proto.repeated_nested_message.add() 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m3 = proto.repeated_nested_message.add() 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m4 = proto.repeated_nested_message.add() 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertIs([m1, m2, m3], proto.repeated_nested_message[1:4]) 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertIs([m0, m1, m2, m3, m4], proto.repeated_nested_message[:]) 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test that we can use the field as an iterator. 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result = [] 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for i in proto.repeated_nested_message: 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville result.append(i) 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertIs([m0, m1, m2, m3, m4], result) 542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test single deletion. 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville del proto.repeated_nested_message[2] 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertIs([m0, m1, m3, m4], proto.repeated_nested_message) 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test slice deletion. 548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville del proto.repeated_nested_message[2:] 549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertIs([m0, m1], proto.repeated_nested_message) 550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test clearing. 552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.ClearField('repeated_nested_message') 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.repeated_nested_message) 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, len(proto.repeated_nested_message)) 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testHandWrittenReflection(self): 557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # TODO(robinson): We probably need a better way to specify 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # protocol types by hand. But then again, this isn't something 559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # we expect many people to do. Hmm. 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldDescriptor = descriptor.FieldDescriptor 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foo_field_descriptor = FieldDescriptor( 562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville name='foo_field', full_name='MyProto.foo_field', 563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville index=0, number=1, type=FieldDescriptor.TYPE_INT64, 564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville cpp_type=FieldDescriptor.CPPTYPE_INT64, 565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville label=FieldDescriptor.LABEL_OPTIONAL, default_value=0, 566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville containing_type=None, message_type=None, enum_type=None, 567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville is_extension=False, extension_scope=None, 568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options=descriptor_pb2.FieldOptions()) 569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville mydescriptor = descriptor.Descriptor( 570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville name='MyProto', full_name='MyProto', filename='ignored', 571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville containing_type=None, nested_types=[], enum_types=[], 572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville fields=[foo_field_descriptor], extensions=[], 573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville options=descriptor_pb2.MessageOptions()) 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class MyProtoClass(message.Message): 575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DESCRIPTOR = mydescriptor 576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville __metaclass__ = reflection.GeneratedProtocolMessageType 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville myproto_instance = MyProtoClass() 578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, myproto_instance.foo_field) 579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not myproto_instance.HasField('foo_field')) 580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville myproto_instance.foo_field = 23 581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(23, myproto_instance.foo_field) 582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(myproto_instance.HasField('foo_field')) 583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testTopLevelExtensionsForOptionalScalar(self): 585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto = unittest_pb2.TestAllExtensions() 586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = unittest_pb2.optional_int32_extension 587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not extendee_proto.HasExtension(extension)) 588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, extendee_proto.Extensions[extension]) 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # As with normal scalar fields, just doing a read doesn't actually set the 590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # "has" bit. 591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not extendee_proto.HasExtension(extension)) 592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Actually set the thing. 593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto.Extensions[extension] = 23 594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(23, extendee_proto.Extensions[extension]) 595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(extendee_proto.HasExtension(extension)) 596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Ensure that clearing works as well. 597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto.ClearExtension(extension) 598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, extendee_proto.Extensions[extension]) 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not extendee_proto.HasExtension(extension)) 600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testTopLevelExtensionsForRepeatedScalar(self): 602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto = unittest_pb2.TestAllExtensions() 603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = unittest_pb2.repeated_string_extension 604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, len(extendee_proto.Extensions[extension])) 605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto.Extensions[extension].append('foo') 606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(['foo'], extendee_proto.Extensions[extension]) 607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string_list = extendee_proto.Extensions[extension] 608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto.ClearExtension(extension) 609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, len(extendee_proto.Extensions[extension])) 610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(string_list is not extendee_proto.Extensions[extension]) 611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Shouldn't be allowed to do Extensions[extension] = 'a' 612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions, 613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension, 'a') 614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testTopLevelExtensionsForOptionalMessage(self): 616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto = unittest_pb2.TestAllExtensions() 617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = unittest_pb2.optional_foreign_message_extension 618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not extendee_proto.HasExtension(extension)) 619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, extendee_proto.Extensions[extension].c) 620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # As with normal (non-extension) fields, merely reading from the 621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # thing shouldn't set the "has" bit. 622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not extendee_proto.HasExtension(extension)) 623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto.Extensions[extension].c = 23 624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(23, extendee_proto.Extensions[extension].c) 625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(extendee_proto.HasExtension(extension)) 626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Save a reference here. 627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foreign_message = extendee_proto.Extensions[extension] 628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto.ClearExtension(extension) 629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(foreign_message is not extendee_proto.Extensions[extension]) 630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Setting a field on foreign_message now shouldn't set 631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # any "has" bits on extendee_proto. 632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foreign_message.c = 42 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(42, foreign_message.c) 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(foreign_message.HasField('c')) 635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not extendee_proto.HasExtension(extension)) 636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Shouldn't be allowed to do Extensions[extension] = 'a' 637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions, 638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension, 'a') 639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testTopLevelExtensionsForRepeatedMessage(self): 641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto = unittest_pb2.TestAllExtensions() 642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = unittest_pb2.repeatedgroup_extension 643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, len(extendee_proto.Extensions[extension])) 644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville group = extendee_proto.Extensions[extension].add() 645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville group.a = 23 646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(23, extendee_proto.Extensions[extension][0].a) 647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville group.a = 42 648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(42, extendee_proto.Extensions[extension][0].a) 649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville group_list = extendee_proto.Extensions[extension] 650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto.ClearExtension(extension) 651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, len(extendee_proto.Extensions[extension])) 652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(group_list is not extendee_proto.Extensions[extension]) 653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Shouldn't be allowed to do Extensions[extension] = 'a' 654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions, 655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension, 'a') 656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testNestedExtensions(self): 658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto = unittest_pb2.TestAllExtensions() 659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = unittest_pb2.TestRequired.single 660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # We just test the non-repeated case. 662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not extendee_proto.HasExtension(extension)) 663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville required = extendee_proto.Extensions[extension] 664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, required.a) 665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not extendee_proto.HasExtension(extension)) 666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville required.a = 23 667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(23, extendee_proto.Extensions[extension].a) 668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(extendee_proto.HasExtension(extension)) 669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto.ClearExtension(extension) 670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(required is not extendee_proto.Extensions[extension]) 671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not extendee_proto.HasExtension(extension)) 672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # If message A directly contains message B, and 674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # a.HasField('b') is currently False, then mutating any 675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # extension in B should change a.HasField('b') to True 676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # (and so on up the object tree). 677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testHasBitsForAncestorsOfExtendedMessage(self): 678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Optional scalar extension. 679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville toplevel = more_extensions_pb2.TopLevelMessage() 680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not toplevel.HasField('submessage')) 681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, toplevel.submessage.Extensions[ 682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville more_extensions_pb2.optional_int_extension]) 683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not toplevel.HasField('submessage')) 684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville toplevel.submessage.Extensions[ 685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville more_extensions_pb2.optional_int_extension] = 23 686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(23, toplevel.submessage.Extensions[ 687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville more_extensions_pb2.optional_int_extension]) 688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(toplevel.HasField('submessage')) 689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Repeated scalar extension. 691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville toplevel = more_extensions_pb2.TopLevelMessage() 692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not toplevel.HasField('submessage')) 693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([], toplevel.submessage.Extensions[ 694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville more_extensions_pb2.repeated_int_extension]) 695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not toplevel.HasField('submessage')) 696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville toplevel.submessage.Extensions[ 697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville more_extensions_pb2.repeated_int_extension].append(23) 698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([23], toplevel.submessage.Extensions[ 699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville more_extensions_pb2.repeated_int_extension]) 700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(toplevel.HasField('submessage')) 701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Optional message extension. 703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville toplevel = more_extensions_pb2.TopLevelMessage() 704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not toplevel.HasField('submessage')) 705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, toplevel.submessage.Extensions[ 706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville more_extensions_pb2.optional_message_extension].foreign_message_int) 707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not toplevel.HasField('submessage')) 708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville toplevel.submessage.Extensions[ 709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville more_extensions_pb2.optional_message_extension].foreign_message_int = 23 710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(23, toplevel.submessage.Extensions[ 711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville more_extensions_pb2.optional_message_extension].foreign_message_int) 712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(toplevel.HasField('submessage')) 713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Repeated message extension. 715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville toplevel = more_extensions_pb2.TopLevelMessage() 716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not toplevel.HasField('submessage')) 717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, len(toplevel.submessage.Extensions[ 718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville more_extensions_pb2.repeated_message_extension])) 719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not toplevel.HasField('submessage')) 720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foreign = toplevel.submessage.Extensions[ 721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville more_extensions_pb2.repeated_message_extension].add() 722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(foreign is toplevel.submessage.Extensions[ 723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville more_extensions_pb2.repeated_message_extension][0]) 724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(toplevel.HasField('submessage')) 725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testDisconnectionAfterClearingEmptyMessage(self): 727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville toplevel = more_extensions_pb2.TopLevelMessage() 728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto = toplevel.submessage 729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = more_extensions_pb2.optional_message_extension 730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension_proto = extendee_proto.Extensions[extension] 731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto.ClearExtension(extension) 732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension_proto.foreign_message_int = 23 733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not toplevel.HasField('submessage')) 735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(extension_proto is not extendee_proto.Extensions[extension]) 736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testExtensionFailureModes(self): 738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extendee_proto = unittest_pb2.TestAllExtensions() 739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Try non-extension-handle arguments to HasExtension, 741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # ClearExtension(), and Extensions[]... 742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(KeyError, extendee_proto.HasExtension, 1234) 743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(KeyError, extendee_proto.ClearExtension, 1234) 744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__, 1234) 745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__, 1234, 5) 746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Try something that *is* an extension handle, just not for 748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # this message... 749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_handle = more_extensions_pb2.optional_int_extension 750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(KeyError, extendee_proto.HasExtension, 751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_handle) 752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(KeyError, extendee_proto.ClearExtension, 753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_handle) 754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__, 755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_handle) 756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__, 757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_handle, 5) 758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Try call HasExtension() with a valid handle, but for a 760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # *repeated* field. (Just as with non-extension repeated 761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # fields, Has*() isn't supported for extension repeated fields). 762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(KeyError, extendee_proto.HasExtension, 763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.repeated_string_extension) 764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testStaticParseFrom(self): 766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1 = unittest_pb2.TestAllTypes() 767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllFields(proto1) 768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string1 = proto1.SerializeToString() 770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestAllTypes.FromString(string1) 771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Messages should be equal. 773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(proto2, proto1) 774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testMergeFromSingularField(self): 776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test merge with just a singular field. 777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1 = unittest_pb2.TestAllTypes() 778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.optional_int32 = 1 779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestAllTypes() 781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # This shouldn't get overwritten. 782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.optional_string = 'value' 783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.MergeFrom(proto1) 785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto2.optional_int32) 786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual('value', proto2.optional_string) 787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testMergeFromRepeatedField(self): 789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test merge with just a repeated field. 790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1 = unittest_pb2.TestAllTypes() 791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.repeated_int32.append(1) 792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.repeated_int32.append(2) 793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestAllTypes() 795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.repeated_int32.append(0) 796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.MergeFrom(proto1) 797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto2.repeated_int32[0]) 799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto2.repeated_int32[1]) 800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, proto2.repeated_int32[2]) 801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testMergeFromOptionalGroup(self): 803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test merge with an optional group. 804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1 = unittest_pb2.TestAllTypes() 805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.optionalgroup.a = 12 806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestAllTypes() 807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.MergeFrom(proto1) 808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(12, proto2.optionalgroup.a) 809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testMergeFromRepeatedNestedMessage(self): 811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test merge with a repeated nested message. 812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1 = unittest_pb2.TestAllTypes() 813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m = proto1.repeated_nested_message.add() 814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m.bb = 123 815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m = proto1.repeated_nested_message.add() 816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m.bb = 321 817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestAllTypes() 819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m = proto2.repeated_nested_message.add() 820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m.bb = 999 821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.MergeFrom(proto1) 822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(999, proto2.repeated_nested_message[0].bb) 823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(123, proto2.repeated_nested_message[1].bb) 824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(321, proto2.repeated_nested_message[2].bb) 825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testMergeFromAllFields(self): 827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # With all fields set. 828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1 = unittest_pb2.TestAllTypes() 829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllFields(proto1) 830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestAllTypes() 831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.MergeFrom(proto1) 832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Messages should be equal. 834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(proto2, proto1) 835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Serialized string should be equal too. 837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string1 = proto1.SerializeToString() 838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string2 = proto2.SerializeToString() 839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(string1, string2) 840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testMergeFromExtensionsSingular(self): 842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1 = unittest_pb2.TestAllExtensions() 843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.Extensions[unittest_pb2.optional_int32_extension] = 1 844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestAllExtensions() 846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.MergeFrom(proto1) 847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, proto2.Extensions[unittest_pb2.optional_int32_extension]) 849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testMergeFromExtensionsRepeated(self): 851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1 = unittest_pb2.TestAllExtensions() 852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.Extensions[unittest_pb2.repeated_int32_extension].append(1) 853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.Extensions[unittest_pb2.repeated_int32_extension].append(2) 854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestAllExtensions() 856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.Extensions[unittest_pb2.repeated_int32_extension].append(0) 857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.MergeFrom(proto1) 858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3, len(proto2.Extensions[unittest_pb2.repeated_int32_extension])) 860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 0, proto2.Extensions[unittest_pb2.repeated_int32_extension][0]) 862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, proto2.Extensions[unittest_pb2.repeated_int32_extension][1]) 864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2, proto2.Extensions[unittest_pb2.repeated_int32_extension][2]) 866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testMergeFromExtensionsNestedMessage(self): 868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1 = unittest_pb2.TestAllExtensions() 869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ext1 = proto1.Extensions[ 870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.repeated_nested_message_extension] 871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m = ext1.add() 872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m.bb = 222 873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m = ext1.add() 874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m.bb = 333 875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestAllExtensions() 877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ext2 = proto2.Extensions[ 878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.repeated_nested_message_extension] 879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m = ext2.add() 880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville m.bb = 111 881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.MergeFrom(proto1) 883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ext2 = proto2.Extensions[ 884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.repeated_nested_message_extension] 885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, len(ext2)) 886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(111, ext2[0].bb) 887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(222, ext2[1].bb) 888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(333, ext2[2].bb) 889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testCopyFromSingularField(self): 891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test copy with just a singular field. 892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1 = unittest_pb2.TestAllTypes() 893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.optional_int32 = 1 894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.optional_string = 'important-text' 895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestAllTypes() 897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.optional_string = 'value' 898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.CopyFrom(proto1) 900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto2.optional_int32) 901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual('important-text', proto2.optional_string) 902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testCopyFromRepeatedField(self): 904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test copy with a repeated field. 905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1 = unittest_pb2.TestAllTypes() 906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.repeated_int32.append(1) 907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.repeated_int32.append(2) 908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestAllTypes() 910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.repeated_int32.append(0) 911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.CopyFrom(proto1) 912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto2.repeated_int32[0]) 914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, proto2.repeated_int32[1]) 915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testCopyFromAllFields(self): 917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # With all fields set. 918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1 = unittest_pb2.TestAllTypes() 919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllFields(proto1) 920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestAllTypes() 921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.CopyFrom(proto1) 922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Messages should be equal. 924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(proto2, proto1) 925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Serialized string should be equal too. 927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string1 = proto1.SerializeToString() 928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string2 = proto2.SerializeToString() 929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(string1, string2) 930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testCopyFromSelf(self): 932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1 = unittest_pb2.TestAllTypes() 933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.repeated_int32.append(1) 934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.optional_int32 = 2 935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.optional_string = 'important-text' 936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto1.CopyFrom(proto1) 938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto1.repeated_int32[0]) 939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, proto1.optional_int32) 940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual('important-text', proto1.optional_string) 941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testClear(self): 943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllFields(proto) 945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Clear the message. 946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Clear() 947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEquals(proto.ByteSize(), 0) 948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville empty_proto = unittest_pb2.TestAllTypes() 949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEquals(proto, empty_proto) 950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test if extensions which were set are cleared. 952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllExtensions() 953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllExtensions(proto) 954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Clear the message. 955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Clear() 956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEquals(proto.ByteSize(), 0) 957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville empty_proto = unittest_pb2.TestAllExtensions() 958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEquals(proto, empty_proto) 959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testIsInitialized(self): 961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Trivial cases - all optional fields and extensions. 962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.IsInitialized()) 964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllExtensions() 965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.IsInitialized()) 966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # The case of uninitialized required fields. 968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestRequired() 969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertFalse(proto.IsInitialized()) 970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.a = proto.b = proto.c = 2 971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.IsInitialized()) 972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # The case of uninitialized submessage. 974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestRequiredForeign() 975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.IsInitialized()) 976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_message.a = 1 977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertFalse(proto.IsInitialized()) 978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_message.b = 0 979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_message.c = 0 980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.IsInitialized()) 981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Uninitialized repeated submessage. 983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1 = proto.repeated_message.add() 984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertFalse(proto.IsInitialized()) 985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1.a = message1.b = message1.c = 0 986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.IsInitialized()) 987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Uninitialized repeated group in an extension. 989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllExtensions() 990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = unittest_pb2.TestRequired.multi 991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1 = proto.Extensions[extension].add() 992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message2 = proto.Extensions[extension].add() 993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertFalse(proto.IsInitialized()) 994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1.a = 1 995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1.b = 1 996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1.c = 1 997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertFalse(proto.IsInitialized()) 998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message2.a = 2 999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message2.b = 2 1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message2.c = 2 1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.IsInitialized()) 1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Uninitialized nonrepeated message in an extension. 1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllExtensions() 1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = unittest_pb2.TestRequired.single 1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[extension].a = 1 1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertFalse(proto.IsInitialized()) 1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[extension].b = 2 1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[extension].c = 3 1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.IsInitialized()) 1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testStringUTF8Encoding(self): 1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Assignment of a unicode object to a field of type 'bytes' is not allowed. 1016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(TypeError, 1017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville setattr, proto, 'optional_bytes', u'unicode object') 1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Check that the default value is of python's 'unicode' type. 1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(type(proto.optional_string), unicode) 1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_string = unicode('Testing') 1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(proto.optional_string, str('Testing')) 1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1025fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Assign a value of type 'str' which can be encoded in UTF-8. 1026fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_string = str('Testing') 1027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(proto.optional_string, unicode('Testing')) 1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Values of type 'str' are also accepted as long as they can be encoded in 1030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # UTF-8. 1031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(type(proto.optional_string), str) 1032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Try to assign a 'str' value which contains bytes that aren't 7-bit ASCII. 1034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(ValueError, 1035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville setattr, proto, 'optional_string', str('a\x80a')) 1036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Assign a 'str' object which contains a UTF-8 encoded string. 1037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(ValueError, 1038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville setattr, proto, 'optional_string', 'Тест') 1039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # No exception thrown. 1040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_string = 'abc' 1041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testStringUTF8Serialization(self): 1043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_mset_pb2.TestMessageSet() 1044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension_message = unittest_mset_pb2.TestMessageSetExtension2 1045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = extension_message.message_set_extension 1046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_utf8 = u'Тест' 1048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_utf8_bytes = test_utf8.encode('utf-8') 1049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 'Test' in another language, using UTF-8 charset. 1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[extension].str = test_utf8 1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Serialize using the MessageSet wire format (this is specified in the 1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # .proto file). 1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = proto.SerializeToString() 1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Check byte size. 1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(proto.ByteSize(), len(serialized)) 1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raw = unittest_mset_pb2.RawMessageSet() 1061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raw.MergeFromString(serialized) 1062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message2 = unittest_mset_pb2.TestMessageSetExtension2() 1064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, len(raw.item)) 1066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Check that the type_id is the same as the tag ID in the .proto file. 1067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(raw.item[0].type_id, 1547769) 1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Check the actually bytes on the wire. 1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue( 1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raw.item[0].message.endswith(test_utf8_bytes)) 1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message2.MergeFromString(raw.item[0].message) 1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(type(message2.str), unicode) 1075fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(message2.str, test_utf8) 1076fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1077fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # How about if the bytes on the wire aren't a valid UTF-8 encoded string. 1078fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bytes = raw.item[0].message.replace( 1079fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_utf8_bytes, len(test_utf8_bytes) * '\xff') 1080fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertRaises(UnicodeDecodeError, message2.MergeFromString, bytes) 1081fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1082fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1083fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Since we had so many tests for protocol buffer equality, we broke these out 1084fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# into separate TestCase classes. 1085fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1086fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1087fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TestAllTypesEqualityTest(unittest.TestCase): 1088fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1089fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def setUp(self): 1090fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto = unittest_pb2.TestAllTypes() 1091fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.second_proto = unittest_pb2.TestAllTypes() 1092fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1093fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSelfEquality(self): 1094fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(self.first_proto, self.first_proto) 1095fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1096fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testEmptyProtosEqual(self): 1097fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(self.first_proto, self.second_proto) 1098fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1099fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FullProtosEqualityTest(unittest.TestCase): 1101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Equality tests using completely-full protos as a starting point.""" 1103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def setUp(self): 1105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto = unittest_pb2.TestAllTypes() 1106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.second_proto = unittest_pb2.TestAllTypes() 1107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllFields(self.first_proto) 1108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllFields(self.second_proto) 1109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testNoneNotEqual(self): 1111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(self.first_proto, None) 1112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(None, self.second_proto) 1113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testNotEqualToOtherMessage(self): 1115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville third_proto = unittest_pb2.TestRequired() 1116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(self.first_proto, third_proto) 1117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(third_proto, self.second_proto) 1118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testAllFieldsFilledEquality(self): 1120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(self.first_proto, self.second_proto) 1121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testNonRepeatedScalar(self): 1123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Nonrepeated scalar field change should cause inequality. 1124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.optional_int32 += 1 1125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(self.first_proto, self.second_proto) 1126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # ...as should clearing a field. 1127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.ClearField('optional_int32') 1128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(self.first_proto, self.second_proto) 1129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testNonRepeatedComposite(self): 1131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Change a nonrepeated composite field. 1132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.optional_nested_message.bb += 1 1133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(self.first_proto, self.second_proto) 1134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.optional_nested_message.bb -= 1 1135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(self.first_proto, self.second_proto) 1136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Clear a field in the nested message. 1137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.optional_nested_message.ClearField('bb') 1138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(self.first_proto, self.second_proto) 1139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.optional_nested_message.bb = ( 1140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.second_proto.optional_nested_message.bb) 1141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(self.first_proto, self.second_proto) 1142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Remove the nested message entirely. 1143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.ClearField('optional_nested_message') 1144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(self.first_proto, self.second_proto) 1145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedScalar(self): 1147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Change a repeated scalar field. 1148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.repeated_int32.append(5) 1149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(self.first_proto, self.second_proto) 1150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.ClearField('repeated_int32') 1151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(self.first_proto, self.second_proto) 1152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedComposite(self): 1154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Change value within a repeated composite field. 1155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.repeated_nested_message[0].bb += 1 1156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(self.first_proto, self.second_proto) 1157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.repeated_nested_message[0].bb -= 1 1158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(self.first_proto, self.second_proto) 1159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Add a value to a repeated composite field. 1160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.repeated_nested_message.add() 1161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(self.first_proto, self.second_proto) 1162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.second_proto.repeated_nested_message.add() 1163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(self.first_proto, self.second_proto) 1164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testNonRepeatedScalarHasBits(self): 1166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Ensure that we test "has" bits as well as value for 1167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # nonrepeated scalar field. 1168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.ClearField('optional_int32') 1169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.second_proto.optional_int32 = 0 1170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(self.first_proto, self.second_proto) 1171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testNonRepeatedCompositeHasBits(self): 1173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Ensure that we test "has" bits as well as value for 1174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # nonrepeated composite field. 1175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.ClearField('optional_nested_message') 1176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.second_proto.optional_nested_message.ClearField('bb') 1177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(self.first_proto, self.second_proto) 1178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # TODO(robinson): Replace next two lines with method 1179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # to set the "has" bit without changing the value, 1180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # if/when such a method exists. 1181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.optional_nested_message.bb = 0 1182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.first_proto.optional_nested_message.ClearField('bb') 1183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(self.first_proto, self.second_proto) 1184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ExtensionEqualityTest(unittest.TestCase): 1187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testExtensionEquality(self): 1189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto = unittest_pb2.TestAllExtensions() 1190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto = unittest_pb2.TestAllExtensions() 1191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto, second_proto) 1192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllExtensions(first_proto) 1193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(first_proto, second_proto) 1194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllExtensions(second_proto) 1195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto, second_proto) 1196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Ensure that we check value equality. 1198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto.Extensions[unittest_pb2.optional_int32_extension] += 1 1199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(first_proto, second_proto) 1200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto.Extensions[unittest_pb2.optional_int32_extension] -= 1 1201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto, second_proto) 1202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Ensure that we also look at "has" bits. 1204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto.ClearExtension(unittest_pb2.optional_int32_extension) 1205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto.Extensions[unittest_pb2.optional_int32_extension] = 0 1206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(first_proto, second_proto) 1207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto.Extensions[unittest_pb2.optional_int32_extension] = 0 1208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto, second_proto) 1209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Ensure that differences in cached values 1211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # don't matter if "has" bits are both false. 1212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto = unittest_pb2.TestAllExtensions() 1213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto = unittest_pb2.TestAllExtensions() 1214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 1215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 0, first_proto.Extensions[unittest_pb2.optional_int32_extension]) 1216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto, second_proto) 1217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MutualRecursionEqualityTest(unittest.TestCase): 1220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testEqualityWithMutualRecursion(self): 1222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto = unittest_pb2.TestMutualRecursionA() 1223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto = unittest_pb2.TestMutualRecursionA() 1224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto, second_proto) 1225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto.bb.a.bb.optional_int32 = 23 1226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertNotEqual(first_proto, second_proto) 1227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto.bb.a.bb.optional_int32 = 23 1228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto, second_proto) 1229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ByteSizeTest(unittest.TestCase): 1232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def setUp(self): 1234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto = unittest_pb2.TestAllTypes() 1235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.extended_proto = more_extensions_pb2.ExtendedMessage() 1236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.packed_proto = unittest_pb2.TestPackedTypes() 1237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.packed_extended_proto = unittest_pb2.TestPackedExtensions() 1238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def Size(self): 1240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return self.proto.ByteSize() 1241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testEmptyMessage(self): 1243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.proto.ByteSize()) 1244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testVarints(self): 1246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def Test(i, expected_varint_size): 1247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.Clear() 1248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_int64 = i 1249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Add one to the varint size for the tag info 1250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # for tag 1. 1251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(expected_varint_size + 1, self.Size()) 1252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Test(0, 1) 1253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Test(1, 1) 1254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for i, num_bytes in zip(range(7, 63, 7), range(1, 10000)): 1255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Test((1 << i) - 1, num_bytes) 1256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Test(-1, 10) 1257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Test(-2, 10) 1258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Test(-(1 << 63), 10) 1259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testStrings(self): 1261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_string = '' 1262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Need one byte for tag info (tag #14), and one byte for length. 1263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, self.Size()) 1264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_string = 'abc' 1266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Need one byte for tag info (tag #14), and one byte for length. 1267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2 + len(self.proto.optional_string), self.Size()) 1268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_string = 'x' * 128 1270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Need one byte for tag info (tag #14), and TWO bytes for length. 1271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3 + len(self.proto.optional_string), self.Size()) 1272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testOtherNumerics(self): 1274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_fixed32 = 1234 1275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # One byte for tag and 4 bytes for fixed32. 1276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(5, self.Size()) 1277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto = unittest_pb2.TestAllTypes() 1278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_fixed64 = 1234 1280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # One byte for tag and 8 bytes for fixed64. 1281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(9, self.Size()) 1282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto = unittest_pb2.TestAllTypes() 1283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_float = 1.234 1285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # One byte for tag and 4 bytes for float. 1286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(5, self.Size()) 1287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto = unittest_pb2.TestAllTypes() 1288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_double = 1.234 1290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # One byte for tag and 8 bytes for float. 1291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(9, self.Size()) 1292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto = unittest_pb2.TestAllTypes() 1293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_sint32 = 64 1295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # One byte for tag and 2 bytes for zig-zag-encoded 64. 1296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, self.Size()) 1297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto = unittest_pb2.TestAllTypes() 1298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testComposites(self): 1300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 3 bytes. 1301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_nested_message.bb = (1 << 14) 1302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Plus one byte for bb tag. 1303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Plus 1 byte for optional_nested_message serialized size. 1304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Plus two bytes for optional_nested_message tag. 1305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3 + 1 + 1 + 2, self.Size()) 1306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testGroups(self): 1308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 4 bytes. 1309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optionalgroup.a = (1 << 21) 1310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Plus two bytes for |a| tag. 1311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Plus 2 * two bytes for START_GROUP and END_GROUP tags. 1312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(4 + 2 + 2*2, self.Size()) 1313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedScalars(self): 1315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.repeated_int32.append(10) # 1 byte. 1316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.repeated_int32.append(128) # 2 bytes. 1317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Also need 2 bytes for each entry for tag. 1318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1 + 2 + 2*2, self.Size()) 1319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedScalarsExtend(self): 1321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.repeated_int32.extend([10, 128]) # 3 bytes. 1322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Also need 2 bytes for each entry for tag. 1323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1 + 2 + 2*2, self.Size()) 1324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedScalarsRemove(self): 1326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.repeated_int32.append(10) # 1 byte. 1327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.repeated_int32.append(128) # 2 bytes. 1328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Also need 2 bytes for each entry for tag. 1329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1 + 2 + 2*2, self.Size()) 1330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.repeated_int32.remove(128) 1331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1 + 2, self.Size()) 1332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedComposites(self): 1334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Empty message. 2 bytes tag plus 1 byte length. 1335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foreign_message_0 = self.proto.repeated_nested_message.add() 1336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 1337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foreign_message_1 = self.proto.repeated_nested_message.add() 1338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foreign_message_1.bb = 7 1339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size()) 1340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedCompositesDelete(self): 1342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Empty message. 2 bytes tag plus 1 byte length. 1343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foreign_message_0 = self.proto.repeated_nested_message.add() 1344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 1345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foreign_message_1 = self.proto.repeated_nested_message.add() 1346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foreign_message_1.bb = 9 1347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size()) 1348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 1350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville del self.proto.repeated_nested_message[0] 1351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2 + 1 + 1 + 1, self.Size()) 1352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Now add a new message. 1354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foreign_message_2 = self.proto.repeated_nested_message.add() 1355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville foreign_message_2.bb = 12 1356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 1358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 1359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2 + 1 + 1 + 1 + 2 + 1 + 1 + 1, self.Size()) 1360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 1362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville del self.proto.repeated_nested_message[1] 1363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2 + 1 + 1 + 1, self.Size()) 1364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville del self.proto.repeated_nested_message[0] 1366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.Size()) 1367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testRepeatedGroups(self): 1369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 2-byte START_GROUP plus 2-byte END_GROUP. 1370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville group_0 = self.proto.repeatedgroup.add() 1371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 2-byte START_GROUP plus 2-byte |a| tag + 1-byte |a| 1372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # plus 2-byte END_GROUP. 1373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville group_1 = self.proto.repeatedgroup.add() 1374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville group_1.a = 7 1375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2 + 2 + 2 + 2 + 1 + 2, self.Size()) 1376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testExtensions(self): 1378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllExtensions() 1379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, proto.ByteSize()) 1380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = unittest_pb2.optional_int32_extension # Field #1, 1 byte. 1381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[extension] = 23 1382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 1 byte for tag, 1 byte for value. 1383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, proto.ByteSize()) 1384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testCacheInvalidationForNonrepeatedScalar(self): 1386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test non-extension. 1387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_int32 = 1 1388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, self.proto.ByteSize()) 1389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_int32 = 128 1390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, self.proto.ByteSize()) 1391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.ClearField('optional_int32') 1392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.proto.ByteSize()) 1393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test within extension. 1395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = more_extensions_pb2.optional_int_extension 1396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.extended_proto.Extensions[extension] = 1 1397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, self.extended_proto.ByteSize()) 1398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.extended_proto.Extensions[extension] = 128 1399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, self.extended_proto.ByteSize()) 1400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.extended_proto.ClearExtension(extension) 1401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.extended_proto.ByteSize()) 1402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testCacheInvalidationForRepeatedScalar(self): 1404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test non-extension. 1405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.repeated_int32.append(1) 1406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, self.proto.ByteSize()) 1407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.repeated_int32.append(1) 1408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(6, self.proto.ByteSize()) 1409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.repeated_int32[1] = 128 1410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(7, self.proto.ByteSize()) 1411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.ClearField('repeated_int32') 1412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.proto.ByteSize()) 1413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test within extension. 1415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = more_extensions_pb2.repeated_int_extension 1416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville repeated = self.extended_proto.Extensions[extension] 1417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville repeated.append(1) 1418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, self.extended_proto.ByteSize()) 1419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville repeated.append(1) 1420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(4, self.extended_proto.ByteSize()) 1421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville repeated[1] = 128 1422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(5, self.extended_proto.ByteSize()) 1423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.extended_proto.ClearExtension(extension) 1424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.extended_proto.ByteSize()) 1425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testCacheInvalidationForNonrepeatedMessage(self): 1427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test non-extension. 1428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_foreign_message.c = 1 1429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(5, self.proto.ByteSize()) 1430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_foreign_message.c = 128 1431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(6, self.proto.ByteSize()) 1432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.optional_foreign_message.ClearField('c') 1433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, self.proto.ByteSize()) 1434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.ClearField('optional_foreign_message') 1435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.proto.ByteSize()) 1436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville child = self.proto.optional_foreign_message 1437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.ClearField('optional_foreign_message') 1438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville child.c = 128 1439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.proto.ByteSize()) 1440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test within extension. 1442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = more_extensions_pb2.optional_message_extension 1443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville child = self.extended_proto.Extensions[extension] 1444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.extended_proto.ByteSize()) 1445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville child.foreign_message_int = 1 1446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(4, self.extended_proto.ByteSize()) 1447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville child.foreign_message_int = 128 1448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(5, self.extended_proto.ByteSize()) 1449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.extended_proto.ClearExtension(extension) 1450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.extended_proto.ByteSize()) 1451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testCacheInvalidationForRepeatedMessage(self): 1453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test non-extension. 1454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville child0 = self.proto.repeated_foreign_message.add() 1455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, self.proto.ByteSize()) 1456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.repeated_foreign_message.add() 1457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(6, self.proto.ByteSize()) 1458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville child0.c = 1 1459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(8, self.proto.ByteSize()) 1460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.proto.ClearField('repeated_foreign_message') 1461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.proto.ByteSize()) 1462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Test within extension. 1464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = more_extensions_pb2.repeated_message_extension 1465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville child_list = self.extended_proto.Extensions[extension] 1466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville child0 = child_list.add() 1467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, self.extended_proto.ByteSize()) 1468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville child_list.add() 1469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(4, self.extended_proto.ByteSize()) 1470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville child0.foreign_message_int = 1 1471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(6, self.extended_proto.ByteSize()) 1472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville child0.ClearField('foreign_message_int') 1473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(4, self.extended_proto.ByteSize()) 1474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.extended_proto.ClearExtension(extension) 1475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.extended_proto.ByteSize()) 1476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testPackedRepeatedScalars(self): 1478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.packed_proto.ByteSize()) 1479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.packed_proto.packed_int32.append(10) # 1 byte. 1481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.packed_proto.packed_int32.append(128) # 2 bytes. 1482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # The tag is 2 bytes (the field number is 90), and the varint 1483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # storing the length is 1 byte. 1484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int_size = 1 + 2 + 3 1485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(int_size, self.packed_proto.ByteSize()) 1486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.packed_proto.packed_double.append(4.2) # 8 bytes 1488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.packed_proto.packed_double.append(3.25) # 8 bytes 1489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # 2 more tag bytes, 1 more length byte. 1490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville double_size = 8 + 8 + 3 1491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(int_size+double_size, self.packed_proto.ByteSize()) 1492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.packed_proto.ClearField('packed_int32') 1494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(double_size, self.packed_proto.ByteSize()) 1495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testPackedExtensions(self): 1497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(0, self.packed_extended_proto.ByteSize()) 1498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension = self.packed_extended_proto.Extensions[ 1499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.packed_fixed32_extension] 1500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension.extend([1, 2, 3, 4]) # 16 bytes 1501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Tag is 3 bytes. 1502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(19, self.packed_extended_proto.ByteSize()) 1503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): We need cross-language serialization consistency tests. 1506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Issues to be sure to cover include: 1507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Handling of unrecognized tags ("uninterpreted_bytes"). 1508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Handling of MessageSets. 1509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Consistent ordering of tags in the wire format, 1510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# including ordering between extensions and non-extension 1511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# fields. 1512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Consistent serialization of negative numbers, especially 1513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# negative int32s. 1514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Handling of empty submessages (with and without "has" 1515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# bits set). 1516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass SerializationTest(unittest.TestCase): 1518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSerializeEmtpyMessage(self): 1520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto = unittest_pb2.TestAllTypes() 1521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto = unittest_pb2.TestAllTypes() 1522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = first_proto.SerializeToString() 1523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto.ByteSize(), len(serialized)) 1524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto.MergeFromString(serialized) 1525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto, second_proto) 1526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSerializeAllFields(self): 1528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto = unittest_pb2.TestAllTypes() 1529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto = unittest_pb2.TestAllTypes() 1530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllFields(first_proto) 1531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = first_proto.SerializeToString() 1532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto.ByteSize(), len(serialized)) 1533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto.MergeFromString(serialized) 1534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto, second_proto) 1535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSerializeAllExtensions(self): 1537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto = unittest_pb2.TestAllExtensions() 1538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto = unittest_pb2.TestAllExtensions() 1539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllExtensions(first_proto) 1540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = first_proto.SerializeToString() 1541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto.MergeFromString(serialized) 1542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto, second_proto) 1543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testCanonicalSerializationOrder(self): 1545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = more_messages_pb2.OutOfOrderFields() 1546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # These are also their tag numbers. Even though we're setting these in 1547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # reverse-tag order AND they're listed in reverse tag-order in the .proto 1548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # file, they should nonetheless be serialized in tag order. 1549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_sint32 = 5 1550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[more_messages_pb2.optional_uint64] = 4 1551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_uint32 = 3 1552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[more_messages_pb2.optional_int64] = 2 1553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_int32 = 1 1554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = proto.SerializeToString() 1555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(proto.ByteSize(), len(serialized)) 1556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville d = decoder.Decoder(serialized) 1557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ReadTag = d.ReadFieldNumberAndWireType 1558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual((1, wire_format.WIRETYPE_VARINT), ReadTag()) 1559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, d.ReadInt32()) 1560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual((2, wire_format.WIRETYPE_VARINT), ReadTag()) 1561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, d.ReadInt64()) 1562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual((3, wire_format.WIRETYPE_VARINT), ReadTag()) 1563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, d.ReadUInt32()) 1564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual((4, wire_format.WIRETYPE_VARINT), ReadTag()) 1565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(4, d.ReadUInt64()) 1566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual((5, wire_format.WIRETYPE_VARINT), ReadTag()) 1567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(5, d.ReadSInt32()) 1568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testCanonicalSerializationOrderSameAsCpp(self): 1570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Copy of the same test we use for C++. 1571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestFieldOrderings() 1572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllFieldsAndExtensions(proto) 1573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = proto.SerializeToString() 1574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.ExpectAllFieldsAndExtensionsInOrder(serialized) 1575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testMergeFromStringWhenFieldsAlreadySet(self): 1577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto = unittest_pb2.TestAllTypes() 1578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto.repeated_string.append('foobar') 1579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto.optional_int32 = 23 1580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto.optional_nested_message.bb = 42 1581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = first_proto.SerializeToString() 1582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto = unittest_pb2.TestAllTypes() 1584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto.repeated_string.append('baz') 1585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto.optional_int32 = 100 1586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto.optional_nested_message.bb = 999 1587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto.MergeFromString(serialized) 1589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Ensure that we append to repeated fields. 1590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(['baz', 'foobar'], list(second_proto.repeated_string)) 1591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Ensure that we overwrite nonrepeatd scalars. 1592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(23, second_proto.optional_int32) 1593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Ensure that we recursively call MergeFromString() on 1594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # submessages. 1595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(42, second_proto.optional_nested_message.bb) 1596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testMessageSetWireFormat(self): 1598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_mset_pb2.TestMessageSet() 1599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension_message1 = unittest_mset_pb2.TestMessageSetExtension1 1600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension_message2 = unittest_mset_pb2.TestMessageSetExtension2 1601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension1 = extension_message1.message_set_extension 1602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension2 = extension_message2.message_set_extension 1603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[extension1].i = 123 1604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.Extensions[extension2].str = 'foo' 1605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Serialize using the MessageSet wire format (this is specified in the 1607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # .proto file). 1608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = proto.SerializeToString() 1609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raw = unittest_mset_pb2.RawMessageSet() 1611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(False, 1612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raw.DESCRIPTOR.GetOptions().message_set_wire_format) 1613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raw.MergeFromString(serialized) 1614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, len(raw.item)) 1615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1 = unittest_mset_pb2.TestMessageSetExtension1() 1617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1.MergeFromString(raw.item[0].message) 1618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(123, message1.i) 1619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message2 = unittest_mset_pb2.TestMessageSetExtension2() 1621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message2.MergeFromString(raw.item[1].message) 1622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual('foo', message2.str) 1623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Deserialize using the MessageSet wire format. 1625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_mset_pb2.TestMessageSet() 1626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.MergeFromString(serialized) 1627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(123, proto2.Extensions[extension1].i) 1628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual('foo', proto2.Extensions[extension2].str) 1629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Check byte size. 1631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(proto2.ByteSize(), len(serialized)) 1632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(proto.ByteSize(), len(serialized)) 1633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testMessageSetWireFormatUnknownExtension(self): 1635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Create a message using the message set wire format with an unknown 1636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # message. 1637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raw = unittest_mset_pb2.RawMessageSet() 1638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Add an item. 1640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville item = raw.item.add() 1641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville item.type_id = 1545008 1642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension_message1 = unittest_mset_pb2.TestMessageSetExtension1 1643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1 = unittest_mset_pb2.TestMessageSetExtension1() 1644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1.i = 12345 1645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville item.message = message1.SerializeToString() 1646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Add a second, unknown extension. 1648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville item = raw.item.add() 1649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville item.type_id = 1545009 1650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension_message1 = unittest_mset_pb2.TestMessageSetExtension1 1651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1 = unittest_mset_pb2.TestMessageSetExtension1() 1652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1.i = 12346 1653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville item.message = message1.SerializeToString() 1654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Add another unknown extension. 1656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville item = raw.item.add() 1657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville item.type_id = 1545010 1658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1 = unittest_mset_pb2.TestMessageSetExtension2() 1659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message1.str = 'foo' 1660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville item.message = message1.SerializeToString() 1661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = raw.SerializeToString() 1663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Parse message using the message set wire format. 1665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_mset_pb2.TestMessageSet() 1666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.MergeFromString(serialized) 1667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Check that the message parsed well. 1669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension_message1 = unittest_mset_pb2.TestMessageSetExtension1 1670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville extension1 = extension_message1.message_set_extension 1671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEquals(12345, proto.Extensions[extension1].i) 1672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testUnknownFields(self): 1674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 1675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllFields(proto) 1676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = proto.SerializeToString() 1678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # The empty message should be parsable with all of the fields 1680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # unknown. 1681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestEmptyMessage() 1682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Parsing this message should succeed. 1684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.MergeFromString(serialized) 1685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Now test with a int64 field set. 1687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 1688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_int64 = 0x0fffffffffffffff 1689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = proto.SerializeToString() 1690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # The empty message should be parsable with all of the fields 1691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # unknown. 1692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestEmptyMessage() 1693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Parsing this message should succeed. 1694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.MergeFromString(serialized) 1695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def _CheckRaises(self, exc_class, callable_obj, exception): 1697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """This method checks if the excpetion type and message are as expected.""" 1698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville try: 1699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville callable_obj() 1700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville except exc_class, ex: 1701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Check if the exception message is the right one. 1702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(exception, str(ex)) 1703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return 1704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else: 1705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville raise self.failureException('%s not raised' % str(exc_class)) 1706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSerializeUninitialized(self): 1708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestRequired() 1709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self._CheckRaises( 1710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.EncodeError, 1711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.SerializeToString, 1712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'Required field protobuf_unittest.TestRequired.a is not set.') 1713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Shouldn't raise exceptions. 1714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville partial = proto.SerializePartialToString() 1715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.a = 1 1717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self._CheckRaises( 1718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.EncodeError, 1719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.SerializeToString, 1720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'Required field protobuf_unittest.TestRequired.b is not set.') 1721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Shouldn't raise exceptions. 1722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville partial = proto.SerializePartialToString() 1723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.b = 2 1725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self._CheckRaises( 1726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.EncodeError, 1727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.SerializeToString, 1728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'Required field protobuf_unittest.TestRequired.c is not set.') 1729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Shouldn't raise exceptions. 1730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville partial = proto.SerializePartialToString() 1731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.c = 3 1733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = proto.SerializeToString() 1734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Shouldn't raise exceptions. 1735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville partial = proto.SerializePartialToString() 1736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2 = unittest_pb2.TestRequired() 1738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.MergeFromString(serialized) 1739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto2.a) 1740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, proto2.b) 1741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, proto2.c) 1742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto2.ParseFromString(partial) 1743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto2.a) 1744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, proto2.b) 1745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, proto2.c) 1746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSerializeAllPackedFields(self): 1748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto = unittest_pb2.TestPackedTypes() 1749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto = unittest_pb2.TestPackedTypes() 1750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllPackedFields(first_proto) 1751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = first_proto.SerializeToString() 1752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto.ByteSize(), len(serialized)) 1753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bytes_read = second_proto.MergeFromString(serialized) 1754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(second_proto.ByteSize(), bytes_read) 1755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto, second_proto) 1756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testSerializeAllPackedExtensions(self): 1758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto = unittest_pb2.TestPackedExtensions() 1759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto = unittest_pb2.TestPackedExtensions() 1760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_util.SetAllPackedExtensions(first_proto) 1761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = first_proto.SerializeToString() 1762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville bytes_read = second_proto.MergeFromString(serialized) 1763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(second_proto.ByteSize(), bytes_read) 1764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(first_proto, second_proto) 1765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testMergePackedFromStringWhenSomeFieldsAlreadySet(self): 1767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto = unittest_pb2.TestPackedTypes() 1768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto.packed_int32.extend([1, 2]) 1769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville first_proto.packed_double.append(3.0) 1770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = first_proto.SerializeToString() 1771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto = unittest_pb2.TestPackedTypes() 1773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto.packed_int32.append(3) 1774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto.packed_double.extend([1.0, 2.0]) 1775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto.packed_sint32.append(4) 1776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville second_proto.MergeFromString(serialized) 1778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([3, 1, 2], second_proto.packed_int32) 1779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([1.0, 2.0, 3.0], second_proto.packed_double) 1780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([4], second_proto.packed_sint32) 1781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testPackedFieldsWireFormat(self): 1783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestPackedTypes() 1784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.packed_int32.extend([1, 2, 150, 3]) # 1 + 1 + 2 + 1 bytes 1785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.packed_double.extend([1.0, 1000.0]) # 8 + 8 bytes 1786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.packed_float.append(2.0) # 4 bytes, will be before double 1787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville serialized = proto.SerializeToString() 1788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(proto.ByteSize(), len(serialized)) 1789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville d = decoder.Decoder(serialized) 1790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ReadTag = d.ReadFieldNumberAndWireType 1791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual((90, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag()) 1792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1+1+1+2, d.ReadInt32()) 1793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, d.ReadInt32()) 1794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, d.ReadInt32()) 1795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(150, d.ReadInt32()) 1796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, d.ReadInt32()) 1797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual((100, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag()) 1798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(4, d.ReadInt32()) 1799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2.0, d.ReadFloat()) 1800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual((101, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag()) 1801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(8+8, d.ReadInt32()) 1802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1.0, d.ReadDouble()) 1803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1000.0, d.ReadDouble()) 1804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(d.EndOfStream()) 1805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testFieldNumbers(self): 1807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 1808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1) 1809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1) 1810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16) 1811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 1812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18) 1813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 1814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21) 1815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31) 1816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46) 1817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 1818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48) 1819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 1820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51) 1821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testExtensionFieldNumbers(self): 1823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestRequired.single.number, 1000) 1824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestRequired.SINGLE_FIELD_NUMBER, 1000) 1825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestRequired.multi.number, 1001) 1826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestRequired.MULTI_FIELD_NUMBER, 1001) 1827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.optional_int32_extension.number, 1) 1828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1) 1829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.optionalgroup_extension.number, 16) 1830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16) 1831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.optional_nested_message_extension.number, 18) 1832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 1833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18) 1834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.optional_nested_enum_extension.number, 21) 1835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 1836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 21) 1837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.repeated_int32_extension.number, 31) 1838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31) 1839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.repeatedgroup_extension.number, 46) 1840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46) 1841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.repeated_nested_message_extension.number, 48) 1842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 1843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48) 1844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.repeated_nested_enum_extension.number, 51) 1845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 1846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 51) 1847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testInitKwargs(self): 1849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes( 1850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville optional_int32=1, 1851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville optional_string='foo', 1852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville optional_bool=True, 1853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville optional_bytes='bar', 1854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville optional_nested_message=unittest_pb2.TestAllTypes.NestedMessage(bb=1), 1855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville optional_foreign_message=unittest_pb2.ForeignMessage(c=1), 1856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville optional_nested_enum=unittest_pb2.TestAllTypes.FOO, 1857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville optional_foreign_enum=unittest_pb2.FOREIGN_FOO, 1858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville repeated_int32=[1, 2, 3]) 1859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.IsInitialized()) 1860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('optional_int32')) 1861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('optional_string')) 1862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('optional_bool')) 1863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('optional_bytes')) 1864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('optional_nested_message')) 1865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('optional_foreign_message')) 1866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('optional_nested_enum')) 1867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('optional_foreign_enum')) 1868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto.optional_int32) 1869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual('foo', proto.optional_string) 1870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(True, proto.optional_bool) 1871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual('bar', proto.optional_bytes) 1872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto.optional_nested_message.bb) 1873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto.optional_foreign_message.c) 1874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestAllTypes.FOO, 1875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_nested_enum) 1876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.FOREIGN_FOO, proto.optional_foreign_enum) 1877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([1, 2, 3], proto.repeated_int32) 1878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testInitArgsUnknownFieldName(self): 1880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def InitalizeEmptyMessageWithExtraKeywordArg(): 1881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unused_proto = unittest_pb2.TestEmptyMessage(unknown='unknown') 1882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self._CheckRaises(ValueError, 1883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville InitalizeEmptyMessageWithExtraKeywordArg, 1884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'Protocol message has no "unknown" field.') 1885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testInitRequiredKwargs(self): 1887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestRequired(a=1, b=1, c=1) 1888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.IsInitialized()) 1889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('a')) 1890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('b')) 1891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('c')) 1892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.HasField('dummy2')) 1893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto.a) 1894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto.b) 1895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto.c) 1896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testInitRequiredForeignKwargs(self): 1898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestRequiredForeign( 1899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville optional_message=unittest_pb2.TestRequired(a=1, b=1, c=1)) 1900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.IsInitialized()) 1901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.HasField('optional_message')) 1902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.optional_message.IsInitialized()) 1903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.optional_message.HasField('a')) 1904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.optional_message.HasField('b')) 1905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.optional_message.HasField('c')) 1906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not proto.optional_message.HasField('dummy2')) 1907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestRequired(a=1, b=1, c=1), 1908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_message) 1909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto.optional_message.a) 1910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto.optional_message.b) 1911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto.optional_message.c) 1912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testInitRepeatedKwargs(self): 1914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes(repeated_int32=[1, 2, 3]) 1915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.IsInitialized()) 1916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto.repeated_int32[0]) 1917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, proto.repeated_int32[1]) 1918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, proto.repeated_int32[2]) 1919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass OptionsTest(unittest.TestCase): 1922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testMessageOptions(self): 1924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_mset_pb2.TestMessageSet() 1925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(True, 1926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.DESCRIPTOR.GetOptions().message_set_wire_format) 1927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 1928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(False, 1929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.DESCRIPTOR.GetOptions().message_set_wire_format) 1930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testPackedOptions(self): 1932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 1933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_int32 = 1 1934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.optional_double = 3.0 1935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for field_descriptor, _ in proto.ListFields(): 1936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(False, field_descriptor.GetOptions().packed) 1937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestPackedTypes() 1939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.packed_int32.append(1) 1940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.packed_double.append(3.0) 1941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for field_descriptor, _ in proto.ListFields(): 1942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(True, field_descriptor.GetOptions().packed) 1943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(reflection._FieldDescriptor.LABEL_REPEATED, 1944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_descriptor.label) 1945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass UtilityTest(unittest.TestCase): 1948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testImergeSorted(self): 1950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ImergeSorted = reflection._ImergeSorted 1951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Various types of emptiness. 1952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([], list(ImergeSorted())) 1953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([], list(ImergeSorted([]))) 1954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([], list(ImergeSorted([], []))) 1955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # One nonempty list. 1957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([1, 2, 3], list(ImergeSorted([1, 2, 3]))) 1958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([1, 2, 3], list(ImergeSorted([1, 2, 3], []))) 1959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([1, 2, 3], list(ImergeSorted([], [1, 2, 3]))) 1960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Merging some nonempty lists together. 1962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([1, 2, 3], list(ImergeSorted([1, 3], [2]))) 1963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([1, 2, 3], list(ImergeSorted([1], [3], [2]))) 1964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([1, 2, 3], list(ImergeSorted([1], [3], [2], []))) 1965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Elements repeated across component iterators. 1967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([1, 2, 2, 3, 3], 1968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville list(ImergeSorted([1, 2], [3], [2, 3]))) 1969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Elements repeated within an iterator. 1971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual([1, 2, 2, 3, 3], 1972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville list(ImergeSorted([1, 2, 2], [3], [3]))) 1973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif __name__ == '__main__': 1976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest.main() 1977