1
from __future__ import unicode_literals
3
from itertools import repeat, chain
7
from rlp.sedes import binary, CountableList
8
from rlp.exceptions import DecodingError, DeserializationError
12
import pytest_benchmark
19
# speed up setup in case tests aren't run anyway
26
class Message(rlp.Serializable):
31
('field3', CountableList(binary, max_length=100))
35
def lazy_test_factory(s, valid):
36
@pytest.mark.benchmark(group='lazy')
41
Message.deserialize(rlp.decode_lazy(s))
42
except (DecodingError, DeserializationError):
50
def eager_test_factory(s, valid):
51
@pytest.mark.benchmark(group='eager')
56
rlp.decode(s, Message)
57
except (DecodingError, DeserializationError):
65
def generate_test_functions():
68
long_string = bytes(bytearray((i % 256 for i in range(SIZE))))
69
long_list = rlp.encode([c for c in long_string])
70
invalid['long_string'] = long_string
71
invalid['long_list'] = long_list
73
nested_list = rlp.encode('\x00')
74
for _ in repeat(None, SIZE):
75
nested_list += rlp.codec.length_prefix(len(nested_list), 0xc0)
76
invalid['nested_list'] = nested_list
78
valid['long_string_object'] = rlp.encode([b'\x00', long_string, []])
80
prefix = rlp.codec.length_prefix(1 + 1 + len(long_list), 0xc0)
81
invalid['long_list_object'] = prefix + rlp.encode(b'\x00') + rlp.encode(b'\x00') + long_list
83
valid['friendly'] = rlp.encode(Message('hello', 'I\'m friendly', ['not', 'many', 'elements']))
85
invalid = invalid.items()
87
rlp_strings = [i[1] for i in chain(valid, invalid)]
88
valids = [True] * len(valid) + [False] * len(invalid)
89
names = [i[0] for i in chain(valid, invalid)]
91
current_module = sys.modules[__name__]
92
for rlp_string, valid, name in zip(rlp_strings, valids, names):
93
f_eager = pytest.mark.skipif('not do_benchmark')(eager_test_factory(rlp_string, valid))
94
f_lazy = pytest.mark.skipif('not do_benchmark')(lazy_test_factory(rlp_string, valid))
95
setattr(current_module, 'test_eager_' + name, f_eager)
96
setattr(current_module, 'test_lazy_' + name, f_lazy)
99
generate_test_functions()