| 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/core/quic_packet_generator.h" | 5 #include "net/quic/core/quic_packet_generator.h" |
| 6 | 6 |
| 7 #include <cstdint> | 7 #include <cstdint> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 class MockDebugDelegate : public QuicPacketCreator::DebugDelegate { | 234 class MockDebugDelegate : public QuicPacketCreator::DebugDelegate { |
| 235 public: | 235 public: |
| 236 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); | 236 MOCK_METHOD1(OnFrameAddedToPacket, void(const QuicFrame&)); |
| 237 }; | 237 }; |
| 238 | 238 |
| 239 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { | 239 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { |
| 240 delegate_.SetCanNotWrite(); | 240 delegate_.SetCanNotWrite(); |
| 241 | 241 |
| 242 generator_.SetShouldSendAck(false); | 242 generator_.SetShouldSendAck(false); |
| 243 EXPECT_TRUE(generator_.HasQueuedFrames()); | 243 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 244 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 244 } | 245 } |
| 245 | 246 |
| 246 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { | 247 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { |
| 247 StrictMock<MockDebugDelegate> debug_delegate; | 248 StrictMock<MockDebugDelegate> debug_delegate; |
| 248 | 249 |
| 249 generator_.set_debug_delegate(&debug_delegate); | 250 generator_.set_debug_delegate(&debug_delegate); |
| 250 delegate_.SetCanWriteOnlyNonRetransmittable(); | 251 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 251 generator_.StartBatchOperations(); | 252 generator_.StartBatchOperations(); |
| 252 | 253 |
| 253 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | 254 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
| 254 .WillOnce(Return(QuicFrame(&ack_frame_))); | 255 .WillOnce(Return(QuicFrame(&ack_frame_))); |
| 255 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); | 256 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); |
| 256 | 257 |
| 257 generator_.SetShouldSendAck(false); | 258 generator_.SetShouldSendAck(false); |
| 258 EXPECT_TRUE(generator_.HasQueuedFrames()); | 259 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 260 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 259 } | 261 } |
| 260 | 262 |
| 261 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | 263 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { |
| 262 delegate_.SetCanWriteOnlyNonRetransmittable(); | 264 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 263 | 265 |
| 264 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | 266 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
| 265 .WillOnce(Return(QuicFrame(&ack_frame_))); | 267 .WillOnce(Return(QuicFrame(&ack_frame_))); |
| 266 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 268 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 267 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 269 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 268 | 270 |
| 269 generator_.SetShouldSendAck(false); | 271 generator_.SetShouldSendAck(false); |
| 270 EXPECT_FALSE(generator_.HasQueuedFrames()); | 272 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 273 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 271 | 274 |
| 272 PacketContents contents; | 275 PacketContents contents; |
| 273 contents.num_ack_frames = 1; | 276 contents.num_ack_frames = 1; |
| 274 CheckPacketContains(contents, 0); | 277 CheckPacketContains(contents, 0); |
| 275 } | 278 } |
| 276 | 279 |
| 277 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { | 280 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { |
| 278 // Make sure that calling SetShouldSendAck multiple times does not result in a | 281 // Make sure that calling SetShouldSendAck multiple times does not result in a |
| 279 // crash. Previously this would result in multiple QuicFrames queued in the | 282 // crash. Previously this would result in multiple QuicFrames queued in the |
| 280 // packet generator, with all but the last with internal pointers to freed | 283 // packet generator, with all but the last with internal pointers to freed |
| (...skipping 11 matching lines...) Expand all Loading... |
| 292 generator_.SetShouldSendAck(false); | 295 generator_.SetShouldSendAck(false); |
| 293 generator_.SetShouldSendAck(false); | 296 generator_.SetShouldSendAck(false); |
| 294 generator_.FinishBatchOperations(); | 297 generator_.FinishBatchOperations(); |
| 295 } | 298 } |
| 296 | 299 |
| 297 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { | 300 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { |
| 298 delegate_.SetCanNotWrite(); | 301 delegate_.SetCanNotWrite(); |
| 299 | 302 |
| 300 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 303 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 301 EXPECT_TRUE(generator_.HasQueuedFrames()); | 304 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 305 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 302 } | 306 } |
| 303 | 307 |
| 304 TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) { | 308 TEST_F(QuicPacketGeneratorTest, AddControlFrame_OnlyAckWritable) { |
| 305 delegate_.SetCanWriteOnlyNonRetransmittable(); | 309 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 306 | 310 |
| 307 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 311 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 308 EXPECT_TRUE(generator_.HasQueuedFrames()); | 312 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 313 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 309 } | 314 } |
| 310 | 315 |
| 311 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) { | 316 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldNotFlush) { |
| 312 delegate_.SetCanWriteAnything(); | 317 delegate_.SetCanWriteAnything(); |
| 313 generator_.StartBatchOperations(); | 318 generator_.StartBatchOperations(); |
| 314 | 319 |
| 315 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 320 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 316 EXPECT_TRUE(generator_.HasQueuedFrames()); | 321 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 322 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 317 } | 323 } |
| 318 | 324 |
| 319 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { | 325 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { |
| 320 delegate_.SetCanNotWrite(); | 326 delegate_.SetCanNotWrite(); |
| 321 generator_.StartBatchOperations(); | 327 generator_.StartBatchOperations(); |
| 322 | 328 |
| 323 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 329 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 324 EXPECT_TRUE(generator_.HasQueuedFrames()); | 330 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 331 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 325 generator_.FinishBatchOperations(); | 332 generator_.FinishBatchOperations(); |
| 326 EXPECT_TRUE(generator_.HasQueuedFrames()); | 333 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 334 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 327 | 335 |
| 328 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 336 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 329 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 337 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 330 generator_.FlushAllQueuedFrames(); | 338 generator_.FlushAllQueuedFrames(); |
| 331 EXPECT_FALSE(generator_.HasQueuedFrames()); | 339 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 340 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 332 | 341 |
| 333 PacketContents contents; | 342 PacketContents contents; |
| 334 contents.num_rst_stream_frames = 1; | 343 contents.num_rst_stream_frames = 1; |
| 335 CheckPacketContains(contents, 0); | 344 CheckPacketContains(contents, 0); |
| 336 } | 345 } |
| 337 | 346 |
| 338 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { | 347 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { |
| 339 delegate_.SetCanWriteAnything(); | 348 delegate_.SetCanWriteAnything(); |
| 340 | 349 |
| 341 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 350 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 342 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 351 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 343 | 352 |
| 344 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 353 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 345 EXPECT_FALSE(generator_.HasQueuedFrames()); | 354 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 355 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 346 | 356 |
| 347 PacketContents contents; | 357 PacketContents contents; |
| 348 contents.num_rst_stream_frames = 1; | 358 contents.num_rst_stream_frames = 1; |
| 349 CheckPacketContains(contents, 0); | 359 CheckPacketContains(contents, 0); |
| 350 } | 360 } |
| 351 | 361 |
| 352 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { | 362 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { |
| 353 delegate_.SetCanNotWrite(); | 363 delegate_.SetCanNotWrite(); |
| 354 | 364 |
| 355 QuicConsumedData consumed = generator_.ConsumeData( | 365 QuicConsumedData consumed = generator_.ConsumeData( |
| 356 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); | 366 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); |
| 357 EXPECT_EQ(0u, consumed.bytes_consumed); | 367 EXPECT_EQ(0u, consumed.bytes_consumed); |
| 358 EXPECT_FALSE(consumed.fin_consumed); | 368 EXPECT_FALSE(consumed.fin_consumed); |
| 359 EXPECT_FALSE(generator_.HasQueuedFrames()); | 369 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 370 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 360 } | 371 } |
| 361 | 372 |
| 362 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { | 373 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { |
| 363 delegate_.SetCanWriteAnything(); | 374 delegate_.SetCanWriteAnything(); |
| 364 generator_.StartBatchOperations(); | 375 generator_.StartBatchOperations(); |
| 365 | 376 |
| 366 QuicConsumedData consumed = generator_.ConsumeData( | 377 QuicConsumedData consumed = generator_.ConsumeData( |
| 367 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); | 378 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); |
| 368 EXPECT_EQ(3u, consumed.bytes_consumed); | 379 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 369 EXPECT_TRUE(consumed.fin_consumed); | 380 EXPECT_TRUE(consumed.fin_consumed); |
| 370 EXPECT_TRUE(generator_.HasQueuedFrames()); | 381 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 382 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 371 } | 383 } |
| 372 | 384 |
| 373 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { | 385 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { |
| 374 delegate_.SetCanWriteAnything(); | 386 delegate_.SetCanWriteAnything(); |
| 375 | 387 |
| 376 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 388 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 377 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 389 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 378 QuicConsumedData consumed = generator_.ConsumeData( | 390 QuicConsumedData consumed = generator_.ConsumeData( |
| 379 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); | 391 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 2, FIN, nullptr); |
| 380 EXPECT_EQ(3u, consumed.bytes_consumed); | 392 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 381 EXPECT_TRUE(consumed.fin_consumed); | 393 EXPECT_TRUE(consumed.fin_consumed); |
| 382 EXPECT_FALSE(generator_.HasQueuedFrames()); | 394 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 395 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 383 | 396 |
| 384 PacketContents contents; | 397 PacketContents contents; |
| 385 contents.num_stream_frames = 1; | 398 contents.num_stream_frames = 1; |
| 386 CheckPacketContains(contents, 0); | 399 CheckPacketContains(contents, 0); |
| 387 } | 400 } |
| 388 | 401 |
| 389 // Test the behavior of ConsumeData when the data consumed is for the crypto | 402 // Test the behavior of ConsumeData when the data consumed is for the crypto |
| 390 // handshake stream. Ensure that the packet is always sent and padded even if | 403 // handshake stream. Ensure that the packet is always sent and padded even if |
| 391 // the generator operates in batch mode. | 404 // the generator operates in batch mode. |
| 392 TEST_F(QuicPacketGeneratorTest, ConsumeData_Handshake) { | 405 TEST_F(QuicPacketGeneratorTest, ConsumeData_Handshake) { |
| 393 delegate_.SetCanWriteAnything(); | 406 delegate_.SetCanWriteAnything(); |
| 394 generator_.StartBatchOperations(); | 407 generator_.StartBatchOperations(); |
| 395 | 408 |
| 396 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 409 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 397 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 410 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 398 QuicConsumedData consumed = generator_.ConsumeData( | 411 QuicConsumedData consumed = generator_.ConsumeData( |
| 399 kCryptoStreamId, MakeIOVectorFromStringPiece("foo"), 0, NO_FIN, nullptr); | 412 kCryptoStreamId, MakeIOVectorFromStringPiece("foo"), 0, NO_FIN, nullptr); |
| 400 EXPECT_EQ(3u, consumed.bytes_consumed); | 413 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 401 EXPECT_FALSE(generator_.HasQueuedFrames()); | 414 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 415 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 402 | 416 |
| 403 PacketContents contents; | 417 PacketContents contents; |
| 404 contents.num_stream_frames = 1; | 418 contents.num_stream_frames = 1; |
| 405 contents.num_padding_frames = 1; | 419 contents.num_padding_frames = 1; |
| 406 CheckPacketContains(contents, 0); | 420 CheckPacketContains(contents, 0); |
| 407 | 421 |
| 408 ASSERT_EQ(1u, packets_.size()); | 422 ASSERT_EQ(1u, packets_.size()); |
| 409 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength()); | 423 ASSERT_EQ(kDefaultMaxPacketSize, generator_.GetCurrentMaxPacketLength()); |
| 410 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 424 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
| 411 } | 425 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 422 delegate_.SetCanWriteAnything(); | 436 delegate_.SetCanWriteAnything(); |
| 423 generator_.StartBatchOperations(); | 437 generator_.StartBatchOperations(); |
| 424 | 438 |
| 425 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), | 439 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), |
| 426 2, FIN, nullptr); | 440 2, FIN, nullptr); |
| 427 QuicConsumedData consumed = generator_.ConsumeData( | 441 QuicConsumedData consumed = generator_.ConsumeData( |
| 428 3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, nullptr); | 442 3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, nullptr); |
| 429 EXPECT_EQ(4u, consumed.bytes_consumed); | 443 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 430 EXPECT_FALSE(consumed.fin_consumed); | 444 EXPECT_FALSE(consumed.fin_consumed); |
| 431 EXPECT_TRUE(generator_.HasQueuedFrames()); | 445 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 446 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 432 } | 447 } |
| 433 | 448 |
| 434 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { | 449 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { |
| 435 delegate_.SetCanWriteAnything(); | 450 delegate_.SetCanWriteAnything(); |
| 436 generator_.StartBatchOperations(); | 451 generator_.StartBatchOperations(); |
| 437 | 452 |
| 438 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), | 453 generator_.ConsumeData(kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), |
| 439 2, FIN, nullptr); | 454 2, FIN, nullptr); |
| 440 QuicConsumedData consumed = generator_.ConsumeData( | 455 QuicConsumedData consumed = generator_.ConsumeData( |
| 441 3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, nullptr); | 456 3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, nullptr); |
| 442 EXPECT_EQ(4u, consumed.bytes_consumed); | 457 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 443 EXPECT_FALSE(consumed.fin_consumed); | 458 EXPECT_FALSE(consumed.fin_consumed); |
| 444 EXPECT_TRUE(generator_.HasQueuedFrames()); | 459 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 460 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 445 | 461 |
| 446 // Now both frames will be flushed out. | 462 // Now both frames will be flushed out. |
| 447 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 463 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 448 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 464 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 449 generator_.FinishBatchOperations(); | 465 generator_.FinishBatchOperations(); |
| 450 EXPECT_FALSE(generator_.HasQueuedFrames()); | 466 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 467 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 451 | 468 |
| 452 PacketContents contents; | 469 PacketContents contents; |
| 453 contents.num_stream_frames = 2; | 470 contents.num_stream_frames = 2; |
| 454 CheckPacketContains(contents, 0); | 471 CheckPacketContains(contents, 0); |
| 455 } | 472 } |
| 456 | 473 |
| 457 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { | 474 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { |
| 458 // Set the packet size be enough for two stream frames with 0 stream offset, | 475 // Set the packet size be enough for two stream frames with 0 stream offset, |
| 459 // but not enough for a stream frame of 0 offset and one with non-zero offset. | 476 // but not enough for a stream frame of 0 offset and one with non-zero offset. |
| 460 size_t length = | 477 size_t length = |
| (...skipping 16 matching lines...) Expand all Loading... |
| 477 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 494 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 478 } | 495 } |
| 479 generator_.StartBatchOperations(); | 496 generator_.StartBatchOperations(); |
| 480 // Queue enough data to prevent a stream frame with a non-zero offset from | 497 // Queue enough data to prevent a stream frame with a non-zero offset from |
| 481 // fitting. | 498 // fitting. |
| 482 QuicConsumedData consumed = generator_.ConsumeData( | 499 QuicConsumedData consumed = generator_.ConsumeData( |
| 483 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 0, NO_FIN, nullptr); | 500 kHeadersStreamId, MakeIOVectorFromStringPiece("foo"), 0, NO_FIN, nullptr); |
| 484 EXPECT_EQ(3u, consumed.bytes_consumed); | 501 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 485 EXPECT_FALSE(consumed.fin_consumed); | 502 EXPECT_FALSE(consumed.fin_consumed); |
| 486 EXPECT_TRUE(generator_.HasQueuedFrames()); | 503 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 504 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 487 | 505 |
| 488 // This frame will not fit with the existing frame, causing the queued frame | 506 // This frame will not fit with the existing frame, causing the queued frame |
| 489 // to be serialized, and it will be added to a new open packet. | 507 // to be serialized, and it will be added to a new open packet. |
| 490 consumed = generator_.ConsumeData( | 508 consumed = generator_.ConsumeData( |
| 491 kHeadersStreamId, MakeIOVectorFromStringPiece("bar"), 3, FIN, nullptr); | 509 kHeadersStreamId, MakeIOVectorFromStringPiece("bar"), 3, FIN, nullptr); |
| 492 EXPECT_EQ(3u, consumed.bytes_consumed); | 510 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 493 EXPECT_TRUE(consumed.fin_consumed); | 511 EXPECT_TRUE(consumed.fin_consumed); |
| 494 EXPECT_TRUE(generator_.HasQueuedFrames()); | 512 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 513 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 495 | 514 |
| 496 creator_->Flush(); | 515 creator_->Flush(); |
| 497 EXPECT_FALSE(generator_.HasQueuedFrames()); | 516 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 517 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 498 | 518 |
| 499 PacketContents contents; | 519 PacketContents contents; |
| 500 contents.num_stream_frames = 1; | 520 contents.num_stream_frames = 1; |
| 501 CheckPacketContains(contents, 0); | 521 CheckPacketContains(contents, 0); |
| 502 CheckPacketContains(contents, 1); | 522 CheckPacketContains(contents, 1); |
| 503 } | 523 } |
| 504 | 524 |
| 505 TEST_F(QuicPacketGeneratorTest, ConsumeDataFastPath) { | 525 TEST_F(QuicPacketGeneratorTest, ConsumeDataFastPath) { |
| 506 delegate_.SetCanWriteAnything(); | 526 delegate_.SetCanWriteAnything(); |
| 507 | 527 |
| 508 // Create a 10000 byte IOVector. | 528 // Create a 10000 byte IOVector. |
| 509 QuicIOVector iov(CreateData(10000)); | 529 QuicIOVector iov(CreateData(10000)); |
| 510 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 530 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 511 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 531 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 512 QuicConsumedData consumed = | 532 QuicConsumedData consumed = |
| 513 generator_.ConsumeDataFastPath(kHeadersStreamId, iov, 0, true, nullptr); | 533 generator_.ConsumeDataFastPath(kHeadersStreamId, iov, 0, true, nullptr); |
| 514 EXPECT_EQ(10000u, consumed.bytes_consumed); | 534 EXPECT_EQ(10000u, consumed.bytes_consumed); |
| 515 EXPECT_TRUE(consumed.fin_consumed); | 535 EXPECT_TRUE(consumed.fin_consumed); |
| 516 EXPECT_FALSE(generator_.HasQueuedFrames()); | 536 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 537 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 517 | 538 |
| 518 PacketContents contents; | 539 PacketContents contents; |
| 519 contents.num_stream_frames = 1; | 540 contents.num_stream_frames = 1; |
| 520 CheckPacketContains(contents, 0); | 541 CheckPacketContains(contents, 0); |
| 521 } | 542 } |
| 522 | 543 |
| 523 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { | 544 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { |
| 524 delegate_.SetCanNotWrite(); | 545 delegate_.SetCanNotWrite(); |
| 525 | 546 |
| 526 generator_.SetShouldSendAck(false); | 547 generator_.SetShouldSendAck(false); |
| 527 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 548 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 528 EXPECT_TRUE(generator_.HasQueuedFrames()); | 549 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 550 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 529 | 551 |
| 530 delegate_.SetCanWriteAnything(); | 552 delegate_.SetCanWriteAnything(); |
| 531 | 553 |
| 532 generator_.StartBatchOperations(); | 554 generator_.StartBatchOperations(); |
| 533 | 555 |
| 534 // When the first write operation is invoked, the ack frame will be returned. | 556 // When the first write operation is invoked, the ack frame will be returned. |
| 535 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | 557 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
| 536 .WillOnce(Return(QuicFrame(&ack_frame_))); | 558 .WillOnce(Return(QuicFrame(&ack_frame_))); |
| 537 | 559 |
| 538 // Send some data and a control frame | 560 // Send some data and a control frame |
| 539 generator_.ConsumeData(3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, | 561 generator_.ConsumeData(3, MakeIOVectorFromStringPiece("quux"), 7, NO_FIN, |
| 540 nullptr); | 562 nullptr); |
| 541 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 563 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 542 | 564 |
| 543 // All five frames will be flushed out in a single packet. | 565 // All five frames will be flushed out in a single packet. |
| 544 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 566 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 545 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 567 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 546 generator_.FinishBatchOperations(); | 568 generator_.FinishBatchOperations(); |
| 547 EXPECT_FALSE(generator_.HasQueuedFrames()); | 569 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 570 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 548 | 571 |
| 549 PacketContents contents; | 572 PacketContents contents; |
| 550 contents.num_ack_frames = 1; | 573 contents.num_ack_frames = 1; |
| 551 contents.num_goaway_frames = 1; | 574 contents.num_goaway_frames = 1; |
| 552 contents.num_rst_stream_frames = 1; | 575 contents.num_rst_stream_frames = 1; |
| 553 contents.num_stream_frames = 1; | 576 contents.num_stream_frames = 1; |
| 554 CheckPacketContains(contents, 0); | 577 CheckPacketContains(contents, 0); |
| 555 } | 578 } |
| 556 | 579 |
| 557 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { | 580 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { |
| 558 delegate_.SetCanNotWrite(); | 581 delegate_.SetCanNotWrite(); |
| 559 | 582 |
| 560 generator_.SetShouldSendAck(false); | 583 generator_.SetShouldSendAck(false); |
| 561 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 584 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 562 EXPECT_TRUE(generator_.HasQueuedFrames()); | 585 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 586 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 563 | 587 |
| 564 delegate_.SetCanWriteAnything(); | 588 delegate_.SetCanWriteAnything(); |
| 565 | 589 |
| 566 generator_.StartBatchOperations(); | 590 generator_.StartBatchOperations(); |
| 567 | 591 |
| 568 // When the first write operation is invoked, the ack frame will be returned. | 592 // When the first write operation is invoked, the ack frame will be returned. |
| 569 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | 593 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
| 570 .WillOnce(Return(QuicFrame(&ack_frame_))); | 594 .WillOnce(Return(QuicFrame(&ack_frame_))); |
| 571 | 595 |
| 572 { | 596 { |
| 573 InSequence dummy; | 597 InSequence dummy; |
| 574 // All five frames will be flushed out in a single packet | 598 // All five frames will be flushed out in a single packet |
| 575 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 599 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 576 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 600 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 577 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 601 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 578 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 602 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 579 } | 603 } |
| 580 | 604 |
| 581 // Send enough data to exceed one packet | 605 // Send enough data to exceed one packet |
| 582 size_t data_len = kDefaultMaxPacketSize + 100; | 606 size_t data_len = kDefaultMaxPacketSize + 100; |
| 583 QuicConsumedData consumed = | 607 QuicConsumedData consumed = |
| 584 generator_.ConsumeData(3, CreateData(data_len), 0, FIN, nullptr); | 608 generator_.ConsumeData(3, CreateData(data_len), 0, FIN, nullptr); |
| 585 EXPECT_EQ(data_len, consumed.bytes_consumed); | 609 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 586 EXPECT_TRUE(consumed.fin_consumed); | 610 EXPECT_TRUE(consumed.fin_consumed); |
| 587 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 611 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 588 | 612 |
| 589 generator_.FinishBatchOperations(); | 613 generator_.FinishBatchOperations(); |
| 590 EXPECT_FALSE(generator_.HasQueuedFrames()); | 614 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 615 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 591 | 616 |
| 592 // The first packet should have the queued data and part of the stream data. | 617 // The first packet should have the queued data and part of the stream data. |
| 593 PacketContents contents; | 618 PacketContents contents; |
| 594 contents.num_ack_frames = 1; | 619 contents.num_ack_frames = 1; |
| 595 contents.num_rst_stream_frames = 1; | 620 contents.num_rst_stream_frames = 1; |
| 596 contents.num_stream_frames = 1; | 621 contents.num_stream_frames = 1; |
| 597 CheckPacketContains(contents, 0); | 622 CheckPacketContains(contents, 0); |
| 598 | 623 |
| 599 // The second should have the remainder of the stream data. | 624 // The second should have the remainder of the stream data. |
| 600 PacketContents contents2; | 625 PacketContents contents2; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 627 | 652 |
| 628 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 653 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 629 .Times(3) | 654 .Times(3) |
| 630 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 655 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 631 QuicConsumedData consumed = | 656 QuicConsumedData consumed = |
| 632 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 657 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 633 /*offset=*/2, FIN, nullptr); | 658 /*offset=*/2, FIN, nullptr); |
| 634 EXPECT_EQ(data_len, consumed.bytes_consumed); | 659 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 635 EXPECT_TRUE(consumed.fin_consumed); | 660 EXPECT_TRUE(consumed.fin_consumed); |
| 636 EXPECT_FALSE(generator_.HasQueuedFrames()); | 661 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 662 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 637 | 663 |
| 638 // We expect three packets, and first two of them have to be of packet_len | 664 // We expect three packets, and first two of them have to be of packet_len |
| 639 // size. We check multiple packets (instead of just one) because we want to | 665 // size. We check multiple packets (instead of just one) because we want to |
| 640 // ensure that |max_packet_length_| does not get changed incorrectly by the | 666 // ensure that |max_packet_length_| does not get changed incorrectly by the |
| 641 // generator after first packet is serialized. | 667 // generator after first packet is serialized. |
| 642 ASSERT_EQ(3u, packets_.size()); | 668 ASSERT_EQ(3u, packets_.size()); |
| 643 EXPECT_EQ(packet_len, packets_[0].encrypted_length); | 669 EXPECT_EQ(packet_len, packets_[0].encrypted_length); |
| 644 EXPECT_EQ(packet_len, packets_[1].encrypted_length); | 670 EXPECT_EQ(packet_len, packets_[1].encrypted_length); |
| 645 CheckAllPacketsHaveSingleStreamFrame(); | 671 CheckAllPacketsHaveSingleStreamFrame(); |
| 646 } | 672 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 661 .Times(3) | 687 .Times(3) |
| 662 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 688 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 663 | 689 |
| 664 // Send two packets before packet size change. | 690 // Send two packets before packet size change. |
| 665 QuicConsumedData consumed = | 691 QuicConsumedData consumed = |
| 666 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 692 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 667 /*offset=*/2, NO_FIN, nullptr); | 693 /*offset=*/2, NO_FIN, nullptr); |
| 668 EXPECT_EQ(data_len, consumed.bytes_consumed); | 694 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 669 EXPECT_FALSE(consumed.fin_consumed); | 695 EXPECT_FALSE(consumed.fin_consumed); |
| 670 EXPECT_FALSE(generator_.HasQueuedFrames()); | 696 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 697 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 671 | 698 |
| 672 // Make sure we already have two packets. | 699 // Make sure we already have two packets. |
| 673 ASSERT_EQ(2u, packets_.size()); | 700 ASSERT_EQ(2u, packets_.size()); |
| 674 | 701 |
| 675 // Increase packet size. | 702 // Increase packet size. |
| 676 generator_.SetMaxPacketLength(packet_len); | 703 generator_.SetMaxPacketLength(packet_len); |
| 677 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | 704 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); |
| 678 | 705 |
| 679 // Send a packet after packet size change. | 706 // Send a packet after packet size change. |
| 680 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 707 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 681 2 + data_len, FIN, nullptr); | 708 2 + data_len, FIN, nullptr); |
| 682 EXPECT_EQ(data_len, consumed.bytes_consumed); | 709 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 683 EXPECT_TRUE(consumed.fin_consumed); | 710 EXPECT_TRUE(consumed.fin_consumed); |
| 684 EXPECT_FALSE(generator_.HasQueuedFrames()); | 711 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 712 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 685 | 713 |
| 686 // We expect first data chunk to get fragmented, but the second one to fit | 714 // We expect first data chunk to get fragmented, but the second one to fit |
| 687 // into a single packet. | 715 // into a single packet. |
| 688 ASSERT_EQ(3u, packets_.size()); | 716 ASSERT_EQ(3u, packets_.size()); |
| 689 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 717 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
| 690 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length); | 718 EXPECT_LE(kDefaultMaxPacketSize, packets_[2].encrypted_length); |
| 691 CheckAllPacketsHaveSingleStreamFrame(); | 719 CheckAllPacketsHaveSingleStreamFrame(); |
| 692 } | 720 } |
| 693 | 721 |
| 694 // Test whether SetMaxPacketLength() works correctly when we force the change of | 722 // Test whether SetMaxPacketLength() works correctly when we force the change of |
| 695 // the packet size in the middle of the batched packet. | 723 // the packet size in the middle of the batched packet. |
| 696 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_MidpacketFlush) { | 724 TEST_F(QuicPacketGeneratorTest, SetMaxPacketLength_MidpacketFlush) { |
| 697 delegate_.SetCanWriteAnything(); | 725 delegate_.SetCanWriteAnything(); |
| 698 generator_.StartBatchOperations(); | 726 generator_.StartBatchOperations(); |
| 699 | 727 |
| 700 size_t first_write_len = kDefaultMaxPacketSize / 2; | 728 size_t first_write_len = kDefaultMaxPacketSize / 2; |
| 701 size_t packet_len = kDefaultMaxPacketSize + 100; | 729 size_t packet_len = kDefaultMaxPacketSize + 100; |
| 702 size_t second_write_len = packet_len + 1; | 730 size_t second_write_len = packet_len + 1; |
| 703 ASSERT_LE(packet_len, kMaxPacketSize); | 731 ASSERT_LE(packet_len, kMaxPacketSize); |
| 704 | 732 |
| 705 // First send half of the packet worth of data. We are in the batch mode, so | 733 // First send half of the packet worth of data. We are in the batch mode, so |
| 706 // should not cause packet serialization. | 734 // should not cause packet serialization. |
| 707 QuicConsumedData consumed = | 735 QuicConsumedData consumed = |
| 708 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), | 736 generator_.ConsumeData(kHeadersStreamId, CreateData(first_write_len), |
| 709 /*offset=*/2, NO_FIN, nullptr); | 737 /*offset=*/2, NO_FIN, nullptr); |
| 710 EXPECT_EQ(first_write_len, consumed.bytes_consumed); | 738 EXPECT_EQ(first_write_len, consumed.bytes_consumed); |
| 711 EXPECT_FALSE(consumed.fin_consumed); | 739 EXPECT_FALSE(consumed.fin_consumed); |
| 712 EXPECT_TRUE(generator_.HasQueuedFrames()); | 740 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 741 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 713 | 742 |
| 714 // Make sure we have no packets so far. | 743 // Make sure we have no packets so far. |
| 715 ASSERT_EQ(0u, packets_.size()); | 744 ASSERT_EQ(0u, packets_.size()); |
| 716 | 745 |
| 717 // Expect a packet to be flushed. | 746 // Expect a packet to be flushed. |
| 718 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 747 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 719 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 748 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 720 | 749 |
| 721 // Increase packet size after flushing all frames. | 750 // Increase packet size after flushing all frames. |
| 722 // Ensure it's immediately enacted. | 751 // Ensure it's immediately enacted. |
| 723 generator_.FlushAllQueuedFrames(); | 752 generator_.FlushAllQueuedFrames(); |
| 724 generator_.SetMaxPacketLength(packet_len); | 753 generator_.SetMaxPacketLength(packet_len); |
| 725 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); | 754 EXPECT_EQ(packet_len, generator_.GetCurrentMaxPacketLength()); |
| 726 EXPECT_FALSE(generator_.HasQueuedFrames()); | 755 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 756 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 727 | 757 |
| 728 // We expect to see exactly one packet serialized after that, because we send | 758 // We expect to see exactly one packet serialized after that, because we send |
| 729 // a value somewhat exceeding new max packet size, and the tail data does not | 759 // a value somewhat exceeding new max packet size, and the tail data does not |
| 730 // get serialized because we are still in the batch mode. | 760 // get serialized because we are still in the batch mode. |
| 731 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 761 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 732 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 762 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 733 | 763 |
| 734 // Send a more than a packet worth of data to the same stream. This should | 764 // Send a more than a packet worth of data to the same stream. This should |
| 735 // trigger serialization of one packet, and queue another one. | 765 // trigger serialization of one packet, and queue another one. |
| 736 consumed = | 766 consumed = |
| 737 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), | 767 generator_.ConsumeData(kHeadersStreamId, CreateData(second_write_len), |
| 738 /*offset=*/2 + first_write_len, FIN, nullptr); | 768 /*offset=*/2 + first_write_len, FIN, nullptr); |
| 739 EXPECT_EQ(second_write_len, consumed.bytes_consumed); | 769 EXPECT_EQ(second_write_len, consumed.bytes_consumed); |
| 740 EXPECT_TRUE(consumed.fin_consumed); | 770 EXPECT_TRUE(consumed.fin_consumed); |
| 741 EXPECT_TRUE(generator_.HasQueuedFrames()); | 771 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 772 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 742 | 773 |
| 743 // We expect the first packet to be underfilled, and the second packet be up | 774 // We expect the first packet to be underfilled, and the second packet be up |
| 744 // to the new max packet size. | 775 // to the new max packet size. |
| 745 ASSERT_EQ(2u, packets_.size()); | 776 ASSERT_EQ(2u, packets_.size()); |
| 746 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 777 EXPECT_GT(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
| 747 EXPECT_EQ(packet_len, packets_[1].encrypted_length); | 778 EXPECT_EQ(packet_len, packets_[1].encrypted_length); |
| 748 | 779 |
| 749 CheckAllPacketsHaveSingleStreamFrame(); | 780 CheckAllPacketsHaveSingleStreamFrame(); |
| 750 } | 781 } |
| 751 | 782 |
| 752 // Test sending an MTU probe, without any surrounding data. | 783 // Test sending an MTU probe, without any surrounding data. |
| 753 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_Simple) { | 784 TEST_F(QuicPacketGeneratorTest, GenerateMtuDiscoveryPacket_Simple) { |
| 754 delegate_.SetCanWriteAnything(); | 785 delegate_.SetCanWriteAnything(); |
| 755 | 786 |
| 756 const size_t target_mtu = kDefaultMaxPacketSize + 100; | 787 const size_t target_mtu = kDefaultMaxPacketSize + 100; |
| 757 static_assert(target_mtu < kMaxPacketSize, | 788 static_assert(target_mtu < kMaxPacketSize, |
| 758 "The MTU probe used by the test exceeds maximum packet size"); | 789 "The MTU probe used by the test exceeds maximum packet size"); |
| 759 | 790 |
| 760 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 791 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 761 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 792 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 762 | 793 |
| 763 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); | 794 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); |
| 764 | 795 |
| 765 EXPECT_FALSE(generator_.HasQueuedFrames()); | 796 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 797 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 766 ASSERT_EQ(1u, packets_.size()); | 798 ASSERT_EQ(1u, packets_.size()); |
| 767 EXPECT_EQ(target_mtu, packets_[0].encrypted_length); | 799 EXPECT_EQ(target_mtu, packets_[0].encrypted_length); |
| 768 | 800 |
| 769 PacketContents contents; | 801 PacketContents contents; |
| 770 contents.num_mtu_discovery_frames = 1; | 802 contents.num_mtu_discovery_frames = 1; |
| 771 contents.num_padding_frames = 1; | 803 contents.num_padding_frames = 1; |
| 772 CheckPacketContains(contents, 0); | 804 CheckPacketContains(contents, 0); |
| 773 } | 805 } |
| 774 | 806 |
| 775 // Test sending an MTU probe. Surround it with data, to ensure that it resets | 807 // Test sending an MTU probe. Surround it with data, to ensure that it resets |
| (...skipping 14 matching lines...) Expand all Loading... |
| 790 .Times(5) | 822 .Times(5) |
| 791 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 823 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 792 | 824 |
| 793 // Send data before the MTU probe. | 825 // Send data before the MTU probe. |
| 794 QuicConsumedData consumed = | 826 QuicConsumedData consumed = |
| 795 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 827 generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 796 /*offset=*/2, NO_FIN, nullptr); | 828 /*offset=*/2, NO_FIN, nullptr); |
| 797 EXPECT_EQ(data_len, consumed.bytes_consumed); | 829 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 798 EXPECT_FALSE(consumed.fin_consumed); | 830 EXPECT_FALSE(consumed.fin_consumed); |
| 799 EXPECT_FALSE(generator_.HasQueuedFrames()); | 831 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 832 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 800 | 833 |
| 801 // Send the MTU probe. | 834 // Send the MTU probe. |
| 802 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); | 835 generator_.GenerateMtuDiscoveryPacket(target_mtu, nullptr); |
| 803 EXPECT_FALSE(generator_.HasQueuedFrames()); | 836 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 837 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 804 | 838 |
| 805 // Send data after the MTU probe. | 839 // Send data after the MTU probe. |
| 806 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), | 840 consumed = generator_.ConsumeData(kHeadersStreamId, CreateData(data_len), |
| 807 /*offset=*/2 + data_len, FIN, nullptr); | 841 /*offset=*/2 + data_len, FIN, nullptr); |
| 808 EXPECT_EQ(data_len, consumed.bytes_consumed); | 842 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 809 EXPECT_TRUE(consumed.fin_consumed); | 843 EXPECT_TRUE(consumed.fin_consumed); |
| 810 EXPECT_FALSE(generator_.HasQueuedFrames()); | 844 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 845 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 811 | 846 |
| 812 ASSERT_EQ(5u, packets_.size()); | 847 ASSERT_EQ(5u, packets_.size()); |
| 813 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); | 848 EXPECT_EQ(kDefaultMaxPacketSize, packets_[0].encrypted_length); |
| 814 EXPECT_EQ(target_mtu, packets_[2].encrypted_length); | 849 EXPECT_EQ(target_mtu, packets_[2].encrypted_length); |
| 815 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length); | 850 EXPECT_EQ(kDefaultMaxPacketSize, packets_[3].encrypted_length); |
| 816 | 851 |
| 817 PacketContents probe_contents; | 852 PacketContents probe_contents; |
| 818 probe_contents.num_mtu_discovery_frames = 1; | 853 probe_contents.num_mtu_discovery_frames = 1; |
| 819 probe_contents.num_padding_frames = 1; | 854 probe_contents.num_padding_frames = 1; |
| 820 | 855 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 836 generator_.SetShouldSendAck(true); | 871 generator_.SetShouldSendAck(true); |
| 837 delegate_.SetCanWriteAnything(); | 872 delegate_.SetCanWriteAnything(); |
| 838 generator_.StartBatchOperations(); | 873 generator_.StartBatchOperations(); |
| 839 | 874 |
| 840 // Set up frames to write into the creator when control frames are written. | 875 // Set up frames to write into the creator when control frames are written. |
| 841 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) | 876 EXPECT_CALL(delegate_, GetUpdatedAckFrame()) |
| 842 .WillOnce(Return(QuicFrame(&ack_frame_))); | 877 .WillOnce(Return(QuicFrame(&ack_frame_))); |
| 843 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); | 878 EXPECT_CALL(delegate_, PopulateStopWaitingFrame(_)); |
| 844 // Generator should have queued control frames, and creator should be empty. | 879 // Generator should have queued control frames, and creator should be empty. |
| 845 EXPECT_TRUE(generator_.HasQueuedFrames()); | 880 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 881 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 846 EXPECT_FALSE(creator_->HasPendingFrames()); | 882 EXPECT_FALSE(creator_->HasPendingFrames()); |
| 847 | 883 |
| 848 // This will not serialize any packets, because of the invalid frame. | 884 // This will not serialize any packets, because of the invalid frame. |
| 849 EXPECT_CALL(delegate_, | 885 EXPECT_CALL(delegate_, |
| 850 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, _, | 886 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, _, |
| 851 ConnectionCloseSource::FROM_SELF)); | 887 ConnectionCloseSource::FROM_SELF)); |
| 852 EXPECT_QUIC_BUG(generator_.FinishBatchOperations(), | 888 EXPECT_QUIC_BUG(generator_.FinishBatchOperations(), |
| 853 "packet_number_length 1 is too small " | 889 "packet_number_length 1 is too small " |
| 854 "for least_unacked_delta: 1001"); | 890 "for least_unacked_delta: 1001"); |
| 855 } | 891 } |
| 856 | 892 |
| 857 // Regression test for b/31486443. | 893 // Regression test for b/31486443. |
| 858 TEST_F(QuicPacketGeneratorTest, ConnectionCloseFrameLargerThanPacketSize) { | 894 TEST_F(QuicPacketGeneratorTest, ConnectionCloseFrameLargerThanPacketSize) { |
| 859 delegate_.SetCanWriteAnything(); | 895 delegate_.SetCanWriteAnything(); |
| 860 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(); | 896 QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame(); |
| 861 frame->error_code = QUIC_PACKET_WRITE_ERROR; | 897 frame->error_code = QUIC_PACKET_WRITE_ERROR; |
| 862 char buf[2000] = {}; | 898 char buf[2000] = {}; |
| 863 QuicStringPiece error_details(buf, 2000); | 899 QuicStringPiece error_details(buf, 2000); |
| 864 frame->error_details = error_details.as_string(); | 900 frame->error_details = error_details.as_string(); |
| 865 EXPECT_CALL(delegate_, | 901 EXPECT_CALL(delegate_, |
| 866 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, | 902 OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET, |
| 867 "Single frame cannot fit into a packet", _)); | 903 "Single frame cannot fit into a packet", _)); |
| 868 EXPECT_QUIC_BUG(generator_.AddControlFrame(QuicFrame(frame)), ""); | 904 EXPECT_QUIC_BUG(generator_.AddControlFrame(QuicFrame(frame)), ""); |
| 869 EXPECT_TRUE(generator_.HasQueuedFrames()); | 905 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 906 EXPECT_TRUE(generator_.HasRetransmittableFrames()); |
| 870 } | 907 } |
| 871 | 908 |
| 872 TEST_F(QuicPacketGeneratorTest, RandomPaddingAfterFinSingleStreamSinglePacket) { | 909 TEST_F(QuicPacketGeneratorTest, RandomPaddingAfterFinSingleStreamSinglePacket) { |
| 873 const QuicByteCount kStreamFramePayloadSize = 100u; | 910 const QuicByteCount kStreamFramePayloadSize = 100u; |
| 874 char buf[kStreamFramePayloadSize] = {}; | 911 char buf[kStreamFramePayloadSize] = {}; |
| 875 const QuicStreamId kDataStreamId = 5; | 912 const QuicStreamId kDataStreamId = 5; |
| 876 // Set the packet size be enough for one stream frame with 0 stream offset and | 913 // Set the packet size be enough for one stream frame with 0 stream offset and |
| 877 // max size of random padding. | 914 // max size of random padding. |
| 878 size_t length = NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) + | 915 size_t length = NullEncrypter(Perspective::IS_CLIENT).GetCiphertextSize(0) + |
| 879 GetPacketHeaderSize( | 916 GetPacketHeaderSize( |
| 880 framer_.version(), creator_->connection_id_length(), | 917 framer_.version(), creator_->connection_id_length(), |
| 881 kIncludeVersion, !kIncludeDiversificationNonce, | 918 kIncludeVersion, !kIncludeDiversificationNonce, |
| 882 QuicPacketCreatorPeer::GetPacketNumberLength(creator_)) + | 919 QuicPacketCreatorPeer::GetPacketNumberLength(creator_)) + |
| 883 QuicFramer::GetMinStreamFrameSize( | 920 QuicFramer::GetMinStreamFrameSize( |
| 884 kDataStreamId, 0, /*last_frame_in_packet=*/false) + | 921 kDataStreamId, 0, /*last_frame_in_packet=*/false) + |
| 885 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes; | 922 kStreamFramePayloadSize + kMaxNumRandomPaddingBytes; |
| 886 generator_.SetMaxPacketLength(length); | 923 generator_.SetMaxPacketLength(length); |
| 887 delegate_.SetCanWriteAnything(); | 924 delegate_.SetCanWriteAnything(); |
| 888 generator_.StartBatchOperations(); | 925 generator_.StartBatchOperations(); |
| 889 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 926 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 890 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 927 .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 891 QuicConsumedData consumed = | 928 QuicConsumedData consumed = |
| 892 generator_.ConsumeData(kDataStreamId, | 929 generator_.ConsumeData(kDataStreamId, |
| 893 MakeIOVectorFromStringPiece( | 930 MakeIOVectorFromStringPiece( |
| 894 QuicStringPiece(buf, kStreamFramePayloadSize)), | 931 QuicStringPiece(buf, kStreamFramePayloadSize)), |
| 895 0, FIN_AND_PADDING, nullptr); | 932 0, FIN_AND_PADDING, nullptr); |
| 896 generator_.FinishBatchOperations(); | 933 generator_.FinishBatchOperations(); |
| 897 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); | 934 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); |
| 898 EXPECT_FALSE(generator_.HasQueuedFrames()); | 935 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 936 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 899 | 937 |
| 900 EXPECT_EQ(1u, packets_.size()); | 938 EXPECT_EQ(1u, packets_.size()); |
| 901 PacketContents contents; | 939 PacketContents contents; |
| 902 // The packet has both stream and padding frames. | 940 // The packet has both stream and padding frames. |
| 903 contents.num_padding_frames = 1; | 941 contents.num_padding_frames = 1; |
| 904 contents.num_stream_frames = 1; | 942 contents.num_stream_frames = 1; |
| 905 CheckPacketContains(contents, 0); | 943 CheckPacketContains(contents, 0); |
| 906 } | 944 } |
| 907 | 945 |
| 908 TEST_F(QuicPacketGeneratorTest, | 946 TEST_F(QuicPacketGeneratorTest, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 926 EXPECT_CALL(delegate_, OnSerializedPacket(_)) | 964 EXPECT_CALL(delegate_, OnSerializedPacket(_)) |
| 927 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); | 965 .WillRepeatedly(Invoke(this, &QuicPacketGeneratorTest::SavePacket)); |
| 928 QuicConsumedData consumed = | 966 QuicConsumedData consumed = |
| 929 generator_.ConsumeData(kDataStreamId, | 967 generator_.ConsumeData(kDataStreamId, |
| 930 MakeIOVectorFromStringPiece( | 968 MakeIOVectorFromStringPiece( |
| 931 QuicStringPiece(buf, kStreamFramePayloadSize)), | 969 QuicStringPiece(buf, kStreamFramePayloadSize)), |
| 932 0, FIN_AND_PADDING, nullptr); | 970 0, FIN_AND_PADDING, nullptr); |
| 933 generator_.FinishBatchOperations(); | 971 generator_.FinishBatchOperations(); |
| 934 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); | 972 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); |
| 935 EXPECT_FALSE(generator_.HasQueuedFrames()); | 973 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 974 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 936 | 975 |
| 937 EXPECT_LE(1u, packets_.size()); | 976 EXPECT_LE(1u, packets_.size()); |
| 938 PacketContents contents; | 977 PacketContents contents; |
| 939 // The first packet has both stream and padding frames. | 978 // The first packet has both stream and padding frames. |
| 940 contents.num_stream_frames = 1; | 979 contents.num_stream_frames = 1; |
| 941 contents.num_padding_frames = 1; | 980 contents.num_padding_frames = 1; |
| 942 CheckPacketContains(contents, 0); | 981 CheckPacketContains(contents, 0); |
| 943 | 982 |
| 944 for (size_t i = 1; i < packets_.size(); ++i) { | 983 for (size_t i = 1; i < packets_.size(); ++i) { |
| 945 // Following packets only have paddings. | 984 // Following packets only have paddings. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 979 QuicStringPiece(buf, kStreamFramePayloadSize)), | 1018 QuicStringPiece(buf, kStreamFramePayloadSize)), |
| 980 0, FIN_AND_PADDING, nullptr); | 1019 0, FIN_AND_PADDING, nullptr); |
| 981 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); | 1020 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); |
| 982 consumed = generator_.ConsumeData(kDataStreamId2, | 1021 consumed = generator_.ConsumeData(kDataStreamId2, |
| 983 MakeIOVectorFromStringPiece(QuicStringPiece( | 1022 MakeIOVectorFromStringPiece(QuicStringPiece( |
| 984 buf, kStreamFramePayloadSize)), | 1023 buf, kStreamFramePayloadSize)), |
| 985 0, FIN_AND_PADDING, nullptr); | 1024 0, FIN_AND_PADDING, nullptr); |
| 986 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); | 1025 EXPECT_EQ(kStreamFramePayloadSize, consumed.bytes_consumed); |
| 987 generator_.FinishBatchOperations(); | 1026 generator_.FinishBatchOperations(); |
| 988 EXPECT_FALSE(generator_.HasQueuedFrames()); | 1027 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 1028 EXPECT_FALSE(generator_.HasRetransmittableFrames()); |
| 989 | 1029 |
| 990 EXPECT_LE(2u, packets_.size()); | 1030 EXPECT_LE(2u, packets_.size()); |
| 991 PacketContents contents; | 1031 PacketContents contents; |
| 992 // The first packet has two stream frames. | 1032 // The first packet has two stream frames. |
| 993 contents.num_stream_frames = 2; | 1033 contents.num_stream_frames = 2; |
| 994 CheckPacketContains(contents, 0); | 1034 CheckPacketContains(contents, 0); |
| 995 | 1035 |
| 996 // The second packet has one stream frame and padding frames. | 1036 // The second packet has one stream frame and padding frames. |
| 997 contents.num_stream_frames = 1; | 1037 contents.num_stream_frames = 1; |
| 998 contents.num_padding_frames = 1; | 1038 contents.num_padding_frames = 1; |
| 999 CheckPacketContains(contents, 1); | 1039 CheckPacketContains(contents, 1); |
| 1000 | 1040 |
| 1001 for (size_t i = 2; i < packets_.size(); ++i) { | 1041 for (size_t i = 2; i < packets_.size(); ++i) { |
| 1002 // Following packets only have paddings. | 1042 // Following packets only have paddings. |
| 1003 contents.num_stream_frames = 0; | 1043 contents.num_stream_frames = 0; |
| 1004 contents.num_padding_frames = 1; | 1044 contents.num_padding_frames = 1; |
| 1005 CheckPacketContains(contents, i); | 1045 CheckPacketContains(contents, i); |
| 1006 } | 1046 } |
| 1007 } | 1047 } |
| 1008 | 1048 |
| 1009 } // namespace test | 1049 } // namespace test |
| 1010 } // namespace net | 1050 } // namespace net |
| OLD | NEW |