mirror of
https://github.com/livekit/livekit.git
synced 2026-04-01 13:05:42 +00:00
163 lines
4.5 KiB
Go
163 lines
4.5 KiB
Go
package rtc
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/pion/webrtc/v3"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/livekit/livekit-server/pkg/config"
|
|
"github.com/livekit/livekit-server/pkg/routing"
|
|
"github.com/livekit/livekit-server/pkg/routing/routingfakes"
|
|
"github.com/livekit/livekit-server/pkg/rtc/types"
|
|
"github.com/livekit/livekit-server/pkg/rtc/types/typesfakes"
|
|
livekit "github.com/livekit/livekit-server/proto"
|
|
)
|
|
|
|
func TestIsReady(t *testing.T) {
|
|
tests := []struct {
|
|
state livekit.ParticipantInfo_State
|
|
ready bool
|
|
}{
|
|
{
|
|
state: livekit.ParticipantInfo_JOINING,
|
|
ready: false,
|
|
},
|
|
{
|
|
state: livekit.ParticipantInfo_JOINED,
|
|
ready: true,
|
|
},
|
|
{
|
|
state: livekit.ParticipantInfo_ACTIVE,
|
|
ready: true,
|
|
},
|
|
{
|
|
state: livekit.ParticipantInfo_DISCONNECTED,
|
|
ready: false,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.state.String(), func(t *testing.T) {
|
|
p := &ParticipantImpl{}
|
|
p.state.Store(test.state)
|
|
require.Equal(t, test.ready, p.IsReady())
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestICEStateChange(t *testing.T) {
|
|
t.Run("onClose gets called when ICE disconnected", func(t *testing.T) {
|
|
p := newParticipantForTest("test")
|
|
closeChan := make(chan bool, 1)
|
|
p.onClose = func(participant types.Participant) {
|
|
close(closeChan)
|
|
}
|
|
p.handlePublisherICEStateChange(webrtc.ICEConnectionStateDisconnected)
|
|
|
|
select {
|
|
case <-closeChan:
|
|
return
|
|
case <-time.After(time.Millisecond * 10):
|
|
t.Fatalf("onClose was not called after timeout")
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestTrackPublishing(t *testing.T) {
|
|
t.Run("should send the correct events", func(t *testing.T) {
|
|
p := newParticipantForTest("test")
|
|
p.state.Store(livekit.ParticipantInfo_ACTIVE)
|
|
track := &typesfakes.FakePublishedTrack{}
|
|
track.IDReturns("id")
|
|
published := false
|
|
updated := false
|
|
p.OnTrackUpdated(func(p types.Participant, track types.PublishedTrack) {
|
|
updated = true
|
|
})
|
|
p.OnTrackPublished(func(p types.Participant, track types.PublishedTrack) {
|
|
published = true
|
|
})
|
|
p.handleTrackPublished(track)
|
|
|
|
require.True(t, published)
|
|
require.False(t, updated)
|
|
require.Len(t, p.publishedTracks, 1)
|
|
|
|
track.OnCloseArgsForCall(0)()
|
|
require.Len(t, p.publishedTracks, 0)
|
|
require.True(t, updated)
|
|
})
|
|
|
|
t.Run("sends back trackPublished event", func(t *testing.T) {
|
|
p := newParticipantForTest("test")
|
|
//track := &typesfakes.FakePublishedTrack{}
|
|
//track.IDReturns("id")
|
|
sink := p.params.Sink.(*routingfakes.FakeMessageSink)
|
|
p.AddTrack("cid", "webcam", livekit.TrackType_VIDEO)
|
|
require.Equal(t, 1, sink.WriteMessageCallCount())
|
|
res := sink.WriteMessageArgsForCall(0).(*livekit.SignalResponse)
|
|
require.IsType(t, &livekit.SignalResponse_TrackPublished{}, res.Message)
|
|
published := res.Message.(*livekit.SignalResponse_TrackPublished).TrackPublished
|
|
require.Equal(t, "cid", published.Cid)
|
|
require.Equal(t, "webcam", published.Track.Name)
|
|
require.Equal(t, livekit.TrackType_VIDEO, published.Track.Type)
|
|
})
|
|
|
|
t.Run("should not allow adding of duplicate tracks", func(t *testing.T) {
|
|
p := newParticipantForTest("test")
|
|
//track := &typesfakes.FakePublishedTrack{}
|
|
//track.IDReturns("id")
|
|
sink := p.params.Sink.(*routingfakes.FakeMessageSink)
|
|
p.AddTrack("cid", "webcam", livekit.TrackType_VIDEO)
|
|
p.AddTrack("cid", "duplicate", livekit.TrackType_AUDIO)
|
|
|
|
require.Equal(t, 1, sink.WriteMessageCallCount())
|
|
})
|
|
}
|
|
|
|
// after disconnection, things should continue to function and not panic
|
|
func TestDisconnectTiming(t *testing.T) {
|
|
t.Run("Negotiate doesn't panic after channel closed", func(t *testing.T) {
|
|
p := newParticipantForTest("test")
|
|
msg := routing.NewMessageChannel()
|
|
p.params.Sink = msg
|
|
go func() {
|
|
for msg := range msg.ReadChan() {
|
|
t.Log("received message from chan", msg)
|
|
}
|
|
}()
|
|
track := &typesfakes.FakePublishedTrack{}
|
|
p.handleTrackPublished(track)
|
|
|
|
// close channel and then try to Negotiate
|
|
msg.Close()
|
|
})
|
|
}
|
|
|
|
func TestCorrectJoinedAt(t *testing.T) {
|
|
p := newParticipantForTest("test")
|
|
info := p.ToProto()
|
|
require.NotZero(t, info.JoinedAt)
|
|
require.True(t, time.Now().Unix()-info.JoinedAt <= 1)
|
|
}
|
|
|
|
func newParticipantForTest(identity string) *ParticipantImpl {
|
|
conf, _ := config.NewConfig("")
|
|
// disable mux, it doesn't play too well with unit test
|
|
conf.RTC.UDPPort = 0
|
|
conf.RTC.TCPPort = 0
|
|
rtcConf, err := NewWebRTCConfig(&conf.RTC, "")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
p, _ := NewParticipant(ParticipantParams{
|
|
Identity: identity,
|
|
Config: rtcConf,
|
|
Sink: &routingfakes.FakeMessageSink{},
|
|
ProtocolVersion: 0,
|
|
})
|
|
return p
|
|
}
|