| 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" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error)); | 50 MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error)); |
| 51 MOCK_METHOD0(OnCanWrite, void()); | 51 MOCK_METHOD0(OnCanWrite, void()); |
| 52 virtual bool IsFlowControlEnabled() const { return true; } | 52 virtual bool IsFlowControlEnabled() const { return true; } |
| 53 }; | 53 }; |
| 54 | 54 |
| 55 namespace { | 55 namespace { |
| 56 | 56 |
| 57 static const char kPayload[] = | 57 static const char kPayload[] = |
| 58 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | 58 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; |
| 59 | 59 |
| 60 class QuicStreamSequencerTest : public ::testing::TestWithParam<bool> { | 60 class QuicStreamSequencerTest : public ::testing::Test { |
| 61 public: | 61 public: |
| 62 void SetUp() override { | |
| 63 FLAGS_quic_use_stream_sequencer_buffer = GetParam(); | |
| 64 sequencer_.reset(new QuicStreamSequencer(&stream_, &clock_)); | |
| 65 } | |
| 66 | |
| 67 void ConsumeData(size_t num_bytes) { | 62 void ConsumeData(size_t num_bytes) { |
| 68 char buffer[1024]; | 63 char buffer[1024]; |
| 69 ASSERT_GT(arraysize(buffer), num_bytes); | 64 ASSERT_GT(arraysize(buffer), num_bytes); |
| 70 struct iovec iov; | 65 struct iovec iov; |
| 71 iov.iov_base = buffer; | 66 iov.iov_base = buffer; |
| 72 iov.iov_len = num_bytes; | 67 iov.iov_len = num_bytes; |
| 73 ASSERT_EQ(static_cast<int>(num_bytes), sequencer_->Readv(&iov, 1)); | 68 ASSERT_EQ(static_cast<int>(num_bytes), sequencer_->Readv(&iov, 1)); |
| 74 } | 69 } |
| 75 | 70 |
| 76 protected: | 71 protected: |
| 77 QuicStreamSequencerTest() | 72 QuicStreamSequencerTest() |
| 78 : connection_(new MockConnection(&helper_, Perspective::IS_CLIENT)), | 73 : connection_(new MockConnection(&helper_, Perspective::IS_CLIENT)), |
| 79 session_(connection_), | 74 session_(connection_), |
| 80 stream_(&session_, 1) {} | 75 stream_(&session_, 1), |
| 76 sequencer_(new QuicStreamSequencer(&stream_, &clock_)) {} |
| 81 | 77 |
| 82 // Verify that the data in first region match with the expected[0]. | 78 // Verify that the data in first region match with the expected[0]. |
| 83 bool VerifyReadableRegion(const vector<string>& expected) { | 79 bool VerifyReadableRegion(const vector<string>& expected) { |
| 84 iovec iovecs[1]; | 80 iovec iovecs[1]; |
| 85 if (sequencer_->GetReadableRegions(iovecs, 1)) { | 81 if (sequencer_->GetReadableRegions(iovecs, 1)) { |
| 86 return (VerifyIovecs(iovecs, 1, vector<string>{expected[0]})); | 82 return (VerifyIovecs(iovecs, 1, vector<string>{expected[0]})); |
| 87 } | 83 } |
| 88 return false; | 84 return false; |
| 89 } | 85 } |
| 90 | 86 |
| 91 // Verify that the data in each of currently readable regions match with each | 87 // Verify that the data in each of currently readable regions match with each |
| 92 // item given in |expected|. | 88 // item given in |expected|. |
| 93 bool VerifyReadableRegions(const vector<string>& expected) { | 89 bool VerifyReadableRegions(const vector<string>& expected) { |
| 94 iovec iovecs[5]; | 90 iovec iovecs[5]; |
| 95 size_t num_iovecs = | 91 size_t num_iovecs = |
| 96 sequencer_->GetReadableRegions(iovecs, arraysize(iovecs)); | 92 sequencer_->GetReadableRegions(iovecs, arraysize(iovecs)); |
| 97 return VerifyReadableRegion(expected) && | 93 return VerifyReadableRegion(expected) && |
| 98 VerifyIovecs(iovecs, num_iovecs, expected); | 94 VerifyIovecs(iovecs, num_iovecs, expected); |
| 99 } | 95 } |
| 100 | 96 |
| 101 bool VerifyIovecs(iovec* iovecs, | 97 bool VerifyIovecs(iovec* iovecs, |
| 102 size_t num_iovecs, | 98 size_t num_iovecs, |
| 103 const vector<string>& expected) { | 99 const vector<string>& expected) { |
| 104 if (!FLAGS_quic_use_stream_sequencer_buffer) { | 100 int start_position = 0; |
| 105 if (expected.size() != num_iovecs) { | 101 for (size_t i = 0; i < num_iovecs; ++i) { |
| 106 LOG(ERROR) << "Incorrect number of iovecs. Expected: " | 102 if (!VerifyIovec(iovecs[i], |
| 107 << expected.size() << " Actual: " << num_iovecs; | 103 expected[0].substr(start_position, iovecs[i].iov_len))) { |
| 108 return false; | 104 return false; |
| 109 } | 105 } |
| 110 | 106 start_position += iovecs[i].iov_len; |
| 111 for (size_t i = 0; i < num_iovecs; ++i) { | |
| 112 if (!VerifyIovec(iovecs[i], expected[i])) { | |
| 113 return false; | |
| 114 } | |
| 115 } | |
| 116 } else { | |
| 117 int start_position = 0; | |
| 118 for (size_t i = 0; i < num_iovecs; ++i) { | |
| 119 if (!VerifyIovec(iovecs[i], expected[0].substr(start_position, | |
| 120 iovecs[i].iov_len))) { | |
| 121 return false; | |
| 122 } | |
| 123 start_position += iovecs[i].iov_len; | |
| 124 } | |
| 125 } | 107 } |
| 126 return true; | 108 return true; |
| 127 } | 109 } |
| 128 | 110 |
| 129 bool VerifyIovec(const iovec& iovec, StringPiece expected) { | 111 bool VerifyIovec(const iovec& iovec, StringPiece expected) { |
| 130 if (iovec.iov_len != expected.length()) { | 112 if (iovec.iov_len != expected.length()) { |
| 131 LOG(ERROR) << "Invalid length: " << iovec.iov_len << " vs " | 113 LOG(ERROR) << "Invalid length: " << iovec.iov_len << " vs " |
| 132 << expected.length(); | 114 << expected.length(); |
| 133 return false; | 115 return false; |
| 134 } | 116 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 165 } | 147 } |
| 166 | 148 |
| 167 MockConnectionHelper helper_; | 149 MockConnectionHelper helper_; |
| 168 MockConnection* connection_; | 150 MockConnection* connection_; |
| 169 MockClock clock_; | 151 MockClock clock_; |
| 170 MockQuicSpdySession session_; | 152 MockQuicSpdySession session_; |
| 171 testing::StrictMock<MockStream> stream_; | 153 testing::StrictMock<MockStream> stream_; |
| 172 scoped_ptr<QuicStreamSequencer> sequencer_; | 154 scoped_ptr<QuicStreamSequencer> sequencer_; |
| 173 }; | 155 }; |
| 174 | 156 |
| 175 INSTANTIATE_TEST_CASE_P(QuicStreamSequencerTests, | |
| 176 QuicStreamSequencerTest, | |
| 177 ::testing::Values(false, true)); | |
| 178 | |
| 179 // TODO(rch): reorder these tests so they build on each other. | 157 // TODO(rch): reorder these tests so they build on each other. |
| 180 | 158 |
| 181 TEST_P(QuicStreamSequencerTest, RejectOldFrame) { | 159 TEST_F(QuicStreamSequencerTest, RejectOldFrame) { |
| 182 EXPECT_CALL(stream_, OnDataAvailable()) | 160 EXPECT_CALL(stream_, OnDataAvailable()) |
| 183 .WillOnce(testing::Invoke( | 161 .WillOnce(testing::Invoke( |
| 184 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, | 162 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 185 base::Unretained(this), 3))); | 163 base::Unretained(this), 3))); |
| 186 | 164 |
| 187 OnFrame(0, "abc"); | 165 OnFrame(0, "abc"); |
| 188 | 166 |
| 189 EXPECT_EQ(0u, NumBufferedBytes()); | 167 EXPECT_EQ(0u, NumBufferedBytes()); |
| 190 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); | 168 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 191 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); | 169 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); |
| 192 // 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 |
| 193 // again. | 171 // again. |
| 194 OnFrame(0, "def"); | 172 OnFrame(0, "def"); |
| 195 EXPECT_EQ(0u, NumBufferedBytes()); | 173 EXPECT_EQ(0u, NumBufferedBytes()); |
| 196 } | 174 } |
| 197 | 175 |
| 198 TEST_P(QuicStreamSequencerTest, RejectBufferedFrame) { | 176 TEST_F(QuicStreamSequencerTest, RejectBufferedFrame) { |
| 199 EXPECT_CALL(stream_, OnDataAvailable()); | 177 EXPECT_CALL(stream_, OnDataAvailable()); |
| 200 | 178 |
| 201 OnFrame(0, "abc"); | 179 OnFrame(0, "abc"); |
| 202 EXPECT_EQ(3u, NumBufferedBytes()); | 180 EXPECT_EQ(3u, NumBufferedBytes()); |
| 203 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 181 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 204 | 182 |
| 205 // Ignore this - it matches a buffered frame. | 183 // Ignore this - it matches a buffered frame. |
| 206 // Right now there's no checking that the payload is consistent. | 184 // Right now there's no checking that the payload is consistent. |
| 207 OnFrame(0, "def"); | 185 OnFrame(0, "def"); |
| 208 EXPECT_EQ(3u, NumBufferedBytes()); | 186 EXPECT_EQ(3u, NumBufferedBytes()); |
| 209 } | 187 } |
| 210 | 188 |
| 211 TEST_P(QuicStreamSequencerTest, FullFrameConsumed) { | 189 TEST_F(QuicStreamSequencerTest, FullFrameConsumed) { |
| 212 EXPECT_CALL(stream_, OnDataAvailable()) | 190 EXPECT_CALL(stream_, OnDataAvailable()) |
| 213 .WillOnce(testing::Invoke( | 191 .WillOnce(testing::Invoke( |
| 214 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, | 192 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 215 base::Unretained(this), 3))); | 193 base::Unretained(this), 3))); |
| 216 | 194 |
| 217 OnFrame(0, "abc"); | 195 OnFrame(0, "abc"); |
| 218 EXPECT_EQ(0u, NumBufferedBytes()); | 196 EXPECT_EQ(0u, NumBufferedBytes()); |
| 219 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); | 197 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 220 } | 198 } |
| 221 | 199 |
| 222 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) { | 200 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) { |
| 223 sequencer_->SetBlockedUntilFlush(); | 201 sequencer_->SetBlockedUntilFlush(); |
| 224 | 202 |
| 225 OnFrame(0, "abc"); | 203 OnFrame(0, "abc"); |
| 226 EXPECT_EQ(3u, NumBufferedBytes()); | 204 EXPECT_EQ(3u, NumBufferedBytes()); |
| 227 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 205 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 228 | 206 |
| 229 EXPECT_CALL(stream_, OnDataAvailable()) | 207 EXPECT_CALL(stream_, OnDataAvailable()) |
| 230 .WillOnce(testing::Invoke( | 208 .WillOnce(testing::Invoke( |
| 231 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, | 209 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 232 base::Unretained(this), 3))); | 210 base::Unretained(this), 3))); |
| 233 sequencer_->SetUnblocked(); | 211 sequencer_->SetUnblocked(); |
| 234 EXPECT_EQ(0u, NumBufferedBytes()); | 212 EXPECT_EQ(0u, NumBufferedBytes()); |
| 235 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); | 213 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 236 | 214 |
| 237 EXPECT_CALL(stream_, OnDataAvailable()) | 215 EXPECT_CALL(stream_, OnDataAvailable()) |
| 238 .WillOnce(testing::Invoke( | 216 .WillOnce(testing::Invoke( |
| 239 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, | 217 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 240 base::Unretained(this), 3))); | 218 base::Unretained(this), 3))); |
| 241 EXPECT_FALSE(sequencer_->IsClosed()); | 219 EXPECT_FALSE(sequencer_->IsClosed()); |
| 242 OnFinFrame(3, "def"); | 220 OnFinFrame(3, "def"); |
| 243 EXPECT_TRUE(sequencer_->IsClosed()); | 221 EXPECT_TRUE(sequencer_->IsClosed()); |
| 244 } | 222 } |
| 245 | 223 |
| 246 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) { | 224 TEST_F(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) { |
| 247 sequencer_->SetBlockedUntilFlush(); | 225 sequencer_->SetBlockedUntilFlush(); |
| 248 | 226 |
| 249 OnFinFrame(0, "abc"); | 227 OnFinFrame(0, "abc"); |
| 250 EXPECT_EQ(3u, NumBufferedBytes()); | 228 EXPECT_EQ(3u, NumBufferedBytes()); |
| 251 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 229 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 252 | 230 |
| 253 EXPECT_CALL(stream_, OnDataAvailable()) | 231 EXPECT_CALL(stream_, OnDataAvailable()) |
| 254 .WillOnce(testing::Invoke( | 232 .WillOnce(testing::Invoke( |
| 255 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, | 233 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 256 base::Unretained(this), 3))); | 234 base::Unretained(this), 3))); |
| 257 EXPECT_FALSE(sequencer_->IsClosed()); | 235 EXPECT_FALSE(sequencer_->IsClosed()); |
| 258 sequencer_->SetUnblocked(); | 236 sequencer_->SetUnblocked(); |
| 259 EXPECT_TRUE(sequencer_->IsClosed()); | 237 EXPECT_TRUE(sequencer_->IsClosed()); |
| 260 EXPECT_EQ(0u, NumBufferedBytes()); | 238 EXPECT_EQ(0u, NumBufferedBytes()); |
| 261 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); | 239 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 262 } | 240 } |
| 263 | 241 |
| 264 TEST_P(QuicStreamSequencerTest, EmptyFrame) { | 242 TEST_F(QuicStreamSequencerTest, EmptyFrame) { |
| 265 EXPECT_CALL(stream_, | 243 EXPECT_CALL(stream_, |
| 266 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); | 244 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); |
| 267 OnFrame(0, ""); | 245 OnFrame(0, ""); |
| 268 EXPECT_EQ(0u, NumBufferedBytes()); | 246 EXPECT_EQ(0u, NumBufferedBytes()); |
| 269 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 247 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 270 } | 248 } |
| 271 | 249 |
| 272 TEST_P(QuicStreamSequencerTest, EmptyFinFrame) { | 250 TEST_F(QuicStreamSequencerTest, EmptyFinFrame) { |
| 273 EXPECT_CALL(stream_, OnDataAvailable()); | 251 EXPECT_CALL(stream_, OnDataAvailable()); |
| 274 OnFinFrame(0, ""); | 252 OnFinFrame(0, ""); |
| 275 EXPECT_EQ(0u, NumBufferedBytes()); | 253 EXPECT_EQ(0u, NumBufferedBytes()); |
| 276 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 254 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 277 } | 255 } |
| 278 | 256 |
| 279 TEST_P(QuicStreamSequencerTest, PartialFrameConsumed) { | 257 TEST_F(QuicStreamSequencerTest, PartialFrameConsumed) { |
| 280 EXPECT_CALL(stream_, OnDataAvailable()) | 258 EXPECT_CALL(stream_, OnDataAvailable()) |
| 281 .WillOnce(testing::Invoke( | 259 .WillOnce(testing::Invoke( |
| 282 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, | 260 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 283 base::Unretained(this), 2))); | 261 base::Unretained(this), 2))); |
| 284 | 262 |
| 285 OnFrame(0, "abc"); | 263 OnFrame(0, "abc"); |
| 286 EXPECT_EQ(1u, NumBufferedBytes()); | 264 EXPECT_EQ(1u, NumBufferedBytes()); |
| 287 EXPECT_EQ(2u, sequencer_->NumBytesConsumed()); | 265 EXPECT_EQ(2u, sequencer_->NumBytesConsumed()); |
| 288 } | 266 } |
| 289 | 267 |
| 290 TEST_P(QuicStreamSequencerTest, NextxFrameNotConsumed) { | 268 TEST_F(QuicStreamSequencerTest, NextxFrameNotConsumed) { |
| 291 EXPECT_CALL(stream_, OnDataAvailable()); | 269 EXPECT_CALL(stream_, OnDataAvailable()); |
| 292 | 270 |
| 293 OnFrame(0, "abc"); | 271 OnFrame(0, "abc"); |
| 294 EXPECT_EQ(3u, NumBufferedBytes()); | 272 EXPECT_EQ(3u, NumBufferedBytes()); |
| 295 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 273 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 296 EXPECT_EQ(0, sequencer_->num_early_frames_received()); | 274 EXPECT_EQ(0, sequencer_->num_early_frames_received()); |
| 297 } | 275 } |
| 298 | 276 |
| 299 TEST_P(QuicStreamSequencerTest, FutureFrameNotProcessed) { | 277 TEST_F(QuicStreamSequencerTest, FutureFrameNotProcessed) { |
| 300 OnFrame(3, "abc"); | 278 OnFrame(3, "abc"); |
| 301 EXPECT_EQ(3u, NumBufferedBytes()); | 279 EXPECT_EQ(3u, NumBufferedBytes()); |
| 302 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 280 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 303 EXPECT_EQ(1, sequencer_->num_early_frames_received()); | 281 EXPECT_EQ(1, sequencer_->num_early_frames_received()); |
| 304 } | 282 } |
| 305 | 283 |
| 306 TEST_P(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { | 284 TEST_F(QuicStreamSequencerTest, OutOfOrderFrameProcessed) { |
| 307 // Buffer the first | 285 // Buffer the first |
| 308 OnFrame(6, "ghi"); | 286 OnFrame(6, "ghi"); |
| 309 EXPECT_EQ(3u, NumBufferedBytes()); | 287 EXPECT_EQ(3u, NumBufferedBytes()); |
| 310 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 288 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 311 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); | 289 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
| 312 // Buffer the second | 290 // Buffer the second |
| 313 OnFrame(3, "def"); | 291 OnFrame(3, "def"); |
| 314 EXPECT_EQ(6u, NumBufferedBytes()); | 292 EXPECT_EQ(6u, NumBufferedBytes()); |
| 315 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 293 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 316 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); | 294 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); |
| 317 | 295 |
| 318 EXPECT_CALL(stream_, OnDataAvailable()) | 296 EXPECT_CALL(stream_, OnDataAvailable()) |
| 319 .WillOnce(testing::Invoke( | 297 .WillOnce(testing::Invoke( |
| 320 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, | 298 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 321 base::Unretained(this), 9))); | 299 base::Unretained(this), 9))); |
| 322 | 300 |
| 323 // Now process all of them at once. | 301 // Now process all of them at once. |
| 324 OnFrame(0, "abc"); | 302 OnFrame(0, "abc"); |
| 325 EXPECT_EQ(9u, sequencer_->NumBytesConsumed()); | 303 EXPECT_EQ(9u, sequencer_->NumBytesConsumed()); |
| 326 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); | 304 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); |
| 327 | 305 |
| 328 EXPECT_EQ(0u, NumBufferedBytes()); | 306 EXPECT_EQ(0u, NumBufferedBytes()); |
| 329 } | 307 } |
| 330 | 308 |
| 331 TEST_P(QuicStreamSequencerTest, BasicHalfCloseOrdered) { | 309 TEST_F(QuicStreamSequencerTest, BasicHalfCloseOrdered) { |
| 332 InSequence s; | 310 InSequence s; |
| 333 | 311 |
| 334 EXPECT_CALL(stream_, OnDataAvailable()) | 312 EXPECT_CALL(stream_, OnDataAvailable()) |
| 335 .WillOnce(testing::Invoke( | 313 .WillOnce(testing::Invoke( |
| 336 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, | 314 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 337 base::Unretained(this), 3))); | 315 base::Unretained(this), 3))); |
| 338 OnFinFrame(0, "abc"); | 316 OnFinFrame(0, "abc"); |
| 339 | 317 |
| 340 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 318 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
| 341 } | 319 } |
| 342 | 320 |
| 343 TEST_P(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { | 321 TEST_F(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { |
| 344 OnFinFrame(6, ""); | 322 OnFinFrame(6, ""); |
| 345 EXPECT_EQ(6u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 323 EXPECT_EQ(6u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
| 346 | 324 |
| 347 OnFrame(3, "def"); | 325 OnFrame(3, "def"); |
| 348 EXPECT_CALL(stream_, OnDataAvailable()) | 326 EXPECT_CALL(stream_, OnDataAvailable()) |
| 349 .WillOnce(testing::Invoke( | 327 .WillOnce(testing::Invoke( |
| 350 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, | 328 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 351 base::Unretained(this), 6))); | 329 base::Unretained(this), 6))); |
| 352 EXPECT_FALSE(sequencer_->IsClosed()); | 330 EXPECT_FALSE(sequencer_->IsClosed()); |
| 353 OnFrame(0, "abc"); | 331 OnFrame(0, "abc"); |
| 354 EXPECT_TRUE(sequencer_->IsClosed()); | 332 EXPECT_TRUE(sequencer_->IsClosed()); |
| 355 } | 333 } |
| 356 | 334 |
| 357 TEST_P(QuicStreamSequencerTest, BasicHalfUnordered) { | 335 TEST_F(QuicStreamSequencerTest, BasicHalfUnordered) { |
| 358 OnFinFrame(3, ""); | 336 OnFinFrame(3, ""); |
| 359 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 337 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
| 360 | 338 |
| 361 EXPECT_CALL(stream_, OnDataAvailable()) | 339 EXPECT_CALL(stream_, OnDataAvailable()) |
| 362 .WillOnce(testing::Invoke( | 340 .WillOnce(testing::Invoke( |
| 363 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, | 341 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 364 base::Unretained(this), 3))); | 342 base::Unretained(this), 3))); |
| 365 EXPECT_FALSE(sequencer_->IsClosed()); | 343 EXPECT_FALSE(sequencer_->IsClosed()); |
| 366 OnFrame(0, "abc"); | 344 OnFrame(0, "abc"); |
| 367 EXPECT_TRUE(sequencer_->IsClosed()); | 345 EXPECT_TRUE(sequencer_->IsClosed()); |
| 368 } | 346 } |
| 369 | 347 |
| 370 TEST_P(QuicStreamSequencerTest, TerminateWithReadv) { | 348 TEST_F(QuicStreamSequencerTest, TerminateWithReadv) { |
| 371 char buffer[3]; | 349 char buffer[3]; |
| 372 | 350 |
| 373 OnFinFrame(3, ""); | 351 OnFinFrame(3, ""); |
| 374 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 352 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
| 375 | 353 |
| 376 EXPECT_FALSE(sequencer_->IsClosed()); | 354 EXPECT_FALSE(sequencer_->IsClosed()); |
| 377 | 355 |
| 378 EXPECT_CALL(stream_, OnDataAvailable()); | 356 EXPECT_CALL(stream_, OnDataAvailable()); |
| 379 OnFrame(0, "abc"); | 357 OnFrame(0, "abc"); |
| 380 | 358 |
| 381 iovec iov = {&buffer[0], 3}; | 359 iovec iov = {&buffer[0], 3}; |
| 382 int bytes_read = sequencer_->Readv(&iov, 1); | 360 int bytes_read = sequencer_->Readv(&iov, 1); |
| 383 EXPECT_EQ(3, bytes_read); | 361 EXPECT_EQ(3, bytes_read); |
| 384 EXPECT_TRUE(sequencer_->IsClosed()); | 362 EXPECT_TRUE(sequencer_->IsClosed()); |
| 385 } | 363 } |
| 386 | 364 |
| 387 TEST_P(QuicStreamSequencerTest, MutipleOffsets) { | 365 TEST_F(QuicStreamSequencerTest, MutipleOffsets) { |
| 388 OnFinFrame(3, ""); | 366 OnFinFrame(3, ""); |
| 389 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 367 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
| 390 | 368 |
| 391 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS)); | 369 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS)); |
| 392 OnFinFrame(5, ""); | 370 OnFinFrame(5, ""); |
| 393 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 371 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
| 394 | 372 |
| 395 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS)); | 373 EXPECT_CALL(stream_, Reset(QUIC_MULTIPLE_TERMINATION_OFFSETS)); |
| 396 OnFinFrame(1, ""); | 374 OnFinFrame(1, ""); |
| 397 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 375 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 432 } | 410 } |
| 433 | 411 |
| 434 string output_; | 412 string output_; |
| 435 // Data which peek at using GetReadableRegion if we back up. | 413 // Data which peek at using GetReadableRegion if we back up. |
| 436 string peeked_; | 414 string peeked_; |
| 437 FrameList list_; | 415 FrameList list_; |
| 438 }; | 416 }; |
| 439 | 417 |
| 440 // All frames are processed as soon as we have sequential data. | 418 // All frames are processed as soon as we have sequential data. |
| 441 // Infinite buffering, so all frames are acked right away. | 419 // Infinite buffering, so all frames are acked right away. |
| 442 TEST_P(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) { | 420 TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingNoBackup) { |
| 443 InSequence s; | 421 InSequence s; |
| 444 EXPECT_CALL(stream_, OnDataAvailable()) | 422 EXPECT_CALL(stream_, OnDataAvailable()) |
| 445 .Times(AnyNumber()) | 423 .Times(AnyNumber()) |
| 446 .WillRepeatedly( | 424 .WillRepeatedly( |
| 447 Invoke(this, &QuicSequencerRandomTest::ReadAvailableData)); | 425 Invoke(this, &QuicSequencerRandomTest::ReadAvailableData)); |
| 448 | 426 |
| 449 while (!list_.empty()) { | 427 while (!list_.empty()) { |
| 450 int index = OneToN(list_.size()) - 1; | 428 int index = OneToN(list_.size()) - 1; |
| 451 LOG(ERROR) << "Sending index " << index << " " << list_[index].second; | 429 LOG(ERROR) << "Sending index " << index << " " << list_[index].second; |
| 452 OnFrame(list_[index].first, list_[index].second.data()); | 430 OnFrame(list_[index].first, list_[index].second.data()); |
| 453 | 431 |
| 454 list_.erase(list_.begin() + index); | 432 list_.erase(list_.begin() + index); |
| 455 } | 433 } |
| 456 | 434 |
| 457 ASSERT_EQ(arraysize(kPayload) - 1, output_.size()); | 435 ASSERT_EQ(arraysize(kPayload) - 1, output_.size()); |
| 458 EXPECT_EQ(kPayload, output_); | 436 EXPECT_EQ(kPayload, output_); |
| 459 } | 437 } |
| 460 | 438 |
| 461 TEST_P(QuicSequencerRandomTest, RandomFramesNoDroppingBackup) { | 439 TEST_F(QuicSequencerRandomTest, RandomFramesNoDroppingBackup) { |
| 462 char buffer[10]; | 440 char buffer[10]; |
| 463 iovec iov[2]; | 441 iovec iov[2]; |
| 464 iov[0].iov_base = &buffer[0]; | 442 iov[0].iov_base = &buffer[0]; |
| 465 iov[0].iov_len = 5; | 443 iov[0].iov_len = 5; |
| 466 iov[1].iov_base = &buffer[5]; | 444 iov[1].iov_base = &buffer[5]; |
| 467 iov[1].iov_len = 5; | 445 iov[1].iov_len = 5; |
| 468 | 446 |
| 469 EXPECT_CALL(stream_, OnDataAvailable()).Times(AnyNumber()); | 447 EXPECT_CALL(stream_, OnDataAvailable()).Times(AnyNumber()); |
| 470 | 448 |
| 471 while (output_.size() != arraysize(kPayload) - 1) { | 449 while (output_.size() != arraysize(kPayload) - 1) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 497 int bytes_read = sequencer_->Readv(iov, 2); | 475 int bytes_read = sequencer_->Readv(iov, 2); |
| 498 output_.append(buffer, bytes_read); | 476 output_.append(buffer, bytes_read); |
| 499 ASSERT_EQ(output_.size(), peeked_.size()); | 477 ASSERT_EQ(output_.size(), peeked_.size()); |
| 500 } | 478 } |
| 501 } | 479 } |
| 502 EXPECT_EQ(string(kPayload), output_); | 480 EXPECT_EQ(string(kPayload), output_); |
| 503 EXPECT_EQ(string(kPayload), peeked_); | 481 EXPECT_EQ(string(kPayload), peeked_); |
| 504 } | 482 } |
| 505 | 483 |
| 506 // Same as above, just using a different method for reading. | 484 // Same as above, just using a different method for reading. |
| 507 TEST_P(QuicStreamSequencerTest, MarkConsumed) { | 485 TEST_F(QuicStreamSequencerTest, MarkConsumed) { |
| 508 InSequence s; | 486 InSequence s; |
| 509 EXPECT_CALL(stream_, OnDataAvailable()); | 487 EXPECT_CALL(stream_, OnDataAvailable()); |
| 510 | 488 |
| 511 OnFrame(0, "abc"); | 489 OnFrame(0, "abc"); |
| 512 OnFrame(3, "def"); | 490 OnFrame(3, "def"); |
| 513 OnFrame(6, "ghi"); | 491 OnFrame(6, "ghi"); |
| 514 | 492 |
| 515 // abcdefghi buffered. | 493 // abcdefghi buffered. |
| 516 EXPECT_EQ(9u, sequencer_->NumBytesBuffered()); | 494 EXPECT_EQ(9u, sequencer_->NumBytesBuffered()); |
| 517 | 495 |
| 518 // Peek into the data. | 496 // Peek into the data. |
| 519 vector<string> expected; | 497 vector<string> expected = {"abcdefghi"}; |
| 520 if (FLAGS_quic_use_stream_sequencer_buffer) { | |
| 521 expected = vector<string>{"abcdefghi"}; | |
| 522 } else { | |
| 523 expected = vector<string>{"abc", "def", "ghi"}; | |
| 524 } | |
| 525 ASSERT_TRUE(VerifyReadableRegions(expected)); | 498 ASSERT_TRUE(VerifyReadableRegions(expected)); |
| 526 | 499 |
| 527 // Consume 1 byte. | 500 // Consume 1 byte. |
| 528 sequencer_->MarkConsumed(1); | 501 sequencer_->MarkConsumed(1); |
| 529 EXPECT_EQ(1u, stream_.flow_controller()->bytes_consumed()); | 502 EXPECT_EQ(1u, stream_.flow_controller()->bytes_consumed()); |
| 530 // Verify data. | 503 // Verify data. |
| 531 vector<string> expected2; | 504 vector<string> expected2 = {"bcdefghi"}; |
| 532 if (FLAGS_quic_use_stream_sequencer_buffer) { | |
| 533 expected2 = vector<string>{"bcdefghi"}; | |
| 534 } else { | |
| 535 expected2 = vector<string>{"bc", "def", "ghi"}; | |
| 536 } | |
| 537 ASSERT_TRUE(VerifyReadableRegions(expected2)); | 505 ASSERT_TRUE(VerifyReadableRegions(expected2)); |
| 538 EXPECT_EQ(8u, sequencer_->NumBytesBuffered()); | 506 EXPECT_EQ(8u, sequencer_->NumBytesBuffered()); |
| 539 | 507 |
| 540 // Consume 2 bytes. | 508 // Consume 2 bytes. |
| 541 sequencer_->MarkConsumed(2); | 509 sequencer_->MarkConsumed(2); |
| 542 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); | 510 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); |
| 543 // Verify data. | 511 // Verify data. |
| 544 vector<string> expected3; | 512 vector<string> expected3 = {"defghi"}; |
| 545 if (FLAGS_quic_use_stream_sequencer_buffer) { | |
| 546 expected3 = vector<string>{"defghi"}; | |
| 547 } else { | |
| 548 expected3 = vector<string>{"def", "ghi"}; | |
| 549 } | |
| 550 ASSERT_TRUE(VerifyReadableRegions(expected3)); | 513 ASSERT_TRUE(VerifyReadableRegions(expected3)); |
| 551 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); | 514 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); |
| 552 | 515 |
| 553 // Consume 5 bytes. | 516 // Consume 5 bytes. |
| 554 sequencer_->MarkConsumed(5); | 517 sequencer_->MarkConsumed(5); |
| 555 EXPECT_EQ(8u, stream_.flow_controller()->bytes_consumed()); | 518 EXPECT_EQ(8u, stream_.flow_controller()->bytes_consumed()); |
| 556 // Verify data. | 519 // Verify data. |
| 557 vector<string> expected4{"i"}; | 520 vector<string> expected4{"i"}; |
| 558 ASSERT_TRUE(VerifyReadableRegions(expected4)); | 521 ASSERT_TRUE(VerifyReadableRegions(expected4)); |
| 559 EXPECT_EQ(1u, sequencer_->NumBytesBuffered()); | 522 EXPECT_EQ(1u, sequencer_->NumBytesBuffered()); |
| 560 } | 523 } |
| 561 | 524 |
| 562 TEST_P(QuicStreamSequencerTest, MarkConsumedError) { | 525 TEST_F(QuicStreamSequencerTest, MarkConsumedError) { |
| 563 EXPECT_CALL(stream_, OnDataAvailable()); | 526 EXPECT_CALL(stream_, OnDataAvailable()); |
| 564 | 527 |
| 565 OnFrame(0, "abc"); | 528 OnFrame(0, "abc"); |
| 566 OnFrame(9, "jklmnopqrstuvwxyz"); | 529 OnFrame(9, "jklmnopqrstuvwxyz"); |
| 567 | 530 |
| 568 // Peek into the data. Only the first chunk should be readable because of the | 531 // Peek into the data. Only the first chunk should be readable because of the |
| 569 // missing data. | 532 // missing data. |
| 570 vector<string> expected{"abc"}; | 533 vector<string> expected{"abc"}; |
| 571 ASSERT_TRUE(VerifyReadableRegions(expected)); | 534 ASSERT_TRUE(VerifyReadableRegions(expected)); |
| 572 | 535 |
| 573 // Now, attempt to mark consumed more data than was readable and expect the | 536 // Now, attempt to mark consumed more data than was readable and expect the |
| 574 // stream to be closed. | 537 // stream to be closed. |
| 575 EXPECT_CALL(stream_, Reset(QUIC_ERROR_PROCESSING_STREAM)); | 538 EXPECT_CALL(stream_, Reset(QUIC_ERROR_PROCESSING_STREAM)); |
| 576 EXPECT_DFATAL(sequencer_->MarkConsumed(4), | 539 EXPECT_DFATAL(sequencer_->MarkConsumed(4), |
| 577 "Invalid argument to MarkConsumed." | 540 "Invalid argument to MarkConsumed." |
| 578 " expect to consume: 4, but not enough bytes available."); | 541 " expect to consume: 4, but not enough bytes available."); |
| 579 } | 542 } |
| 580 | 543 |
| 581 TEST_P(QuicStreamSequencerTest, MarkConsumedWithMissingPacket) { | 544 TEST_F(QuicStreamSequencerTest, MarkConsumedWithMissingPacket) { |
| 582 InSequence s; | 545 InSequence s; |
| 583 EXPECT_CALL(stream_, OnDataAvailable()); | 546 EXPECT_CALL(stream_, OnDataAvailable()); |
| 584 | 547 |
| 585 OnFrame(0, "abc"); | 548 OnFrame(0, "abc"); |
| 586 OnFrame(3, "def"); | 549 OnFrame(3, "def"); |
| 587 // Missing packet: 6, ghi. | 550 // Missing packet: 6, ghi. |
| 588 OnFrame(9, "jkl"); | 551 OnFrame(9, "jkl"); |
| 589 | 552 |
| 590 vector<string> expected; | 553 vector<string> expected = {"abcdef"}; |
| 591 if (FLAGS_quic_use_stream_sequencer_buffer) { | |
| 592 expected = vector<string>{"abcdef"}; | |
| 593 } else { | |
| 594 expected = vector<string>{"abc", "def"}; | |
| 595 } | |
| 596 ASSERT_TRUE(VerifyReadableRegions(expected)); | 554 ASSERT_TRUE(VerifyReadableRegions(expected)); |
| 597 | 555 |
| 598 sequencer_->MarkConsumed(6); | 556 sequencer_->MarkConsumed(6); |
| 599 } | 557 } |
| 600 | 558 |
| 601 TEST(QuicFrameListTest, FrameOverlapsBufferedData) { | 559 TEST(QuicFrameListTest, FrameOverlapsBufferedData) { |
| 602 QuicFrameList buffer; | 560 QuicFrameList buffer; |
| 603 | 561 |
| 604 // Ensure that FrameOverlapsBufferedData returns appropriate responses when | 562 // Ensure that FrameOverlapsBufferedData returns appropriate responses when |
| 605 // there is existing data buffered. | 563 // there is existing data buffered. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 639 &buffer, | 597 &buffer, |
| 640 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength, data))); | 598 QuicStreamFrame(1, false, kBufferedOffset - kNewDataLength, data))); |
| 641 | 599 |
| 642 // New byte range entirely outside of buffered frames, start offset later than | 600 // New byte range entirely outside of buffered frames, start offset later than |
| 643 // buffered frame. | 601 // buffered frame. |
| 644 EXPECT_FALSE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( | 602 EXPECT_FALSE(QuicStreamSequencerPeer::FrameOverlapsBufferedData( |
| 645 &buffer, | 603 &buffer, |
| 646 QuicStreamFrame(1, false, kBufferedOffset + kBufferedDataLength, data))); | 604 QuicStreamFrame(1, false, kBufferedOffset + kBufferedDataLength, data))); |
| 647 } | 605 } |
| 648 | 606 |
| 649 TEST_P(QuicStreamSequencerTest, DontAcceptOverlappingFrames) { | 607 TEST_F(QuicStreamSequencerTest, DontAcceptOverlappingFrames) { |
| 650 // The peer should never send us non-identical stream frames which contain | 608 // The peer should never send us non-identical stream frames which contain |
| 651 // overlapping byte ranges - if they do, we close the connection. | 609 // overlapping byte ranges - if they do, we close the connection. |
| 652 | 610 |
| 653 QuicStreamFrame frame1(kClientDataStreamId1, false, 1, StringPiece("hello")); | 611 QuicStreamFrame frame1(kClientDataStreamId1, false, 1, StringPiece("hello")); |
| 654 sequencer_->OnStreamFrame(frame1); | 612 sequencer_->OnStreamFrame(frame1); |
| 655 | 613 |
| 656 QuicStreamFrame frame2(kClientDataStreamId1, false, 2, StringPiece("hello")); | 614 QuicStreamFrame frame2(kClientDataStreamId1, false, 2, StringPiece("hello")); |
| 657 EXPECT_CALL(stream_, CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)) | 615 EXPECT_CALL(stream_, CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)) |
| 658 .Times(1); | 616 .Times(1); |
| 659 sequencer_->OnStreamFrame(frame2); | 617 sequencer_->OnStreamFrame(frame2); |
| 660 } | 618 } |
| 661 | 619 |
| 662 TEST_P(QuicStreamSequencerTest, InOrderTimestamps) { | 620 TEST_F(QuicStreamSequencerTest, InOrderTimestamps) { |
| 663 // This test verifies that timestamps returned by | 621 // This test verifies that timestamps returned by |
| 664 // GetReadableRegion() are in the correct sequence when frames | 622 // GetReadableRegion() are in the correct sequence when frames |
| 665 // arrive at the sequencer in order. | 623 // arrive at the sequencer in order. |
| 666 EXPECT_CALL(stream_, OnDataAvailable()); | 624 EXPECT_CALL(stream_, OnDataAvailable()); |
| 667 | 625 |
| 668 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 626 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 669 | 627 |
| 670 // Buffer the first frame. | 628 // Buffer the first frame. |
| 671 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 629 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 672 QuicTime t1 = clock_.ApproximateNow(); | 630 QuicTime t1 = clock_.ApproximateNow(); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 693 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); | 651 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
| 694 | 652 |
| 695 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); | 653 EXPECT_TRUE(sequencer_->GetReadableRegion(iovecs, ×tamp)); |
| 696 EXPECT_EQ(timestamp, t2); | 654 EXPECT_EQ(timestamp, t2); |
| 697 QuicStreamSequencerTest::ConsumeData(3); | 655 QuicStreamSequencerTest::ConsumeData(3); |
| 698 EXPECT_EQ(0u, NumBufferedBytes()); | 656 EXPECT_EQ(0u, NumBufferedBytes()); |
| 699 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); | 657 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); |
| 700 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); | 658 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); |
| 701 } | 659 } |
| 702 | 660 |
| 703 TEST_P(QuicStreamSequencerTest, OutOfOrderTimestamps) { | 661 TEST_F(QuicStreamSequencerTest, OutOfOrderTimestamps) { |
| 704 // This test verifies that timestamps returned by | 662 // This test verifies that timestamps returned by |
| 705 // GetReadableRegion() are in the correct sequence when frames | 663 // GetReadableRegion() are in the correct sequence when frames |
| 706 // arrive at the sequencer out of order. | 664 // arrive at the sequencer out of order. |
| 707 EXPECT_CALL(stream_, OnDataAvailable()); | 665 EXPECT_CALL(stream_, OnDataAvailable()); |
| 708 | 666 |
| 709 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 667 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 710 | 668 |
| 711 // Buffer the first frame | 669 // Buffer the first frame |
| 712 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 670 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 713 QuicTime t1 = clock_.ApproximateNow(); | 671 QuicTime t1 = clock_.ApproximateNow(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 737 EXPECT_EQ(timestamp, t1); | 695 EXPECT_EQ(timestamp, t1); |
| 738 QuicStreamSequencerTest::ConsumeData(3); | 696 QuicStreamSequencerTest::ConsumeData(3); |
| 739 EXPECT_EQ(0u, NumBufferedBytes()); | 697 EXPECT_EQ(0u, NumBufferedBytes()); |
| 740 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); | 698 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); |
| 741 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); | 699 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); |
| 742 } | 700 } |
| 743 | 701 |
| 744 } // namespace | 702 } // namespace |
| 745 } // namespace test | 703 } // namespace test |
| 746 } // namespace net | 704 } // namespace net |
| OLD | NEW |