feat: add UDP NAT rendezvous
This commit is contained in:
parent
6a7c7a676d
commit
804e19c51a
7 changed files with 370 additions and 27 deletions
|
|
@ -64,6 +64,14 @@ class DiscoveryHTTPTests(unittest.TestCase):
|
|||
assert isinstance(room, dict)
|
||||
room_id = room["room_id"]
|
||||
token = created["lease_token"]
|
||||
traversal = created["traversal"]
|
||||
assert isinstance(traversal, dict)
|
||||
self.server.registry.verify_endpoint(
|
||||
str(room_id),
|
||||
str(traversal["verification_token"]),
|
||||
"127.0.0.1",
|
||||
7777,
|
||||
)
|
||||
self.assertIsInstance(room_id, str)
|
||||
self.assertIsInstance(token, str)
|
||||
|
||||
|
|
@ -100,6 +108,14 @@ class DiscoveryHTTPTests(unittest.TestCase):
|
|||
assert created is not None
|
||||
room = created["room"]
|
||||
assert isinstance(room, dict)
|
||||
traversal = created["traversal"]
|
||||
assert isinstance(traversal, dict)
|
||||
self.server.registry.verify_endpoint(
|
||||
str(room["room_id"]),
|
||||
str(traversal["verification_token"]),
|
||||
"127.0.0.1",
|
||||
7777,
|
||||
)
|
||||
self.assertEqual(room["current_players"], 0)
|
||||
self.request(
|
||||
"DELETE",
|
||||
|
|
@ -107,6 +123,41 @@ class DiscoveryHTTPTests(unittest.TestCase):
|
|||
token=str(created["lease_token"]),
|
||||
)
|
||||
|
||||
def test_join_attempt_reports_observed_endpoint_to_host(self) -> None:
|
||||
status, created = self.request("POST", "/v1/rooms", VALID_ROOM)
|
||||
self.assertEqual(status, 201)
|
||||
assert created is not None
|
||||
room = created["room"]
|
||||
traversal = created["traversal"]
|
||||
assert isinstance(room, dict)
|
||||
assert isinstance(traversal, dict)
|
||||
room_id = str(room["room_id"])
|
||||
self.server.registry.verify_endpoint(
|
||||
room_id,
|
||||
str(traversal["verification_token"]),
|
||||
"127.0.0.1",
|
||||
7777,
|
||||
)
|
||||
status, join = self.request(
|
||||
"POST", f"/v1/rooms/{room_id}/join-attempts"
|
||||
)
|
||||
self.assertEqual(status, 201)
|
||||
assert join is not None
|
||||
self.server.registry.register_join_endpoint(
|
||||
str(join["join_token"]), "198.51.100.7", 49152
|
||||
)
|
||||
status, pending = self.request(
|
||||
"GET",
|
||||
f"/v1/rooms/{room_id}/join-attempts",
|
||||
token=str(created["lease_token"]),
|
||||
)
|
||||
self.assertEqual(status, 200)
|
||||
assert pending is not None
|
||||
self.assertEqual(
|
||||
pending["endpoints"],
|
||||
[{"address": "198.51.100.7", "port": 49152}],
|
||||
)
|
||||
|
||||
def test_health_endpoint(self) -> None:
|
||||
status, body = self.request("GET", "/health")
|
||||
self.assertEqual(status, 200)
|
||||
|
|
|
|||
|
|
@ -35,7 +35,12 @@ class RoomRegistryTests(unittest.TestCase):
|
|||
self.registry = RoomRegistry(ttl_seconds=30.0, clock=self.clock)
|
||||
|
||||
def test_create_list_update_and_delete(self) -> None:
|
||||
room, token = self.registry.create("203.0.113.10", VALID_ROOM)
|
||||
room, token, verification_token = self.registry.create(
|
||||
"203.0.113.10", VALID_ROOM
|
||||
)
|
||||
room = self.registry.verify_endpoint(
|
||||
room.room_id, verification_token, "203.0.113.10", 7777
|
||||
)
|
||||
self.assertEqual(room.address, "203.0.113.10")
|
||||
self.assertEqual(self.registry.list_rooms(), [room])
|
||||
|
||||
|
|
@ -50,20 +55,27 @@ class RoomRegistryTests(unittest.TestCase):
|
|||
self.assertEqual(self.registry.list_rooms(), [])
|
||||
|
||||
def test_empty_dedicated_room_is_valid(self) -> None:
|
||||
room, _token = self.registry.create(
|
||||
room, _token, verification_token = self.registry.create(
|
||||
"203.0.113.10", dict(VALID_ROOM, current_players=0)
|
||||
)
|
||||
room = self.registry.verify_endpoint(
|
||||
room.room_id, verification_token, "203.0.113.10", 7777
|
||||
)
|
||||
self.assertEqual(room.current_players, 0)
|
||||
|
||||
def test_expired_room_is_removed(self) -> None:
|
||||
room, token = self.registry.create("203.0.113.10", VALID_ROOM)
|
||||
room, token, _verification_token = self.registry.create(
|
||||
"203.0.113.10", VALID_ROOM
|
||||
)
|
||||
self.clock.now += 30.0
|
||||
self.assertEqual(self.registry.list_rooms(), [])
|
||||
with self.assertRaises(RoomNotFoundError):
|
||||
self.registry.update(room.room_id, token, room.address, VALID_ROOM)
|
||||
|
||||
def test_wrong_token_cannot_mutate_room(self) -> None:
|
||||
room, _token = self.registry.create("203.0.113.10", VALID_ROOM)
|
||||
room, _token, _verification_token = self.registry.create(
|
||||
"203.0.113.10", VALID_ROOM
|
||||
)
|
||||
with self.assertRaises(LeaseAuthorizationError):
|
||||
self.registry.delete(room.room_id, "wrong")
|
||||
|
||||
|
|
@ -74,7 +86,12 @@ class RoomRegistryTests(unittest.TestCase):
|
|||
self.registry.create("203.0.113.10", dict(VALID_ROOM, room_name="bad\nname"))
|
||||
|
||||
def test_filters_use_authored_versions(self) -> None:
|
||||
expected, _token = self.registry.create("203.0.113.10", VALID_ROOM)
|
||||
expected, _token, verification_token = self.registry.create(
|
||||
"203.0.113.10", VALID_ROOM
|
||||
)
|
||||
expected = self.registry.verify_endpoint(
|
||||
expected.room_id, verification_token, "203.0.113.10", 7777
|
||||
)
|
||||
self.registry.create(
|
||||
"203.0.113.11",
|
||||
dict(VALID_ROOM, room_name="Older Room", protocol_version=2),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue