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