[+!] all but small

some small modifications, tests added
This commit is contained in:
2026-10-07 22:42:46 +03:00
parent fac12b2ea8
commit c16ed7915a
21 changed files with 1190 additions and 100 deletions

View File

@@ -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)