From 298110f589d84a5473ef002c177923befd66fda6 Mon Sep 17 00:00:00 2001 From: Nomads_Reach <144523850+NomadsReach@users.noreply.github.com> Date: Sun, 16 Aug 2026 00:46:31 -0400 Subject: [PATCH] Test ServerService GNS lifecycle --- server/tests/test_server_service_transport.py | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 server/tests/test_server_service_transport.py diff --git a/server/tests/test_server_service_transport.py b/server/tests/test_server_service_transport.py new file mode 100644 index 0000000..82cf6cd --- /dev/null +++ b/server/tests/test_server_service_transport.py @@ -0,0 +1,120 @@ +from __future__ import annotations + +import pytest + +import server_service +from server_service import ServerConfig, ServerService +from transport_server import TransportAwareFalloutTogetherServer + + +class FakeCoreServer: + def __init__(self, port: int = 7777): + self.port = port + + +class FakeTransport: + instances = [] + local_port_override = None + + def __init__(self, host, port, *, library_path=None): + self.host = host + self.requested_port = port + self.library_path = library_path + self.local_port = self.local_port_override or port + self.closed = False + self.__class__.instances.append(self) + + def close(self): + self.closed = True + + +class FakeAdapter: + instances = [] + + def __init__(self, core, transport): + self.core = core + self.transport = transport + self.started = False + self.stopped = False + self.__class__.instances.append(self) + + def start(self): + self.started = True + + def stop(self): + self.stopped = True + self.transport.close() + + +def reset_fakes(): + FakeTransport.instances.clear() + FakeTransport.local_port_override = None + FakeAdapter.instances.clear() + + +def test_server_service_uses_transport_aware_core_with_gns_disabled_by_default(tmp_path): + config = ServerConfig(bans_path=str(tmp_path / "bans.json")) + assert not config.enable_gns_transport + service = ServerService(config) + core = service._create_server() + assert isinstance(core, TransportAwareFalloutTogetherServer) + + +def test_gns_feature_flag_is_noop_when_disabled(monkeypatch): + reset_fakes() + monkeypatch.setattr(server_service, "GnsServerTransport", FakeTransport) + monkeypatch.setattr(server_service, "GnsGameplayAdapter", FakeAdapter) + service = ServerService(ServerConfig(enable_gns_transport=False)) + service._server = FakeCoreServer() + + service._start_gns() + assert service._gns_adapter is None + assert FakeTransport.instances == [] + assert FakeAdapter.instances == [] + + +def test_gns_feature_flag_starts_udp_on_same_numeric_port_and_stops_cleanly(monkeypatch): + reset_fakes() + monkeypatch.setattr(server_service, "GnsServerTransport", FakeTransport) + monkeypatch.setattr(server_service, "GnsGameplayAdapter", FakeAdapter) + service = ServerService( + ServerConfig( + host="127.0.0.1", + port=7777, + enable_gns_transport=True, + gns_bridge_path="/opt/commonwealth/libcommonwealth_online_gns_bridge.so", + ) + ) + service._server = FakeCoreServer(7777) + + service._start_gns() + assert len(FakeTransport.instances) == 1 + transport = FakeTransport.instances[0] + assert transport.host == "127.0.0.1" + assert transport.requested_port == 7777 + assert transport.library_path == "/opt/commonwealth/libcommonwealth_online_gns_bridge.so" + assert len(FakeAdapter.instances) == 1 + adapter = FakeAdapter.instances[0] + assert adapter.started + assert service._gns_adapter is adapter + + service._stop_gns() + assert adapter.stopped + assert transport.closed + assert service._gns_adapter is None + + +def test_gns_start_rejects_native_bridge_bound_to_wrong_udp_port(monkeypatch): + reset_fakes() + FakeTransport.local_port_override = 8888 + monkeypatch.setattr(server_service, "GnsServerTransport", FakeTransport) + monkeypatch.setattr(server_service, "GnsGameplayAdapter", FakeAdapter) + service = ServerService(ServerConfig(port=7777, enable_gns_transport=True)) + service._server = FakeCoreServer(7777) + + with pytest.raises(RuntimeError, match="expected UDP 7777"): + service._start_gns() + assert len(FakeTransport.instances) == 1 + assert FakeTransport.instances[0].closed + assert FakeAdapter.instances == [] + assert service._gns_adapter is None