# -*- coding: utf-8 -*- # Protocol Buffers - Google's data interchange format # Copyright 2008 Google Inc. All rights reserved. # # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file or at # https://developers.google.com/open-source/licenses/bsd """Test decoder.""" import io import unittest from google.protobuf.internal import decoder from google.protobuf.internal import testing_refleaks _INPUT_BYTES = b'\x84r\x12' _EXPECTED = (14596, 18) @testing_refleaks.TestCase class DecoderTest(unittest.TestCase): def test_decode_varint_bytes(self): (size, pos) = decoder._DecodeVarint(_INPUT_BYTES, 0) self.assertEqual(size, _EXPECTED[0]) self.assertEqual(pos, 2) (size, pos) = decoder._DecodeVarint(_INPUT_BYTES, 2) self.assertEqual(size, _EXPECTED[1]) self.assertEqual(pos, 3) def test_decode_varint_bytes_empty(self): with self.assertRaises(IndexError) as context: (size, pos) = decoder._DecodeVarint(b'', 0) self.assertIn('index out of range', str(context.exception)) def test_decode_varint_bytesio(self): index = 0 input_io = io.BytesIO(_INPUT_BYTES) while True: size = decoder._DecodeVarint(input_io) if size is None: break self.assertEqual(size, _EXPECTED[index]) index += 1 self.assertEqual(index, len(_EXPECTED)) def test_decode_varint_bytesio_empty(self): input_io = io.BytesIO(b'') size = decoder._DecodeVarint(input_io) self.assertEqual(size, None) def test_decode_unknown_group_field_too_many_levels(self): data = memoryview(b'\023' * 5_000_000) self.assertRaisesRegex( message.DecodeError, 'Error parsing message', decoder._DecodeUnknownField, data, 1, len(data), 1, wire_format.WIRETYPE_START_GROUP, ) if __name__ == '__main__': unittest.main()