61 lines
2 KiB
Go
61 lines
2 KiB
Go
|
|
package webrtc
|
||
|
|
|
||
|
|
import (
|
||
|
|
"strings"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
appcfg "github.com/datarhei/core/v16/restream/app"
|
||
|
|
)
|
||
|
|
|
||
|
|
// TestSplitRTPLegs_TwoLegs feeds the real BuildArgs output through
|
||
|
|
// the splitter and checks both legs come out with the correct shape.
|
||
|
|
func TestSplitRTPLegs_TwoLegs(t *testing.T) {
|
||
|
|
args := BuildArgs(appcfg.ConfigWebRTC{Enabled: true, VideoPT: 102, AudioPT: 111}, 49200)
|
||
|
|
|
||
|
|
legs := splitRTPLegs(args)
|
||
|
|
if len(legs) != 2 {
|
||
|
|
t.Fatalf("expected 2 legs, got %d: %+v", len(legs), legs)
|
||
|
|
}
|
||
|
|
|
||
|
|
video := legs[0]
|
||
|
|
audio := legs[1]
|
||
|
|
|
||
|
|
// Leg 0 is video: address ends with :49200
|
||
|
|
if !strings.HasSuffix(video.Address, ":49200?pkt_size=1316") {
|
||
|
|
t.Fatalf("video Address unexpected: %q", video.Address)
|
||
|
|
}
|
||
|
|
// Leg 1 is audio: address ends with :49201
|
||
|
|
if !strings.HasSuffix(audio.Address, ":49201?pkt_size=1316") {
|
||
|
|
t.Fatalf("audio Address unexpected: %q", audio.Address)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Each leg's options start with -map, end with -f rtp.
|
||
|
|
if len(video.Options) < 2 || video.Options[0] != "-map" {
|
||
|
|
t.Fatalf("video leg should start with -map, got %v", video.Options)
|
||
|
|
}
|
||
|
|
if video.Options[len(video.Options)-2] != "-f" || video.Options[len(video.Options)-1] != "rtp" {
|
||
|
|
t.Fatalf("video leg should end with -f rtp, got %v", video.Options)
|
||
|
|
}
|
||
|
|
if len(audio.Options) < 2 || audio.Options[0] != "-map" {
|
||
|
|
t.Fatalf("audio leg should start with -map, got %v", audio.Options)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Neither leg's Options should contain the address itself.
|
||
|
|
for _, opt := range video.Options {
|
||
|
|
if strings.HasPrefix(opt, "udp://") {
|
||
|
|
t.Fatalf("video Options must not contain udp:// address: %v", video.Options)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// TestSplitRTPLegs_FallbackOnUnexpectedShape ensures we don't panic
|
||
|
|
// or drop data if BuildArgs ever changes shape — the splitter returns
|
||
|
|
// a single leg wrapping everything.
|
||
|
|
func TestSplitRTPLegs_FallbackOnUnexpectedShape(t *testing.T) {
|
||
|
|
// Single -map: shouldn't happen, but don't panic.
|
||
|
|
legs := splitRTPLegs([]string{"-map", "0:v:0", "udp://1.2.3.4:5000"})
|
||
|
|
if len(legs) != 1 {
|
||
|
|
t.Fatalf("expected single fallback leg, got %d", len(legs))
|
||
|
|
}
|
||
|
|
}
|