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