Index: net/quic/stream_sequencer_buffer_test.cc |
diff --git a/net/quic/stream_sequencer_buffer_test.cc b/net/quic/stream_sequencer_buffer_test.cc |
index ccebb73539ea7e7a7abd9f9678988f40defe8da7..348205ffd2c7e04fd95d25e9f47880d2bc811576 100644 |
--- a/net/quic/stream_sequencer_buffer_test.cc |
+++ b/net/quic/stream_sequencer_buffer_test.cc |
@@ -135,6 +135,12 @@ class StreamSequencerBufferPeer { |
return &(buffer_->frame_arrival_time_map_); |
} |
+ void set_total_bytes_read(QuicStreamOffset total_bytes_read) { |
+ buffer_->total_bytes_read_ = total_bytes_read; |
+ } |
+ |
+ void set_gaps(const std::list<Gap>& gaps) { buffer_->gaps_ = gaps; } |
+ |
private: |
StreamSequencerBuffer* buffer_; |
}; |
@@ -277,6 +283,39 @@ TEST_F(StreamSequencerBufferTest, OnStreamDataWithoutOverlap) { |
EXPECT_TRUE(helper_->CheckBufferInvariants()); |
} |
+TEST_F(StreamSequencerBufferTest, OnStreamDataInLongStreamWithOverlap) { |
+ // Assume a stream has already buffered almost 4GB. |
+ uint64_t total_bytes_read = pow(2, 32) - 1; |
+ helper_->set_total_bytes_read(total_bytes_read); |
+ helper_->set_gaps(std::list<Gap>( |
+ 1, Gap(total_bytes_read, std::numeric_limits<QuicStreamOffset>::max()))); |
+ |
+ // Three new out of order frames arrive. |
+ const size_t kBytesToWrite = 100; |
+ string source(kBytesToWrite, 'a'); |
+ size_t written; |
+ // Frame [2^32 + 500, 2^32 + 600). |
+ QuicStreamOffset offset = pow(2, 32) + 500; |
+ EXPECT_EQ( |
+ QUIC_NO_ERROR, |
+ buffer_->OnStreamData(offset, source, clock_.ApproximateNow(), &written)); |
+ EXPECT_EQ(2, helper_->GapSize()); |
+ |
+ // Frame [2^32 + 700, 2^32 + 800). |
+ offset = pow(2, 32) + 700; |
+ EXPECT_EQ( |
+ QUIC_NO_ERROR, |
+ buffer_->OnStreamData(offset, source, clock_.ApproximateNow(), &written)); |
+ EXPECT_EQ(3, helper_->GapSize()); |
+ |
+ // Another frame [2^32 + 300, 2^32 + 400). |
+ offset = pow(2, 32) + 300; |
+ EXPECT_EQ( |
+ QUIC_NO_ERROR, |
+ buffer_->OnStreamData(offset, source, clock_.ApproximateNow(), &written)); |
+ EXPECT_EQ(4, helper_->GapSize()); |
+} |
+ |
TEST_F(StreamSequencerBufferTest, OnStreamDataTillEnd) { |
// Write 50 bytes to the end. |
const size_t kBytesToWrite = 50; |