Files
gost/tests/e2e/testdata/rudpbind/host.yaml
T
ginuerzh d7656ef3de tests/e2e: concurrent UDP endpoints must share a reverse tunnel intact
Covers gost#911 at the wire level: four UDP source sockets send through one
RUDP reverse tunnel bound on a relay server, and every datagram must come
back byte-identical to its own endpoint.

A frame torn by an interleaved writer shows up twice — as a corrupted
payload, and as the torn frame leaving half a header in the stream, which the
far end reads as "unexpected EOF" and answers by rebuilding the whole tunnel.
So the suite asserts both: no endpoint sees a corrupted datagram, and no
endpoint sees a receive gap long enough to be a teardown and rebind.

Verified against a binary built before the fix (4 endpoints, 35% loss, 1.4s
gaps, suite fails) and after it (0% loss, no corruption, 0.2s gaps, passes).
2026-10-03 16:27:05 +08:00

44 lines
1.2 KiB
YAML

# Internal host behind NAT for gost#911: binds a reverse UDP tunnel (rudp)
# through the relay server and forwards it to the local UDP echo server.
#
# The rudp listener opens no local port — it binds the UDP port remotely through
# the chain. service-1 is a dummy TCP listener purely so the e2e harness has a
# stable port to wait on for container readiness.
services:
- name: service-0
addr: "0.0.0.0:8432"
handler:
type: rudp
listener:
type: rudp
chain: chain-0
metadata:
ttl: 5m
forwarder:
nodes:
- name: echo
addr: udp-echo:5679
# Dummy TCP service on a fixed port: the rudp reverse-tunnel listener binds
# remotely through the chain and opens no local port, so this gives the e2e
# harness a stable port to wait on. Nothing ever targets it — the harness
# only opens and immediately closes the connection.
- name: service-1
addr: ":8431"
handler:
type: tcp
listener:
type: tcp
chains:
- name: chain-0
hops:
- nodes:
- addr: gost-server:8430
connector:
type: relay
dialer:
type: tcp
log:
level: debug