async def test_lost_drain_waited_ok(loop): pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() t = loop.create_task(pr._drain_helper()) await asyncio.sleep(0) assert pr._drain_waiter is not None pr.connection_lost(None) assert (await t) is None assert pr._drain_waiter is None
async def test_resume_drain_waited() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() t = loop.create_task(pr._drain_helper()) await asyncio.sleep(0) assert pr._drain_waiter is not None pr.resume_writing() assert (await t) is None assert pr._drain_waiter is None
async def test_resume_drain_waited() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() t = loop.create_task(pr._drain_helper()) await asyncio.sleep(0) assert pr._drain_waiter is not None pr.resume_writing() assert (await t) is None assert pr._drain_waiter is None
async def test_parallel_drain_race_condition() -> None: loop = asyncio.get_event_loop() pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() ts = [loop.create_task(pr._drain_helper()) for _ in range(5)] assert not (await asyncio.wait( ts, timeout=0.5))[0], "All draining tasks must be pending" assert pr._drain_waiter is not None pr.resume_writing() await asyncio.gather(*ts) assert pr._drain_waiter is None
async def test_lost_drain_waited_exception(loop): pr = BaseProtocol(loop=loop) tr = mock.Mock() pr.connection_made(tr) pr.pause_writing() t = loop.create_task(pr._drain_helper()) await asyncio.sleep(0) assert pr._drain_waiter is not None exc = RuntimeError() pr.connection_lost(exc) with pytest.raises(RuntimeError) as cm: await t assert cm.value is exc assert pr._drain_waiter is None