fix: 当前的 relay 实现原来只记了一个“最后发包的下游客户端地址”
This commit is contained in:
@@ -56,7 +56,31 @@ def _run_server(binary_name: str, listen_addr: str):
|
||||
process.wait(timeout=2.0)
|
||||
|
||||
|
||||
def _connect_with_retry(session_cls, *, transport: str, server_addr: str, peer_id: str):
|
||||
@contextmanager
|
||||
def _run_relay(listen_addr: str, remote_addr: str):
|
||||
binary = ROOT / 'bin' / 'kcpserver'
|
||||
if not binary.exists():
|
||||
pytest.skip(f'{binary} is not built')
|
||||
|
||||
process = subprocess.Popen(
|
||||
[str(binary), '-mode', 'relay', '-listen', listen_addr, '-relay-remote', remote_addr],
|
||||
cwd=str(ROOT),
|
||||
stdout=subprocess.DEVNULL,
|
||||
stderr=subprocess.DEVNULL,
|
||||
)
|
||||
try:
|
||||
time.sleep(0.2)
|
||||
yield process
|
||||
finally:
|
||||
process.terminate()
|
||||
try:
|
||||
process.wait(timeout=2.0)
|
||||
except subprocess.TimeoutExpired:
|
||||
process.kill()
|
||||
process.wait(timeout=2.0)
|
||||
|
||||
|
||||
def _connect_with_retry(session_cls, *, transport: str, server_addr: str, peer_id: str, relay_via: str = ''):
|
||||
deadline = time.monotonic() + 3.0
|
||||
last_error: Exception | None = None
|
||||
|
||||
@@ -69,6 +93,8 @@ def _connect_with_retry(session_cls, *, transport: str, server_addr: str, peer_i
|
||||
}
|
||||
if transport == 'kcp':
|
||||
kwargs.update(CONTROL_DEFAULTS)
|
||||
if relay_via:
|
||||
kwargs['relay_via'] = relay_via
|
||||
else:
|
||||
kwargs['enable_timestamping'] = False
|
||||
session.connect(**kwargs)
|
||||
@@ -210,6 +236,36 @@ def test_kcp_peer_a_video_stale_receiver_is_evicted() -> None:
|
||||
receiver.close()
|
||||
|
||||
|
||||
def test_kcp_relay_routes_multiple_sessions_by_conv() -> None:
|
||||
hub_port = _reserve_port()
|
||||
relay_port = _reserve_port()
|
||||
hub_addr = f'127.0.0.1:{hub_port}'
|
||||
relay_addr = f'127.0.0.1:{relay_port}'
|
||||
|
||||
with _run_server('kcpserver', hub_addr):
|
||||
with _run_relay(relay_addr, hub_addr):
|
||||
sender = _connect_with_retry(Session, transport='kcp', server_addr=hub_addr, peer_id='pytest-relay-sender', relay_via=relay_addr)
|
||||
receiver = _connect_with_retry(Session, transport='kcp', server_addr=hub_addr, peer_id='pytest-relay-receiver', relay_via=relay_addr)
|
||||
chatter = _connect_with_retry(Session, transport='kcp', server_addr=hub_addr, peer_id='pytest-relay-chatter', relay_via=relay_addr)
|
||||
|
||||
try:
|
||||
chatter.send(to='pytest-relay-sender', data=b'chatter-primes-last-client')
|
||||
from_peer, msg_type, recv_payload = sender.recv(timeout_ms=1000)
|
||||
assert from_peer == 'pytest-relay-chatter'
|
||||
assert msg_type == MSG_TYPE_BINARY
|
||||
assert recv_payload == b'chatter-primes-last-client'
|
||||
|
||||
sender.send(to='pytest-relay-receiver', data=b'relay-video-frame')
|
||||
from_peer, msg_type, recv_payload = receiver.recv(timeout_ms=1000)
|
||||
assert from_peer == 'pytest-relay-sender'
|
||||
assert msg_type == MSG_TYPE_BINARY
|
||||
assert recv_payload == b'relay-video-frame'
|
||||
finally:
|
||||
sender.close()
|
||||
receiver.close()
|
||||
chatter.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