| 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 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 | 175 |
| 176 INSTANTIATE_TEST_CASE_P(QuicStreamSequencerTests, | 176 INSTANTIATE_TEST_CASE_P(QuicStreamSequencerTests, |
| 177 QuicStreamSequencerTest, | 177 QuicStreamSequencerTest, |
| 178 ::testing::Values(false, true)); | 178 ::testing::Values(false, true)); |
| 179 | 179 |
| 180 // TODO(rch): reorder these tests so they build on each other. | 180 // TODO(rch): reorder these tests so they build on each other. |
| 181 | 181 |
| 182 TEST_P(QuicStreamSequencerTest, RejectOldFrame) { | 182 TEST_P(QuicStreamSequencerTest, RejectOldFrame) { |
| 183 EXPECT_CALL(stream_, OnDataAvailable()) | 183 EXPECT_CALL(stream_, OnDataAvailable()) |
| 184 .WillOnce(testing::Invoke( | 184 .WillOnce(testing::Invoke( |
| 185 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 185 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 186 base::Unretained(this), 3))); |
| 186 | 187 |
| 187 OnFrame(0, "abc"); | 188 OnFrame(0, "abc"); |
| 188 | 189 |
| 189 EXPECT_EQ(0u, NumBufferedBytes()); | 190 EXPECT_EQ(0u, NumBufferedBytes()); |
| 190 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); | 191 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 191 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); | 192 EXPECT_EQ(3u, stream_.flow_controller()->bytes_consumed()); |
| 192 // Ignore this - it matches a past packet number and we should not see it | 193 // Ignore this - it matches a past packet number and we should not see it |
| 193 // again. | 194 // again. |
| 194 OnFrame(0, "def"); | 195 OnFrame(0, "def"); |
| 195 EXPECT_EQ(0u, NumBufferedBytes()); | 196 EXPECT_EQ(0u, NumBufferedBytes()); |
| 196 } | 197 } |
| 197 | 198 |
| 198 TEST_P(QuicStreamSequencerTest, RejectBufferedFrame) { | 199 TEST_P(QuicStreamSequencerTest, RejectBufferedFrame) { |
| 199 EXPECT_CALL(stream_, OnDataAvailable()); | 200 EXPECT_CALL(stream_, OnDataAvailable()); |
| 200 | 201 |
| 201 OnFrame(0, "abc"); | 202 OnFrame(0, "abc"); |
| 202 EXPECT_EQ(3u, NumBufferedBytes()); | 203 EXPECT_EQ(3u, NumBufferedBytes()); |
| 203 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 204 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 204 | 205 |
| 205 // Ignore this - it matches a buffered frame. | 206 // Ignore this - it matches a buffered frame. |
| 206 // Right now there's no checking that the payload is consistent. | 207 // Right now there's no checking that the payload is consistent. |
| 207 OnFrame(0, "def"); | 208 OnFrame(0, "def"); |
| 208 EXPECT_EQ(3u, NumBufferedBytes()); | 209 EXPECT_EQ(3u, NumBufferedBytes()); |
| 209 } | 210 } |
| 210 | 211 |
| 211 TEST_P(QuicStreamSequencerTest, FullFrameConsumed) { | 212 TEST_P(QuicStreamSequencerTest, FullFrameConsumed) { |
| 212 EXPECT_CALL(stream_, OnDataAvailable()) | 213 EXPECT_CALL(stream_, OnDataAvailable()) |
| 213 .WillOnce(testing::Invoke( | 214 .WillOnce(testing::Invoke( |
| 214 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 215 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 216 base::Unretained(this), 3))); |
| 215 | 217 |
| 216 OnFrame(0, "abc"); | 218 OnFrame(0, "abc"); |
| 217 EXPECT_EQ(0u, NumBufferedBytes()); | 219 EXPECT_EQ(0u, NumBufferedBytes()); |
| 218 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); | 220 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 219 } | 221 } |
| 220 | 222 |
| 221 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) { | 223 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameConsumed) { |
| 222 sequencer_->SetBlockedUntilFlush(); | 224 sequencer_->SetBlockedUntilFlush(); |
| 223 | 225 |
| 224 OnFrame(0, "abc"); | 226 OnFrame(0, "abc"); |
| 225 EXPECT_EQ(3u, NumBufferedBytes()); | 227 EXPECT_EQ(3u, NumBufferedBytes()); |
| 226 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 228 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 227 | 229 |
| 228 EXPECT_CALL(stream_, OnDataAvailable()) | 230 EXPECT_CALL(stream_, OnDataAvailable()) |
| 229 .WillOnce(testing::Invoke( | 231 .WillOnce(testing::Invoke( |
| 230 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 232 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 233 base::Unretained(this), 3))); |
| 231 sequencer_->SetUnblocked(); | 234 sequencer_->SetUnblocked(); |
| 232 EXPECT_EQ(0u, NumBufferedBytes()); | 235 EXPECT_EQ(0u, NumBufferedBytes()); |
| 233 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); | 236 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 234 | 237 |
| 235 EXPECT_CALL(stream_, OnDataAvailable()) | 238 EXPECT_CALL(stream_, OnDataAvailable()) |
| 236 .WillOnce(testing::Invoke( | 239 .WillOnce(testing::Invoke( |
| 237 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 240 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 241 base::Unretained(this), 3))); |
| 238 EXPECT_FALSE(sequencer_->IsClosed()); | 242 EXPECT_FALSE(sequencer_->IsClosed()); |
| 239 OnFinFrame(3, "def"); | 243 OnFinFrame(3, "def"); |
| 240 EXPECT_TRUE(sequencer_->IsClosed()); | 244 EXPECT_TRUE(sequencer_->IsClosed()); |
| 241 } | 245 } |
| 242 | 246 |
| 243 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) { | 247 TEST_P(QuicStreamSequencerTest, BlockedThenFullFrameAndFinConsumed) { |
| 244 sequencer_->SetBlockedUntilFlush(); | 248 sequencer_->SetBlockedUntilFlush(); |
| 245 | 249 |
| 246 OnFinFrame(0, "abc"); | 250 OnFinFrame(0, "abc"); |
| 247 EXPECT_EQ(3u, NumBufferedBytes()); | 251 EXPECT_EQ(3u, NumBufferedBytes()); |
| 248 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 252 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 249 | 253 |
| 250 EXPECT_CALL(stream_, OnDataAvailable()) | 254 EXPECT_CALL(stream_, OnDataAvailable()) |
| 251 .WillOnce(testing::Invoke( | 255 .WillOnce(testing::Invoke( |
| 252 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 256 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 257 base::Unretained(this), 3))); |
| 253 EXPECT_FALSE(sequencer_->IsClosed()); | 258 EXPECT_FALSE(sequencer_->IsClosed()); |
| 254 sequencer_->SetUnblocked(); | 259 sequencer_->SetUnblocked(); |
| 255 EXPECT_TRUE(sequencer_->IsClosed()); | 260 EXPECT_TRUE(sequencer_->IsClosed()); |
| 256 EXPECT_EQ(0u, NumBufferedBytes()); | 261 EXPECT_EQ(0u, NumBufferedBytes()); |
| 257 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); | 262 EXPECT_EQ(3u, sequencer_->NumBytesConsumed()); |
| 258 } | 263 } |
| 259 | 264 |
| 260 TEST_P(QuicStreamSequencerTest, EmptyFrame) { | 265 TEST_P(QuicStreamSequencerTest, EmptyFrame) { |
| 261 EXPECT_CALL(stream_, | 266 EXPECT_CALL(stream_, |
| 262 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); | 267 CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, _)); |
| 263 OnFrame(0, ""); | 268 OnFrame(0, ""); |
| 264 EXPECT_EQ(0u, NumBufferedBytes()); | 269 EXPECT_EQ(0u, NumBufferedBytes()); |
| 265 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 270 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 266 } | 271 } |
| 267 | 272 |
| 268 TEST_P(QuicStreamSequencerTest, EmptyFinFrame) { | 273 TEST_P(QuicStreamSequencerTest, EmptyFinFrame) { |
| 269 EXPECT_CALL(stream_, OnDataAvailable()); | 274 EXPECT_CALL(stream_, OnDataAvailable()); |
| 270 OnFinFrame(0, ""); | 275 OnFinFrame(0, ""); |
| 271 EXPECT_EQ(0u, NumBufferedBytes()); | 276 EXPECT_EQ(0u, NumBufferedBytes()); |
| 272 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 277 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 273 } | 278 } |
| 274 | 279 |
| 275 TEST_P(QuicStreamSequencerTest, PartialFrameConsumed) { | 280 TEST_P(QuicStreamSequencerTest, PartialFrameConsumed) { |
| 276 EXPECT_CALL(stream_, OnDataAvailable()) | 281 EXPECT_CALL(stream_, OnDataAvailable()) |
| 277 .WillOnce(testing::Invoke( | 282 .WillOnce(testing::Invoke( |
| 278 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 2))); | 283 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 284 base::Unretained(this), 2))); |
| 279 | 285 |
| 280 OnFrame(0, "abc"); | 286 OnFrame(0, "abc"); |
| 281 EXPECT_EQ(1u, NumBufferedBytes()); | 287 EXPECT_EQ(1u, NumBufferedBytes()); |
| 282 EXPECT_EQ(2u, sequencer_->NumBytesConsumed()); | 288 EXPECT_EQ(2u, sequencer_->NumBytesConsumed()); |
| 283 } | 289 } |
| 284 | 290 |
| 285 TEST_P(QuicStreamSequencerTest, NextxFrameNotConsumed) { | 291 TEST_P(QuicStreamSequencerTest, NextxFrameNotConsumed) { |
| 286 EXPECT_CALL(stream_, OnDataAvailable()); | 292 EXPECT_CALL(stream_, OnDataAvailable()); |
| 287 | 293 |
| 288 OnFrame(0, "abc"); | 294 OnFrame(0, "abc"); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 305 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 311 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 306 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); | 312 EXPECT_EQ(3u, sequencer_->NumBytesBuffered()); |
| 307 // Buffer the second | 313 // Buffer the second |
| 308 OnFrame(3, "def"); | 314 OnFrame(3, "def"); |
| 309 EXPECT_EQ(6u, NumBufferedBytes()); | 315 EXPECT_EQ(6u, NumBufferedBytes()); |
| 310 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); | 316 EXPECT_EQ(0u, sequencer_->NumBytesConsumed()); |
| 311 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); | 317 EXPECT_EQ(6u, sequencer_->NumBytesBuffered()); |
| 312 | 318 |
| 313 EXPECT_CALL(stream_, OnDataAvailable()) | 319 EXPECT_CALL(stream_, OnDataAvailable()) |
| 314 .WillOnce(testing::Invoke( | 320 .WillOnce(testing::Invoke( |
| 315 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 9))); | 321 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 322 base::Unretained(this), 9))); |
| 316 | 323 |
| 317 // Now process all of them at once. | 324 // Now process all of them at once. |
| 318 OnFrame(0, "abc"); | 325 OnFrame(0, "abc"); |
| 319 EXPECT_EQ(9u, sequencer_->NumBytesConsumed()); | 326 EXPECT_EQ(9u, sequencer_->NumBytesConsumed()); |
| 320 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); | 327 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); |
| 321 | 328 |
| 322 EXPECT_EQ(0u, NumBufferedBytes()); | 329 EXPECT_EQ(0u, NumBufferedBytes()); |
| 323 } | 330 } |
| 324 | 331 |
| 325 TEST_P(QuicStreamSequencerTest, BasicHalfCloseOrdered) { | 332 TEST_P(QuicStreamSequencerTest, BasicHalfCloseOrdered) { |
| 326 InSequence s; | 333 InSequence s; |
| 327 | 334 |
| 328 EXPECT_CALL(stream_, OnDataAvailable()) | 335 EXPECT_CALL(stream_, OnDataAvailable()) |
| 329 .WillOnce(testing::Invoke( | 336 .WillOnce(testing::Invoke( |
| 330 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 337 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 338 base::Unretained(this), 3))); |
| 331 OnFinFrame(0, "abc"); | 339 OnFinFrame(0, "abc"); |
| 332 | 340 |
| 333 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 341 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
| 334 } | 342 } |
| 335 | 343 |
| 336 TEST_P(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { | 344 TEST_P(QuicStreamSequencerTest, BasicHalfCloseUnorderedWithFlush) { |
| 337 OnFinFrame(6, ""); | 345 OnFinFrame(6, ""); |
| 338 EXPECT_EQ(6u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 346 EXPECT_EQ(6u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
| 339 | 347 |
| 340 OnFrame(3, "def"); | 348 OnFrame(3, "def"); |
| 341 EXPECT_CALL(stream_, OnDataAvailable()) | 349 EXPECT_CALL(stream_, OnDataAvailable()) |
| 342 .WillOnce(testing::Invoke( | 350 .WillOnce(testing::Invoke( |
| 343 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 6))); | 351 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 352 base::Unretained(this), 6))); |
| 344 EXPECT_FALSE(sequencer_->IsClosed()); | 353 EXPECT_FALSE(sequencer_->IsClosed()); |
| 345 OnFrame(0, "abc"); | 354 OnFrame(0, "abc"); |
| 346 EXPECT_TRUE(sequencer_->IsClosed()); | 355 EXPECT_TRUE(sequencer_->IsClosed()); |
| 347 } | 356 } |
| 348 | 357 |
| 349 TEST_P(QuicStreamSequencerTest, BasicHalfUnordered) { | 358 TEST_P(QuicStreamSequencerTest, BasicHalfUnordered) { |
| 350 OnFinFrame(3, ""); | 359 OnFinFrame(3, ""); |
| 351 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 360 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
| 352 | 361 |
| 353 EXPECT_CALL(stream_, OnDataAvailable()) | 362 EXPECT_CALL(stream_, OnDataAvailable()) |
| 354 .WillOnce(testing::Invoke( | 363 .WillOnce(testing::Invoke( |
| 355 CreateFunctor(this, &QuicStreamSequencerTest::ConsumeData, 3))); | 364 CreateFunctor(&QuicStreamSequencerTest::ConsumeData, |
| 365 base::Unretained(this), 3))); |
| 356 EXPECT_FALSE(sequencer_->IsClosed()); | 366 EXPECT_FALSE(sequencer_->IsClosed()); |
| 357 OnFrame(0, "abc"); | 367 OnFrame(0, "abc"); |
| 358 EXPECT_TRUE(sequencer_->IsClosed()); | 368 EXPECT_TRUE(sequencer_->IsClosed()); |
| 359 } | 369 } |
| 360 | 370 |
| 361 TEST_P(QuicStreamSequencerTest, TerminateWithReadv) { | 371 TEST_P(QuicStreamSequencerTest, TerminateWithReadv) { |
| 362 char buffer[3]; | 372 char buffer[3]; |
| 363 | 373 |
| 364 OnFinFrame(3, ""); | 374 OnFinFrame(3, ""); |
| 365 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); | 375 EXPECT_EQ(3u, QuicStreamSequencerPeer::GetCloseOffset(sequencer_.get())); |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 EXPECT_EQ(timestamp, t1); | 738 EXPECT_EQ(timestamp, t1); |
| 729 QuicStreamSequencerTest::ConsumeData(3); | 739 QuicStreamSequencerTest::ConsumeData(3); |
| 730 EXPECT_EQ(0u, NumBufferedBytes()); | 740 EXPECT_EQ(0u, NumBufferedBytes()); |
| 731 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); | 741 EXPECT_EQ(6u, sequencer_->NumBytesConsumed()); |
| 732 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); | 742 EXPECT_EQ(0u, sequencer_->NumBytesBuffered()); |
| 733 } | 743 } |
| 734 | 744 |
| 735 } // namespace | 745 } // namespace |
| 736 } // namespace test | 746 } // namespace test |
| 737 } // namespace net | 747 } // namespace net |
| OLD | NEW |