orama/core/cmd/turn/config_test.go
anonpenguin23 cd8c717363 chore(version): bump to 0.122.47
- refactor(turn): extract decodeTURNConfig for testability
- feat(turn): add stealth domain fields to config
- fix(apns): nest custom data under "body" for expo-notifications compatibility
2026-06-11 11:45:12 +03:00

61 lines
2.2 KiB
Go

package main
import (
"testing"
"github.com/DeBrosOfficial/network/pkg/turn"
"gopkg.in/yaml.v3"
)
// TestDecodeTURNConfig_acceptsSpawnerOutput is the regression guard for the
// feat-124 crash: the namespace spawner writes the TURN config via
// yaml.Marshal(turn.Config), and the TURN binary parses it with a STRICT
// decoder. If turn.Config gains a yaml field the parser doesn't know, strict
// decode rejects it and TURN crash-loops at startup. This pins that the
// spawner's exact output round-trips through the parser, including the stealth
// fields.
func TestDecodeTURNConfig_acceptsSpawnerOutput(t *testing.T) {
src := turn.Config{
ListenAddr: "0.0.0.0:3478",
TURNSListenAddr: "0.0.0.0:5349",
PublicIP: "203.0.113.7",
Realm: "orama-devnet.network",
AuthSecret: "secret",
RelayPortStart: 49152,
RelayPortEnd: 49951,
Namespace: "anchat-test",
TLSCertPath: "/x/turn-cert.pem",
TLSKeyPath: "/x/turn-key.pem",
StealthDomain: "cdn-3259254d4d3e.orama-devnet.network",
TLSStealthCertPath: "/var/lib/caddy/caddy/certificates/.../wildcard_.orama-devnet.network.crt",
TLSStealthKeyPath: "/var/lib/caddy/caddy/certificates/.../wildcard_.orama-devnet.network.key",
}
data, err := yaml.Marshal(src)
if err != nil {
t.Fatalf("marshal: %v", err)
}
got, err := decodeTURNConfig(data)
if err != nil {
t.Fatalf("strict decode of spawner output failed — TURN would crash-loop at startup: %v\n---\n%s", err, data)
}
if got.StealthDomain != src.StealthDomain ||
got.TLSStealthCertPath != src.TLSStealthCertPath ||
got.TLSStealthKeyPath != src.TLSStealthKeyPath {
t.Errorf("stealth fields did not round-trip: got %+v", got)
}
if got.AuthSecret != src.AuthSecret || got.TURNSListenAddr != src.TURNSListenAddr {
t.Errorf("core fields did not round-trip: got %+v", got)
}
}
// TestDecodeTURNConfig_rejectsUnknownField confirms the strict decoder still
// rejects genuinely-unknown keys (so the contract above is meaningful).
func TestDecodeTURNConfig_rejectsUnknownField(t *testing.T) {
if _, err := decodeTURNConfig([]byte("listen_addr: \"0.0.0.0:3478\"\nbogus_field: 1\n")); err == nil {
t.Fatal("expected strict decode to reject an unknown field")
}
}