| 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_packet_generator.h" | 5 #include "net/quic/quic_packet_generator.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "net/quic/crypto/crypto_protocol.h" | 9 #include "net/quic/crypto/crypto_protocol.h" |
| 10 #include "net/quic/crypto/null_encrypter.h" | 10 #include "net/quic/crypto/null_encrypter.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 MockDelegate() {} | 35 MockDelegate() {} |
| 36 virtual ~MockDelegate() OVERRIDE {} | 36 virtual ~MockDelegate() OVERRIDE {} |
| 37 | 37 |
| 38 MOCK_METHOD3(ShouldGeneratePacket, | 38 MOCK_METHOD3(ShouldGeneratePacket, |
| 39 bool(TransmissionType transmission_type, | 39 bool(TransmissionType transmission_type, |
| 40 HasRetransmittableData retransmittable, | 40 HasRetransmittableData retransmittable, |
| 41 IsHandshake handshake)); | 41 IsHandshake handshake)); |
| 42 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); | 42 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); |
| 43 MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*()); | 43 MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*()); |
| 44 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); | 44 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); |
| 45 MOCK_METHOD1(OnSerializedPacket, bool(const SerializedPacket& packet)); | 45 MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet)); |
| 46 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); | 46 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); |
| 47 | 47 |
| 48 void SetCanWriteAnything() { | 48 void SetCanWriteAnything() { |
| 49 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) | 49 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) |
| 50 .WillRepeatedly(Return(true)); | 50 .WillRepeatedly(Return(true)); |
| 51 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, | 51 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, |
| 52 NO_RETRANSMITTABLE_DATA, _)) | 52 NO_RETRANSMITTABLE_DATA, _)) |
| 53 .WillRepeatedly(Return(true)); | 53 .WillRepeatedly(Return(true)); |
| 54 } | 54 } |
| 55 | 55 |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); | 264 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); |
| 265 | 265 |
| 266 generator_.SetShouldSendAck(false, false); | 266 generator_.SetShouldSendAck(false, false); |
| 267 EXPECT_TRUE(generator_.HasQueuedFrames()); | 267 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 268 } | 268 } |
| 269 | 269 |
| 270 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { | 270 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { |
| 271 delegate_.SetCanWriteOnlyNonRetransmittable(); | 271 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 272 | 272 |
| 273 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 273 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 274 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 274 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 275 DoAll(SaveArg<0>(&packet_), Return(true))); | |
| 276 | 275 |
| 277 generator_.SetShouldSendAck(false, false); | 276 generator_.SetShouldSendAck(false, false); |
| 278 EXPECT_FALSE(generator_.HasQueuedFrames()); | 277 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 279 | 278 |
| 280 PacketContents contents; | 279 PacketContents contents; |
| 281 contents.num_ack_frames = 1; | 280 contents.num_ack_frames = 1; |
| 282 CheckPacketContains(contents, packet_); | 281 CheckPacketContains(contents, packet_); |
| 283 } | 282 } |
| 284 | 283 |
| 285 TEST_F(QuicPacketGeneratorTest, | 284 TEST_F(QuicPacketGeneratorTest, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 298 TEST_F(QuicPacketGeneratorTest, | 297 TEST_F(QuicPacketGeneratorTest, |
| 299 ShouldSendAckWithFeedback_WritableAndShouldFlush) { | 298 ShouldSendAckWithFeedback_WritableAndShouldFlush) { |
| 300 delegate_.SetCanWriteOnlyNonRetransmittable(); | 299 delegate_.SetCanWriteOnlyNonRetransmittable(); |
| 301 | 300 |
| 302 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 301 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 303 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 302 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
| 304 Return(CreateFeedbackFrame())); | 303 Return(CreateFeedbackFrame())); |
| 305 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( | 304 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( |
| 306 Return(CreateStopWaitingFrame())); | 305 Return(CreateStopWaitingFrame())); |
| 307 | 306 |
| 308 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 307 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 309 DoAll(SaveArg<0>(&packet_), Return(true))); | |
| 310 | 308 |
| 311 generator_.SetShouldSendAck(true, true); | 309 generator_.SetShouldSendAck(true, true); |
| 312 EXPECT_FALSE(generator_.HasQueuedFrames()); | 310 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 313 | 311 |
| 314 PacketContents contents; | 312 PacketContents contents; |
| 315 contents.num_ack_frames = 1; | 313 contents.num_ack_frames = 1; |
| 316 contents.num_feedback_frames = 1; | 314 contents.num_feedback_frames = 1; |
| 317 contents.num_stop_waiting_frames = 1; | 315 contents.num_stop_waiting_frames = 1; |
| 318 CheckPacketContains(contents, packet_); | 316 CheckPacketContains(contents, packet_); |
| 319 } | 317 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 342 | 340 |
| 343 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { | 341 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritableBatchThenFlush) { |
| 344 delegate_.SetCanNotWrite(); | 342 delegate_.SetCanNotWrite(); |
| 345 generator_.StartBatchOperations(); | 343 generator_.StartBatchOperations(); |
| 346 | 344 |
| 347 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 345 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 348 EXPECT_TRUE(generator_.HasQueuedFrames()); | 346 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 349 generator_.FinishBatchOperations(); | 347 generator_.FinishBatchOperations(); |
| 350 EXPECT_TRUE(generator_.HasQueuedFrames()); | 348 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 351 | 349 |
| 352 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 350 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 353 DoAll(SaveArg<0>(&packet_), Return(true))); | |
| 354 generator_.FlushAllQueuedFrames(); | 351 generator_.FlushAllQueuedFrames(); |
| 355 EXPECT_FALSE(generator_.HasQueuedFrames()); | 352 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 356 | 353 |
| 357 PacketContents contents; | 354 PacketContents contents; |
| 358 contents.num_rst_stream_frames = 1; | 355 contents.num_rst_stream_frames = 1; |
| 359 CheckPacketContains(contents, packet_); | 356 CheckPacketContains(contents, packet_); |
| 360 } | 357 } |
| 361 | 358 |
| 362 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { | 359 TEST_F(QuicPacketGeneratorTest, AddControlFrame_WritableAndShouldFlush) { |
| 363 delegate_.SetCanWriteAnything(); | 360 delegate_.SetCanWriteAnything(); |
| 364 | 361 |
| 365 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 362 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 366 DoAll(SaveArg<0>(&packet_), Return(true))); | |
| 367 | 363 |
| 368 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 364 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
| 369 EXPECT_FALSE(generator_.HasQueuedFrames()); | 365 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 370 | 366 |
| 371 PacketContents contents; | 367 PacketContents contents; |
| 372 contents.num_rst_stream_frames = 1; | 368 contents.num_rst_stream_frames = 1; |
| 373 CheckPacketContains(contents, packet_); | 369 CheckPacketContains(contents, packet_); |
| 374 } | 370 } |
| 375 | 371 |
| 376 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { | 372 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 390 QuicConsumedData consumed = generator_.ConsumeData( | 386 QuicConsumedData consumed = generator_.ConsumeData( |
| 391 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); | 387 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); |
| 392 EXPECT_EQ(3u, consumed.bytes_consumed); | 388 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 393 EXPECT_TRUE(consumed.fin_consumed); | 389 EXPECT_TRUE(consumed.fin_consumed); |
| 394 EXPECT_TRUE(generator_.HasQueuedFrames()); | 390 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 395 } | 391 } |
| 396 | 392 |
| 397 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { | 393 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { |
| 398 delegate_.SetCanWriteAnything(); | 394 delegate_.SetCanWriteAnything(); |
| 399 | 395 |
| 400 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 396 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 401 DoAll(SaveArg<0>(&packet_), Return(true))); | |
| 402 QuicConsumedData consumed = generator_.ConsumeData( | 397 QuicConsumedData consumed = generator_.ConsumeData( |
| 403 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); | 398 kHeadersStreamId, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); |
| 404 EXPECT_EQ(3u, consumed.bytes_consumed); | 399 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 405 EXPECT_TRUE(consumed.fin_consumed); | 400 EXPECT_TRUE(consumed.fin_consumed); |
| 406 EXPECT_FALSE(generator_.HasQueuedFrames()); | 401 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 407 | 402 |
| 408 PacketContents contents; | 403 PacketContents contents; |
| 409 contents.num_stream_frames = 1; | 404 contents.num_stream_frames = 1; |
| 410 CheckPacketContains(contents, packet_); | 405 CheckPacketContains(contents, packet_); |
| 411 } | 406 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 430 | 425 |
| 431 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, | 426 generator_.ConsumeData(kHeadersStreamId, MakeIOVector("foo"), 2, true, |
| 432 MAY_FEC_PROTECT, NULL); | 427 MAY_FEC_PROTECT, NULL); |
| 433 QuicConsumedData consumed = generator_.ConsumeData( | 428 QuicConsumedData consumed = generator_.ConsumeData( |
| 434 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL); | 429 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL); |
| 435 EXPECT_EQ(4u, consumed.bytes_consumed); | 430 EXPECT_EQ(4u, consumed.bytes_consumed); |
| 436 EXPECT_FALSE(consumed.fin_consumed); | 431 EXPECT_FALSE(consumed.fin_consumed); |
| 437 EXPECT_TRUE(generator_.HasQueuedFrames()); | 432 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 438 | 433 |
| 439 // Now both frames will be flushed out. | 434 // Now both frames will be flushed out. |
| 440 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 435 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 441 DoAll(SaveArg<0>(&packet_), Return(true))); | |
| 442 generator_.FinishBatchOperations(); | 436 generator_.FinishBatchOperations(); |
| 443 EXPECT_FALSE(generator_.HasQueuedFrames()); | 437 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 444 | 438 |
| 445 PacketContents contents; | 439 PacketContents contents; |
| 446 contents.num_stream_frames = 2; | 440 contents.num_stream_frames = 2; |
| 447 CheckPacketContains(contents, packet_); | 441 CheckPacketContains(contents, packet_); |
| 448 } | 442 } |
| 449 | 443 |
| 450 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { | 444 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { |
| 451 delegate_.SetCanWriteAnything(); | 445 delegate_.SetCanWriteAnything(); |
| 452 | 446 |
| 453 // Send FEC every two packets. | 447 // Send FEC every two packets. |
| 454 creator_->set_max_packets_per_fec_group(2); | 448 creator_->set_max_packets_per_fec_group(2); |
| 455 | 449 |
| 456 { | 450 { |
| 457 InSequence dummy; | 451 InSequence dummy; |
| 458 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 452 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 459 DoAll(SaveArg<0>(&packet_), Return(true))); | 453 SaveArg<0>(&packet_)); |
| 460 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 454 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 461 DoAll(SaveArg<0>(&packet2_), Return(true))); | 455 SaveArg<0>(&packet2_)); |
| 462 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 456 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 463 DoAll(SaveArg<0>(&packet3_), Return(true))); | 457 SaveArg<0>(&packet3_)); |
| 464 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 458 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 465 DoAll(SaveArg<0>(&packet4_), Return(true))); | 459 SaveArg<0>(&packet4_)); |
| 466 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 460 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 467 DoAll(SaveArg<0>(&packet5_), Return(true))); | 461 SaveArg<0>(&packet5_)); |
| 468 } | 462 } |
| 469 | 463 |
| 470 // Send enough data to create 3 packets: two full and one partial. Send | 464 // Send enough data to create 3 packets: two full and one partial. Send |
| 471 // with MUST_FEC_PROTECT flag. | 465 // with MUST_FEC_PROTECT flag. |
| 472 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | 466 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
| 473 QuicConsumedData consumed = | 467 QuicConsumedData consumed = |
| 474 generator_.ConsumeData(3, CreateData(data_len), 0, true, | 468 generator_.ConsumeData(3, CreateData(data_len), 0, true, |
| 475 MUST_FEC_PROTECT, NULL); | 469 MUST_FEC_PROTECT, NULL); |
| 476 EXPECT_EQ(data_len, consumed.bytes_consumed); | 470 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 477 EXPECT_TRUE(consumed.fin_consumed); | 471 EXPECT_TRUE(consumed.fin_consumed); |
| 478 EXPECT_FALSE(generator_.HasQueuedFrames()); | 472 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 479 | 473 |
| 480 CheckPacketHasSingleStreamFrame(packet_); | 474 CheckPacketHasSingleStreamFrame(packet_); |
| 481 CheckPacketHasSingleStreamFrame(packet2_); | 475 CheckPacketHasSingleStreamFrame(packet2_); |
| 482 CheckPacketIsFec(packet3_, 1); | 476 CheckPacketIsFec(packet3_, 1); |
| 483 | 477 |
| 484 CheckPacketHasSingleStreamFrame(packet4_); | 478 CheckPacketHasSingleStreamFrame(packet4_); |
| 485 CheckPacketIsFec(packet5_, 4); | 479 CheckPacketIsFec(packet5_, 4); |
| 486 } | 480 } |
| 487 | 481 |
| 488 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { | 482 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { |
| 489 delegate_.SetCanWriteAnything(); | 483 delegate_.SetCanWriteAnything(); |
| 490 | 484 |
| 491 // Enable FEC. | 485 // Enable FEC. |
| 492 creator_->set_max_packets_per_fec_group(6); | 486 creator_->set_max_packets_per_fec_group(6); |
| 493 { | 487 { |
| 494 InSequence dummy; | 488 InSequence dummy; |
| 495 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 489 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 496 DoAll(SaveArg<0>(&packet_), Return(true))); | 490 SaveArg<0>(&packet_)); |
| 497 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 491 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 498 DoAll(SaveArg<0>(&packet2_), Return(true))); | 492 SaveArg<0>(&packet2_)); |
| 499 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 493 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 500 DoAll(SaveArg<0>(&packet3_), Return(true))); | 494 SaveArg<0>(&packet3_)); |
| 501 } | 495 } |
| 502 | 496 |
| 503 // Send enough data to create 2 packets: one full and one partial. Send | 497 // Send enough data to create 2 packets: one full and one partial. Send |
| 504 // with MUST_FEC_PROTECT flag. | 498 // with MUST_FEC_PROTECT flag. |
| 505 size_t data_len = 1 * kDefaultMaxPacketSize + 100; | 499 size_t data_len = 1 * kDefaultMaxPacketSize + 100; |
| 506 QuicConsumedData consumed = | 500 QuicConsumedData consumed = |
| 507 generator_.ConsumeData(3, CreateData(data_len), 0, true, | 501 generator_.ConsumeData(3, CreateData(data_len), 0, true, |
| 508 MUST_FEC_PROTECT, NULL); | 502 MUST_FEC_PROTECT, NULL); |
| 509 EXPECT_EQ(data_len, consumed.bytes_consumed); | 503 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 510 EXPECT_TRUE(consumed.fin_consumed); | 504 EXPECT_TRUE(consumed.fin_consumed); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 526 NOT_IN_FEC_GROUP) + | 520 NOT_IN_FEC_GROUP) + |
| 527 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger | 521 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger |
| 528 // than the GetMinStreamFrameSize. | 522 // than the GetMinStreamFrameSize. |
| 529 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + | 523 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + |
| 530 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; | 524 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; |
| 531 creator_->set_max_packet_length(length); | 525 creator_->set_max_packet_length(length); |
| 532 delegate_.SetCanWriteAnything(); | 526 delegate_.SetCanWriteAnything(); |
| 533 { | 527 { |
| 534 InSequence dummy; | 528 InSequence dummy; |
| 535 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 529 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 536 DoAll(SaveArg<0>(&packet_), Return(true))); | 530 SaveArg<0>(&packet_)); |
| 537 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 531 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 538 DoAll(SaveArg<0>(&packet2_), Return(true))); | 532 SaveArg<0>(&packet2_)); |
| 539 } | 533 } |
| 540 generator_.StartBatchOperations(); | 534 generator_.StartBatchOperations(); |
| 541 // Queue enough data to prevent a stream frame with a non-zero offset from | 535 // Queue enough data to prevent a stream frame with a non-zero offset from |
| 542 // fitting. | 536 // fitting. |
| 543 QuicConsumedData consumed = generator_.ConsumeData( | 537 QuicConsumedData consumed = generator_.ConsumeData( |
| 544 kHeadersStreamId, MakeIOVector("foo"), 0, false, MAY_FEC_PROTECT, NULL); | 538 kHeadersStreamId, MakeIOVector("foo"), 0, false, MAY_FEC_PROTECT, NULL); |
| 545 EXPECT_EQ(3u, consumed.bytes_consumed); | 539 EXPECT_EQ(3u, consumed.bytes_consumed); |
| 546 EXPECT_FALSE(consumed.fin_consumed); | 540 EXPECT_FALSE(consumed.fin_consumed); |
| 547 EXPECT_TRUE(generator_.HasQueuedFrames()); | 541 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 548 | 542 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 generator_.StartBatchOperations(); | 581 generator_.StartBatchOperations(); |
| 588 creator_->set_max_packets_per_fec_group(50); | 582 creator_->set_max_packets_per_fec_group(50); |
| 589 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); | 583 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); |
| 590 EXPECT_FALSE(creator_->IsFecGroupOpen()); | 584 EXPECT_FALSE(creator_->IsFecGroupOpen()); |
| 591 | 585 |
| 592 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. | 586 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. |
| 593 // 3 packets are sent, one is queued in the creator. | 587 // 3 packets are sent, one is queued in the creator. |
| 594 { | 588 { |
| 595 InSequence dummy; | 589 InSequence dummy; |
| 596 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 590 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 597 DoAll(SaveArg<0>(&packet_), Return(true))); | 591 SaveArg<0>(&packet_)); |
| 598 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 592 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 599 DoAll(SaveArg<0>(&packet2_), Return(true))); | 593 SaveArg<0>(&packet2_)); |
| 600 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 594 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 601 DoAll(SaveArg<0>(&packet3_), Return(true))); | 595 SaveArg<0>(&packet3_)); |
| 602 } | 596 } |
| 603 size_t data_len = 3 * kDefaultMaxPacketSize + 1; | 597 size_t data_len = 3 * kDefaultMaxPacketSize + 1; |
| 604 QuicConsumedData consumed = generator_.ConsumeData( | 598 QuicConsumedData consumed = generator_.ConsumeData( |
| 605 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL); | 599 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL); |
| 606 EXPECT_EQ(data_len, consumed.bytes_consumed); | 600 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 607 EXPECT_TRUE(creator_->IsFecGroupOpen()); | 601 EXPECT_TRUE(creator_->IsFecGroupOpen()); |
| 608 | 602 |
| 609 // Change FEC groupsize. | 603 // Change FEC groupsize. |
| 610 generator_.OnCongestionWindowChange(2 * kDefaultTCPMSS); | 604 generator_.OnCongestionWindowChange(2 * kDefaultTCPMSS); |
| 611 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); | 605 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); |
| 612 | 606 |
| 613 // Send enough data to trigger one unprotected data packet, | 607 // Send enough data to trigger one unprotected data packet, |
| 614 // causing the FEC packet to also be sent. | 608 // causing the FEC packet to also be sent. |
| 615 { | 609 { |
| 616 InSequence dummy; | 610 InSequence dummy; |
| 617 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 611 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 618 DoAll(SaveArg<0>(&packet4_), Return(true))); | 612 SaveArg<0>(&packet4_)); |
| 619 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 613 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 620 DoAll(SaveArg<0>(&packet5_), Return(true))); | 614 SaveArg<0>(&packet5_)); |
| 621 } | 615 } |
| 622 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, | 616 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, |
| 623 true, MAY_FEC_PROTECT, NULL); | 617 true, MAY_FEC_PROTECT, NULL); |
| 624 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); | 618 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); |
| 625 // Verify that one FEC packet was sent. | 619 // Verify that one FEC packet was sent. |
| 626 CheckPacketIsFec(packet5_, /*fec_group=*/1u); | 620 CheckPacketIsFec(packet5_, /*fec_group=*/1u); |
| 627 EXPECT_FALSE(creator_->IsFecGroupOpen()); | 621 EXPECT_FALSE(creator_->IsFecGroupOpen()); |
| 628 EXPECT_FALSE(creator_->IsFecProtected()); | 622 EXPECT_FALSE(creator_->IsFecProtected()); |
| 629 } | 623 } |
| 630 | 624 |
| 631 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) { | 625 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) { |
| 632 delegate_.SetCanWriteAnything(); | 626 delegate_.SetCanWriteAnything(); |
| 633 creator_->set_max_packets_per_fec_group(2); | 627 creator_->set_max_packets_per_fec_group(2); |
| 634 EXPECT_FALSE(creator_->IsFecProtected()); | 628 EXPECT_FALSE(creator_->IsFecProtected()); |
| 635 | 629 |
| 636 // Send one unprotected data packet. | 630 // Send one unprotected data packet. |
| 637 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 631 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 638 DoAll(SaveArg<0>(&packet_), Return(true))); | 632 SaveArg<0>(&packet_)); |
| 639 QuicConsumedData consumed = | 633 QuicConsumedData consumed = |
| 640 generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, | 634 generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
| 641 NULL); | 635 NULL); |
| 642 EXPECT_EQ(1u, consumed.bytes_consumed); | 636 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 643 EXPECT_FALSE(generator_.HasQueuedFrames()); | 637 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 644 EXPECT_FALSE(creator_->IsFecProtected()); | 638 EXPECT_FALSE(creator_->IsFecProtected()); |
| 645 // Verify that one data packet was sent. | 639 // Verify that one data packet was sent. |
| 646 PacketContents contents; | 640 PacketContents contents; |
| 647 contents.num_stream_frames = 1; | 641 contents.num_stream_frames = 1; |
| 648 CheckPacketContains(contents, packet_); | 642 CheckPacketContains(contents, packet_); |
| 649 | 643 |
| 650 { | 644 { |
| 651 InSequence dummy; | 645 InSequence dummy; |
| 652 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 646 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 653 DoAll(SaveArg<0>(&packet2_), Return(true))); | 647 SaveArg<0>(&packet2_)); |
| 654 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 648 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 655 DoAll(SaveArg<0>(&packet3_), Return(true))); | 649 SaveArg<0>(&packet3_)); |
| 656 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 650 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 657 DoAll(SaveArg<0>(&packet4_), Return(true))); | 651 SaveArg<0>(&packet4_)); |
| 658 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 652 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 659 DoAll(SaveArg<0>(&packet5_), Return(true))); | 653 SaveArg<0>(&packet5_)); |
| 660 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 654 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 661 DoAll(SaveArg<0>(&packet6_), Return(true))); | 655 SaveArg<0>(&packet6_)); |
| 662 } | 656 } |
| 663 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. | 657 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. |
| 664 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | 658 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
| 665 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, | 659 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, |
| 666 MUST_FEC_PROTECT, NULL); | 660 MUST_FEC_PROTECT, NULL); |
| 667 EXPECT_EQ(data_len, consumed.bytes_consumed); | 661 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 668 EXPECT_FALSE(generator_.HasQueuedFrames()); | 662 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 669 | 663 |
| 670 // Verify that two FEC packets were sent. | 664 // Verify that two FEC packets were sent. |
| 671 CheckPacketHasSingleStreamFrame(packet2_); | 665 CheckPacketHasSingleStreamFrame(packet2_); |
| 672 CheckPacketHasSingleStreamFrame(packet3_); | 666 CheckPacketHasSingleStreamFrame(packet3_); |
| 673 CheckPacketIsFec(packet4_, /*fec_group=*/2u); | 667 CheckPacketIsFec(packet4_, /*fec_group=*/2u); |
| 674 CheckPacketHasSingleStreamFrame(packet5_); | 668 CheckPacketHasSingleStreamFrame(packet5_); |
| 675 CheckPacketIsFec(packet6_, /*fec_group=*/5u); // Sent at the end of stream. | 669 CheckPacketIsFec(packet6_, /*fec_group=*/5u); // Sent at the end of stream. |
| 676 | 670 |
| 677 // Send one unprotected data packet. | 671 // Send one unprotected data packet. |
| 678 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 672 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 679 DoAll(SaveArg<0>(&packet7_), Return(true))); | 673 SaveArg<0>(&packet7_)); |
| 680 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | 674 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
| 681 MAY_FEC_PROTECT, NULL); | 675 MAY_FEC_PROTECT, NULL); |
| 682 EXPECT_EQ(1u, consumed.bytes_consumed); | 676 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 683 EXPECT_FALSE(generator_.HasQueuedFrames()); | 677 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 684 EXPECT_FALSE(creator_->IsFecProtected()); | 678 EXPECT_FALSE(creator_->IsFecProtected()); |
| 685 // Verify that one unprotected data packet was sent. | 679 // Verify that one unprotected data packet was sent. |
| 686 CheckPacketContains(contents, packet7_); | 680 CheckPacketContains(contents, packet7_); |
| 687 } | 681 } |
| 688 | 682 |
| 689 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) { | 683 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) { |
| 690 delegate_.SetCanWriteAnything(); | 684 delegate_.SetCanWriteAnything(); |
| 691 // Enable FEC. | 685 // Enable FEC. |
| 692 creator_->set_max_packets_per_fec_group(2); | 686 creator_->set_max_packets_per_fec_group(2); |
| 693 | 687 |
| 694 generator_.StartBatchOperations(); | 688 generator_.StartBatchOperations(); |
| 695 // Queue enough data to prevent a stream frame with a non-zero offset from | 689 // Queue enough data to prevent a stream frame with a non-zero offset from |
| 696 // fitting. | 690 // fitting. |
| 697 QuicConsumedData consumed = generator_.ConsumeData( | 691 QuicConsumedData consumed = generator_.ConsumeData( |
| 698 7, CreateData(1u), 0, true, MAY_FEC_PROTECT, NULL); | 692 7, CreateData(1u), 0, true, MAY_FEC_PROTECT, NULL); |
| 699 EXPECT_EQ(1u, consumed.bytes_consumed); | 693 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 700 EXPECT_TRUE(creator_->HasPendingFrames()); | 694 EXPECT_TRUE(creator_->HasPendingFrames()); |
| 701 | 695 |
| 702 // Queue protected data for sending. Should cause queued frames to be flushed. | 696 // Queue protected data for sending. Should cause queued frames to be flushed. |
| 703 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 697 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 704 DoAll(SaveArg<0>(&packet_), Return(true))); | 698 SaveArg<0>(&packet_)); |
| 705 EXPECT_FALSE(creator_->IsFecProtected()); | 699 EXPECT_FALSE(creator_->IsFecProtected()); |
| 706 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | 700 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
| 707 MUST_FEC_PROTECT, NULL); | 701 MUST_FEC_PROTECT, NULL); |
| 708 EXPECT_EQ(1u, consumed.bytes_consumed); | 702 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 709 PacketContents contents; | 703 PacketContents contents; |
| 710 contents.num_stream_frames = 1; | 704 contents.num_stream_frames = 1; |
| 711 // Transmitted packet was not FEC protected. | 705 // Transmitted packet was not FEC protected. |
| 712 CheckPacketContains(contents, packet_); | 706 CheckPacketContains(contents, packet_); |
| 713 EXPECT_TRUE(creator_->IsFecProtected()); | 707 EXPECT_TRUE(creator_->IsFecProtected()); |
| 714 EXPECT_TRUE(creator_->HasPendingFrames()); | 708 EXPECT_TRUE(creator_->HasPendingFrames()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 731 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( | 725 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( |
| 732 Return(CreateStopWaitingFrame())); | 726 Return(CreateStopWaitingFrame())); |
| 733 | 727 |
| 734 // Generator should have queued control frames, and creator should be empty. | 728 // Generator should have queued control frames, and creator should be empty. |
| 735 EXPECT_TRUE(generator_.HasQueuedFrames()); | 729 EXPECT_TRUE(generator_.HasQueuedFrames()); |
| 736 EXPECT_FALSE(creator_->HasPendingFrames()); | 730 EXPECT_FALSE(creator_->HasPendingFrames()); |
| 737 EXPECT_FALSE(creator_->IsFecProtected()); | 731 EXPECT_FALSE(creator_->IsFecProtected()); |
| 738 | 732 |
| 739 // Queue protected data for sending. Should cause queued frames to be flushed. | 733 // Queue protected data for sending. Should cause queued frames to be flushed. |
| 740 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 734 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 741 DoAll(SaveArg<0>(&packet_), Return(true))); | 735 SaveArg<0>(&packet_)); |
| 742 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, | 736 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
| 743 MUST_FEC_PROTECT, NULL); | 737 MUST_FEC_PROTECT, NULL); |
| 744 EXPECT_EQ(1u, consumed.bytes_consumed); | 738 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 745 PacketContents contents; | 739 PacketContents contents; |
| 746 contents.num_ack_frames = 1; | 740 contents.num_ack_frames = 1; |
| 747 contents.num_feedback_frames = 1; | 741 contents.num_feedback_frames = 1; |
| 748 contents.num_stop_waiting_frames = 1; | 742 contents.num_stop_waiting_frames = 1; |
| 749 CheckPacketContains(contents, packet_); | 743 CheckPacketContains(contents, packet_); |
| 750 | 744 |
| 751 // FEC protection should be on in creator. | 745 // FEC protection should be on in creator. |
| (...skipping 11 matching lines...) Expand all Loading... |
| 763 generator_.StartBatchOperations(); | 757 generator_.StartBatchOperations(); |
| 764 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | 758 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
| 765 MUST_FEC_PROTECT, NULL); | 759 MUST_FEC_PROTECT, NULL); |
| 766 EXPECT_EQ(1u, consumed.bytes_consumed); | 760 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 767 // Creator has a pending protected frame. | 761 // Creator has a pending protected frame. |
| 768 EXPECT_TRUE(creator_->HasPendingFrames()); | 762 EXPECT_TRUE(creator_->HasPendingFrames()); |
| 769 EXPECT_TRUE(creator_->IsFecProtected()); | 763 EXPECT_TRUE(creator_->IsFecProtected()); |
| 770 | 764 |
| 771 // Add enough unprotected data to exceed size of current packet, so that | 765 // Add enough unprotected data to exceed size of current packet, so that |
| 772 // current packet is sent. Both frames will be sent out in a single packet. | 766 // current packet is sent. Both frames will be sent out in a single packet. |
| 773 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 767 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 774 DoAll(SaveArg<0>(&packet_), Return(true))); | |
| 775 size_t data_len = kDefaultMaxPacketSize; | 768 size_t data_len = kDefaultMaxPacketSize; |
| 776 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 769 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
| 777 MAY_FEC_PROTECT, NULL); | 770 MAY_FEC_PROTECT, NULL); |
| 778 EXPECT_EQ(data_len, consumed.bytes_consumed); | 771 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 779 PacketContents contents; | 772 PacketContents contents; |
| 780 contents.num_stream_frames = 2u; | 773 contents.num_stream_frames = 2u; |
| 781 contents.fec_group = 1u; | 774 contents.fec_group = 1u; |
| 782 CheckPacketContains(contents, packet_); | 775 CheckPacketContains(contents, packet_); |
| 783 // FEC protection should still be on in creator. | 776 // FEC protection should still be on in creator. |
| 784 EXPECT_TRUE(creator_->IsFecProtected()); | 777 EXPECT_TRUE(creator_->IsFecProtected()); |
| 785 } | 778 } |
| 786 | 779 |
| 787 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { | 780 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { |
| 788 delegate_.SetCanWriteAnything(); | 781 delegate_.SetCanWriteAnything(); |
| 789 | 782 |
| 790 // Enable FEC. | 783 // Enable FEC. |
| 791 creator_->set_max_packets_per_fec_group(2); | 784 creator_->set_max_packets_per_fec_group(2); |
| 792 EXPECT_FALSE(creator_->IsFecProtected()); | 785 EXPECT_FALSE(creator_->IsFecProtected()); |
| 793 | 786 |
| 794 generator_.StartBatchOperations(); | 787 generator_.StartBatchOperations(); |
| 795 // Send first packet, FEC protected. | 788 // Send first packet, FEC protected. |
| 796 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 789 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 797 DoAll(SaveArg<0>(&packet_), Return(true))); | |
| 798 // Write enough data to cause a packet to be emitted. | 790 // Write enough data to cause a packet to be emitted. |
| 799 size_t data_len = kDefaultMaxPacketSize; | 791 size_t data_len = kDefaultMaxPacketSize; |
| 800 QuicConsumedData consumed = generator_.ConsumeData( | 792 QuicConsumedData consumed = generator_.ConsumeData( |
| 801 5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL); | 793 5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL); |
| 802 EXPECT_EQ(data_len, consumed.bytes_consumed); | 794 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 803 PacketContents contents; | 795 PacketContents contents; |
| 804 contents.num_stream_frames = 1u; | 796 contents.num_stream_frames = 1u; |
| 805 contents.fec_group = 1u; | 797 contents.fec_group = 1u; |
| 806 CheckPacketContains(contents, packet_); | 798 CheckPacketContains(contents, packet_); |
| 807 | 799 |
| 808 // FEC should still be on in creator. | 800 // FEC should still be on in creator. |
| 809 EXPECT_TRUE(creator_->IsFecProtected()); | 801 EXPECT_TRUE(creator_->IsFecProtected()); |
| 810 | 802 |
| 811 // Send enough unprotected data to cause second packet to be sent, which gets | 803 // Send enough unprotected data to cause second packet to be sent, which gets |
| 812 // protected because it happens to fall within an open FEC group. Data packet | 804 // protected because it happens to fall within an open FEC group. Data packet |
| 813 // will be followed by FEC packet. | 805 // will be followed by FEC packet. |
| 814 { | 806 { |
| 815 InSequence dummy; | 807 InSequence dummy; |
| 816 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 808 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 817 DoAll(SaveArg<0>(&packet2_), Return(true))); | 809 SaveArg<0>(&packet2_)); |
| 818 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 810 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 819 DoAll(SaveArg<0>(&packet3_), Return(true))); | 811 SaveArg<0>(&packet3_)); |
| 820 } | 812 } |
| 821 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 813 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
| 822 MAY_FEC_PROTECT, NULL); | 814 MAY_FEC_PROTECT, NULL); |
| 823 EXPECT_EQ(data_len, consumed.bytes_consumed); | 815 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 824 contents.num_stream_frames = 2u; | 816 contents.num_stream_frames = 2u; |
| 825 CheckPacketContains(contents, packet2_); | 817 CheckPacketContains(contents, packet2_); |
| 826 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | 818 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
| 827 | 819 |
| 828 // FEC protection should be off in creator. | 820 // FEC protection should be off in creator. |
| 829 EXPECT_FALSE(creator_->IsFecProtected()); | 821 EXPECT_FALSE(creator_->IsFecProtected()); |
| 830 } | 822 } |
| 831 | 823 |
| 832 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { | 824 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { |
| 833 delegate_.SetCanWriteAnything(); | 825 delegate_.SetCanWriteAnything(); |
| 834 generator_.StartBatchOperations(); | 826 generator_.StartBatchOperations(); |
| 835 | 827 |
| 836 // Enable FEC. | 828 // Enable FEC. |
| 837 creator_->set_max_packets_per_fec_group(2); | 829 creator_->set_max_packets_per_fec_group(2); |
| 838 EXPECT_FALSE(creator_->IsFecProtected()); | 830 EXPECT_FALSE(creator_->IsFecProtected()); |
| 839 | 831 |
| 840 // Queue one byte of FEC protected data. | 832 // Queue one byte of FEC protected data. |
| 841 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | 833 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
| 842 MUST_FEC_PROTECT, NULL); | 834 MUST_FEC_PROTECT, NULL); |
| 843 EXPECT_TRUE(creator_->HasPendingFrames()); | 835 EXPECT_TRUE(creator_->HasPendingFrames()); |
| 844 | 836 |
| 845 // Add more unprotected data causing first packet to be sent, FEC protected. | 837 // Add more unprotected data causing first packet to be sent, FEC protected. |
| 846 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 838 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 847 DoAll(SaveArg<0>(&packet_), Return(true))); | 839 SaveArg<0>(&packet_)); |
| 848 size_t data_len = kDefaultMaxPacketSize; | 840 size_t data_len = kDefaultMaxPacketSize; |
| 849 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 841 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
| 850 MAY_FEC_PROTECT, NULL); | 842 MAY_FEC_PROTECT, NULL); |
| 851 EXPECT_EQ(data_len, consumed.bytes_consumed); | 843 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 852 PacketContents contents; | 844 PacketContents contents; |
| 853 contents.num_stream_frames = 2u; | 845 contents.num_stream_frames = 2u; |
| 854 contents.fec_group = 1u; | 846 contents.fec_group = 1u; |
| 855 CheckPacketContains(contents, packet_); | 847 CheckPacketContains(contents, packet_); |
| 856 | 848 |
| 857 // FEC group is still open in creator. | 849 // FEC group is still open in creator. |
| 858 EXPECT_TRUE(creator_->IsFecProtected()); | 850 EXPECT_TRUE(creator_->IsFecProtected()); |
| 859 | 851 |
| 860 // Add data that should be protected, large enough to cause second packet to | 852 // Add data that should be protected, large enough to cause second packet to |
| 861 // be sent. Data packet should be followed by FEC packet. | 853 // be sent. Data packet should be followed by FEC packet. |
| 862 { | 854 { |
| 863 InSequence dummy; | 855 InSequence dummy; |
| 864 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 856 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 865 DoAll(SaveArg<0>(&packet2_), Return(true))); | 857 SaveArg<0>(&packet2_)); |
| 866 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 858 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 867 DoAll(SaveArg<0>(&packet3_), Return(true))); | 859 SaveArg<0>(&packet3_)); |
| 868 } | 860 } |
| 869 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, | 861 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
| 870 MUST_FEC_PROTECT, NULL); | 862 MUST_FEC_PROTECT, NULL); |
| 871 EXPECT_EQ(data_len, consumed.bytes_consumed); | 863 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 872 CheckPacketContains(contents, packet2_); | 864 CheckPacketContains(contents, packet2_); |
| 873 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | 865 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
| 874 | 866 |
| 875 // FEC protection should remain on in creator. | 867 // FEC protection should remain on in creator. |
| 876 EXPECT_TRUE(creator_->IsFecProtected()); | 868 EXPECT_TRUE(creator_->IsFecProtected()); |
| 877 } | 869 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 892 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 884 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 893 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 885 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
| 894 Return(CreateFeedbackFrame())); | 886 Return(CreateFeedbackFrame())); |
| 895 | 887 |
| 896 // Send some data and a control frame | 888 // Send some data and a control frame |
| 897 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, | 889 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, |
| 898 MAY_FEC_PROTECT, NULL); | 890 MAY_FEC_PROTECT, NULL); |
| 899 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 891 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| 900 | 892 |
| 901 // All five frames will be flushed out in a single packet. | 893 // All five frames will be flushed out in a single packet. |
| 902 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 894 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); |
| 903 DoAll(SaveArg<0>(&packet_), Return(true))); | |
| 904 generator_.FinishBatchOperations(); | 895 generator_.FinishBatchOperations(); |
| 905 EXPECT_FALSE(generator_.HasQueuedFrames()); | 896 EXPECT_FALSE(generator_.HasQueuedFrames()); |
| 906 | 897 |
| 907 PacketContents contents; | 898 PacketContents contents; |
| 908 contents.num_ack_frames = 1; | 899 contents.num_ack_frames = 1; |
| 909 contents.num_goaway_frames = 1; | 900 contents.num_goaway_frames = 1; |
| 910 contents.num_feedback_frames = 1; | 901 contents.num_feedback_frames = 1; |
| 911 contents.num_rst_stream_frames = 1; | 902 contents.num_rst_stream_frames = 1; |
| 912 contents.num_stream_frames = 1; | 903 contents.num_stream_frames = 1; |
| 913 CheckPacketContains(contents, packet_); | 904 CheckPacketContains(contents, packet_); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 925 generator_.StartBatchOperations(); | 916 generator_.StartBatchOperations(); |
| 926 | 917 |
| 927 // When the first write operation is invoked, the ack and feedback | 918 // When the first write operation is invoked, the ack and feedback |
| 928 // frames will be returned. | 919 // frames will be returned. |
| 929 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 920 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
| 930 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 921 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
| 931 Return(CreateFeedbackFrame())); | 922 Return(CreateFeedbackFrame())); |
| 932 | 923 |
| 933 { | 924 { |
| 934 InSequence dummy; | 925 InSequence dummy; |
| 935 // All five frames will be flushed out in a single packet | 926 // All five frames will be flushed out in a single packet |
| 936 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 927 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 937 DoAll(SaveArg<0>(&packet_), Return(true))); | 928 SaveArg<0>(&packet_)); |
| 938 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 929 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
| 939 DoAll(SaveArg<0>(&packet2_), Return(true))); | 930 SaveArg<0>(&packet2_)); |
| 940 } | 931 } |
| 941 | 932 |
| 942 // Send enough data to exceed one packet | 933 // Send enough data to exceed one packet |
| 943 size_t data_len = kDefaultMaxPacketSize + 100; | 934 size_t data_len = kDefaultMaxPacketSize + 100; |
| 944 QuicConsumedData consumed = | 935 QuicConsumedData consumed = |
| 945 generator_.ConsumeData(3, CreateData(data_len), 0, true, | 936 generator_.ConsumeData(3, CreateData(data_len), 0, true, |
| 946 MAY_FEC_PROTECT, NULL); | 937 MAY_FEC_PROTECT, NULL); |
| 947 EXPECT_EQ(data_len, consumed.bytes_consumed); | 938 EXPECT_EQ(data_len, consumed.bytes_consumed); |
| 948 EXPECT_TRUE(consumed.fin_consumed); | 939 EXPECT_TRUE(consumed.fin_consumed); |
| 949 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 940 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 961 | 952 |
| 962 // The second should have the remainder of the stream data. | 953 // The second should have the remainder of the stream data. |
| 963 PacketContents contents2; | 954 PacketContents contents2; |
| 964 contents2.num_goaway_frames = 1; | 955 contents2.num_goaway_frames = 1; |
| 965 contents2.num_stream_frames = 1; | 956 contents2.num_stream_frames = 1; |
| 966 CheckPacketContains(contents2, packet2_); | 957 CheckPacketContains(contents2, packet2_); |
| 967 } | 958 } |
| 968 | 959 |
| 969 } // namespace test | 960 } // namespace test |
| 970 } // namespace net | 961 } // namespace net |
| OLD | NEW |