settingengine_test.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
  2. // SPDX-License-Identifier: MIT
  3. //go:build !js
  4. // +build !js
  5. package webrtc
  6. import (
  7. "context"
  8. "net"
  9. "testing"
  10. "time"
  11. "github.com/pion/dtls/v2/pkg/crypto/elliptic"
  12. "github.com/pion/transport/v2/test"
  13. "github.com/stretchr/testify/assert"
  14. )
  15. func TestSetEphemeralUDPPortRange(t *testing.T) {
  16. s := SettingEngine{}
  17. if s.ephemeralUDP.PortMin != 0 ||
  18. s.ephemeralUDP.PortMax != 0 {
  19. t.Fatalf("SettingEngine defaults aren't as expected.")
  20. }
  21. // set bad ephemeral ports
  22. if err := s.SetEphemeralUDPPortRange(3000, 2999); err == nil {
  23. t.Fatalf("Setting engine should fail bad ephemeral ports.")
  24. }
  25. if err := s.SetEphemeralUDPPortRange(3000, 4000); err != nil {
  26. t.Fatalf("Setting engine failed valid port range: %s", err)
  27. }
  28. if s.ephemeralUDP.PortMin != 3000 ||
  29. s.ephemeralUDP.PortMax != 4000 {
  30. t.Fatalf("Setting engine ports do not reflect expected range")
  31. }
  32. }
  33. func TestSetConnectionTimeout(t *testing.T) {
  34. s := SettingEngine{}
  35. var nilDuration *time.Duration
  36. assert.Equal(t, s.timeout.ICEDisconnectedTimeout, nilDuration)
  37. assert.Equal(t, s.timeout.ICEFailedTimeout, nilDuration)
  38. assert.Equal(t, s.timeout.ICEKeepaliveInterval, nilDuration)
  39. s.SetICETimeouts(1*time.Second, 2*time.Second, 3*time.Second)
  40. assert.Equal(t, *s.timeout.ICEDisconnectedTimeout, 1*time.Second)
  41. assert.Equal(t, *s.timeout.ICEFailedTimeout, 2*time.Second)
  42. assert.Equal(t, *s.timeout.ICEKeepaliveInterval, 3*time.Second)
  43. }
  44. func TestDetachDataChannels(t *testing.T) {
  45. s := SettingEngine{}
  46. if s.detach.DataChannels {
  47. t.Fatalf("SettingEngine defaults aren't as expected.")
  48. }
  49. s.DetachDataChannels()
  50. if !s.detach.DataChannels {
  51. t.Fatalf("Failed to enable detached data channels.")
  52. }
  53. }
  54. func TestSetNAT1To1IPs(t *testing.T) {
  55. s := SettingEngine{}
  56. if s.candidates.NAT1To1IPs != nil {
  57. t.Errorf("Invalid default value")
  58. }
  59. if s.candidates.NAT1To1IPCandidateType != 0 {
  60. t.Errorf("Invalid default value")
  61. }
  62. ips := []string{"1.2.3.4"}
  63. typ := ICECandidateTypeHost
  64. s.SetNAT1To1IPs(ips, typ)
  65. if len(s.candidates.NAT1To1IPs) != 1 || s.candidates.NAT1To1IPs[0] != "1.2.3.4" {
  66. t.Fatalf("Failed to set NAT1To1IPs")
  67. }
  68. if s.candidates.NAT1To1IPCandidateType != typ {
  69. t.Fatalf("Failed to set NAT1To1IPCandidateType")
  70. }
  71. }
  72. func TestSetAnsweringDTLSRole(t *testing.T) {
  73. s := SettingEngine{}
  74. assert.Error(t, s.SetAnsweringDTLSRole(DTLSRoleAuto), "SetAnsweringDTLSRole can only be called with DTLSRoleClient or DTLSRoleServer")
  75. assert.Error(t, s.SetAnsweringDTLSRole(DTLSRole(0)), "SetAnsweringDTLSRole can only be called with DTLSRoleClient or DTLSRoleServer")
  76. }
  77. func TestSetReplayProtection(t *testing.T) {
  78. s := SettingEngine{}
  79. if s.replayProtection.DTLS != nil ||
  80. s.replayProtection.SRTP != nil ||
  81. s.replayProtection.SRTCP != nil {
  82. t.Fatalf("SettingEngine defaults aren't as expected.")
  83. }
  84. s.SetDTLSReplayProtectionWindow(128)
  85. s.SetSRTPReplayProtectionWindow(64)
  86. s.SetSRTCPReplayProtectionWindow(32)
  87. if s.replayProtection.DTLS == nil ||
  88. *s.replayProtection.DTLS != 128 {
  89. t.Errorf("Failed to set DTLS replay protection window")
  90. }
  91. if s.replayProtection.SRTP == nil ||
  92. *s.replayProtection.SRTP != 64 {
  93. t.Errorf("Failed to set SRTP replay protection window")
  94. }
  95. if s.replayProtection.SRTCP == nil ||
  96. *s.replayProtection.SRTCP != 32 {
  97. t.Errorf("Failed to set SRTCP replay protection window")
  98. }
  99. }
  100. func TestSettingEngine_SetICETCP(t *testing.T) {
  101. report := test.CheckRoutines(t)
  102. defer report()
  103. listener, err := net.ListenTCP("tcp", &net.TCPAddr{})
  104. if err != nil {
  105. panic(err)
  106. }
  107. defer func() {
  108. _ = listener.Close()
  109. }()
  110. tcpMux := NewICETCPMux(nil, listener, 8)
  111. defer func() {
  112. _ = tcpMux.Close()
  113. }()
  114. settingEngine := SettingEngine{}
  115. settingEngine.SetICETCPMux(tcpMux)
  116. assert.Equal(t, tcpMux, settingEngine.iceTCPMux)
  117. }
  118. func TestSettingEngine_SetDisableMediaEngineCopy(t *testing.T) {
  119. t.Run("Copy", func(t *testing.T) {
  120. m := &MediaEngine{}
  121. assert.NoError(t, m.RegisterDefaultCodecs())
  122. api := NewAPI(WithMediaEngine(m))
  123. offerer, answerer, err := api.newPair(Configuration{})
  124. assert.NoError(t, err)
  125. _, err = offerer.AddTransceiverFromKind(RTPCodecTypeVideo)
  126. assert.NoError(t, err)
  127. assert.NoError(t, signalPair(offerer, answerer))
  128. // Assert that the MediaEngine the user created isn't modified
  129. assert.False(t, m.negotiatedVideo)
  130. assert.Empty(t, m.negotiatedVideoCodecs)
  131. // Assert that the internal MediaEngine is modified
  132. assert.True(t, offerer.api.mediaEngine.negotiatedVideo)
  133. assert.NotEmpty(t, offerer.api.mediaEngine.negotiatedVideoCodecs)
  134. closePairNow(t, offerer, answerer)
  135. newOfferer, newAnswerer, err := api.newPair(Configuration{})
  136. assert.NoError(t, err)
  137. // Assert that the first internal MediaEngine hasn't been cleared
  138. assert.True(t, offerer.api.mediaEngine.negotiatedVideo)
  139. assert.NotEmpty(t, offerer.api.mediaEngine.negotiatedVideoCodecs)
  140. // Assert that the new internal MediaEngine isn't modified
  141. assert.False(t, newOfferer.api.mediaEngine.negotiatedVideo)
  142. assert.Empty(t, newAnswerer.api.mediaEngine.negotiatedVideoCodecs)
  143. closePairNow(t, newOfferer, newAnswerer)
  144. })
  145. t.Run("No Copy", func(t *testing.T) {
  146. m := &MediaEngine{}
  147. assert.NoError(t, m.RegisterDefaultCodecs())
  148. s := SettingEngine{}
  149. s.DisableMediaEngineCopy(true)
  150. api := NewAPI(WithMediaEngine(m), WithSettingEngine(s))
  151. offerer, answerer, err := api.newPair(Configuration{})
  152. assert.NoError(t, err)
  153. _, err = offerer.AddTransceiverFromKind(RTPCodecTypeVideo)
  154. assert.NoError(t, err)
  155. assert.NoError(t, signalPair(offerer, answerer))
  156. // Assert that the user MediaEngine was modified, so no copy happened
  157. assert.True(t, m.negotiatedVideo)
  158. assert.NotEmpty(t, m.negotiatedVideoCodecs)
  159. closePairNow(t, offerer, answerer)
  160. offerer, answerer, err = api.newPair(Configuration{})
  161. assert.NoError(t, err)
  162. // Assert that the new internal MediaEngine was modified, so no copy happened
  163. assert.True(t, offerer.api.mediaEngine.negotiatedVideo)
  164. assert.NotEmpty(t, offerer.api.mediaEngine.negotiatedVideoCodecs)
  165. closePairNow(t, offerer, answerer)
  166. })
  167. }
  168. func TestSetDTLSRetransmissionInterval(t *testing.T) {
  169. s := SettingEngine{}
  170. if s.dtls.retransmissionInterval != 0 {
  171. t.Fatalf("SettingEngine defaults aren't as expected.")
  172. }
  173. s.SetDTLSRetransmissionInterval(100 * time.Millisecond)
  174. if s.dtls.retransmissionInterval == 0 ||
  175. s.dtls.retransmissionInterval != 100*time.Millisecond {
  176. t.Errorf("Failed to set DTLS retransmission interval")
  177. }
  178. s.SetDTLSRetransmissionInterval(1 * time.Second)
  179. if s.dtls.retransmissionInterval == 0 ||
  180. s.dtls.retransmissionInterval != 1*time.Second {
  181. t.Errorf("Failed to set DTLS retransmission interval")
  182. }
  183. }
  184. func TestSetDTLSEllipticCurves(t *testing.T) {
  185. s := SettingEngine{}
  186. if len(s.dtls.ellipticCurves) != 0 {
  187. t.Fatalf("SettingEngine defaults aren't as expected.")
  188. }
  189. s.SetDTLSEllipticCurves(elliptic.P256)
  190. if len(s.dtls.ellipticCurves) == 0 ||
  191. s.dtls.ellipticCurves[0] != elliptic.P256 {
  192. t.Errorf("Failed to set DTLS elliptic curves")
  193. }
  194. }
  195. func TestSetDTLSHandShakeTimeout(*testing.T) {
  196. s := SettingEngine{}
  197. s.SetDTLSConnectContextMaker(func() (context.Context, func()) {
  198. return context.WithTimeout(context.Background(), 60*time.Second)
  199. })
  200. }
  201. func TestSetSCTPMaxReceiverBufferSize(t *testing.T) {
  202. s := SettingEngine{}
  203. assert.Equal(t, uint32(0), s.sctp.maxReceiveBufferSize)
  204. expSize := uint32(4 * 1024 * 1024)
  205. s.SetSCTPMaxReceiveBufferSize(expSize)
  206. assert.Equal(t, expSize, s.sctp.maxReceiveBufferSize)
  207. }