This repository was archived by the owner on Jan 5, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 45
/
Copy pathtest_messages.py
142 lines (113 loc) · 3.61 KB
/
test_messages.py
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
138
139
140
141
142
from __future__ import absolute_import
import struct
import pytest
from tchannel import exceptions
from tchannel import messages
from tchannel.messages.common import PROTOCOL_VERSION
from tchannel.io import BytesIO
def make_byte_stream(bytes_):
return BytesIO(bytes_), len(bytes_)
def make_short_bytes(value):
"""Convert value into a big-endian unsigned int."""
return struct.pack('>H', value)
@pytest.fixture
def init_request_message():
return make_byte_stream(
make_short_bytes(0x02) + # version 2
make_short_bytes(0) # 0 headers
)
@pytest.fixture
def init_request_with_headers():
header_name = b'test_header'
header_value = b'something'
header_buffer = (
make_short_bytes(len(header_name)) +
header_name +
make_short_bytes(len(header_value)) +
header_value
)
return make_byte_stream(
make_short_bytes(PROTOCOL_VERSION) +
make_short_bytes(1) +
header_buffer
)
def test_message_type_applies():
"""Verify message_type propagates."""
assert messages.InitRequestMessage().message_type > 0
def test_init_request(init_request_message):
"""Verify we can get an init request message to parse."""
message = messages.InitRequestMessage()
message.parse(*init_request_message)
assert message.version == 2
def test_init_request_with_headers(init_request_with_headers):
message = messages.InitRequestMessage()
message.parse(*init_request_with_headers)
assert message.headers['test_header']
def test_invalid_ping_request():
"""Ensure we validate ping requests."""
message = messages.PingRequestMessage()
with pytest.raises(exceptions.InvalidMessageException):
message.parse(BytesIO(), 1)
def test_valid_ping_request():
"""Verify we don't barf on 0-length bodies."""
message = messages.PingRequestMessage()
message.parse(BytesIO(), 0)
@pytest.mark.parametrize('message_class,attrs', [
(messages.InitRequestMessage, {
'headers': {'one': '2'}
}),
(messages.PingRequestMessage, {}),
(messages.PingResponseMessage, {}),
(messages.ErrorMessage, {
'code': 1,
'message': 'hi',
'original_message_id': 1,
}),
(messages.CallRequestMessage, {
'flags': 0,
'ttl': 1,
'span_id': 0,
'parent_id': 0,
'trace_id': 0,
'traceflags': 0,
'service': 'kodenom',
'headers': {},
'checksum_type': 0,
'arg_1': None,
'arg_2': None,
'arg_3': None,
}),
(messages.CallRequestMessage, {
'flags': 0x01,
'ttl': 1,
'span_id': 0,
'parent_id': 0,
'trace_id': 0,
'traceflags': 0x01,
'service': 'with_checksum',
'headers': {},
'checksum_type': 1,
'checksum': 3,
'arg_1': b'hi',
'arg_2': b'\x00',
'arg_3': None,
})
])
def test_roundtrip_message(message_class, attrs):
"""Verify all message types serialize and deserialize properly."""
message = message_class()
for key, value in attrs.items():
setattr(message, key, value)
out = bytearray()
message.serialize(out)
in_message = message_class()
in_message.parse(BytesIO(out), len(out))
for key, value in attrs.items():
assert getattr(in_message, key) == value
@pytest.mark.parametrize('message_class,byte_stream', [
(messages.ErrorMessage, b'\x00\x00\x00\x00\x01\x00\x02hi')
])
def test_parse_message(message_class, byte_stream):
"""Verify all messages parse properly."""
message = message_class()
message.parse(BytesIO(byte_stream), len(byte_stream))