Skip to content

Commit

Permalink
Support user created loops on the asyncio client (Fixes miguelgrinber…
Browse files Browse the repository at this point in the history
  • Loading branch information
miguelgrinberg committed Nov 17, 2019
1 parent 9f96cd8 commit e38daad
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 7 deletions.
9 changes: 6 additions & 3 deletions engineio/asyncio_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,8 @@ async def _ping_loop(self):
interval.
"""
self.pong_received = True
self.ping_loop_event.clear()
if self.ping_loop_event is None:
self.ping_loop_event = self.create_event()
while self.state == 'connected':
if not self.pong_received:
self.logger.info(
Expand Down Expand Up @@ -477,7 +478,8 @@ async def _read_loop_polling(self):
self.logger.info('Waiting for write loop task to end')
await self.write_loop_task
self.logger.info('Waiting for ping loop task to end')
self.ping_loop_event.set()
if self.ping_loop_event: # pragma: no cover
self.ping_loop_event.set()
await self.ping_loop_task
if self.state == 'connected':
await self._trigger_event('disconnect', run_async=False)
Expand Down Expand Up @@ -512,7 +514,8 @@ async def _read_loop_websocket(self):
self.logger.info('Waiting for write loop task to end')
await self.write_loop_task
self.logger.info('Waiting for ping loop task to end')
self.ping_loop_event.set()
if self.ping_loop_event: # pragma: no cover
self.ping_loop_event.set()
await self.ping_loop_task
if self.state == 'connected':
await self._trigger_event('disconnect', run_async=False)
Expand Down
11 changes: 7 additions & 4 deletions engineio/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ def __init__(self,
self.read_loop_task = None
self.write_loop_task = None
self.ping_loop_task = None
self.ping_loop_event = self.create_event()
self.ping_loop_event = None
self.queue = None
self.state = 'disconnected'
self.ssl_verify = ssl_verify
Expand Down Expand Up @@ -515,7 +515,8 @@ def _ping_loop(self):
interval.
"""
self.pong_received = True
self.ping_loop_event.clear()
if self.ping_loop_event is None:
self.ping_loop_event = self.create_event()
while self.state == 'connected':
if not self.pong_received:
self.logger.info(
Expand Down Expand Up @@ -560,7 +561,8 @@ def _read_loop_polling(self):
self.logger.info('Waiting for write loop task to end')
self.write_loop_task.join()
self.logger.info('Waiting for ping loop task to end')
self.ping_loop_event.set()
if self.ping_loop_event: # pragma: no cover
self.ping_loop_event.set()
self.ping_loop_task.join()
if self.state == 'connected':
self._trigger_event('disconnect', run_async=False)
Expand Down Expand Up @@ -595,7 +597,8 @@ def _read_loop_websocket(self):
self.logger.info('Waiting for write loop task to end')
self.write_loop_task.join()
self.logger.info('Waiting for ping loop task to end')
self.ping_loop_event.set()
if self.ping_loop_event: # pragma: no cover
self.ping_loop_event.set()
self.ping_loop_task.join()
if self.state == 'connected':
self._trigger_event('disconnect', run_async=False)
Expand Down
3 changes: 3 additions & 0 deletions tests/asyncio/test_asyncio_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -838,6 +838,7 @@ def test_ping_loop_disconnect(self):
async def fake_wait():
c.state, c.pong_received = states.pop(0)

c.ping_loop_event = c.create_event()
c.ping_loop_event.wait = fake_wait
_run(c._ping_loop())
self.assertEqual(
Expand All @@ -858,6 +859,7 @@ def test_ping_loop_missing_pong(self):
async def fake_wait():
c.state, c.pong_received = states.pop(0)

c.ping_loop_event = c.create_event()
c.ping_loop_event.wait = fake_wait
_run(c._ping_loop())
self.assertEqual(c.state, 'connected')
Expand All @@ -880,6 +882,7 @@ def test_ping_loop_missing_pong_websocket(self):
async def fake_wait():
c.state, c.pong_received = states.pop(0)

c.ping_loop_event = c.create_event()
c.ping_loop_event.wait = fake_wait
_run(c._ping_loop())
self.assertEqual(c.state, 'connected')
Expand Down
3 changes: 3 additions & 0 deletions tests/common/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -791,6 +791,7 @@ def fake_wait(timeout):
self.assertEqual(timeout, 10)
c.state, c.pong_received = states.pop(0)

c.ping_loop_event = c.create_event()
c.ping_loop_event.wait = fake_wait
c._ping_loop()
self.assertEqual(
Expand All @@ -811,6 +812,7 @@ def fake_wait(timeout):
self.assertEqual(timeout, 10)
c.state, c.pong_received = states.pop(0)

c.ping_loop_event = c.create_event()
c.ping_loop_event.wait = fake_wait
c._ping_loop()
self.assertEqual(c.state, 'connected')
Expand All @@ -832,6 +834,7 @@ def fake_wait(timeout):
self.assertEqual(timeout, 10)
c.state, c.pong_received = states.pop(0)

c.ping_loop_event = c.create_event()
c.ping_loop_event.wait = fake_wait
c._ping_loop()
self.assertEqual(c.state, 'connected')
Expand Down

0 comments on commit e38daad

Please sign in to comment.