Do not invoke tick before handshake

This commit is contained in:
Romuald Juchnowicz-Bierbasz
2019-06-27 21:18:16 +02:00
committed by Romuald Bierbasz
parent 7b3965ff4b
commit ff30675a25
3 changed files with 25 additions and 9 deletions

View File

@@ -116,6 +116,7 @@ class Server():
data = data.strip()
logging.debug("Received %d bytes of data", len(data))
self._handle_input(data)
await asyncio.sleep(0) # To not starve task queue
def stop(self):
self._active = False

View File

@@ -38,6 +38,7 @@ class Plugin:
self._feature_methods = OrderedDict()
self._active = True
self._pass_control_task = None
self._reader, self._writer = reader, writer
self._handshake_token = handshake_token
@@ -210,15 +211,17 @@ class Plugin:
async def run(self):
"""Plugin's main coroutine."""
async def pass_control():
while self._active:
try:
self.tick()
except Exception:
logging.exception("Unexpected exception raised in plugin tick")
await asyncio.sleep(1)
await self._server.run()
if self._pass_control_task is not None:
await self._pass_control_task
await asyncio.gather(pass_control(), self._server.run())
async def _pass_control(self):
while self._active:
try:
self.tick()
except Exception:
logging.exception("Unexpected exception raised in plugin tick")
await asyncio.sleep(1)
def _shutdown(self):
logging.info("Shutting down")
@@ -236,6 +239,7 @@ class Plugin:
def _initialize_cache(self, data: Dict):
self._persistent_cache = data
self.handshake_complete()
self._pass_control_task = asyncio.create_task(self._pass_control())
@staticmethod
def _ping():

View File

@@ -62,7 +62,18 @@ def test_ping(plugin, read, write):
"result": None
}
def test_tick(plugin, read):
def test_tick_before_handshake(plugin, read):
read.side_effect = [b""]
asyncio.run(plugin.run())
plugin.tick.assert_not_called()
def test_tick_after_handshake(plugin, read):
request = {
"jsonrpc": "2.0",
"id": "6",
"method": "initialize_cache",
"params": {"data": {}}
}
read.side_effect = [json.dumps(request).encode() + b"\n", b""]
asyncio.run(plugin.run())
plugin.tick.assert_called_with()