diff --git a/pc/dtlstransport.cc b/pc/dtlstransport.cc index 6e84d64e9c..eb1bc04a2e 100644 --- a/pc/dtlstransport.cc +++ b/pc/dtlstransport.cc @@ -77,7 +77,15 @@ void DtlsTransport::UnregisterObserver() { // Internal functions void DtlsTransport::Clear() { RTC_DCHECK(signaling_thread_->IsCurrent()); - internal_dtls_transport_.reset(); + RTC_DCHECK(internal()); + if (internal()->dtls_state() != cricket::DTLS_TRANSPORT_CLOSED) { + internal_dtls_transport_.reset(); + if (observer_) { + observer_->OnStateChange(Information()); + } + } else { + internal_dtls_transport_.reset(); + } } void DtlsTransport::OnInternalDtlsState( diff --git a/pc/dtlstransport_unittest.cc b/pc/dtlstransport_unittest.cc index 62c5e24c7a..05e3797045 100644 --- a/pc/dtlstransport_unittest.cc +++ b/pc/dtlstransport_unittest.cc @@ -35,6 +35,14 @@ class TestDtlsTransportObserver : public DtlsTransportObserverInterface { void OnError(RTCError error) override {} + DtlsTransportState state() { + if (states_.size() > 0) { + return states_[states_.size() - 1]; + } else { + return DtlsTransportState::kNew; + } + } + bool state_change_called_ = false; std::vector states_; }; @@ -94,4 +102,15 @@ TEST_F(DtlsTransportTest, EventsObservedWhenConnecting) { DtlsTransportState::kConnected)); } +TEST_F(DtlsTransportTest, CloseWhenClearing) { + CreateTransport(); + transport()->RegisterObserver(observer()); + CompleteDtlsHandshake(); + ASSERT_TRUE_WAIT(observer_.state() == DtlsTransportState::kConnected, + kDefaultTimeout); + transport()->Clear(); + ASSERT_TRUE_WAIT(observer_.state() == DtlsTransportState::kClosed, + kDefaultTimeout); +} + } // namespace webrtc