1
from __future__ import unicode_literals
7
from rlp import encode, decode, decode_lazy, infer_sedes, utils, DecodingError
10
if sys.version_info.major == 2:
11
str_types = (str, unicode)
12
elif sys.version_info.major == 3:
19
if isinstance(ll, rlp.lazy.LazyList):
20
return [evaluate(e) for e in ll]
26
if isinstance(value, str):
27
return utils.str_to_bytes(value)
28
elif isinstance(value, list):
29
return [to_bytes(v) for v in value]
34
def compare_nested(got, expected):
35
if isinstance(got, str_types):
36
return got == expected
38
zipped = zip(got, expected)
40
return got == expected
42
if len(list(zipped)) == len(got) == len(expected):
43
return all(compare_nested(x, y) for x, y in zipped)
47
with open('tests/rlptest.json') as f:
48
test_data = json.loads(f.read())
49
test_pieces = [(name, {'in': to_bytes(in_out['in']),
50
'out': in_out['out']})
51
for name, in_out in test_data.items()]
54
@pytest.mark.parametrize('name, in_out', test_pieces)
55
def test_encode(name, in_out):
56
msg_format = 'Test {} failed (encoded {} to {} instead of {})'
58
result = utils.encode_hex(encode(data)).upper()
59
expected = in_out['out'].upper()
60
if result != expected:
61
pytest.fail(msg_format.format(name, data, result, expected))
64
@pytest.mark.parametrize('name, in_out', test_pieces)
65
def test_decode(name, in_out):
66
msg_format = 'Test {} failed (decoded {} to {} instead of {})'
67
rlp_string = utils.decode_hex(in_out['out'])
68
decoded = decode(rlp_string)
69
with pytest.raises(DecodingError):
70
decode(rlp_string + b'\x00')
71
assert decoded == decode(rlp_string + b'\x00', strict=False)
73
assert decoded == evaluate(decode_lazy(rlp_string))
74
expected = in_out['in']
75
sedes = infer_sedes(expected)
76
data = sedes.deserialize(decoded)
77
assert compare_nested(data, decode(rlp_string, sedes))
79
if not compare_nested(data, expected):
80
pytest.fail(msg_format.format(name, rlp_string, decoded, expected))