From b81229cc080134a610a4f42c29eba46726be15ac Mon Sep 17 00:00:00 2001 From: Sheikah45 <66929319+Sheikah45@users.noreply.github.com> Date: Thu, 10 Jun 2021 22:48:53 -0400 Subject: [PATCH] Add timeout to base game class (#798) * Add timeout to base game class * Add unitTest --- server/games/coop.py | 1 - server/games/custom_game.py | 4 ++-- server/games/game.py | 4 +++- tests/unit_tests/test_ladder_service.py | 8 +++++++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/server/games/coop.py b/server/games/coop.py index 25205da45..eea01029d 100644 --- a/server/games/coop.py +++ b/server/games/coop.py @@ -22,7 +22,6 @@ def __init__(self, *args, **kwargs): "Expansion": "true" }) self.leaderboard_saved = False - asyncio.get_event_loop().create_task(self.timeout_game(60)) async def validate_game_mode_settings(self): """ diff --git a/server/games/custom_game.py b/server/games/custom_game.py index d2a9440af..077a77625 100644 --- a/server/games/custom_game.py +++ b/server/games/custom_game.py @@ -15,11 +15,11 @@ class CustomGame(Game): def __init__(self, id_, *args, **kwargs): new_kwargs = { - "rating_type": RatingType.GLOBAL + "rating_type": RatingType.GLOBAL, + "setup_timeout": 30 } new_kwargs.update(kwargs) super().__init__(id_, *args, **new_kwargs) - asyncio.get_event_loop().create_task(self.timeout_game()) async def _run_pre_rate_validity_checks(self): limit = len(self.players) * 60 diff --git a/server/games/game.py b/server/games/game.py index e0a419352..85c35a22a 100644 --- a/server/games/game.py +++ b/server/games/game.py @@ -70,6 +70,7 @@ def __init__( displayed_rating_range: Optional[InclusiveRange] = None, enforce_rating_range: bool = False, max_players: int = 12, + setup_timeout: int = 60, ): self._db = database self._results = GameResultReports(id_) @@ -120,8 +121,9 @@ def __init__( self._launch_fut = asyncio.Future() self._logger.debug("%s created", self) + asyncio.get_event_loop().create_task(self.timeout_game(setup_timeout)) - async def timeout_game(self, timeout: int = 30): + async def timeout_game(self, timeout: int = 60): await asyncio.sleep(timeout) if self.state is GameState.INITIALIZING: self._is_hosted.set_exception( diff --git a/tests/unit_tests/test_ladder_service.py b/tests/unit_tests/test_ladder_service.py index 5ce936867..0109dd091 100644 --- a/tests/unit_tests/test_ladder_service.py +++ b/tests/unit_tests/test_ladder_service.py @@ -149,17 +149,23 @@ async def test_start_game_1v1( LadderGame.wait_launched.assert_called_once() -@fast_forward(35) +@fast_forward(65) async def test_start_game_timeout( ladder_service: LadderService, player_factory, + monkeypatch ): queue = ladder_service.queues["ladder1v1"] p1 = player_factory("Dostya", player_id=1, lobby_connection_spec="auto") p2 = player_factory("Rhiza", player_id=2, lobby_connection_spec="auto") + monkeypatch.setattr(LadderGame, "timeout_game", CoroutineMock()) + monkeypatch.setattr(LadderGame, "on_game_end", CoroutineMock()) + await ladder_service.start_game([p1], [p2], queue) + LadderGame.timeout_game.assert_called_once() + LadderGame.on_game_end.assert_called() p1.lobby_connection.write.assert_called_once_with({"command": "match_cancelled"}) p2.lobby_connection.write.assert_called_once_with({"command": "match_cancelled"}) assert p1.lobby_connection.launch_game.called