from __future__ import annotations import asyncio from collections import deque import pytest from agents.sandbox.session.pty_output import collect_pty_output @pytest.mark.asyncio async def test_collect_pty_output_waits_for_notification() -> None: output_chunks: deque[bytes] = deque() output_lock = asyncio.Lock() output_notify = asyncio.Event() done = False async def produce_output() -> None: nonlocal done await asyncio.sleep(0) async with output_lock: output_chunks.append(b"notified output") done = True output_notify.set() producer_task = asyncio.create_task(produce_output()) output, original_token_count = await collect_pty_output( output_chunks=output_chunks, output_lock=output_lock, output_notify=output_notify, is_done=lambda: done, yield_time_ms=500, max_output_tokens=None, ) await producer_task assert output == b"notified output" assert original_token_count is None @pytest.mark.asyncio async def test_collect_pty_output_drains_chunks_added_when_done() -> None: output_chunks = deque([b"before done"]) def mark_done() -> bool: output_chunks.append(b" after done") return True output, original_token_count = await collect_pty_output( output_chunks=output_chunks, output_lock=asyncio.Lock(), output_notify=asyncio.Event(), is_done=mark_done, yield_time_ms=500, max_output_tokens=None, ) assert output == b"before done after done" assert original_token_count is None