Skip to content

Commit 7fb416f

Browse files
committed
moving tests to a more reasonable place
Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
1 parent 9fdbdb9 commit 7fb416f

5 files changed

Lines changed: 124 additions & 65 deletions

File tree

Pipfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ ipython = "*"
99
pytest = "*"
1010
pytest-asyncio = "*"
1111
flake8 = "*"
12+
rope = "*"
1213

1314
[packages]
1415
python-dateutil = "*"

Pipfile.lock

Lines changed: 24 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

receptor/messages/envelope.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,22 @@ async def put(self, data):
3636

3737
async def handle_frame(self, data):
3838
self.current_frame, rest = Frame.from_data(data)
39-
if self.current_frame.type in (Frame.START_MSG, Frame.PAYLOAD):
40-
self.to_read = self.current_frame.length
41-
await self.consume(rest)
42-
else:
39+
40+
if self.current_frame.type not in (Frame.HEADER, Frame.PAYLOAD):
4341
raise Exception("Unknown Frame Type")
4442

43+
self.to_read = self.current_frame.length
44+
await self.consume(rest)
45+
4546
async def consume(self, data):
4647
self.to_read -= len(data)
4748
self.bb += data
4849
if self.to_read == 0:
4950
await self.finish()
5051

5152
async def finish(self):
52-
if self.current_frame.type == Frame.START_MSG:
53-
self.header = Header(**json.loads(self.bb))
53+
if self.current_frame.type == Frame.HEADER:
54+
self.header = Header.from_bytes(self.bb)
5455
elif self.current_frame.type == Frame.PAYLOAD:
5556
await self.q.put((self.header, self.bb))
5657
self.header = None
@@ -62,9 +63,11 @@ async def get(self):
6263

6364

6465
class Frame:
65-
START_MSG = 0
66+
HEADER = 0
6667
PAYLOAD = 1
6768

69+
__slots__ = ('type', 'version', 'length', 'msg_id', 'id')
70+
6871
def __init__(self, type_, version, length, msg_id, id_):
6972
self.type = type_
7073
self.version = version
@@ -103,8 +106,12 @@ def __init__(self, sender, recipient, route_list):
103106
def serialize(self):
104107
return json.dumps({"sender": self.sender, "recipient": self.recipient, "route_list": self.route_list}).encode("utf-8")
105108

109+
@classmethod
110+
def from_bytes(cls, data):
111+
return cls(**json.loads(data))
112+
106113
def __repr__(self):
107-
return f"Header: {self.sender}, {self.recipient}, {self.route_list}"
114+
return f"Header({self.sender}, {self.recipient}, {self.route_list})"
108115

