datachannel: Don't close a data channel when the queue is full According to https://w3c.github.io/webrtc-pc/#datachannel-send it should return an error, definitely not close the data channel. While we should probably return an RTCError will better information, this would break the API and will be done later. Bug: webrtc:13289 Change-Id: I90baf012440fbe2a38a826cf50b50b2b668fd7ff Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/237180 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Florent Castelli <orphis@webrtc.org> Cr-Commit-Position: refs/heads/main@{#35306}
diff --git a/pc/data_channel_unittest.cc b/pc/data_channel_unittest.cc index 770892c..44c080b 100644 --- a/pc/data_channel_unittest.cc +++ b/pc/data_channel_unittest.cc
@@ -544,23 +544,29 @@ EXPECT_EQ(webrtc::InternalDataChannelInit::kNone, init2.open_handshake_role); } -// Tests that the DataChannel is closed if the sending buffer is full. -TEST_F(SctpDataChannelTest, ClosedWhenSendBufferFull) { +// Tests that that Send() returns false if the sending buffer is full +// and the channel stays open. +TEST_F(SctpDataChannelTest, OpenWhenSendBufferFull) { SetChannelReady(); - rtc::CopyOnWriteBuffer buffer(1024); + const size_t packetSize = 1024; + + rtc::CopyOnWriteBuffer buffer(packetSize); memset(buffer.MutableData(), 0, buffer.size()); webrtc::DataBuffer packet(buffer, true); provider_->set_send_blocked(true); - for (size_t i = 0; i < 16 * 1024 + 1; ++i) { + for (size_t i = 0; + i < webrtc::DataChannelInterface::MaxSendQueueSize() / packetSize; ++i) { EXPECT_TRUE(webrtc_data_channel_->Send(packet)); } - EXPECT_TRUE( - webrtc::DataChannelInterface::kClosed == webrtc_data_channel_->state() || - webrtc::DataChannelInterface::kClosing == webrtc_data_channel_->state()); + // The sending buffer shoul be full, send returns false. + EXPECT_FALSE(webrtc_data_channel_->Send(packet)); + + EXPECT_TRUE(webrtc::DataChannelInterface::kOpen == + webrtc_data_channel_->state()); } // Tests that the DataChannel is closed on transport errors.