Harden discovery rendezvous service

This commit is contained in:
Alexander Sellite 2026-08-11 10:37:03 -04:00
parent 804e19c51a
commit ef30369865
8 changed files with 57 additions and 7 deletions

View file

@ -2,11 +2,16 @@ from __future__ import annotations
from http.client import HTTPConnection
import json
import socketserver
import threading
import unittest
from netfishing_discovery.registry import RoomRegistry
from netfishing_discovery.server import DiscoveryHTTPServer, ServerConfig
from netfishing_discovery.server import (
DiscoveryHTTPServer,
ServerConfig,
TraversalUDPServer,
)
VALID_ROOM = {
@ -22,7 +27,12 @@ VALID_ROOM = {
class DiscoveryHTTPTests(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
config = ServerConfig(bind_host="127.0.0.1", bind_port=0, room_ttl_seconds=30.0)
config = ServerConfig(
bind_host="127.0.0.1",
bind_port=0,
room_ttl_seconds=30.0,
build_revision="test-build",
)
cls.server = DiscoveryHTTPServer(config, RoomRegistry(ttl_seconds=30.0))
cls.thread = threading.Thread(target=cls.server.serve_forever, daemon=True)
cls.thread.start()
@ -163,6 +173,11 @@ class DiscoveryHTTPTests(unittest.TestCase):
self.assertEqual(status, 200)
assert body is not None
self.assertEqual(body["status"], "ok")
self.assertEqual(body["version"], "0.2.0")
self.assertEqual(body["build_revision"], "test-build")
def test_udp_rendezvous_does_not_spawn_per_packet_threads(self) -> None:
self.assertFalse(issubclass(TraversalUDPServer, socketserver.ThreadingMixIn))
if __name__ == "__main__":

View file

@ -63,6 +63,22 @@ class RoomRegistryTests(unittest.TestCase):
)
self.assertEqual(room.current_players, 0)
def test_reverification_refreshes_changed_public_endpoint(self) -> None:
room, _token, verification_token = self.registry.create(
"203.0.113.10", VALID_ROOM
)
first = self.registry.verify_endpoint(
room.room_id, verification_token, "203.0.113.10", 41000
)
self.clock.now += 20.0
refreshed = self.registry.verify_endpoint(
room.room_id, verification_token, "198.51.100.25", 51000
)
self.assertEqual(refreshed.address, "198.51.100.25")
self.assertEqual(refreshed.port, 51000)
self.assertEqual(refreshed.created_at, first.created_at)
self.assertEqual(refreshed.expires_at, self.clock.now + 30.0)
def test_expired_room_is_removed(self) -> None:
room, token, _verification_token = self.registry.create(
"203.0.113.10", VALID_ROOM