Files
opensquilla--opensquilla/tests/test_engine/test_agent_provider_stream_cancellation.py
2026-07-13 13:12:33 +08:00

54 lines
1.4 KiB
Python

import asyncio
from types import SimpleNamespace
import pytest
from opensquilla.engine.agent import Agent
class _BlockingProviderStream:
def __init__(self) -> None:
self.started = asyncio.Event()
self.cancelled = asyncio.Event()
self.release = asyncio.Event()
def __aiter__(self) -> "_BlockingProviderStream":
return self
async def __anext__(self) -> object:
self.started.set()
try:
await self.release.wait()
except asyncio.CancelledError:
self.cancelled.set()
raise
raise StopAsyncIteration
@pytest.mark.asyncio
async def test_provider_next_event_is_cancelled_when_turn_stream_is_cancelled() -> None:
agent = Agent.__new__(Agent)
agent.config = SimpleNamespace(iteration_timeout=60.0, timeout=60.0)
stream = _BlockingProviderStream()
async def consume() -> None:
async for _event in Agent._stream_provider_events_with_deadline(
agent,
stream,
loop=asyncio.get_running_loop(),
total_deadline=None,
):
pass
task = asyncio.create_task(consume())
await asyncio.wait_for(stream.started.wait(), timeout=0.25)
task.cancel()
with pytest.raises(asyncio.CancelledError):
await task
try:
await asyncio.wait_for(stream.cancelled.wait(), timeout=0.25)
finally:
stream.release.set()