|
|
@@ -1,5 +1,6 @@
|
|
|
import asyncio
|
|
|
import pytest
|
|
|
+import cq2_sdk.transport.tcp as tcp_module
|
|
|
from cq2_sdk.transport.tcp import TcpClient
|
|
|
from cq2_sdk.transport.framing import WIRE_HEADER_SIZE, decode_header, encode_frame
|
|
|
|
|
|
@@ -131,6 +132,97 @@ async def test_send_uses_and_increments_initial_sequence():
|
|
|
await server.wait_closed()
|
|
|
|
|
|
|
|
|
+@pytest.mark.asyncio
|
|
|
+async def test_send_uses_current_sdata():
|
|
|
+ received = asyncio.Future()
|
|
|
+
|
|
|
+ async def handler(reader, writer):
|
|
|
+ header = decode_header(await reader.readexactly(WIRE_HEADER_SIZE))
|
|
|
+ if header.body_len:
|
|
|
+ await reader.readexactly(header.body_len)
|
|
|
+ received.set_result(header)
|
|
|
+ writer.close()
|
|
|
+
|
|
|
+ server = await asyncio.start_server(handler, "127.0.0.1", 0)
|
|
|
+ port = server.sockets[0].getsockname()[1]
|
|
|
+ client = TcpClient("127.0.0.1", port)
|
|
|
+ client.set_sdata(149)
|
|
|
+ await client.connect()
|
|
|
+ try:
|
|
|
+ await client.send(2001, 900000, 1, 2, 3, b"login")
|
|
|
+ header = await asyncio.wait_for(received, timeout=1.0)
|
|
|
+ assert header.param3 == 3
|
|
|
+ assert header.sdata == 149
|
|
|
+ finally:
|
|
|
+ await client.close()
|
|
|
+ server.close()
|
|
|
+ await server.wait_closed()
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.asyncio
|
|
|
+async def test_reconnect_resets_sequence_and_preserves_sdata():
|
|
|
+ received: list[tuple[int, int]] = []
|
|
|
+ complete = asyncio.Event()
|
|
|
+
|
|
|
+ async def handler(reader, writer):
|
|
|
+ header = decode_header(await reader.readexactly(WIRE_HEADER_SIZE))
|
|
|
+ if header.body_len:
|
|
|
+ await reader.readexactly(header.body_len)
|
|
|
+ received.append((header.sequence, header.sdata))
|
|
|
+ if len(received) == 2:
|
|
|
+ complete.set()
|
|
|
+ writer.close()
|
|
|
+ await writer.wait_closed()
|
|
|
+
|
|
|
+ server = await asyncio.start_server(handler, "127.0.0.1", 0)
|
|
|
+ port = server.sockets[0].getsockname()[1]
|
|
|
+ client = TcpClient("127.0.0.1", port)
|
|
|
+ client.set_sdata(149)
|
|
|
+ await client.connect()
|
|
|
+ try:
|
|
|
+ await client.send(100, 0, 0, 0, 0, b"role")
|
|
|
+ await client.reconnect("127.0.0.1", port)
|
|
|
+ await client.send(20, 0, 0, 0, 0, b"world")
|
|
|
+ await asyncio.wait_for(complete.wait(), timeout=1.0)
|
|
|
+ assert received == [(0, 149), (0, 149)]
|
|
|
+ finally:
|
|
|
+ await client.close()
|
|
|
+ server.close()
|
|
|
+ await server.wait_closed()
|
|
|
+
|
|
|
+
|
|
|
+@pytest.mark.asyncio
|
|
|
+async def test_heartbeat_uses_current_unix_time_in_recog(monkeypatch):
|
|
|
+ received = asyncio.Future()
|
|
|
+
|
|
|
+ async def handler(reader, writer):
|
|
|
+ header = decode_header(await reader.readexactly(WIRE_HEADER_SIZE))
|
|
|
+ received.set_result(header)
|
|
|
+ writer.close()
|
|
|
+
|
|
|
+ class FixedTime:
|
|
|
+ @staticmethod
|
|
|
+ def time():
|
|
|
+ return 1_789_709_744
|
|
|
+
|
|
|
+ monkeypatch.setattr(tcp_module, "time", FixedTime, raising=False)
|
|
|
+ server = await asyncio.start_server(handler, "127.0.0.1", 0)
|
|
|
+ port = server.sockets[0].getsockname()[1]
|
|
|
+ client = TcpClient("127.0.0.1", port)
|
|
|
+ client.set_sdata(149)
|
|
|
+ await client.connect()
|
|
|
+ try:
|
|
|
+ await client.start_heartbeat(interval=0.01)
|
|
|
+ header = await asyncio.wait_for(received, timeout=1.0)
|
|
|
+ assert header.msg_id == 60000
|
|
|
+ assert header.recog == 1_789_709_744
|
|
|
+ assert header.sdata == 149
|
|
|
+ finally:
|
|
|
+ await client.close()
|
|
|
+ server.close()
|
|
|
+ await server.wait_closed()
|
|
|
+
|
|
|
+
|
|
|
@pytest.mark.asyncio
|
|
|
async def test_recv_surfaces_unsupported_body_codec():
|
|
|
async def handler(reader, writer):
|