dtlstransport_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. "regexp"
  8. "testing"
  9. "time"
  10. "github.com/pion/transport/v2/test"
  11. "github.com/stretchr/testify/assert"
  12. )
  13. // An invalid fingerprint MUST cause PeerConnectionState to go to PeerConnectionStateFailed
  14. func TestInvalidFingerprintCausesFailed(t *testing.T) {
  15. lim := test.TimeOut(time.Second * 40)
  16. defer lim.Stop()
  17. report := test.CheckRoutines(t)
  18. defer report()
  19. pcOffer, err := NewPeerConnection(Configuration{})
  20. if err != nil {
  21. t.Fatal(err)
  22. }
  23. pcAnswer, err := NewPeerConnection(Configuration{})
  24. if err != nil {
  25. t.Fatal(err)
  26. }
  27. pcAnswer.OnDataChannel(func(_ *DataChannel) {
  28. t.Fatal("A DataChannel must not be created when Fingerprint verification fails")
  29. })
  30. defer closePairNow(t, pcOffer, pcAnswer)
  31. offerChan := make(chan SessionDescription)
  32. pcOffer.OnICECandidate(func(candidate *ICECandidate) {
  33. if candidate == nil {
  34. offerChan <- *pcOffer.PendingLocalDescription()
  35. }
  36. })
  37. offerConnectionHasFailed := untilConnectionState(PeerConnectionStateFailed, pcOffer)
  38. answerConnectionHasFailed := untilConnectionState(PeerConnectionStateFailed, pcAnswer)
  39. if _, err = pcOffer.CreateDataChannel("unusedDataChannel", nil); err != nil {
  40. t.Fatal(err)
  41. }
  42. offer, err := pcOffer.CreateOffer(nil)
  43. if err != nil {
  44. t.Fatal(err)
  45. } else if err := pcOffer.SetLocalDescription(offer); err != nil {
  46. t.Fatal(err)
  47. }
  48. select {
  49. case offer := <-offerChan:
  50. // Replace with invalid fingerprint
  51. re := regexp.MustCompile(`sha-256 (.*?)\r`)
  52. offer.SDP = re.ReplaceAllString(offer.SDP, "sha-256 AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA\r")
  53. if err := pcAnswer.SetRemoteDescription(offer); err != nil {
  54. t.Fatal(err)
  55. }
  56. answer, err := pcAnswer.CreateAnswer(nil)
  57. if err != nil {
  58. t.Fatal(err)
  59. }
  60. if err = pcAnswer.SetLocalDescription(answer); err != nil {
  61. t.Fatal(err)
  62. }
  63. answer.SDP = re.ReplaceAllString(answer.SDP, "sha-256 AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA:AA\r")
  64. err = pcOffer.SetRemoteDescription(answer)
  65. if err != nil {
  66. t.Fatal(err)
  67. }
  68. case <-time.After(5 * time.Second):
  69. t.Fatal("timed out waiting to receive offer")
  70. }
  71. offerConnectionHasFailed.Wait()
  72. answerConnectionHasFailed.Wait()
  73. assert.Equal(t, pcOffer.SCTP().Transport().State(), DTLSTransportStateFailed)
  74. assert.Nil(t, pcOffer.SCTP().Transport().conn)
  75. assert.Equal(t, pcAnswer.SCTP().Transport().State(), DTLSTransportStateFailed)
  76. assert.Nil(t, pcAnswer.SCTP().Transport().conn)
  77. }
  78. func TestPeerConnection_DTLSRoleSettingEngine(t *testing.T) {
  79. runTest := func(r DTLSRole) {
  80. s := SettingEngine{}
  81. assert.NoError(t, s.SetAnsweringDTLSRole(r))
  82. offerPC, err := NewAPI(WithSettingEngine(s)).NewPeerConnection(Configuration{})
  83. if err != nil {
  84. t.Fatal(err)
  85. }
  86. answerPC, err := NewAPI(WithSettingEngine(s)).NewPeerConnection(Configuration{})
  87. if err != nil {
  88. t.Fatal(err)
  89. }
  90. if err = signalPair(offerPC, answerPC); err != nil {
  91. t.Fatal(err)
  92. }
  93. connectionComplete := untilConnectionState(PeerConnectionStateConnected, answerPC)
  94. connectionComplete.Wait()
  95. closePairNow(t, offerPC, answerPC)
  96. }
  97. report := test.CheckRoutines(t)
  98. defer report()
  99. t.Run("Server", func(t *testing.T) {
  100. runTest(DTLSRoleServer)
  101. })
  102. t.Run("Client", func(t *testing.T) {
  103. runTest(DTLSRoleClient)
  104. })
  105. }