98 lines
3.1 KiB
Go
98 lines
3.1 KiB
Go
|
|
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)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|