| 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_creator.h" | 5 #include "net/quic/quic_packet_creator.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "net/quic/crypto/null_encrypter.h" | 10 #include "net/quic/crypto/null_encrypter.h" |
| (...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 491 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 492 } | 492 } |
| 493 ProcessPacket(serialized.packet); | 493 ProcessPacket(serialized.packet); |
| 494 delete serialized.packet; | 494 delete serialized.packet; |
| 495 } | 495 } |
| 496 | 496 |
| 497 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithPadding) { | 497 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithPadding) { |
| 498 QuicFrame frame; | 498 QuicFrame frame; |
| 499 QuicIOVector io_vector(MakeIOVector("fake handshake message data")); | 499 QuicIOVector io_vector(MakeIOVector("fake handshake message data")); |
| 500 UniqueStreamBuffer stream_buffer; | 500 UniqueStreamBuffer stream_buffer; |
| 501 creator_.CreateStreamFrame(kCryptoStreamId, io_vector, 0u, 0u, false, &frame, | 501 QuicPacketCreatorPeer::CreateStreamFrame(&creator_, kCryptoStreamId, |
| 502 &stream_buffer); | 502 io_vector, 0u, 0u, false, &frame, |
| 503 &stream_buffer); |
| 503 RetransmittableFrames frames(ENCRYPTION_NONE); | 504 RetransmittableFrames frames(ENCRYPTION_NONE); |
| 504 frames.AddFrame(frame); | 505 frames.AddFrame(frame); |
| 505 frames.set_needs_padding(true); | 506 frames.set_needs_padding(true); |
| 506 char buffer[kMaxPacketSize]; | 507 char buffer[kMaxPacketSize]; |
| 507 SerializedPacket serialized = creator_.ReserializeAllFrames( | 508 SerializedPacket serialized = creator_.ReserializeAllFrames( |
| 508 frames, QuicPacketCreatorPeer::NextPacketNumberLength(&creator_), buffer, | 509 frames, QuicPacketCreatorPeer::NextPacketNumberLength(&creator_), buffer, |
| 509 kMaxPacketSize); | 510 kMaxPacketSize); |
| 510 EXPECT_EQ(kDefaultMaxPacketSize, serialized.packet->length()); | 511 EXPECT_EQ(kDefaultMaxPacketSize, serialized.packet->length()); |
| 511 delete serialized.packet; | 512 delete serialized.packet; |
| 512 } | 513 } |
| 513 | 514 |
| 514 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPacketAndPadding) { | 515 TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPacketAndPadding) { |
| 515 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 516 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) |
| 516 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | 517 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
| 517 size_t capacity = kDefaultMaxPacketSize - overhead; | 518 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 518 for (int delta = -5; delta <= 0; ++delta) { | 519 for (int delta = -5; delta <= 0; ++delta) { |
| 519 string data(capacity + delta, 'A'); | 520 string data(capacity + delta, 'A'); |
| 520 size_t bytes_free = 0 - delta; | 521 size_t bytes_free = 0 - delta; |
| 521 | 522 |
| 522 QuicFrame frame; | 523 QuicFrame frame; |
| 523 QuicIOVector io_vector(MakeIOVector(data)); | 524 QuicIOVector io_vector(MakeIOVector(data)); |
| 524 UniqueStreamBuffer stream_buffer; | 525 UniqueStreamBuffer stream_buffer; |
| 525 creator_.CreateStreamFrame(kCryptoStreamId, io_vector, 0, kOffset, false, | 526 QuicPacketCreatorPeer::CreateStreamFrame(&creator_, kCryptoStreamId, |
| 526 &frame, &stream_buffer); | 527 io_vector, 0, kOffset, false, |
| 528 &frame, &stream_buffer); |
| 527 RetransmittableFrames frames(ENCRYPTION_NONE); | 529 RetransmittableFrames frames(ENCRYPTION_NONE); |
| 528 frames.AddFrame(frame); | 530 frames.AddFrame(frame); |
| 529 frames.set_needs_padding(true); | 531 frames.set_needs_padding(true); |
| 530 char buffer[kMaxPacketSize]; | 532 char buffer[kMaxPacketSize]; |
| 531 SerializedPacket serialized = creator_.ReserializeAllFrames( | 533 SerializedPacket serialized = creator_.ReserializeAllFrames( |
| 532 frames, QuicPacketCreatorPeer::NextPacketNumberLength(&creator_), | 534 frames, QuicPacketCreatorPeer::NextPacketNumberLength(&creator_), |
| 533 buffer, kMaxPacketSize); | 535 buffer, kMaxPacketSize); |
| 534 | 536 |
| 535 // If there is not enough space in the packet to fit a padding frame | 537 // If there is not enough space in the packet to fit a padding frame |
| 536 // (1 byte) and to expand the stream frame (another 2 bytes) the packet | 538 // (1 byte) and to expand the stream frame (another 2 bytes) the packet |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 creator_.StopFecProtectingPackets(); | 624 creator_.StopFecProtectingPackets(); |
| 623 EXPECT_FALSE(creator_.IsFecProtected()); | 625 EXPECT_FALSE(creator_.IsFecProtected()); |
| 624 creator_.StartFecProtectingPackets(); | 626 creator_.StartFecProtectingPackets(); |
| 625 EXPECT_TRUE(creator_.IsFecProtected()); | 627 EXPECT_TRUE(creator_.IsFecProtected()); |
| 626 } | 628 } |
| 627 | 629 |
| 628 TEST_P(QuicPacketCreatorTest, SwitchFecOnWithStreamFrameQueued) { | 630 TEST_P(QuicPacketCreatorTest, SwitchFecOnWithStreamFrameQueued) { |
| 629 // Add a stream frame to the creator. | 631 // Add a stream frame to the creator. |
| 630 QuicFrame frame; | 632 QuicFrame frame; |
| 631 QuicIOVector io_vector(MakeIOVector("test")); | 633 QuicIOVector io_vector(MakeIOVector("test")); |
| 632 UniqueStreamBuffer stream_buffer; | 634 ASSERT_TRUE( |
| 633 size_t consumed = creator_.CreateStreamFrame(1u, io_vector, 0u, 0u, false, | 635 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); |
| 634 &frame, &stream_buffer); | 636 ASSERT_TRUE(frame.stream_frame); |
| 637 size_t consumed = frame.stream_frame->data.length(); |
| 635 EXPECT_EQ(4u, consumed); | 638 EXPECT_EQ(4u, consumed); |
| 636 ASSERT_TRUE(frame.stream_frame); | |
| 637 EXPECT_TRUE(creator_.AddSavedFrame(frame)); | |
| 638 EXPECT_TRUE(creator_.HasPendingFrames()); | 639 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 639 | 640 |
| 640 // Enable FEC protection, and send FEC packet every 6 packets. | 641 // Enable FEC protection, and send FEC packet every 6 packets. |
| 641 creator_.set_max_packets_per_fec_group(6); | 642 creator_.set_max_packets_per_fec_group(6); |
| 642 EXPECT_TRUE(creator_.IsFecEnabled()); | 643 EXPECT_TRUE(creator_.IsFecEnabled()); |
| 643 EXPECT_DFATAL(creator_.StartFecProtectingPackets(), | 644 EXPECT_DFATAL(creator_.StartFecProtectingPackets(), |
| 644 "Cannot start FEC protection with pending frames."); | 645 "Cannot start FEC protection with pending frames."); |
| 645 EXPECT_FALSE(creator_.IsFecProtected()); | 646 EXPECT_FALSE(creator_.IsFecProtected()); |
| 646 | 647 |
| 647 // Serialize packet for transmission. | 648 // Serialize packet for transmission. |
| 648 char buffer[kMaxPacketSize]; | 649 char buffer[kMaxPacketSize]; |
| 649 SerializedPacket serialized = | 650 SerializedPacket serialized = |
| 650 creator_.SerializePacket(buffer, kMaxPacketSize); | 651 creator_.SerializePacket(buffer, kMaxPacketSize); |
| 651 delete serialized.packet; | 652 delete serialized.packet; |
| 652 delete serialized.retransmittable_frames; | 653 delete serialized.retransmittable_frames; |
| 653 EXPECT_FALSE(creator_.HasPendingFrames()); | 654 EXPECT_FALSE(creator_.HasPendingFrames()); |
| 654 | 655 |
| 655 // Since all pending frames have been serialized, turning FEC on should work. | 656 // Since all pending frames have been serialized, turning FEC on should work. |
| 656 creator_.StartFecProtectingPackets(); | 657 creator_.StartFecProtectingPackets(); |
| 657 EXPECT_TRUE(creator_.IsFecProtected()); | 658 EXPECT_TRUE(creator_.IsFecProtected()); |
| 658 } | 659 } |
| 659 | 660 |
| 660 TEST_P(QuicPacketCreatorTest, CreateStreamFrame) { | 661 TEST_P(QuicPacketCreatorTest, ConsumeData) { |
| 661 QuicFrame frame; | 662 QuicFrame frame; |
| 662 QuicIOVector io_vector(MakeIOVector("test")); | 663 QuicIOVector io_vector(MakeIOVector("test")); |
| 663 UniqueStreamBuffer stream_buffer; | 664 ASSERT_TRUE( |
| 664 size_t consumed = creator_.CreateStreamFrame(1u, io_vector, 0u, 0u, false, | 665 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); |
| 665 &frame, &stream_buffer); | 666 ASSERT_TRUE(frame.stream_frame); |
| 667 size_t consumed = frame.stream_frame->data.length(); |
| 666 EXPECT_EQ(4u, consumed); | 668 EXPECT_EQ(4u, consumed); |
| 667 CheckStreamFrame(frame, 1u, "test", 0u, false); | 669 CheckStreamFrame(frame, 1u, "test", 0u, false); |
| 668 RetransmittableFrames cleanup_frames(ENCRYPTION_NONE); | 670 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 669 cleanup_frames.AddFrame(frame); | |
| 670 } | 671 } |
| 671 | 672 |
| 672 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFin) { | 673 TEST_P(QuicPacketCreatorTest, ConsumeDataFin) { |
| 673 QuicFrame frame; | 674 QuicFrame frame; |
| 674 QuicIOVector io_vector(MakeIOVector("test")); | 675 QuicIOVector io_vector(MakeIOVector("test")); |
| 675 UniqueStreamBuffer stream_buffer; | 676 ASSERT_TRUE( |
| 676 size_t consumed = creator_.CreateStreamFrame(1u, io_vector, 0u, 10u, true, | 677 creator_.ConsumeData(1u, io_vector, 0u, 10u, true, false, &frame)); |
| 677 &frame, &stream_buffer); | 678 ASSERT_TRUE(frame.stream_frame); |
| 679 size_t consumed = frame.stream_frame->data.length(); |
| 678 EXPECT_EQ(4u, consumed); | 680 EXPECT_EQ(4u, consumed); |
| 679 CheckStreamFrame(frame, 1u, "test", 10u, true); | 681 CheckStreamFrame(frame, 1u, "test", 10u, true); |
| 680 RetransmittableFrames cleanup_frames(ENCRYPTION_NONE); | 682 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 681 cleanup_frames.AddFrame(frame); | |
| 682 } | 683 } |
| 683 | 684 |
| 684 TEST_P(QuicPacketCreatorTest, CreateStreamFrameFinOnly) { | 685 TEST_P(QuicPacketCreatorTest, ConsumeDataFinOnly) { |
| 685 QuicFrame frame; | 686 QuicFrame frame; |
| 686 QuicIOVector io_vector(nullptr, 0, 0); | 687 QuicIOVector io_vector(nullptr, 0, 0); |
| 687 UniqueStreamBuffer stream_buffer; | 688 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, true, false, &frame)); |
| 688 size_t consumed = creator_.CreateStreamFrame(1u, io_vector, 0u, 0u, true, | 689 ASSERT_TRUE(frame.stream_frame); |
| 689 &frame, &stream_buffer); | 690 size_t consumed = frame.stream_frame->data.length(); |
| 690 EXPECT_EQ(0u, consumed); | 691 EXPECT_EQ(0u, consumed); |
| 691 CheckStreamFrame(frame, 1u, string(), 0u, true); | 692 CheckStreamFrame(frame, 1u, string(), 0u, true); |
| 692 delete frame.stream_frame; | 693 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 693 } | 694 } |
| 694 | 695 |
| 695 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { | 696 TEST_P(QuicPacketCreatorTest, CreateAllFreeBytesForStreamFrames) { |
| 696 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 697 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) |
| 697 + GetEncryptionOverhead(); | 698 + GetEncryptionOverhead(); |
| 698 for (size_t i = overhead; i < overhead + 100; ++i) { | 699 for (size_t i = overhead; i < overhead + 100; ++i) { |
| 699 creator_.SetMaxPacketLength(i); | 700 creator_.SetMaxPacketLength(i); |
| 700 const bool should_have_room = i > overhead + GetStreamFrameOverhead( | 701 const bool should_have_room = i > overhead + GetStreamFrameOverhead( |
| 701 NOT_IN_FEC_GROUP); | 702 NOT_IN_FEC_GROUP); |
| 702 ASSERT_EQ(should_have_room, creator_.HasRoomForStreamFrame( | 703 ASSERT_EQ(should_have_room, creator_.HasRoomForStreamFrame( |
| 703 kClientDataStreamId1, kOffset)); | 704 kClientDataStreamId1, kOffset)); |
| 704 if (should_have_room) { | 705 if (should_have_room) { |
| 705 QuicFrame frame; | 706 QuicFrame frame; |
| 706 QuicIOVector io_vector(MakeIOVector("testdata")); | 707 QuicIOVector io_vector(MakeIOVector("testdata")); |
| 707 UniqueStreamBuffer stream_buffer; | 708 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, |
| 708 size_t bytes_consumed = | 709 kOffset, false, false, &frame)); |
| 709 creator_.CreateStreamFrame(kClientDataStreamId1, io_vector, 0u, | 710 ASSERT_TRUE(frame.stream_frame); |
| 710 kOffset, false, &frame, &stream_buffer); | 711 size_t bytes_consumed = frame.stream_frame->data.length(); |
| 711 EXPECT_LT(0u, bytes_consumed); | 712 EXPECT_LT(0u, bytes_consumed); |
| 712 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | |
| 713 char buffer[kMaxPacketSize]; | 713 char buffer[kMaxPacketSize]; |
| 714 SerializedPacket serialized_packet = | 714 SerializedPacket serialized_packet = |
| 715 creator_.SerializePacket(buffer, kMaxPacketSize); | 715 creator_.SerializePacket(buffer, kMaxPacketSize); |
| 716 ASSERT_TRUE(serialized_packet.packet); | 716 ASSERT_TRUE(serialized_packet.packet); |
| 717 delete serialized_packet.packet; | 717 delete serialized_packet.packet; |
| 718 delete serialized_packet.retransmittable_frames; | 718 delete serialized_packet.retransmittable_frames; |
| 719 } | 719 } |
| 720 } | 720 } |
| 721 } | 721 } |
| 722 | 722 |
| 723 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) { | 723 TEST_P(QuicPacketCreatorTest, StreamFrameConsumption) { |
| 724 // Compute the total overhead for a single frame in packet. | 724 // Compute the total overhead for a single frame in packet. |
| 725 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 725 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) |
| 726 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | 726 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
| 727 size_t capacity = kDefaultMaxPacketSize - overhead; | 727 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 728 // Now, test various sizes around this size. | 728 // Now, test various sizes around this size. |
| 729 for (int delta = -5; delta <= 5; ++delta) { | 729 for (int delta = -5; delta <= 5; ++delta) { |
| 730 string data(capacity + delta, 'A'); | 730 string data(capacity + delta, 'A'); |
| 731 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 731 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 732 QuicFrame frame; | 732 QuicFrame frame; |
| 733 QuicIOVector io_vector(MakeIOVector(data)); | 733 QuicIOVector io_vector(MakeIOVector(data)); |
| 734 UniqueStreamBuffer stream_buffer; | 734 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, |
| 735 size_t bytes_consumed = | 735 kOffset, false, false, &frame)); |
| 736 creator_.CreateStreamFrame(kClientDataStreamId1, io_vector, 0u, kOffset, | 736 ASSERT_TRUE(frame.stream_frame); |
| 737 false, &frame, &stream_buffer); | 737 size_t bytes_consumed = frame.stream_frame->data.length(); |
| 738 EXPECT_EQ(capacity - bytes_free, bytes_consumed); | 738 EXPECT_EQ(capacity - bytes_free, bytes_consumed); |
| 739 | 739 |
| 740 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | |
| 741 // BytesFree() returns bytes available for the next frame, which will | 740 // BytesFree() returns bytes available for the next frame, which will |
| 742 // be two bytes smaller since the stream frame would need to be grown. | 741 // be two bytes smaller since the stream frame would need to be grown. |
| 743 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame()); | 742 EXPECT_EQ(2u, creator_.ExpansionOnNewFrame()); |
| 744 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; | 743 size_t expected_bytes_free = bytes_free < 3 ? 0 : bytes_free - 2; |
| 745 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; | 744 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; |
| 746 char buffer[kMaxPacketSize]; | 745 char buffer[kMaxPacketSize]; |
| 747 SerializedPacket serialized_packet = | 746 SerializedPacket serialized_packet = |
| 748 creator_.SerializePacket(buffer, kMaxPacketSize); | 747 creator_.SerializePacket(buffer, kMaxPacketSize); |
| 749 ASSERT_TRUE(serialized_packet.packet); | 748 ASSERT_TRUE(serialized_packet.packet); |
| 750 delete serialized_packet.packet; | 749 delete serialized_packet.packet; |
| 751 delete serialized_packet.retransmittable_frames; | 750 delete serialized_packet.retransmittable_frames; |
| 752 } | 751 } |
| 753 } | 752 } |
| 754 | 753 |
| 755 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { | 754 TEST_P(QuicPacketCreatorTest, StreamFrameConsumptionWithFec) { |
| 756 // Enable FEC protection, and send FEC packet every 6 packets. | 755 // Enable FEC protection, and send FEC packet every 6 packets. |
| 757 EXPECT_TRUE(SwitchFecProtectionOn(6)); | 756 EXPECT_TRUE(SwitchFecProtectionOn(6)); |
| 758 // Compute the total overhead for a single frame in packet. | 757 // Compute the total overhead for a single frame in packet. |
| 759 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) | 758 const size_t overhead = GetPacketHeaderOverhead(IN_FEC_GROUP) |
| 760 + GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP); | 759 + GetEncryptionOverhead() + GetStreamFrameOverhead(IN_FEC_GROUP); |
| 761 size_t capacity = kDefaultMaxPacketSize - overhead; | 760 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 762 // Now, test various sizes around this size. | 761 // Now, test various sizes around this size. |
| 763 for (int delta = -5; delta <= 5; ++delta) { | 762 for (int delta = -5; delta <= 5; ++delta) { |
| 764 string data(capacity + delta, 'A'); | 763 string data(capacity + delta, 'A'); |
| 765 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 764 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 766 QuicFrame frame; | 765 QuicFrame frame; |
| 767 QuicIOVector io_vector(MakeIOVector(data)); | 766 QuicIOVector io_vector(MakeIOVector(data)); |
| 768 UniqueStreamBuffer stream_buffer; | 767 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, |
| 769 size_t bytes_consumed = | 768 kOffset, false, false, &frame)); |
| 770 creator_.CreateStreamFrame(kClientDataStreamId1, io_vector, 0u, kOffset, | 769 ASSERT_TRUE(frame.stream_frame); |
| 771 false, &frame, &stream_buffer); | 770 size_t bytes_consumed = frame.stream_frame->data.length();; |
| 772 EXPECT_EQ(capacity - bytes_free, bytes_consumed); | 771 EXPECT_EQ(capacity - bytes_free, bytes_consumed); |
| 773 | 772 |
| 774 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | |
| 775 // BytesFree() returns bytes available for the next frame. Since stream | 773 // BytesFree() returns bytes available for the next frame. Since stream |
| 776 // frame does not grow for FEC protected packets, this should be the same | 774 // frame does not grow for FEC protected packets, this should be the same |
| 777 // as bytes_free (bound by 0). | 775 // as bytes_free (bound by 0). |
| 778 EXPECT_EQ(0u, creator_.ExpansionOnNewFrame()); | 776 EXPECT_EQ(0u, creator_.ExpansionOnNewFrame()); |
| 779 size_t expected_bytes_free = bytes_free > 0 ? bytes_free : 0; | 777 size_t expected_bytes_free = bytes_free > 0 ? bytes_free : 0; |
| 780 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; | 778 EXPECT_EQ(expected_bytes_free, creator_.BytesFree()) << "delta: " << delta; |
| 781 char buffer[kMaxPacketSize]; | 779 char buffer[kMaxPacketSize]; |
| 782 SerializedPacket serialized_packet = | 780 SerializedPacket serialized_packet = |
| 783 creator_.SerializePacket(buffer, kMaxPacketSize); | 781 creator_.SerializePacket(buffer, kMaxPacketSize); |
| 784 ASSERT_TRUE(serialized_packet.packet); | 782 ASSERT_TRUE(serialized_packet.packet); |
| 785 delete serialized_packet.packet; | 783 delete serialized_packet.packet; |
| 786 delete serialized_packet.retransmittable_frames; | 784 delete serialized_packet.retransmittable_frames; |
| 787 } | 785 } |
| 788 } | 786 } |
| 789 | 787 |
| 790 TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) { | 788 TEST_P(QuicPacketCreatorTest, CryptoStreamFramePacketPadding) { |
| 791 // Compute the total overhead for a single frame in packet. | 789 // Compute the total overhead for a single frame in packet. |
| 792 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) | 790 const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP) |
| 793 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | 791 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
| 794 ASSERT_GT(kMaxPacketSize, overhead); | 792 ASSERT_GT(kMaxPacketSize, overhead); |
| 795 size_t capacity = kDefaultMaxPacketSize - overhead; | 793 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 796 // Now, test various sizes around this size. | 794 // Now, test various sizes around this size. |
| 797 for (int delta = -5; delta <= 5; ++delta) { | 795 for (int delta = -5; delta <= 5; ++delta) { |
| 798 string data(capacity + delta, 'A'); | 796 string data(capacity + delta, 'A'); |
| 799 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 797 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 800 | 798 |
| 801 QuicFrame frame; | 799 QuicFrame frame; |
| 802 QuicIOVector io_vector(MakeIOVector(data)); | 800 QuicIOVector io_vector(MakeIOVector(data)); |
| 803 UniqueStreamBuffer stream_buffer; | 801 ASSERT_TRUE(creator_.ConsumeData(kCryptoStreamId, io_vector, 0u, kOffset, |
| 804 size_t bytes_consumed = creator_.CreateStreamFrame( | 802 false, true, &frame)); |
| 805 kCryptoStreamId, io_vector, 0u, kOffset, false, &frame, &stream_buffer); | 803 ASSERT_TRUE(frame.stream_frame); |
| 804 size_t bytes_consumed = frame.stream_frame->data.length(); |
| 806 EXPECT_LT(0u, bytes_consumed); | 805 EXPECT_LT(0u, bytes_consumed); |
| 807 ASSERT_TRUE(creator_.AddPaddedSavedFrame(frame, nullptr)); | |
| 808 char buffer[kMaxPacketSize]; | 806 char buffer[kMaxPacketSize]; |
| 809 SerializedPacket serialized_packet = | 807 SerializedPacket serialized_packet = |
| 810 creator_.SerializePacket(buffer, kMaxPacketSize); | 808 creator_.SerializePacket(buffer, kMaxPacketSize); |
| 811 ASSERT_TRUE(serialized_packet.packet); | 809 ASSERT_TRUE(serialized_packet.packet); |
| 812 // If there is not enough space in the packet to fit a padding frame | 810 // If there is not enough space in the packet to fit a padding frame |
| 813 // (1 byte) and to expand the stream frame (another 2 bytes) the packet | 811 // (1 byte) and to expand the stream frame (another 2 bytes) the packet |
| 814 // will not be padded. | 812 // will not be padded. |
| 815 if (bytes_free < 3) { | 813 if (bytes_free < 3) { |
| 816 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free, | 814 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free, |
| 817 serialized_packet.packet->length()); | 815 serialized_packet.packet->length()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 829 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); | 827 + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP); |
| 830 ASSERT_GT(kDefaultMaxPacketSize, overhead); | 828 ASSERT_GT(kDefaultMaxPacketSize, overhead); |
| 831 size_t capacity = kDefaultMaxPacketSize - overhead; | 829 size_t capacity = kDefaultMaxPacketSize - overhead; |
| 832 // Now, test various sizes around this size. | 830 // Now, test various sizes around this size. |
| 833 for (int delta = -5; delta <= 5; ++delta) { | 831 for (int delta = -5; delta <= 5; ++delta) { |
| 834 string data(capacity + delta, 'A'); | 832 string data(capacity + delta, 'A'); |
| 835 size_t bytes_free = delta > 0 ? 0 : 0 - delta; | 833 size_t bytes_free = delta > 0 ? 0 : 0 - delta; |
| 836 | 834 |
| 837 QuicFrame frame; | 835 QuicFrame frame; |
| 838 QuicIOVector io_vector(MakeIOVector(data)); | 836 QuicIOVector io_vector(MakeIOVector(data)); |
| 839 UniqueStreamBuffer stream_buffer; | 837 ASSERT_TRUE(creator_.ConsumeData(kClientDataStreamId1, io_vector, 0u, |
| 840 size_t bytes_consumed = | 838 kOffset, false, false, &frame)); |
| 841 creator_.CreateStreamFrame(kClientDataStreamId1, io_vector, 0u, kOffset, | 839 ASSERT_TRUE(frame.stream_frame); |
| 842 false, &frame, &stream_buffer); | 840 size_t bytes_consumed = frame.stream_frame->data.length(); |
| 843 EXPECT_LT(0u, bytes_consumed); | 841 EXPECT_LT(0u, bytes_consumed); |
| 844 ASSERT_TRUE(creator_.AddSavedFrame(frame)); | |
| 845 char buffer[kMaxPacketSize]; | 842 char buffer[kMaxPacketSize]; |
| 846 SerializedPacket serialized_packet = | 843 SerializedPacket serialized_packet = |
| 847 creator_.SerializePacket(buffer, kMaxPacketSize); | 844 creator_.SerializePacket(buffer, kMaxPacketSize); |
| 848 ASSERT_TRUE(serialized_packet.packet); | 845 ASSERT_TRUE(serialized_packet.packet); |
| 849 if (bytes_free > 0) { | 846 if (bytes_free > 0) { |
| 850 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free, | 847 EXPECT_EQ(kDefaultMaxPacketSize - bytes_free, |
| 851 serialized_packet.packet->length()); | 848 serialized_packet.packet->length()); |
| 852 } else { | 849 } else { |
| 853 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet.packet->length()); | 850 EXPECT_EQ(kDefaultMaxPacketSize, serialized_packet.packet->length()); |
| 854 } | 851 } |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 951 DoAll(SaveArg<0>(&header), Return(true))); | 948 DoAll(SaveArg<0>(&header), Return(true))); |
| 952 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); | 949 EXPECT_CALL(framer_visitor_, OnStreamFrame(_)); |
| 953 EXPECT_CALL(framer_visitor_, OnPacketComplete()); | 950 EXPECT_CALL(framer_visitor_, OnPacketComplete()); |
| 954 } | 951 } |
| 955 ProcessPacket(serialized.packet); | 952 ProcessPacket(serialized.packet); |
| 956 EXPECT_EQ(GetParam().version_serialization, | 953 EXPECT_EQ(GetParam().version_serialization, |
| 957 header.public_header.version_flag); | 954 header.public_header.version_flag); |
| 958 delete serialized.packet; | 955 delete serialized.packet; |
| 959 } | 956 } |
| 960 | 957 |
| 961 TEST_P(QuicPacketCreatorTest, CreateStreamFrameTooLarge) { | 958 TEST_P(QuicPacketCreatorTest, ConsumeDataLargerThanOneStreamFrame) { |
| 962 if (!GetParam().version_serialization) { | 959 if (!GetParam().version_serialization) { |
| 963 creator_.StopSendingVersion(); | 960 creator_.StopSendingVersion(); |
| 964 } | 961 } |
| 965 // A string larger than fits into a frame. | 962 // A string larger than fits into a frame. |
| 966 size_t payload_length; | 963 size_t payload_length; |
| 967 creator_.SetMaxPacketLength(GetPacketLengthForOneStream( | 964 creator_.SetMaxPacketLength(GetPacketLengthForOneStream( |
| 968 client_framer_.version(), | 965 client_framer_.version(), |
| 969 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), | 966 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
| 970 creator_.connection_id_length(), PACKET_1BYTE_PACKET_NUMBER, | 967 creator_.connection_id_length(), PACKET_1BYTE_PACKET_NUMBER, |
| 971 NOT_IN_FEC_GROUP, &payload_length)); | 968 NOT_IN_FEC_GROUP, &payload_length)); |
| 972 QuicFrame frame; | 969 QuicFrame frame; |
| 973 const string too_long_payload(payload_length * 2, 'a'); | 970 const string too_long_payload(payload_length * 2, 'a'); |
| 974 QuicIOVector io_vector(MakeIOVector(too_long_payload)); | 971 QuicIOVector io_vector(MakeIOVector(too_long_payload)); |
| 975 UniqueStreamBuffer stream_buffer; | 972 ASSERT_TRUE(creator_.ConsumeData(1u, io_vector, 0u, 0u, true, false, &frame)); |
| 976 size_t consumed = creator_.CreateStreamFrame(1u, io_vector, 0u, 0u, true, | 973 ASSERT_TRUE(frame.stream_frame); |
| 977 &frame, &stream_buffer); | 974 size_t consumed = frame.stream_frame->data.length(); |
| 978 EXPECT_EQ(payload_length, consumed); | 975 EXPECT_EQ(payload_length, consumed); |
| 979 const string payload(payload_length, 'a'); | 976 const string payload(payload_length, 'a'); |
| 980 CheckStreamFrame(frame, 1u, payload, 0u, false); | 977 CheckStreamFrame(frame, 1u, payload, 0u, false); |
| 981 RetransmittableFrames cleanup_frames(ENCRYPTION_NONE); | |
| 982 cleanup_frames.AddFrame(frame); | |
| 983 } | 978 } |
| 984 | 979 |
| 985 TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) { | 980 TEST_P(QuicPacketCreatorTest, AddFrameAndSerialize) { |
| 986 if (!GetParam().version_serialization) { | 981 if (!GetParam().version_serialization) { |
| 987 creator_.StopSendingVersion(); | 982 creator_.StopSendingVersion(); |
| 988 } | 983 } |
| 989 const size_t max_plaintext_size = | 984 const size_t max_plaintext_size = |
| 990 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length()); | 985 client_framer_.GetMaxPlaintextSize(creator_.max_packet_length()); |
| 991 EXPECT_FALSE(creator_.HasPendingFrames()); | 986 EXPECT_FALSE(creator_.HasPendingFrames()); |
| 992 EXPECT_EQ(max_plaintext_size - | 987 EXPECT_EQ(max_plaintext_size - |
| 993 GetPacketHeaderSize( | 988 GetPacketHeaderSize( |
| 994 creator_.connection_id_length(), | 989 creator_.connection_id_length(), |
| 995 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), | 990 QuicPacketCreatorPeer::SendVersionInPacket(&creator_), |
| 996 PACKET_1BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP), | 991 PACKET_1BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP), |
| 997 creator_.BytesFree()); | 992 creator_.BytesFree()); |
| 998 | 993 |
| 999 // Add a variety of frame types and then a padding frame. | 994 // Add a variety of frame types and then a padding frame. |
| 1000 QuicAckFrame ack_frame(MakeAckFrame(0u)); | 995 QuicAckFrame ack_frame(MakeAckFrame(0u)); |
| 1001 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); | 996 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
| 1002 EXPECT_TRUE(creator_.HasPendingFrames()); | 997 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 1003 | 998 |
| 1004 QuicFrame frame; | 999 QuicFrame frame; |
| 1005 QuicIOVector io_vector(MakeIOVector("test")); | 1000 QuicIOVector io_vector(MakeIOVector("test")); |
| 1006 UniqueStreamBuffer stream_buffer; | 1001 ASSERT_TRUE( |
| 1007 size_t consumed = creator_.CreateStreamFrame(1u, io_vector, 0u, 0u, false, | 1002 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); |
| 1008 &frame, &stream_buffer); | 1003 ASSERT_TRUE(frame.stream_frame); |
| 1004 size_t consumed = frame.stream_frame->data.length(); |
| 1009 EXPECT_EQ(4u, consumed); | 1005 EXPECT_EQ(4u, consumed); |
| 1010 ASSERT_TRUE(frame.stream_frame); | |
| 1011 EXPECT_TRUE(creator_.AddSavedFrame(frame)); | |
| 1012 EXPECT_TRUE(creator_.HasPendingFrames()); | 1006 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 1013 | 1007 |
| 1014 QuicPaddingFrame padding_frame; | 1008 QuicPaddingFrame padding_frame; |
| 1015 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(padding_frame))); | 1009 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(padding_frame))); |
| 1016 EXPECT_TRUE(creator_.HasPendingFrames()); | 1010 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 1017 EXPECT_EQ(0u, creator_.BytesFree()); | 1011 EXPECT_EQ(0u, creator_.BytesFree()); |
| 1018 | 1012 |
| 1019 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); | 1013 EXPECT_FALSE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
| 1020 | 1014 |
| 1021 // Ensure the packet is successfully created. | 1015 // Ensure the packet is successfully created. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1055 EXPECT_GT(creator_.BytesFree(), frame_len); | 1049 EXPECT_GT(creator_.BytesFree(), frame_len); |
| 1056 EXPECT_GT(creator_.max_packet_length(), creator_.PacketSize()); | 1050 EXPECT_GT(creator_.max_packet_length(), creator_.PacketSize()); |
| 1057 | 1051 |
| 1058 // Add ack frame to creator. | 1052 // Add ack frame to creator. |
| 1059 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); | 1053 EXPECT_TRUE(creator_.AddSavedFrame(QuicFrame(&ack_frame))); |
| 1060 EXPECT_TRUE(creator_.HasPendingFrames()); | 1054 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 1061 EXPECT_GT(creator_.max_packet_length(), creator_.PacketSize()); | 1055 EXPECT_GT(creator_.max_packet_length(), creator_.PacketSize()); |
| 1062 EXPECT_LT(0u, creator_.BytesFree()); | 1056 EXPECT_LT(0u, creator_.BytesFree()); |
| 1063 | 1057 |
| 1064 // Make sure that an additional stream frame can be added to the packet. | 1058 // Make sure that an additional stream frame can be added to the packet. |
| 1065 QuicFrame stream_frame; | 1059 QuicFrame frame; |
| 1066 QuicIOVector io_vector(MakeIOVector("test")); | 1060 QuicIOVector io_vector(MakeIOVector("test")); |
| 1067 UniqueStreamBuffer stream_buffer; | 1061 ASSERT_TRUE( |
| 1068 size_t consumed = creator_.CreateStreamFrame(2u, io_vector, 0u, 0u, false, | 1062 creator_.ConsumeData(2u, io_vector, 0u, 0u, false, false, &frame)); |
| 1069 &stream_frame, &stream_buffer); | 1063 ASSERT_TRUE(frame.stream_frame); |
| 1064 size_t consumed = frame.stream_frame->data.length(); |
| 1070 EXPECT_EQ(4u, consumed); | 1065 EXPECT_EQ(4u, consumed); |
| 1071 ASSERT_TRUE(stream_frame.stream_frame); | |
| 1072 EXPECT_TRUE(creator_.AddSavedFrame(stream_frame)); | |
| 1073 EXPECT_TRUE(creator_.HasPendingFrames()); | 1066 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 1074 | 1067 |
| 1075 // Ensure the packet is successfully created, and the packet size estimate | 1068 // Ensure the packet is successfully created, and the packet size estimate |
| 1076 // matches the serialized packet length. | 1069 // matches the serialized packet length. |
| 1077 EXPECT_CALL(entropy_calculator_, | 1070 EXPECT_CALL(entropy_calculator_, |
| 1078 EntropyHash(_)).WillOnce(testing::Return(0)); | 1071 EntropyHash(_)).WillOnce(testing::Return(0)); |
| 1079 size_t est_packet_size = creator_.PacketSize(); | 1072 size_t est_packet_size = creator_.PacketSize(); |
| 1080 char buffer[kMaxPacketSize]; | 1073 char buffer[kMaxPacketSize]; |
| 1081 SerializedPacket serialized = | 1074 SerializedPacket serialized = |
| 1082 creator_.SerializePacket(buffer, kMaxPacketSize); | 1075 creator_.SerializePacket(buffer, kMaxPacketSize); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1203 | 1196 |
| 1204 serialized = creator_.SerializeFec(buffer, kMaxPacketSize); | 1197 serialized = creator_.SerializeFec(buffer, kMaxPacketSize); |
| 1205 ASSERT_EQ(3u, serialized.packet_number); | 1198 ASSERT_EQ(3u, serialized.packet_number); |
| 1206 delete serialized.packet; | 1199 delete serialized.packet; |
| 1207 } | 1200 } |
| 1208 | 1201 |
| 1209 TEST_P(QuicPacketCreatorTest, ResetFecGroupWithQueuedFrames) { | 1202 TEST_P(QuicPacketCreatorTest, ResetFecGroupWithQueuedFrames) { |
| 1210 // Add a stream frame to the creator. | 1203 // Add a stream frame to the creator. |
| 1211 QuicFrame frame; | 1204 QuicFrame frame; |
| 1212 QuicIOVector io_vector(MakeIOVector("test")); | 1205 QuicIOVector io_vector(MakeIOVector("test")); |
| 1213 UniqueStreamBuffer stream_buffer; | 1206 ASSERT_TRUE( |
| 1214 size_t consumed = creator_.CreateStreamFrame(1u, io_vector, 0u, 0u, false, | 1207 creator_.ConsumeData(1u, io_vector, 0u, 0u, false, false, &frame)); |
| 1215 &frame, &stream_buffer); | 1208 ASSERT_TRUE(frame.stream_frame); |
| 1209 size_t consumed = frame.stream_frame->data.length(); |
| 1216 EXPECT_EQ(4u, consumed); | 1210 EXPECT_EQ(4u, consumed); |
| 1217 ASSERT_TRUE(frame.stream_frame); | |
| 1218 EXPECT_TRUE(creator_.AddSavedFrame(frame)); | |
| 1219 EXPECT_TRUE(creator_.HasPendingFrames()); | 1211 EXPECT_TRUE(creator_.HasPendingFrames()); |
| 1220 EXPECT_DFATAL(creator_.ResetFecGroup(), | 1212 EXPECT_DFATAL(creator_.ResetFecGroup(), |
| 1221 "Cannot reset FEC group with pending frames."); | 1213 "Cannot reset FEC group with pending frames."); |
| 1222 | 1214 |
| 1223 // Serialize packet for transmission. | 1215 // Serialize packet for transmission. |
| 1224 char buffer[kMaxPacketSize]; | 1216 char buffer[kMaxPacketSize]; |
| 1225 SerializedPacket serialized = | 1217 SerializedPacket serialized = |
| 1226 creator_.SerializePacket(buffer, kMaxPacketSize); | 1218 creator_.SerializePacket(buffer, kMaxPacketSize); |
| 1227 delete serialized.packet; | 1219 delete serialized.packet; |
| 1228 delete serialized.retransmittable_frames; | 1220 delete serialized.retransmittable_frames; |
| 1229 EXPECT_FALSE(creator_.HasPendingFrames()); | 1221 EXPECT_FALSE(creator_.HasPendingFrames()); |
| 1230 | 1222 |
| 1231 // Close the FEC Group. | 1223 // Close the FEC Group. |
| 1232 creator_.ResetFecGroup(); | 1224 creator_.ResetFecGroup(); |
| 1233 EXPECT_FALSE(creator_.IsFecGroupOpen()); | 1225 EXPECT_FALSE(creator_.IsFecGroupOpen()); |
| 1234 } | 1226 } |
| 1235 | 1227 |
| 1236 } // namespace | 1228 } // namespace |
| 1237 } // namespace test | 1229 } // namespace test |
| 1238 } // namespace net | 1230 } // namespace net |
| OLD | NEW |