1 #! /usr/bin/python 2 # -*- coding: utf-8 -*- 3 # 4 # Protocol Buffers - Google's data interchange format 5 # Copyright 2008 Google Inc. All rights reserved. 6 # http://code.google.com/p/protobuf/ 7 # 8 # Redistribution and use in source and binary forms, with or without 9 # modification, are permitted provided that the following conditions are 10 # met: 11 # 12 # * Redistributions of source code must retain the above copyright 13 # notice, this list of conditions and the following disclaimer. 14 # * Redistributions in binary form must reproduce the above 15 # copyright notice, this list of conditions and the following disclaimer 16 # in the documentation and/or other materials provided with the 17 # distribution. 18 # * Neither the name of Google Inc. nor the names of its 19 # contributors may be used to endorse or promote products derived from 20 # this software without specific prior written permission. 21 # 22 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 25 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 26 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 28 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 32 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 34 """Unittest for reflection.py, which also indirectly tests the output of the 35 pure-Python protocol compiler. 36 """ 37 38 __author__ = 'robinson (at] google.com (Will Robinson)' 39 40 import gc 41 import operator 42 import struct 43 44 import unittest 45 from google.protobuf import unittest_import_pb2 46 from google.protobuf import unittest_mset_pb2 47 from google.protobuf import unittest_pb2 48 from google.protobuf import descriptor_pb2 49 from google.protobuf import descriptor 50 from google.protobuf import message 51 from google.protobuf import reflection 52 from google.protobuf.internal import api_implementation 53 from google.protobuf.internal import more_extensions_pb2 54 from google.protobuf.internal import more_messages_pb2 55 from google.protobuf.internal import wire_format 56 from google.protobuf.internal import test_util 57 from google.protobuf.internal import decoder 58 59 60 class _MiniDecoder(object): 61 """Decodes a stream of values from a string. 62 63 Once upon a time we actually had a class called decoder.Decoder. Then we 64 got rid of it during a redesign that made decoding much, much faster overall. 65 But a couple tests in this file used it to check that the serialized form of 66 a message was correct. So, this class implements just the methods that were 67 used by said tests, so that we don't have to rewrite the tests. 68 """ 69 70 def __init__(self, bytes): 71 self._bytes = bytes 72 self._pos = 0 73 74 def ReadVarint(self): 75 result, self._pos = decoder._DecodeVarint(self._bytes, self._pos) 76 return result 77 78 ReadInt32 = ReadVarint 79 ReadInt64 = ReadVarint 80 ReadUInt32 = ReadVarint 81 ReadUInt64 = ReadVarint 82 83 def ReadSInt64(self): 84 return wire_format.ZigZagDecode(self.ReadVarint()) 85 86 ReadSInt32 = ReadSInt64 87 88 def ReadFieldNumberAndWireType(self): 89 return wire_format.UnpackTag(self.ReadVarint()) 90 91 def ReadFloat(self): 92 result = struct.unpack("<f", self._bytes[self._pos:self._pos+4])[0] 93 self._pos += 4 94 return result 95 96 def ReadDouble(self): 97 result = struct.unpack("<d", self._bytes[self._pos:self._pos+8])[0] 98 self._pos += 8 99 return result 100 101 def EndOfStream(self): 102 return self._pos == len(self._bytes) 103 104 105 class ReflectionTest(unittest.TestCase): 106 107 def assertListsEqual(self, values, others): 108 self.assertEqual(len(values), len(others)) 109 for i in range(len(values)): 110 self.assertEqual(values[i], others[i]) 111 112 def testScalarConstructor(self): 113 # Constructor with only scalar types should succeed. 114 proto = unittest_pb2.TestAllTypes( 115 optional_int32=24, 116 optional_double=54.321, 117 optional_string='optional_string') 118 119 self.assertEqual(24, proto.optional_int32) 120 self.assertEqual(54.321, proto.optional_double) 121 self.assertEqual('optional_string', proto.optional_string) 122 123 def testRepeatedScalarConstructor(self): 124 # Constructor with only repeated scalar types should succeed. 125 proto = unittest_pb2.TestAllTypes( 126 repeated_int32=[1, 2, 3, 4], 127 repeated_double=[1.23, 54.321], 128 repeated_bool=[True, False, False], 129 repeated_string=["optional_string"]) 130 131 self.assertEquals([1, 2, 3, 4], list(proto.repeated_int32)) 132 self.assertEquals([1.23, 54.321], list(proto.repeated_double)) 133 self.assertEquals([True, False, False], list(proto.repeated_bool)) 134 self.assertEquals(["optional_string"], list(proto.repeated_string)) 135 136 def testRepeatedCompositeConstructor(self): 137 # Constructor with only repeated composite types should succeed. 138 proto = unittest_pb2.TestAllTypes( 139 repeated_nested_message=[ 140 unittest_pb2.TestAllTypes.NestedMessage( 141 bb=unittest_pb2.TestAllTypes.FOO), 142 unittest_pb2.TestAllTypes.NestedMessage( 143 bb=unittest_pb2.TestAllTypes.BAR)], 144 repeated_foreign_message=[ 145 unittest_pb2.ForeignMessage(c=-43), 146 unittest_pb2.ForeignMessage(c=45324), 147 unittest_pb2.ForeignMessage(c=12)], 148 repeatedgroup=[ 149 unittest_pb2.TestAllTypes.RepeatedGroup(), 150 unittest_pb2.TestAllTypes.RepeatedGroup(a=1), 151 unittest_pb2.TestAllTypes.RepeatedGroup(a=2)]) 152 153 self.assertEquals( 154 [unittest_pb2.TestAllTypes.NestedMessage( 155 bb=unittest_pb2.TestAllTypes.FOO), 156 unittest_pb2.TestAllTypes.NestedMessage( 157 bb=unittest_pb2.TestAllTypes.BAR)], 158 list(proto.repeated_nested_message)) 159 self.assertEquals( 160 [unittest_pb2.ForeignMessage(c=-43), 161 unittest_pb2.ForeignMessage(c=45324), 162 unittest_pb2.ForeignMessage(c=12)], 163 list(proto.repeated_foreign_message)) 164 self.assertEquals( 165 [unittest_pb2.TestAllTypes.RepeatedGroup(), 166 unittest_pb2.TestAllTypes.RepeatedGroup(a=1), 167 unittest_pb2.TestAllTypes.RepeatedGroup(a=2)], 168 list(proto.repeatedgroup)) 169 170 def testMixedConstructor(self): 171 # Constructor with only mixed types should succeed. 172 proto = unittest_pb2.TestAllTypes( 173 optional_int32=24, 174 optional_string='optional_string', 175 repeated_double=[1.23, 54.321], 176 repeated_bool=[True, False, False], 177 repeated_nested_message=[ 178 unittest_pb2.TestAllTypes.NestedMessage( 179 bb=unittest_pb2.TestAllTypes.FOO), 180 unittest_pb2.TestAllTypes.NestedMessage( 181 bb=unittest_pb2.TestAllTypes.BAR)], 182 repeated_foreign_message=[ 183 unittest_pb2.ForeignMessage(c=-43), 184 unittest_pb2.ForeignMessage(c=45324), 185 unittest_pb2.ForeignMessage(c=12)]) 186 187 self.assertEqual(24, proto.optional_int32) 188 self.assertEqual('optional_string', proto.optional_string) 189 self.assertEquals([1.23, 54.321], list(proto.repeated_double)) 190 self.assertEquals([True, False, False], list(proto.repeated_bool)) 191 self.assertEquals( 192 [unittest_pb2.TestAllTypes.NestedMessage( 193 bb=unittest_pb2.TestAllTypes.FOO), 194 unittest_pb2.TestAllTypes.NestedMessage( 195 bb=unittest_pb2.TestAllTypes.BAR)], 196 list(proto.repeated_nested_message)) 197 self.assertEquals( 198 [unittest_pb2.ForeignMessage(c=-43), 199 unittest_pb2.ForeignMessage(c=45324), 200 unittest_pb2.ForeignMessage(c=12)], 201 list(proto.repeated_foreign_message)) 202 203 def testConstructorTypeError(self): 204 self.assertRaises( 205 TypeError, unittest_pb2.TestAllTypes, optional_int32="foo") 206 self.assertRaises( 207 TypeError, unittest_pb2.TestAllTypes, optional_string=1234) 208 self.assertRaises( 209 TypeError, unittest_pb2.TestAllTypes, optional_nested_message=1234) 210 self.assertRaises( 211 TypeError, unittest_pb2.TestAllTypes, repeated_int32=1234) 212 self.assertRaises( 213 TypeError, unittest_pb2.TestAllTypes, repeated_int32=["foo"]) 214 self.assertRaises( 215 TypeError, unittest_pb2.TestAllTypes, repeated_string=1234) 216 self.assertRaises( 217 TypeError, unittest_pb2.TestAllTypes, repeated_string=[1234]) 218 self.assertRaises( 219 TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=1234) 220 self.assertRaises( 221 TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=[1234]) 222 223 def testConstructorInvalidatesCachedByteSize(self): 224 message = unittest_pb2.TestAllTypes(optional_int32 = 12) 225 self.assertEquals(2, message.ByteSize()) 226 227 message = unittest_pb2.TestAllTypes( 228 optional_nested_message = unittest_pb2.TestAllTypes.NestedMessage()) 229 self.assertEquals(3, message.ByteSize()) 230 231 message = unittest_pb2.TestAllTypes(repeated_int32 = [12]) 232 self.assertEquals(3, message.ByteSize()) 233 234 message = unittest_pb2.TestAllTypes( 235 repeated_nested_message = [unittest_pb2.TestAllTypes.NestedMessage()]) 236 self.assertEquals(3, message.ByteSize()) 237 238 def testSimpleHasBits(self): 239 # Test a scalar. 240 proto = unittest_pb2.TestAllTypes() 241 self.assertTrue(not proto.HasField('optional_int32')) 242 self.assertEqual(0, proto.optional_int32) 243 # HasField() shouldn't be true if all we've done is 244 # read the default value. 245 self.assertTrue(not proto.HasField('optional_int32')) 246 proto.optional_int32 = 1 247 # Setting a value however *should* set the "has" bit. 248 self.assertTrue(proto.HasField('optional_int32')) 249 proto.ClearField('optional_int32') 250 # And clearing that value should unset the "has" bit. 251 self.assertTrue(not proto.HasField('optional_int32')) 252 253 def testHasBitsWithSinglyNestedScalar(self): 254 # Helper used to test foreign messages and groups. 255 # 256 # composite_field_name should be the name of a non-repeated 257 # composite (i.e., foreign or group) field in TestAllTypes, 258 # and scalar_field_name should be the name of an integer-valued 259 # scalar field within that composite. 260 # 261 # I never thought I'd miss C++ macros and templates so much. :( 262 # This helper is semantically just: 263 # 264 # assert proto.composite_field.scalar_field == 0 265 # assert not proto.composite_field.HasField('scalar_field') 266 # assert not proto.HasField('composite_field') 267 # 268 # proto.composite_field.scalar_field = 10 269 # old_composite_field = proto.composite_field 270 # 271 # assert proto.composite_field.scalar_field == 10 272 # assert proto.composite_field.HasField('scalar_field') 273 # assert proto.HasField('composite_field') 274 # 275 # proto.ClearField('composite_field') 276 # 277 # assert not proto.composite_field.HasField('scalar_field') 278 # assert not proto.HasField('composite_field') 279 # assert proto.composite_field.scalar_field == 0 280 # 281 # # Now ensure that ClearField('composite_field') disconnected 282 # # the old field object from the object tree... 283 # assert old_composite_field is not proto.composite_field 284 # old_composite_field.scalar_field = 20 285 # assert not proto.composite_field.HasField('scalar_field') 286 # assert not proto.HasField('composite_field') 287 def TestCompositeHasBits(composite_field_name, scalar_field_name): 288 proto = unittest_pb2.TestAllTypes() 289 # First, check that we can get the scalar value, and see that it's the 290 # default (0), but that proto.HasField('omposite') and 291 # proto.composite.HasField('scalar') will still return False. 292 composite_field = getattr(proto, composite_field_name) 293 original_scalar_value = getattr(composite_field, scalar_field_name) 294 self.assertEqual(0, original_scalar_value) 295 # Assert that the composite object does not "have" the scalar. 296 self.assertTrue(not composite_field.HasField(scalar_field_name)) 297 # Assert that proto does not "have" the composite field. 298 self.assertTrue(not proto.HasField(composite_field_name)) 299 300 # Now set the scalar within the composite field. Ensure that the setting 301 # is reflected, and that proto.HasField('composite') and 302 # proto.composite.HasField('scalar') now both return True. 303 new_val = 20 304 setattr(composite_field, scalar_field_name, new_val) 305 self.assertEqual(new_val, getattr(composite_field, scalar_field_name)) 306 # Hold on to a reference to the current composite_field object. 307 old_composite_field = composite_field 308 # Assert that the has methods now return true. 309 self.assertTrue(composite_field.HasField(scalar_field_name)) 310 self.assertTrue(proto.HasField(composite_field_name)) 311 312 # Now call the clear method... 313 proto.ClearField(composite_field_name) 314 315 # ...and ensure that the "has" bits are all back to False... 316 composite_field = getattr(proto, composite_field_name) 317 self.assertTrue(not composite_field.HasField(scalar_field_name)) 318 self.assertTrue(not proto.HasField(composite_field_name)) 319 # ...and ensure that the scalar field has returned to its default. 320 self.assertEqual(0, getattr(composite_field, scalar_field_name)) 321 322 self.assertTrue(old_composite_field is not composite_field) 323 setattr(old_composite_field, scalar_field_name, new_val) 324 self.assertTrue(not composite_field.HasField(scalar_field_name)) 325 self.assertTrue(not proto.HasField(composite_field_name)) 326 self.assertEqual(0, getattr(composite_field, scalar_field_name)) 327 328 # Test simple, single-level nesting when we set a scalar. 329 TestCompositeHasBits('optionalgroup', 'a') 330 TestCompositeHasBits('optional_nested_message', 'bb') 331 TestCompositeHasBits('optional_foreign_message', 'c') 332 TestCompositeHasBits('optional_import_message', 'd') 333 334 def testReferencesToNestedMessage(self): 335 proto = unittest_pb2.TestAllTypes() 336 nested = proto.optional_nested_message 337 del proto 338 # A previous version had a bug where this would raise an exception when 339 # hitting a now-dead weak reference. 340 nested.bb = 23 341 342 def testDisconnectingNestedMessageBeforeSettingField(self): 343 proto = unittest_pb2.TestAllTypes() 344 nested = proto.optional_nested_message 345 proto.ClearField('optional_nested_message') # Should disconnect from parent 346 self.assertTrue(nested is not proto.optional_nested_message) 347 nested.bb = 23 348 self.assertTrue(not proto.HasField('optional_nested_message')) 349 self.assertEqual(0, proto.optional_nested_message.bb) 350 351 def testGetDefaultMessageAfterDisconnectingDefaultMessage(self): 352 proto = unittest_pb2.TestAllTypes() 353 nested = proto.optional_nested_message 354 proto.ClearField('optional_nested_message') 355 del proto 356 del nested 357 # Force a garbage collect so that the underlying CMessages are freed along 358 # with the Messages they point to. This is to make sure we're not deleting 359 # default message instances. 360 gc.collect() 361 proto = unittest_pb2.TestAllTypes() 362 nested = proto.optional_nested_message 363 364 def testDisconnectingNestedMessageAfterSettingField(self): 365 proto = unittest_pb2.TestAllTypes() 366 nested = proto.optional_nested_message 367 nested.bb = 5 368 self.assertTrue(proto.HasField('optional_nested_message')) 369 proto.ClearField('optional_nested_message') # Should disconnect from parent 370 self.assertEqual(5, nested.bb) 371 self.assertEqual(0, proto.optional_nested_message.bb) 372 self.assertTrue(nested is not proto.optional_nested_message) 373 nested.bb = 23 374 self.assertTrue(not proto.HasField('optional_nested_message')) 375 self.assertEqual(0, proto.optional_nested_message.bb) 376 377 def testDisconnectingNestedMessageBeforeGettingField(self): 378 proto = unittest_pb2.TestAllTypes() 379 self.assertTrue(not proto.HasField('optional_nested_message')) 380 proto.ClearField('optional_nested_message') 381 self.assertTrue(not proto.HasField('optional_nested_message')) 382 383 def testDisconnectingNestedMessageAfterMerge(self): 384 # This test exercises the code path that does not use ReleaseMessage(). 385 # The underlying fear is that if we use ReleaseMessage() incorrectly, 386 # we will have memory leaks. It's hard to check that that doesn't happen, 387 # but at least we can exercise that code path to make sure it works. 388 proto1 = unittest_pb2.TestAllTypes() 389 proto2 = unittest_pb2.TestAllTypes() 390 proto2.optional_nested_message.bb = 5 391 proto1.MergeFrom(proto2) 392 self.assertTrue(proto1.HasField('optional_nested_message')) 393 proto1.ClearField('optional_nested_message') 394 self.assertTrue(not proto1.HasField('optional_nested_message')) 395 396 def testDisconnectingLazyNestedMessage(self): 397 # This test exercises releasing a nested message that is lazy. This test 398 # only exercises real code in the C++ implementation as Python does not 399 # support lazy parsing, but the current C++ implementation results in 400 # memory corruption and a crash. 401 if api_implementation.Type() != 'python': 402 return 403 proto = unittest_pb2.TestAllTypes() 404 proto.optional_lazy_message.bb = 5 405 proto.ClearField('optional_lazy_message') 406 del proto 407 gc.collect() 408 409 def testHasBitsWhenModifyingRepeatedFields(self): 410 # Test nesting when we add an element to a repeated field in a submessage. 411 proto = unittest_pb2.TestNestedMessageHasBits() 412 proto.optional_nested_message.nestedmessage_repeated_int32.append(5) 413 self.assertEqual( 414 [5], proto.optional_nested_message.nestedmessage_repeated_int32) 415 self.assertTrue(proto.HasField('optional_nested_message')) 416 417 # Do the same test, but with a repeated composite field within the 418 # submessage. 419 proto.ClearField('optional_nested_message') 420 self.assertTrue(not proto.HasField('optional_nested_message')) 421 proto.optional_nested_message.nestedmessage_repeated_foreignmessage.add() 422 self.assertTrue(proto.HasField('optional_nested_message')) 423 424 def testHasBitsForManyLevelsOfNesting(self): 425 # Test nesting many levels deep. 426 recursive_proto = unittest_pb2.TestMutualRecursionA() 427 self.assertTrue(not recursive_proto.HasField('bb')) 428 self.assertEqual(0, recursive_proto.bb.a.bb.a.bb.optional_int32) 429 self.assertTrue(not recursive_proto.HasField('bb')) 430 recursive_proto.bb.a.bb.a.bb.optional_int32 = 5 431 self.assertEqual(5, recursive_proto.bb.a.bb.a.bb.optional_int32) 432 self.assertTrue(recursive_proto.HasField('bb')) 433 self.assertTrue(recursive_proto.bb.HasField('a')) 434 self.assertTrue(recursive_proto.bb.a.HasField('bb')) 435 self.assertTrue(recursive_proto.bb.a.bb.HasField('a')) 436 self.assertTrue(recursive_proto.bb.a.bb.a.HasField('bb')) 437 self.assertTrue(not recursive_proto.bb.a.bb.a.bb.HasField('a')) 438 self.assertTrue(recursive_proto.bb.a.bb.a.bb.HasField('optional_int32')) 439 440 def testSingularListFields(self): 441 proto = unittest_pb2.TestAllTypes() 442 proto.optional_fixed32 = 1 443 proto.optional_int32 = 5 444 proto.optional_string = 'foo' 445 # Access sub-message but don't set it yet. 446 nested_message = proto.optional_nested_message 447 self.assertEqual( 448 [ (proto.DESCRIPTOR.fields_by_name['optional_int32' ], 5), 449 (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1), 450 (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo') ], 451 proto.ListFields()) 452 453 proto.optional_nested_message.bb = 123 454 self.assertEqual( 455 [ (proto.DESCRIPTOR.fields_by_name['optional_int32' ], 5), 456 (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1), 457 (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo'), 458 (proto.DESCRIPTOR.fields_by_name['optional_nested_message' ], 459 nested_message) ], 460 proto.ListFields()) 461 462 def testRepeatedListFields(self): 463 proto = unittest_pb2.TestAllTypes() 464 proto.repeated_fixed32.append(1) 465 proto.repeated_int32.append(5) 466 proto.repeated_int32.append(11) 467 proto.repeated_string.extend(['foo', 'bar']) 468 proto.repeated_string.extend([]) 469 proto.repeated_string.append('baz') 470 proto.repeated_string.extend(str(x) for x in xrange(2)) 471 proto.optional_int32 = 21 472 proto.repeated_bool # Access but don't set anything; should not be listed. 473 self.assertEqual( 474 [ (proto.DESCRIPTOR.fields_by_name['optional_int32' ], 21), 475 (proto.DESCRIPTOR.fields_by_name['repeated_int32' ], [5, 11]), 476 (proto.DESCRIPTOR.fields_by_name['repeated_fixed32'], [1]), 477 (proto.DESCRIPTOR.fields_by_name['repeated_string' ], 478 ['foo', 'bar', 'baz', '0', '1']) ], 479 proto.ListFields()) 480 481 def testSingularListExtensions(self): 482 proto = unittest_pb2.TestAllExtensions() 483 proto.Extensions[unittest_pb2.optional_fixed32_extension] = 1 484 proto.Extensions[unittest_pb2.optional_int32_extension ] = 5 485 proto.Extensions[unittest_pb2.optional_string_extension ] = 'foo' 486 self.assertEqual( 487 [ (unittest_pb2.optional_int32_extension , 5), 488 (unittest_pb2.optional_fixed32_extension, 1), 489 (unittest_pb2.optional_string_extension , 'foo') ], 490 proto.ListFields()) 491 492 def testRepeatedListExtensions(self): 493 proto = unittest_pb2.TestAllExtensions() 494 proto.Extensions[unittest_pb2.repeated_fixed32_extension].append(1) 495 proto.Extensions[unittest_pb2.repeated_int32_extension ].append(5) 496 proto.Extensions[unittest_pb2.repeated_int32_extension ].append(11) 497 proto.Extensions[unittest_pb2.repeated_string_extension ].append('foo') 498 proto.Extensions[unittest_pb2.repeated_string_extension ].append('bar') 499 proto.Extensions[unittest_pb2.repeated_string_extension ].append('baz') 500 proto.Extensions[unittest_pb2.optional_int32_extension ] = 21 501 self.assertEqual( 502 [ (unittest_pb2.optional_int32_extension , 21), 503 (unittest_pb2.repeated_int32_extension , [5, 11]), 504 (unittest_pb2.repeated_fixed32_extension, [1]), 505 (unittest_pb2.repeated_string_extension , ['foo', 'bar', 'baz']) ], 506 proto.ListFields()) 507 508 def testListFieldsAndExtensions(self): 509 proto = unittest_pb2.TestFieldOrderings() 510 test_util.SetAllFieldsAndExtensions(proto) 511 unittest_pb2.my_extension_int 512 self.assertEqual( 513 [ (proto.DESCRIPTOR.fields_by_name['my_int' ], 1), 514 (unittest_pb2.my_extension_int , 23), 515 (proto.DESCRIPTOR.fields_by_name['my_string'], 'foo'), 516 (unittest_pb2.my_extension_string , 'bar'), 517 (proto.DESCRIPTOR.fields_by_name['my_float' ], 1.0) ], 518 proto.ListFields()) 519 520 def testDefaultValues(self): 521 proto = unittest_pb2.TestAllTypes() 522 self.assertEqual(0, proto.optional_int32) 523 self.assertEqual(0, proto.optional_int64) 524 self.assertEqual(0, proto.optional_uint32) 525 self.assertEqual(0, proto.optional_uint64) 526 self.assertEqual(0, proto.optional_sint32) 527 self.assertEqual(0, proto.optional_sint64) 528 self.assertEqual(0, proto.optional_fixed32) 529 self.assertEqual(0, proto.optional_fixed64) 530 self.assertEqual(0, proto.optional_sfixed32) 531 self.assertEqual(0, proto.optional_sfixed64) 532 self.assertEqual(0.0, proto.optional_float) 533 self.assertEqual(0.0, proto.optional_double) 534 self.assertEqual(False, proto.optional_bool) 535 self.assertEqual('', proto.optional_string) 536 self.assertEqual('', proto.optional_bytes) 537 538 self.assertEqual(41, proto.default_int32) 539 self.assertEqual(42, proto.default_int64) 540 self.assertEqual(43, proto.default_uint32) 541 self.assertEqual(44, proto.default_uint64) 542 self.assertEqual(-45, proto.default_sint32) 543 self.assertEqual(46, proto.default_sint64) 544 self.assertEqual(47, proto.default_fixed32) 545 self.assertEqual(48, proto.default_fixed64) 546 self.assertEqual(49, proto.default_sfixed32) 547 self.assertEqual(-50, proto.default_sfixed64) 548 self.assertEqual(51.5, proto.default_float) 549 self.assertEqual(52e3, proto.default_double) 550 self.assertEqual(True, proto.default_bool) 551 self.assertEqual('hello', proto.default_string) 552 self.assertEqual('world', proto.default_bytes) 553 self.assertEqual(unittest_pb2.TestAllTypes.BAR, proto.default_nested_enum) 554 self.assertEqual(unittest_pb2.FOREIGN_BAR, proto.default_foreign_enum) 555 self.assertEqual(unittest_import_pb2.IMPORT_BAR, 556 proto.default_import_enum) 557 558 proto = unittest_pb2.TestExtremeDefaultValues() 559 self.assertEqual(u'\u1234', proto.utf8_string) 560 561 def testHasFieldWithUnknownFieldName(self): 562 proto = unittest_pb2.TestAllTypes() 563 self.assertRaises(ValueError, proto.HasField, 'nonexistent_field') 564 565 def testClearFieldWithUnknownFieldName(self): 566 proto = unittest_pb2.TestAllTypes() 567 self.assertRaises(ValueError, proto.ClearField, 'nonexistent_field') 568 569 def testDisallowedAssignments(self): 570 # It's illegal to assign values directly to repeated fields 571 # or to nonrepeated composite fields. Ensure that this fails. 572 proto = unittest_pb2.TestAllTypes() 573 # Repeated fields. 574 self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', 10) 575 # Lists shouldn't work, either. 576 self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', [10]) 577 # Composite fields. 578 self.assertRaises(AttributeError, setattr, proto, 579 'optional_nested_message', 23) 580 # Assignment to a repeated nested message field without specifying 581 # the index in the array of nested messages. 582 self.assertRaises(AttributeError, setattr, proto.repeated_nested_message, 583 'bb', 34) 584 # Assignment to an attribute of a repeated field. 585 self.assertRaises(AttributeError, setattr, proto.repeated_float, 586 'some_attribute', 34) 587 # proto.nonexistent_field = 23 should fail as well. 588 self.assertRaises(AttributeError, setattr, proto, 'nonexistent_field', 23) 589 590 def testSingleScalarTypeSafety(self): 591 proto = unittest_pb2.TestAllTypes() 592 self.assertRaises(TypeError, setattr, proto, 'optional_int32', 1.1) 593 self.assertRaises(TypeError, setattr, proto, 'optional_int32', 'foo') 594 self.assertRaises(TypeError, setattr, proto, 'optional_string', 10) 595 self.assertRaises(TypeError, setattr, proto, 'optional_bytes', 10) 596 597 def testSingleScalarBoundsChecking(self): 598 def TestMinAndMaxIntegers(field_name, expected_min, expected_max): 599 pb = unittest_pb2.TestAllTypes() 600 setattr(pb, field_name, expected_min) 601 self.assertEqual(expected_min, getattr(pb, field_name)) 602 setattr(pb, field_name, expected_max) 603 self.assertEqual(expected_max, getattr(pb, field_name)) 604 self.assertRaises(ValueError, setattr, pb, field_name, expected_min - 1) 605 self.assertRaises(ValueError, setattr, pb, field_name, expected_max + 1) 606 607 TestMinAndMaxIntegers('optional_int32', -(1 << 31), (1 << 31) - 1) 608 TestMinAndMaxIntegers('optional_uint32', 0, 0xffffffff) 609 TestMinAndMaxIntegers('optional_int64', -(1 << 63), (1 << 63) - 1) 610 TestMinAndMaxIntegers('optional_uint64', 0, 0xffffffffffffffff) 611 612 pb = unittest_pb2.TestAllTypes() 613 pb.optional_nested_enum = 1 614 self.assertEqual(1, pb.optional_nested_enum) 615 616 # Invalid enum values. 617 pb.optional_nested_enum = 0 618 self.assertEqual(0, pb.optional_nested_enum) 619 620 bytes_size_before = pb.ByteSize() 621 622 pb.optional_nested_enum = 4 623 self.assertEqual(4, pb.optional_nested_enum) 624 625 pb.optional_nested_enum = 0 626 self.assertEqual(0, pb.optional_nested_enum) 627 628 # Make sure that setting the same enum field doesn't just add unknown 629 # fields (but overwrites them). 630 self.assertEqual(bytes_size_before, pb.ByteSize()) 631 632 # Is the invalid value preserved after serialization? 633 serialized = pb.SerializeToString() 634 pb2 = unittest_pb2.TestAllTypes() 635 pb2.ParseFromString(serialized) 636 self.assertEqual(0, pb2.optional_nested_enum) 637 self.assertEqual(pb, pb2) 638 639 def testRepeatedScalarTypeSafety(self): 640 proto = unittest_pb2.TestAllTypes() 641 self.assertRaises(TypeError, proto.repeated_int32.append, 1.1) 642 self.assertRaises(TypeError, proto.repeated_int32.append, 'foo') 643 self.assertRaises(TypeError, proto.repeated_string, 10) 644 self.assertRaises(TypeError, proto.repeated_bytes, 10) 645 646 proto.repeated_int32.append(10) 647 proto.repeated_int32[0] = 23 648 self.assertRaises(IndexError, proto.repeated_int32.__setitem__, 500, 23) 649 self.assertRaises(TypeError, proto.repeated_int32.__setitem__, 0, 'abc') 650 651 # Repeated enums tests. 652 #proto.repeated_nested_enum.append(0) 653 654 def testSingleScalarGettersAndSetters(self): 655 proto = unittest_pb2.TestAllTypes() 656 self.assertEqual(0, proto.optional_int32) 657 proto.optional_int32 = 1 658 self.assertEqual(1, proto.optional_int32) 659 660 proto.optional_uint64 = 0xffffffffffff 661 self.assertEqual(0xffffffffffff, proto.optional_uint64) 662 proto.optional_uint64 = 0xffffffffffffffff 663 self.assertEqual(0xffffffffffffffff, proto.optional_uint64) 664 # TODO(robinson): Test all other scalar field types. 665 666 def testSingleScalarClearField(self): 667 proto = unittest_pb2.TestAllTypes() 668 # Should be allowed to clear something that's not there (a no-op). 669 proto.ClearField('optional_int32') 670 proto.optional_int32 = 1 671 self.assertTrue(proto.HasField('optional_int32')) 672 proto.ClearField('optional_int32') 673 self.assertEqual(0, proto.optional_int32) 674 self.assertTrue(not proto.HasField('optional_int32')) 675 # TODO(robinson): Test all other scalar field types. 676 677 def testEnums(self): 678 proto = unittest_pb2.TestAllTypes() 679 self.assertEqual(1, proto.FOO) 680 self.assertEqual(1, unittest_pb2.TestAllTypes.FOO) 681 self.assertEqual(2, proto.BAR) 682 self.assertEqual(2, unittest_pb2.TestAllTypes.BAR) 683 self.assertEqual(3, proto.BAZ) 684 self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ) 685 686 def testEnum_Name(self): 687 self.assertEqual('FOREIGN_FOO', 688 unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_FOO)) 689 self.assertEqual('FOREIGN_BAR', 690 unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_BAR)) 691 self.assertEqual('FOREIGN_BAZ', 692 unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_BAZ)) 693 self.assertRaises(ValueError, 694 unittest_pb2.ForeignEnum.Name, 11312) 695 696 proto = unittest_pb2.TestAllTypes() 697 self.assertEqual('FOO', 698 proto.NestedEnum.Name(proto.FOO)) 699 self.assertEqual('FOO', 700 unittest_pb2.TestAllTypes.NestedEnum.Name(proto.FOO)) 701 self.assertEqual('BAR', 702 proto.NestedEnum.Name(proto.BAR)) 703 self.assertEqual('BAR', 704 unittest_pb2.TestAllTypes.NestedEnum.Name(proto.BAR)) 705 self.assertEqual('BAZ', 706 proto.NestedEnum.Name(proto.BAZ)) 707 self.assertEqual('BAZ', 708 unittest_pb2.TestAllTypes.NestedEnum.Name(proto.BAZ)) 709 self.assertRaises(ValueError, 710 proto.NestedEnum.Name, 11312) 711 self.assertRaises(ValueError, 712 unittest_pb2.TestAllTypes.NestedEnum.Name, 11312) 713 714 def testEnum_Value(self): 715 self.assertEqual(unittest_pb2.FOREIGN_FOO, 716 unittest_pb2.ForeignEnum.Value('FOREIGN_FOO')) 717 self.assertEqual(unittest_pb2.FOREIGN_BAR, 718 unittest_pb2.ForeignEnum.Value('FOREIGN_BAR')) 719 self.assertEqual(unittest_pb2.FOREIGN_BAZ, 720 unittest_pb2.ForeignEnum.Value('FOREIGN_BAZ')) 721 self.assertRaises(ValueError, 722 unittest_pb2.ForeignEnum.Value, 'FO') 723 724 proto = unittest_pb2.TestAllTypes() 725 self.assertEqual(proto.FOO, 726 proto.NestedEnum.Value('FOO')) 727 self.assertEqual(proto.FOO, 728 unittest_pb2.TestAllTypes.NestedEnum.Value('FOO')) 729 self.assertEqual(proto.BAR, 730 proto.NestedEnum.Value('BAR')) 731 self.assertEqual(proto.BAR, 732 unittest_pb2.TestAllTypes.NestedEnum.Value('BAR')) 733 self.assertEqual(proto.BAZ, 734 proto.NestedEnum.Value('BAZ')) 735 self.assertEqual(proto.BAZ, 736 unittest_pb2.TestAllTypes.NestedEnum.Value('BAZ')) 737 self.assertRaises(ValueError, 738 proto.NestedEnum.Value, 'Foo') 739 self.assertRaises(ValueError, 740 unittest_pb2.TestAllTypes.NestedEnum.Value, 'Foo') 741 742 def testEnum_KeysAndValues(self): 743 self.assertEqual(['FOREIGN_FOO', 'FOREIGN_BAR', 'FOREIGN_BAZ'], 744 unittest_pb2.ForeignEnum.keys()) 745 self.assertEqual([4, 5, 6], 746 unittest_pb2.ForeignEnum.values()) 747 self.assertEqual([('FOREIGN_FOO', 4), ('FOREIGN_BAR', 5), 748 ('FOREIGN_BAZ', 6)], 749 unittest_pb2.ForeignEnum.items()) 750 751 proto = unittest_pb2.TestAllTypes() 752 self.assertEqual(['FOO', 'BAR', 'BAZ'], proto.NestedEnum.keys()) 753 self.assertEqual([1, 2, 3], proto.NestedEnum.values()) 754 self.assertEqual([('FOO', 1), ('BAR', 2), ('BAZ', 3)], 755 proto.NestedEnum.items()) 756 757 def testRepeatedScalars(self): 758 proto = unittest_pb2.TestAllTypes() 759 760 self.assertTrue(not proto.repeated_int32) 761 self.assertEqual(0, len(proto.repeated_int32)) 762 proto.repeated_int32.append(5) 763 proto.repeated_int32.append(10) 764 proto.repeated_int32.append(15) 765 self.assertTrue(proto.repeated_int32) 766 self.assertEqual(3, len(proto.repeated_int32)) 767 768 self.assertEqual([5, 10, 15], proto.repeated_int32) 769 770 # Test single retrieval. 771 self.assertEqual(5, proto.repeated_int32[0]) 772 self.assertEqual(15, proto.repeated_int32[-1]) 773 # Test out-of-bounds indices. 774 self.assertRaises(IndexError, proto.repeated_int32.__getitem__, 1234) 775 self.assertRaises(IndexError, proto.repeated_int32.__getitem__, -1234) 776 # Test incorrect types passed to __getitem__. 777 self.assertRaises(TypeError, proto.repeated_int32.__getitem__, 'foo') 778 self.assertRaises(TypeError, proto.repeated_int32.__getitem__, None) 779 780 # Test single assignment. 781 proto.repeated_int32[1] = 20 782 self.assertEqual([5, 20, 15], proto.repeated_int32) 783 784 # Test insertion. 785 proto.repeated_int32.insert(1, 25) 786 self.assertEqual([5, 25, 20, 15], proto.repeated_int32) 787 788 # Test slice retrieval. 789 proto.repeated_int32.append(30) 790 self.assertEqual([25, 20, 15], proto.repeated_int32[1:4]) 791 self.assertEqual([5, 25, 20, 15, 30], proto.repeated_int32[:]) 792 793 # Test slice assignment with an iterator 794 proto.repeated_int32[1:4] = (i for i in xrange(3)) 795 self.assertEqual([5, 0, 1, 2, 30], proto.repeated_int32) 796 797 # Test slice assignment. 798 proto.repeated_int32[1:4] = [35, 40, 45] 799 self.assertEqual([5, 35, 40, 45, 30], proto.repeated_int32) 800 801 # Test that we can use the field as an iterator. 802 result = [] 803 for i in proto.repeated_int32: 804 result.append(i) 805 self.assertEqual([5, 35, 40, 45, 30], result) 806 807 # Test single deletion. 808 del proto.repeated_int32[2] 809 self.assertEqual([5, 35, 45, 30], proto.repeated_int32) 810 811 # Test slice deletion. 812 del proto.repeated_int32[2:] 813 self.assertEqual([5, 35], proto.repeated_int32) 814 815 # Test extending. 816 proto.repeated_int32.extend([3, 13]) 817 self.assertEqual([5, 35, 3, 13], proto.repeated_int32) 818 819 # Test clearing. 820 proto.ClearField('repeated_int32') 821 self.assertTrue(not proto.repeated_int32) 822 self.assertEqual(0, len(proto.repeated_int32)) 823 824 proto.repeated_int32.append(1) 825 self.assertEqual(1, proto.repeated_int32[-1]) 826 # Test assignment to a negative index. 827 proto.repeated_int32[-1] = 2 828 self.assertEqual(2, proto.repeated_int32[-1]) 829 830 # Test deletion at negative indices. 831 proto.repeated_int32[:] = [0, 1, 2, 3] 832 del proto.repeated_int32[-1] 833 self.assertEqual([0, 1, 2], proto.repeated_int32) 834 835 del proto.repeated_int32[-2] 836 self.assertEqual([0, 2], proto.repeated_int32) 837 838 self.assertRaises(IndexError, proto.repeated_int32.__delitem__, -3) 839 self.assertRaises(IndexError, proto.repeated_int32.__delitem__, 300) 840 841 del proto.repeated_int32[-2:-1] 842 self.assertEqual([2], proto.repeated_int32) 843 844 del proto.repeated_int32[100:10000] 845 self.assertEqual([2], proto.repeated_int32) 846 847 def testRepeatedScalarsRemove(self): 848 proto = unittest_pb2.TestAllTypes() 849 850 self.assertTrue(not proto.repeated_int32) 851 self.assertEqual(0, len(proto.repeated_int32)) 852 proto.repeated_int32.append(5) 853 proto.repeated_int32.append(10) 854 proto.repeated_int32.append(5) 855 proto.repeated_int32.append(5) 856 857 self.assertEqual(4, len(proto.repeated_int32)) 858 proto.repeated_int32.remove(5) 859 self.assertEqual(3, len(proto.repeated_int32)) 860 self.assertEqual(10, proto.repeated_int32[0]) 861 self.assertEqual(5, proto.repeated_int32[1]) 862 self.assertEqual(5, proto.repeated_int32[2]) 863 864 proto.repeated_int32.remove(5) 865 self.assertEqual(2, len(proto.repeated_int32)) 866 self.assertEqual(10, proto.repeated_int32[0]) 867 self.assertEqual(5, proto.repeated_int32[1]) 868 869 proto.repeated_int32.remove(10) 870 self.assertEqual(1, len(proto.repeated_int32)) 871 self.assertEqual(5, proto.repeated_int32[0]) 872 873 # Remove a non-existent element. 874 self.assertRaises(ValueError, proto.repeated_int32.remove, 123) 875 876 def testRepeatedComposites(self): 877 proto = unittest_pb2.TestAllTypes() 878 self.assertTrue(not proto.repeated_nested_message) 879 self.assertEqual(0, len(proto.repeated_nested_message)) 880 m0 = proto.repeated_nested_message.add() 881 m1 = proto.repeated_nested_message.add() 882 self.assertTrue(proto.repeated_nested_message) 883 self.assertEqual(2, len(proto.repeated_nested_message)) 884 self.assertListsEqual([m0, m1], proto.repeated_nested_message) 885 self.assertTrue(isinstance(m0, unittest_pb2.TestAllTypes.NestedMessage)) 886 887 # Test out-of-bounds indices. 888 self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__, 889 1234) 890 self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__, 891 -1234) 892 893 # Test incorrect types passed to __getitem__. 894 self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__, 895 'foo') 896 self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__, 897 None) 898 899 # Test slice retrieval. 900 m2 = proto.repeated_nested_message.add() 901 m3 = proto.repeated_nested_message.add() 902 m4 = proto.repeated_nested_message.add() 903 self.assertListsEqual( 904 [m1, m2, m3], proto.repeated_nested_message[1:4]) 905 self.assertListsEqual( 906 [m0, m1, m2, m3, m4], proto.repeated_nested_message[:]) 907 self.assertListsEqual( 908 [m0, m1], proto.repeated_nested_message[:2]) 909 self.assertListsEqual( 910 [m2, m3, m4], proto.repeated_nested_message[2:]) 911 self.assertEqual( 912 m0, proto.repeated_nested_message[0]) 913 self.assertListsEqual( 914 [m0], proto.repeated_nested_message[:1]) 915 916 # Test that we can use the field as an iterator. 917 result = [] 918 for i in proto.repeated_nested_message: 919 result.append(i) 920 self.assertListsEqual([m0, m1, m2, m3, m4], result) 921 922 # Test single deletion. 923 del proto.repeated_nested_message[2] 924 self.assertListsEqual([m0, m1, m3, m4], proto.repeated_nested_message) 925 926 # Test slice deletion. 927 del proto.repeated_nested_message[2:] 928 self.assertListsEqual([m0, m1], proto.repeated_nested_message) 929 930 # Test extending. 931 n1 = unittest_pb2.TestAllTypes.NestedMessage(bb=1) 932 n2 = unittest_pb2.TestAllTypes.NestedMessage(bb=2) 933 proto.repeated_nested_message.extend([n1,n2]) 934 self.assertEqual(4, len(proto.repeated_nested_message)) 935 self.assertEqual(n1, proto.repeated_nested_message[2]) 936 self.assertEqual(n2, proto.repeated_nested_message[3]) 937 938 # Test clearing. 939 proto.ClearField('repeated_nested_message') 940 self.assertTrue(not proto.repeated_nested_message) 941 self.assertEqual(0, len(proto.repeated_nested_message)) 942 943 # Test constructing an element while adding it. 944 proto.repeated_nested_message.add(bb=23) 945 self.assertEqual(1, len(proto.repeated_nested_message)) 946 self.assertEqual(23, proto.repeated_nested_message[0].bb) 947 948 def testRepeatedCompositeRemove(self): 949 proto = unittest_pb2.TestAllTypes() 950 951 self.assertEqual(0, len(proto.repeated_nested_message)) 952 m0 = proto.repeated_nested_message.add() 953 # Need to set some differentiating variable so m0 != m1 != m2: 954 m0.bb = len(proto.repeated_nested_message) 955 m1 = proto.repeated_nested_message.add() 956 m1.bb = len(proto.repeated_nested_message) 957 self.assertTrue(m0 != m1) 958 m2 = proto.repeated_nested_message.add() 959 m2.bb = len(proto.repeated_nested_message) 960 self.assertListsEqual([m0, m1, m2], proto.repeated_nested_message) 961 962 self.assertEqual(3, len(proto.repeated_nested_message)) 963 proto.repeated_nested_message.remove(m0) 964 self.assertEqual(2, len(proto.repeated_nested_message)) 965 self.assertEqual(m1, proto.repeated_nested_message[0]) 966 self.assertEqual(m2, proto.repeated_nested_message[1]) 967 968 # Removing m0 again or removing None should raise error 969 self.assertRaises(ValueError, proto.repeated_nested_message.remove, m0) 970 self.assertRaises(ValueError, proto.repeated_nested_message.remove, None) 971 self.assertEqual(2, len(proto.repeated_nested_message)) 972 973 proto.repeated_nested_message.remove(m2) 974 self.assertEqual(1, len(proto.repeated_nested_message)) 975 self.assertEqual(m1, proto.repeated_nested_message[0]) 976 977 def testHandWrittenReflection(self): 978 # Hand written extensions are only supported by the pure-Python 979 # implementation of the API. 980 if api_implementation.Type() != 'python': 981 return 982 983 FieldDescriptor = descriptor.FieldDescriptor 984 foo_field_descriptor = FieldDescriptor( 985 name='foo_field', full_name='MyProto.foo_field', 986 index=0, number=1, type=FieldDescriptor.TYPE_INT64, 987 cpp_type=FieldDescriptor.CPPTYPE_INT64, 988 label=FieldDescriptor.LABEL_OPTIONAL, default_value=0, 989 containing_type=None, message_type=None, enum_type=None, 990 is_extension=False, extension_scope=None, 991 options=descriptor_pb2.FieldOptions()) 992 mydescriptor = descriptor.Descriptor( 993 name='MyProto', full_name='MyProto', filename='ignored', 994 containing_type=None, nested_types=[], enum_types=[], 995 fields=[foo_field_descriptor], extensions=[], 996 options=descriptor_pb2.MessageOptions()) 997 class MyProtoClass(message.Message): 998 DESCRIPTOR = mydescriptor 999 __metaclass__ = reflection.GeneratedProtocolMessageType 1000 myproto_instance = MyProtoClass() 1001 self.assertEqual(0, myproto_instance.foo_field) 1002 self.assertTrue(not myproto_instance.HasField('foo_field')) 1003 myproto_instance.foo_field = 23 1004 self.assertEqual(23, myproto_instance.foo_field) 1005 self.assertTrue(myproto_instance.HasField('foo_field')) 1006 1007 def testDescriptorProtoSupport(self): 1008 # Hand written descriptors/reflection are only supported by the pure-Python 1009 # implementation of the API. 1010 if api_implementation.Type() != 'python': 1011 return 1012 1013 def AddDescriptorField(proto, field_name, field_type): 1014 AddDescriptorField.field_index += 1 1015 new_field = proto.field.add() 1016 new_field.name = field_name 1017 new_field.type = field_type 1018 new_field.number = AddDescriptorField.field_index 1019 new_field.label = descriptor_pb2.FieldDescriptorProto.LABEL_OPTIONAL 1020 1021 AddDescriptorField.field_index = 0 1022 1023 desc_proto = descriptor_pb2.DescriptorProto() 1024 desc_proto.name = 'Car' 1025 fdp = descriptor_pb2.FieldDescriptorProto 1026 AddDescriptorField(desc_proto, 'name', fdp.TYPE_STRING) 1027 AddDescriptorField(desc_proto, 'year', fdp.TYPE_INT64) 1028 AddDescriptorField(desc_proto, 'automatic', fdp.TYPE_BOOL) 1029 AddDescriptorField(desc_proto, 'price', fdp.TYPE_DOUBLE) 1030 # Add a repeated field 1031 AddDescriptorField.field_index += 1 1032 new_field = desc_proto.field.add() 1033 new_field.name = 'owners' 1034 new_field.type = fdp.TYPE_STRING 1035 new_field.number = AddDescriptorField.field_index 1036 new_field.label = descriptor_pb2.FieldDescriptorProto.LABEL_REPEATED 1037 1038 desc = descriptor.MakeDescriptor(desc_proto) 1039 self.assertTrue(desc.fields_by_name.has_key('name')) 1040 self.assertTrue(desc.fields_by_name.has_key('year')) 1041 self.assertTrue(desc.fields_by_name.has_key('automatic')) 1042 self.assertTrue(desc.fields_by_name.has_key('price')) 1043 self.assertTrue(desc.fields_by_name.has_key('owners')) 1044 1045 class CarMessage(message.Message): 1046 __metaclass__ = reflection.GeneratedProtocolMessageType 1047 DESCRIPTOR = desc 1048 1049 prius = CarMessage() 1050 prius.name = 'prius' 1051 prius.year = 2010 1052 prius.automatic = True 1053 prius.price = 25134.75 1054 prius.owners.extend(['bob', 'susan']) 1055 1056 serialized_prius = prius.SerializeToString() 1057 new_prius = reflection.ParseMessage(desc, serialized_prius) 1058 self.assertTrue(new_prius is not prius) 1059 self.assertEqual(prius, new_prius) 1060 1061 # these are unnecessary assuming message equality works as advertised but 1062 # explicitly check to be safe since we're mucking about in metaclass foo 1063 self.assertEqual(prius.name, new_prius.name) 1064 self.assertEqual(prius.year, new_prius.year) 1065 self.assertEqual(prius.automatic, new_prius.automatic) 1066 self.assertEqual(prius.price, new_prius.price) 1067 self.assertEqual(prius.owners, new_prius.owners) 1068 1069 def testTopLevelExtensionsForOptionalScalar(self): 1070 extendee_proto = unittest_pb2.TestAllExtensions() 1071 extension = unittest_pb2.optional_int32_extension 1072 self.assertTrue(not extendee_proto.HasExtension(extension)) 1073 self.assertEqual(0, extendee_proto.Extensions[extension]) 1074 # As with normal scalar fields, just doing a read doesn't actually set the 1075 # "has" bit. 1076 self.assertTrue(not extendee_proto.HasExtension(extension)) 1077 # Actually set the thing. 1078 extendee_proto.Extensions[extension] = 23 1079 self.assertEqual(23, extendee_proto.Extensions[extension]) 1080 self.assertTrue(extendee_proto.HasExtension(extension)) 1081 # Ensure that clearing works as well. 1082 extendee_proto.ClearExtension(extension) 1083 self.assertEqual(0, extendee_proto.Extensions[extension]) 1084 self.assertTrue(not extendee_proto.HasExtension(extension)) 1085 1086 def testTopLevelExtensionsForRepeatedScalar(self): 1087 extendee_proto = unittest_pb2.TestAllExtensions() 1088 extension = unittest_pb2.repeated_string_extension 1089 self.assertEqual(0, len(extendee_proto.Extensions[extension])) 1090 extendee_proto.Extensions[extension].append('foo') 1091 self.assertEqual(['foo'], extendee_proto.Extensions[extension]) 1092 string_list = extendee_proto.Extensions[extension] 1093 extendee_proto.ClearExtension(extension) 1094 self.assertEqual(0, len(extendee_proto.Extensions[extension])) 1095 self.assertTrue(string_list is not extendee_proto.Extensions[extension]) 1096 # Shouldn't be allowed to do Extensions[extension] = 'a' 1097 self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions, 1098 extension, 'a') 1099 1100 def testTopLevelExtensionsForOptionalMessage(self): 1101 extendee_proto = unittest_pb2.TestAllExtensions() 1102 extension = unittest_pb2.optional_foreign_message_extension 1103 self.assertTrue(not extendee_proto.HasExtension(extension)) 1104 self.assertEqual(0, extendee_proto.Extensions[extension].c) 1105 # As with normal (non-extension) fields, merely reading from the 1106 # thing shouldn't set the "has" bit. 1107 self.assertTrue(not extendee_proto.HasExtension(extension)) 1108 extendee_proto.Extensions[extension].c = 23 1109 self.assertEqual(23, extendee_proto.Extensions[extension].c) 1110 self.assertTrue(extendee_proto.HasExtension(extension)) 1111 # Save a reference here. 1112 foreign_message = extendee_proto.Extensions[extension] 1113 extendee_proto.ClearExtension(extension) 1114 self.assertTrue(foreign_message is not extendee_proto.Extensions[extension]) 1115 # Setting a field on foreign_message now shouldn't set 1116 # any "has" bits on extendee_proto. 1117 foreign_message.c = 42 1118 self.assertEqual(42, foreign_message.c) 1119 self.assertTrue(foreign_message.HasField('c')) 1120 self.assertTrue(not extendee_proto.HasExtension(extension)) 1121 # Shouldn't be allowed to do Extensions[extension] = 'a' 1122 self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions, 1123 extension, 'a') 1124 1125 def testTopLevelExtensionsForRepeatedMessage(self): 1126 extendee_proto = unittest_pb2.TestAllExtensions() 1127 extension = unittest_pb2.repeatedgroup_extension 1128 self.assertEqual(0, len(extendee_proto.Extensions[extension])) 1129 group = extendee_proto.Extensions[extension].add() 1130 group.a = 23 1131 self.assertEqual(23, extendee_proto.Extensions[extension][0].a) 1132 group.a = 42 1133 self.assertEqual(42, extendee_proto.Extensions[extension][0].a) 1134 group_list = extendee_proto.Extensions[extension] 1135 extendee_proto.ClearExtension(extension) 1136 self.assertEqual(0, len(extendee_proto.Extensions[extension])) 1137 self.assertTrue(group_list is not extendee_proto.Extensions[extension]) 1138 # Shouldn't be allowed to do Extensions[extension] = 'a' 1139 self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions, 1140 extension, 'a') 1141 1142 def testNestedExtensions(self): 1143 extendee_proto = unittest_pb2.TestAllExtensions() 1144 extension = unittest_pb2.TestRequired.single 1145 1146 # We just test the non-repeated case. 1147 self.assertTrue(not extendee_proto.HasExtension(extension)) 1148 required = extendee_proto.Extensions[extension] 1149 self.assertEqual(0, required.a) 1150 self.assertTrue(not extendee_proto.HasExtension(extension)) 1151 required.a = 23 1152 self.assertEqual(23, extendee_proto.Extensions[extension].a) 1153 self.assertTrue(extendee_proto.HasExtension(extension)) 1154 extendee_proto.ClearExtension(extension) 1155 self.assertTrue(required is not extendee_proto.Extensions[extension]) 1156 self.assertTrue(not extendee_proto.HasExtension(extension)) 1157 1158 # If message A directly contains message B, and 1159 # a.HasField('b') is currently False, then mutating any 1160 # extension in B should change a.HasField('b') to True 1161 # (and so on up the object tree). 1162 def testHasBitsForAncestorsOfExtendedMessage(self): 1163 # Optional scalar extension. 1164 toplevel = more_extensions_pb2.TopLevelMessage() 1165 self.assertTrue(not toplevel.HasField('submessage')) 1166 self.assertEqual(0, toplevel.submessage.Extensions[ 1167 more_extensions_pb2.optional_int_extension]) 1168 self.assertTrue(not toplevel.HasField('submessage')) 1169 toplevel.submessage.Extensions[ 1170 more_extensions_pb2.optional_int_extension] = 23 1171 self.assertEqual(23, toplevel.submessage.Extensions[ 1172 more_extensions_pb2.optional_int_extension]) 1173 self.assertTrue(toplevel.HasField('submessage')) 1174 1175 # Repeated scalar extension. 1176 toplevel = more_extensions_pb2.TopLevelMessage() 1177 self.assertTrue(not toplevel.HasField('submessage')) 1178 self.assertEqual([], toplevel.submessage.Extensions[ 1179 more_extensions_pb2.repeated_int_extension]) 1180 self.assertTrue(not toplevel.HasField('submessage')) 1181 toplevel.submessage.Extensions[ 1182 more_extensions_pb2.repeated_int_extension].append(23) 1183 self.assertEqual([23], toplevel.submessage.Extensions[ 1184 more_extensions_pb2.repeated_int_extension]) 1185 self.assertTrue(toplevel.HasField('submessage')) 1186 1187 # Optional message extension. 1188 toplevel = more_extensions_pb2.TopLevelMessage() 1189 self.assertTrue(not toplevel.HasField('submessage')) 1190 self.assertEqual(0, toplevel.submessage.Extensions[ 1191 more_extensions_pb2.optional_message_extension].foreign_message_int) 1192 self.assertTrue(not toplevel.HasField('submessage')) 1193 toplevel.submessage.Extensions[ 1194 more_extensions_pb2.optional_message_extension].foreign_message_int = 23 1195 self.assertEqual(23, toplevel.submessage.Extensions[ 1196 more_extensions_pb2.optional_message_extension].foreign_message_int) 1197 self.assertTrue(toplevel.HasField('submessage')) 1198 1199 # Repeated message extension. 1200 toplevel = more_extensions_pb2.TopLevelMessage() 1201 self.assertTrue(not toplevel.HasField('submessage')) 1202 self.assertEqual(0, len(toplevel.submessage.Extensions[ 1203 more_extensions_pb2.repeated_message_extension])) 1204 self.assertTrue(not toplevel.HasField('submessage')) 1205 foreign = toplevel.submessage.Extensions[ 1206 more_extensions_pb2.repeated_message_extension].add() 1207 self.assertEqual(foreign, toplevel.submessage.Extensions[ 1208 more_extensions_pb2.repeated_message_extension][0]) 1209 self.assertTrue(toplevel.HasField('submessage')) 1210 1211 def testDisconnectionAfterClearingEmptyMessage(self): 1212 toplevel = more_extensions_pb2.TopLevelMessage() 1213 extendee_proto = toplevel.submessage 1214 extension = more_extensions_pb2.optional_message_extension 1215 extension_proto = extendee_proto.Extensions[extension] 1216 extendee_proto.ClearExtension(extension) 1217 extension_proto.foreign_message_int = 23 1218 1219 self.assertTrue(extension_proto is not extendee_proto.Extensions[extension]) 1220 1221 def testExtensionFailureModes(self): 1222 extendee_proto = unittest_pb2.TestAllExtensions() 1223 1224 # Try non-extension-handle arguments to HasExtension, 1225 # ClearExtension(), and Extensions[]... 1226 self.assertRaises(KeyError, extendee_proto.HasExtension, 1234) 1227 self.assertRaises(KeyError, extendee_proto.ClearExtension, 1234) 1228 self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__, 1234) 1229 self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__, 1234, 5) 1230 1231 # Try something that *is* an extension handle, just not for 1232 # this message... 1233 unknown_handle = more_extensions_pb2.optional_int_extension 1234 self.assertRaises(KeyError, extendee_proto.HasExtension, 1235 unknown_handle) 1236 self.assertRaises(KeyError, extendee_proto.ClearExtension, 1237 unknown_handle) 1238 self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__, 1239 unknown_handle) 1240 self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__, 1241 unknown_handle, 5) 1242 1243 # Try call HasExtension() with a valid handle, but for a 1244 # *repeated* field. (Just as with non-extension repeated 1245 # fields, Has*() isn't supported for extension repeated fields). 1246 self.assertRaises(KeyError, extendee_proto.HasExtension, 1247 unittest_pb2.repeated_string_extension) 1248 1249 def testStaticParseFrom(self): 1250 proto1 = unittest_pb2.TestAllTypes() 1251 test_util.SetAllFields(proto1) 1252 1253 string1 = proto1.SerializeToString() 1254 proto2 = unittest_pb2.TestAllTypes.FromString(string1) 1255 1256 # Messages should be equal. 1257 self.assertEqual(proto2, proto1) 1258 1259 def testMergeFromSingularField(self): 1260 # Test merge with just a singular field. 1261 proto1 = unittest_pb2.TestAllTypes() 1262 proto1.optional_int32 = 1 1263 1264 proto2 = unittest_pb2.TestAllTypes() 1265 # This shouldn't get overwritten. 1266 proto2.optional_string = 'value' 1267 1268 proto2.MergeFrom(proto1) 1269 self.assertEqual(1, proto2.optional_int32) 1270 self.assertEqual('value', proto2.optional_string) 1271 1272 def testMergeFromRepeatedField(self): 1273 # Test merge with just a repeated field. 1274 proto1 = unittest_pb2.TestAllTypes() 1275 proto1.repeated_int32.append(1) 1276 proto1.repeated_int32.append(2) 1277 1278 proto2 = unittest_pb2.TestAllTypes() 1279 proto2.repeated_int32.append(0) 1280 proto2.MergeFrom(proto1) 1281 1282 self.assertEqual(0, proto2.repeated_int32[0]) 1283 self.assertEqual(1, proto2.repeated_int32[1]) 1284 self.assertEqual(2, proto2.repeated_int32[2]) 1285 1286 def testMergeFromOptionalGroup(self): 1287 # Test merge with an optional group. 1288 proto1 = unittest_pb2.TestAllTypes() 1289 proto1.optionalgroup.a = 12 1290 proto2 = unittest_pb2.TestAllTypes() 1291 proto2.MergeFrom(proto1) 1292 self.assertEqual(12, proto2.optionalgroup.a) 1293 1294 def testMergeFromRepeatedNestedMessage(self): 1295 # Test merge with a repeated nested message. 1296 proto1 = unittest_pb2.TestAllTypes() 1297 m = proto1.repeated_nested_message.add() 1298 m.bb = 123 1299 m = proto1.repeated_nested_message.add() 1300 m.bb = 321 1301 1302 proto2 = unittest_pb2.TestAllTypes() 1303 m = proto2.repeated_nested_message.add() 1304 m.bb = 999 1305 proto2.MergeFrom(proto1) 1306 self.assertEqual(999, proto2.repeated_nested_message[0].bb) 1307 self.assertEqual(123, proto2.repeated_nested_message[1].bb) 1308 self.assertEqual(321, proto2.repeated_nested_message[2].bb) 1309 1310 proto3 = unittest_pb2.TestAllTypes() 1311 proto3.repeated_nested_message.MergeFrom(proto2.repeated_nested_message) 1312 self.assertEqual(999, proto3.repeated_nested_message[0].bb) 1313 self.assertEqual(123, proto3.repeated_nested_message[1].bb) 1314 self.assertEqual(321, proto3.repeated_nested_message[2].bb) 1315 1316 def testMergeFromAllFields(self): 1317 # With all fields set. 1318 proto1 = unittest_pb2.TestAllTypes() 1319 test_util.SetAllFields(proto1) 1320 proto2 = unittest_pb2.TestAllTypes() 1321 proto2.MergeFrom(proto1) 1322 1323 # Messages should be equal. 1324 self.assertEqual(proto2, proto1) 1325 1326 # Serialized string should be equal too. 1327 string1 = proto1.SerializeToString() 1328 string2 = proto2.SerializeToString() 1329 self.assertEqual(string1, string2) 1330 1331 def testMergeFromExtensionsSingular(self): 1332 proto1 = unittest_pb2.TestAllExtensions() 1333 proto1.Extensions[unittest_pb2.optional_int32_extension] = 1 1334 1335 proto2 = unittest_pb2.TestAllExtensions() 1336 proto2.MergeFrom(proto1) 1337 self.assertEqual( 1338 1, proto2.Extensions[unittest_pb2.optional_int32_extension]) 1339 1340 def testMergeFromExtensionsRepeated(self): 1341 proto1 = unittest_pb2.TestAllExtensions() 1342 proto1.Extensions[unittest_pb2.repeated_int32_extension].append(1) 1343 proto1.Extensions[unittest_pb2.repeated_int32_extension].append(2) 1344 1345 proto2 = unittest_pb2.TestAllExtensions() 1346 proto2.Extensions[unittest_pb2.repeated_int32_extension].append(0) 1347 proto2.MergeFrom(proto1) 1348 self.assertEqual( 1349 3, len(proto2.Extensions[unittest_pb2.repeated_int32_extension])) 1350 self.assertEqual( 1351 0, proto2.Extensions[unittest_pb2.repeated_int32_extension][0]) 1352 self.assertEqual( 1353 1, proto2.Extensions[unittest_pb2.repeated_int32_extension][1]) 1354 self.assertEqual( 1355 2, proto2.Extensions[unittest_pb2.repeated_int32_extension][2]) 1356 1357 def testMergeFromExtensionsNestedMessage(self): 1358 proto1 = unittest_pb2.TestAllExtensions() 1359 ext1 = proto1.Extensions[ 1360 unittest_pb2.repeated_nested_message_extension] 1361 m = ext1.add() 1362 m.bb = 222 1363 m = ext1.add() 1364 m.bb = 333 1365 1366 proto2 = unittest_pb2.TestAllExtensions() 1367 ext2 = proto2.Extensions[ 1368 unittest_pb2.repeated_nested_message_extension] 1369 m = ext2.add() 1370 m.bb = 111 1371 1372 proto2.MergeFrom(proto1) 1373 ext2 = proto2.Extensions[ 1374 unittest_pb2.repeated_nested_message_extension] 1375 self.assertEqual(3, len(ext2)) 1376 self.assertEqual(111, ext2[0].bb) 1377 self.assertEqual(222, ext2[1].bb) 1378 self.assertEqual(333, ext2[2].bb) 1379 1380 def testMergeFromBug(self): 1381 message1 = unittest_pb2.TestAllTypes() 1382 message2 = unittest_pb2.TestAllTypes() 1383 1384 # Cause optional_nested_message to be instantiated within message1, even 1385 # though it is not considered to be "present". 1386 message1.optional_nested_message 1387 self.assertFalse(message1.HasField('optional_nested_message')) 1388 1389 # Merge into message2. This should not instantiate the field is message2. 1390 message2.MergeFrom(message1) 1391 self.assertFalse(message2.HasField('optional_nested_message')) 1392 1393 def testCopyFromSingularField(self): 1394 # Test copy with just a singular field. 1395 proto1 = unittest_pb2.TestAllTypes() 1396 proto1.optional_int32 = 1 1397 proto1.optional_string = 'important-text' 1398 1399 proto2 = unittest_pb2.TestAllTypes() 1400 proto2.optional_string = 'value' 1401 1402 proto2.CopyFrom(proto1) 1403 self.assertEqual(1, proto2.optional_int32) 1404 self.assertEqual('important-text', proto2.optional_string) 1405 1406 def testCopyFromRepeatedField(self): 1407 # Test copy with a repeated field. 1408 proto1 = unittest_pb2.TestAllTypes() 1409 proto1.repeated_int32.append(1) 1410 proto1.repeated_int32.append(2) 1411 1412 proto2 = unittest_pb2.TestAllTypes() 1413 proto2.repeated_int32.append(0) 1414 proto2.CopyFrom(proto1) 1415 1416 self.assertEqual(1, proto2.repeated_int32[0]) 1417 self.assertEqual(2, proto2.repeated_int32[1]) 1418 1419 def testCopyFromAllFields(self): 1420 # With all fields set. 1421 proto1 = unittest_pb2.TestAllTypes() 1422 test_util.SetAllFields(proto1) 1423 proto2 = unittest_pb2.TestAllTypes() 1424 proto2.CopyFrom(proto1) 1425 1426 # Messages should be equal. 1427 self.assertEqual(proto2, proto1) 1428 1429 # Serialized string should be equal too. 1430 string1 = proto1.SerializeToString() 1431 string2 = proto2.SerializeToString() 1432 self.assertEqual(string1, string2) 1433 1434 def testCopyFromSelf(self): 1435 proto1 = unittest_pb2.TestAllTypes() 1436 proto1.repeated_int32.append(1) 1437 proto1.optional_int32 = 2 1438 proto1.optional_string = 'important-text' 1439 1440 proto1.CopyFrom(proto1) 1441 self.assertEqual(1, proto1.repeated_int32[0]) 1442 self.assertEqual(2, proto1.optional_int32) 1443 self.assertEqual('important-text', proto1.optional_string) 1444 1445 def testCopyFromBadType(self): 1446 # The python implementation doesn't raise an exception in this 1447 # case. In theory it should. 1448 if api_implementation.Type() == 'python': 1449 return 1450 proto1 = unittest_pb2.TestAllTypes() 1451 proto2 = unittest_pb2.TestAllExtensions() 1452 self.assertRaises(TypeError, proto1.CopyFrom, proto2) 1453 1454 def testClear(self): 1455 proto = unittest_pb2.TestAllTypes() 1456 # C++ implementation does not support lazy fields right now so leave it 1457 # out for now. 1458 if api_implementation.Type() == 'python': 1459 test_util.SetAllFields(proto) 1460 else: 1461 test_util.SetAllNonLazyFields(proto) 1462 # Clear the message. 1463 proto.Clear() 1464 self.assertEquals(proto.ByteSize(), 0) 1465 empty_proto = unittest_pb2.TestAllTypes() 1466 self.assertEquals(proto, empty_proto) 1467 1468 # Test if extensions which were set are cleared. 1469 proto = unittest_pb2.TestAllExtensions() 1470 test_util.SetAllExtensions(proto) 1471 # Clear the message. 1472 proto.Clear() 1473 self.assertEquals(proto.ByteSize(), 0) 1474 empty_proto = unittest_pb2.TestAllExtensions() 1475 self.assertEquals(proto, empty_proto) 1476 1477 def testDisconnectingBeforeClear(self): 1478 proto = unittest_pb2.TestAllTypes() 1479 nested = proto.optional_nested_message 1480 proto.Clear() 1481 self.assertTrue(nested is not proto.optional_nested_message) 1482 nested.bb = 23 1483 self.assertTrue(not proto.HasField('optional_nested_message')) 1484 self.assertEqual(0, proto.optional_nested_message.bb) 1485 1486 proto = unittest_pb2.TestAllTypes() 1487 nested = proto.optional_nested_message 1488 nested.bb = 5 1489 foreign = proto.optional_foreign_message 1490 foreign.c = 6 1491 1492 proto.Clear() 1493 self.assertTrue(nested is not proto.optional_nested_message) 1494 self.assertTrue(foreign is not proto.optional_foreign_message) 1495 self.assertEqual(5, nested.bb) 1496 self.assertEqual(6, foreign.c) 1497 nested.bb = 15 1498 foreign.c = 16 1499 self.assertTrue(not proto.HasField('optional_nested_message')) 1500 self.assertEqual(0, proto.optional_nested_message.bb) 1501 self.assertTrue(not proto.HasField('optional_foreign_message')) 1502 self.assertEqual(0, proto.optional_foreign_message.c) 1503 1504 def assertInitialized(self, proto): 1505 self.assertTrue(proto.IsInitialized()) 1506 # Neither method should raise an exception. 1507 proto.SerializeToString() 1508 proto.SerializePartialToString() 1509 1510 def assertNotInitialized(self, proto): 1511 self.assertFalse(proto.IsInitialized()) 1512 self.assertRaises(message.EncodeError, proto.SerializeToString) 1513 # "Partial" serialization doesn't care if message is uninitialized. 1514 proto.SerializePartialToString() 1515 1516 def testIsInitialized(self): 1517 # Trivial cases - all optional fields and extensions. 1518 proto = unittest_pb2.TestAllTypes() 1519 self.assertInitialized(proto) 1520 proto = unittest_pb2.TestAllExtensions() 1521 self.assertInitialized(proto) 1522 1523 # The case of uninitialized required fields. 1524 proto = unittest_pb2.TestRequired() 1525 self.assertNotInitialized(proto) 1526 proto.a = proto.b = proto.c = 2 1527 self.assertInitialized(proto) 1528 1529 # The case of uninitialized submessage. 1530 proto = unittest_pb2.TestRequiredForeign() 1531 self.assertInitialized(proto) 1532 proto.optional_message.a = 1 1533 self.assertNotInitialized(proto) 1534 proto.optional_message.b = 0 1535 proto.optional_message.c = 0 1536 self.assertInitialized(proto) 1537 1538 # Uninitialized repeated submessage. 1539 message1 = proto.repeated_message.add() 1540 self.assertNotInitialized(proto) 1541 message1.a = message1.b = message1.c = 0 1542 self.assertInitialized(proto) 1543 1544 # Uninitialized repeated group in an extension. 1545 proto = unittest_pb2.TestAllExtensions() 1546 extension = unittest_pb2.TestRequired.multi 1547 message1 = proto.Extensions[extension].add() 1548 message2 = proto.Extensions[extension].add() 1549 self.assertNotInitialized(proto) 1550 message1.a = 1 1551 message1.b = 1 1552 message1.c = 1 1553 self.assertNotInitialized(proto) 1554 message2.a = 2 1555 message2.b = 2 1556 message2.c = 2 1557 self.assertInitialized(proto) 1558 1559 # Uninitialized nonrepeated message in an extension. 1560 proto = unittest_pb2.TestAllExtensions() 1561 extension = unittest_pb2.TestRequired.single 1562 proto.Extensions[extension].a = 1 1563 self.assertNotInitialized(proto) 1564 proto.Extensions[extension].b = 2 1565 proto.Extensions[extension].c = 3 1566 self.assertInitialized(proto) 1567 1568 # Try passing an errors list. 1569 errors = [] 1570 proto = unittest_pb2.TestRequired() 1571 self.assertFalse(proto.IsInitialized(errors)) 1572 self.assertEqual(errors, ['a', 'b', 'c']) 1573 1574 def testStringUTF8Encoding(self): 1575 proto = unittest_pb2.TestAllTypes() 1576 1577 # Assignment of a unicode object to a field of type 'bytes' is not allowed. 1578 self.assertRaises(TypeError, 1579 setattr, proto, 'optional_bytes', u'unicode object') 1580 1581 # Check that the default value is of python's 'unicode' type. 1582 self.assertEqual(type(proto.optional_string), unicode) 1583 1584 proto.optional_string = unicode('Testing') 1585 self.assertEqual(proto.optional_string, str('Testing')) 1586 1587 # Assign a value of type 'str' which can be encoded in UTF-8. 1588 proto.optional_string = str('Testing') 1589 self.assertEqual(proto.optional_string, unicode('Testing')) 1590 1591 if api_implementation.Type() == 'python': 1592 # Values of type 'str' are also accepted as long as they can be 1593 # encoded in UTF-8. 1594 self.assertEqual(type(proto.optional_string), str) 1595 1596 # Try to assign a 'str' value which contains bytes that aren't 7-bit ASCII. 1597 self.assertRaises(ValueError, 1598 setattr, proto, 'optional_string', str('a\x80a')) 1599 # Assign a 'str' object which contains a UTF-8 encoded string. 1600 self.assertRaises(ValueError, 1601 setattr, proto, 'optional_string', '') 1602 # No exception thrown. 1603 proto.optional_string = 'abc' 1604 1605 def testStringUTF8Serialization(self): 1606 proto = unittest_mset_pb2.TestMessageSet() 1607 extension_message = unittest_mset_pb2.TestMessageSetExtension2 1608 extension = extension_message.message_set_extension 1609 1610 test_utf8 = u'' 1611 test_utf8_bytes = test_utf8.encode('utf-8') 1612 1613 # 'Test' in another language, using UTF-8 charset. 1614 proto.Extensions[extension].str = test_utf8 1615 1616 # Serialize using the MessageSet wire format (this is specified in the 1617 # .proto file). 1618 serialized = proto.SerializeToString() 1619 1620 # Check byte size. 1621 self.assertEqual(proto.ByteSize(), len(serialized)) 1622 1623 raw = unittest_mset_pb2.RawMessageSet() 1624 raw.MergeFromString(serialized) 1625 1626 message2 = unittest_mset_pb2.TestMessageSetExtension2() 1627 1628 self.assertEqual(1, len(raw.item)) 1629 # Check that the type_id is the same as the tag ID in the .proto file. 1630 self.assertEqual(raw.item[0].type_id, 1547769) 1631 1632 # Check the actual bytes on the wire. 1633 self.assertTrue( 1634 raw.item[0].message.endswith(test_utf8_bytes)) 1635 message2.MergeFromString(raw.item[0].message) 1636 1637 self.assertEqual(type(message2.str), unicode) 1638 self.assertEqual(message2.str, test_utf8) 1639 1640 # The pure Python API throws an exception on MergeFromString(), 1641 # if any of the string fields of the message can't be UTF-8 decoded. 1642 # The C++ implementation of the API has no way to check that on 1643 # MergeFromString and thus has no way to throw the exception. 1644 # 1645 # The pure Python API always returns objects of type 'unicode' (UTF-8 1646 # encoded), or 'str' (in 7 bit ASCII). 1647 bytes = raw.item[0].message.replace( 1648 test_utf8_bytes, len(test_utf8_bytes) * '\xff') 1649 1650 unicode_decode_failed = False 1651 try: 1652 message2.MergeFromString(bytes) 1653 except UnicodeDecodeError as e: 1654 unicode_decode_failed = True 1655 string_field = message2.str 1656 self.assertTrue(unicode_decode_failed or type(string_field) == str) 1657 1658 def testEmptyNestedMessage(self): 1659 proto = unittest_pb2.TestAllTypes() 1660 proto.optional_nested_message.MergeFrom( 1661 unittest_pb2.TestAllTypes.NestedMessage()) 1662 self.assertTrue(proto.HasField('optional_nested_message')) 1663 1664 proto = unittest_pb2.TestAllTypes() 1665 proto.optional_nested_message.CopyFrom( 1666 unittest_pb2.TestAllTypes.NestedMessage()) 1667 self.assertTrue(proto.HasField('optional_nested_message')) 1668 1669 proto = unittest_pb2.TestAllTypes() 1670 proto.optional_nested_message.MergeFromString('') 1671 self.assertTrue(proto.HasField('optional_nested_message')) 1672 1673 proto = unittest_pb2.TestAllTypes() 1674 proto.optional_nested_message.ParseFromString('') 1675 self.assertTrue(proto.HasField('optional_nested_message')) 1676 1677 serialized = proto.SerializeToString() 1678 proto2 = unittest_pb2.TestAllTypes() 1679 proto2.MergeFromString(serialized) 1680 self.assertTrue(proto2.HasField('optional_nested_message')) 1681 1682 def testSetInParent(self): 1683 proto = unittest_pb2.TestAllTypes() 1684 self.assertFalse(proto.HasField('optionalgroup')) 1685 proto.optionalgroup.SetInParent() 1686 self.assertTrue(proto.HasField('optionalgroup')) 1687 1688 1689 # Since we had so many tests for protocol buffer equality, we broke these out 1690 # into separate TestCase classes. 1691 1692 1693 class TestAllTypesEqualityTest(unittest.TestCase): 1694 1695 def setUp(self): 1696 self.first_proto = unittest_pb2.TestAllTypes() 1697 self.second_proto = unittest_pb2.TestAllTypes() 1698 1699 def testNotHashable(self): 1700 self.assertRaises(TypeError, hash, self.first_proto) 1701 1702 def testSelfEquality(self): 1703 self.assertEqual(self.first_proto, self.first_proto) 1704 1705 def testEmptyProtosEqual(self): 1706 self.assertEqual(self.first_proto, self.second_proto) 1707 1708 1709 class FullProtosEqualityTest(unittest.TestCase): 1710 1711 """Equality tests using completely-full protos as a starting point.""" 1712 1713 def setUp(self): 1714 self.first_proto = unittest_pb2.TestAllTypes() 1715 self.second_proto = unittest_pb2.TestAllTypes() 1716 test_util.SetAllFields(self.first_proto) 1717 test_util.SetAllFields(self.second_proto) 1718 1719 def testNotHashable(self): 1720 self.assertRaises(TypeError, hash, self.first_proto) 1721 1722 def testNoneNotEqual(self): 1723 self.assertNotEqual(self.first_proto, None) 1724 self.assertNotEqual(None, self.second_proto) 1725 1726 def testNotEqualToOtherMessage(self): 1727 third_proto = unittest_pb2.TestRequired() 1728 self.assertNotEqual(self.first_proto, third_proto) 1729 self.assertNotEqual(third_proto, self.second_proto) 1730 1731 def testAllFieldsFilledEquality(self): 1732 self.assertEqual(self.first_proto, self.second_proto) 1733 1734 def testNonRepeatedScalar(self): 1735 # Nonrepeated scalar field change should cause inequality. 1736 self.first_proto.optional_int32 += 1 1737 self.assertNotEqual(self.first_proto, self.second_proto) 1738 # ...as should clearing a field. 1739 self.first_proto.ClearField('optional_int32') 1740 self.assertNotEqual(self.first_proto, self.second_proto) 1741 1742 def testNonRepeatedComposite(self): 1743 # Change a nonrepeated composite field. 1744 self.first_proto.optional_nested_message.bb += 1 1745 self.assertNotEqual(self.first_proto, self.second_proto) 1746 self.first_proto.optional_nested_message.bb -= 1 1747 self.assertEqual(self.first_proto, self.second_proto) 1748 # Clear a field in the nested message. 1749 self.first_proto.optional_nested_message.ClearField('bb') 1750 self.assertNotEqual(self.first_proto, self.second_proto) 1751 self.first_proto.optional_nested_message.bb = ( 1752 self.second_proto.optional_nested_message.bb) 1753 self.assertEqual(self.first_proto, self.second_proto) 1754 # Remove the nested message entirely. 1755 self.first_proto.ClearField('optional_nested_message') 1756 self.assertNotEqual(self.first_proto, self.second_proto) 1757 1758 def testRepeatedScalar(self): 1759 # Change a repeated scalar field. 1760 self.first_proto.repeated_int32.append(5) 1761 self.assertNotEqual(self.first_proto, self.second_proto) 1762 self.first_proto.ClearField('repeated_int32') 1763 self.assertNotEqual(self.first_proto, self.second_proto) 1764 1765 def testRepeatedComposite(self): 1766 # Change value within a repeated composite field. 1767 self.first_proto.repeated_nested_message[0].bb += 1 1768 self.assertNotEqual(self.first_proto, self.second_proto) 1769 self.first_proto.repeated_nested_message[0].bb -= 1 1770 self.assertEqual(self.first_proto, self.second_proto) 1771 # Add a value to a repeated composite field. 1772 self.first_proto.repeated_nested_message.add() 1773 self.assertNotEqual(self.first_proto, self.second_proto) 1774 self.second_proto.repeated_nested_message.add() 1775 self.assertEqual(self.first_proto, self.second_proto) 1776 1777 def testNonRepeatedScalarHasBits(self): 1778 # Ensure that we test "has" bits as well as value for 1779 # nonrepeated scalar field. 1780 self.first_proto.ClearField('optional_int32') 1781 self.second_proto.optional_int32 = 0 1782 self.assertNotEqual(self.first_proto, self.second_proto) 1783 1784 def testNonRepeatedCompositeHasBits(self): 1785 # Ensure that we test "has" bits as well as value for 1786 # nonrepeated composite field. 1787 self.first_proto.ClearField('optional_nested_message') 1788 self.second_proto.optional_nested_message.ClearField('bb') 1789 self.assertNotEqual(self.first_proto, self.second_proto) 1790 self.first_proto.optional_nested_message.bb = 0 1791 self.first_proto.optional_nested_message.ClearField('bb') 1792 self.assertEqual(self.first_proto, self.second_proto) 1793 1794 1795 class ExtensionEqualityTest(unittest.TestCase): 1796 1797 def testExtensionEquality(self): 1798 first_proto = unittest_pb2.TestAllExtensions() 1799 second_proto = unittest_pb2.TestAllExtensions() 1800 self.assertEqual(first_proto, second_proto) 1801 test_util.SetAllExtensions(first_proto) 1802 self.assertNotEqual(first_proto, second_proto) 1803 test_util.SetAllExtensions(second_proto) 1804 self.assertEqual(first_proto, second_proto) 1805 1806 # Ensure that we check value equality. 1807 first_proto.Extensions[unittest_pb2.optional_int32_extension] += 1 1808 self.assertNotEqual(first_proto, second_proto) 1809 first_proto.Extensions[unittest_pb2.optional_int32_extension] -= 1 1810 self.assertEqual(first_proto, second_proto) 1811 1812 # Ensure that we also look at "has" bits. 1813 first_proto.ClearExtension(unittest_pb2.optional_int32_extension) 1814 second_proto.Extensions[unittest_pb2.optional_int32_extension] = 0 1815 self.assertNotEqual(first_proto, second_proto) 1816 first_proto.Extensions[unittest_pb2.optional_int32_extension] = 0 1817 self.assertEqual(first_proto, second_proto) 1818 1819 # Ensure that differences in cached values 1820 # don't matter if "has" bits are both false. 1821 first_proto = unittest_pb2.TestAllExtensions() 1822 second_proto = unittest_pb2.TestAllExtensions() 1823 self.assertEqual( 1824 0, first_proto.Extensions[unittest_pb2.optional_int32_extension]) 1825 self.assertEqual(first_proto, second_proto) 1826 1827 1828 class MutualRecursionEqualityTest(unittest.TestCase): 1829 1830 def testEqualityWithMutualRecursion(self): 1831 first_proto = unittest_pb2.TestMutualRecursionA() 1832 second_proto = unittest_pb2.TestMutualRecursionA() 1833 self.assertEqual(first_proto, second_proto) 1834 first_proto.bb.a.bb.optional_int32 = 23 1835 self.assertNotEqual(first_proto, second_proto) 1836 second_proto.bb.a.bb.optional_int32 = 23 1837 self.assertEqual(first_proto, second_proto) 1838 1839 1840 class ByteSizeTest(unittest.TestCase): 1841 1842 def setUp(self): 1843 self.proto = unittest_pb2.TestAllTypes() 1844 self.extended_proto = more_extensions_pb2.ExtendedMessage() 1845 self.packed_proto = unittest_pb2.TestPackedTypes() 1846 self.packed_extended_proto = unittest_pb2.TestPackedExtensions() 1847 1848 def Size(self): 1849 return self.proto.ByteSize() 1850 1851 def testEmptyMessage(self): 1852 self.assertEqual(0, self.proto.ByteSize()) 1853 1854 def testSizedOnKwargs(self): 1855 # Use a separate message to ensure testing right after creation. 1856 proto = unittest_pb2.TestAllTypes() 1857 self.assertEqual(0, proto.ByteSize()) 1858 proto_kwargs = unittest_pb2.TestAllTypes(optional_int64 = 1) 1859 # One byte for the tag, one to encode varint 1. 1860 self.assertEqual(2, proto_kwargs.ByteSize()) 1861 1862 def testVarints(self): 1863 def Test(i, expected_varint_size): 1864 self.proto.Clear() 1865 self.proto.optional_int64 = i 1866 # Add one to the varint size for the tag info 1867 # for tag 1. 1868 self.assertEqual(expected_varint_size + 1, self.Size()) 1869 Test(0, 1) 1870 Test(1, 1) 1871 for i, num_bytes in zip(range(7, 63, 7), range(1, 10000)): 1872 Test((1 << i) - 1, num_bytes) 1873 Test(-1, 10) 1874 Test(-2, 10) 1875 Test(-(1 << 63), 10) 1876 1877 def testStrings(self): 1878 self.proto.optional_string = '' 1879 # Need one byte for tag info (tag #14), and one byte for length. 1880 self.assertEqual(2, self.Size()) 1881 1882 self.proto.optional_string = 'abc' 1883 # Need one byte for tag info (tag #14), and one byte for length. 1884 self.assertEqual(2 + len(self.proto.optional_string), self.Size()) 1885 1886 self.proto.optional_string = 'x' * 128 1887 # Need one byte for tag info (tag #14), and TWO bytes for length. 1888 self.assertEqual(3 + len(self.proto.optional_string), self.Size()) 1889 1890 def testOtherNumerics(self): 1891 self.proto.optional_fixed32 = 1234 1892 # One byte for tag and 4 bytes for fixed32. 1893 self.assertEqual(5, self.Size()) 1894 self.proto = unittest_pb2.TestAllTypes() 1895 1896 self.proto.optional_fixed64 = 1234 1897 # One byte for tag and 8 bytes for fixed64. 1898 self.assertEqual(9, self.Size()) 1899 self.proto = unittest_pb2.TestAllTypes() 1900 1901 self.proto.optional_float = 1.234 1902 # One byte for tag and 4 bytes for float. 1903 self.assertEqual(5, self.Size()) 1904 self.proto = unittest_pb2.TestAllTypes() 1905 1906 self.proto.optional_double = 1.234 1907 # One byte for tag and 8 bytes for float. 1908 self.assertEqual(9, self.Size()) 1909 self.proto = unittest_pb2.TestAllTypes() 1910 1911 self.proto.optional_sint32 = 64 1912 # One byte for tag and 2 bytes for zig-zag-encoded 64. 1913 self.assertEqual(3, self.Size()) 1914 self.proto = unittest_pb2.TestAllTypes() 1915 1916 def testComposites(self): 1917 # 3 bytes. 1918 self.proto.optional_nested_message.bb = (1 << 14) 1919 # Plus one byte for bb tag. 1920 # Plus 1 byte for optional_nested_message serialized size. 1921 # Plus two bytes for optional_nested_message tag. 1922 self.assertEqual(3 + 1 + 1 + 2, self.Size()) 1923 1924 def testGroups(self): 1925 # 4 bytes. 1926 self.proto.optionalgroup.a = (1 << 21) 1927 # Plus two bytes for |a| tag. 1928 # Plus 2 * two bytes for START_GROUP and END_GROUP tags. 1929 self.assertEqual(4 + 2 + 2*2, self.Size()) 1930 1931 def testRepeatedScalars(self): 1932 self.proto.repeated_int32.append(10) # 1 byte. 1933 self.proto.repeated_int32.append(128) # 2 bytes. 1934 # Also need 2 bytes for each entry for tag. 1935 self.assertEqual(1 + 2 + 2*2, self.Size()) 1936 1937 def testRepeatedScalarsExtend(self): 1938 self.proto.repeated_int32.extend([10, 128]) # 3 bytes. 1939 # Also need 2 bytes for each entry for tag. 1940 self.assertEqual(1 + 2 + 2*2, self.Size()) 1941 1942 def testRepeatedScalarsRemove(self): 1943 self.proto.repeated_int32.append(10) # 1 byte. 1944 self.proto.repeated_int32.append(128) # 2 bytes. 1945 # Also need 2 bytes for each entry for tag. 1946 self.assertEqual(1 + 2 + 2*2, self.Size()) 1947 self.proto.repeated_int32.remove(128) 1948 self.assertEqual(1 + 2, self.Size()) 1949 1950 def testRepeatedComposites(self): 1951 # Empty message. 2 bytes tag plus 1 byte length. 1952 foreign_message_0 = self.proto.repeated_nested_message.add() 1953 # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 1954 foreign_message_1 = self.proto.repeated_nested_message.add() 1955 foreign_message_1.bb = 7 1956 self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size()) 1957 1958 def testRepeatedCompositesDelete(self): 1959 # Empty message. 2 bytes tag plus 1 byte length. 1960 foreign_message_0 = self.proto.repeated_nested_message.add() 1961 # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 1962 foreign_message_1 = self.proto.repeated_nested_message.add() 1963 foreign_message_1.bb = 9 1964 self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size()) 1965 1966 # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 1967 del self.proto.repeated_nested_message[0] 1968 self.assertEqual(2 + 1 + 1 + 1, self.Size()) 1969 1970 # Now add a new message. 1971 foreign_message_2 = self.proto.repeated_nested_message.add() 1972 foreign_message_2.bb = 12 1973 1974 # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 1975 # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 1976 self.assertEqual(2 + 1 + 1 + 1 + 2 + 1 + 1 + 1, self.Size()) 1977 1978 # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int. 1979 del self.proto.repeated_nested_message[1] 1980 self.assertEqual(2 + 1 + 1 + 1, self.Size()) 1981 1982 del self.proto.repeated_nested_message[0] 1983 self.assertEqual(0, self.Size()) 1984 1985 def testRepeatedGroups(self): 1986 # 2-byte START_GROUP plus 2-byte END_GROUP. 1987 group_0 = self.proto.repeatedgroup.add() 1988 # 2-byte START_GROUP plus 2-byte |a| tag + 1-byte |a| 1989 # plus 2-byte END_GROUP. 1990 group_1 = self.proto.repeatedgroup.add() 1991 group_1.a = 7 1992 self.assertEqual(2 + 2 + 2 + 2 + 1 + 2, self.Size()) 1993 1994 def testExtensions(self): 1995 proto = unittest_pb2.TestAllExtensions() 1996 self.assertEqual(0, proto.ByteSize()) 1997 extension = unittest_pb2.optional_int32_extension # Field #1, 1 byte. 1998 proto.Extensions[extension] = 23 1999 # 1 byte for tag, 1 byte for value. 2000 self.assertEqual(2, proto.ByteSize()) 2001 2002 def testCacheInvalidationForNonrepeatedScalar(self): 2003 # Test non-extension. 2004 self.proto.optional_int32 = 1 2005 self.assertEqual(2, self.proto.ByteSize()) 2006 self.proto.optional_int32 = 128 2007 self.assertEqual(3, self.proto.ByteSize()) 2008 self.proto.ClearField('optional_int32') 2009 self.assertEqual(0, self.proto.ByteSize()) 2010 2011 # Test within extension. 2012 extension = more_extensions_pb2.optional_int_extension 2013 self.extended_proto.Extensions[extension] = 1 2014 self.assertEqual(2, self.extended_proto.ByteSize()) 2015 self.extended_proto.Extensions[extension] = 128 2016 self.assertEqual(3, self.extended_proto.ByteSize()) 2017 self.extended_proto.ClearExtension(extension) 2018 self.assertEqual(0, self.extended_proto.ByteSize()) 2019 2020 def testCacheInvalidationForRepeatedScalar(self): 2021 # Test non-extension. 2022 self.proto.repeated_int32.append(1) 2023 self.assertEqual(3, self.proto.ByteSize()) 2024 self.proto.repeated_int32.append(1) 2025 self.assertEqual(6, self.proto.ByteSize()) 2026 self.proto.repeated_int32[1] = 128 2027 self.assertEqual(7, self.proto.ByteSize()) 2028 self.proto.ClearField('repeated_int32') 2029 self.assertEqual(0, self.proto.ByteSize()) 2030 2031 # Test within extension. 2032 extension = more_extensions_pb2.repeated_int_extension 2033 repeated = self.extended_proto.Extensions[extension] 2034 repeated.append(1) 2035 self.assertEqual(2, self.extended_proto.ByteSize()) 2036 repeated.append(1) 2037 self.assertEqual(4, self.extended_proto.ByteSize()) 2038 repeated[1] = 128 2039 self.assertEqual(5, self.extended_proto.ByteSize()) 2040 self.extended_proto.ClearExtension(extension) 2041 self.assertEqual(0, self.extended_proto.ByteSize()) 2042 2043 def testCacheInvalidationForNonrepeatedMessage(self): 2044 # Test non-extension. 2045 self.proto.optional_foreign_message.c = 1 2046 self.assertEqual(5, self.proto.ByteSize()) 2047 self.proto.optional_foreign_message.c = 128 2048 self.assertEqual(6, self.proto.ByteSize()) 2049 self.proto.optional_foreign_message.ClearField('c') 2050 self.assertEqual(3, self.proto.ByteSize()) 2051 self.proto.ClearField('optional_foreign_message') 2052 self.assertEqual(0, self.proto.ByteSize()) 2053 2054 if api_implementation.Type() == 'python': 2055 # This is only possible in pure-Python implementation of the API. 2056 child = self.proto.optional_foreign_message 2057 self.proto.ClearField('optional_foreign_message') 2058 child.c = 128 2059 self.assertEqual(0, self.proto.ByteSize()) 2060 2061 # Test within extension. 2062 extension = more_extensions_pb2.optional_message_extension 2063 child = self.extended_proto.Extensions[extension] 2064 self.assertEqual(0, self.extended_proto.ByteSize()) 2065 child.foreign_message_int = 1 2066 self.assertEqual(4, self.extended_proto.ByteSize()) 2067 child.foreign_message_int = 128 2068 self.assertEqual(5, self.extended_proto.ByteSize()) 2069 self.extended_proto.ClearExtension(extension) 2070 self.assertEqual(0, self.extended_proto.ByteSize()) 2071 2072 def testCacheInvalidationForRepeatedMessage(self): 2073 # Test non-extension. 2074 child0 = self.proto.repeated_foreign_message.add() 2075 self.assertEqual(3, self.proto.ByteSize()) 2076 self.proto.repeated_foreign_message.add() 2077 self.assertEqual(6, self.proto.ByteSize()) 2078 child0.c = 1 2079 self.assertEqual(8, self.proto.ByteSize()) 2080 self.proto.ClearField('repeated_foreign_message') 2081 self.assertEqual(0, self.proto.ByteSize()) 2082 2083 # Test within extension. 2084 extension = more_extensions_pb2.repeated_message_extension 2085 child_list = self.extended_proto.Extensions[extension] 2086 child0 = child_list.add() 2087 self.assertEqual(2, self.extended_proto.ByteSize()) 2088 child_list.add() 2089 self.assertEqual(4, self.extended_proto.ByteSize()) 2090 child0.foreign_message_int = 1 2091 self.assertEqual(6, self.extended_proto.ByteSize()) 2092 child0.ClearField('foreign_message_int') 2093 self.assertEqual(4, self.extended_proto.ByteSize()) 2094 self.extended_proto.ClearExtension(extension) 2095 self.assertEqual(0, self.extended_proto.ByteSize()) 2096 2097 def testPackedRepeatedScalars(self): 2098 self.assertEqual(0, self.packed_proto.ByteSize()) 2099 2100 self.packed_proto.packed_int32.append(10) # 1 byte. 2101 self.packed_proto.packed_int32.append(128) # 2 bytes. 2102 # The tag is 2 bytes (the field number is 90), and the varint 2103 # storing the length is 1 byte. 2104 int_size = 1 + 2 + 3 2105 self.assertEqual(int_size, self.packed_proto.ByteSize()) 2106 2107 self.packed_proto.packed_double.append(4.2) # 8 bytes 2108 self.packed_proto.packed_double.append(3.25) # 8 bytes 2109 # 2 more tag bytes, 1 more length byte. 2110 double_size = 8 + 8 + 3 2111 self.assertEqual(int_size+double_size, self.packed_proto.ByteSize()) 2112 2113 self.packed_proto.ClearField('packed_int32') 2114 self.assertEqual(double_size, self.packed_proto.ByteSize()) 2115 2116 def testPackedExtensions(self): 2117 self.assertEqual(0, self.packed_extended_proto.ByteSize()) 2118 extension = self.packed_extended_proto.Extensions[ 2119 unittest_pb2.packed_fixed32_extension] 2120 extension.extend([1, 2, 3, 4]) # 16 bytes 2121 # Tag is 3 bytes. 2122 self.assertEqual(19, self.packed_extended_proto.ByteSize()) 2123 2124 2125 # Issues to be sure to cover include: 2126 # * Handling of unrecognized tags ("uninterpreted_bytes"). 2127 # * Handling of MessageSets. 2128 # * Consistent ordering of tags in the wire format, 2129 # including ordering between extensions and non-extension 2130 # fields. 2131 # * Consistent serialization of negative numbers, especially 2132 # negative int32s. 2133 # * Handling of empty submessages (with and without "has" 2134 # bits set). 2135 2136 class SerializationTest(unittest.TestCase): 2137 2138 def testSerializeEmtpyMessage(self): 2139 first_proto = unittest_pb2.TestAllTypes() 2140 second_proto = unittest_pb2.TestAllTypes() 2141 serialized = first_proto.SerializeToString() 2142 self.assertEqual(first_proto.ByteSize(), len(serialized)) 2143 second_proto.MergeFromString(serialized) 2144 self.assertEqual(first_proto, second_proto) 2145 2146 def testSerializeAllFields(self): 2147 first_proto = unittest_pb2.TestAllTypes() 2148 second_proto = unittest_pb2.TestAllTypes() 2149 test_util.SetAllFields(first_proto) 2150 serialized = first_proto.SerializeToString() 2151 self.assertEqual(first_proto.ByteSize(), len(serialized)) 2152 second_proto.MergeFromString(serialized) 2153 self.assertEqual(first_proto, second_proto) 2154 2155 def testSerializeAllExtensions(self): 2156 first_proto = unittest_pb2.TestAllExtensions() 2157 second_proto = unittest_pb2.TestAllExtensions() 2158 test_util.SetAllExtensions(first_proto) 2159 serialized = first_proto.SerializeToString() 2160 second_proto.MergeFromString(serialized) 2161 self.assertEqual(first_proto, second_proto) 2162 2163 def testSerializeNegativeValues(self): 2164 first_proto = unittest_pb2.TestAllTypes() 2165 2166 first_proto.optional_int32 = -1 2167 first_proto.optional_int64 = -(2 << 40) 2168 first_proto.optional_sint32 = -3 2169 first_proto.optional_sint64 = -(4 << 40) 2170 first_proto.optional_sfixed32 = -5 2171 first_proto.optional_sfixed64 = -(6 << 40) 2172 2173 second_proto = unittest_pb2.TestAllTypes.FromString( 2174 first_proto.SerializeToString()) 2175 2176 self.assertEqual(first_proto, second_proto) 2177 2178 def testParseTruncated(self): 2179 # This test is only applicable for the Python implementation of the API. 2180 if api_implementation.Type() != 'python': 2181 return 2182 2183 first_proto = unittest_pb2.TestAllTypes() 2184 test_util.SetAllFields(first_proto) 2185 serialized = first_proto.SerializeToString() 2186 2187 for truncation_point in xrange(len(serialized) + 1): 2188 try: 2189 second_proto = unittest_pb2.TestAllTypes() 2190 unknown_fields = unittest_pb2.TestEmptyMessage() 2191 pos = second_proto._InternalParse(serialized, 0, truncation_point) 2192 # If we didn't raise an error then we read exactly the amount expected. 2193 self.assertEqual(truncation_point, pos) 2194 2195 # Parsing to unknown fields should not throw if parsing to known fields 2196 # did not. 2197 try: 2198 pos2 = unknown_fields._InternalParse(serialized, 0, truncation_point) 2199 self.assertEqual(truncation_point, pos2) 2200 except message.DecodeError: 2201 self.fail('Parsing unknown fields failed when parsing known fields ' 2202 'did not.') 2203 except message.DecodeError: 2204 # Parsing unknown fields should also fail. 2205 self.assertRaises(message.DecodeError, unknown_fields._InternalParse, 2206 serialized, 0, truncation_point) 2207 2208 def testCanonicalSerializationOrder(self): 2209 proto = more_messages_pb2.OutOfOrderFields() 2210 # These are also their tag numbers. Even though we're setting these in 2211 # reverse-tag order AND they're listed in reverse tag-order in the .proto 2212 # file, they should nonetheless be serialized in tag order. 2213 proto.optional_sint32 = 5 2214 proto.Extensions[more_messages_pb2.optional_uint64] = 4 2215 proto.optional_uint32 = 3 2216 proto.Extensions[more_messages_pb2.optional_int64] = 2 2217 proto.optional_int32 = 1 2218 serialized = proto.SerializeToString() 2219 self.assertEqual(proto.ByteSize(), len(serialized)) 2220 d = _MiniDecoder(serialized) 2221 ReadTag = d.ReadFieldNumberAndWireType 2222 self.assertEqual((1, wire_format.WIRETYPE_VARINT), ReadTag()) 2223 self.assertEqual(1, d.ReadInt32()) 2224 self.assertEqual((2, wire_format.WIRETYPE_VARINT), ReadTag()) 2225 self.assertEqual(2, d.ReadInt64()) 2226 self.assertEqual((3, wire_format.WIRETYPE_VARINT), ReadTag()) 2227 self.assertEqual(3, d.ReadUInt32()) 2228 self.assertEqual((4, wire_format.WIRETYPE_VARINT), ReadTag()) 2229 self.assertEqual(4, d.ReadUInt64()) 2230 self.assertEqual((5, wire_format.WIRETYPE_VARINT), ReadTag()) 2231 self.assertEqual(5, d.ReadSInt32()) 2232 2233 def testCanonicalSerializationOrderSameAsCpp(self): 2234 # Copy of the same test we use for C++. 2235 proto = unittest_pb2.TestFieldOrderings() 2236 test_util.SetAllFieldsAndExtensions(proto) 2237 serialized = proto.SerializeToString() 2238 test_util.ExpectAllFieldsAndExtensionsInOrder(serialized) 2239 2240 def testMergeFromStringWhenFieldsAlreadySet(self): 2241 first_proto = unittest_pb2.TestAllTypes() 2242 first_proto.repeated_string.append('foobar') 2243 first_proto.optional_int32 = 23 2244 first_proto.optional_nested_message.bb = 42 2245 serialized = first_proto.SerializeToString() 2246 2247 second_proto = unittest_pb2.TestAllTypes() 2248 second_proto.repeated_string.append('baz') 2249 second_proto.optional_int32 = 100 2250 second_proto.optional_nested_message.bb = 999 2251 2252 second_proto.MergeFromString(serialized) 2253 # Ensure that we append to repeated fields. 2254 self.assertEqual(['baz', 'foobar'], list(second_proto.repeated_string)) 2255 # Ensure that we overwrite nonrepeatd scalars. 2256 self.assertEqual(23, second_proto.optional_int32) 2257 # Ensure that we recursively call MergeFromString() on 2258 # submessages. 2259 self.assertEqual(42, second_proto.optional_nested_message.bb) 2260 2261 def testMessageSetWireFormat(self): 2262 proto = unittest_mset_pb2.TestMessageSet() 2263 extension_message1 = unittest_mset_pb2.TestMessageSetExtension1 2264 extension_message2 = unittest_mset_pb2.TestMessageSetExtension2 2265 extension1 = extension_message1.message_set_extension 2266 extension2 = extension_message2.message_set_extension 2267 proto.Extensions[extension1].i = 123 2268 proto.Extensions[extension2].str = 'foo' 2269 2270 # Serialize using the MessageSet wire format (this is specified in the 2271 # .proto file). 2272 serialized = proto.SerializeToString() 2273 2274 raw = unittest_mset_pb2.RawMessageSet() 2275 self.assertEqual(False, 2276 raw.DESCRIPTOR.GetOptions().message_set_wire_format) 2277 raw.MergeFromString(serialized) 2278 self.assertEqual(2, len(raw.item)) 2279 2280 message1 = unittest_mset_pb2.TestMessageSetExtension1() 2281 message1.MergeFromString(raw.item[0].message) 2282 self.assertEqual(123, message1.i) 2283 2284 message2 = unittest_mset_pb2.TestMessageSetExtension2() 2285 message2.MergeFromString(raw.item[1].message) 2286 self.assertEqual('foo', message2.str) 2287 2288 # Deserialize using the MessageSet wire format. 2289 proto2 = unittest_mset_pb2.TestMessageSet() 2290 proto2.MergeFromString(serialized) 2291 self.assertEqual(123, proto2.Extensions[extension1].i) 2292 self.assertEqual('foo', proto2.Extensions[extension2].str) 2293 2294 # Check byte size. 2295 self.assertEqual(proto2.ByteSize(), len(serialized)) 2296 self.assertEqual(proto.ByteSize(), len(serialized)) 2297 2298 def testMessageSetWireFormatUnknownExtension(self): 2299 # Create a message using the message set wire format with an unknown 2300 # message. 2301 raw = unittest_mset_pb2.RawMessageSet() 2302 2303 # Add an item. 2304 item = raw.item.add() 2305 item.type_id = 1545008 2306 extension_message1 = unittest_mset_pb2.TestMessageSetExtension1 2307 message1 = unittest_mset_pb2.TestMessageSetExtension1() 2308 message1.i = 12345 2309 item.message = message1.SerializeToString() 2310 2311 # Add a second, unknown extension. 2312 item = raw.item.add() 2313 item.type_id = 1545009 2314 extension_message1 = unittest_mset_pb2.TestMessageSetExtension1 2315 message1 = unittest_mset_pb2.TestMessageSetExtension1() 2316 message1.i = 12346 2317 item.message = message1.SerializeToString() 2318 2319 # Add another unknown extension. 2320 item = raw.item.add() 2321 item.type_id = 1545010 2322 message1 = unittest_mset_pb2.TestMessageSetExtension2() 2323 message1.str = 'foo' 2324 item.message = message1.SerializeToString() 2325 2326 serialized = raw.SerializeToString() 2327 2328 # Parse message using the message set wire format. 2329 proto = unittest_mset_pb2.TestMessageSet() 2330 proto.MergeFromString(serialized) 2331 2332 # Check that the message parsed well. 2333 extension_message1 = unittest_mset_pb2.TestMessageSetExtension1 2334 extension1 = extension_message1.message_set_extension 2335 self.assertEquals(12345, proto.Extensions[extension1].i) 2336 2337 def testUnknownFields(self): 2338 proto = unittest_pb2.TestAllTypes() 2339 test_util.SetAllFields(proto) 2340 2341 serialized = proto.SerializeToString() 2342 2343 # The empty message should be parsable with all of the fields 2344 # unknown. 2345 proto2 = unittest_pb2.TestEmptyMessage() 2346 2347 # Parsing this message should succeed. 2348 proto2.MergeFromString(serialized) 2349 2350 # Now test with a int64 field set. 2351 proto = unittest_pb2.TestAllTypes() 2352 proto.optional_int64 = 0x0fffffffffffffff 2353 serialized = proto.SerializeToString() 2354 # The empty message should be parsable with all of the fields 2355 # unknown. 2356 proto2 = unittest_pb2.TestEmptyMessage() 2357 # Parsing this message should succeed. 2358 proto2.MergeFromString(serialized) 2359 2360 def _CheckRaises(self, exc_class, callable_obj, exception): 2361 """This method checks if the excpetion type and message are as expected.""" 2362 try: 2363 callable_obj() 2364 except exc_class as ex: 2365 # Check if the exception message is the right one. 2366 self.assertEqual(exception, str(ex)) 2367 return 2368 else: 2369 raise self.failureException('%s not raised' % str(exc_class)) 2370 2371 def testSerializeUninitialized(self): 2372 proto = unittest_pb2.TestRequired() 2373 self._CheckRaises( 2374 message.EncodeError, 2375 proto.SerializeToString, 2376 'Message protobuf_unittest.TestRequired is missing required fields: ' 2377 'a,b,c') 2378 # Shouldn't raise exceptions. 2379 partial = proto.SerializePartialToString() 2380 2381 proto2 = unittest_pb2.TestRequired() 2382 self.assertFalse(proto2.HasField('a')) 2383 # proto2 ParseFromString does not check that required fields are set. 2384 proto2.ParseFromString(partial) 2385 self.assertFalse(proto2.HasField('a')) 2386 2387 proto.a = 1 2388 self._CheckRaises( 2389 message.EncodeError, 2390 proto.SerializeToString, 2391 'Message protobuf_unittest.TestRequired is missing required fields: b,c') 2392 # Shouldn't raise exceptions. 2393 partial = proto.SerializePartialToString() 2394 2395 proto.b = 2 2396 self._CheckRaises( 2397 message.EncodeError, 2398 proto.SerializeToString, 2399 'Message protobuf_unittest.TestRequired is missing required fields: c') 2400 # Shouldn't raise exceptions. 2401 partial = proto.SerializePartialToString() 2402 2403 proto.c = 3 2404 serialized = proto.SerializeToString() 2405 # Shouldn't raise exceptions. 2406 partial = proto.SerializePartialToString() 2407 2408 proto2 = unittest_pb2.TestRequired() 2409 proto2.MergeFromString(serialized) 2410 self.assertEqual(1, proto2.a) 2411 self.assertEqual(2, proto2.b) 2412 self.assertEqual(3, proto2.c) 2413 proto2.ParseFromString(partial) 2414 self.assertEqual(1, proto2.a) 2415 self.assertEqual(2, proto2.b) 2416 self.assertEqual(3, proto2.c) 2417 2418 def testSerializeUninitializedSubMessage(self): 2419 proto = unittest_pb2.TestRequiredForeign() 2420 2421 # Sub-message doesn't exist yet, so this succeeds. 2422 proto.SerializeToString() 2423 2424 proto.optional_message.a = 1 2425 self._CheckRaises( 2426 message.EncodeError, 2427 proto.SerializeToString, 2428 'Message protobuf_unittest.TestRequiredForeign ' 2429 'is missing required fields: ' 2430 'optional_message.b,optional_message.c') 2431 2432 proto.optional_message.b = 2 2433 proto.optional_message.c = 3 2434 proto.SerializeToString() 2435 2436 proto.repeated_message.add().a = 1 2437 proto.repeated_message.add().b = 2 2438 self._CheckRaises( 2439 message.EncodeError, 2440 proto.SerializeToString, 2441 'Message protobuf_unittest.TestRequiredForeign is missing required fields: ' 2442 'repeated_message[0].b,repeated_message[0].c,' 2443 'repeated_message[1].a,repeated_message[1].c') 2444 2445 proto.repeated_message[0].b = 2 2446 proto.repeated_message[0].c = 3 2447 proto.repeated_message[1].a = 1 2448 proto.repeated_message[1].c = 3 2449 proto.SerializeToString() 2450 2451 def testSerializeAllPackedFields(self): 2452 first_proto = unittest_pb2.TestPackedTypes() 2453 second_proto = unittest_pb2.TestPackedTypes() 2454 test_util.SetAllPackedFields(first_proto) 2455 serialized = first_proto.SerializeToString() 2456 self.assertEqual(first_proto.ByteSize(), len(serialized)) 2457 bytes_read = second_proto.MergeFromString(serialized) 2458 self.assertEqual(second_proto.ByteSize(), bytes_read) 2459 self.assertEqual(first_proto, second_proto) 2460 2461 def testSerializeAllPackedExtensions(self): 2462 first_proto = unittest_pb2.TestPackedExtensions() 2463 second_proto = unittest_pb2.TestPackedExtensions() 2464 test_util.SetAllPackedExtensions(first_proto) 2465 serialized = first_proto.SerializeToString() 2466 bytes_read = second_proto.MergeFromString(serialized) 2467 self.assertEqual(second_proto.ByteSize(), bytes_read) 2468 self.assertEqual(first_proto, second_proto) 2469 2470 def testMergePackedFromStringWhenSomeFieldsAlreadySet(self): 2471 first_proto = unittest_pb2.TestPackedTypes() 2472 first_proto.packed_int32.extend([1, 2]) 2473 first_proto.packed_double.append(3.0) 2474 serialized = first_proto.SerializeToString() 2475 2476 second_proto = unittest_pb2.TestPackedTypes() 2477 second_proto.packed_int32.append(3) 2478 second_proto.packed_double.extend([1.0, 2.0]) 2479 second_proto.packed_sint32.append(4) 2480 2481 second_proto.MergeFromString(serialized) 2482 self.assertEqual([3, 1, 2], second_proto.packed_int32) 2483 self.assertEqual([1.0, 2.0, 3.0], second_proto.packed_double) 2484 self.assertEqual([4], second_proto.packed_sint32) 2485 2486 def testPackedFieldsWireFormat(self): 2487 proto = unittest_pb2.TestPackedTypes() 2488 proto.packed_int32.extend([1, 2, 150, 3]) # 1 + 1 + 2 + 1 bytes 2489 proto.packed_double.extend([1.0, 1000.0]) # 8 + 8 bytes 2490 proto.packed_float.append(2.0) # 4 bytes, will be before double 2491 serialized = proto.SerializeToString() 2492 self.assertEqual(proto.ByteSize(), len(serialized)) 2493 d = _MiniDecoder(serialized) 2494 ReadTag = d.ReadFieldNumberAndWireType 2495 self.assertEqual((90, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag()) 2496 self.assertEqual(1+1+1+2, d.ReadInt32()) 2497 self.assertEqual(1, d.ReadInt32()) 2498 self.assertEqual(2, d.ReadInt32()) 2499 self.assertEqual(150, d.ReadInt32()) 2500 self.assertEqual(3, d.ReadInt32()) 2501 self.assertEqual((100, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag()) 2502 self.assertEqual(4, d.ReadInt32()) 2503 self.assertEqual(2.0, d.ReadFloat()) 2504 self.assertEqual((101, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag()) 2505 self.assertEqual(8+8, d.ReadInt32()) 2506 self.assertEqual(1.0, d.ReadDouble()) 2507 self.assertEqual(1000.0, d.ReadDouble()) 2508 self.assertTrue(d.EndOfStream()) 2509 2510 def testParsePackedFromUnpacked(self): 2511 unpacked = unittest_pb2.TestUnpackedTypes() 2512 test_util.SetAllUnpackedFields(unpacked) 2513 packed = unittest_pb2.TestPackedTypes() 2514 packed.MergeFromString(unpacked.SerializeToString()) 2515 expected = unittest_pb2.TestPackedTypes() 2516 test_util.SetAllPackedFields(expected) 2517 self.assertEqual(expected, packed) 2518 2519 def testParseUnpackedFromPacked(self): 2520 packed = unittest_pb2.TestPackedTypes() 2521 test_util.SetAllPackedFields(packed) 2522 unpacked = unittest_pb2.TestUnpackedTypes() 2523 unpacked.MergeFromString(packed.SerializeToString()) 2524 expected = unittest_pb2.TestUnpackedTypes() 2525 test_util.SetAllUnpackedFields(expected) 2526 self.assertEqual(expected, unpacked) 2527 2528 def testFieldNumbers(self): 2529 proto = unittest_pb2.TestAllTypes() 2530 self.assertEqual(unittest_pb2.TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1) 2531 self.assertEqual(unittest_pb2.TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1) 2532 self.assertEqual(unittest_pb2.TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16) 2533 self.assertEqual( 2534 unittest_pb2.TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18) 2535 self.assertEqual( 2536 unittest_pb2.TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21) 2537 self.assertEqual(unittest_pb2.TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31) 2538 self.assertEqual(unittest_pb2.TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46) 2539 self.assertEqual( 2540 unittest_pb2.TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48) 2541 self.assertEqual( 2542 unittest_pb2.TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51) 2543 2544 def testExtensionFieldNumbers(self): 2545 self.assertEqual(unittest_pb2.TestRequired.single.number, 1000) 2546 self.assertEqual(unittest_pb2.TestRequired.SINGLE_FIELD_NUMBER, 1000) 2547 self.assertEqual(unittest_pb2.TestRequired.multi.number, 1001) 2548 self.assertEqual(unittest_pb2.TestRequired.MULTI_FIELD_NUMBER, 1001) 2549 self.assertEqual(unittest_pb2.optional_int32_extension.number, 1) 2550 self.assertEqual(unittest_pb2.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1) 2551 self.assertEqual(unittest_pb2.optionalgroup_extension.number, 16) 2552 self.assertEqual(unittest_pb2.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16) 2553 self.assertEqual(unittest_pb2.optional_nested_message_extension.number, 18) 2554 self.assertEqual( 2555 unittest_pb2.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18) 2556 self.assertEqual(unittest_pb2.optional_nested_enum_extension.number, 21) 2557 self.assertEqual(unittest_pb2.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 2558 21) 2559 self.assertEqual(unittest_pb2.repeated_int32_extension.number, 31) 2560 self.assertEqual(unittest_pb2.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31) 2561 self.assertEqual(unittest_pb2.repeatedgroup_extension.number, 46) 2562 self.assertEqual(unittest_pb2.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46) 2563 self.assertEqual(unittest_pb2.repeated_nested_message_extension.number, 48) 2564 self.assertEqual( 2565 unittest_pb2.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48) 2566 self.assertEqual(unittest_pb2.repeated_nested_enum_extension.number, 51) 2567 self.assertEqual(unittest_pb2.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 2568 51) 2569 2570 def testInitKwargs(self): 2571 proto = unittest_pb2.TestAllTypes( 2572 optional_int32=1, 2573 optional_string='foo', 2574 optional_bool=True, 2575 optional_bytes='bar', 2576 optional_nested_message=unittest_pb2.TestAllTypes.NestedMessage(bb=1), 2577 optional_foreign_message=unittest_pb2.ForeignMessage(c=1), 2578 optional_nested_enum=unittest_pb2.TestAllTypes.FOO, 2579 optional_foreign_enum=unittest_pb2.FOREIGN_FOO, 2580 repeated_int32=[1, 2, 3]) 2581 self.assertTrue(proto.IsInitialized()) 2582 self.assertTrue(proto.HasField('optional_int32')) 2583 self.assertTrue(proto.HasField('optional_string')) 2584 self.assertTrue(proto.HasField('optional_bool')) 2585 self.assertTrue(proto.HasField('optional_bytes')) 2586 self.assertTrue(proto.HasField('optional_nested_message')) 2587 self.assertTrue(proto.HasField('optional_foreign_message')) 2588 self.assertTrue(proto.HasField('optional_nested_enum')) 2589 self.assertTrue(proto.HasField('optional_foreign_enum')) 2590 self.assertEqual(1, proto.optional_int32) 2591 self.assertEqual('foo', proto.optional_string) 2592 self.assertEqual(True, proto.optional_bool) 2593 self.assertEqual('bar', proto.optional_bytes) 2594 self.assertEqual(1, proto.optional_nested_message.bb) 2595 self.assertEqual(1, proto.optional_foreign_message.c) 2596 self.assertEqual(unittest_pb2.TestAllTypes.FOO, 2597 proto.optional_nested_enum) 2598 self.assertEqual(unittest_pb2.FOREIGN_FOO, proto.optional_foreign_enum) 2599 self.assertEqual([1, 2, 3], proto.repeated_int32) 2600 2601 def testInitArgsUnknownFieldName(self): 2602 def InitalizeEmptyMessageWithExtraKeywordArg(): 2603 unused_proto = unittest_pb2.TestEmptyMessage(unknown='unknown') 2604 self._CheckRaises(ValueError, 2605 InitalizeEmptyMessageWithExtraKeywordArg, 2606 'Protocol message has no "unknown" field.') 2607 2608 def testInitRequiredKwargs(self): 2609 proto = unittest_pb2.TestRequired(a=1, b=1, c=1) 2610 self.assertTrue(proto.IsInitialized()) 2611 self.assertTrue(proto.HasField('a')) 2612 self.assertTrue(proto.HasField('b')) 2613 self.assertTrue(proto.HasField('c')) 2614 self.assertTrue(not proto.HasField('dummy2')) 2615 self.assertEqual(1, proto.a) 2616 self.assertEqual(1, proto.b) 2617 self.assertEqual(1, proto.c) 2618 2619 def testInitRequiredForeignKwargs(self): 2620 proto = unittest_pb2.TestRequiredForeign( 2621 optional_message=unittest_pb2.TestRequired(a=1, b=1, c=1)) 2622 self.assertTrue(proto.IsInitialized()) 2623 self.assertTrue(proto.HasField('optional_message')) 2624 self.assertTrue(proto.optional_message.IsInitialized()) 2625 self.assertTrue(proto.optional_message.HasField('a')) 2626 self.assertTrue(proto.optional_message.HasField('b')) 2627 self.assertTrue(proto.optional_message.HasField('c')) 2628 self.assertTrue(not proto.optional_message.HasField('dummy2')) 2629 self.assertEqual(unittest_pb2.TestRequired(a=1, b=1, c=1), 2630 proto.optional_message) 2631 self.assertEqual(1, proto.optional_message.a) 2632 self.assertEqual(1, proto.optional_message.b) 2633 self.assertEqual(1, proto.optional_message.c) 2634 2635 def testInitRepeatedKwargs(self): 2636 proto = unittest_pb2.TestAllTypes(repeated_int32=[1, 2, 3]) 2637 self.assertTrue(proto.IsInitialized()) 2638 self.assertEqual(1, proto.repeated_int32[0]) 2639 self.assertEqual(2, proto.repeated_int32[1]) 2640 self.assertEqual(3, proto.repeated_int32[2]) 2641 2642 2643 class OptionsTest(unittest.TestCase): 2644 2645 def testMessageOptions(self): 2646 proto = unittest_mset_pb2.TestMessageSet() 2647 self.assertEqual(True, 2648 proto.DESCRIPTOR.GetOptions().message_set_wire_format) 2649 proto = unittest_pb2.TestAllTypes() 2650 self.assertEqual(False, 2651 proto.DESCRIPTOR.GetOptions().message_set_wire_format) 2652 2653 def testPackedOptions(self): 2654 proto = unittest_pb2.TestAllTypes() 2655 proto.optional_int32 = 1 2656 proto.optional_double = 3.0 2657 for field_descriptor, _ in proto.ListFields(): 2658 self.assertEqual(False, field_descriptor.GetOptions().packed) 2659 2660 proto = unittest_pb2.TestPackedTypes() 2661 proto.packed_int32.append(1) 2662 proto.packed_double.append(3.0) 2663 for field_descriptor, _ in proto.ListFields(): 2664 self.assertEqual(True, field_descriptor.GetOptions().packed) 2665 self.assertEqual(reflection._FieldDescriptor.LABEL_REPEATED, 2666 field_descriptor.label) 2667 2668 2669 2670 if __name__ == '__main__': 2671 unittest.main() 2672