Files
webrtc/settingengine_test.go
Steffen Vogel eafdc7742a Use new pion/transport Net interface
This change adapts pion/ice to use a new interface for most network
related operations. The interface was formerly a simple struct vnet.Net
which was originally intended to facilicate testing. By replacing it
with an interface we have greater flexibility and allow users to hook
into the networking stack by providing their own implementation of
the interface.
2023-02-09 09:39:33 +01:00

245 lines
6.7 KiB
Go

//go:build !js
// +build !js
package webrtc
import (
"net"
"testing"
"time"
"github.com/pion/transport/v2/test"
"github.com/stretchr/testify/assert"
)
func TestSetEphemeralUDPPortRange(t *testing.T) {
s := SettingEngine{}
if s.ephemeralUDP.PortMin != 0 ||
s.ephemeralUDP.PortMax != 0 {
t.Fatalf("SettingEngine defaults aren't as expected.")
}
// set bad ephemeral ports
if err := s.SetEphemeralUDPPortRange(3000, 2999); err == nil {
t.Fatalf("Setting engine should fail bad ephemeral ports.")
}
if err := s.SetEphemeralUDPPortRange(3000, 4000); err != nil {
t.Fatalf("Setting engine failed valid port range: %s", err)
}
if s.ephemeralUDP.PortMin != 3000 ||
s.ephemeralUDP.PortMax != 4000 {
t.Fatalf("Setting engine ports do not reflect expected range")
}
}
func TestSetConnectionTimeout(t *testing.T) {
s := SettingEngine{}
var nilDuration *time.Duration
assert.Equal(t, s.timeout.ICEDisconnectedTimeout, nilDuration)
assert.Equal(t, s.timeout.ICEFailedTimeout, nilDuration)
assert.Equal(t, s.timeout.ICEKeepaliveInterval, nilDuration)
s.SetICETimeouts(1*time.Second, 2*time.Second, 3*time.Second)
assert.Equal(t, *s.timeout.ICEDisconnectedTimeout, 1*time.Second)
assert.Equal(t, *s.timeout.ICEFailedTimeout, 2*time.Second)
assert.Equal(t, *s.timeout.ICEKeepaliveInterval, 3*time.Second)
}
func TestDetachDataChannels(t *testing.T) {
s := SettingEngine{}
if s.detach.DataChannels {
t.Fatalf("SettingEngine defaults aren't as expected.")
}
s.DetachDataChannels()
if !s.detach.DataChannels {
t.Fatalf("Failed to enable detached data channels.")
}
}
func TestSetNAT1To1IPs(t *testing.T) {
s := SettingEngine{}
if s.candidates.NAT1To1IPs != nil {
t.Errorf("Invalid default value")
}
if s.candidates.NAT1To1IPCandidateType != 0 {
t.Errorf("Invalid default value")
}
ips := []string{"1.2.3.4"}
typ := ICECandidateTypeHost
s.SetNAT1To1IPs(ips, typ)
if len(s.candidates.NAT1To1IPs) != 1 || s.candidates.NAT1To1IPs[0] != "1.2.3.4" {
t.Fatalf("Failed to set NAT1To1IPs")
}
if s.candidates.NAT1To1IPCandidateType != typ {
t.Fatalf("Failed to set NAT1To1IPCandidateType")
}
}
func TestSetAnsweringDTLSRole(t *testing.T) {
s := SettingEngine{}
assert.Error(t, s.SetAnsweringDTLSRole(DTLSRoleAuto), "SetAnsweringDTLSRole can only be called with DTLSRoleClient or DTLSRoleServer")
assert.Error(t, s.SetAnsweringDTLSRole(DTLSRole(0)), "SetAnsweringDTLSRole can only be called with DTLSRoleClient or DTLSRoleServer")
}
func TestSetReplayProtection(t *testing.T) {
s := SettingEngine{}
if s.replayProtection.DTLS != nil ||
s.replayProtection.SRTP != nil ||
s.replayProtection.SRTCP != nil {
t.Fatalf("SettingEngine defaults aren't as expected.")
}
s.SetDTLSReplayProtectionWindow(128)
s.SetSRTPReplayProtectionWindow(64)
s.SetSRTCPReplayProtectionWindow(32)
if s.replayProtection.DTLS == nil ||
*s.replayProtection.DTLS != 128 {
t.Errorf("Failed to set DTLS replay protection window")
}
if s.replayProtection.SRTP == nil ||
*s.replayProtection.SRTP != 64 {
t.Errorf("Failed to set SRTP replay protection window")
}
if s.replayProtection.SRTCP == nil ||
*s.replayProtection.SRTCP != 32 {
t.Errorf("Failed to set SRTCP replay protection window")
}
}
func TestSettingEngine_SetICETCP(t *testing.T) {
report := test.CheckRoutines(t)
defer report()
listener, err := net.ListenTCP("tcp", &net.TCPAddr{})
if err != nil {
panic(err)
}
defer func() {
_ = listener.Close()
}()
tcpMux := NewICETCPMux(nil, listener, 8)
defer func() {
_ = tcpMux.Close()
}()
settingEngine := SettingEngine{}
settingEngine.SetICETCPMux(tcpMux)
assert.Equal(t, tcpMux, settingEngine.iceTCPMux)
}
func TestSettingEngine_SetDisableMediaEngineCopy(t *testing.T) {
t.Run("Copy", func(t *testing.T) {
m := &MediaEngine{}
assert.NoError(t, m.RegisterDefaultCodecs())
api := NewAPI(WithMediaEngine(m))
offerer, answerer, err := api.newPair(Configuration{})
assert.NoError(t, err)
_, err = offerer.AddTransceiverFromKind(RTPCodecTypeVideo)
assert.NoError(t, err)
assert.NoError(t, signalPair(offerer, answerer))
// Assert that the MediaEngine the user created isn't modified
assert.False(t, m.negotiatedVideo)
assert.Empty(t, m.negotiatedVideoCodecs)
// Assert that the internal MediaEngine is modified
assert.True(t, offerer.api.mediaEngine.negotiatedVideo)
assert.NotEmpty(t, offerer.api.mediaEngine.negotiatedVideoCodecs)
closePairNow(t, offerer, answerer)
newOfferer, newAnswerer, err := api.newPair(Configuration{})
assert.NoError(t, err)
// Assert that the first internal MediaEngine hasn't been cleared
assert.True(t, offerer.api.mediaEngine.negotiatedVideo)
assert.NotEmpty(t, offerer.api.mediaEngine.negotiatedVideoCodecs)
// Assert that the new internal MediaEngine isn't modified
assert.False(t, newOfferer.api.mediaEngine.negotiatedVideo)
assert.Empty(t, newAnswerer.api.mediaEngine.negotiatedVideoCodecs)
closePairNow(t, newOfferer, newAnswerer)
})
t.Run("No Copy", func(t *testing.T) {
m := &MediaEngine{}
assert.NoError(t, m.RegisterDefaultCodecs())
s := SettingEngine{}
s.DisableMediaEngineCopy(true)
api := NewAPI(WithMediaEngine(m), WithSettingEngine(s))
offerer, answerer, err := api.newPair(Configuration{})
assert.NoError(t, err)
_, err = offerer.AddTransceiverFromKind(RTPCodecTypeVideo)
assert.NoError(t, err)
assert.NoError(t, signalPair(offerer, answerer))
// Assert that the user MediaEngine was modified, so no copy happened
assert.True(t, m.negotiatedVideo)
assert.NotEmpty(t, m.negotiatedVideoCodecs)
closePairNow(t, offerer, answerer)
offerer, answerer, err = api.newPair(Configuration{})
assert.NoError(t, err)
// Assert that the new internal MediaEngine was modified, so no copy happened
assert.True(t, offerer.api.mediaEngine.negotiatedVideo)
assert.NotEmpty(t, offerer.api.mediaEngine.negotiatedVideoCodecs)
closePairNow(t, offerer, answerer)
})
}
func TestSetDTLSRetransmissionInterval(t *testing.T) {
s := SettingEngine{}
if s.dtls.retransmissionInterval != 0 {
t.Fatalf("SettingEngine defaults aren't as expected.")
}
s.SetDTLSRetransmissionInterval(100 * time.Millisecond)
if s.dtls.retransmissionInterval == 0 ||
s.dtls.retransmissionInterval != 100*time.Millisecond {
t.Errorf("Failed to set DTLS retransmission interval")
}
s.SetDTLSRetransmissionInterval(1 * time.Second)
if s.dtls.retransmissionInterval == 0 ||
s.dtls.retransmissionInterval != 1*time.Second {
t.Errorf("Failed to set DTLS retransmission interval")
}
}
func TestSetSCTPMaxReceiverBufferSize(t *testing.T) {
s := SettingEngine{}
assert.Equal(t, uint32(0), s.sctp.maxReceiveBufferSize)
expSize := uint32(4 * 1024 * 1024)
s.SetSCTPMaxReceiveBufferSize(expSize)
assert.Equal(t, expSize, s.sctp.maxReceiveBufferSize)
}