15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#! /usr/bin/python 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Protocol Buffers - Google's data interchange format 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright 2008 Google Inc. All rights reserved. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# http://code.google.com/p/protobuf/ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Redistribution and use in source and binary forms, with or without 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# modification, are permitted provided that the following conditions are 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# met: 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Redistributions of source code must retain the above copyright 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# notice, this list of conditions and the following disclaimer. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Redistributions in binary form must reproduce the above 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# in the documentation and/or other materials provided with the 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# distribution. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# * Neither the name of Google Inc. nor the names of its 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# contributors may be used to endorse or promote products derived from 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# this software without specific prior written permission. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Test for google.protobuf.internal.wire_format.""" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__author__ = 'robinson@google.com (Will Robinson)' 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import unittest 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf import message 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from google.protobuf.internal import wire_format 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WireFormatTest(unittest.TestCase): 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testPackTag(self): 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number = 0xabc 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tag_type = 2 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual((field_number << 3) | tag_type, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wire_format.PackTag(field_number, tag_type)) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PackTag = wire_format.PackTag 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Number too high. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(message.EncodeError, PackTag, field_number, 6) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Number too low. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(message.EncodeError, PackTag, field_number, -1) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testUnpackTag(self): 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test field numbers that will require various varint sizes. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for expected_field_number in (1, 15, 16, 2047, 2048): 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for expected_wire_type in range(6): # Highest-numbered wiretype is 5. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, wire_type = wire_format.UnpackTag( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wire_format.PackTag(expected_field_number, expected_wire_type)) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(expected_field_number, field_number) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(expected_wire_type, wire_type) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, wire_format.UnpackTag, None) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, wire_format.UnpackTag, 'abc') 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, wire_format.UnpackTag, 0.0) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, wire_format.UnpackTag, object()) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testZigZagEncode(self): 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Z = wire_format.ZigZagEncode 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, Z(0)) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, Z(-1)) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, Z(1)) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3, Z(-2)) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(4, Z(2)) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0xfffffffe, Z(0x7fffffff)) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0xffffffff, Z(-0x80000000)) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0xfffffffffffffffe, Z(0x7fffffffffffffff)) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0xffffffffffffffff, Z(-0x8000000000000000)) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, Z, None) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, Z, 'abcd') 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, Z, 0.0) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, Z, object()) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testZigZagDecode(self): 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Z = wire_format.ZigZagDecode 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0, Z(0)) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(-1, Z(1)) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(1, Z(2)) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(-2, Z(3)) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2, Z(4)) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0x7fffffff, Z(0xfffffffe)) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(-0x80000000, Z(0xffffffff)) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(0x7fffffffffffffff, Z(0xfffffffffffffffe)) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(-0x8000000000000000, Z(0xffffffffffffffff)) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, Z, None) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, Z, 'abcd') 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, Z, 0.0) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(TypeError, Z, object()) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def NumericByteSizeTestHelper(self, byte_size_fn, value, expected_value_size): 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Use field numbers that cause various byte sizes for the tag information. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for field_number, tag_bytes in ((15, 1), (16, 2), (2047, 2), (2048, 3)): 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_size = expected_value_size + tag_bytes 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) actual_size = byte_size_fn(field_number, value) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(expected_size, actual_size, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'byte_size_fn: %s, field_number: %d, value: %r\n' 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'Expected: %d, Actual: %d'% ( 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte_size_fn, field_number, value, expected_size, actual_size)) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def testByteSizeFunctions(self): 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test all numeric *ByteSize() functions. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NUMERIC_ARGS = [ 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Int32ByteSize(). 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.Int32ByteSize, 0, 1], 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.Int32ByteSize, 127, 1], 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.Int32ByteSize, 128, 2], 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.Int32ByteSize, -1, 10], 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Int64ByteSize(). 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.Int64ByteSize, 0, 1], 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.Int64ByteSize, 127, 1], 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.Int64ByteSize, 128, 2], 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.Int64ByteSize, -1, 10], 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # UInt32ByteSize(). 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.UInt32ByteSize, 0, 1], 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.UInt32ByteSize, 127, 1], 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.UInt32ByteSize, 128, 2], 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.UInt32ByteSize, wire_format.UINT32_MAX, 5], 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # UInt64ByteSize(). 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.UInt64ByteSize, 0, 1], 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.UInt64ByteSize, 127, 1], 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.UInt64ByteSize, 128, 2], 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.UInt64ByteSize, wire_format.UINT64_MAX, 10], 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # SInt32ByteSize(). 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt32ByteSize, 0, 1], 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt32ByteSize, -1, 1], 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt32ByteSize, 1, 1], 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt32ByteSize, -63, 1], 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt32ByteSize, 63, 1], 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt32ByteSize, -64, 1], 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt32ByteSize, 64, 2], 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # SInt64ByteSize(). 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt64ByteSize, 0, 1], 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt64ByteSize, -1, 1], 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt64ByteSize, 1, 1], 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt64ByteSize, -63, 1], 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt64ByteSize, 63, 1], 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt64ByteSize, -64, 1], 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SInt64ByteSize, 64, 2], 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Fixed32ByteSize(). 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.Fixed32ByteSize, 0, 4], 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.Fixed32ByteSize, wire_format.UINT32_MAX, 4], 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Fixed64ByteSize(). 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.Fixed64ByteSize, 0, 8], 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.Fixed64ByteSize, wire_format.UINT64_MAX, 8], 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # SFixed32ByteSize(). 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SFixed32ByteSize, 0, 4], 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SFixed32ByteSize, wire_format.INT32_MIN, 4], 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SFixed32ByteSize, wire_format.INT32_MAX, 4], 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # SFixed64ByteSize(). 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SFixed64ByteSize, 0, 8], 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SFixed64ByteSize, wire_format.INT64_MIN, 8], 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.SFixed64ByteSize, wire_format.INT64_MAX, 8], 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # FloatByteSize(). 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.FloatByteSize, 0.0, 4], 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.FloatByteSize, 1000000000.0, 4], 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.FloatByteSize, -1000000000.0, 4], 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # DoubleByteSize(). 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.DoubleByteSize, 0.0, 8], 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.DoubleByteSize, 1000000000.0, 8], 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.DoubleByteSize, -1000000000.0, 8], 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # BoolByteSize(). 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.BoolByteSize, False, 1], 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.BoolByteSize, True, 1], 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # EnumByteSize(). 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.EnumByteSize, 0, 1], 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.EnumByteSize, 127, 1], 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.EnumByteSize, 128, 2], 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [wire_format.EnumByteSize, wire_format.UINT32_MAX, 5], 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ] 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for args in NUMERIC_ARGS: 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.NumericByteSizeTestHelper(*args) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test strings and bytes. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for byte_size_fn in (wire_format.StringByteSize, wire_format.BytesByteSize): 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 1 byte for tag, 1 byte for length, 3 bytes for contents. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(5, byte_size_fn(10, 'abc')) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2 bytes for tag, 1 byte for length, 3 bytes for contents. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(6, byte_size_fn(16, 'abc')) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2 bytes for tag, 2 bytes for length, 128 bytes for contents. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(132, byte_size_fn(16, 'a' * 128)) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test UTF-8 string byte size calculation. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 1 byte for tag, 1 byte for length, 8 bytes for content. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(10, wire_format.StringByteSize( 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5, unicode('\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82', 'utf-8'))) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MockMessage(object): 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, byte_size): 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.byte_size = byte_size 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def ByteSize(self): 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return self.byte_size 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_byte_size = 10 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_message = MockMessage(byte_size=message_byte_size) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test groups. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # (2 * 1) bytes for begin and end tags, plus message_byte_size. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2 + message_byte_size, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wire_format.GroupByteSize(1, mock_message)) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # (2 * 2) bytes for begin and end tags, plus message_byte_size. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(4 + message_byte_size, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wire_format.GroupByteSize(16, mock_message)) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test messages. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 1 byte for tag, plus 1 byte for length, plus contents. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(2 + mock_message.byte_size, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wire_format.MessageByteSize(1, mock_message)) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2 bytes for tag, plus 1 byte for length, plus contents. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(3 + mock_message.byte_size, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wire_format.MessageByteSize(16, mock_message)) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 2 bytes for tag, plus 2 bytes for length, plus contents. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_message.byte_size = 128 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(4 + mock_message.byte_size, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wire_format.MessageByteSize(16, mock_message)) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Test message set item byte size. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 4 bytes for tags, plus 1 byte for length, plus 1 byte for type_id, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # plus contents. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_message.byte_size = 10 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(mock_message.byte_size + 6, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wire_format.MessageSetItemByteSize(1, mock_message)) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 4 bytes for tags, plus 2 bytes for length, plus 1 byte for type_id, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # plus contents. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_message.byte_size = 128 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(mock_message.byte_size + 7, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wire_format.MessageSetItemByteSize(1, mock_message)) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 4 bytes for tags, plus 2 bytes for length, plus 2 byte for type_id, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # plus contents. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertEqual(mock_message.byte_size + 8, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wire_format.MessageSetItemByteSize(128, mock_message)) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Too-long varint. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self.assertRaises(message.EncodeError, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wire_format.UInt64ByteSize, 1, 1 << 128) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__': 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unittest.main() 254