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 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 | 99 |
100 QuicFecGroupNumber fec_group; | 100 QuicFecGroupNumber fec_group; |
101 }; | 101 }; |
102 | 102 |
103 } // namespace | 103 } // namespace |
104 | 104 |
105 class QuicPacketGeneratorTest : public ::testing::Test { | 105 class QuicPacketGeneratorTest : public ::testing::Test { |
106 protected: | 106 protected: |
107 QuicPacketGeneratorTest() | 107 QuicPacketGeneratorTest() |
108 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), | 108 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), |
109 creator_(42, &framer_, &random_, false), | 109 generator_(42, &framer_, &random_, &delegate_), |
110 generator_(&delegate_, NULL, &creator_), | 110 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)), |
111 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 111 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
112 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 112 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
113 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 113 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
114 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 114 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
115 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 115 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
116 packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), | 116 packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL), |
117 packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL) { | 117 packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL) { |
118 } | 118 } |
119 | 119 |
120 virtual ~QuicPacketGeneratorTest() OVERRIDE { | 120 virtual ~QuicPacketGeneratorTest() OVERRIDE { |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 IOVector CreateData(size_t len) { | 217 IOVector CreateData(size_t len) { |
218 data_array_.reset(new char[len]); | 218 data_array_.reset(new char[len]); |
219 memset(data_array_.get(), '?', len); | 219 memset(data_array_.get(), '?', len); |
220 IOVector data; | 220 IOVector data; |
221 data.Append(data_array_.get(), len); | 221 data.Append(data_array_.get(), len); |
222 return data; | 222 return data; |
223 } | 223 } |
224 | 224 |
225 QuicFramer framer_; | 225 QuicFramer framer_; |
226 MockRandom random_; | 226 MockRandom random_; |
227 QuicPacketCreator creator_; | |
228 StrictMock<MockDelegate> delegate_; | 227 StrictMock<MockDelegate> delegate_; |
229 QuicPacketGenerator generator_; | 228 QuicPacketGenerator generator_; |
| 229 QuicPacketCreator* creator_; |
230 SimpleQuicFramer simple_framer_; | 230 SimpleQuicFramer simple_framer_; |
231 SerializedPacket packet_; | 231 SerializedPacket packet_; |
232 SerializedPacket packet2_; | 232 SerializedPacket packet2_; |
233 SerializedPacket packet3_; | 233 SerializedPacket packet3_; |
234 SerializedPacket packet4_; | 234 SerializedPacket packet4_; |
235 SerializedPacket packet5_; | 235 SerializedPacket packet5_; |
236 SerializedPacket packet6_; | 236 SerializedPacket packet6_; |
237 SerializedPacket packet7_; | 237 SerializedPacket packet7_; |
238 | 238 |
239 private: | 239 private: |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 EXPECT_FALSE(generator_.HasQueuedFrames()); | 369 EXPECT_FALSE(generator_.HasQueuedFrames()); |
370 | 370 |
371 PacketContents contents; | 371 PacketContents contents; |
372 contents.num_rst_stream_frames = 1; | 372 contents.num_rst_stream_frames = 1; |
373 CheckPacketContains(contents, packet_); | 373 CheckPacketContains(contents, packet_); |
374 } | 374 } |
375 | 375 |
376 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { | 376 TEST_F(QuicPacketGeneratorTest, ConsumeData_NotWritable) { |
377 delegate_.SetCanNotWrite(); | 377 delegate_.SetCanNotWrite(); |
378 | 378 |
379 QuicConsumedData consumed = generator_.ConsumeData(1, MakeIOVector("foo"), 2, | 379 QuicConsumedData consumed = generator_.ConsumeData( |
380 true, NULL); | 380 1, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); |
381 EXPECT_EQ(0u, consumed.bytes_consumed); | 381 EXPECT_EQ(0u, consumed.bytes_consumed); |
382 EXPECT_FALSE(consumed.fin_consumed); | 382 EXPECT_FALSE(consumed.fin_consumed); |
383 EXPECT_FALSE(generator_.HasQueuedFrames()); | 383 EXPECT_FALSE(generator_.HasQueuedFrames()); |
384 } | 384 } |
385 | 385 |
386 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { | 386 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldNotFlush) { |
387 delegate_.SetCanWriteAnything(); | 387 delegate_.SetCanWriteAnything(); |
388 generator_.StartBatchOperations(); | 388 generator_.StartBatchOperations(); |
389 | 389 |
390 QuicConsumedData consumed = generator_.ConsumeData(1, MakeIOVector("foo"), 2, | 390 QuicConsumedData consumed = generator_.ConsumeData( |
391 true, NULL); | 391 1, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); |
392 EXPECT_EQ(3u, consumed.bytes_consumed); | 392 EXPECT_EQ(3u, consumed.bytes_consumed); |
393 EXPECT_TRUE(consumed.fin_consumed); | 393 EXPECT_TRUE(consumed.fin_consumed); |
394 EXPECT_TRUE(generator_.HasQueuedFrames()); | 394 EXPECT_TRUE(generator_.HasQueuedFrames()); |
395 } | 395 } |
396 | 396 |
397 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { | 397 TEST_F(QuicPacketGeneratorTest, ConsumeData_WritableAndShouldFlush) { |
398 delegate_.SetCanWriteAnything(); | 398 delegate_.SetCanWriteAnything(); |
399 | 399 |
400 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 400 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
401 DoAll(SaveArg<0>(&packet_), Return(true))); | 401 DoAll(SaveArg<0>(&packet_), Return(true))); |
402 QuicConsumedData consumed = generator_.ConsumeData(1, MakeIOVector("foo"), 2, | 402 QuicConsumedData consumed = generator_.ConsumeData( |
403 true, NULL); | 403 1, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, NULL); |
404 EXPECT_EQ(3u, consumed.bytes_consumed); | 404 EXPECT_EQ(3u, consumed.bytes_consumed); |
405 EXPECT_TRUE(consumed.fin_consumed); | 405 EXPECT_TRUE(consumed.fin_consumed); |
406 EXPECT_FALSE(generator_.HasQueuedFrames()); | 406 EXPECT_FALSE(generator_.HasQueuedFrames()); |
407 | 407 |
408 PacketContents contents; | 408 PacketContents contents; |
409 contents.num_stream_frames = 1; | 409 contents.num_stream_frames = 1; |
410 CheckPacketContains(contents, packet_); | 410 CheckPacketContains(contents, packet_); |
411 } | 411 } |
412 | 412 |
413 TEST_F(QuicPacketGeneratorTest, | 413 TEST_F(QuicPacketGeneratorTest, |
414 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { | 414 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { |
415 delegate_.SetCanWriteAnything(); | 415 delegate_.SetCanWriteAnything(); |
416 generator_.StartBatchOperations(); | 416 generator_.StartBatchOperations(); |
417 | 417 |
418 generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, NULL); | 418 generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, |
419 QuicConsumedData consumed = generator_.ConsumeData(3, MakeIOVector("quux"), 7, | 419 NULL); |
420 false, NULL); | 420 QuicConsumedData consumed = generator_.ConsumeData( |
| 421 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL); |
421 EXPECT_EQ(4u, consumed.bytes_consumed); | 422 EXPECT_EQ(4u, consumed.bytes_consumed); |
422 EXPECT_FALSE(consumed.fin_consumed); | 423 EXPECT_FALSE(consumed.fin_consumed); |
423 EXPECT_TRUE(generator_.HasQueuedFrames()); | 424 EXPECT_TRUE(generator_.HasQueuedFrames()); |
424 } | 425 } |
425 | 426 |
426 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { | 427 TEST_F(QuicPacketGeneratorTest, ConsumeData_BatchOperations) { |
427 delegate_.SetCanWriteAnything(); | 428 delegate_.SetCanWriteAnything(); |
428 generator_.StartBatchOperations(); | 429 generator_.StartBatchOperations(); |
429 | 430 |
430 generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, NULL); | 431 generator_.ConsumeData(1, MakeIOVector("foo"), 2, true, MAY_FEC_PROTECT, |
431 QuicConsumedData consumed = generator_.ConsumeData(3, MakeIOVector("quux"), 7, | 432 NULL); |
432 false, NULL); | 433 QuicConsumedData consumed = generator_.ConsumeData( |
| 434 3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, NULL); |
433 EXPECT_EQ(4u, consumed.bytes_consumed); | 435 EXPECT_EQ(4u, consumed.bytes_consumed); |
434 EXPECT_FALSE(consumed.fin_consumed); | 436 EXPECT_FALSE(consumed.fin_consumed); |
435 EXPECT_TRUE(generator_.HasQueuedFrames()); | 437 EXPECT_TRUE(generator_.HasQueuedFrames()); |
436 | 438 |
437 // Now both frames will be flushed out. | 439 // Now both frames will be flushed out. |
438 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 440 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
439 DoAll(SaveArg<0>(&packet_), Return(true))); | 441 DoAll(SaveArg<0>(&packet_), Return(true))); |
440 generator_.FinishBatchOperations(); | 442 generator_.FinishBatchOperations(); |
441 EXPECT_FALSE(generator_.HasQueuedFrames()); | 443 EXPECT_FALSE(generator_.HasQueuedFrames()); |
442 | 444 |
443 PacketContents contents; | 445 PacketContents contents; |
444 contents.num_stream_frames = 2; | 446 contents.num_stream_frames = 2; |
445 CheckPacketContains(contents, packet_); | 447 CheckPacketContains(contents, packet_); |
446 } | 448 } |
447 | 449 |
448 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { | 450 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { |
449 delegate_.SetCanWriteAnything(); | 451 delegate_.SetCanWriteAnything(); |
450 | 452 |
451 // Send FEC every two packets. | 453 // Send FEC every two packets. |
452 creator_.set_max_packets_per_fec_group(2); | 454 creator_->set_max_packets_per_fec_group(2); |
453 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); | |
454 | 455 |
455 { | 456 { |
456 InSequence dummy; | 457 InSequence dummy; |
457 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 458 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
458 DoAll(SaveArg<0>(&packet_), Return(true))); | 459 DoAll(SaveArg<0>(&packet_), Return(true))); |
459 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 460 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
460 DoAll(SaveArg<0>(&packet2_), Return(true))); | 461 DoAll(SaveArg<0>(&packet2_), Return(true))); |
461 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 462 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
462 DoAll(SaveArg<0>(&packet3_), Return(true))); | 463 DoAll(SaveArg<0>(&packet3_), Return(true))); |
463 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 464 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
464 DoAll(SaveArg<0>(&packet4_), Return(true))); | 465 DoAll(SaveArg<0>(&packet4_), Return(true))); |
465 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 466 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
466 DoAll(SaveArg<0>(&packet5_), Return(true))); | 467 DoAll(SaveArg<0>(&packet5_), Return(true))); |
467 } | 468 } |
468 | 469 |
469 // Send enough data to create 3 packets: two full and one partial. | 470 // Send enough data to create 3 packets: two full and one partial. Send |
| 471 // with MUST_FEC_PROTECT flag. |
470 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | 472 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
471 QuicConsumedData consumed = | 473 QuicConsumedData consumed = |
472 generator_.ConsumeData(3, CreateData(data_len), 0, true, NULL); | 474 generator_.ConsumeData(3, CreateData(data_len), 0, true, |
| 475 MUST_FEC_PROTECT, NULL); |
473 EXPECT_EQ(data_len, consumed.bytes_consumed); | 476 EXPECT_EQ(data_len, consumed.bytes_consumed); |
474 EXPECT_TRUE(consumed.fin_consumed); | 477 EXPECT_TRUE(consumed.fin_consumed); |
475 EXPECT_FALSE(generator_.HasQueuedFrames()); | 478 EXPECT_FALSE(generator_.HasQueuedFrames()); |
476 | 479 |
477 CheckPacketHasSingleStreamFrame(packet_); | 480 CheckPacketHasSingleStreamFrame(packet_); |
478 CheckPacketHasSingleStreamFrame(packet2_); | 481 CheckPacketHasSingleStreamFrame(packet2_); |
479 CheckPacketIsFec(packet3_, 1); | 482 CheckPacketIsFec(packet3_, 1); |
480 | 483 |
481 CheckPacketHasSingleStreamFrame(packet4_); | 484 CheckPacketHasSingleStreamFrame(packet4_); |
482 CheckPacketIsFec(packet5_, 4); | 485 CheckPacketIsFec(packet5_, 4); |
483 } | 486 } |
484 | 487 |
485 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { | 488 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { |
486 delegate_.SetCanWriteAnything(); | 489 delegate_.SetCanWriteAnything(); |
487 | 490 |
488 // Send FEC every six packets. | 491 // Enable FEC. |
489 creator_.set_max_packets_per_fec_group(6); | 492 creator_->set_max_packets_per_fec_group(6); |
490 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); | |
491 { | 493 { |
492 InSequence dummy; | 494 InSequence dummy; |
493 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 495 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
494 DoAll(SaveArg<0>(&packet_), Return(true))); | 496 DoAll(SaveArg<0>(&packet_), Return(true))); |
495 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 497 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
496 DoAll(SaveArg<0>(&packet2_), Return(true))); | 498 DoAll(SaveArg<0>(&packet2_), Return(true))); |
497 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 499 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
498 DoAll(SaveArg<0>(&packet3_), Return(true))); | 500 DoAll(SaveArg<0>(&packet3_), Return(true))); |
499 } | 501 } |
500 | 502 |
501 // Send enough data to create 2 packets: one full and one partial. | 503 // Send enough data to create 2 packets: one full and one partial. Send |
| 504 // with MUST_FEC_PROTECT flag. |
502 size_t data_len = 1 * kDefaultMaxPacketSize + 100; | 505 size_t data_len = 1 * kDefaultMaxPacketSize + 100; |
503 QuicConsumedData consumed = | 506 QuicConsumedData consumed = |
504 generator_.ConsumeData(3, CreateData(data_len), 0, true, NULL); | 507 generator_.ConsumeData(3, CreateData(data_len), 0, true, |
| 508 MUST_FEC_PROTECT, NULL); |
505 EXPECT_EQ(data_len, consumed.bytes_consumed); | 509 EXPECT_EQ(data_len, consumed.bytes_consumed); |
506 EXPECT_TRUE(consumed.fin_consumed); | 510 EXPECT_TRUE(consumed.fin_consumed); |
507 EXPECT_FALSE(generator_.HasQueuedFrames()); | 511 EXPECT_FALSE(generator_.HasQueuedFrames()); |
508 | 512 |
509 CheckPacketHasSingleStreamFrame(packet_); | 513 CheckPacketHasSingleStreamFrame(packet_); |
510 CheckPacketHasSingleStreamFrame(packet2_); | 514 CheckPacketHasSingleStreamFrame(packet2_); |
511 CheckPacketIsFec(packet3_, 1); | 515 CheckPacketIsFec(packet3_, 1); |
512 } | 516 } |
513 | 517 |
514 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { | 518 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { |
515 // Set the packet size be enough for two stream frames with 0 stream offset, | 519 // Set the packet size be enough for two stream frames with 0 stream offset, |
516 // but not enough for a stream frame of 0 offset and one with non-zero offset. | 520 // but not enough for a stream frame of 0 offset and one with non-zero offset. |
517 size_t length = | 521 size_t length = |
518 NullEncrypter().GetCiphertextSize(0) + | 522 NullEncrypter().GetCiphertextSize(0) + |
519 GetPacketHeaderSize(creator_.connection_id_length(), | 523 GetPacketHeaderSize(creator_->connection_id_length(), |
520 true, | 524 true, |
521 creator_.next_sequence_number_length(), | 525 creator_->next_sequence_number_length(), |
522 NOT_IN_FEC_GROUP) + | 526 NOT_IN_FEC_GROUP) + |
523 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger | 527 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger |
524 // than the GetMinStreamFrameSize. | 528 // than the GetMinStreamFrameSize. |
525 QuicFramer::GetMinStreamFrameSize(framer_.version(), 1, 0, false, | 529 QuicFramer::GetMinStreamFrameSize(framer_.version(), 1, 0, false, |
526 NOT_IN_FEC_GROUP) + 3 + | 530 NOT_IN_FEC_GROUP) + 3 + |
527 QuicFramer::GetMinStreamFrameSize(framer_.version(), 1, 0, true, | 531 QuicFramer::GetMinStreamFrameSize(framer_.version(), 1, 0, true, |
528 NOT_IN_FEC_GROUP) + 1; | 532 NOT_IN_FEC_GROUP) + 1; |
529 creator_.set_max_packet_length(length); | 533 creator_->set_max_packet_length(length); |
530 delegate_.SetCanWriteAnything(); | 534 delegate_.SetCanWriteAnything(); |
531 { | 535 { |
532 InSequence dummy; | 536 InSequence dummy; |
533 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 537 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
534 DoAll(SaveArg<0>(&packet_), Return(true))); | 538 DoAll(SaveArg<0>(&packet_), Return(true))); |
535 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 539 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
536 DoAll(SaveArg<0>(&packet2_), Return(true))); | 540 DoAll(SaveArg<0>(&packet2_), Return(true))); |
537 } | 541 } |
538 generator_.StartBatchOperations(); | 542 generator_.StartBatchOperations(); |
539 // Queue enough data to prevent a stream frame with a non-zero offset from | 543 // Queue enough data to prevent a stream frame with a non-zero offset from |
540 // fitting. | 544 // fitting. |
541 QuicConsumedData consumed = generator_.ConsumeData(1, MakeIOVector("foo"), 0, | 545 QuicConsumedData consumed = generator_.ConsumeData( |
542 false, NULL); | 546 1, MakeIOVector("foo"), 0, false, MAY_FEC_PROTECT, NULL); |
543 EXPECT_EQ(3u, consumed.bytes_consumed); | 547 EXPECT_EQ(3u, consumed.bytes_consumed); |
544 EXPECT_FALSE(consumed.fin_consumed); | 548 EXPECT_FALSE(consumed.fin_consumed); |
545 EXPECT_TRUE(generator_.HasQueuedFrames()); | 549 EXPECT_TRUE(generator_.HasQueuedFrames()); |
546 | 550 |
547 // This frame will not fit with the existing frame, causing the queued frame | 551 // This frame will not fit with the existing frame, causing the queued frame |
548 // to be serialized, and it will not fit with another frame like it, so it is | 552 // to be serialized, and it will not fit with another frame like it, so it is |
549 // serialized by itself. | 553 // serialized by itself. |
550 consumed = generator_.ConsumeData(1, MakeIOVector("bar"), 3, true, NULL); | 554 consumed = generator_.ConsumeData(1, MakeIOVector("bar"), 3, true, |
| 555 MAY_FEC_PROTECT, NULL); |
551 EXPECT_EQ(3u, consumed.bytes_consumed); | 556 EXPECT_EQ(3u, consumed.bytes_consumed); |
552 EXPECT_TRUE(consumed.fin_consumed); | 557 EXPECT_TRUE(consumed.fin_consumed); |
553 EXPECT_FALSE(generator_.HasQueuedFrames()); | 558 EXPECT_FALSE(generator_.HasQueuedFrames()); |
554 | 559 |
555 PacketContents contents; | 560 PacketContents contents; |
556 contents.num_stream_frames = 1; | 561 contents.num_stream_frames = 1; |
557 CheckPacketContains(contents, packet_); | 562 CheckPacketContains(contents, packet_); |
558 CheckPacketContains(contents, packet2_); | 563 CheckPacketContains(contents, packet2_); |
559 } | 564 } |
560 | 565 |
561 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) { | 566 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOff) { |
562 delegate_.SetCanWriteAnything(); | 567 delegate_.SetCanWriteAnything(); |
563 // Enable FEC. | 568 // Enable FEC. |
564 creator_.set_max_packets_per_fec_group(2); | 569 creator_->set_max_packets_per_fec_group(2); |
565 EXPECT_FALSE(creator_.IsFecProtected()); | 570 EXPECT_FALSE(creator_->IsFecProtected()); |
566 | 571 |
567 // Send one unprotected data packet. | 572 // Send one unprotected data packet. |
568 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 573 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
569 DoAll(SaveArg<0>(&packet_), Return(true))); | 574 DoAll(SaveArg<0>(&packet_), Return(true))); |
570 QuicConsumedData consumed = | 575 QuicConsumedData consumed = |
571 generator_.ConsumeData(5, CreateData(1u), 0, true, NULL); | 576 generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT, |
| 577 NULL); |
572 EXPECT_EQ(1u, consumed.bytes_consumed); | 578 EXPECT_EQ(1u, consumed.bytes_consumed); |
573 EXPECT_FALSE(generator_.HasQueuedFrames()); | 579 EXPECT_FALSE(generator_.HasQueuedFrames()); |
574 EXPECT_FALSE(creator_.IsFecProtected()); | 580 EXPECT_FALSE(creator_->IsFecProtected()); |
575 // Verify that one data packet was sent. | 581 // Verify that one data packet was sent. |
576 PacketContents contents; | 582 PacketContents contents; |
577 contents.num_stream_frames = 1; | 583 contents.num_stream_frames = 1; |
578 CheckPacketContains(contents, packet_); | 584 CheckPacketContains(contents, packet_); |
579 | 585 |
580 // Turn on FEC protection. | |
581 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); | |
582 EXPECT_TRUE(creator_.IsFecProtected()); | |
583 { | 586 { |
584 InSequence dummy; | 587 InSequence dummy; |
585 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 588 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
586 DoAll(SaveArg<0>(&packet2_), Return(true))); | 589 DoAll(SaveArg<0>(&packet2_), Return(true))); |
587 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 590 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
588 DoAll(SaveArg<0>(&packet3_), Return(true))); | 591 DoAll(SaveArg<0>(&packet3_), Return(true))); |
589 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 592 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
590 DoAll(SaveArg<0>(&packet4_), Return(true))); | 593 DoAll(SaveArg<0>(&packet4_), Return(true))); |
591 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 594 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
592 DoAll(SaveArg<0>(&packet5_), Return(true))); | 595 DoAll(SaveArg<0>(&packet5_), Return(true))); |
593 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 596 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
594 DoAll(SaveArg<0>(&packet6_), Return(true))); | 597 DoAll(SaveArg<0>(&packet6_), Return(true))); |
595 } | 598 } |
596 // Send enough data to create 3 packets. | 599 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. |
597 size_t data_len = 2 * kDefaultMaxPacketSize + 100; | 600 size_t data_len = 2 * kDefaultMaxPacketSize + 100; |
598 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, NULL); | 601 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, |
| 602 MUST_FEC_PROTECT, NULL); |
599 EXPECT_EQ(data_len, consumed.bytes_consumed); | 603 EXPECT_EQ(data_len, consumed.bytes_consumed); |
600 EXPECT_FALSE(generator_.HasQueuedFrames()); | 604 EXPECT_FALSE(generator_.HasQueuedFrames()); |
601 EXPECT_TRUE(creator_.IsFecProtected()); | |
602 | 605 |
603 // Verify that two FEC packets were sent. | 606 // Verify that two FEC packets were sent. |
604 CheckPacketHasSingleStreamFrame(packet2_); | 607 CheckPacketHasSingleStreamFrame(packet2_); |
605 CheckPacketHasSingleStreamFrame(packet3_); | 608 CheckPacketHasSingleStreamFrame(packet3_); |
606 CheckPacketIsFec(packet4_, /*fec_group=*/2u); | 609 CheckPacketIsFec(packet4_, /*fec_group=*/2u); |
607 CheckPacketHasSingleStreamFrame(packet5_); | 610 CheckPacketHasSingleStreamFrame(packet5_); |
608 CheckPacketIsFec(packet6_, /*fec_group=*/5u); // Sent at the end of stream. | 611 CheckPacketIsFec(packet6_, /*fec_group=*/5u); // Sent at the end of stream. |
609 | 612 |
610 // Turn off FEC protection and send one unprotected data packet. | 613 // Send one unprotected data packet. |
611 QuicPacketGeneratorPeer::MaybeStopFecProtection(&generator_, false); | |
612 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 614 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
613 DoAll(SaveArg<0>(&packet7_), Return(true))); | 615 DoAll(SaveArg<0>(&packet7_), Return(true))); |
614 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, NULL); | 616 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
| 617 MAY_FEC_PROTECT, NULL); |
615 EXPECT_EQ(1u, consumed.bytes_consumed); | 618 EXPECT_EQ(1u, consumed.bytes_consumed); |
616 EXPECT_FALSE(generator_.HasQueuedFrames()); | 619 EXPECT_FALSE(generator_.HasQueuedFrames()); |
617 EXPECT_FALSE(creator_.IsFecProtected()); | 620 EXPECT_FALSE(creator_->IsFecProtected()); |
618 // Verify that one unprotected data packet was sent. | 621 // Verify that one unprotected data packet was sent. |
619 CheckPacketContains(contents, packet7_); | 622 CheckPacketContains(contents, packet7_); |
620 } | 623 } |
621 | 624 |
622 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) { | 625 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFrameInCreator) { |
623 delegate_.SetCanWriteAnything(); | 626 delegate_.SetCanWriteAnything(); |
624 // Enable FEC. | 627 // Enable FEC. |
625 creator_.set_max_packets_per_fec_group(2); | 628 creator_->set_max_packets_per_fec_group(2); |
626 | 629 |
627 generator_.StartBatchOperations(); | 630 generator_.StartBatchOperations(); |
628 // Queue enough data to prevent a stream frame with a non-zero offset from | 631 // Queue enough data to prevent a stream frame with a non-zero offset from |
629 // fitting. | 632 // fitting. |
630 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, | 633 QuicConsumedData consumed = generator_.ConsumeData( |
631 true, NULL); | 634 7, CreateData(1u), 0, true, MAY_FEC_PROTECT, NULL); |
632 EXPECT_EQ(1u, consumed.bytes_consumed); | 635 EXPECT_EQ(1u, consumed.bytes_consumed); |
633 EXPECT_TRUE(creator_.HasPendingFrames()); | 636 EXPECT_TRUE(creator_->HasPendingFrames()); |
634 | 637 |
635 // Turn on FEC protection. Should cause queued frames to be flushed. | 638 // Queue protected data for sending. Should cause queued frames to be flushed. |
636 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 639 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
637 DoAll(SaveArg<0>(&packet_), Return(true))); | 640 DoAll(SaveArg<0>(&packet_), Return(true))); |
638 EXPECT_FALSE(creator_.IsFecProtected()); | 641 EXPECT_FALSE(creator_->IsFecProtected()); |
639 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); | 642 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
640 CheckPacketHasSingleStreamFrame(packet_); | 643 MUST_FEC_PROTECT, NULL); |
641 EXPECT_TRUE(creator_.IsFecProtected()); | 644 EXPECT_EQ(1u, consumed.bytes_consumed); |
| 645 PacketContents contents; |
| 646 contents.num_stream_frames = 1; |
| 647 // Transmitted packet was not FEC protected. |
| 648 CheckPacketContains(contents, packet_); |
| 649 EXPECT_TRUE(creator_->IsFecProtected()); |
| 650 EXPECT_TRUE(creator_->HasPendingFrames()); |
642 } | 651 } |
643 | 652 |
644 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { | 653 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { |
645 // Enable FEC. | 654 // Enable FEC. |
646 creator_.set_max_packets_per_fec_group(2); | 655 creator_->set_max_packets_per_fec_group(2); |
647 | 656 |
648 // Queue control frames in generator. | 657 // Queue control frames in generator. |
649 delegate_.SetCanNotWrite(); | 658 delegate_.SetCanNotWrite(); |
650 generator_.SetShouldSendAck(true, true); | 659 generator_.SetShouldSendAck(true, true); |
651 delegate_.SetCanWriteAnything(); | 660 delegate_.SetCanWriteAnything(); |
| 661 generator_.StartBatchOperations(); |
652 | 662 |
653 // Set up frames to write into the creator when control frames are written. | 663 // Set up frames to write into the creator when control frames are written. |
654 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 664 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
655 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 665 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
656 Return(CreateFeedbackFrame())); | 666 Return(CreateFeedbackFrame())); |
657 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( | 667 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( |
658 Return(CreateStopWaitingFrame())); | 668 Return(CreateStopWaitingFrame())); |
659 | 669 |
660 // Generator should have queued control frames, and creator should be empty. | 670 // Generator should have queued control frames, and creator should be empty. |
661 EXPECT_TRUE(generator_.HasQueuedFrames()); | 671 EXPECT_TRUE(generator_.HasQueuedFrames()); |
662 EXPECT_FALSE(creator_.HasPendingFrames()); | 672 EXPECT_FALSE(creator_->HasPendingFrames()); |
663 EXPECT_FALSE(creator_.IsFecProtected()); | 673 EXPECT_FALSE(creator_->IsFecProtected()); |
664 | 674 |
665 // Turn on FEC protection. Should cause queued control frames to be flushed. | 675 // Queue protected data for sending. Should cause queued frames to be flushed. |
666 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 676 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
667 DoAll(SaveArg<0>(&packet_), Return(true))); | 677 DoAll(SaveArg<0>(&packet_), Return(true))); |
668 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); | 678 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, |
| 679 MUST_FEC_PROTECT, NULL); |
| 680 EXPECT_EQ(1u, consumed.bytes_consumed); |
669 PacketContents contents; | 681 PacketContents contents; |
670 contents.num_ack_frames = 1; | 682 contents.num_ack_frames = 1; |
671 contents.num_feedback_frames = 1; | 683 contents.num_feedback_frames = 1; |
672 contents.num_stop_waiting_frames = 1; | 684 contents.num_stop_waiting_frames = 1; |
673 CheckPacketContains(contents, packet_); | 685 CheckPacketContains(contents, packet_); |
674 | 686 |
675 // FEC protection should be on in creator. | 687 // FEC protection should be on in creator. |
676 EXPECT_TRUE(creator_.IsFecProtected()); | 688 EXPECT_TRUE(creator_->IsFecProtected()); |
677 } | 689 } |
678 | 690 |
679 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { | 691 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { |
680 delegate_.SetCanWriteAnything(); | 692 delegate_.SetCanWriteAnything(); |
681 | 693 |
682 // Enable and start FEC protection. | 694 // Enable FEC. |
683 creator_.set_max_packets_per_fec_group(2); | 695 creator_->set_max_packets_per_fec_group(2); |
684 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); | 696 EXPECT_FALSE(creator_->IsFecProtected()); |
685 EXPECT_TRUE(creator_.IsFecProtected()); | |
686 | 697 |
687 // Queue stream frame to be protected in creator. | 698 // Queue stream frame to be protected in creator. |
688 generator_.StartBatchOperations(); | 699 generator_.StartBatchOperations(); |
689 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | 700 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
690 NULL); | 701 MUST_FEC_PROTECT, NULL); |
691 EXPECT_EQ(1u, consumed.bytes_consumed); | 702 EXPECT_EQ(1u, consumed.bytes_consumed); |
692 // Turn FEC protection off in generator. | |
693 QuicPacketGeneratorPeer::MaybeStopFecProtection(&generator_, /*force=*/false); | |
694 // Creator has a pending protected frame. | 703 // Creator has a pending protected frame. |
695 EXPECT_TRUE(creator_.HasPendingFrames()); | 704 EXPECT_TRUE(creator_->HasPendingFrames()); |
696 EXPECT_TRUE(creator_.IsFecProtected()); | 705 EXPECT_TRUE(creator_->IsFecProtected()); |
697 | 706 |
698 // Add enough data to exceed size of current packet, so that current packet | 707 // Add enough unprotected data to exceed size of current packet, so that |
699 // is sent. Both frames will be sent out in a single packet. | 708 // current packet is sent. Both frames will be sent out in a single packet. |
700 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 709 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
701 DoAll(SaveArg<0>(&packet_), Return(true))); | 710 DoAll(SaveArg<0>(&packet_), Return(true))); |
702 size_t data_len = kDefaultMaxPacketSize; | 711 size_t data_len = kDefaultMaxPacketSize; |
703 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, NULL); | 712 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
| 713 MAY_FEC_PROTECT, NULL); |
704 EXPECT_EQ(data_len, consumed.bytes_consumed); | 714 EXPECT_EQ(data_len, consumed.bytes_consumed); |
705 PacketContents contents; | 715 PacketContents contents; |
706 contents.num_stream_frames = 2u; | 716 contents.num_stream_frames = 2u; |
707 contents.fec_group = 1u; | 717 contents.fec_group = 1u; |
708 CheckPacketContains(contents, packet_); | 718 CheckPacketContains(contents, packet_); |
709 // FEC protection should still be on in creator. | 719 // FEC protection should still be on in creator. |
710 EXPECT_TRUE(creator_.IsFecProtected()); | 720 EXPECT_TRUE(creator_->IsFecProtected()); |
711 } | 721 } |
712 | 722 |
713 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { | 723 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { |
714 delegate_.SetCanWriteAnything(); | 724 delegate_.SetCanWriteAnything(); |
715 | 725 |
716 // Enable and start FEC protection. | 726 // Enable FEC. |
717 creator_.set_max_packets_per_fec_group(2); | 727 creator_->set_max_packets_per_fec_group(2); |
718 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); | 728 EXPECT_FALSE(creator_->IsFecProtected()); |
719 EXPECT_TRUE(creator_.IsFecProtected()); | |
720 | 729 |
721 generator_.StartBatchOperations(); | 730 generator_.StartBatchOperations(); |
722 // Send first packet, FEC protected. | 731 // Send first packet, FEC protected. |
723 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 732 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
724 DoAll(SaveArg<0>(&packet_), Return(true))); | 733 DoAll(SaveArg<0>(&packet_), Return(true))); |
725 // Write enough data to cause a packet to be emitted. | 734 // Write enough data to cause a packet to be emitted. |
726 size_t data_len = kDefaultMaxPacketSize; | 735 size_t data_len = kDefaultMaxPacketSize; |
727 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(data_len), | 736 QuicConsumedData consumed = generator_.ConsumeData( |
728 0, true, NULL); | 737 5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, NULL); |
729 EXPECT_EQ(data_len, consumed.bytes_consumed); | 738 EXPECT_EQ(data_len, consumed.bytes_consumed); |
730 PacketContents contents; | 739 PacketContents contents; |
731 contents.num_stream_frames = 1u; | 740 contents.num_stream_frames = 1u; |
732 contents.fec_group = 1u; | 741 contents.fec_group = 1u; |
733 CheckPacketContains(contents, packet_); | 742 CheckPacketContains(contents, packet_); |
734 | 743 |
735 // Turn FEC protection off in generator. | 744 // FEC should still be on in creator. |
736 QuicPacketGeneratorPeer::MaybeStopFecProtection(&generator_, /*force=*/false); | 745 EXPECT_TRUE(creator_->IsFecProtected()); |
737 // FEC group is still open in creator. | |
738 EXPECT_TRUE(creator_.IsFecProtected()); | |
739 | 746 |
740 // Send second packet, which is protected because it happens to fall within an | 747 // Send enough unprotected data to cause second packet to be sent, which gets |
741 // open FEC group. Data packet will be followed by FEC packet. | 748 // protected because it happens to fall within an open FEC group. Data packet |
| 749 // will be followed by FEC packet. |
742 { | 750 { |
743 InSequence dummy; | 751 InSequence dummy; |
744 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 752 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
745 DoAll(SaveArg<0>(&packet2_), Return(true))); | 753 DoAll(SaveArg<0>(&packet2_), Return(true))); |
746 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 754 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
747 DoAll(SaveArg<0>(&packet3_), Return(true))); | 755 DoAll(SaveArg<0>(&packet3_), Return(true))); |
748 } | 756 } |
749 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, NULL); | 757 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
| 758 MAY_FEC_PROTECT, NULL); |
750 EXPECT_EQ(data_len, consumed.bytes_consumed); | 759 EXPECT_EQ(data_len, consumed.bytes_consumed); |
751 contents.num_stream_frames = 2u; | 760 contents.num_stream_frames = 2u; |
752 CheckPacketContains(contents, packet2_); | 761 CheckPacketContains(contents, packet2_); |
753 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | 762 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
754 | 763 |
755 // FEC protection should be off in creator. | 764 // FEC protection should be off in creator. |
756 EXPECT_FALSE(creator_.IsFecProtected()); | 765 EXPECT_FALSE(creator_->IsFecProtected()); |
757 } | 766 } |
758 | 767 |
759 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { | 768 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { |
760 delegate_.SetCanWriteAnything(); | 769 delegate_.SetCanWriteAnything(); |
761 generator_.StartBatchOperations(); | 770 generator_.StartBatchOperations(); |
762 | 771 |
763 // Enable and start FEC protection. | 772 // Enable FEC. |
764 creator_.set_max_packets_per_fec_group(2); | 773 creator_->set_max_packets_per_fec_group(2); |
765 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); | 774 EXPECT_FALSE(creator_->IsFecProtected()); |
766 EXPECT_TRUE(creator_.IsFecProtected()); | |
767 | 775 |
768 // Queue one byte of FEC protected data and turn FEC off in generator. | 776 // Queue one byte of FEC protected data. |
769 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, | 777 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, |
770 NULL); | 778 MUST_FEC_PROTECT, NULL); |
771 QuicPacketGeneratorPeer::MaybeStopFecProtection(&generator_, /*force=*/false); | 779 EXPECT_TRUE(creator_->HasPendingFrames()); |
772 EXPECT_TRUE(creator_.HasPendingFrames()); | |
773 | 780 |
774 // Add more data causing first packet to be sent, FEC protected. | 781 // Add more unprotected data causing first packet to be sent, FEC protected. |
775 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 782 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
776 DoAll(SaveArg<0>(&packet_), Return(true))); | 783 DoAll(SaveArg<0>(&packet_), Return(true))); |
777 // Write enough data to cause a packet to be emitted. | |
778 size_t data_len = kDefaultMaxPacketSize; | 784 size_t data_len = kDefaultMaxPacketSize; |
779 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, NULL); | 785 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
| 786 MAY_FEC_PROTECT, NULL); |
780 EXPECT_EQ(data_len, consumed.bytes_consumed); | 787 EXPECT_EQ(data_len, consumed.bytes_consumed); |
781 PacketContents contents; | 788 PacketContents contents; |
782 contents.num_stream_frames = 2u; | 789 contents.num_stream_frames = 2u; |
783 contents.fec_group = 1u; | 790 contents.fec_group = 1u; |
784 CheckPacketContains(contents, packet_); | 791 CheckPacketContains(contents, packet_); |
785 | 792 |
786 // FEC group is still open in creator. | 793 // FEC group is still open in creator. |
787 EXPECT_TRUE(creator_.IsFecProtected()); | 794 EXPECT_TRUE(creator_->IsFecProtected()); |
788 // Turn FEC on again in generator, for the next data. | |
789 QuicPacketGeneratorPeer::MaybeStartFecProtection(&generator_); | |
790 | 795 |
791 // Add data that should be protected, large enough to cause second packet to | 796 // Add data that should be protected, large enough to cause second packet to |
792 // be sent. Data packet should be followed by FEC packet. | 797 // be sent. Data packet should be followed by FEC packet. |
793 { | 798 { |
794 InSequence dummy; | 799 InSequence dummy; |
795 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 800 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
796 DoAll(SaveArg<0>(&packet2_), Return(true))); | 801 DoAll(SaveArg<0>(&packet2_), Return(true))); |
797 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 802 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
798 DoAll(SaveArg<0>(&packet3_), Return(true))); | 803 DoAll(SaveArg<0>(&packet3_), Return(true))); |
799 } | 804 } |
800 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, NULL); | 805 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, |
| 806 MUST_FEC_PROTECT, NULL); |
801 EXPECT_EQ(data_len, consumed.bytes_consumed); | 807 EXPECT_EQ(data_len, consumed.bytes_consumed); |
802 CheckPacketContains(contents, packet2_); | 808 CheckPacketContains(contents, packet2_); |
803 CheckPacketIsFec(packet3_, /*fec_group=*/1u); | 809 CheckPacketIsFec(packet3_, /*fec_group=*/1u); |
804 | 810 |
805 // FEC protection should be on in creator. | 811 // FEC protection should remain on in creator. |
806 EXPECT_TRUE(creator_.IsFecProtected()); | 812 EXPECT_TRUE(creator_->IsFecProtected()); |
807 } | 813 } |
808 | 814 |
809 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { | 815 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { |
810 delegate_.SetCanNotWrite(); | 816 delegate_.SetCanNotWrite(); |
811 | 817 |
812 generator_.SetShouldSendAck(true, false); | 818 generator_.SetShouldSendAck(true, false); |
813 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); | 819 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); |
814 EXPECT_TRUE(generator_.HasQueuedFrames()); | 820 EXPECT_TRUE(generator_.HasQueuedFrames()); |
815 | 821 |
816 delegate_.SetCanWriteAnything(); | 822 delegate_.SetCanWriteAnything(); |
817 | 823 |
818 generator_.StartBatchOperations(); | 824 generator_.StartBatchOperations(); |
819 | 825 |
820 // When the first write operation is invoked, the ack and feedback | 826 // When the first write operation is invoked, the ack and feedback |
821 // frames will be returned. | 827 // frames will be returned. |
822 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); | 828 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); |
823 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( | 829 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce( |
824 Return(CreateFeedbackFrame())); | 830 Return(CreateFeedbackFrame())); |
825 | 831 |
826 // Send some data and a control frame | 832 // Send some data and a control frame |
827 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, NULL); | 833 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, |
| 834 MAY_FEC_PROTECT, NULL); |
828 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 835 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
829 | 836 |
830 // All five frames will be flushed out in a single packet. | 837 // All five frames will be flushed out in a single packet. |
831 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 838 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
832 DoAll(SaveArg<0>(&packet_), Return(true))); | 839 DoAll(SaveArg<0>(&packet_), Return(true))); |
833 generator_.FinishBatchOperations(); | 840 generator_.FinishBatchOperations(); |
834 EXPECT_FALSE(generator_.HasQueuedFrames()); | 841 EXPECT_FALSE(generator_.HasQueuedFrames()); |
835 | 842 |
836 PacketContents contents; | 843 PacketContents contents; |
837 contents.num_ack_frames = 1; | 844 contents.num_ack_frames = 1; |
(...skipping 26 matching lines...) Expand all Loading... |
864 // All five frames will be flushed out in a single packet | 871 // All five frames will be flushed out in a single packet |
865 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 872 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
866 DoAll(SaveArg<0>(&packet_), Return(true))); | 873 DoAll(SaveArg<0>(&packet_), Return(true))); |
867 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( | 874 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( |
868 DoAll(SaveArg<0>(&packet2_), Return(true))); | 875 DoAll(SaveArg<0>(&packet2_), Return(true))); |
869 } | 876 } |
870 | 877 |
871 // Send enough data to exceed one packet | 878 // Send enough data to exceed one packet |
872 size_t data_len = kDefaultMaxPacketSize + 100; | 879 size_t data_len = kDefaultMaxPacketSize + 100; |
873 QuicConsumedData consumed = | 880 QuicConsumedData consumed = |
874 generator_.ConsumeData(3, CreateData(data_len), 0, true, NULL); | 881 generator_.ConsumeData(3, CreateData(data_len), 0, true, |
| 882 MAY_FEC_PROTECT, NULL); |
875 EXPECT_EQ(data_len, consumed.bytes_consumed); | 883 EXPECT_EQ(data_len, consumed.bytes_consumed); |
876 EXPECT_TRUE(consumed.fin_consumed); | 884 EXPECT_TRUE(consumed.fin_consumed); |
877 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); | 885 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); |
878 | 886 |
879 generator_.FinishBatchOperations(); | 887 generator_.FinishBatchOperations(); |
880 EXPECT_FALSE(generator_.HasQueuedFrames()); | 888 EXPECT_FALSE(generator_.HasQueuedFrames()); |
881 | 889 |
882 // The first packet should have the queued data and part of the stream data. | 890 // The first packet should have the queued data and part of the stream data. |
883 PacketContents contents; | 891 PacketContents contents; |
884 contents.num_ack_frames = 1; | 892 contents.num_ack_frames = 1; |
885 contents.num_feedback_frames = 1; | 893 contents.num_feedback_frames = 1; |
886 contents.num_rst_stream_frames = 1; | 894 contents.num_rst_stream_frames = 1; |
887 contents.num_stream_frames = 1; | 895 contents.num_stream_frames = 1; |
888 CheckPacketContains(contents, packet_); | 896 CheckPacketContains(contents, packet_); |
889 | 897 |
890 // The second should have the remainder of the stream data. | 898 // The second should have the remainder of the stream data. |
891 PacketContents contents2; | 899 PacketContents contents2; |
892 contents2.num_goaway_frames = 1; | 900 contents2.num_goaway_frames = 1; |
893 contents2.num_stream_frames = 1; | 901 contents2.num_stream_frames = 1; |
894 CheckPacketContains(contents2, packet2_); | 902 CheckPacketContains(contents2, packet2_); |
895 } | 903 } |
896 | 904 |
897 } // namespace test | 905 } // namespace test |
898 } // namespace net | 906 } // namespace net |
OLD | NEW |