From d0377462b5eaa44a5af8fe57df79fe09e0a005b2 Mon Sep 17 00:00:00 2001 From: VanL15 <94021265+VanL15@users.noreply.github.com> Date: Thu, 9 Nov 2023 21:34:53 -0500 Subject: [PATCH] add validity check for packet formats --- EosLib/format/base_format.py | 4 ++++ EosLib/format/formats/cutdown.py | 2 +- EosLib/format/formats/e_field.py | 2 +- EosLib/format/formats/empty_format.py | 3 +++ EosLib/format/formats/ping_format.py | 2 +- EosLib/format/formats/position.py | 2 +- EosLib/format/formats/telemetry_data.py | 2 +- EosLib/format/formats/valve.py | 2 +- EosLib/packet/packet.py | 3 +++ tests/packet/test_packet.py | 11 +++++++++++ 10 files changed, 27 insertions(+), 6 deletions(-) diff --git a/EosLib/format/base_format.py b/EosLib/format/base_format.py index 1d3ee52..9bea4db 100644 --- a/EosLib/format/base_format.py +++ b/EosLib/format/base_format.py @@ -37,3 +37,7 @@ def encode(self) -> bytes: @abstractmethod def decode(cls, data: bytes) -> Self: raise NotImplementedError + + @abstractmethod + def get_validity(self) -> bool: + raise NotImplementedError diff --git a/EosLib/format/formats/cutdown.py b/EosLib/format/formats/cutdown.py index 45066c0..0decd7a 100644 --- a/EosLib/format/formats/cutdown.py +++ b/EosLib/format/formats/cutdown.py @@ -23,7 +23,7 @@ def __eq__(self, other): return self.ack == other.ack and \ self.valid == other.valid - def get_validity(self): + def get_validity(self) -> bool: if self.ack < 0 or self.ack > 255: return False else: diff --git a/EosLib/format/formats/e_field.py b/EosLib/format/formats/e_field.py index 1cc7496..3773c83 100644 --- a/EosLib/format/formats/e_field.py +++ b/EosLib/format/formats/e_field.py @@ -42,7 +42,7 @@ def __eq__(self, other): self.voltage_c == other.voltage_c and \ self.valid == other.valid - def get_validity(self): + def get_validity(self) -> bool: """Checks if data is valid voltage range will be between 0-1.5 volts diff --git a/EosLib/format/formats/empty_format.py b/EosLib/format/formats/empty_format.py index 83a17ab..cb0825b 100644 --- a/EosLib/format/formats/empty_format.py +++ b/EosLib/format/formats/empty_format.py @@ -33,3 +33,6 @@ def decode(cls, data: bytes) -> Self: def get_format_string(self) -> str: return self.num_bytes * "x" + + def get_validity(self) -> bool: + return self.num_bytes >= 0 diff --git a/EosLib/format/formats/ping_format.py b/EosLib/format/formats/ping_format.py index 233d14e..c05a0fb 100644 --- a/EosLib/format/formats/ping_format.py +++ b/EosLib/format/formats/ping_format.py @@ -33,7 +33,7 @@ def __eq__(self, other): self.num == other.num and \ self.valid == other.valid - def get_validity(self): + def get_validity(self) -> bool: if self.num < 0 or self.num > 255: return False else: diff --git a/EosLib/format/formats/position.py b/EosLib/format/formats/position.py index 60fa7e1..f6feed7 100644 --- a/EosLib/format/formats/position.py +++ b/EosLib/format/formats/position.py @@ -113,7 +113,7 @@ def decode_from_csv(cls, csv_string: str) -> Self: int(csv_list[5]), FlightState(int(csv_list[6]))) - def get_validity(self): + def get_validity(self) -> bool: if (self.number_of_satellites < 4 or self.latitude == 0 or self.longitude == 0): diff --git a/EosLib/format/formats/telemetry_data.py b/EosLib/format/formats/telemetry_data.py index 710c04b..46b9116 100644 --- a/EosLib/format/formats/telemetry_data.py +++ b/EosLib/format/formats/telemetry_data.py @@ -57,7 +57,7 @@ def __eq__(self, other): self.z_rotation == other.z_rotation and \ self.valid == other.valid - def get_validity(self): + def get_validity(self) -> bool: """Checks if data is valid (NEED A MORE CONCRETE WAY OF VALIDATING) """ diff --git a/EosLib/format/formats/valve.py b/EosLib/format/formats/valve.py index f2bf6f1..d2d7693 100644 --- a/EosLib/format/formats/valve.py +++ b/EosLib/format/formats/valve.py @@ -23,7 +23,7 @@ def __eq__(self, other): return self.ack == other.ack and \ self.valid == other.valid - def get_validity(self): + def get_validity(self) -> bool: if self.ack < 0 or self.ack > 255: return False else: diff --git a/EosLib/packet/packet.py b/EosLib/packet/packet.py index 8bf32c5..4364cbe 100644 --- a/EosLib/packet/packet.py +++ b/EosLib/packet/packet.py @@ -84,6 +84,9 @@ def validate_packet(self): if not issubclass(self.body.__class__, BaseFormat): raise PacketFormatError("All packets must have a body that extends BaseFormat") + if self.body.get_validity() is False: + raise PacketFormatError("All packets must contain a valid format") + if self.data_header.priority != Priority.NO_TRANSMIT: total_length = struct.calcsize(TransmitHeader.transmit_header_struct_format_string) + \ struct.calcsize(DataHeader.data_header_struct_format_string) + \ diff --git a/tests/packet/test_packet.py b/tests/packet/test_packet.py index befa104..5854a84 100644 --- a/tests/packet/test_packet.py +++ b/tests/packet/test_packet.py @@ -5,6 +5,7 @@ import EosLib.packet.definitions as definitions from EosLib.format.formats.empty_format import EmptyFormat +from EosLib.format.formats.e_field import EField from datetime import datetime @@ -154,6 +155,16 @@ def test_illegal_body_type(packet, illegal_body): packet.encode() +def test_valid_body_format(packet): + packet.body = EField(0, 1.5, 1) + assert packet.body.get_validity() + + +def test_invalid_body_format(packet): + packet.body = EField(-1, 1.5, 1) + assert not packet.body.get_validity() + + def test_allow_large_body_no_transmit(packet): packet.body = EmptyFormat(Packet.radio_body_max_bytes + 1) packet.data_header.priority = definitions.Priority.NO_TRANSMIT