Modify write_index_ advancement to incorporate coalescing stream frames.
gfe-relnote: protected by gfe2_restart_flag_quic_coalesce_stream_frames_2
PiperOrigin-RevId: 279803164
Change-Id: Idc809c831725b92401b2fd5864379398ddec1bf0
diff --git a/quic/core/quic_stream_send_buffer_test.cc b/quic/core/quic_stream_send_buffer_test.cc
index 3a5efb5..a6a7ad2 100644
--- a/quic/core/quic_stream_send_buffer_test.cc
+++ b/quic/core/quic_stream_send_buffer_test.cc
@@ -115,6 +115,41 @@
EXPECT_EQ(3840u, send_buffer_.stream_bytes_outstanding());
}
+// Regression test for b/143491027.
+TEST_F(QuicStreamSendBufferTest,
+ WriteStreamDataContainsBothRetransmissionAndNewData) {
+ std::string copy1(1024, 'a');
+ std::string copy2 =
+ std::string(512, 'a') + std::string(256, 'b') + std::string(256, 'c');
+ std::string copy3 = std::string(1024, 'c') + std::string(100, 'd');
+ char buf[6000];
+ QuicDataWriter writer(6000, buf, HOST_BYTE_ORDER);
+ // Write more than one slice.
+ EXPECT_EQ(0, QuicStreamSendBufferPeer::write_index(&send_buffer_));
+ ASSERT_TRUE(send_buffer_.WriteStreamData(0, 1024, &writer));
+ EXPECT_EQ(copy1, QuicStringPiece(buf, 1024));
+ EXPECT_EQ(1, QuicStreamSendBufferPeer::write_index(&send_buffer_));
+
+ // Retransmit the first frame and also send new data.
+ ASSERT_TRUE(send_buffer_.WriteStreamData(0, 2048, &writer));
+ EXPECT_EQ(copy1 + copy2, QuicStringPiece(buf + 1024, 2048));
+
+ // Write new data.
+ if (!GetQuicRestartFlag(quic_coalesce_stream_frames_2)) {
+ EXPECT_EQ(1, QuicStreamSendBufferPeer::write_index(&send_buffer_));
+ EXPECT_DEBUG_DEATH(send_buffer_.WriteStreamData(2048, 50, &writer),
+ "Tried to write data out of sequence.");
+ } else {
+ EXPECT_EQ(2, QuicStreamSendBufferPeer::write_index(&send_buffer_));
+ ASSERT_TRUE(send_buffer_.WriteStreamData(2048, 50, &writer));
+ EXPECT_EQ(std::string(50, 'c'), QuicStringPiece(buf + 1024 + 2048, 50));
+ EXPECT_EQ(2, QuicStreamSendBufferPeer::write_index(&send_buffer_));
+ ASSERT_TRUE(send_buffer_.WriteStreamData(2048, 1124, &writer));
+ EXPECT_EQ(copy3, QuicStringPiece(buf + 1024 + 2048 + 50, 1124));
+ EXPECT_EQ(3, QuicStreamSendBufferPeer::write_index(&send_buffer_));
+ }
+}
+
TEST_F(QuicStreamSendBufferTest, RemoveStreamFrame) {
WriteAllData();