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