test(prometheus): add WebRTC snapshot collector unit tests
Some checks failed
ci / race tests (push) Blocked by required conditions
ci / WebRTC smoke (5-viewer fanout) (push) Blocked by required conditions
ci / WebRTC latency p95 gate (push) Blocked by required conditions
ci / vet + build (push) Has been cancelled

This commit is contained in:
Zac Gaetano 2026-05-06 15:56:43 -04:00
parent 23636e4a76
commit 15af16ce97

97
prometheus/webrtc_test.go Normal file
View file

@ -0,0 +1,97 @@
package prometheus_test
import (
"strings"
"testing"
coreprom "github.com/datarhei/core/v16/prometheus"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/testutil"
)
// fakeStats implements coreprom.WebRTCStatsSource for testing.
type fakeStats struct{ s coreprom.WebRTCStats }
func (f *fakeStats) Stats() coreprom.WebRTCStats { return f.s }
func newReg(t *testing.T, source coreprom.WebRTCStatsSource) *prometheus.Registry {
t.Helper()
reg := prometheus.NewRegistry()
if err := reg.Register(coreprom.NewWebRTCCollector("test", source)); err != nil {
t.Fatalf("Register: %v", err)
}
return reg
}
func TestWebRTCCollector_NoStreams(t *testing.T) {
reg := newReg(t, &fakeStats{})
if err := testutil.GatherAndCompare(reg, strings.NewReader(`
# HELP dragonfork_webrtc_active_streams Streams currently registered (processes with webrtc.enabled=true running).
# TYPE dragonfork_webrtc_active_streams gauge
dragonfork_webrtc_active_streams{core="test"} 0
# HELP dragonfork_webrtc_udp_ports_in_use UDP ports currently allocated (2 per active stream).
# TYPE dragonfork_webrtc_udp_ports_in_use gauge
dragonfork_webrtc_udp_ports_in_use{core="test"} 0
`),
"dragonfork_webrtc_active_streams",
"dragonfork_webrtc_udp_ports_in_use",
); err != nil {
t.Fatal(err)
}
}
func TestWebRTCCollector_OneStreamWithPeers(t *testing.T) {
src := &fakeStats{s: coreprom.WebRTCStats{
StreamCount: 1,
PeersByStream: map[string]int{"live": 3},
UDPPortsInUse: 2,
}}
reg := newReg(t, src)
if err := testutil.GatherAndCompare(reg, strings.NewReader(`
# HELP dragonfork_webrtc_active_peers Currently subscribed WHEP peers per stream.
# TYPE dragonfork_webrtc_active_peers gauge
dragonfork_webrtc_active_peers{core="test",stream_id="live"} 3
# HELP dragonfork_webrtc_active_streams Streams currently registered (processes with webrtc.enabled=true running).
# TYPE dragonfork_webrtc_active_streams gauge
dragonfork_webrtc_active_streams{core="test"} 1
# HELP dragonfork_webrtc_udp_ports_in_use UDP ports currently allocated (2 per active stream).
# TYPE dragonfork_webrtc_udp_ports_in_use gauge
dragonfork_webrtc_udp_ports_in_use{core="test"} 2
`)); err != nil {
t.Fatal(err)
}
}
func TestWebRTCCollector_MultipleStreams(t *testing.T) {
src := &fakeStats{s: coreprom.WebRTCStats{
StreamCount: 2,
PeersByStream: map[string]int{"live": 3, "cam": 1},
UDPPortsInUse: 4,
}}
reg := newReg(t, src)
mfs, err := reg.Gather()
if err != nil {
t.Fatalf("Gather: %v", err)
}
// Check stream count and udp ports
for _, mf := range mfs {
switch mf.GetName() {
case "dragonfork_webrtc_active_streams":
if got := mf.GetMetric()[0].GetGauge().GetValue(); got != 2 {
t.Errorf("active_streams: want 2, got %v", got)
}
case "dragonfork_webrtc_udp_ports_in_use":
if got := mf.GetMetric()[0].GetGauge().GetValue(); got != 4 {
t.Errorf("udp_ports_in_use: want 4, got %v", got)
}
case "dragonfork_webrtc_active_peers":
total := 0.0
for _, m := range mf.GetMetric() {
total += m.GetGauge().GetValue()
}
if total != 4 {
t.Errorf("active_peers total: want 4, got %v", total)
}
}
}
}