import asyncio import struct import pytest from browser_cli.framing import ( async_recv_frame, frame, recv_frame, send_frame, ) from browser_cli.version_manager import MAX_MSG_BYTES class FakeRecv: def __init__(self, chunks): self.chunks = list(chunks) def recv(self, n): if not self.chunks: return b"" chunk = self.chunks.pop(0) if len(chunk) > n: self.chunks.insert(0, chunk[n:]) return chunk[:n] return chunk def test_frame_prefixes_payload_length(): assert frame(b"abc") == b"\x03\x00\x00\x00abc" def test_recv_frame_reads_chunked_socket_payload(): sock = FakeRecv([b"\x05", b"\x00\x00\x00he", b"llo"]) assert recv_frame(sock) == b"hello" def test_recv_frame_allow_eof_returns_none(): assert recv_frame(FakeRecv([]), allow_eof=True) is None def test_recv_frame_rejects_oversized_payload(): sock = FakeRecv([struct.pack("