Sync from GitHub main #1
@@ -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
|
||||||
Reference in New Issue
Block a user