signalingstate_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
  2. // SPDX-License-Identifier: MIT
  3. package webrtc
  4. import (
  5. "testing"
  6. "github.com/pion/webrtc/v3/pkg/rtcerr"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. func TestNewSignalingState(t *testing.T) {
  10. testCases := []struct {
  11. stateString string
  12. expectedState SignalingState
  13. }{
  14. {unknownStr, SignalingState(Unknown)},
  15. {"stable", SignalingStateStable},
  16. {"have-local-offer", SignalingStateHaveLocalOffer},
  17. {"have-remote-offer", SignalingStateHaveRemoteOffer},
  18. {"have-local-pranswer", SignalingStateHaveLocalPranswer},
  19. {"have-remote-pranswer", SignalingStateHaveRemotePranswer},
  20. {"closed", SignalingStateClosed},
  21. }
  22. for i, testCase := range testCases {
  23. assert.Equal(t,
  24. testCase.expectedState,
  25. newSignalingState(testCase.stateString),
  26. "testCase: %d %v", i, testCase,
  27. )
  28. }
  29. }
  30. func TestSignalingState_String(t *testing.T) {
  31. testCases := []struct {
  32. state SignalingState
  33. expectedString string
  34. }{
  35. {SignalingState(Unknown), unknownStr},
  36. {SignalingStateStable, "stable"},
  37. {SignalingStateHaveLocalOffer, "have-local-offer"},
  38. {SignalingStateHaveRemoteOffer, "have-remote-offer"},
  39. {SignalingStateHaveLocalPranswer, "have-local-pranswer"},
  40. {SignalingStateHaveRemotePranswer, "have-remote-pranswer"},
  41. {SignalingStateClosed, "closed"},
  42. }
  43. for i, testCase := range testCases {
  44. assert.Equal(t,
  45. testCase.expectedString,
  46. testCase.state.String(),
  47. "testCase: %d %v", i, testCase,
  48. )
  49. }
  50. }
  51. func TestSignalingState_Transitions(t *testing.T) {
  52. testCases := []struct {
  53. desc string
  54. current SignalingState
  55. next SignalingState
  56. op stateChangeOp
  57. sdpType SDPType
  58. expectedErr error
  59. }{
  60. {
  61. "stable->SetLocal(offer)->have-local-offer",
  62. SignalingStateStable,
  63. SignalingStateHaveLocalOffer,
  64. stateChangeOpSetLocal,
  65. SDPTypeOffer,
  66. nil,
  67. },
  68. {
  69. "stable->SetRemote(offer)->have-remote-offer",
  70. SignalingStateStable,
  71. SignalingStateHaveRemoteOffer,
  72. stateChangeOpSetRemote,
  73. SDPTypeOffer,
  74. nil,
  75. },
  76. {
  77. "have-local-offer->SetRemote(answer)->stable",
  78. SignalingStateHaveLocalOffer,
  79. SignalingStateStable,
  80. stateChangeOpSetRemote,
  81. SDPTypeAnswer,
  82. nil,
  83. },
  84. {
  85. "have-local-offer->SetRemote(pranswer)->have-remote-pranswer",
  86. SignalingStateHaveLocalOffer,
  87. SignalingStateHaveRemotePranswer,
  88. stateChangeOpSetRemote,
  89. SDPTypePranswer,
  90. nil,
  91. },
  92. {
  93. "have-remote-pranswer->SetRemote(answer)->stable",
  94. SignalingStateHaveRemotePranswer,
  95. SignalingStateStable,
  96. stateChangeOpSetRemote,
  97. SDPTypeAnswer,
  98. nil,
  99. },
  100. {
  101. "have-remote-offer->SetLocal(answer)->stable",
  102. SignalingStateHaveRemoteOffer,
  103. SignalingStateStable,
  104. stateChangeOpSetLocal,
  105. SDPTypeAnswer,
  106. nil,
  107. },
  108. {
  109. "have-remote-offer->SetLocal(pranswer)->have-local-pranswer",
  110. SignalingStateHaveRemoteOffer,
  111. SignalingStateHaveLocalPranswer,
  112. stateChangeOpSetLocal,
  113. SDPTypePranswer,
  114. nil,
  115. },
  116. {
  117. "have-local-pranswer->SetLocal(answer)->stable",
  118. SignalingStateHaveLocalPranswer,
  119. SignalingStateStable,
  120. stateChangeOpSetLocal,
  121. SDPTypeAnswer,
  122. nil,
  123. },
  124. {
  125. "(invalid) stable->SetRemote(pranswer)->have-remote-pranswer",
  126. SignalingStateStable,
  127. SignalingStateHaveRemotePranswer,
  128. stateChangeOpSetRemote,
  129. SDPTypePranswer,
  130. &rtcerr.InvalidModificationError{},
  131. },
  132. {
  133. "(invalid) stable->SetRemote(rollback)->have-local-offer",
  134. SignalingStateStable,
  135. SignalingStateHaveLocalOffer,
  136. stateChangeOpSetRemote,
  137. SDPTypeRollback,
  138. &rtcerr.InvalidModificationError{},
  139. },
  140. }
  141. for i, tc := range testCases {
  142. next, err := checkNextSignalingState(tc.current, tc.next, tc.op, tc.sdpType)
  143. if tc.expectedErr != nil {
  144. assert.Error(t, err, "testCase: %d %s", i, tc.desc)
  145. } else {
  146. assert.NoError(t, err, "testCase: %d %s", i, tc.desc)
  147. assert.Equal(t,
  148. tc.next,
  149. next,
  150. "testCase: %d %s", i, tc.desc,
  151. )
  152. }
  153. }
  154. }