- 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
66 lines
2 KiB
Python
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()
|