Skip to content

Commit e6f8a1d

Browse files
committed
Fixing start of the server (so it has running event loop).
1 parent c437e47 commit e6f8a1d

2 files changed

Lines changed: 35 additions & 19 deletions

File tree

monitor/test/test_websock_server.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,21 @@
22

33
import unittest
44
import asyncio
5-
from unittest.mock import *
5+
from unittest.mock import ANY, AsyncMock, MagicMock, patch
66
from monitor.websocket_connections import WebsocketServer
77

88

99
class TestWebsocketServer(unittest.TestCase):
10-
@patch('asyncio.set_event_loop')
1110
@patch('monitor.websocket_connections.serve')
12-
def test_init(self, mock_websock_serve, mock_set_loop):
13-
loop = MagicMock()
11+
def test_init(self, mock_websock_serve):
12+
loop = asyncio.new_event_loop()
1413
logger = MagicMock()
15-
mock_websock_serve.return_value = "0101"
16-
WebsocketServer.connection_handler = MagicMock()
1714
server = WebsocketServer(("ip_address", 4512), None, loop, logger)
1815

1916
self.assertEqual(server._loop, loop)
2017
self.assertIsNone(server._connections)
21-
mock_set_loop.assert_called_once_with(loop)
22-
mock_websock_serve.assert_called_once_with(server.connection_handler, "ip_address", 4512)
23-
loop.run_until_complete.assert_called_once_with("0101")
18+
mock_websock_serve.assert_not_called()
19+
loop.close()
2420

2521
@patch('monitor.websocket_connections.serve')
2622
def test_connection_handler(self, mock_websock_serve):
@@ -56,12 +52,23 @@ def test_connection_handler(self, mock_websock_serve):
5652
connection_mock.remove_client.assert_called_once_with("1234", queue)
5753

5854
@patch('asyncio.set_event_loop')
59-
@patch('monitor.websocket_connections.serve')
55+
@patch('monitor.websocket_connections.serve', new_callable=AsyncMock)
6056
def test_run(self, mock_websock_serve, mock_set_loop):
61-
loop = MagicMock()
57+
loop = asyncio.new_event_loop()
6258
logger = MagicMock()
63-
mock_websock_serve.return_value = "0101"
59+
60+
server_obj = MagicMock()
61+
wait_closed_future = loop.create_future()
62+
wait_closed_future.set_result(None)
63+
server_obj.wait_closed.return_value = wait_closed_future
64+
mock_websock_serve.return_value = server_obj
65+
6466
server = WebsocketServer(("ip_address", 123), None, loop, logger)
67+
68+
loop.call_later(0.05, loop.stop)
6569
server.run()
70+
6671
mock_set_loop.assert_called_with(loop)
67-
loop.run_forever.assert_called_once_with()
72+
mock_websock_serve.assert_awaited_once_with(ANY, "ip_address", 123)
73+
server_obj.close.assert_called_once_with()
74+
loop.close()

monitor/websocket_connections.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,14 @@ def __init__(self, websock_uri, connections, loop, logger):
147147
self._connections = connections
148148
self._loop = loop
149149
self._logger = logger
150-
hostname, port = websock_uri
151-
asyncio.set_event_loop(loop)
152-
start_server = serve(self.connection_handler, hostname, port)
153-
self._server = loop.run_until_complete(start_server)
154-
self._logger.info("websocket server initialized at {}:{}".format(hostname, port))
150+
self._hostname, self._port = websock_uri
151+
self._server = None
152+
153+
async def _start_server(self):
154+
self._server = await serve(self.connection_handler, self._hostname, self._port)
155+
self._logger.info(
156+
"websocket server initialized at {}:{}".format(self._hostname, self._port)
157+
)
155158

156159
async def connection_handler(self, websocket):
157160
"""
@@ -191,4 +194,10 @@ def run(self):
191194
nothing.
192195
"""
193196
asyncio.set_event_loop(self._loop)
194-
self._loop.run_forever()
197+
self._loop.run_until_complete(self._start_server())
198+
try:
199+
self._loop.run_forever()
200+
finally:
201+
if self._server is not None:
202+
self._server.close()
203+
self._loop.run_until_complete(self._server.wait_closed())

0 commit comments

Comments
 (0)