iceserver_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. "encoding/json"
  8. "testing"
  9. "github.com/pion/stun"
  10. "github.com/pion/webrtc/v3/pkg/rtcerr"
  11. "github.com/stretchr/testify/assert"
  12. )
  13. func TestICEServer_validate(t *testing.T) {
  14. t.Run("Success", func(t *testing.T) {
  15. testCases := []struct {
  16. iceServer ICEServer
  17. expectedValidate bool
  18. }{
  19. {ICEServer{
  20. URLs: []string{"turn:192.158.29.39?transport=udp"},
  21. Username: "unittest",
  22. Credential: "placeholder",
  23. CredentialType: ICECredentialTypePassword,
  24. }, true},
  25. {ICEServer{
  26. URLs: []string{"turn:[2001:db8:1234:5678::1]?transport=udp"},
  27. Username: "unittest",
  28. Credential: "placeholder",
  29. CredentialType: ICECredentialTypePassword,
  30. }, true},
  31. {ICEServer{
  32. URLs: []string{"turn:192.158.29.39?transport=udp"},
  33. Username: "unittest",
  34. Credential: OAuthCredential{
  35. MACKey: "WmtzanB3ZW9peFhtdm42NzUzNG0=",
  36. AccessToken: "AAwg3kPHWPfvk9bDFL936wYvkoctMADzQ5VhNDgeMR3+ZlZ35byg972fW8QjpEl7bx91YLBPFsIhsxloWcXPhA==",
  37. },
  38. CredentialType: ICECredentialTypeOauth,
  39. }, true},
  40. }
  41. for i, testCase := range testCases {
  42. var iceServer ICEServer
  43. jsonobj, err := json.Marshal(testCase.iceServer)
  44. assert.NoError(t, err)
  45. err = json.Unmarshal(jsonobj, &iceServer)
  46. assert.NoError(t, err)
  47. assert.Equal(t, iceServer, testCase.iceServer)
  48. _, err = testCase.iceServer.urls()
  49. assert.Nil(t, err, "testCase: %d %v", i, testCase)
  50. }
  51. })
  52. t.Run("Failure", func(t *testing.T) {
  53. testCases := []struct {
  54. iceServer ICEServer
  55. expectedErr error
  56. }{
  57. {ICEServer{
  58. URLs: []string{"turn:192.158.29.39?transport=udp"},
  59. }, &rtcerr.InvalidAccessError{Err: ErrNoTurnCredentials}},
  60. {ICEServer{
  61. URLs: []string{"turn:192.158.29.39?transport=udp"},
  62. Username: "unittest",
  63. Credential: false,
  64. CredentialType: ICECredentialTypePassword,
  65. }, &rtcerr.InvalidAccessError{Err: ErrTurnCredentials}},
  66. {ICEServer{
  67. URLs: []string{"turn:192.158.29.39?transport=udp"},
  68. Username: "unittest",
  69. Credential: false,
  70. CredentialType: ICECredentialTypeOauth,
  71. }, &rtcerr.InvalidAccessError{Err: ErrTurnCredentials}},
  72. {ICEServer{
  73. URLs: []string{"turn:192.158.29.39?transport=udp"},
  74. Username: "unittest",
  75. Credential: false,
  76. CredentialType: Unknown,
  77. }, &rtcerr.InvalidAccessError{Err: ErrTurnCredentials}},
  78. {ICEServer{
  79. URLs: []string{"stun:google.de?transport=udp"},
  80. Username: "unittest",
  81. Credential: false,
  82. CredentialType: ICECredentialTypeOauth,
  83. }, &rtcerr.InvalidAccessError{Err: stun.ErrSTUNQuery}},
  84. }
  85. for i, testCase := range testCases {
  86. _, err := testCase.iceServer.urls()
  87. assert.EqualError(t,
  88. err,
  89. testCase.expectedErr.Error(),
  90. "testCase: %d %v", i, testCase,
  91. )
  92. }
  93. })
  94. t.Run("JsonFailure", func(t *testing.T) {
  95. testCases := [][]byte{
  96. []byte(`{"urls":"NOTAURL","username":"unittest","credential":"placeholder","credentialType":"password"}`),
  97. []byte(`{"urls":["turn:[2001:db8:1234:5678::1]?transport=udp"],"username":"unittest","credential":"placeholder","credentialType":"invalid"}`),
  98. []byte(`{"urls":["turn:[2001:db8:1234:5678::1]?transport=udp"],"username":6,"credential":"placeholder","credentialType":"password"}`),
  99. []byte(`{"urls":["turn:192.158.29.39?transport=udp"],"username":"unittest","credential":{"Bad Object": true},"credentialType":"oauth"}`),
  100. []byte(`{"urls":["turn:192.158.29.39?transport=udp"],"username":"unittest","credential":{"MACKey":"WmtzanB3ZW9peFhtdm42NzUzNG0=","AccessToken":null,"credentialType":"oauth"}`),
  101. []byte(`{"urls":["turn:192.158.29.39?transport=udp"],"username":"unittest","credential":{"MACKey":"WmtzanB3ZW9peFhtdm42NzUzNG0=","AccessToken":null,"credentialType":"password"}`),
  102. []byte(`{"urls":["turn:192.158.29.39?transport=udp"],"username":"unittest","credential":{"MACKey":1337,"AccessToken":"AAwg3kPHWPfvk9bDFL936wYvkoctMADzQ5VhNDgeMR3+ZlZ35byg972fW8QjpEl7bx91YLBPFsIhsxloWcXPhA=="},"credentialType":"oauth"}`),
  103. }
  104. for i, testCase := range testCases {
  105. var tc ICEServer
  106. err := json.Unmarshal(testCase, &tc)
  107. assert.Error(t, err, "testCase: %d %v", i, string(testCase))
  108. }
  109. })
  110. }
  111. func TestICEServerZeroValue(t *testing.T) {
  112. server := ICEServer{
  113. URLs: []string{"turn:galene.org:1195"},
  114. Username: "galene",
  115. Credential: "secret",
  116. }
  117. assert.Equal(t, server.CredentialType, ICECredentialTypePassword)
  118. }