msgpack-python/test/test_memoryview.py

114 lines
3 KiB
Python
Raw Normal View History

2015-11-12 11:49:19 +01:00
#!/usr/bin/env python
# coding: utf-8
from array import array
2015-11-12 11:49:19 +01:00
from msgpack import packb, unpackb
import sys
2015-11-12 11:49:19 +01:00
# 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:
2016-05-04 10:04:09 +02:00
def make_memoryview(obj):
return memoryview(buffer(obj))
2016-05-04 10:04:09 +02:00
def make_array(f, data):
a = array(f)
a.fromstring(data)
return a
2016-05-04 10:04:09 +02:00
def get_data(a):
return a.tostring()
else:
2016-05-04 10:04:09 +02:00
make_memoryview = memoryview
2016-05-04 10:04:09 +02:00
def make_array(f, data):
a = array(f)
a.frombytes(data)
return a
2016-05-04 10:04:09 +02:00
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))
2016-05-04 10:04:09 +02:00
original_data = get_data(original_array)
view = make_memoryview(original_array)
# pack, unpack, and reconstruct array
packed = packb(view, use_bin_type=use_bin_type)
unpacked = unpackb(packed)
2016-05-04 10:04:09 +02:00
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
2016-05-04 10:04:09 +02:00
def test_fixstr_from_byte():
2016-05-04 12:03:37 +02:00
__run_test('B', 1, b'\xa1', b'', False)
__run_test('B', 31, b'\xbf', b'', False)
2016-05-04 10:04:09 +02:00
def test_fixstr_from_float():
2016-05-04 12:03:37 +02:00
__run_test('f', 4, b'\xa4', b'', False)
__run_test('f', 28, b'\xbc', b'', False)
2016-05-04 10:04:09 +02:00
def test_str16_from_byte():
__run_test('B', 2**8, b'\xda', b'\x01\x00', False)
2016-05-04 12:03:37 +02:00
__run_test('B', 2**16-1, b'\xda', b'\xff\xff', False)
2016-05-04 10:04:09 +02:00
def test_str16_from_float():
__run_test('f', 2**8, b'\xda', b'\x01\x00', False)
2016-05-04 12:03:37 +02:00
__run_test('f', 2**16-4, b'\xda', b'\xff\xfc', False)
2016-05-04 10:04:09 +02:00
def test_str32_from_byte():
__run_test('B', 2**16, b'\xdb', b'\x00\x01\x00\x00', False)
2016-05-04 10:04:09 +02:00
def test_str32_from_float():
__run_test('f', 2**16, b'\xdb', b'\x00\x01\x00\x00', False)
2016-05-04 10:04:09 +02:00
def test_bin8_from_byte():
__run_test('B', 1, b'\xc4', b'\x01', True)
2016-05-04 12:03:37 +02:00
__run_test('B', 2**8-1, b'\xc4', b'\xff', True)
2016-05-04 10:04:09 +02:00
def test_bin8_from_float():
__run_test('f', 4, b'\xc4', b'\x04', True)
2016-05-04 12:03:37 +02:00
__run_test('f', 2**8-4, b'\xc4', b'\xfc', True)
2016-05-04 10:04:09 +02:00
def test_bin16_from_byte():
__run_test('B', 2**8, b'\xc5', b'\x01\x00', True)
2016-05-04 12:03:37 +02:00
__run_test('B', 2**16-1, b'\xc5', b'\xff\xff', True)
2016-05-04 10:04:09 +02:00
def test_bin16_from_float():
__run_test('f', 2**8, b'\xc5', b'\x01\x00', True)
2016-05-04 12:03:37 +02:00
__run_test('f', 2**16-4, b'\xc5', b'\xff\xfc', True)
2016-05-04 10:04:09 +02:00
def test_bin32_from_byte():
__run_test('B', 2**16, b'\xc6', b'\x00\x01\x00\x00', True)
2016-05-04 10:04:09 +02:00
def test_bin32_from_float():
__run_test('f', 2**16, b'\xc6', b'\x00\x01\x00\x00', True)