1
0
mirror of https://github.com/craigerl/aprsd.git synced 2025-07-23 02:35:19 -04:00

Fixed issue with packet object and prepare()

If any part of the code had a packet object and called prepare()
on it, it would create a msgNo if it wasn't set.  Sometimes we
get packets on the wire/RF that don't have a msgNo, so adding one
locally is wrong.   We should ONLY create a msgNo on a packet that
is destined for transmission.

This patch ensures that even if prepare() is called, that only
packets that are created locally for TX get a msgNo unless it
already exists from RX'd packets.
This commit is contained in:
Hemna 2024-11-26 16:52:39 -05:00
parent 3a8b8f26dd
commit f66b96288f
4 changed files with 21 additions and 10 deletions

View File

@ -12,7 +12,7 @@ from dataclasses_json import (
)
from loguru import logger
from aprsd.utils import counter
from aprsd.utils import counter, trace
# For mypy to be happy
@ -127,10 +127,11 @@ class Packet:
msg = self._filter_for_send(self.raw).rstrip("\n")
return msg
def prepare(self) -> None:
@trace.trace
def prepare(self, create_msg_number=False) -> None:
"""Do stuff here that is needed prior to sending over the air."""
# now build the raw message for sending
if not self.msgNo:
if not self.msgNo and create_msg_number:
self.msgNo = _init_msgNo()
self._build_payload()
self._build_raw()
@ -244,11 +245,17 @@ class MessagePacket(Packet):
return self._filter_for_send(self.message_text).rstrip("\n")
def _build_payload(self):
self.payload = ":{}:{}{{{}".format(
self.to_call.ljust(9),
self._filter_for_send(self.message_text).rstrip("\n"),
str(self.msgNo),
)
if self.msgNo:
self.payload = ":{}:{}{{{}".format(
self.to_call.ljust(9),
self._filter_for_send(self.message_text).rstrip("\n"),
str(self.msgNo),
)
else:
self.payload = ":{}:{}".format(
self.to_call.ljust(9),
self._filter_for_send(self.message_text).rstrip("\n"),
)
@dataclass_json

View File

@ -48,7 +48,7 @@ def send(packet: core.Packet, direct=False, aprs_client=None):
"""Send a packet either in a thread or directly to the client."""
# prepare the packet for sending.
# This constructs the packet.raw
packet.prepare()
packet.prepare(create_msg_number=True)
# Have to call the collector to track the packet
# After prepare, as prepare assigns the msgNo
collector.PacketCollector().tx(packet)

View File

@ -61,7 +61,7 @@ class TestAPRSISClient(unittest.TestCase):
"connected": True,
"filter": "m/50",
"login_status": {"message": mock.ANY, "success": True},
"server_keepalive": mock_client.aprsd_keepalive,
"connection_keepalive": mock_client.aprsd_keepalive,
"server_string": mock_client.server_string,
"transport": "aprsis",
},

View File

@ -8,6 +8,7 @@ import flask_socketio
from oslo_config import cfg
from aprsd import conf # noqa: F401
from aprsd.client import fake as fake_client
from aprsd.cmds import webchat # noqa
from aprsd.packets import core
@ -64,11 +65,13 @@ class TestSendMessageCommand(unittest.TestCase):
@mock.patch("aprsd.threads.tx.send")
@mock.patch("aprsd.packets.PacketList.rx")
@mock.patch("aprsd.cmds.webchat.socketio")
@mock.patch("aprsd.client.factory.ClientFactory.create")
def test_process_our_message_packet(
self,
mock_tx_send,
mock_packet_add,
mock_socketio,
mock_factory,
):
self.config_and_init()
mock_socketio.emit = mock.MagicMock()
@ -77,6 +80,7 @@ class TestSendMessageCommand(unittest.TestCase):
msg_number=1,
message_format=core.PACKET_TYPE_MESSAGE,
)
mock_factory.return_value = fake_client.APRSDFakeClient()
mock_queue = mock.MagicMock()
socketio = mock.MagicMock()
wcp = webchat.WebChatProcessPacketThread(mock_queue, socketio)