generated from mononoki/pyproj
[+!] all but small
some small modifications, tests added
This commit is contained in:
@@ -191,3 +191,66 @@ def test_old_cleanup_cannot_delete_recovered_session(make_manager, timing):
|
||||
assert restored.last_data == {"telemetry": {"battery": 87}}
|
||||
assert new_uid in case.router.routes
|
||||
run(scenario)
|
||||
|
||||
|
||||
def test_close_after_record_was_deleted_is_safe(make_manager, timing):
|
||||
"""Проверяет повторный close после истечения окна и удаления UID."""
|
||||
async def scenario():
|
||||
async with timing:
|
||||
case = make_manager()
|
||||
uid, connection = await new_session(case)
|
||||
task = timing.spawn(case.manager.close(uid))
|
||||
request = await timing.sleeping("manager")
|
||||
timing.clock.advance(60)
|
||||
await finish_wait(request)
|
||||
await task
|
||||
await asyncio.wait_for(case.manager.close(uid), 1)
|
||||
assert connection.close_count == 1
|
||||
assert case.router.removed == [uid]
|
||||
run(scenario)
|
||||
|
||||
|
||||
def test_transport_close_error_does_not_prevent_expiry(make_manager, timing):
|
||||
"""Проверяет очистку сессии/маршрутов при ConnectionResetError из writer.wait_closed."""
|
||||
from transport.tcp.connection import Connection
|
||||
|
||||
async def scenario():
|
||||
async with timing:
|
||||
case = make_manager()
|
||||
failure = ConnectionResetError("close regression")
|
||||
|
||||
class BrokenWriter:
|
||||
close_count = 0
|
||||
|
||||
def close(self):
|
||||
self.close_count += 1
|
||||
|
||||
async def wait_closed(self):
|
||||
raise failure
|
||||
|
||||
writer = BrokenWriter()
|
||||
connection = Connection(None, writer)
|
||||
uid = await case.manager.new(connection)
|
||||
case.manager[uid].state = "air"
|
||||
case.router.add(uid)
|
||||
task = asyncio.create_task(case.manager.close(uid))
|
||||
try:
|
||||
request = await timing.sleeping("manager")
|
||||
assert request.delay == 60
|
||||
assert case.manager[uid].state == "stop"
|
||||
timing.clock.advance(60)
|
||||
try:
|
||||
await finish_wait(request)
|
||||
except ConnectionResetError as error:
|
||||
assert error is failure
|
||||
result = (await asyncio.gather(task, return_exceptions=True))[0]
|
||||
assert result is None or result is failure
|
||||
assert uid not in case.manager.sessions
|
||||
assert uid not in case.router.routes
|
||||
assert writer.close_count == 1
|
||||
assert case.router.removed == [uid]
|
||||
finally:
|
||||
if not task.done():
|
||||
task.cancel()
|
||||
await asyncio.gather(task, return_exceptions=True)
|
||||
run(scenario)
|
||||
|
||||
Reference in New Issue
Block a user