Files
free-turn-proxy/internal/wire/codec_test.go
T
samosvalishe f8e840ccdf feat(wire): профиль rtpopus2 и интерфейс Codec
rtpopus2 несёт RTP header extension (RFC 8285 one-byte: X=1,
ssrc-audio-level + transport-cc) - ближе к современному WebRTC, чем
rtpopus (X=0). Wire несовместим с rtpopus, overhead 52 против 40.

wire.Codec - общий контракт профиля; NewClientCodec/Listen диспатчат
по -obf-profile, RelayPacketConn обобщён по Codec. Профиль тянется
в pipeline (раньше шёл только ключ obf).

Попутно: tcpfwd на 1-based streamID (единый базис с udprelay для
CacheID); cmd/client задаёт probe-host login.vk.ru для vk.
2026-06-17 10:03:41 +03:00

48 lines
1.5 KiB
Go

package wire
import (
"crypto/rand"
"testing"
)
func TestNewClientCodec(t *testing.T) {
t.Parallel()
key := make([]byte, 32)
if _, err := rand.Read(key); err != nil {
t.Fatal(err)
}
// none/"" → обфускация выключена (nil codec, без ошибки).
for _, p := range []string{ProfileNone, ""} {
c, err := NewClientCodec(p, nil)
if err != nil || c != nil {
t.Errorf("NewClientCodec(%q) = (%v, %v), want (nil, nil)", p, c, err)
}
}
// rtpopus / rtpopus2 → валидный codec с осмысленными размерами.
for _, p := range []string{ProfileRTPOpus, ProfileRTPOpus2} {
c, err := NewClientCodec(p, key)
if err != nil || c == nil {
t.Fatalf("NewClientCodec(%q) = (%v, %v), want non-nil codec", p, c, err)
}
if c.HeaderLen() <= 0 || c.Overhead() <= c.HeaderLen() {
t.Errorf("%q: overhead=%d header=%d (overhead должен включать tag)", p, c.Overhead(), c.HeaderLen())
}
if c.MaxWire(100) != c.Overhead()+100 {
t.Errorf("%q: MaxWire(100)=%d, want %d", p, c.MaxWire(100), c.Overhead()+100)
}
}
// rtpopus2 несёт RTP extension → заголовок больше, чем у v1.
v1, _ := NewClientCodec(ProfileRTPOpus, key)
v2, _ := NewClientCodec(ProfileRTPOpus2, key)
if v2.HeaderLen() <= v1.HeaderLen() {
t.Errorf("rtpopus2 header %d should exceed rtpopus %d (RTP extension)", v2.HeaderLen(), v1.HeaderLen())
}
if _, err := NewClientCodec("bogus", key); err == nil {
t.Error("NewClientCodec(bogus): want error")
}
}