| Index: net/quic/core/quic_stream_sequencer_buffer_test.cc
|
| diff --git a/net/quic/core/quic_stream_sequencer_buffer_test.cc b/net/quic/core/quic_stream_sequencer_buffer_test.cc
|
| index f987f9fd6eb5ed210bcc802f73e20f248e2fc54c..58b418c1e303fea9580b87136d0df6da70e9d09f 100644
|
| --- a/net/quic/core/quic_stream_sequencer_buffer_test.cc
|
| +++ b/net/quic/core/quic_stream_sequencer_buffer_test.cc
|
| @@ -60,7 +60,7 @@ class QuicStreamSequencerBufferPeer {
|
| explicit QuicStreamSequencerBufferPeer(QuicStreamSequencerBuffer* buffer)
|
| : buffer_(buffer) {}
|
|
|
| - // Read from this buffer_->into the given destination buffer_-> up to the
|
| + // Read from this buffer_ into the given destination buffer_ up to the
|
| // size of the destination. Returns the number of bytes read. Reading from
|
| // an empty buffer_->returns 0.
|
| size_t Read(char* dest_buffer, size_t size) {
|
| @@ -76,6 +76,11 @@ class QuicStreamSequencerBufferPeer {
|
| }
|
|
|
| bool IsBlockArrayEmpty() {
|
| + if (FLAGS_quic_reduce_sequencer_buffer_memory_life_time && // NOLINT
|
| + buffer_->blocks_ == nullptr) {
|
| + return true;
|
| + }
|
| +
|
| size_t count = buffer_->blocks_count_;
|
| for (size_t i = 0; i < count; i++) {
|
| if (buffer_->blocks_[i] != nullptr) {
|
| @@ -150,6 +155,8 @@ class QuicStreamSequencerBufferPeer {
|
|
|
| void set_gaps(const std::list<Gap>& gaps) { buffer_->gaps_ = gaps; }
|
|
|
| + bool IsBufferAllocated() { return buffer_->blocks_ != nullptr; }
|
| +
|
| private:
|
| QuicStreamSequencerBuffer* buffer_;
|
| };
|
| @@ -208,6 +215,9 @@ TEST_F(QuicStreamSequencerBufferTest, OnStreamData0length) {
|
| }
|
|
|
| TEST_F(QuicStreamSequencerBufferTest, OnStreamDataWithinBlock) {
|
| + if (FLAGS_quic_reduce_sequencer_buffer_memory_life_time) { // NOLINT
|
| + EXPECT_FALSE(helper_->IsBufferAllocated());
|
| + }
|
| string source(1024, 'a');
|
| size_t written;
|
| clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
|
| @@ -227,6 +237,7 @@ TEST_F(QuicStreamSequencerBufferTest, OnStreamDataWithinBlock) {
|
| EXPECT_EQ(800u, frame_map->begin()->first);
|
| EXPECT_EQ(t, (*frame_map)[800].timestamp);
|
| EXPECT_TRUE(helper_->CheckBufferInvariants());
|
| + EXPECT_TRUE(helper_->IsBufferAllocated());
|
| }
|
|
|
| TEST_F(QuicStreamSequencerBufferTest, OnStreamDataWithOverlap) {
|
| @@ -541,6 +552,31 @@ TEST_F(QuicStreamSequencerBufferTest, GetReadableRegionsEmpty) {
|
| EXPECT_EQ(0u, iovs[iov_count].iov_len);
|
| }
|
|
|
| +TEST_F(QuicStreamSequencerBufferTest, ReleaseWholeBuffer) {
|
| + // Tests that buffer is not deallocated unless ReleaseWholeBuffer() is called.
|
| + if (!FLAGS_quic_reduce_sequencer_buffer_memory_life_time) { // NOLINT
|
| + // Won't release buffer when flag is off.
|
| + return;
|
| + }
|
| +
|
| + string source(100, 'b');
|
| + clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
|
| + QuicTime t1 = clock_.ApproximateNow();
|
| + // Write something into [0, 100).
|
| + size_t written;
|
| + buffer_->OnStreamData(0, source, t1, &written, &error_details_);
|
| + EXPECT_TRUE(buffer_->HasBytesToRead());
|
| + char dest[120];
|
| + iovec iovecs[3]{iovec{dest, 40}, iovec{dest + 40, 40}, iovec{dest + 80, 40}};
|
| + size_t read = buffer_->Readv(iovecs, 3);
|
| + EXPECT_EQ(100u, read);
|
| + EXPECT_EQ(100u, buffer_->BytesConsumed());
|
| + EXPECT_TRUE(helper_->CheckBufferInvariants());
|
| + EXPECT_TRUE(helper_->IsBufferAllocated());
|
| + buffer_->ReleaseWholeBuffer();
|
| + EXPECT_FALSE(helper_->IsBufferAllocated());
|
| +}
|
| +
|
| TEST_F(QuicStreamSequencerBufferTest, GetReadableRegionsBlockedByGap) {
|
| // Write into [1, 1024).
|
| string source(1023, 'a');
|
|
|