proto-socket/python/test/test_tcp.py
toki fa273bcc26 feat: add Python implementation and cross-test support
- Add Python toki_socket package (base_client, communicator, tcp/ws client/server)
- Add protobuf message definitions for Python
- Add go_python.go cross-test implementation and python_go_client
- Add agent-task/python_impl plan and code review docs
- Update .gitignore for Python cache files with recursive patterns
2026-04-23 16:44:43 +09:00

66 lines
2 KiB
Python

from __future__ import annotations
import asyncio
import pytest
from toki_socket.communicator import type_name_of
from toki_socket.packets.message_common_pb2 import TestData as ProtoTestData
from toki_socket.tcp_client import TcpClient, connect_tcp
from toki_socket.tcp_server import TcpServer
def parser_map():
return {type_name_of(ProtoTestData): ProtoTestData.FromString}
@pytest.mark.asyncio
async def test_tcp_send_receive():
received = asyncio.get_running_loop().create_future()
server = TcpServer(
"127.0.0.1",
0,
lambda reader, writer: TcpClient(reader, writer, 0, 0, parser_map()),
)
server.on_client_connected = lambda client: client.communicator.add_listener(
type_name_of(ProtoTestData),
lambda message: received.set_result(message) if not received.done() else None,
)
await server.start()
client = await connect_tcp("127.0.0.1", server.port, 0, 0, parser_map())
await client.communicator.send(ProtoTestData(index=1, message="hello"))
result = await asyncio.wait_for(received, 2)
assert result.index == 1
assert result.message == "hello"
await client.close()
await server.stop()
@pytest.mark.asyncio
async def test_tcp_request_response():
server = TcpServer(
"127.0.0.1",
0,
lambda reader, writer: TcpClient(reader, writer, 0, 0, parser_map()),
)
server.on_client_connected = lambda client: client.communicator.add_request_listener(
type_name_of(ProtoTestData),
lambda req: ProtoTestData(index=req.index * 2, message="echo: " + req.message),
)
await server.start()
client = await connect_tcp("127.0.0.1", server.port, 0, 0, parser_map())
result = await client.communicator.send_request(
ProtoTestData(index=21, message="single request"),
ProtoTestData,
timeout=2,
)
assert result.index == 42
assert result.message == "echo: single request"
await client.close()
await server.stop()