Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(203)

Side by Side Diff: net/quic/quic_packet_generator_test.cc

Issue 331573002: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix compiler error - use push_back to initialize vectors Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_packet_generator.cc ('k') | net/quic/quic_protocol.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/quic_packet_generator.cc ('k') | net/quic/quic_protocol.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698