109116
def __eq__(self, other):
110117
return (self.sender, self.recipient, self.route_list) == (other.sender, other.recipient, other.route_list)
@@ -117,7 +124,7 @@ def gen_chunks(data, header, msg_id=None, chunksize=2 ** 8):
117124
buf = bytearray(chunksize)
118125
bv = memoryview(buf)
119126
header = header.serialize()
120-
yield Frame(Frame.START_MSG, 1, len(header), msg_id, next(seq)).serialize() + header
127+
yield Frame(Frame.HEADER, 1, len(header), msg_id, next(seq)).serialize() + header
121128
yield Frame(Frame.PAYLOAD, 1, len(data), msg_id, next(seq)).serialize()
122129
buffer = io.BytesIO(data)
123130
bytes_read = buffer.readinto(buf)
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import json
2+
import uuid
3+
4+
import pytest
5+
6+
from receptor.messages.envelope import Frame, FramedBuffer, Header, gen_chunks
7+
8+
9+
@pytest.yield_fixture
10+
def msg_id():
11+
return uuid.uuid4().int
12+
13+
14+
@pytest.yield_fixture
15+
def framed_buffer():
16+
return FramedBuffer()
17+
18+
19+
@pytest.mark.asyncio
20+
async def test_framedbuffer(framed_buffer, msg_id):
21+
header = Header("node1", "node2", [])
22+
header_bytes = header.serialize()
23+
f1 = Frame(Frame.HEADER, 1, len(header_bytes), msg_id, 1)
24+
25+
await framed_buffer.put(f1.serialize() + header_bytes)
26+
27+
payload = b"tina loves butts"
28+
payload2 = b"yep yep yep"
29+
f2 = Frame(Frame.PAYLOAD, 1, len(payload) + len(payload2), msg_id, 2)
30+
31+
await framed_buffer.put(f2.serialize() + payload)
32+
await framed_buffer.put(payload2)
33+
34+
h, p = await framed_buffer.get()
35+
36+
assert h == header
37+
assert p == payload + payload2
38+
39+
40+
@pytest.mark.asyncio
41+
async def test_gen_chunks():
42+
43+
b = FramedBuffer()
44+
45+
header = Header("node1", "node2", [])
46+
payload = b"this is a test with a buffer"
47+
for chunk in gen_chunks(payload, header):
48+
await b.put(chunk)
49+
50+
h, p = await b.get()
51+
assert h == header
52+
assert p == payload
53+
54+
55+
@pytest.mark.asyncio
56+
async def test_hi(msg_id, framed_buffer):
57+
hi = json.dumps({"cmd": "hi"}).encode("utf-8")
58+
f1 = Frame(Frame.PAYLOAD, 1, len(hi), msg_id, 1)
59+
60+
await framed_buffer.put(f1.serialize())
61+
await framed_buffer.put(hi)
62+
63+
h, p = await framed_buffer.get()
64+
65+
assert h is None
66+
assert p == hi
67+
68+
69+
@pytest.mark.asyncio
70+
async def test_extra_header(framed_buffer, msg_id):
71+
h1 = Header("node1", "node2", [])
72+
payload = h1.serialize()
73+
f1 = Frame(Frame.HEADER, 1, len(payload), msg_id, 1)
74+
await framed_buffer.put(f1.serialize())
75+
await framed_buffer.put(payload)
76+
77+
h2 = Header("node3", "node4", [])
78+
payload = h2.serialize()
79+
f2 = Frame(Frame.HEADER, 1, len(payload), msg_id, 2)
80+
await framed_buffer.put(f2.serialize())
81+
await framed_buffer.put(payload)
82+
83+
assert framed_buffer.header == h2

receptor/tests/test_protocol.py

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
import uuid
2-
31
import pytest
42

53
from receptor import protocol
6-
from receptor.messages.envelope import Frame, FramedBuffer, Header, gen_chunks
74

85

96
def deser(x):
@@ -35,42 +32,3 @@ async def test_databuffer_many_msgs():
3532
assert msg[0] == await b.get()
3633
assert msg[1] == await b.get()
3734
assert b.q.empty()
38-
39-
40-
@pytest.mark.asyncio
41-
async def test_framedbuffer():
42-
b = FramedBuffer()
43-
44-
msg_id = uuid.uuid4().int
45-
header = Header("node1", "node2", [])
46-
header_bytes = header.serialize()
47-
f1 = Frame(Frame.START_MSG, 1, len(header_bytes), msg_id, 1)
48-
49-
await b.put(f1.serialize() + header_bytes)
50-
51-
payload = b"tina loves butts"
52-
payload2 = b"yep yep yep"
53-
f2 = Frame(Frame.PAYLOAD, 1, len(payload) + len(payload2), msg_id, 2)
54-
55-
await b.put(f2.serialize() + payload)
56-
await b.put(payload2)
57-
58-
h, p = await b.get()
59-
60-
assert h == header
61-
assert p == payload + payload2
62-
63-
64-
@pytest.mark.asyncio
65-
async def test_gen_chunks():
66-
67-
b = FramedBuffer()
68-
69-
header = Header("node1", "node2", [])
70-
payload = b"this is a test with a buffer"
71-
for chunk in gen_chunks(payload, header):
72-
await b.put(chunk)
73-
74-
h, p = await b.get()
75-
assert h == header
76-
assert p == payload

0 commit comments

Comments
 (0)