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

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

Issue 300623009: Fixes bugs in packet size computation in the creator and in the framer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 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_framer.cc ('k') | net/quic/quic_packet_creator.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_framer.h" 5 #include "net/quic/quic_framer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 1732 matching lines...) Expand 10 before | Expand all | Expand 10 after
1743 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; 1743 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize;
1744 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + 1744 const size_t kReceivedEntropyOffset = kLeastUnackedOffset +
1745 PACKET_6BYTE_SEQUENCE_NUMBER; 1745 PACKET_6BYTE_SEQUENCE_NUMBER;
1746 const size_t kLargestObservedOffset = kReceivedEntropyOffset + 1746 const size_t kLargestObservedOffset = kReceivedEntropyOffset +
1747 kQuicEntropyHashSize; 1747 kQuicEntropyHashSize;
1748 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + 1748 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset +
1749 PACKET_6BYTE_SEQUENCE_NUMBER; 1749 PACKET_6BYTE_SEQUENCE_NUMBER;
1750 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + 1750 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset +
1751 kQuicDeltaTimeLargestObservedSize; 1751 kQuicDeltaTimeLargestObservedSize;
1752 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + 1752 const size_t kMissingPacketsOffset = kNumMissingPacketOffset +
1753 kNumberOfMissingPacketsSize; 1753 kNumberOfNackRangesSize;
1754 const size_t kMissingPacketsRange = kMissingPacketsOffset + 1754 const size_t kMissingPacketsRange = kMissingPacketsOffset +
1755 PACKET_1BYTE_SEQUENCE_NUMBER; 1755 PACKET_1BYTE_SEQUENCE_NUMBER;
1756 const size_t kRevivedPacketsLength = kMissingPacketsRange + 1756 const size_t kRevivedPacketsLength = kMissingPacketsRange +
1757 PACKET_1BYTE_SEQUENCE_NUMBER; 1757 PACKET_1BYTE_SEQUENCE_NUMBER;
1758 // Now test framing boundaries 1758 // Now test framing boundaries
1759 const size_t ack_frame_size = kRevivedPacketsLength + 1759 const size_t ack_frame_size = kRevivedPacketsLength +
1760 PACKET_1BYTE_SEQUENCE_NUMBER; 1760 PACKET_1BYTE_SEQUENCE_NUMBER;
1761 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { 1761 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) {
1762 string expected_error; 1762 string expected_error;
1763 if (i < kLeastUnackedOffset) { 1763 if (i < kLeastUnackedOffset) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1842 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); 1842 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter);
1843 1843
1844 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; 1844 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize;
1845 const size_t kLargestObservedOffset = kReceivedEntropyOffset + 1845 const size_t kLargestObservedOffset = kReceivedEntropyOffset +
1846 kQuicEntropyHashSize; 1846 kQuicEntropyHashSize;
1847 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + 1847 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset +
1848 PACKET_6BYTE_SEQUENCE_NUMBER; 1848 PACKET_6BYTE_SEQUENCE_NUMBER;
1849 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + 1849 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset +
1850 kQuicDeltaTimeLargestObservedSize; 1850 kQuicDeltaTimeLargestObservedSize;
1851 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + 1851 const size_t kMissingPacketsOffset = kNumMissingPacketOffset +
1852 kNumberOfMissingPacketsSize; 1852 kNumberOfNackRangesSize;
1853 const size_t kMissingPacketsRange = kMissingPacketsOffset + 1853 const size_t kMissingPacketsRange = kMissingPacketsOffset +
1854 PACKET_1BYTE_SEQUENCE_NUMBER; 1854 PACKET_1BYTE_SEQUENCE_NUMBER;
1855 const size_t kRevivedPacketsLength = kMissingPacketsRange + 1855 const size_t kRevivedPacketsLength = kMissingPacketsRange +
1856 PACKET_1BYTE_SEQUENCE_NUMBER; 1856 PACKET_1BYTE_SEQUENCE_NUMBER;
1857 // Now test framing boundaries 1857 // Now test framing boundaries
1858 const size_t ack_frame_size = kRevivedPacketsLength + 1858 const size_t ack_frame_size = kRevivedPacketsLength +
1859 PACKET_1BYTE_SEQUENCE_NUMBER; 1859 PACKET_1BYTE_SEQUENCE_NUMBER;
1860 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { 1860 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) {
1861 string expected_error; 1861 string expected_error;
1862 if (i < kLargestObservedOffset) { 1862 if (i < kLargestObservedOffset) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1940 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); 1940 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter);
1941 1941
1942 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; 1942 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize;
1943 const size_t kLargestObservedOffset = kReceivedEntropyOffset + 1943 const size_t kLargestObservedOffset = kReceivedEntropyOffset +
1944 kQuicEntropyHashSize; 1944 kQuicEntropyHashSize;
1945 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + 1945 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset +
1946 PACKET_6BYTE_SEQUENCE_NUMBER; 1946 PACKET_6BYTE_SEQUENCE_NUMBER;
1947 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + 1947 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset +
1948 kQuicDeltaTimeLargestObservedSize; 1948 kQuicDeltaTimeLargestObservedSize;
1949 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + 1949 const size_t kMissingPacketsOffset = kNumMissingPacketOffset +
1950 kNumberOfMissingPacketsSize; 1950 kNumberOfNackRangesSize;
1951 const size_t kMissingPacketsRange = kMissingPacketsOffset + 1951 const size_t kMissingPacketsRange = kMissingPacketsOffset +
1952 PACKET_1BYTE_SEQUENCE_NUMBER; 1952 PACKET_1BYTE_SEQUENCE_NUMBER;
1953 const size_t kRevivedPacketsLength = kMissingPacketsRange + 1953 const size_t kRevivedPacketsLength = kMissingPacketsRange +
1954 PACKET_1BYTE_SEQUENCE_NUMBER; 1954 PACKET_1BYTE_SEQUENCE_NUMBER;
1955 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength + 1955 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength +
1956 PACKET_1BYTE_SEQUENCE_NUMBER; 1956 PACKET_1BYTE_SEQUENCE_NUMBER;
1957 // Now test framing boundaries 1957 // Now test framing boundaries
1958 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength + 1958 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength +
1959 PACKET_6BYTE_SEQUENCE_NUMBER; 1959 PACKET_6BYTE_SEQUENCE_NUMBER;
1960 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { 1960 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) {
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
2054 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; 2054 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize;
2055 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + 2055 const size_t kReceivedEntropyOffset = kLeastUnackedOffset +
2056 PACKET_6BYTE_SEQUENCE_NUMBER; 2056 PACKET_6BYTE_SEQUENCE_NUMBER;
2057 const size_t kLargestObservedOffset = kReceivedEntropyOffset + 2057 const size_t kLargestObservedOffset = kReceivedEntropyOffset +
2058 kQuicEntropyHashSize; 2058 kQuicEntropyHashSize;
2059 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + 2059 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset +
2060 PACKET_6BYTE_SEQUENCE_NUMBER; 2060 PACKET_6BYTE_SEQUENCE_NUMBER;
2061 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + 2061 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset +
2062 kQuicDeltaTimeLargestObservedSize; 2062 kQuicDeltaTimeLargestObservedSize;
2063 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + 2063 const size_t kMissingPacketsOffset = kNumMissingPacketOffset +
2064 kNumberOfMissingPacketsSize; 2064 kNumberOfNackRangesSize;
2065 const size_t kMissingPacketsRange = kMissingPacketsOffset + 2065 const size_t kMissingPacketsRange = kMissingPacketsOffset +
2066 PACKET_1BYTE_SEQUENCE_NUMBER; 2066 PACKET_1BYTE_SEQUENCE_NUMBER;
2067 const size_t kRevivedPacketsLength = kMissingPacketsRange + 2067 const size_t kRevivedPacketsLength = kMissingPacketsRange +
2068 PACKET_1BYTE_SEQUENCE_NUMBER; 2068 PACKET_1BYTE_SEQUENCE_NUMBER;
2069 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength + 2069 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength +
2070 PACKET_1BYTE_SEQUENCE_NUMBER; 2070 PACKET_1BYTE_SEQUENCE_NUMBER;
2071 // Now test framing boundaries 2071 // Now test framing boundaries
2072 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength + 2072 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength +
2073 PACKET_6BYTE_SEQUENCE_NUMBER; 2073 PACKET_6BYTE_SEQUENCE_NUMBER;
2074 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { 2074 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) {
(...skipping 1640 matching lines...) Expand 10 before | Expand all | Expand 10 after
3715 3715
3716 scoped_ptr<QuicPacket> data( 3716 scoped_ptr<QuicPacket> data(
3717 framer_.BuildUnsizedDataPacket(header, frames).packet); 3717 framer_.BuildUnsizedDataPacket(header, frames).packet);
3718 ASSERT_TRUE(data != NULL); 3718 ASSERT_TRUE(data != NULL);
3719 3719
3720 test::CompareCharArraysWithHexError("constructed packet", 3720 test::CompareCharArraysWithHexError("constructed packet",
3721 data->data(), data->length(), 3721 data->data(), data->length(),
3722 AsChars(packet), arraysize(packet)); 3722 AsChars(packet), arraysize(packet));
3723 } 3723 }
3724 3724
3725 // TODO(jri): Add test for tuncated packets in which the original ack frame had
3726 // revived packets. (In both the large and small packet cases below).
3727 TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacket) {
3728 if (version_ <= QUIC_VERSION_15) {
3729 return;
3730 }
3731 QuicPacketHeader header;
3732 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210);
3733 header.public_header.reset_flag = false;
3734 header.public_header.version_flag = false;
3735 header.fec_flag = false;
3736 header.entropy_flag = true;
3737 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8);
3738 header.fec_group = 0;
3739
3740 QuicAckFrame ack_frame;
3741 // This entropy hash is different from what shows up in the packet below,
3742 // since entropy is recomputed by the framer on ack truncation (by
3743 // TestEntropyCalculator for this test.)
3744 ack_frame.received_info.entropy_hash = 0x43;
3745 ack_frame.received_info.largest_observed = 2 * 300;
3746 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero();
3747 for (size_t i = 1; i < 2 * 300; i += 2) {
3748 ack_frame.received_info.missing_packets.insert(i);
3749 }
3750
3751 QuicFrames frames;
3752 frames.push_back(QuicFrame(&ack_frame));
3753
3754 unsigned char packet[] = {
3755 // public flags (8 byte connection_id)
3756 0x3C,
3757 // connection_id
3758 0x10, 0x32, 0x54, 0x76,
3759 0x98, 0xBA, 0xDC, 0xFE,
3760 // packet sequence number
3761 0xA8, 0x9A, 0x78, 0x56,
3762 0x34, 0x12,
3763 // private flags (entropy)
3764 0x01,
3765
3766 // frame type (ack frame)
3767 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta)
3768 0x74,
3769 // entropy hash of all received packets, set to 1 by TestEntropyCalculator
3770 // since ack is truncated.
3771 0x01,
3772 // 2-byte largest observed packet sequence number.
3773 // Expected to be 510 (0x1FE), since only 255 nack ranges can fit.
3774 0xFE, 0x01,
3775 // Zero delta time.
3776 0x0, 0x0,
3777 // num missing packet ranges (limited to 255 by size of this field).
3778 0xFF,
3779 // {missing packet delta, further missing packets in range}
3780 // 6 nack ranges x 42 + 3 nack ranges
3781 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3782 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3783 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3784 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3785 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3786 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3787 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3788 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3789 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3790 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3791
3792 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3793 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3794 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3795 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3796 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3797 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3798 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3799 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3800 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3801 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3802
3803 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3804 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3805 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3806 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3807 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3808 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3809 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3810 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3811 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3812 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3813
3814 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3815 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3816 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3817 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3818 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3819 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3820 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3821 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3822 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3823 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3824
3825 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3826 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3827 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3828
3829 // 0 revived packets.
3830 0x00,
3831 };
3832
3833 scoped_ptr<QuicPacket> data(
3834 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet);
3835 ASSERT_TRUE(data != NULL);
3836
3837 test::CompareCharArraysWithHexError("constructed packet",
3838 data->data(), data->length(),
3839 AsChars(packet), arraysize(packet));
3840 }
3841
3842
3843 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) {
3844 if (version_ <= QUIC_VERSION_15) {
3845 return;
3846 }
3847 QuicPacketHeader header;
3848 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210);
3849 header.public_header.reset_flag = false;
3850 header.public_header.version_flag = false;
3851 header.fec_flag = false;
3852 header.entropy_flag = true;
3853 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8);
3854 header.fec_group = 0;
3855
3856 QuicAckFrame ack_frame;
3857 // This entropy hash is different from what shows up in the packet below,
3858 // since entropy is recomputed by the framer on ack truncation (by
3859 // TestEntropyCalculator for this test.)
3860 ack_frame.received_info.entropy_hash = 0x43;
3861 ack_frame.received_info.largest_observed = 2 * 300;
3862 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero();
3863 for (size_t i = 1; i < 2 * 300; i += 2) {
3864 ack_frame.received_info.missing_packets.insert(i);
3865 }
3866
3867 QuicFrames frames;
3868 frames.push_back(QuicFrame(&ack_frame));
3869
3870 unsigned char packet[] = {
3871 // public flags (8 byte connection_id)
3872 0x3C,
3873 // connection_id
3874 0x10, 0x32, 0x54, 0x76,
3875 0x98, 0xBA, 0xDC, 0xFE,
3876 // packet sequence number
3877 0xA8, 0x9A, 0x78, 0x56,
3878 0x34, 0x12,
3879 // private flags (entropy)
3880 0x01,
3881
3882 // frame type (ack frame)
3883 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta)
3884 0x74,
3885 // entropy hash of all received packets, set to 1 by TestEntropyCalculator
3886 // since ack is truncated.
3887 0x01,
3888 // 2-byte largest observed packet sequence number.
3889 // Expected to be 12 (0x0C), since only 6 nack ranges can fit.
3890 0x0C, 0x00,
3891 // Zero delta time.
3892 0x0, 0x0,
3893 // num missing packet ranges (limited to 6 by packet size of 37).
3894 0x06,
3895 // {missing packet delta, further missing packets in range}
3896 // 6 nack ranges
3897 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3898 // 0 revived packets.
3899 0x00,
3900 };
3901
3902 scoped_ptr<QuicPacket> data(
3903 framer_.BuildDataPacket(header, frames, 37u).packet);
3904 ASSERT_TRUE(data != NULL);
3905 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks.
3906 EXPECT_EQ(36u, data->length());
3907 test::CompareCharArraysWithHexError("constructed packet",
3908 data->data(), data->length(),
3909 AsChars(packet), arraysize(packet));
3910 }
3911
3725 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCP) { 3912 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCP) {
3726 QuicPacketHeader header; 3913 QuicPacketHeader header;
3727 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); 3914 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210);
3728 header.public_header.reset_flag = false; 3915 header.public_header.reset_flag = false;
3729 header.public_header.version_flag = false; 3916 header.public_header.version_flag = false;
3730 header.fec_flag = false; 3917 header.fec_flag = false;
3731 header.entropy_flag = false; 3918 header.entropy_flag = false;
3732 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 3919 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
3733 header.fec_group = 0; 3920 header.fec_group = 0;
3734 3921
(...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after
4463 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, 4650 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false,
4464 PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, 4651 PACKET_8BYTE_CONNECTION_ID, kIncludeVersion,
4465 PACKET_6BYTE_SEQUENCE_NUMBER)); 4652 PACKET_6BYTE_SEQUENCE_NUMBER));
4466 scoped_ptr<QuicEncryptedPacket> encrypted( 4653 scoped_ptr<QuicEncryptedPacket> encrypted(
4467 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); 4654 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw));
4468 4655
4469 ASSERT_TRUE(encrypted.get() != NULL); 4656 ASSERT_TRUE(encrypted.get() != NULL);
4470 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); 4657 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get()));
4471 } 4658 }
4472 4659
4473 TEST_P(QuicFramerTest, Truncation) { 4660 TEST_P(QuicFramerTest, AckTruncationLargePacket) {
4474 if (framer_.version() <= QUIC_VERSION_15) { 4661 if (framer_.version() <= QUIC_VERSION_15) {
4475 return; 4662 return;
4476 } 4663 }
4477 QuicPacketHeader header; 4664 QuicPacketHeader header;
4478 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); 4665 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210);
4479 header.public_header.reset_flag = false; 4666 header.public_header.reset_flag = false;
4480 header.public_header.version_flag = false; 4667 header.public_header.version_flag = false;
4481 header.fec_flag = false; 4668 header.fec_flag = false;
4482 header.entropy_flag = false; 4669 header.entropy_flag = false;
4483 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 4670 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
4484 header.fec_group = 0; 4671 header.fec_group = 0;
4485 4672
4486 QuicAckFrame ack_frame; 4673 // Create a packet with just the ack.
4487 ack_frame.received_info.largest_observed = 601; 4674 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u);
4488 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) {
4489 ack_frame.received_info.missing_packets.insert(i);
4490 }
4491
4492 // Create a packet with just the ack
4493 QuicFrame frame; 4675 QuicFrame frame;
4494 frame.type = ACK_FRAME; 4676 frame.type = ACK_FRAME;
4495 frame.ack_frame = &ack_frame; 4677 frame.ack_frame = &ack_frame;
4496 QuicFrames frames; 4678 QuicFrames frames;
4497 frames.push_back(frame); 4679 frames.push_back(frame);
4498 4680
4681 // Build an ack packet with truncation due to limit in number of nack ranges.
4499 scoped_ptr<QuicPacket> raw_ack_packet( 4682 scoped_ptr<QuicPacket> raw_ack_packet(
4500 framer_.BuildUnsizedDataPacket(header, frames).packet); 4683 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet);
4501 ASSERT_TRUE(raw_ack_packet != NULL); 4684 ASSERT_TRUE(raw_ack_packet != NULL);
4502
4503 scoped_ptr<QuicEncryptedPacket> ack_packet( 4685 scoped_ptr<QuicEncryptedPacket> ack_packet(
4504 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, 4686 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number,
4505 *raw_ack_packet)); 4687 *raw_ack_packet));
4506 4688 // Now make sure we can turn our ack packet back into an ack frame.
4507 // Now make sure we can turn our ack packet back into an ack frame
4508 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); 4689 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet));
4509 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 4690 ASSERT_EQ(1u, visitor_.ack_frames_.size());
4510 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; 4691 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
4511 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); 4692 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated);
4512 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); 4693 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed);
4513 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); 4694 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size());
4514 SequenceNumberSet::const_iterator missing_iter = 4695 SequenceNumberSet::const_iterator missing_iter =
4515 processed_ack_frame.received_info.missing_packets.begin(); 4696 processed_ack_frame.received_info.missing_packets.begin();
4516 EXPECT_EQ(1u, *missing_iter); 4697 EXPECT_EQ(1u, *missing_iter);
4517 SequenceNumberSet::const_reverse_iterator last_missing_iter = 4698 SequenceNumberSet::const_reverse_iterator last_missing_iter =
4518 processed_ack_frame.received_info.missing_packets.rbegin(); 4699 processed_ack_frame.received_info.missing_packets.rbegin();
4519 EXPECT_EQ(509u, *last_missing_iter); 4700 EXPECT_EQ(509u, *last_missing_iter);
4520 } 4701 }
4521 4702
4703 TEST_P(QuicFramerTest, AckTruncationSmallPacket) {
4704 if (framer_.version() <= QUIC_VERSION_15) {
4705 return;
4706 }
4707 QuicPacketHeader header;
4708 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210);
4709 header.public_header.reset_flag = false;
4710 header.public_header.version_flag = false;
4711 header.fec_flag = false;
4712 header.entropy_flag = false;
4713 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
4714 header.fec_group = 0;
4715
4716 // Create a packet with just the ack.
4717 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u);
4718 QuicFrame frame;
4719 frame.type = ACK_FRAME;
4720 frame.ack_frame = &ack_frame;
4721 QuicFrames frames;
4722 frames.push_back(frame);
4723
4724 // Build an ack packet with truncation due to limit in number of nack ranges.
4725 scoped_ptr<QuicPacket> raw_ack_packet(
4726 framer_.BuildDataPacket(header, frames, 500).packet);
4727 ASSERT_TRUE(raw_ack_packet != NULL);
4728 scoped_ptr<QuicEncryptedPacket> ack_packet(
4729 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number,
4730 *raw_ack_packet));
4731 // Now make sure we can turn our ack packet back into an ack frame.
4732 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet));
4733 ASSERT_EQ(1u, visitor_.ack_frames_.size());
4734 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
4735 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated);
4736 EXPECT_EQ(476u, processed_ack_frame.received_info.largest_observed);
4737 ASSERT_EQ(238u, processed_ack_frame.received_info.missing_packets.size());
4738 SequenceNumberSet::const_iterator missing_iter =
4739 processed_ack_frame.received_info.missing_packets.begin();
4740 EXPECT_EQ(1u, *missing_iter);
4741 SequenceNumberSet::const_reverse_iterator last_missing_iter =
4742 processed_ack_frame.received_info.missing_packets.rbegin();
4743 EXPECT_EQ(475u, *last_missing_iter);
4744 }
4745
4522 TEST_P(QuicFramerTest, Truncation15) { 4746 TEST_P(QuicFramerTest, Truncation15) {
4523 if (framer_.version() > QUIC_VERSION_15) { 4747 if (framer_.version() > QUIC_VERSION_15) {
4524 return; 4748 return;
4525 } 4749 }
4526 QuicPacketHeader header; 4750 QuicPacketHeader header;
4527 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); 4751 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210);
4528 header.public_header.reset_flag = false; 4752 header.public_header.reset_flag = false;
4529 header.public_header.version_flag = false; 4753 header.public_header.version_flag = false;
4530 header.fec_flag = false; 4754 header.fec_flag = false;
4531 header.entropy_flag = false; 4755 header.entropy_flag = false;
4532 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 4756 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
4533 header.fec_group = 0; 4757 header.fec_group = 0;
4534 4758
4535 QuicAckFrame ack_frame; 4759 QuicAckFrame ack_frame;
4536 ack_frame.received_info.largest_observed = 601; 4760 ack_frame.received_info.largest_observed = 601;
4537 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 1; 4761 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 1;
4538 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) { 4762 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) {
4539 ack_frame.received_info.missing_packets.insert(i); 4763 ack_frame.received_info.missing_packets.insert(i);
4540 } 4764 }
4541 4765
4542 // Create a packet with just the ack 4766 // Create a packet with just the ack.
4543 QuicFrame frame; 4767 QuicFrame frame;
4544 frame.type = ACK_FRAME; 4768 frame.type = ACK_FRAME;
4545 frame.ack_frame = &ack_frame; 4769 frame.ack_frame = &ack_frame;
4546 QuicFrames frames; 4770 QuicFrames frames;
4547 frames.push_back(frame); 4771 frames.push_back(frame);
4548 4772
4549 scoped_ptr<QuicPacket> raw_ack_packet( 4773 scoped_ptr<QuicPacket> raw_ack_packet(
4550 framer_.BuildUnsizedDataPacket(header, frames).packet); 4774 framer_.BuildUnsizedDataPacket(header, frames).packet);
4551 ASSERT_TRUE(raw_ack_packet != NULL); 4775 ASSERT_TRUE(raw_ack_packet != NULL);
4552 4776
4553 scoped_ptr<QuicEncryptedPacket> ack_packet( 4777 scoped_ptr<QuicEncryptedPacket> ack_packet(
4554 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, 4778 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number,
4555 *raw_ack_packet)); 4779 *raw_ack_packet));
4556 4780
4557 // Now make sure we can turn our ack packet back into an ack frame 4781 // Now make sure we can turn our ack packet back into an ack frame.
4558 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); 4782 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet));
4559 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 4783 ASSERT_EQ(1u, visitor_.ack_frames_.size());
4560 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; 4784 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
4561 EXPECT_EQ(header.packet_sequence_number - 1, 4785 EXPECT_EQ(header.packet_sequence_number - 1,
4562 processed_ack_frame.sent_info.least_unacked); 4786 processed_ack_frame.sent_info.least_unacked);
4563 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); 4787 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated);
4564 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); 4788 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed);
4565 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); 4789 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size());
4566 SequenceNumberSet::const_iterator missing_iter = 4790 SequenceNumberSet::const_iterator missing_iter =
4567 processed_ack_frame.received_info.missing_packets.begin(); 4791 processed_ack_frame.received_info.missing_packets.begin();
(...skipping 13 matching lines...) Expand all
4581 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 4805 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
4582 header.fec_group = 0; 4806 header.fec_group = 0;
4583 4807
4584 QuicAckFrame ack_frame; 4808 QuicAckFrame ack_frame;
4585 ack_frame.received_info.largest_observed = 201; 4809 ack_frame.received_info.largest_observed = 201;
4586 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 2; 4810 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 2;
4587 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; ++i) { 4811 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; ++i) {
4588 ack_frame.received_info.missing_packets.insert(i); 4812 ack_frame.received_info.missing_packets.insert(i);
4589 } 4813 }
4590 4814
4591 // Create a packet with just the ack 4815 // Create a packet with just the ack.
4592 QuicFrame frame; 4816 QuicFrame frame;
4593 frame.type = ACK_FRAME; 4817 frame.type = ACK_FRAME;
4594 frame.ack_frame = &ack_frame; 4818 frame.ack_frame = &ack_frame;
4595 QuicFrames frames; 4819 QuicFrames frames;
4596 frames.push_back(frame); 4820 frames.push_back(frame);
4597 4821
4598 scoped_ptr<QuicPacket> raw_ack_packet( 4822 scoped_ptr<QuicPacket> raw_ack_packet(
4599 framer_.BuildUnsizedDataPacket(header, frames).packet); 4823 framer_.BuildUnsizedDataPacket(header, frames).packet);
4600 ASSERT_TRUE(raw_ack_packet != NULL); 4824 ASSERT_TRUE(raw_ack_packet != NULL);
4601 4825
4602 scoped_ptr<QuicEncryptedPacket> ack_packet( 4826 scoped_ptr<QuicEncryptedPacket> ack_packet(
4603 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, 4827 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number,
4604 *raw_ack_packet)); 4828 *raw_ack_packet));
4605 4829
4606 // Now make sure we can turn our ack packet back into an ack frame 4830 // Now make sure we can turn our ack packet back into an ack frame.
4607 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); 4831 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet));
4608 4832
4609 // Test for clean truncation of the ack by comparing the length of the 4833 // Test for clean truncation of the ack by comparing the length of the
4610 // original packets to the re-serialized packets. 4834 // original packets to the re-serialized packets.
4611 frames.clear(); 4835 frames.clear();
4612 frame.type = ACK_FRAME; 4836 frame.type = ACK_FRAME;
4613 frame.ack_frame = visitor_.ack_frames_[0]; 4837 frame.ack_frame = visitor_.ack_frames_[0];
4614 frames.push_back(frame); 4838 frames.push_back(frame);
4615 4839
4616 size_t original_raw_length = raw_ack_packet->length(); 4840 size_t original_raw_length = raw_ack_packet->length();
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
4748 EXPECT_CALL(visitor, OnPacketComplete()); 4972 EXPECT_CALL(visitor, OnPacketComplete());
4749 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); 4973 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true));
4750 4974
4751 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 4975 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
4752 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 4976 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4753 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 4977 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4754 } 4978 }
4755 4979
4756 } // namespace test 4980 } // namespace test
4757 } // namespace net 4981 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_framer.cc ('k') | net/quic/quic_packet_creator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698