forked from adafruit/circuitpython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_msgpack.py
More file actions
137 lines (101 loc) · 3.26 KB
/
test_msgpack.py
File metadata and controls
137 lines (101 loc) · 3.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# SPDX-FileCopyrightText: 2026 Tim Cocks for Adafruit Industries
# SPDX-License-Identifier: MIT
"""Test the msgpack module."""
import pytest
ROUNDTRIP_CODE = """\
import msgpack
from io import BytesIO
obj = {"list": [True, False, None, 1, 3.125], "str": "blah"}
b = BytesIO()
msgpack.pack(obj, b)
encoded = b.getvalue()
print(f"encoded_len: {len(encoded)}")
print(f"encoded_hex: {encoded.hex()}")
b.seek(0)
decoded = msgpack.unpack(b)
print(f"decoded: {decoded}")
print(f"match: {decoded == obj}")
print("done")
"""
@pytest.mark.circuitpy_drive({"code.py": ROUNDTRIP_CODE})
def test_msgpack_roundtrip(circuitpython):
"""Pack and unpack a dict containing the basic msgpack types."""
circuitpython.wait_until_done()
output = circuitpython.serial.all_output
assert "match: True" in output
assert "done" in output
USE_LIST_CODE = """\
import msgpack
from io import BytesIO
b = BytesIO()
msgpack.pack([1, 2, 3], b)
b.seek(0)
as_list = msgpack.unpack(b)
print(f"as_list: {as_list} type={type(as_list).__name__}")
b.seek(0)
as_tuple = msgpack.unpack(b, use_list=False)
print(f"as_tuple: {as_tuple} type={type(as_tuple).__name__}")
print("done")
"""
@pytest.mark.circuitpy_drive({"code.py": USE_LIST_CODE})
def test_msgpack_use_list(circuitpython):
"""use_list=False should return a tuple instead of a list."""
circuitpython.wait_until_done()
output = circuitpython.serial.all_output
assert "as_list: [1, 2, 3] type=list" in output
assert "as_tuple: (1, 2, 3) type=tuple" in output
assert "done" in output
EXTTYPE_CODE = """\
from msgpack import pack, unpack, ExtType
from io import BytesIO
class MyClass:
def __init__(self, val):
self.value = val
data = MyClass(b"my_value")
def encoder(obj):
if isinstance(obj, MyClass):
return ExtType(1, obj.value)
return f"no encoder for {obj}"
def decoder(code, data):
if code == 1:
return MyClass(data)
return f"no decoder for type {code}"
buf = BytesIO()
pack(data, buf, default=encoder)
buf.seek(0)
decoded = unpack(buf, ext_hook=decoder)
print(f"decoded_type: {type(decoded).__name__}")
print(f"decoded_value: {decoded.value}")
print("done")
"""
@pytest.mark.circuitpy_drive({"code.py": EXTTYPE_CODE})
def test_msgpack_exttype(circuitpython):
"""ExtType with a custom encoder/decoder should round-trip."""
circuitpython.wait_until_done()
output = circuitpython.serial.all_output
assert "decoded_type: MyClass" in output
assert "decoded_value: b'my_value'" in output
assert "done" in output
EXTTYPE_PROPS_CODE = """\
from msgpack import ExtType
e = ExtType(5, b"hello")
print(f"code: {e.code}")
print(f"data: {e.data}")
e.code = 10
print(f"new_code: {e.code}")
try:
ExtType(128, b"x")
except (ValueError, OverflowError) as ex:
print(f"range_error: {type(ex).__name__}")
print("done")
"""
@pytest.mark.circuitpy_drive({"code.py": EXTTYPE_PROPS_CODE})
def test_msgpack_exttype_properties(circuitpython):
"""ExtType exposes code/data as read/write properties and rejects out-of-range codes."""
circuitpython.wait_until_done()
output = circuitpython.serial.all_output
assert "code: 5" in output
assert "data: b'hello'" in output
assert "new_code: 10" in output
assert "range_error:" in output
assert "done" in output