From 94487f57ca4b17cd3dbd65a3ff4e19dbc4ff84e5 Mon Sep 17 00:00:00 2001 From: Nomads_Reach <144523850+NomadsReach@users.noreply.github.com> Date: Sun, 16 Aug 2026 00:43:56 -0400 Subject: [PATCH] Test transport-aware server send boundary --- server/tests/test_transport_server.py | 80 +++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 server/tests/test_transport_server.py diff --git a/server/tests/test_transport_server.py b/server/tests/test_transport_server.py new file mode 100644 index 0000000..7695c09 --- /dev/null +++ b/server/tests/test_transport_server.py @@ -0,0 +1,80 @@ +from __future__ import annotations + +import socket +import time + +import pytest + +from client_session import ClientSession +from packet_codec import EncodedPacket +from transport_policy import Delivery +from transport_server import TransportAwareFalloutTogetherServer + + +class MessageConnection: + def __init__(self): + self.messages: list[EncodedPacket] = [] + + def send_encoded(self, encoded: EncodedPacket) -> None: + self.messages.append(encoded) + + def fileno(self) -> int: + return 1 + + def close(self) -> None: + pass + + +def make_client(connection) -> ClientSession: + return ClientSession( + connection=connection, + address=("127.0.0.1", 50000), + player_id=1, + connected_at=time.time(), + ) + + +def test_transport_aware_server_preserves_tcp_wire_format(): + server = TransportAwareFalloutTogetherServer(host="127.0.0.1", port=0) + reader, writer = socket.socketpair() + try: + client = make_client(writer) + server._send_packet(client, {"type": "playerState", "characterName": "Nomad"}) + assert reader.recv(4096) == b'{"type":"playerState","characterName":"Nomad"}\n' + assert client.packets_sent == 1 + assert server.get_stats()["packetsSent"] == 1 + finally: + reader.close() + writer.close() + + +def test_transport_aware_server_sends_raw_message_and_delivery_metadata_to_gns_style_connection(): + server = TransportAwareFalloutTogetherServer(host="127.0.0.1", port=0) + connection = MessageConnection() + client = make_client(connection) + + server._send_packet(client, {"type": "transform", "x": 1.0}, broadcast=True) + server._send_packet(client, {"type": "playerState", "characterName": "Nomad"}) + + assert len(connection.messages) == 2 + transform, player_state = connection.messages + assert transform.payload == b'{"type":"transform","x":1.0}' + assert transform.delivery is Delivery.UNRELIABLE_SEQUENCED + assert not transform.payload.endswith(b"\n") + assert player_state.delivery is Delivery.RELIABLE_ORDERED + assert player_state.payload == b'{"type":"playerState","characterName":"Nomad"}' + assert client.packets_sent == 2 + assert client.packets_broadcast == 1 + assert server.get_stats()["packetsSent"] == 2 + assert server.get_stats()["packetsBroadcast"] == 1 + + +def test_transport_aware_server_rejects_nonfinite_json_before_transport(): + server = TransportAwareFalloutTogetherServer(host="127.0.0.1", port=0) + connection = MessageConnection() + client = make_client(connection) + + with pytest.raises(ValueError): + server._send_packet(client, {"type": "transform", "x": float("nan")}) + assert connection.messages == [] + assert server.get_stats()["packetsSent"] == 0