| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_stream_sequencer.h" | 5 #include "net/quic/quic_stream_sequencer.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/rand_util.h" | 11 #include "base/rand_util.h" |
| 12 #include "net/base/ip_endpoint.h" | 12 #include "net/base/ip_endpoint.h" |
| 13 #include "net/quic/quic_frame_list.h" |
| 13 #include "net/quic/quic_utils.h" | 14 #include "net/quic/quic_utils.h" |
| 14 #include "net/quic/reliable_quic_stream.h" | 15 #include "net/quic/reliable_quic_stream.h" |
| 15 #include "net/quic/test_tools/mock_clock.h" | 16 #include "net/quic/test_tools/mock_clock.h" |
| 16 #include "net/quic/test_tools/quic_stream_sequencer_peer.h" | 17 #include "net/quic/test_tools/quic_stream_sequencer_peer.h" |
| 17 #include "net/quic/test_tools/quic_test_utils.h" | 18 #include "net/quic/test_tools/quic_test_utils.h" |
| 18 #include "net/test/gtest_util.h" | 19 #include "net/test/gtest_util.h" |
| 19 #include "testing/gmock/include/gmock/gmock.h" | 20 #include "testing/gmock/include/gmock/gmock.h" |
| 20 #include "testing/gmock_mutant.h" | 21 #include "testing/gmock_mutant.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 22 | 23 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 36 namespace net { | 37 namespace net { |
| 37 namespace test { | 38 namespace test { |
| 38 | 39 |
| 39 class MockStream : public ReliableQuicStream { | 40 class MockStream : public ReliableQuicStream { |
| 40 public: | 41 public: |
| 41 MockStream(QuicSession* session, QuicStreamId id) | 42 MockStream(QuicSession* session, QuicStreamId id) |
| 42 : ReliableQuicStream(id, session) {} | 43 : ReliableQuicStream(id, session) {} |
| 43 | 44 |
| 44 MOCK_METHOD0(OnFinRead, void()); | 45 MOCK_METHOD0(OnFinRead, void()); |
| 45 MOCK_METHOD0(OnDataAvailable, void()); | 46 MOCK_METHOD0(OnDataAvailable, void()); |
| 46 MOCK_METHOD2(CloseConnectionWithDetails, void(QuicErrorCode error, | 47 MOCK_METHOD2(CloseConnectionWithDetails, |
| 47 const string& details)); | 48 void(QuicErrorCode error, const string& details)); |
| 48 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error)); | 49 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error)); |
| 49 MOCK_METHOD0(OnCanWrite, void()); | 50 MOCK_METHOD0(OnCanWrite, void()); |
| 50 QuicPriority EffectivePriority() const override { | 51 QuicPriority EffectivePriority() const override { |
| 51 return QuicUtils::HighestPriority(); | 52 return QuicUtils::HighestPriority(); |
| 52 } | 53 } |
| 53 virtual bool IsFlowControlEnabled() const { return true; } | 54 virtual bool IsFlowControlEnabled() const { return true; } |
| 54 }; | 55 }; |
| 55 | 56 |
| 56 namespace { | 57 namespace { |
| 57 | 58 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 71 | 72 |
| 72 protected: | 73 protected: |
| 73 QuicStreamSequencerTest() | 74 QuicStreamSequencerTest() |
| 74 : connection_(new MockConnection(&helper_, Perspective::IS_CLIENT)), | 75 : connection_(new MockConnection(&helper_, Perspective::IS_CLIENT)), |
| 75 session_(connection_), | 76 session_(connection_), |
| 76 stream_(&session_, 1), | 77 stream_(&session_, 1), |
| 77 sequencer_(new QuicStreamSequencer(&stream_, &clock_)) {} | 78 sequencer_(new QuicStreamSequencer(&stream_, &clock_)) {} |
| 78 | 79 |
| 79 bool VerifyReadableRegion(const char** expected) { | 80 bool VerifyReadableRegion(const char** expected) { |
| 80 iovec iovecs[1]; | 81 iovec iovecs[1]; |
| 81 if (sequencer_->GetReadableRegion(iovecs, nullptr)) { | 82 QuicTime timestamp = clock_.ApproximateNow(); |
| 83 if (sequencer_->GetReadableRegion(iovecs, ×tamp)) { |
| 82 return (VerifyIovecs(iovecs, 1, expected, 1)); | 84 return (VerifyIovecs(iovecs, 1, expected, 1)); |
| 83 } | 85 } |
| 84 return false; | 86 return false; |
| 85 } | 87 } |
| 86 | 88 |
| 87 bool VerifyReadableRegions(const char** expected, size_t num_expected) { | 89 bool VerifyReadableRegions(const char** expected, size_t num_expected) { |
| 88 iovec iovecs[5]; | 90 iovec iovecs[5]; |
| 89 size_t num_iovecs = | 91 size_t num_iovecs = |
| 90 sequencer_->GetReadableRegions(iovecs, arraysize(iovecs)); | 92 sequencer_->GetReadableRegions(iovecs, arraysize(iovecs)); |
| 91 return VerifyReadableRegion(expected) && | 93 return VerifyReadableRegion(expected) && |
| (...skipping 12 matching lines...) Expand all Loading... |
| 104 for (size_t i = 0; i < num_expected; ++i) { | 106 for (size_t i = 0; i < num_expected; ++i) { |
| 105 if (!VerifyIovec(iovecs[i], expected[i])) { | 107 if (!VerifyIovec(iovecs[i], expected[i])) { |
| 106 return false; | 108 return false; |
| 107 } | 109 } |
| 108 } | 110 } |
| 109 return true; | 111 return true; |
| 110 } | 112 } |
| 111 | 113 |
| 112 bool VerifyIovec(const iovec& iovec, StringPiece expected) { | 114 bool VerifyIovec(const iovec& iovec, StringPiece expected) { |
| 113 if (iovec.iov_len != expected.length()) { | 115 if (iovec.iov_len != expected.length()) { |
| 114 LOG(ERROR) << "Invalid length: " << iovec.iov_len | 116 LOG(ERROR) << "Invalid length: " << iovec.iov_len << " vs " |
| 115 << " vs " << expected.length(); | 117 << expected.length(); |
| 116 return false; | 118 return false; |
| 117 } | 119 } |
| 118 if (memcmp(iovec.iov_base, expected.data(), expected.length()) != 0) { | 120 if (memcmp(iovec.iov_base, expected.data(), expected.length()) != 0) { |
| 119 LOG(ERROR) << "Invalid data: " << static_cast<char*>(iovec.iov_base) | 121 LOG(ERROR) << "Invalid data: " << static_cast<char*>(iovec.iov_base) |
| 120 << " vs " << expected; | 122 << " vs " << expected; |
| 121 return false; | 123 return false; |
| 122 } | 124 } |
| 123 return true; | 125 return true; |
| 124 } | 126 } |
| 125 | 127 |
| 126 void OnFinFrame(QuicStreamOffset byte_offset, const char* data) { | 128 void OnFinFrame(QuicStreamOffset byte_offset, const char* data) { |
| 127 QuicStreamFrame frame; | 129 QuicStreamFrame frame; |
| 128 frame.stream_id = 1; | 130 frame.stream_id = 1; |
| 129 frame.offset = byte_offset; | 131 frame.offset = byte_offset; |
| 130 frame.data = StringPiece(data); | 132 frame.data = StringPiece(data); |
| 131 frame.fin = true; | 133 frame.fin = true; |
| 132 sequencer_->OnStreamFrame(frame); | 134 sequencer_->OnStreamFrame(frame); |
| 133 } | 135 } |
| 134 | 136 |
| 135 void OnFrame(QuicStreamOffset byte_offset, const char* data) { | 137 void OnFrame(QuicStreamOffset byte_offset, const char* data) { |
| 136 QuicStreamFrame frame; | 138 QuicStreamFrame frame; |
| 137 frame.stream_id = 1; | 139 frame.stream_id = 1; |
| 138 frame.offset = byte_offset; | 140 frame.offset = byte_offset; |
| 139 frame.data = StringPiece(data); | 141 frame.data = StringPiece(data); |
| 140 frame.fin = false; | 142 frame.fin = false; |
| 141 sequencer_->OnStreamFrame(frame); | 143 sequencer_->OnStreamFrame(frame); |
| 142 } | 144 } |
| 143 | 145 |
| 144 size_t NumBufferedFrames() { | 146 size_t NumBufferedBytes() { |
| 145 return QuicStreamSequencerPeer::GetNumBufferedFrames(sequencer_.get()); | 147 return QuicStreamSequencerPeer::GetNumBufferedBytes(sequencer_.get()); |
| 146 } | |
| 147 | |
| 148 bool FrameOverlapsBufferedData(const QuicStreamFrame& frame) { | |
| 149 return QuicStreamSequencerPeer::FrameOverlapsBufferedData(sequencer_.get(), | |
| 150 frame); | |
| 151 } | 148 } |
| 152 | 149 |
| 153 MockHelper helper_; | 150 MockHelper helper_; |
| 154 MockConnection* connection_; | 151 MockConnection* connection_; |
| 155 MockClock clock_; | 152 MockClock clock_; |
| 156 MockQuicSpdySession session_; | 153 MockQuicSpdySession session_; |
| 157 testing::StrictMock<MockStream> stream_; | 154 testing::StrictMock<MockStream> stream_; |
| 158 scoped_ptr<QuicStreamSequencer> sequencer_; | 155 scoped_ptr<QuicStreamSequencer> sequencer_; |
| 159 }; | 156 }; |
| 160 | 157 |
| 161 // TODO(rch): reorder these tests so they build on each other. | 158 // TODO(rch): reorder these tests so they build on each other. |
| 162 | 159 |
| 163 TEST_F(QuicStreamSequencerTest, RejectOldFrame) { | 160 TEST_F(QuicStreamSequencerTest, RejectOldFrame) { |
| 164 EXPECT_CALL(stream_, OnDataAvailable()) | 161 EXPECT_CALL(stream_, OnDataAvailable()) |
| 165 .WillOnce(testing::Invoke( | 162 .WillOnce(testing::Invoke( |
| 166 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 163 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); |
| 167 | 164 |
| 168 OnFrame(0, "abc"); | 165 OnFrame(0, "abc"); |
| 169 | 166 |
| 170 EXPECT_EQ(0u, NumBufferedFrames()); | 167 EXPECT_EQ(0u, NumBufferedBytes()); |
| 171 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 168 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 172 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); | 169 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); |
| 173 // Ignore this - it matches a past packet number and we should not see it | 170 // Ignore this - it matches a past packet number and we should not see it |
| 174 // again. | 171 // again. |
| 175 OnFrame(0, "def"); | 172 OnFrame(0, "def"); |
| 176 EXPECT_EQ(0u, NumBufferedFrames()); | 173 EXPECT_EQ(0u, NumBufferedBytes()); |
| 177 } | 174 } |
| 178 | 175 |
| 179 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) { | 176 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) { |
| 180 EXPECT_CALL(stream_, OnDataAvailable()); | 177 EXPECT_CALL(stream_, OnDataAvailable()); |
| 181 | 178 |
| 182 OnFrame(0, "abc"); | 179 OnFrame(0, "abc"); |
| 183 EXPECT_EQ(1u, NumBufferedFrames()); | 180 EXPECT_EQ(3u, NumBufferedBytes()); |
| 184 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 181 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 185 | 182 |
| 186 // Ignore this - it matches a buffered frame. | 183 // Ignore this - it matches a buffered frame. |
| 187 // Right now there's no checking that the payload is consistent. | 184 // Right now there's no checking that the payload is consistent. |
| 188 OnFrame(0, "def"); | 185 OnFrame(0, "def"); |
| 189 EXPECT_EQ(1u, NumBufferedFrames()); | 186 EXPECT_EQ(3u, NumBufferedBytes()); |
| 190 } | 187 } |
| 191 | 188 |
| 192 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) { | 189 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) { |
| 193 EXPECT_CALL(stream_, OnDataAvailable()) | 190 EXPECT_CALL(stream_, OnDataAvailable()) |
| 194 .WillOnce(testing::Invoke( | 191 .WillOnce(testing::Invoke( |
| 195 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 192 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); |
| 196 | 193 |
| 197 OnFrame(0, "abc"); | 194 OnFrame(0, "abc"); |
| 198 EXPECT_EQ(0u, NumBufferedFrames()); | 195 EXPECT_EQ(0u, NumBufferedBytes()); |
| 199 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 196 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 200 } | 197 } |
| 201 | 198 |
| 202 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) { | 199 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) { |
| 203 sequencer_->SetBlockedUntilFlush(); | 200 sequencer_->SetBlockedUntilFlush(); |
| 204 | 201 |
| 205 OnFrame(0, "abc"); | 202 OnFrame(0, "abc"); |
| 206 EXPECT_EQ(1u, NumBufferedFrames()); | 203 EXPECT_EQ(3u, NumBufferedBytes()); |
| 207 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 204 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 208 | 205 |
| 209 EXPECT_CALL(stream_, OnDataAvailable()) | 206 EXPECT_CALL(stream_, OnDataAvailable()) |
| 210 .WillOnce(testing::Invoke( | 207 .WillOnce(testing::Invoke( |
| 211 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 208 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); |
| 212 sequencer_->SetUnblocked(); | 209 sequencer_->SetUnblocked(); |
| 213 EXPECT_EQ(0u, NumBufferedFrames()); | 210 EXPECT_EQ(0u, NumBufferedBytes()); |
| 214 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 211 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 215 | 212 |
| 216 EXPECT_CALL(stream_, OnDataAvailable()) | 213 EXPECT_CALL(stream_, OnDataAvailable()) |
| 217 .WillOnce(testing::Invoke( | 214 .WillOnce(testing::Invoke( |
| 218 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 215 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); |
| 219 EXPECT_FALSE(sequencer_->IsClosed()); | 216 EXPECT_FALSE(sequencer_->IsClosed()); |
| 220 OnFinFrame(3, "def"); | 217 OnFinFrame(3, "def"); |
| 221 EXPECT_TRUE(sequencer_->IsClosed()); | 218 EXPECT_TRUE(sequencer_->IsClosed()); |
| 222 } | 219 } |
| 223 | 220 |
| 224 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) { | 221 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) { |
| 225 sequencer_->SetBlockedUntilFlush(); | 222 sequencer_->SetBlockedUntilFlush(); |
| 226 | 223 |
| 227 OnFinFrame(0, "abc"); | 224 OnFinFrame(0, "abc"); |
| 228 EXPECT_EQ(1u, NumBufferedFrames()); | 225 EXPECT_EQ(3u, NumBufferedBytes()); |
| 229 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 226 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 230 | 227 |
| 231 EXPECT_CALL(stream_, OnDataAvailable()) | 228 EXPECT_CALL(stream_, OnDataAvailable()) |
| 232 .WillOnce(testing::Invoke( | 229 .WillOnce(testing::Invoke( |
| 233 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 230 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); |
| 234 EXPECT_FALSE(sequencer_->IsClosed()); | 231 EXPECT_FALSE(sequencer_->IsClosed()); |
| 235 sequencer_->SetUnblocked(); | 232 sequencer_->SetUnblocked(); |
| 236 EXPECT_TRUE(sequencer_->IsClosed()); | 233 EXPECT_TRUE(sequencer_->IsClosed()); |
| 237 EXPECT_EQ(0u, NumBufferedFrames()); | 234 EXPECT_EQ(0u, NumBufferedBytes()); |
| 238 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 235 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 239 } | 236 } |
| 240 | 237 |
| 241 TEST_F(QuicStreamSequencerTest, EmptyFrame) { | 238 TEST_F(QuicStreamSequencerTest, EmptyFrame) { |
| 242 EXPECT_CALL(stream_, | 239 EXPECT_CALL(stream_, |
| 243 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); | 240 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); |
| 244 OnFrame(0, ""); | 241 OnFrame(0, ""); |
| 245 EXPECT_EQ(0u, NumBufferedFrames()); | 242 EXPECT_EQ(0u, NumBufferedBytes()); |
| 246 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 243 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 247 } | 244 } |
| 248 | 245 |
| 249 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) { | 246 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) { |
| 250 EXPECT_CALL(stream_, OnDataAvailable()); | 247 EXPECT_CALL(stream_, OnDataAvailable()); |
| 251 OnFinFrame(0, ""); | 248 OnFinFrame(0, ""); |
| 252 EXPECT_EQ(0u, NumBufferedFrames()); | 249 EXPECT_EQ(0u, NumBufferedBytes()); |
| 253 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 250 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 254 } | 251 } |
| 255 | 252 |
| 256 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) { | 253 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) { |
| 257 EXPECT_CALL(stream_, OnDataAvailable()) | 254 EXPECT_CALL(stream_, OnDataAvailable()) |
| 258 .WillOnce(testing::Invoke( | 255 .WillOnce(testing::Invoke( |
| 259 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 2))); | 256 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 2))); |
| 260 | 257 |
| 261 OnFrame(0, "abc"); | 258 OnFrame(0, "abc"); |
| 262 EXPECT_EQ(1u, NumBufferedFrames()); | 259 EXPECT_EQ(1u, NumBufferedBytes()); |
| 263 EXPECT_EQ(2u, sequencer_->num_bytes_consumed()); | 260 EXPECT_EQ(2u, sequencer_->NumBytesConsumed()); |
| 264 } | 261 } |
| 265 | 262 |
| 266 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) { | 263 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) { |
| 267 EXPECT_CALL(stream_, OnDataAvailable()); | 264 EXPECT_CALL(stream_, OnDataAvailable()); |
| 268 | 265 |
| 269 OnFrame(0, "abc"); | 266 OnFrame(0, "abc"); |
| 270 EXPECT_EQ(1u, NumBufferedFrames()); | 267 EXPECT_EQ(3u, NumBufferedBytes()); |
| 271 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 268 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 272 EXPECT_EQ(0, sequencer_->num_early_frames_received()); | 269 EXPECT_EQ(0, sequencer_->num_early_frames_received()); |
| 273 } | 270 } |
| 274 | 271 |
| 275 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) { | 272 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) { |
| 276 OnFrame(3, "abc"); | 273 OnFrame(3, "abc"); |
| 277 EXPECT_EQ(1u, NumBufferedFrames()); | 274 EXPECT_EQ(3u, NumBufferedBytes()); |
| 278 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 275 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 279 EXPECT_EQ(1, sequencer_->num_early_frames_received()); | 276 EXPECT_EQ(1, sequencer_->num_early_frames_received()); |
| 280 } | 277 } |
| 281 | 278 |
| 282 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { | 279 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { |
| 283 // Buffer the first | 280 // Buffer the first |
| 284 OnFrame(6, "ghi"); | 281 OnFrame(6, "ghi"); |
| 285 EXPECT_EQ(1u, NumBufferedFrames()); | 282 EXPECT_EQ(3u, NumBufferedBytes()); |
| 286 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 283 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 287 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); | 284 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
| 288 // Buffer the second | 285 // Buffer the second |
| 289 OnFrame(3, "def"); | 286 OnFrame(3, "def"); |
| 290 EXPECT_EQ(2u, NumBufferedFrames()); | 287 EXPECT_EQ(6u, NumBufferedBytes()); |
| 291 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 288 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 292 EXPECT_EQ(6u, sequencer_->num_bytes_buffered()); | 289 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); |
| 293 | 290 |
| 294 EXPECT_CALL(stream_, OnDataAvailable()) | 291 EXPECT_CALL(stream_, OnDataAvailable()) |
| 295 .WillOnce(testing::Invoke( | 292 .WillOnce(testing::Invoke( |
| 296 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 9))); | 293 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 9))); |
| 297 | 294 |
| 298 // Now process all of them at once. | 295 // Now process all of them at once. |
| 299 OnFrame(0, "abc"); | 296 OnFrame(0, "abc"); |
| 300 EXPECT_EQ(9u, sequencer_->num_bytes_consumed()); | 297 EXPECT_EQ(9u, sequencer_->NumBytesConsumed()); |
| 301 EXPECT_EQ(0u, sequencer_->num_bytes_buffered()); | 298 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); |
| 302 | 299 |
| 303 EXPECT_EQ(0u, NumBufferedFrames()); | 300 EXPECT_EQ(0u, NumBufferedBytes()); |
| 304 } | 301 } |
| 305 | 302 |
| 306 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) { | 303 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) { |
| 307 InSequence s; | 304 InSequence s; |
| 308 | 305 |
| 309 EXPECT_CALL(stream_, OnDataAvailable()) | 306 EXPECT_CALL(stream_, OnDataAvailable()) |
| 310 .WillOnce(testing::Invoke( | 307 .WillOnce(testing::Invoke( |
| 311 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 308 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); |
| 312 OnFinFrame(0, "abc"); | 309 OnFinFrame(0, "abc"); |
| 313 | 310 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 | 441 |
| 445 while (output_.size() != arraysize(kPayload) - 1) { | 442 while (output_.size() != arraysize(kPayload) - 1) { |
| 446 if (!list_.empty() && (base::RandUint64() % 2 == 0)) { // Send data | 443 if (!list_.empty() && (base::RandUint64() % 2 == 0)) { // Send data |
| 447 int index = OneToN(list_.size()) - 1; | 444 int index = OneToN(list_.size()) - 1; |
| 448 OnFrame(list_[index].first, list_[index].second.data()); | 445 OnFrame(list_[index].first, list_[index].second.data()); |
| 449 list_.erase(list_.begin() + index); | 446 list_.erase(list_.begin() + index); |
| 450 } else { // Read data | 447 } else { // Read data |
| 451 bool has_bytes = sequencer_->HasBytesToRead(); | 448 bool has_bytes = sequencer_->HasBytesToRead(); |
| 452 iovec peek_iov[20]; | 449 iovec peek_iov[20]; |
| 453 int iovs_peeked = sequencer_->GetReadableRegions(peek_iov, 20); | 450 int iovs_peeked = sequencer_->GetReadableRegions(peek_iov, 20); |
| 451 QuicTime timestamp = clock_.ApproximateNow(); |
| 454 if (has_bytes) { | 452 if (has_bytes) { |
| 455 ASSERT_LT(0, iovs_peeked); | 453 ASSERT_LT(0, iovs_peeked); |
| 456 ASSERT_TRUE(sequencer_->GetReadableRegion(peek_iov, nullptr)); | 454 ASSERT_TRUE(sequencer_->GetReadableRegion(peek_iov, ×tamp)); |
| 457 } else { | 455 } else { |
| 458 ASSERT_EQ(0, iovs_peeked); | 456 ASSERT_EQ(0, iovs_peeked); |
| 459 ASSERT_FALSE(sequencer_->GetReadableRegion(peek_iov, nullptr)); | 457 ASSERT_FALSE(sequencer_->GetReadableRegion(peek_iov, ×tamp)); |
| 460 } | 458 } |
| 461 int total_bytes_to_peek = arraysize(buffer); | 459 int total_bytes_to_peek = arraysize(buffer); |
| 462 for (int i = 0; i < iovs_peeked; ++i) { | 460 for (int i = 0; i < iovs_peeked; ++i) { |
| 463 int bytes_to_peek = min<int>(peek_iov[i].iov_len, total_bytes_to_peek); | 461 int bytes_to_peek = min<int>(peek_iov[i].iov_len, total_bytes_to_peek); |
| 464 peeked_.append(static_cast<char*>(peek_iov[i].iov_base), bytes_to_peek); | 462 peeked_.append(static_cast<char*>(peek_iov[i].iov_base), bytes_to_peek); |
| 465 total_bytes_to_peek -= bytes_to_peek; | 463 total_bytes_to_peek -= bytes_to_peek; |
| 466 if (total_bytes_to_peek == 0) { | 464 if (total_bytes_to_peek == 0) { |
| 467 break; | 465 break; |
| 468 } | 466 } |
| 469 } | 467 } |
| 470 int bytes_read = sequencer_->Readv(iov, 2); | 468 int bytes_read = sequencer_->Readv(iov, 2); |
| 471 output_.append(buffer, bytes_read); | 469 output_.append(buffer, bytes_read); |
| 472 ASSERT_EQ(output_.size(), peeked_.size()); | 470 ASSERT_EQ(output_.size(), peeked_.size()); |
| 473 } | 471 } |
| 474 } | 472 } |
| 475 EXPECT_EQ(string(kPayload), output_); | 473 EXPECT_EQ(string(kPayload), output_); |
| 476 EXPECT_EQ(string(kPayload), peeked_); | 474 EXPECT_EQ(string(kPayload), peeked_); |
| 477 } | 475 } |
| 478 | 476 |
| 479 // Same as above, just using a different method for reading. | 477 // Same as above, just using a different method for reading. |
| 480 TEST_F(QuicStreamSequencerTest, MarkConsumed) { | 478 TEST_F(QuicStreamSequencerTest, MarkConsumed) { |
| 481 InSequence s; | 479 InSequence s; |
| 482 EXPECT_CALL(stream_, OnDataAvailable()); | 480 EXPECT_CALL(stream_, OnDataAvailable()); |
| 483 | 481 |
| 484 OnFrame(0, "abc"); | 482 OnFrame(0, "abc"); |
| 485 OnFrame(3, "def"); | 483 OnFrame(3, "def"); |
| 486 OnFrame(6, "ghi"); | 484 OnFrame(6, "ghi"); |
| 487 | 485 |
| 488 // abcdefghi buffered. | 486 // abcdefghi buffered. |
| 489 EXPECT_EQ(9u, sequencer_->num_bytes_buffered()); | 487 EXPECT_EQ(9u, sequencer_->NumBytesBuffered()); |
| 490 | 488 |
| 491 // Peek into the data. | 489 // Peek into the data. |
| 492 const char* expected[] = {"abc", "def", "ghi"}; | 490 const char* expected[] = {"abc", "def", "ghi"}; |
| 493 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); | 491 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); |
| 494 | 492 |
| 495 // Consume 1 byte. | 493 // Consume 1 byte. |
| 496 sequencer_->MarkConsumed(1); | 494 sequencer_->MarkConsumed(1); |
| 497 EXPECT_EQ(1u, stream_.flow_controller()->bytes_consumed()); | 495 EXPECT_EQ(1u, stream_.flow_controller()->bytes_consumed()); |
| 498 // Verify data. | 496 // Verify data. |
| 499 const char* expected2[] = {"bc", "def", "ghi"}; | 497 const char* expected2[] = {"bc", "def", "ghi"}; |
| 500 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2))); | 498 ASSERT_TRUE(VerifyReadableRegions(expected2, arraysize(expected2))); |
| 501 EXPECT_EQ(8u, sequencer_->num_bytes_buffered()); | 499 EXPECT_EQ(8u, sequencer_->NumBytesBuffered()); |
| 502 | 500 |
| 503 // Consume 2 bytes. | 501 // Consume 2 bytes. |
| 504 sequencer_->MarkConsumed(2); | 502 sequencer_->MarkConsumed(2); |
| 505 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); | 503 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); |
| 506 // Verify data. | 504 // Verify data. |
| 507 const char* expected3[] = {"def", "ghi"}; | 505 const char* expected3[] = {"def", "ghi"}; |
| 508 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3))); | 506 ASSERT_TRUE(VerifyReadableRegions(expected3, arraysize(expected3))); |
| 509 EXPECT_EQ(6u, sequencer_->num_bytes_buffered()); | 507 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); |
| 510 | 508 |
| 511 // Consume 5 bytes. | 509 // Consume 5 bytes. |
| 512 sequencer_->MarkConsumed(5); | 510 sequencer_->MarkConsumed(5); |
| 513 EXPECT_EQ(8u, stream_.flow_controller()->bytes_consumed()); | 511 EXPECT_EQ(8u, stream_.flow_controller()->bytes_consumed()); |
| 514 // Verify data. | 512 // Verify data. |
| 515 const char* expected4[] = {"i"}; | 513 const char* expected4[] = {"i"}; |
| 516 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4))); | 514 ASSERT_TRUE(VerifyReadableRegions(expected4, arraysize(expected4))); |
| 517 EXPECT_EQ(1u, sequencer_->num_bytes_buffered()); | 515 EXPECT_EQ(1u, sequencer_->NumBytesBuffered()); |
| 518 } | 516 } |
| 519 | 517 |
| 520 TEST_F(QuicStreamSequencerTest, MarkConsumedError) { | 518 TEST_F(QuicStreamSequencerTest, MarkConsumedError) { |
| 521 EXPECT_CALL(stream_, OnDataAvailable()); | 519 EXPECT_CALL(stream_, OnDataAvailable()); |
| 522 | 520 |
| 523 OnFrame(0, "abc"); | 521 OnFrame(0, "abc"); |
| 524 OnFrame(9, "jklmnopqrstuvwxyz"); | 522 OnFrame(9, "jklmnopqrstuvwxyz"); |
| 525 | 523 |
| 526 // Peek into the data. Only the first chunk should be readable because of the | 524 // Peek into the data. Only the first chunk should be readable because of the |
| 527 // missing data. | 525 // missing data. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 544 OnFrame(3, "def"); | 542 OnFrame(3, "def"); |
| 545 // Missing packet: 6, ghi. | 543 // Missing packet: 6, ghi. |
| 546 OnFrame(9, "jkl"); | 544 OnFrame(9, "jkl"); |
| 547 | 545 |
| 548 const char* expected[] = {"abc", "def"}; | 546 const char* expected[] = {"abc", "def"}; |
| 549 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); | 547 ASSERT_TRUE(VerifyReadableRegions(expected, arraysize(expected))); |
| 550 | 548 |
| 551 sequencer_->MarkConsumed(6); | 549 sequencer_->MarkConsumed(6); |
| 552 } | 550 } |
| 553 | 551 |
| 554 TEST_F(QuicStreamSequencerTest, FrameOverlapsBufferedData) { | 552 TEST(QuicFrameListTest, FrameOverlapsBufferedData) { |
| 553 QuicFrameList buffer; |
| 554 |
| 555 // Ensure that FrameOverlapsBufferedData returns appropriate responses when | 555 // Ensure that FrameOverlapsBufferedData returns appropriate responses when |
| 556 // there is existing data buffered. | 556 // there is existing data buffered. |
| 557 const int kBufferedOffset = 10; | 557 const int kBufferedOffset = 10; |
| 558 const int kBufferedDataLength = 3; | 558 const int kBufferedDataLength = 3; |
| 559 const int kNewDataLength = 3; | 559 const int kNewDataLength = 3; |
| 560 string data(kNewDataLength, '.'); | 560 string data(kNewDataLength, '.'); |
| 561 | 561 |
| 562 // No overlap if no buffered frames. | 562 // No overlap if no buffered frames. |
| 563 EXPECT_EQ(0u, NumBufferedFrames()); | 563 EXPECT_EQ(0u, buffer.BytesBuffered()); |
| 564 size_t bytes_written; |
| 564 // Add a buffered frame. | 565 // Add a buffered frame. |
| 565 sequencer_->OnStreamFrame(QuicStreamFrame(1, false, kBufferedOffset, | 566 buffer.OnStreamData( |
| 566 string(kBufferedDataLength, '.'))); | 567 kBufferedOffset, |
| 568 StringPiece(string(kBufferedDataLength, '.').data(), kBufferedDataLength), |
| 569 QuicTime::Zero(), &bytes_written); |
| 567 | 570 |
| 568 // New byte range partially overlaps with buffered frame, start offset | 571 // New byte range partially overlaps with buffered frame, start offset |
| 569 // preceding buffered frame. | 572 // preceding buffered frame. |
| 570 EXPECT_TRUE(FrameOverlapsBufferedData( | 573 EXPECT_TRUE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( |
| 571 QuicStreamFrame(1, false, kBufferedOffset - 1, data))); | 574 &buffer, QuicStreamFrame(1, false, kBufferedOffset - 1, data))); |
| 572 EXPECT_TRUE(FrameOverlapsBufferedData( | 575 EXPECT_TRUE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( |
| 576 &buffer, |
| 573 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength + 1, data))); | 577 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength + 1, data))); |
| 574 | 578 |
| 575 // New byte range partially overlaps with buffered frame, start offset inside | 579 // New byte range partially overlaps with buffered frame, start offset inside |
| 576 // existing buffered frame. | 580 // existing buffered frame. |
| 577 EXPECT_TRUE(FrameOverlapsBufferedData( | 581 EXPECT_TRUE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( |
| 578 QuicStreamFrame(1, false, kBufferedOffset + 1, data))); | 582 &buffer, QuicStreamFrame(1, false, kBufferedOffset + 1, data))); |
| 579 EXPECT_TRUE(FrameOverlapsBufferedData(QuicStreamFrame( | 583 EXPECT_TRUE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( |
| 580 1, false, kBufferedOffset + kBufferedDataLength - 1, data))); | 584 &buffer, QuicStreamFrame( |
| 585 1, false, kBufferedOffset + kBufferedDataLength - 1, data))); |
| 581 | 586 |
| 582 // New byte range entirely outside of buffered frames, start offset preceeding | 587 // New byte range entirely outside of buffered frames, start offset |
| 583 // buffered frame. | 588 // preceeding buffered frame. |
| 584 EXPECT_FALSE(FrameOverlapsBufferedData( | 589 EXPECT_FALSE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( |
| 590 &buffer, |
| 585 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength, data))); | 591 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength, data))); |
| 586 | 592 |
| 587 // New byte range entirely outside of buffered frames, start offset later than | 593 // New byte range entirely outside of buffered frames, start offset later than |
| 588 // buffered frame. | 594 // buffered frame. |
| 589 EXPECT_FALSE(FrameOverlapsBufferedData( | 595 EXPECT_FALSE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( |
| 596 &buffer, |
| 590 QuicStreamFrame(1, false, kBufferedOffset + kBufferedDataLength, data))); | 597 QuicStreamFrame(1, false, kBufferedOffset + kBufferedDataLength, data))); |
| 591 } | 598 } |
| 592 | 599 |
| 593 TEST_F(QuicStreamSequencerTest, DontAcceptOverlappingFrames) { | 600 TEST_F(QuicStreamSequencerTest, DontAcceptOverlappingFrames) { |
| 594 // The peer should never send us non-identical stream frames which contain | 601 // The peer should never send us non-identical stream frames which contain |
| 595 // overlapping byte ranges - if they do, we close the connection. | 602 // overlapping byte ranges - if they do, we close the connection. |
| 596 | 603 |
| 597 QuicStreamFrame frame1(kClientDataStreamId1, false, 1, StringPiece("hello")); | 604 QuicStreamFrame frame1(kClientDataStreamId1, false, 1, StringPiece("hello")); |
| 598 sequencer_->OnStreamFrame(frame1); | 605 sequencer_->OnStreamFrame(frame1); |
| 599 | 606 |
| 600 QuicStreamFrame frame2(kClientDataStreamId1, false, 2, StringPiece("hello")); | 607 QuicStreamFrame frame2(kClientDataStreamId1, false, 2, StringPiece("hello")); |
| 601 EXPECT_TRUE(FrameOverlapsBufferedData(frame2)); | |
| 602 EXPECT_CALL(stream_, CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)) | 608 EXPECT_CALL(stream_, CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)) |
| 603 .Times(1); | 609 .Times(1); |
| 604 sequencer_->OnStreamFrame(frame2); | 610 sequencer_->OnStreamFrame(frame2); |
| 605 } | 611 } |
| 606 | 612 |
| 607 TEST_F(QuicStreamSequencerTest, InOrderTimestamps) { | 613 TEST_F(QuicStreamSequencerTest, InOrderTimestamps) { |
| 608 // This test verifies that timestamps returned by | 614 // This test verifies that timestamps returned by |
| 609 // GetReadableRegion() are in the correct sequence when frames | 615 // GetReadableRegion() are in the correct sequence when frames |
| 610 // arrive at the sequencer in order. | 616 // arrive at the sequencer in order. |
| 611 EXPECT_CALL(stream_, OnDataAvailable()); | 617 EXPECT_CALL(stream_, OnDataAvailable()); |
| 612 | 618 |
| 613 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 619 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 614 | 620 |
| 615 // Buffer the first frame. | 621 // Buffer the first frame. |
| 616 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 622 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 617 QuicTime t1 = clock_.ApproximateNow(); | 623 QuicTime t1 = clock_.ApproximateNow(); |
| 618 OnFrame(0, "abc"); | 624 OnFrame(0, "abc"); |
| 619 EXPECT_EQ(1u, NumBufferedFrames()); | 625 EXPECT_EQ(3u, NumBufferedBytes()); |
| 620 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 626 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 621 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); | 627 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
| 622 // Buffer the second frame. | 628 // Buffer the second frame. |
| 623 QuicTime t2 = clock_.ApproximateNow(); | 629 QuicTime t2 = clock_.ApproximateNow(); |
| 624 OnFrame(3, "def"); | 630 OnFrame(3, "def"); |
| 625 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 631 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 626 EXPECT_EQ(2u, NumBufferedFrames()); | 632 EXPECT_EQ(6u, NumBufferedBytes()); |
| 627 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 633 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 628 EXPECT_EQ(6u, sequencer_->num_bytes_buffered()); | 634 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); |
| 629 | 635 |
| 630 iovec iovecs[1]; | 636 iovec iovecs[1]; |
| 631 QuicTime timestamp(QuicTime::Zero()); | 637 QuicTime timestamp(QuicTime::Zero()); |
| 632 | 638 |
| 633 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); | 639 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); |
| 634 EXPECT_EQ(timestamp, t1); | 640 EXPECT_EQ(timestamp, t1); |
| 635 QuicStreamSequencerTest::ConsumeData(3); | 641 QuicStreamSequencerTest::ConsumeData(3); |
| 636 EXPECT_EQ(1u, NumBufferedFrames()); | 642 EXPECT_EQ(3u, NumBufferedBytes()); |
| 637 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 643 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 638 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); | 644 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
| 639 | 645 |
| 640 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); | 646 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); |
| 641 EXPECT_EQ(timestamp, t2); | 647 EXPECT_EQ(timestamp, t2); |
| 642 QuicStreamSequencerTest::ConsumeData(3); | 648 QuicStreamSequencerTest::ConsumeData(3); |
| 643 EXPECT_EQ(0u, NumBufferedFrames()); | 649 EXPECT_EQ(0u, NumBufferedBytes()); |
| 644 EXPECT_EQ(6u, sequencer_->num_bytes_consumed()); | 650 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); |
| 645 EXPECT_EQ(0u, sequencer_->num_bytes_buffered()); | 651 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); |
| 646 } | 652 } |
| 647 | 653 |
| 648 TEST_F(QuicStreamSequencerTest, OutOfOrderTimestamps) { | 654 TEST_F(QuicStreamSequencerTest, OutOfOrderTimestamps) { |
| 649 // This test verifies that timestamps returned by | 655 // This test verifies that timestamps returned by |
| 650 // GetReadableRegion() are in the correct sequence when frames | 656 // GetReadableRegion() are in the correct sequence when frames |
| 651 // arrive at the sequencer out of order. | 657 // arrive at the sequencer out of order. |
| 652 EXPECT_CALL(stream_, OnDataAvailable()); | 658 EXPECT_CALL(stream_, OnDataAvailable()); |
| 653 | 659 |
| 654 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 660 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 655 | 661 |
| 656 // Buffer the first frame | 662 // Buffer the first frame |
| 657 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 663 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 658 QuicTime t1 = clock_.ApproximateNow(); | 664 QuicTime t1 = clock_.ApproximateNow(); |
| 659 OnFrame(3, "def"); | 665 OnFrame(3, "def"); |
| 660 EXPECT_EQ(1u, NumBufferedFrames()); | 666 EXPECT_EQ(3u, NumBufferedBytes()); |
| 661 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 667 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 662 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); | 668 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
| 663 // Buffer the second frame | 669 // Buffer the second frame |
| 664 QuicTime t2 = clock_.ApproximateNow(); | 670 QuicTime t2 = clock_.ApproximateNow(); |
| 665 OnFrame(0, "abc"); | 671 OnFrame(0, "abc"); |
| 666 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 672 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 667 EXPECT_EQ(2u, NumBufferedFrames()); | 673 EXPECT_EQ(6u, NumBufferedBytes()); |
| 668 EXPECT_EQ(0u, sequencer_->num_bytes_consumed()); | 674 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 669 EXPECT_EQ(6u, sequencer_->num_bytes_buffered()); | 675 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); |
| 670 | 676 |
| 671 iovec iovecs[1]; | 677 iovec iovecs[1]; |
| 672 QuicTime timestamp(QuicTime::Zero()); | 678 QuicTime timestamp(QuicTime::Zero()); |
| 673 | 679 |
| 674 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); | 680 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); |
| 675 EXPECT_EQ(timestamp, t2); | 681 EXPECT_EQ(timestamp, t2); |
| 676 QuicStreamSequencerTest::ConsumeData(3); | 682 QuicStreamSequencerTest::ConsumeData(3); |
| 677 EXPECT_EQ(1u, NumBufferedFrames()); | 683 EXPECT_EQ(3u, NumBufferedBytes()); |
| 678 EXPECT_EQ(3u, sequencer_->num_bytes_consumed()); | 684 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 679 EXPECT_EQ(3u, sequencer_->num_bytes_buffered()); | 685 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
| 680 | 686 |
| 681 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); | 687 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); |
| 682 EXPECT_EQ(timestamp, t1); | 688 EXPECT_EQ(timestamp, t1); |
| 683 QuicStreamSequencerTest::ConsumeData(3); | 689 QuicStreamSequencerTest::ConsumeData(3); |
| 684 EXPECT_EQ(0u, NumBufferedFrames()); | 690 EXPECT_EQ(0u, NumBufferedBytes()); |
| 685 EXPECT_EQ(6u, sequencer_->num_bytes_consumed()); | 691 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); |
| 686 EXPECT_EQ(0u, sequencer_->num_bytes_buffered()); | 692 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); |
| 687 } | 693 } |
| 688 | 694 |
| 689 } // namespace | 695 } // namespace |
| 690 } // namespace test | 696 } // namespace test |
| 691 } // namespace net | 697 } // namespace net |
| OLD | NEW |