feat: 长保持连接,控制端可重启
This commit is contained in:
@@ -121,6 +121,8 @@ def test_control_sessions_smoke(transport: str, binary_name: str, session_cls) -
|
||||
receiver_stats = receiver.stats()
|
||||
assert sender_stats['connected'] == 1
|
||||
assert receiver_stats['connected'] == 1
|
||||
assert sender_stats['registered'] == 1
|
||||
assert receiver_stats['registered'] == 1
|
||||
assert sender_stats['send_calls'] >= 2
|
||||
assert receiver_stats['recv_calls'] >= 2
|
||||
if transport == 'kcp':
|
||||
@@ -135,6 +137,63 @@ def test_control_sessions_smoke(transport: str, binary_name: str, session_cls) -
|
||||
receiver.close()
|
||||
|
||||
|
||||
def test_kcp_duplicate_peer_new_instance_wins() -> None:
|
||||
port = _reserve_port()
|
||||
listen_addr = f'127.0.0.1:{port}'
|
||||
shared_peer_id = 'pytest-kcp-shared-peer'
|
||||
sender_id = 'pytest-kcp-unique-sender'
|
||||
|
||||
with _run_server('kcpserver', listen_addr):
|
||||
original = _connect_with_retry(Session, transport='kcp', server_addr=listen_addr, peer_id=shared_peer_id)
|
||||
sender = _connect_with_retry(Session, transport='kcp', server_addr=listen_addr, peer_id=sender_id)
|
||||
replacement = None
|
||||
|
||||
try:
|
||||
replacement = _connect_with_retry(Session, transport='kcp', server_addr=listen_addr, peer_id=shared_peer_id)
|
||||
replacement_stats = replacement.stats()
|
||||
assert replacement_stats['connected'] == 1
|
||||
assert replacement_stats['registered'] == 1
|
||||
|
||||
with pytest.raises(OSError):
|
||||
original.recv(timeout_ms=1000)
|
||||
|
||||
payload = b'registered-replacement'
|
||||
sender.send(to=shared_peer_id, data=payload)
|
||||
from_peer, msg_type, recv_payload = replacement.recv(timeout_ms=1000)
|
||||
assert from_peer == sender_id
|
||||
assert msg_type == MSG_TYPE_BINARY
|
||||
assert recv_payload == payload
|
||||
finally:
|
||||
original.close()
|
||||
sender.close()
|
||||
if replacement is not None:
|
||||
replacement.close()
|
||||
|
||||
|
||||
def test_kcp_idle_video_peers_survive_without_receive_loop() -> None:
|
||||
port = _reserve_port()
|
||||
listen_addr = f'127.0.0.1:{port}'
|
||||
sender_id = 'peer-b-video'
|
||||
receiver_id = 'peer-a-video'
|
||||
|
||||
with _run_server('kcpserver', listen_addr):
|
||||
sender = _connect_with_retry(Session, transport='kcp', server_addr=listen_addr, peer_id=sender_id)
|
||||
receiver = _connect_with_retry(Session, transport='kcp', server_addr=listen_addr, peer_id=receiver_id)
|
||||
|
||||
try:
|
||||
time.sleep(5.0)
|
||||
|
||||
payload = b'idle-video-session-still-alive'
|
||||
sender.send(to=receiver_id, data=payload)
|
||||
from_peer, msg_type, recv_payload = receiver.recv(timeout_ms=1000)
|
||||
assert from_peer == sender_id
|
||||
assert msg_type == MSG_TYPE_BINARY
|
||||
assert recv_payload == payload
|
||||
finally:
|
||||
sender.close()
|
||||
receiver.close()
|
||||
|
||||
|
||||
def test_udp_session_close_interrupts_blocking_recv() -> None:
|
||||
port = _reserve_port()
|
||||
listen_addr = f'127.0.0.1:{port}'
|
||||
|
||||
Reference in New Issue
Block a user