mirror of
https://github.com/msgpack/msgpack-python.git
synced 2025-10-20 20:33:17 +00:00

fix wrong length when packing multibyte memoryviews in fallback add tests for memoryviews of different types and sizes and check contents of packed data
135 lines
2.9 KiB
Python
135 lines
2.9 KiB
Python
#!/usr/bin/env python
|
|
# coding: utf-8
|
|
|
|
|
|
from array import array
|
|
from msgpack import packb, unpackb
|
|
import sys
|
|
|
|
|
|
# For Python < 3:
|
|
# - array type only supports old buffer interface
|
|
# - array.frombytes is not available, must use deprecated array.fromstring
|
|
if sys.version_info[0] < 3:
|
|
def __memoryview(obj):
|
|
return memoryview(buffer(obj))
|
|
|
|
def __make_array(f, data):
|
|
a = array(f)
|
|
a.fromstring(data)
|
|
return a
|
|
|
|
def __get_data(a):
|
|
return a.tostring()
|
|
else:
|
|
__memoryview = memoryview
|
|
|
|
def __make_array(f, data):
|
|
a = array(f)
|
|
a.frombytes(data)
|
|
return a
|
|
|
|
def __get_data(a):
|
|
return a.tobytes()
|
|
|
|
|
|
def __run_test(format, nbytes, expected_header, expected_prefix, use_bin_type):
|
|
# create a new array
|
|
original_array = array(format)
|
|
original_array.fromlist([255] * (nbytes // original_array.itemsize))
|
|
original_data = __get_data(original_array)
|
|
view = __memoryview(original_array)
|
|
|
|
# pack, unpack, and reconstruct array
|
|
packed = packb(view, use_bin_type=use_bin_type)
|
|
unpacked = unpackb(packed)
|
|
reconstructed_array = __make_array(format, unpacked)
|
|
|
|
# check that we got the right amount of data
|
|
assert len(original_data) == nbytes
|
|
# check packed header
|
|
assert packed[:1] == expected_header
|
|
# check packed length prefix, if any
|
|
assert packed[1:1+len(expected_prefix)] == expected_prefix
|
|
# check packed data
|
|
assert packed[1+len(expected_prefix):] == original_data
|
|
# check array unpacked correctly
|
|
assert original_array == reconstructed_array
|
|
|
|
|
|
# -----------
|
|
# test fixstr
|
|
# -----------
|
|
|
|
|
|
def test_memoryview_byte_fixstr():
|
|
__run_test('B', 31, b'\xbf', b'', False)
|
|
|
|
|
|
def test_memoryview_float_fixstr():
|
|
__run_test('f', 28, b'\xbc', b'', False)
|
|
|
|
|
|
# ----------
|
|
# test str16
|
|
# ----------
|
|
|
|
|
|
def test_memoryview_byte_str16():
|
|
__run_test('B', 2**8, b'\xda', b'\x01\x00', False)
|
|
|
|
|
|
def test_memoryview_float_str16():
|
|
__run_test('f', 2**8, b'\xda', b'\x01\x00', False)
|
|
|
|
|
|
# ----------
|
|
# test str32
|
|
# ----------
|
|
|
|
|
|
def test_memoryview_byte_str32():
|
|
__run_test('B', 2**16, b'\xdb', b'\x00\x01\x00\x00', False)
|
|
|
|
|
|
def test_memoryview_float_str32():
|
|
__run_test('f', 2**16, b'\xdb', b'\x00\x01\x00\x00', False)
|
|
|
|
|
|
# ---------
|
|
# test bin8
|
|
# ---------
|
|
|
|
|
|
def test_memoryview_byte_bin8():
|
|
__run_test('B', 1, b'\xc4', b'\x01', True)
|
|
|
|
|
|
def test_memoryview_float_bin8():
|
|
__run_test('f', 4, b'\xc4', b'\x04', True)
|
|
|
|
|
|
# ----------
|
|
# test bin16
|
|
# ----------
|
|
|
|
|
|
def test_memoryview_byte_bin16():
|
|
__run_test('B', 2**8, b'\xc5', b'\x01\x00', True)
|
|
|
|
|
|
def test_memoryview_float_bin16():
|
|
__run_test('f', 2**8, b'\xc5', b'\x01\x00', True)
|
|
|
|
|
|
# ----------
|
|
# test bin32
|
|
# ----------
|
|
|
|
|
|
def test_memoryview_byte_bin32():
|
|
__run_test('B', 2**16, b'\xc6', b'\x00\x01\x00\x00', True)
|
|
|
|
|
|
def test_memoryview_float_bin32():
|
|
__run_test('f', 2**16, b'\xc6', b'\x00\x01\x00\x00', True)
|