Files
skald/rtpconn/rtpconn_test.go
2026-05-20 14:29:39 -04:00

154 lines
3.1 KiB
Go

package rtpconn
import (
"net"
"testing"
"github.com/pion/webrtc/v4"
"git.stormux.org/storm/skald/conn"
"git.stormux.org/storm/skald/hall"
"git.stormux.org/storm/skald/rtptime"
)
type testClient struct {
hall *hall.Hall
}
func (c *testClient) Hall() *hall.Hall {
return c.hall
}
func (c *testClient) Addr() net.Addr {
return nil
}
func (c *testClient) Id() string {
return "test-client"
}
func (c *testClient) Username() string {
return "Test User"
}
func (c *testClient) SetUsername(string) {
}
func (c *testClient) Permissions() []string {
return []string{"present"}
}
func (c *testClient) SetPermissions([]string) {
}
func (c *testClient) Data() map[string]interface{} {
return nil
}
func (c *testClient) PushConn(*hall.Hall, string, conn.Up, []conn.UpTrack, string) error {
return nil
}
func (c *testClient) RequestConns(hall.Client, *hall.Hall, string) error {
return nil
}
func (c *testClient) Joined(string, string) error {
return nil
}
func (c *testClient) PushClient(string, string, string, string, []string, map[string]interface{}) error {
return nil
}
func (c *testClient) Kick(string, *string, string) error {
return nil
}
func TestDownTrackAtomics(t *testing.T) {
down := &rtpDownTrack{
atomics: &downTrackAtomics{},
maxBitrate: new(bitrate),
maxREMBBitrate: new(bitrate),
}
down.SetTimeOffset(1, 2)
down.setRTT(3)
down.setSRTime(4, 5)
down.maxBitrate.Set(6, rtptime.Jiffies())
down.maxREMBBitrate.Set(7, rtptime.Jiffies())
info := layerInfo{8, 9, 10, 11, 12, 13, true}
down.setLayerInfo(info)
ntp, rtp := down.getTimeOffset()
rtt := down.getRTT()
sr, srntp := down.getSRTime()
br, sbr, tbr := down.GetMaxBitrate()
info2 := down.getLayerInfo()
if ntp != 1 || rtp != 2 || rtt != 3 || sr != 4 || srntp != 5 ||
br != 6 || sbr != 8 || tbr != 11 {
t.Errorf(
"Expected 1 2 3 4 5 6 8 11, "+
"got %v %v %v %v %v %v %v %v",
ntp, rtp, rtt, sr, srntp, br, sbr, tbr,
)
}
if info2 != info {
t.Errorf("Expected %v, got %v", info, info2)
}
}
func TestNewUpConnRejectsVideoMediaSection(t *testing.T) {
g, err := hall.Add("rtpconn-video-rejection-test", &hall.Description{})
if err != nil {
t.Fatalf("Add hall: %v", err)
}
defer hall.Delete(g.Name())
offer := `v=0
o=- 1 1 IN IP4 127.0.0.1
s=-
t=0 0
m=audio 9 UDP/TLS/RTP/SAVPF 111
c=IN IP4 0.0.0.0
a=mid:0
a=sendrecv
a=rtpmap:111 opus/48000/2
m=video 9 UDP/TLS/RTP/SAVPF 96
c=IN IP4 0.0.0.0
a=mid:1
a=sendrecv
a=rtpmap:96 VP8/90000
`
up, err := newUpConn(&testClient{hall: g}, "up-test", "audio", offer)
if err != nil {
t.Fatalf("newUpConn: %v", err)
}
defer up.pc.Close()
transceivers := up.pc.GetTransceivers()
if len(transceivers) != 1 {
t.Fatalf("expected only audio transceiver, got %d", len(transceivers))
}
if kind := transceivers[0].Kind(); kind != webrtc.RTPCodecTypeAudio {
t.Fatalf("expected audio transceiver, got %v", kind)
}
}
func TestSadd(t *testing.T) {
ts := []struct{ x, y, z uint64 }{
{0, 0, 0},
{1, 2, 3},
{^uint64(0) - 10, 5, ^uint64(0) - 5},
{^uint64(0) - 10, 15, ^uint64(0)},
}
for _, tt := range ts {
z := sadd(tt.x, tt.y)
if z != tt.z {
t.Errorf("%v + %v: expected %v, got %v",
tt.x, tt.y, tt.z, z,
)
}
}
}