diff --git a/media/sctp/sctp_transport.cc b/media/sctp/sctp_transport.cc index 40061a6048..effb2211ae 100644 --- a/media/sctp/sctp_transport.cc +++ b/media/sctp/sctp_transport.cc @@ -1182,6 +1182,9 @@ void SctpTransport::OnNotificationAssocChange(const sctp_assoc_change& change) { max_outbound_streams_ = change.sac_outbound_streams; max_inbound_streams_ = change.sac_inbound_streams; SignalAssociationChangeCommunicationUp(); + // In case someone tried to close a stream before communication + // came up, send any queued resets. + SendQueuedStreamResets(); break; case SCTP_COMM_LOST: RTC_LOG(LS_INFO) << "Association change SCTP_COMM_LOST"; diff --git a/media/sctp/sctp_transport_unittest.cc b/media/sctp/sctp_transport_unittest.cc index ff3f2d70a9..da6c6290fd 100644 --- a/media/sctp/sctp_transport_unittest.cc +++ b/media/sctp/sctp_transport_unittest.cc @@ -605,6 +605,15 @@ TEST_F(SctpTransportTest, ClosesRemoteStream) { transport1()->ResetStream(1); EXPECT_TRUE_WAIT(transport2_observer.WasStreamClosed(1), kDefaultTimeout); } +TEST_F(SctpTransportTest, ClosesRemoteStreamWithNoData) { + SetupConnectedTransportsWithTwoStreams(); + SctpTransportObserver transport1_observer(transport1()); + SctpTransportObserver transport2_observer(transport2()); + + // Close stream 1 on transport 1. Transport 2 should notify us. + transport1()->ResetStream(1); + EXPECT_TRUE_WAIT(transport2_observer.WasStreamClosed(1), kDefaultTimeout); +} TEST_F(SctpTransportTest, ClosesTwoRemoteStreams) { SetupConnectedTransportsWithTwoStreams();