Skip to content

Commit 4e12180

Browse files
committed
Addressed errors Michael pointed out
1 parent 921b1ad commit 4e12180

File tree

2 files changed

+110
-64
lines changed

2 files changed

+110
-64
lines changed
Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,63 @@
11
import pickle
22

33
from ait.core.server.handler import Handler
4-
from ait.core import tlm
4+
from ait.core import tlm, log
55

66

77
class PacketHandler(Handler):
88
def __init__(self, input_type=None, output_type=None, **kwargs):
99
"""
10+
This handler provides a way to accept multiple packet types
11+
(e.g. '1553_HS_Packet' and 'Ethernet_HS_Packet') single stream
12+
and have them be processed. This handler takes a string of
13+
raw binary data containing the packet data. It gets the UID from
14+
the telemetry dictionary. A tuple of the UID and user data
15+
field is returned.
16+
1017
Params:
1118
input_type: (optional) Specifies expected input type, used to
1219
validate handler workflow. Defaults to None.
1320
output_type: (optional) Specifies expected output type, used to
1421
validate handler workflow. Defaults to None
1522
**kwargs:
16-
packet: (required) Name of packet, present in default tlm dict.
23+
packet_type: (required) Type of packet (e.g. '1553_HS_Packet', 'Ethernet_HS_Packet')
24+
Present in default tlm dict.
1725
Raises:
18-
ValueError: If packet is not present in kwargs.
26+
ValueError: If packet type is not present in kwargs.
1927
If packet is specified but not present in default tlm dict.
20-
"""
28+
"""
2129
super(PacketHandler, self).__init__(input_type, output_type)
22-
self.packet_name = kwargs.get("packet", None)
30+
self.packet_type = kwargs.get("packet_type", None)
2331
self.tlm_dict = tlm.getDefaultDict()
2432

25-
if not self.packet_name:
26-
msg = f'PacketHandler: No packet type provided in handler config as key "packet"'
33+
if not self.packet_type:
34+
msg = f'PacketHandler: No packet type provided in handler config as key "packet_type"'
2735
raise ValueError(msg)
2836

29-
if self.packet_name not in self.tlm_dict:
30-
msg = f"PacketHandler: Packet name '{self.packet_name}' not present in telemetry dictionary."
37+
if self.packet_type not in self.tlm_dict:
38+
msg = f"PacketHandler: Packet name '{self.packet_type}' not present in telemetry dictionary."
3139
msg += f" Available packet types are {self.tlm_dict.keys()}"
3240
raise ValueError(msg)
3341

34-
self._pkt_defn = self.tlm_dict[self.packet_name]
42+
self._pkt_defn = self.tlm_dict[self.packet_type]
3543

36-
def handle(self, packet):
44+
def handle(self, input_data):
3745
"""
46+
Test the input_data length against the length in the telemetry
47+
3848
Params:
39-
packet: message received by stream (packet)
49+
input_data : byteArray
50+
message received by stream (raw data)
4051
Returns:
4152
tuple of packet UID and message received by stream
4253
"""
4354

44-
if self._pkt_defn.nbytes != packet.nbytes:
45-
msg = f"PacketHandler: Packet data length does not match packet definition."
46-
raise ValueError(msg)
55+
if self._pkt_defn.nbytes != len(input_data):
56+
log.error(
57+
f"PacketHandler: Packet data length does not match packet definition."
58+
)
59+
return 0
60+
else:
61+
return pickle.dumps((self._pkt_defn.uid, input_data), 2)
4762

48-
return pickle.dumps((self._pkt_defn.uid, packet), 2)
63+
return pickle.dumps((self._pkt_defn.uid, input_data), 2)

tests/ait/core/server/test_handler.py

Lines changed: 79 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import pickle
2+
import _pickle
23
import pytest
34
import unittest
45
from unittest import mock
@@ -9,7 +10,6 @@
910

1011

1112
class TestCCSDSPacketCheck(unittest.TestCase):
12-
1313
# Check if packet length is at least 7 bytes
1414
def test_ccsds_packet_length(self):
1515
handler = CCSDSPacketHandler(packet_types={"01011100111": "CCSDS_HEADER"})
@@ -52,76 +52,106 @@ def test_ccsds_packet_uid(self):
5252
self.assertEqual(packet_uid, pickle.loads(result)[0])
5353

5454

55-
class TestHandlerClassWithInputOutputTypes(object):
56-
handler = PacketHandler(packet="CCSDS_HEADER", input_type="int", output_type="str")
55+
class TestCCSDSHandlerClassWithInputOutputTypes(object):
56+
handler = CCSDSPacketHandler(
57+
packet_types={"01011100111": "CCSDS_HEADER"},
58+
input_type="int",
59+
output_type="str",
60+
)
5761

5862
def test_handler_creation(self):
5963
assert self.handler.input_type is "int"
6064
assert self.handler.output_type is "str"
6165

6266
@mock.patch(
63-
"ait.core.server.handlers.PacketHandler.handle", return_value="SpecialReturn"
67+
"ait.core.server.handlers.CCSDSPacketHandler.handle",
68+
return_value="SpecialReturn",
6469
)
6570
def test_execute_handler_returns_handle_return_on_input(self, handle_mock):
66-
returned = self.handler.handle("2")
71+
data = bytearray(b"\x02\xE7\x40\x00\x00\x00\x01")
72+
returned = self.handler.handle(data)
6773
assert returned == "SpecialReturn"
6874

6975

70-
class TestHandlerClassWith1553HSPacket(object):
76+
class TestCCSDSHandlerClassWithoutInputOutputTypes(object):
77+
handler = CCSDSPacketHandler(packet_types={"01011100111": "CCSDS_HEADER"})
78+
79+
def test_ccsds_handler_default_params(self):
80+
assert self.handler.input_type is None
81+
assert self.handler.output_type is None
82+
83+
@mock.patch(
84+
"ait.core.server.handlers.CCSDSPacketHandler.handle",
85+
return_value="SpecialReturn",
86+
)
87+
def test_execute_handler_returns_handle_return_on_input(self, handle_mock):
88+
data = bytearray(b"\x02\xE7\x40\x00\x00\x00\x01")
89+
returned = self.handler.handle(data)
90+
assert returned == "SpecialReturn"
91+
92+
def test_handler_repr(self):
93+
assert self.handler.__repr__() == "<handler.CCSDSPacketHandler>"
94+
95+
96+
class TestHandlerClassWith1553HSPacket(unittest.TestCase):
7197
tlm_dict = tlm.getDefaultDict()
72-
pkt_data = bytearray(b"\x02\xE7\x40\x00\x00\x00\x01")
98+
pkt_data = bytearray(b"\x02\xE7\x40\x00\x00\x00\x01\x02\x03\x04")
7399
pkt_1553 = tlm_dict['1553_HS_Packet']
74-
handler = PacketHandler(pkt_data, packet="1553_HS_Packet")
100+
handler = PacketHandler(packet_type="1553_HS_Packet")
75101

76102
def test_word_array(self):
77103
packet = tlm.Packet(self.pkt_1553, self.pkt_data)
78-
assert packet.words.__len__() == 3.5
104+
assert packet.words.__len__() == self.pkt_1553.nbytes/2
79105

80-
def test_execute_handler_returns_handle_return_on_input(self):
81-
packet = tlm.Packet(self.pkt_1553, self.pkt_data)
82-
result = self.handler.handle(packet)
83-
assert 'Ethernet 1553 packet' in str(result)
106+
def test_1553_uid(self):
107+
packet_uid = self.tlm_dict["1553_HS_Packet"].uid
108+
result = self.handler.handle(self.pkt_data)
109+
self.assertEqual(packet_uid, pickle.loads(result)[0])
84110

85-
# Test packet length by sending a Ethernet_HS_Packet to a 1553_HS_Packet Handler
111+
# Send only 5 bytes 1553 Packet expects 10 bytes
86112
def test_bad_packet_length(self):
87-
ethernet_pkt = self.tlm_dict['Ethernet_HS_Packet']
88-
e_packet = tlm.Packet(ethernet_pkt, self.pkt_data)
89-
with pytest.raises(ValueError):
90-
self.handler.handle(e_packet)
113+
pkt_data = bytearray(b"\x02\xE7\x40\x00\x00")
114+
with self.assertLogs("ait", level="INFO") as cm:
115+
self.handler.handle(pkt_data)
116+
self.assertIn(
117+
"Packet data length does not match packet definition.",
118+
cm.output[0],
119+
)
91120

92121
def test_packet_name_error_and_no_packet_type(self):
93-
pkt_data = bytearray(b"\x02\xE7\x40\x00\x00\x00\x01")
94122
with pytest.raises(ValueError):
95-
PacketHandler(pkt_data, packet="1553_HS_Packe")
96-
with pytest.raises(ValueError):
97-
PacketHandler(pkt_data)
123+
PacketHandler(packet_type="")
98124

99125

100-
class TestHandlerClassWithEthernetHSPacket(object):
126+
class TestHandlerClassWithEthernetHSPacket(unittest.TestCase):
101127
tlm_dict = tlm.getDefaultDict()
102-
pkt_data = bytearray(b"\x02\xE7\x40\x00\x00\x00\x01\x07\x08\x0a")
103-
ethernet_pkt = tlm_dict['Ethernet_HS_Packet']
104-
handler = PacketHandler(pkt_data, packet="Ethernet_HS_Packet")
128+
pkt_data = bytearray(b"\x02\xE7\x40\x00\x00\x00\x01\x40\x00\x03\x02\xE7\x40\x00\x00\x00\x01\x40\x00\x03"
129+
b"\x02\xE7\x40\x00\x00\x00\x01\x40\x00\x03\x02\xE7\x40\x00\x00\x00\x01")
130+
ethernet_pkt_def = tlm_dict['Ethernet_HS_Packet']
131+
handler = PacketHandler(packet_type="Ethernet_HS_Packet")
105132

106133
def test_word_array(self):
107-
e_packet = tlm.Packet(self.ethernet_pkt, self.pkt_data)
108-
assert e_packet.words.__len__() == 5
134+
e_packet = tlm.Packet(self.ethernet_pkt_def, self.pkt_data)
135+
assert e_packet.words.__len__() == self.ethernet_pkt_def.nbytes/2.0
109136

110-
def test_execute_handler_returns_handle_return_on_input(self):
111-
e_packet = tlm.Packet(self.ethernet_pkt, self.pkt_data)
112-
result = self.handler.handle(e_packet)
113-
assert 'Ethernet Health and Status Packet' in str(result)
137+
def test_1553_uid(self):
138+
packet_uid = self.tlm_dict["Ethernet_HS_Packet"].uid
139+
result = self.handler.handle(self.pkt_data)
140+
self.assertEqual(packet_uid, pickle.loads(result)[0])
114141

115-
# Send a 1553 packet to an Ethernet_HS_Packet Handler
142+
# Ethernet packet expects 37 bytes 1552 expects 10
116143
def test_bad_packet_length(self):
117-
pkt_1553 = self.tlm_dict['1553_HS_Packet']
118-
packet = tlm.Packet(pkt_1553, self.pkt_data)
119-
with pytest.raises(ValueError):
120-
self.handler.handle(packet)
144+
pkt_data = bytearray(b"\x02\xE7\x40\x00\x00\x00\x01\x07\x08\x0a")
145+
with self.assertLogs("ait", level="INFO") as cm:
146+
self.handler.handle(pkt_data)
147+
self.assertIn(
148+
"Packet data length does not match packet definition.",
149+
cm.output[0],
150+
)
121151

122152

123153
class TestHandlerClassWithoutInputOutputTypes(object):
124-
handler = PacketHandler(packet="CCSDS_HEADER")
154+
handler = PacketHandler(packet_type="Ethernet_HS_Packet")
125155

126156
def test_handler_default_params(self):
127157
assert self.handler.input_type is None
@@ -138,9 +168,9 @@ def test_handler_repr(self):
138168
assert self.handler.__repr__() == "<handler.PacketHandler>"
139169

140170

141-
class TestCCSDSHandlerClassWithInputOutputTypes(object):
142-
handler = CCSDSPacketHandler(
143-
packet_types={"01011100111": "CCSDS_HEADER"},
171+
class TestHandlerClassWithInputOutputTypes(object):
172+
handler = PacketHandler(
173+
packet_type='1553_HS_Packet',
144174
input_type="int",
145175
output_type="str",
146176
)
@@ -150,30 +180,31 @@ def test_handler_creation(self):
150180
assert self.handler.output_type is "str"
151181

152182
@mock.patch(
153-
"ait.core.server.handlers.CCSDSPacketHandler.handle",
183+
"ait.core.server.handlers.PacketHandler.handle",
154184
return_value="SpecialReturn",
155185
)
156186
def test_execute_handler_returns_handle_return_on_input(self, handle_mock):
157-
data = bytearray(b"\x02\xE7\x40\x00\x00\x00\x01")
187+
data = bytearray(b"\x02\xE7\x40\x00\x00\x00\x01\x02\x03\x04")
158188
returned = self.handler.handle(data)
159189
assert returned == "SpecialReturn"
160190

161191

162-
class TestCCSDSHandlerClassWithoutInputOutputTypes(object):
163-
handler = CCSDSPacketHandler(packet_types={"01011100111": "CCSDS_HEADER"})
192+
class TestHandlerClassWithoutInputOutputTypes(object):
193+
handler = PacketHandler(packet_type="Ethernet_HS_Packet")
164194

165195
def test_ccsds_handler_default_params(self):
166196
assert self.handler.input_type is None
167197
assert self.handler.output_type is None
168198

169199
@mock.patch(
170-
"ait.core.server.handlers.CCSDSPacketHandler.handle",
200+
"ait.core.server.handlers.PacketHandler.handle",
171201
return_value="SpecialReturn",
172202
)
173203
def test_execute_handler_returns_handle_return_on_input(self, handle_mock):
174-
data = bytearray(b"\x02\xE7\x40\x00\x00\x00\x01")
204+
# Note: Using 'mock' handler, the data will not be tested for length.
205+
data = bytearray(b"\x02\xE7\x40\x00\x00\x00\x01\x02\x03\x04")
175206
returned = self.handler.handle(data)
176207
assert returned == "SpecialReturn"
177208

178209
def test_handler_repr(self):
179-
assert self.handler.__repr__() == "<handler.CCSDSPacketHandler>"
210+
assert self.handler.__repr__() == "<handler.PacketHandler>"

0 commit comments

Comments
 (0)