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

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

Issue 157803007: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: win_x64 compiler error fix Created 6 years, 10 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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 return GetPrivateFlagsOffset(PACKET_8BYTE_GUID, include_version) + 87 return GetPrivateFlagsOffset(PACKET_8BYTE_GUID, include_version) +
88 kPrivateFlagsSize; 88 kPrivateFlagsSize;
89 } 89 }
90 90
91 size_t GetFecGroupOffset(bool include_version, 91 size_t GetFecGroupOffset(bool include_version,
92 QuicSequenceNumberLength sequence_number_length) { 92 QuicSequenceNumberLength sequence_number_length) {
93 return GetPrivateFlagsOffset(include_version, sequence_number_length) + 93 return GetPrivateFlagsOffset(include_version, sequence_number_length) +
94 kPrivateFlagsSize; 94 kPrivateFlagsSize;
95 } 95 }
96 96
97 // Index into the message tag of the public reset packet.
98 // Public resets always have full guids.
99 const size_t kPublicResetPacketMessageTagOffset =
100 kGuidOffset + PACKET_8BYTE_GUID;
101
102 // TODO(wtc): remove this when we drop support for QUIC_VERSION_13.
97 // Index into the nonce proof of the public reset packet. 103 // Index into the nonce proof of the public reset packet.
98 // Public resets always have full guids. 104 // Public resets always have full guids.
99 const size_t kPublicResetPacketNonceProofOffset = 105 const size_t kPublicResetPacketNonceProofOffset =
100 kGuidOffset + PACKET_8BYTE_GUID; 106 kGuidOffset + PACKET_8BYTE_GUID;
101 107
108 // TODO(wtc): remove this when we drop support for QUIC_VERSION_13.
102 // Index into the rejected sequence number of the public reset packet. 109 // Index into the rejected sequence number of the public reset packet.
103 const size_t kPublicResetPacketRejectedSequenceNumberOffset = 110 const size_t kPublicResetPacketRejectedSequenceNumberOffset =
104 kPublicResetPacketNonceProofOffset + kPublicResetNonceSize; 111 kPublicResetPacketNonceProofOffset + kPublicResetNonceSize;
105 112
106 // TODO(wtc): remove this when we drop support for QUIC_VERSION_13.
107 // Size of the old-style public reset packet.
108 const size_t kPublicResetPacketOldSize =
109 kPublicResetPacketRejectedSequenceNumberOffset +
110 PACKET_6BYTE_SEQUENCE_NUMBER;
111
112 class TestEncrypter : public QuicEncrypter { 113 class TestEncrypter : public QuicEncrypter {
113 public: 114 public:
114 virtual ~TestEncrypter() {} 115 virtual ~TestEncrypter() {}
115 virtual bool SetKey(StringPiece key) OVERRIDE { 116 virtual bool SetKey(StringPiece key) OVERRIDE {
116 return true; 117 return true;
117 } 118 }
118 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { 119 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE {
119 return true; 120 return true;
120 } 121 }
121 virtual bool Encrypt(StringPiece nonce, 122 virtual bool Encrypt(StringPiece nonce,
(...skipping 1527 matching lines...) Expand 10 before | Expand all | Expand 10 after
1649 1650
1650 ASSERT_EQ(1u, visitor_.stream_frames_.size()); 1651 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1651 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1652 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1652 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); 1653 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id);
1653 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); 1654 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1654 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), 1655 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654),
1655 visitor_.stream_frames_[0]->offset); 1656 visitor_.stream_frames_[0]->offset);
1656 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); 1657 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]);
1657 } 1658 }
1658 1659
1659 TEST_P(QuicFramerTest, AckFrame) { 1660 TEST_P(QuicFramerTest, AckFrameV14) {
1661 if (framer_.version() > QUIC_VERSION_14) {
1662 return;
1663 }
1664
1660 unsigned char packet[] = { 1665 unsigned char packet[] = {
1661 // public flags (8 byte guid) 1666 // public flags (8 byte guid)
1662 0x3C, 1667 0x3C,
1663 // guid 1668 // guid
1664 0x10, 0x32, 0x54, 0x76, 1669 0x10, 0x32, 0x54, 0x76,
1665 0x98, 0xBA, 0xDC, 0xFE, 1670 0x98, 0xBA, 0xDC, 0xFE,
1666 // packet sequence number 1671 // packet sequence number
1667 0xA8, 0x9A, 0x78, 0x56, 1672 0xA8, 0x9A, 0x78, 0x56,
1668 0x34, 0x12, 1673 0x34, 0x12,
1669 // private flags (entropy) 1674 // private flags (entropy)
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1748 expected_error = "Unable to read missing sequence number range."; 1753 expected_error = "Unable to read missing sequence number range.";
1749 } 1754 }
1750 CheckProcessingFails( 1755 CheckProcessingFails(
1751 packet, 1756 packet,
1752 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 1757 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
1753 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 1758 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
1754 expected_error, QUIC_INVALID_ACK_DATA); 1759 expected_error, QUIC_INVALID_ACK_DATA);
1755 } 1760 }
1756 } 1761 }
1757 1762
1763 TEST_P(QuicFramerTest, AckFrame) {
1764 if (framer_.version() <= QUIC_VERSION_14) {
1765 return;
1766 }
1767
1768 unsigned char packet[] = {
1769 // public flags (8 byte guid)
1770 0x3C,
1771 // guid
1772 0x10, 0x32, 0x54, 0x76,
1773 0x98, 0xBA, 0xDC, 0xFE,
1774 // packet sequence number
1775 0xA8, 0x9A, 0x78, 0x56,
1776 0x34, 0x12,
1777 // private flags (entropy)
1778 0x01,
1779
1780 // frame type (ack frame)
1781 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta)
1782 0x6C,
1783 // entropy hash of sent packets till least awaiting - 1.
1784 0xAB,
1785 // least packet sequence number awaiting an ack, delta from sequence number.
1786 0x08, 0x00, 0x00, 0x00,
1787 0x00, 0x00,
1788 // entropy hash of all received packets.
1789 0xBA,
1790 // largest observed packet sequence number
1791 0xBF, 0x9A, 0x78, 0x56,
1792 0x34, 0x12,
1793 // Zero delta time.
1794 0x0, 0x0,
1795 // num missing packets
1796 0x01,
1797 // missing packet delta
1798 0x01,
1799 // 0 more missing packets in range.
1800 0x00,
1801 // Number of revived packets.
1802 0x00,
1803 };
1804
1805 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1806 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1807
1808 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1809 ASSERT_TRUE(visitor_.header_.get());
1810 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion));
1811
1812 EXPECT_EQ(0u, visitor_.stream_frames_.size());
1813 ASSERT_EQ(1u, visitor_.ack_frames_.size());
1814 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
1815 EXPECT_EQ(0xAB, frame.sent_info.entropy_hash);
1816 EXPECT_EQ(0xBA, frame.received_info.entropy_hash);
1817 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed);
1818 ASSERT_EQ(1u, frame.received_info.missing_packets.size());
1819 SequenceNumberSet::const_iterator missing_iter =
1820 frame.received_info.missing_packets.begin();
1821 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter);
1822 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked);
1823
1824 const size_t kSentEntropyOffset = kQuicFrameTypeSize;
1825 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize;
1826 const size_t kReceivedEntropyOffset = kLeastUnackedOffset +
1827 PACKET_6BYTE_SEQUENCE_NUMBER;
1828 const size_t kLargestObservedOffset = kReceivedEntropyOffset +
1829 kQuicEntropyHashSize;
1830 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset +
1831 PACKET_6BYTE_SEQUENCE_NUMBER;
1832 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset +
1833 kQuicDeltaTimeLargestObservedSize;
1834 const size_t kMissingPacketsOffset = kNumMissingPacketOffset +
1835 kNumberOfMissingPacketsSize;
1836 const size_t kMissingPacketsRange = kMissingPacketsOffset +
1837 PACKET_1BYTE_SEQUENCE_NUMBER;
1838 const size_t kRevivedPacketsLength = kMissingPacketsRange +
1839 PACKET_1BYTE_SEQUENCE_NUMBER;
1840 // Now test framing boundaries
1841 const size_t ack_frame_size = kRevivedPacketsLength +
1842 PACKET_1BYTE_SEQUENCE_NUMBER;
1843 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) {
1844 string expected_error;
1845 if (i < kLeastUnackedOffset) {
1846 expected_error = "Unable to read entropy hash for sent packets.";
1847 } else if (i < kReceivedEntropyOffset) {
1848 expected_error = "Unable to read least unacked delta.";
1849 } else if (i < kLargestObservedOffset) {
1850 expected_error = "Unable to read entropy hash for received packets.";
1851 } else if (i < kMissingDeltaTimeOffset) {
1852 expected_error = "Unable to read largest observed.";
1853 } else if (i < kNumMissingPacketOffset) {
1854 expected_error = "Unable to read delta time largest observed.";
1855 } else if (i < kMissingPacketsOffset) {
1856 expected_error = "Unable to read num missing packet ranges.";
1857 } else if (i < kMissingPacketsRange) {
1858 expected_error = "Unable to read missing sequence number delta.";
1859 } else if (i < kRevivedPacketsLength) {
1860 expected_error = "Unable to read missing sequence number range.";
1861 } else {
1862 expected_error = "Unable to read num revived packets.";
1863 }
1864 CheckProcessingFails(
1865 packet,
1866 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
1867 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
1868 expected_error, QUIC_INVALID_ACK_DATA);
1869 }
1870 }
1871
1872 TEST_P(QuicFramerTest, AckFrameRevivedPackets) {
1873 if (framer_.version() <= QUIC_VERSION_14) {
1874 return;
1875 }
1876
1877 unsigned char packet[] = {
1878 // public flags (8 byte guid)
1879 0x3C,
1880 // guid
1881 0x10, 0x32, 0x54, 0x76,
1882 0x98, 0xBA, 0xDC, 0xFE,
1883 // packet sequence number
1884 0xA8, 0x9A, 0x78, 0x56,
1885 0x34, 0x12,
1886 // private flags (entropy)
1887 0x01,
1888
1889 // frame type (ack frame)
1890 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta)
1891 0x6C,
1892 // entropy hash of sent packets till least awaiting - 1.
1893 0xAB,
1894 // least packet sequence number awaiting an ack, delta from sequence number.
1895 0x08, 0x00, 0x00, 0x00,
1896 0x00, 0x00,
1897 // entropy hash of all received packets.
1898 0xBA,
1899 // largest observed packet sequence number
1900 0xBF, 0x9A, 0x78, 0x56,
1901 0x34, 0x12,
1902 // Zero delta time.
1903 0x0, 0x0,
1904 // num missing packets
1905 0x01,
1906 // missing packet delta
1907 0x01,
1908 // 0 more missing packets in range.
1909 0x00,
1910 // Number of revived packets.
1911 0x01,
1912 // Revived packet sequence number.
1913 0xBE, 0x9A, 0x78, 0x56,
1914 0x34, 0x12,
1915 };
1916
1917 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1918 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1919
1920 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1921 ASSERT_TRUE(visitor_.header_.get());
1922 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion));
1923
1924 EXPECT_EQ(0u, visitor_.stream_frames_.size());
1925 ASSERT_EQ(1u, visitor_.ack_frames_.size());
1926 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
1927 EXPECT_EQ(0xAB, frame.sent_info.entropy_hash);
1928 EXPECT_EQ(0xBA, frame.received_info.entropy_hash);
1929 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed);
1930 ASSERT_EQ(1u, frame.received_info.missing_packets.size());
1931 SequenceNumberSet::const_iterator missing_iter =
1932 frame.received_info.missing_packets.begin();
1933 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter);
1934 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked);
1935
1936 const size_t kSentEntropyOffset = kQuicFrameTypeSize;
1937 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize;
1938 const size_t kReceivedEntropyOffset = kLeastUnackedOffset +
1939 PACKET_6BYTE_SEQUENCE_NUMBER;
1940 const size_t kLargestObservedOffset = kReceivedEntropyOffset +
1941 kQuicEntropyHashSize;
1942 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset +
1943 PACKET_6BYTE_SEQUENCE_NUMBER;
1944 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset +
1945 kQuicDeltaTimeLargestObservedSize;
1946 const size_t kMissingPacketsOffset = kNumMissingPacketOffset +
1947 kNumberOfMissingPacketsSize;
1948 const size_t kMissingPacketsRange = kMissingPacketsOffset +
1949 PACKET_1BYTE_SEQUENCE_NUMBER;
1950 const size_t kRevivedPacketsLength = kMissingPacketsRange +
1951 PACKET_1BYTE_SEQUENCE_NUMBER;
1952 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength +
1953 PACKET_1BYTE_SEQUENCE_NUMBER;
1954 // Now test framing boundaries
1955 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength +
1956 PACKET_6BYTE_SEQUENCE_NUMBER;
1957 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) {
1958 string expected_error;
1959 if (i < kLeastUnackedOffset) {
1960 expected_error = "Unable to read entropy hash for sent packets.";
1961 } else if (i < kReceivedEntropyOffset) {
1962 expected_error = "Unable to read least unacked delta.";
1963 } else if (i < kLargestObservedOffset) {
1964 expected_error = "Unable to read entropy hash for received packets.";
1965 } else if (i < kMissingDeltaTimeOffset) {
1966 expected_error = "Unable to read largest observed.";
1967 } else if (i < kNumMissingPacketOffset) {
1968 expected_error = "Unable to read delta time largest observed.";
1969 } else if (i < kMissingPacketsOffset) {
1970 expected_error = "Unable to read num missing packet ranges.";
1971 } else if (i < kMissingPacketsRange) {
1972 expected_error = "Unable to read missing sequence number delta.";
1973 } else if (i < kRevivedPacketsLength) {
1974 expected_error = "Unable to read missing sequence number range.";
1975 } else if (i < kRevivedPacketSequenceNumberLength) {
1976 expected_error = "Unable to read num revived packets.";
1977 } else {
1978 expected_error = "Unable to read revived packet.";
1979 }
1980 CheckProcessingFails(
1981 packet,
1982 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
1983 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
1984 expected_error, QUIC_INVALID_ACK_DATA);
1985 }
1986 }
1987
1758 TEST_P(QuicFramerTest, AckFrameNoNacks) { 1988 TEST_P(QuicFramerTest, AckFrameNoNacks) {
1759 unsigned char packet[] = { 1989 unsigned char packet[] = {
1760 // public flags (8 byte guid) 1990 // public flags (8 byte guid)
1761 0x3C, 1991 0x3C,
1762 // guid 1992 // guid
1763 0x10, 0x32, 0x54, 0x76, 1993 0x10, 0x32, 0x54, 0x76,
1764 0x98, 0xBA, 0xDC, 0xFE, 1994 0x98, 0xBA, 0xDC, 0xFE,
1765 // packet sequence number 1995 // packet sequence number
1766 0xA8, 0x9A, 0x78, 0x56, 1996 0xA8, 0x9A, 0x78, 0x56,
1767 0x34, 0x12, 1997 0x34, 0x12,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1808 scoped_ptr<QuicPacket> data( 2038 scoped_ptr<QuicPacket> data(
1809 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); 2039 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet);
1810 ASSERT_TRUE(data != NULL); 2040 ASSERT_TRUE(data != NULL);
1811 2041
1812 test::CompareCharArraysWithHexError("constructed packet", 2042 test::CompareCharArraysWithHexError("constructed packet",
1813 data->data(), data->length(), 2043 data->data(), data->length(),
1814 AsChars(packet), arraysize(packet)); 2044 AsChars(packet), arraysize(packet));
1815 } 2045 }
1816 2046
1817 TEST_P(QuicFramerTest, AckFrame500Nacks) { 2047 TEST_P(QuicFramerTest, AckFrame500Nacks) {
2048 if (framer_.version() <= QUIC_VERSION_14) {
2049 return;
2050 }
1818 unsigned char packet[] = { 2051 unsigned char packet[] = {
1819 // public flags (8 byte guid) 2052 // public flags (8 byte guid)
1820 0x3C, 2053 0x3C,
1821 // guid 2054 // guid
1822 0x10, 0x32, 0x54, 0x76, 2055 0x10, 0x32, 0x54, 0x76,
1823 0x98, 0xBA, 0xDC, 0xFE, 2056 0x98, 0xBA, 0xDC, 0xFE,
1824 // packet sequence number 2057 // packet sequence number
1825 0xA8, 0x9A, 0x78, 0x56, 2058 0xA8, 0x9A, 0x78, 0x56,
1826 0x34, 0x12, 2059 0x34, 0x12,
1827 // private flags (entropy) 2060 // private flags (entropy)
(...skipping 18 matching lines...) Expand all
1846 0x02, 2079 0x02,
1847 // missing packet delta 2080 // missing packet delta
1848 0x01, 2081 0x01,
1849 // 243 more missing packets in range. 2082 // 243 more missing packets in range.
1850 // The ranges are listed in this order so the re-constructed packet matches. 2083 // The ranges are listed in this order so the re-constructed packet matches.
1851 0xF3, 2084 0xF3,
1852 // No gap between ranges 2085 // No gap between ranges
1853 0x00, 2086 0x00,
1854 // 255 more missing packets in range. 2087 // 255 more missing packets in range.
1855 0xFF, 2088 0xFF,
2089 // No revived packets.
2090 0x00,
1856 }; 2091 };
1857 2092
1858 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2093 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1859 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2094 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1860 2095
1861 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2096 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1862 ASSERT_TRUE(visitor_.header_.get()); 2097 ASSERT_TRUE(visitor_.header_.get());
1863 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); 2098 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion));
1864 2099
1865 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 2100 EXPECT_EQ(0u, visitor_.stream_frames_.size());
1866 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 2101 ASSERT_EQ(1u, visitor_.ack_frames_.size());
1867 QuicAckFrame* frame = visitor_.ack_frames_[0]; 2102 QuicAckFrame* frame = visitor_.ack_frames_[0];
1868 EXPECT_EQ(0xAB, frame->sent_info.entropy_hash); 2103 EXPECT_EQ(0xAB, frame->sent_info.entropy_hash);
1869 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); 2104 EXPECT_EQ(0xBA, frame->received_info.entropy_hash);
1870 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), 2105 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF),
1871 frame->received_info.largest_observed); 2106 frame->received_info.largest_observed);
2107 EXPECT_EQ(0u, frame->received_info.revived_packets.size());
1872 ASSERT_EQ(500u, frame->received_info.missing_packets.size()); 2108 ASSERT_EQ(500u, frame->received_info.missing_packets.size());
1873 SequenceNumberSet::const_iterator first_missing_iter = 2109 SequenceNumberSet::const_iterator first_missing_iter =
1874 frame->received_info.missing_packets.begin(); 2110 frame->received_info.missing_packets.begin();
1875 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE) - 499, *first_missing_iter); 2111 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE) - 499, *first_missing_iter);
1876 SequenceNumberSet::const_reverse_iterator last_missing_iter = 2112 SequenceNumberSet::const_reverse_iterator last_missing_iter =
1877 frame->received_info.missing_packets.rbegin(); 2113 frame->received_info.missing_packets.rbegin();
1878 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *last_missing_iter); 2114 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *last_missing_iter);
1879 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked); 2115 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked);
1880 2116
1881 // Verify that the packet re-serializes identically. 2117 // Verify that the packet re-serializes identically.
1882 QuicFrames frames; 2118 QuicFrames frames;
1883 frames.push_back(QuicFrame(frame)); 2119 frames.push_back(QuicFrame(frame));
1884 scoped_ptr<QuicPacket> data( 2120 scoped_ptr<QuicPacket> data(
1885 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); 2121 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet);
1886 ASSERT_TRUE(data != NULL); 2122 ASSERT_TRUE(data != NULL);
1887 2123
1888 test::CompareCharArraysWithHexError("constructed packet", 2124 test::CompareCharArraysWithHexError("constructed packet",
1889 data->data(), data->length(), 2125 data->data(), data->length(),
1890 AsChars(packet), arraysize(packet)); 2126 AsChars(packet), arraysize(packet));
1891 } 2127 }
1892 2128
1893 TEST_P(QuicFramerTest, CongestionFeedbackFrameTCP) { 2129 TEST_P(QuicFramerTest, AckFrame500NacksV14) {
2130 if (framer_.version() > QUIC_VERSION_14) {
2131 return;
2132 }
1894 unsigned char packet[] = { 2133 unsigned char packet[] = {
1895 // public flags (8 byte guid) 2134 // public flags (8 byte guid)
1896 0x3C, 2135 0x3C,
1897 // guid 2136 // guid
1898 0x10, 0x32, 0x54, 0x76, 2137 0x10, 0x32, 0x54, 0x76,
1899 0x98, 0xBA, 0xDC, 0xFE, 2138 0x98, 0xBA, 0xDC, 0xFE,
1900 // packet sequence number 2139 // packet sequence number
2140 0xA8, 0x9A, 0x78, 0x56,
2141 0x34, 0x12,
2142 // private flags (entropy)
2143 0x01,
2144
2145 // frame type (ack frame)
2146 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta)
2147 0x6C,
2148 // entropy hash of sent packets till least awaiting - 1.
2149 0xAB,
2150 // least packet sequence number awaiting an ack, delta from sequence number.
2151 0x08, 0x00, 0x00, 0x00,
2152 0x00, 0x00,
2153 // entropy hash of all received packets.
2154 0xBA,
2155 // largest observed packet sequence number
2156 0xBF, 0x9A, 0x78, 0x56,
2157 0x34, 0x12,
2158 // Zero delta time.
2159 0x0, 0x0,
2160 // num missing packet ranges
2161 0x02,
2162 // missing packet delta
2163 0x01,
2164 // 243 more missing packets in range.
2165 // The ranges are listed in this order so the re-constructed packet matches.
2166 0xF3,
2167 // No gap between ranges
2168 0x00,
2169 // 255 more missing packets in range.
2170 0xFF,
2171 };
2172
2173 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2174 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2175
2176 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2177 ASSERT_TRUE(visitor_.header_.get());
2178 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion));
2179
2180 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2181 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2182 QuicAckFrame* frame = visitor_.ack_frames_[0];
2183 EXPECT_EQ(0xAB, frame->sent_info.entropy_hash);
2184 EXPECT_EQ(0xBA, frame->received_info.entropy_hash);
2185 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF),
2186 frame->received_info.largest_observed);
2187 ASSERT_EQ(500u, frame->received_info.missing_packets.size());
2188 SequenceNumberSet::const_iterator first_missing_iter =
2189 frame->received_info.missing_packets.begin();
2190 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE) - 499, *first_missing_iter);
2191 SequenceNumberSet::const_reverse_iterator last_missing_iter =
2192 frame->received_info.missing_packets.rbegin();
2193 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *last_missing_iter);
2194 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked);
2195
2196 // Verify that the packet re-serializes identically.
2197 QuicFrames frames;
2198 frames.push_back(QuicFrame(frame));
2199 scoped_ptr<QuicPacket> data(
2200 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet);
2201 ASSERT_TRUE(data != NULL);
2202
2203 test::CompareCharArraysWithHexError("constructed packet",
2204 data->data(), data->length(),
2205 AsChars(packet), arraysize(packet));
2206 }
2207
2208 TEST_P(QuicFramerTest, CongestionFeedbackFrameTCP) {
2209 if (framer_.version() <= QUIC_VERSION_14) {
2210 return;
2211 }
2212 unsigned char packet[] = {
2213 // public flags (8 byte guid)
2214 0x3C,
2215 // guid
2216 0x10, 0x32, 0x54, 0x76,
2217 0x98, 0xBA, 0xDC, 0xFE,
2218 // packet sequence number
2219 0xBC, 0x9A, 0x78, 0x56,
2220 0x34, 0x12,
2221 // private flags
2222 0x00,
2223
2224 // frame type (congestion feedback frame)
2225 0x20,
2226 // congestion feedback type (tcp)
2227 0x00,
2228 // ack_frame.feedback.tcp.receive_window
2229 0x03, 0x04,
2230 };
2231
2232 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2233 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2234
2235 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2236 ASSERT_TRUE(visitor_.header_.get());
2237 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion));
2238
2239 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2240 ASSERT_EQ(1u, visitor_.congestion_feedback_frames_.size());
2241 const QuicCongestionFeedbackFrame& frame =
2242 *visitor_.congestion_feedback_frames_[0];
2243 ASSERT_EQ(kTCP, frame.type);
2244 EXPECT_EQ(0x4030u, frame.tcp.receive_window);
2245
2246 // Now test framing boundaries
2247 for (size_t i = kQuicFrameTypeSize; i < 4; ++i) {
2248 string expected_error;
2249 if (i < 2) {
2250 expected_error = "Unable to read congestion feedback type.";
2251 } else if (i < 4) {
2252 expected_error = "Unable to read receive window.";
2253 }
2254 CheckProcessingFails(
2255 packet,
2256 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
2257 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
2258 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA);
2259 }
2260 }
2261
2262 TEST_P(QuicFramerTest, CongestionFeedbackFrameTCPV14) {
2263 if (framer_.version() > QUIC_VERSION_14) {
2264 return;
2265 }
2266 unsigned char packet[] = {
2267 // public flags (8 byte guid)
2268 0x3C,
2269 // guid
2270 0x10, 0x32, 0x54, 0x76,
2271 0x98, 0xBA, 0xDC, 0xFE,
2272 // packet sequence number
1901 0xBC, 0x9A, 0x78, 0x56, 2273 0xBC, 0x9A, 0x78, 0x56,
1902 0x34, 0x12, 2274 0x34, 0x12,
1903 // private flags 2275 // private flags
1904 0x00, 2276 0x00,
1905 2277
1906 // frame type (congestion feedback frame) 2278 // frame type (congestion feedback frame)
1907 0x20, 2279 0x20,
1908 // congestion feedback type (tcp) 2280 // congestion feedback type (tcp)
1909 0x00, 2281 0x00,
1910 // ack_frame.feedback.tcp.accumulated_number_of_lost_packets 2282 // ack_frame.feedback.tcp.accumulated_number_of_lost_packets
(...skipping 28 matching lines...) Expand all
1939 } 2311 }
1940 CheckProcessingFails( 2312 CheckProcessingFails(
1941 packet, 2313 packet,
1942 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, 2314 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
1943 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 2315 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
1944 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA); 2316 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA);
1945 } 2317 }
1946 } 2318 }
1947 2319
1948 TEST_P(QuicFramerTest, CongestionFeedbackFrameInterArrival) { 2320 TEST_P(QuicFramerTest, CongestionFeedbackFrameInterArrival) {
2321 if (framer_.version() <= QUIC_VERSION_14) {
2322 return;
2323 }
1949 unsigned char packet[] = { 2324 unsigned char packet[] = {
1950 // public flags (8 byte guid) 2325 // public flags (8 byte guid)
1951 0x3C, 2326 0x3C,
2327 // guid
2328 0x10, 0x32, 0x54, 0x76,
2329 0x98, 0xBA, 0xDC, 0xFE,
2330 // packet sequence number
2331 0xBC, 0x9A, 0x78, 0x56,
2332 0x34, 0x12,
2333 // private flags
2334 0x00,
2335
2336 // frame type (congestion feedback frame)
2337 0x20,
2338 // congestion feedback type (inter arrival)
2339 0x01,
2340 // num received packets
2341 0x03,
2342 // lowest sequence number
2343 0xBA, 0x9A, 0x78, 0x56,
2344 0x34, 0x12,
2345 // receive time
2346 0x87, 0x96, 0xA5, 0xB4,
2347 0xC3, 0xD2, 0xE1, 0x07,
2348 // sequence delta
2349 0x01, 0x00,
2350 // time delta
2351 0x01, 0x00, 0x00, 0x00,
2352 // sequence delta (skip one packet)
2353 0x03, 0x00,
2354 // time delta
2355 0x02, 0x00, 0x00, 0x00,
2356 };
2357
2358 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2359 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2360
2361 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2362 ASSERT_TRUE(visitor_.header_.get());
2363 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion));
2364
2365 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2366 ASSERT_EQ(1u, visitor_.congestion_feedback_frames_.size());
2367 const QuicCongestionFeedbackFrame& frame =
2368 *visitor_.congestion_feedback_frames_[0];
2369 ASSERT_EQ(kInterArrival, frame.type);
2370 ASSERT_EQ(3u, frame.inter_arrival.received_packet_times.size());
2371 TimeMap::const_iterator iter =
2372 frame.inter_arrival.received_packet_times.begin();
2373 EXPECT_EQ(GG_UINT64_C(0x0123456789ABA), iter->first);
2374 EXPECT_EQ(GG_INT64_C(0x07E1D2C3B4A59687),
2375 iter->second.Subtract(start_).ToMicroseconds());
2376 ++iter;
2377 EXPECT_EQ(GG_UINT64_C(0x0123456789ABB), iter->first);
2378 EXPECT_EQ(GG_INT64_C(0x07E1D2C3B4A59688),
2379 iter->second.Subtract(start_).ToMicroseconds());
2380 ++iter;
2381 EXPECT_EQ(GG_UINT64_C(0x0123456789ABD), iter->first);
2382 EXPECT_EQ(GG_INT64_C(0x07E1D2C3B4A59689),
2383 iter->second.Subtract(start_).ToMicroseconds());
2384
2385 // Now test framing boundaries
2386 for (size_t i = kQuicFrameTypeSize; i < 29; ++i) {
2387 string expected_error;
2388 if (i < 2) {
2389 expected_error = "Unable to read congestion feedback type.";
2390 } else if (i < 3) {
2391 expected_error = "Unable to read num received packets.";
2392 } else if (i < 9) {
2393 expected_error = "Unable to read smallest received.";
2394 } else if (i < 17) {
2395 expected_error = "Unable to read time received.";
2396 } else if (i < 19) {
2397 expected_error = "Unable to read sequence delta in received packets.";
2398 } else if (i < 23) {
2399 expected_error = "Unable to read time delta in received packets.";
2400 } else if (i < 25) {
2401 expected_error = "Unable to read sequence delta in received packets.";
2402 } else if (i < 29) {
2403 expected_error = "Unable to read time delta in received packets.";
2404 }
2405 CheckProcessingFails(
2406 packet,
2407 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion,
2408 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP),
2409 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA);
2410 }
2411 }
2412
2413 TEST_P(QuicFramerTest, CongestionFeedbackFrameInterArrivalV14) {
2414 if (framer_.version() > QUIC_VERSION_14) {
2415 return;
2416 }
2417 unsigned char packet[] = {
2418 // public flags (8 byte guid)
2419 0x3C,
1952 // guid 2420 // guid
1953 0x10, 0x32, 0x54, 0x76, 2421 0x10, 0x32, 0x54, 0x76,
1954 0x98, 0xBA, 0xDC, 0xFE, 2422 0x98, 0xBA, 0xDC, 0xFE,
1955 // packet sequence number 2423 // packet sequence number
1956 0xBC, 0x9A, 0x78, 0x56, 2424 0xBC, 0x9A, 0x78, 0x56,
1957 0x34, 0x12, 2425 0x34, 0x12,
1958 // private flags 2426 // private flags
1959 0x00, 2427 0x00,
1960 2428
1961 // frame type (congestion feedback frame) 2429 // frame type (congestion feedback frame)
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after
2526 visitor_.public_reset_packet_->client_address.address().empty()); 2994 visitor_.public_reset_packet_->client_address.address().empty());
2527 2995
2528 // Now test framing boundaries 2996 // Now test framing boundaries
2529 for (size_t i = 0; i < arraysize(packet); ++i) { 2997 for (size_t i = 0; i < arraysize(packet); ++i) {
2530 string expected_error; 2998 string expected_error;
2531 DLOG(INFO) << "iteration: " << i; 2999 DLOG(INFO) << "iteration: " << i;
2532 if (i < kGuidOffset) { 3000 if (i < kGuidOffset) {
2533 expected_error = "Unable to read public flags."; 3001 expected_error = "Unable to read public flags.";
2534 CheckProcessingFails(packet, i, expected_error, 3002 CheckProcessingFails(packet, i, expected_error,
2535 QUIC_INVALID_PACKET_HEADER); 3003 QUIC_INVALID_PACKET_HEADER);
2536 } else if (i < kPublicResetPacketNonceProofOffset) { 3004 } else if (i < kPublicResetPacketMessageTagOffset) {
2537 expected_error = "Unable to read GUID."; 3005 expected_error = "Unable to read GUID.";
2538 CheckProcessingFails(packet, i, expected_error, 3006 CheckProcessingFails(packet, i, expected_error,
2539 QUIC_INVALID_PACKET_HEADER); 3007 QUIC_INVALID_PACKET_HEADER);
2540 } else if (i < kPublicResetPacketRejectedSequenceNumberOffset) {
2541 expected_error = "Unable to read nonce proof.";
2542 CheckProcessingFails(packet, i, expected_error,
2543 QUIC_INVALID_PUBLIC_RST_PACKET);
2544 } else if (i < kPublicResetPacketOldSize) {
2545 expected_error = "Unable to read rejected sequence number.";
2546 CheckProcessingFails(packet, i, expected_error,
2547 QUIC_INVALID_PUBLIC_RST_PACKET);
2548 } else if (i == kPublicResetPacketOldSize) {
2549 // This looks like an old public reset packet, so there won't be an
2550 // error.
2551 } else { 3008 } else {
2552 expected_error = "Unable to read reset message."; 3009 expected_error = "Unable to read reset message.";
2553 CheckProcessingFails(packet, i, expected_error, 3010 CheckProcessingFails(packet, i, expected_error,
2554 QUIC_INVALID_PUBLIC_RST_PACKET); 3011 QUIC_INVALID_PUBLIC_RST_PACKET);
2555 } 3012 }
2556 } 3013 }
2557 } 3014 }
2558 3015
3016 TEST_P(QuicFramerTest, PublicResetPacketWithTrailingJunk) {
3017 unsigned char packet[] = {
3018 // public flags (public reset, 8 byte guid)
3019 0x0E,
3020 // guid
3021 0x10, 0x32, 0x54, 0x76,
3022 0x98, 0xBA, 0xDC, 0xFE,
3023 // message tag (kPRST)
3024 'P', 'R', 'S', 'T',
3025 // num_entries (2) + padding
3026 0x02, 0x00, 0x00, 0x00,
3027 // tag kRNON
3028 'R', 'N', 'O', 'N',
3029 // end offset 8
3030 0x08, 0x00, 0x00, 0x00,
3031 // tag kRSEQ
3032 'R', 'S', 'E', 'Q',
3033 // end offset 16
3034 0x10, 0x00, 0x00, 0x00,
3035 // nonce proof
3036 0x89, 0x67, 0x45, 0x23,
3037 0x01, 0xEF, 0xCD, 0xAB,
3038 // rejected sequence number
3039 0xBC, 0x9A, 0x78, 0x56,
3040 0x34, 0x12, 0x00, 0x00,
3041 // trailing junk
3042 'j', 'u', 'n', 'k',
3043 };
3044
3045 string expected_error = "Unable to read reset message.";
3046 CheckProcessingFails(packet, arraysize(packet), expected_error,
3047 QUIC_INVALID_PUBLIC_RST_PACKET);
3048 }
3049
2559 TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) { 3050 TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) {
2560 unsigned char packet[] = { 3051 unsigned char packet[] = {
2561 // public flags (public reset, 8 byte guid) 3052 // public flags (public reset, 8 byte guid)
2562 0x0E, 3053 0x0E,
2563 // guid 3054 // guid
2564 0x10, 0x32, 0x54, 0x76, 3055 0x10, 0x32, 0x54, 0x76,
2565 0x98, 0xBA, 0xDC, 0xFE, 3056 0x98, 0xBA, 0xDC, 0xFE,
2566 // message tag (kPRST) 3057 // message tag (kPRST)
2567 'P', 'R', 'S', 'T', 3058 'P', 'R', 'S', 'T',
2568 // num_entries (3) + padding 3059 // num_entries (3) + padding
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2609 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port()); 3100 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port());
2610 3101
2611 // Now test framing boundaries 3102 // Now test framing boundaries
2612 for (size_t i = 0; i < arraysize(packet); ++i) { 3103 for (size_t i = 0; i < arraysize(packet); ++i) {
2613 string expected_error; 3104 string expected_error;
2614 DLOG(INFO) << "iteration: " << i; 3105 DLOG(INFO) << "iteration: " << i;
2615 if (i < kGuidOffset) { 3106 if (i < kGuidOffset) {
2616 expected_error = "Unable to read public flags."; 3107 expected_error = "Unable to read public flags.";
2617 CheckProcessingFails(packet, i, expected_error, 3108 CheckProcessingFails(packet, i, expected_error,
2618 QUIC_INVALID_PACKET_HEADER); 3109 QUIC_INVALID_PACKET_HEADER);
2619 } else if (i < kPublicResetPacketNonceProofOffset) { 3110 } else if (i < kPublicResetPacketMessageTagOffset) {
2620 expected_error = "Unable to read GUID."; 3111 expected_error = "Unable to read GUID.";
2621 CheckProcessingFails(packet, i, expected_error, 3112 CheckProcessingFails(packet, i, expected_error,
2622 QUIC_INVALID_PACKET_HEADER); 3113 QUIC_INVALID_PACKET_HEADER);
2623 } else if (i < kPublicResetPacketRejectedSequenceNumberOffset) {
2624 expected_error = "Unable to read nonce proof.";
2625 CheckProcessingFails(packet, i, expected_error,
2626 QUIC_INVALID_PUBLIC_RST_PACKET);
2627 } else if (i < kPublicResetPacketOldSize) {
2628 expected_error = "Unable to read rejected sequence number.";
2629 CheckProcessingFails(packet, i, expected_error,
2630 QUIC_INVALID_PUBLIC_RST_PACKET);
2631 } else if (i == kPublicResetPacketOldSize) {
2632 // This looks like an old public reset packet, so there won't be an
2633 // error.
2634 } else { 3114 } else {
2635 expected_error = "Unable to read reset message."; 3115 expected_error = "Unable to read reset message.";
2636 CheckProcessingFails(packet, i, expected_error, 3116 CheckProcessingFails(packet, i, expected_error,
2637 QUIC_INVALID_PUBLIC_RST_PACKET); 3117 QUIC_INVALID_PUBLIC_RST_PACKET);
2638 } 3118 }
2639 } 3119 }
2640 } 3120 }
2641 3121
2642 // TODO(wtc): remove this test when we drop support for QUIC_VERSION_13. 3122 // TODO(wtc): remove this test when we drop support for QUIC_VERSION_13.
2643 TEST_P(QuicFramerTest, PublicResetPacketOld) { 3123 TEST_P(QuicFramerTest, PublicResetPacketOld) {
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
3084 versions.push_back(GetParam()); 3564 versions.push_back(GetParam());
3085 scoped_ptr<QuicEncryptedPacket> data( 3565 scoped_ptr<QuicEncryptedPacket> data(
3086 framer_.BuildVersionNegotiationPacket(header, versions)); 3566 framer_.BuildVersionNegotiationPacket(header, versions));
3087 3567
3088 test::CompareCharArraysWithHexError("constructed packet", 3568 test::CompareCharArraysWithHexError("constructed packet",
3089 data->data(), data->length(), 3569 data->data(), data->length(),
3090 AsChars(packet), arraysize(packet)); 3570 AsChars(packet), arraysize(packet));
3091 } 3571 }
3092 3572
3093 TEST_P(QuicFramerTest, BuildAckFramePacket) { 3573 TEST_P(QuicFramerTest, BuildAckFramePacket) {
3574 if (version_ <= QUIC_VERSION_14) {
3575 return;
3576 }
3094 QuicPacketHeader header; 3577 QuicPacketHeader header;
3095 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 3578 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210);
3096 header.public_header.reset_flag = false; 3579 header.public_header.reset_flag = false;
3580 header.public_header.version_flag = false;
3581 header.fec_flag = false;
3582 header.entropy_flag = true;
3583 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8);
3584 header.fec_group = 0;
3585
3586 QuicAckFrame ack_frame;
3587 ack_frame.received_info.entropy_hash = 0x43;
3588 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF);
3589 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero();
3590 ack_frame.received_info.missing_packets.insert(
3591 GG_UINT64_C(0x770123456789ABE));
3592 ack_frame.sent_info.entropy_hash = 0x14;
3593 ack_frame.sent_info.least_unacked = GG_UINT64_C(0x770123456789AA0);
3594
3595 QuicFrames frames;
3596 frames.push_back(QuicFrame(&ack_frame));
3597
3598 unsigned char packet[] = {
3599 // public flags (8 byte guid)
3600 0x3C,
3601 // guid
3602 0x10, 0x32, 0x54, 0x76,
3603 0x98, 0xBA, 0xDC, 0xFE,
3604 // packet sequence number
3605 0xA8, 0x9A, 0x78, 0x56,
3606 0x34, 0x12,
3607 // private flags (entropy)
3608 0x01,
3609
3610 // frame type (ack frame)
3611 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta)
3612 0x6C,
3613 // entropy hash of sent packets till least awaiting - 1.
3614 0x14,
3615 // least packet sequence number awaiting an ack, delta from sequence number.
3616 0x08, 0x00, 0x00, 0x00,
3617 0x00, 0x00,
3618 // entropy hash of all received packets.
3619 0x43,
3620 // largest observed packet sequence number
3621 0xBF, 0x9A, 0x78, 0x56,
3622 0x34, 0x12,
3623 // Zero delta time.
3624 0x0, 0x0,
3625 // num missing packet ranges
3626 0x01,
3627 // missing packet delta
3628 0x01,
3629 // 0 more missing packets in range.
3630 0x00,
3631 // 0 revived packets.
3632 0x00,
3633 };
3634
3635 scoped_ptr<QuicPacket> data(
3636 framer_.BuildUnsizedDataPacket(header, frames).packet);
3637 ASSERT_TRUE(data != NULL);
3638
3639 test::CompareCharArraysWithHexError("constructed packet",
3640 data->data(), data->length(),
3641 AsChars(packet), arraysize(packet));
3642 }
3643
3644 TEST_P(QuicFramerTest, BuildAckFramePacketV14) {
3645 if (version_ > QUIC_VERSION_14) {
3646 return;
3647 }
3648 QuicPacketHeader header;
3649 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210);
3650 header.public_header.reset_flag = false;
3097 header.public_header.version_flag = false; 3651 header.public_header.version_flag = false;
3098 header.fec_flag = false; 3652 header.fec_flag = false;
3099 header.entropy_flag = true; 3653 header.entropy_flag = true;
3100 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); 3654 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8);
3101 header.fec_group = 0; 3655 header.fec_group = 0;
3102 3656
3103 QuicAckFrame ack_frame; 3657 QuicAckFrame ack_frame;
3104 ack_frame.received_info.entropy_hash = 0x43; 3658 ack_frame.received_info.entropy_hash = 0x43;
3105 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF); 3659 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF);
3106 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); 3660 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
3150 scoped_ptr<QuicPacket> data( 3704 scoped_ptr<QuicPacket> data(
3151 framer_.BuildUnsizedDataPacket(header, frames).packet); 3705 framer_.BuildUnsizedDataPacket(header, frames).packet);
3152 ASSERT_TRUE(data != NULL); 3706 ASSERT_TRUE(data != NULL);
3153 3707
3154 test::CompareCharArraysWithHexError("constructed packet", 3708 test::CompareCharArraysWithHexError("constructed packet",
3155 data->data(), data->length(), 3709 data->data(), data->length(),
3156 AsChars(packet), arraysize(packet)); 3710 AsChars(packet), arraysize(packet));
3157 } 3711 }
3158 3712
3159 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCP) { 3713 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCP) {
3714 if (version_ <= QUIC_VERSION_14) {
3715 return;
3716 }
3160 QuicPacketHeader header; 3717 QuicPacketHeader header;
3161 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 3718 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210);
3162 header.public_header.reset_flag = false; 3719 header.public_header.reset_flag = false;
3720 header.public_header.version_flag = false;
3721 header.fec_flag = false;
3722 header.entropy_flag = false;
3723 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
3724 header.fec_group = 0;
3725
3726 QuicCongestionFeedbackFrame congestion_feedback_frame;
3727 congestion_feedback_frame.type = kTCP;
3728 congestion_feedback_frame.tcp.receive_window = 0x4030;
3729
3730 QuicFrames frames;
3731 frames.push_back(QuicFrame(&congestion_feedback_frame));
3732
3733 unsigned char packet[] = {
3734 // public flags (8 byte guid)
3735 0x3C,
3736 // guid
3737 0x10, 0x32, 0x54, 0x76,
3738 0x98, 0xBA, 0xDC, 0xFE,
3739 // packet sequence number
3740 0xBC, 0x9A, 0x78, 0x56,
3741 0x34, 0x12,
3742 // private flags
3743 0x00,
3744
3745 // frame type (congestion feedback frame)
3746 0x20,
3747 // congestion feedback type (TCP)
3748 0x00,
3749 // TCP receive window
3750 0x03, 0x04,
3751 };
3752
3753 scoped_ptr<QuicPacket> data(
3754 framer_.BuildUnsizedDataPacket(header, frames).packet);
3755 ASSERT_TRUE(data != NULL);
3756
3757 test::CompareCharArraysWithHexError("constructed packet",
3758 data->data(), data->length(),
3759 AsChars(packet), arraysize(packet));
3760 }
3761
3762 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCPV14) {
3763 if (version_ > QUIC_VERSION_14) {
3764 return;
3765 }
3766 QuicPacketHeader header;
3767 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210);
3768 header.public_header.reset_flag = false;
3163 header.public_header.version_flag = false; 3769 header.public_header.version_flag = false;
3164 header.fec_flag = false; 3770 header.fec_flag = false;
3165 header.entropy_flag = false; 3771 header.entropy_flag = false;
3166 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 3772 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
3167 header.fec_group = 0; 3773 header.fec_group = 0;
3168 3774
3169 QuicCongestionFeedbackFrame congestion_feedback_frame; 3775 QuicCongestionFeedbackFrame congestion_feedback_frame;
3170 congestion_feedback_frame.type = kTCP; 3776 congestion_feedback_frame.type = kTCP;
3171 congestion_feedback_frame.tcp.receive_window = 0x4030; 3777 congestion_feedback_frame.tcp.receive_window = 0x4030;
3172 3778
(...skipping 25 matching lines...) Expand all
3198 scoped_ptr<QuicPacket> data( 3804 scoped_ptr<QuicPacket> data(
3199 framer_.BuildUnsizedDataPacket(header, frames).packet); 3805 framer_.BuildUnsizedDataPacket(header, frames).packet);
3200 ASSERT_TRUE(data != NULL); 3806 ASSERT_TRUE(data != NULL);
3201 3807
3202 test::CompareCharArraysWithHexError("constructed packet", 3808 test::CompareCharArraysWithHexError("constructed packet",
3203 data->data(), data->length(), 3809 data->data(), data->length(),
3204 AsChars(packet), arraysize(packet)); 3810 AsChars(packet), arraysize(packet));
3205 } 3811 }
3206 3812
3207 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInterArrival) { 3813 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInterArrival) {
3814 if (version_ <= QUIC_VERSION_14) {
3815 return;
3816 }
3208 QuicPacketHeader header; 3817 QuicPacketHeader header;
3209 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 3818 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210);
3210 header.public_header.reset_flag = false; 3819 header.public_header.reset_flag = false;
3820 header.public_header.version_flag = false;
3821 header.fec_flag = false;
3822 header.entropy_flag = false;
3823 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
3824 header.fec_group = 0;
3825
3826 QuicCongestionFeedbackFrame frame;
3827 frame.type = kInterArrival;
3828 frame.inter_arrival.received_packet_times.insert(
3829 make_pair(GG_UINT64_C(0x0123456789ABA),
3830 start_.Add(QuicTime::Delta::FromMicroseconds(
3831 GG_UINT64_C(0x07E1D2C3B4A59687)))));
3832 frame.inter_arrival.received_packet_times.insert(
3833 make_pair(GG_UINT64_C(0x0123456789ABB),
3834 start_.Add(QuicTime::Delta::FromMicroseconds(
3835 GG_UINT64_C(0x07E1D2C3B4A59688)))));
3836 frame.inter_arrival.received_packet_times.insert(
3837 make_pair(GG_UINT64_C(0x0123456789ABD),
3838 start_.Add(QuicTime::Delta::FromMicroseconds(
3839 GG_UINT64_C(0x07E1D2C3B4A59689)))));
3840 QuicFrames frames;
3841 frames.push_back(QuicFrame(&frame));
3842
3843 unsigned char packet[] = {
3844 // public flags (8 byte guid)
3845 0x3C,
3846 // guid
3847 0x10, 0x32, 0x54, 0x76,
3848 0x98, 0xBA, 0xDC, 0xFE,
3849 // packet sequence number
3850 0xBC, 0x9A, 0x78, 0x56,
3851 0x34, 0x12,
3852 // private flags
3853 0x00,
3854
3855 // frame type (congestion feedback frame)
3856 0x20,
3857 // congestion feedback type (inter arrival)
3858 0x01,
3859 // num received packets
3860 0x03,
3861 // lowest sequence number
3862 0xBA, 0x9A, 0x78, 0x56,
3863 0x34, 0x12,
3864 // receive time
3865 0x87, 0x96, 0xA5, 0xB4,
3866 0xC3, 0xD2, 0xE1, 0x07,
3867 // sequence delta
3868 0x01, 0x00,
3869 // time delta
3870 0x01, 0x00, 0x00, 0x00,
3871 // sequence delta (skip one packet)
3872 0x03, 0x00,
3873 // time delta
3874 0x02, 0x00, 0x00, 0x00,
3875 };
3876
3877 scoped_ptr<QuicPacket> data(
3878 framer_.BuildUnsizedDataPacket(header, frames).packet);
3879 ASSERT_TRUE(data != NULL);
3880
3881 test::CompareCharArraysWithHexError("constructed packet",
3882 data->data(), data->length(),
3883 AsChars(packet), arraysize(packet));
3884 }
3885
3886 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInterArrivalV14) {
3887 if (version_ > QUIC_VERSION_14) {
3888 return;
3889 }
3890 QuicPacketHeader header;
3891 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210);
3892 header.public_header.reset_flag = false;
3211 header.public_header.version_flag = false; 3893 header.public_header.version_flag = false;
3212 header.fec_flag = false; 3894 header.fec_flag = false;
3213 header.entropy_flag = false; 3895 header.entropy_flag = false;
3214 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 3896 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
3215 header.fec_group = 0; 3897 header.fec_group = 0;
3216 3898
3217 QuicCongestionFeedbackFrame frame; 3899 QuicCongestionFeedbackFrame frame;
3218 frame.type = kInterArrival; 3900 frame.type = kInterArrival;
3219 frame.inter_arrival.received_packet_times.insert( 3901 frame.inter_arrival.received_packet_times.insert(
3220 make_pair(GG_UINT64_C(0x0123456789ABA), 3902 make_pair(GG_UINT64_C(0x0123456789ABA),
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after
3893 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 4575 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210);
3894 header.public_header.reset_flag = false; 4576 header.public_header.reset_flag = false;
3895 header.public_header.version_flag = false; 4577 header.public_header.version_flag = false;
3896 header.fec_flag = false; 4578 header.fec_flag = false;
3897 header.entropy_flag = false; 4579 header.entropy_flag = false;
3898 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 4580 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
3899 header.fec_group = 0; 4581 header.fec_group = 0;
3900 4582
3901 QuicAckFrame ack_frame; 4583 QuicAckFrame ack_frame;
3902 ack_frame.received_info.largest_observed = 601; 4584 ack_frame.received_info.largest_observed = 601;
3903 ack_frame.sent_info.least_unacked = 0; 4585 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 1;
3904 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) { 4586 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) {
3905 ack_frame.received_info.missing_packets.insert(i); 4587 ack_frame.received_info.missing_packets.insert(i);
3906 } 4588 }
3907 4589
3908 // Create a packet with just the ack 4590 // Create a packet with just the ack
3909 QuicFrame frame; 4591 QuicFrame frame;
3910 frame.type = ACK_FRAME; 4592 frame.type = ACK_FRAME;
3911 frame.ack_frame = &ack_frame; 4593 frame.ack_frame = &ack_frame;
3912 QuicFrames frames; 4594 QuicFrames frames;
3913 frames.push_back(frame); 4595 frames.push_back(frame);
3914 4596
3915 scoped_ptr<QuicPacket> raw_ack_packet( 4597 scoped_ptr<QuicPacket> raw_ack_packet(
3916 framer_.BuildUnsizedDataPacket(header, frames).packet); 4598 framer_.BuildUnsizedDataPacket(header, frames).packet);
3917 ASSERT_TRUE(raw_ack_packet != NULL); 4599 ASSERT_TRUE(raw_ack_packet != NULL);
3918 4600
3919 scoped_ptr<QuicEncryptedPacket> ack_packet( 4601 scoped_ptr<QuicEncryptedPacket> ack_packet(
3920 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, 4602 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number,
3921 *raw_ack_packet)); 4603 *raw_ack_packet));
3922 4604
3923 // Now make sure we can turn our ack packet back into an ack frame 4605 // Now make sure we can turn our ack packet back into an ack frame
3924 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); 4606 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet));
3925 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 4607 ASSERT_EQ(1u, visitor_.ack_frames_.size());
3926 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; 4608 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0];
3927 EXPECT_EQ(0u, processed_ack_frame.sent_info.least_unacked); 4609 EXPECT_EQ(header.packet_sequence_number - 1,
4610 processed_ack_frame.sent_info.least_unacked);
3928 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); 4611 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated);
3929 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); 4612 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed);
3930 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); 4613 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size());
3931 SequenceNumberSet::const_iterator missing_iter = 4614 SequenceNumberSet::const_iterator missing_iter =
3932 processed_ack_frame.received_info.missing_packets.begin(); 4615 processed_ack_frame.received_info.missing_packets.begin();
3933 EXPECT_EQ(1u, *missing_iter); 4616 EXPECT_EQ(1u, *missing_iter);
3934 SequenceNumberSet::const_reverse_iterator last_missing_iter = 4617 SequenceNumberSet::const_reverse_iterator last_missing_iter =
3935 processed_ack_frame.received_info.missing_packets.rbegin(); 4618 processed_ack_frame.received_info.missing_packets.rbegin();
3936 EXPECT_EQ(509u, *last_missing_iter); 4619 EXPECT_EQ(509u, *last_missing_iter);
3937 } 4620 }
3938 4621
3939 TEST_P(QuicFramerTest, CleanTruncation) { 4622 TEST_P(QuicFramerTest, CleanTruncation) {
3940 QuicPacketHeader header; 4623 QuicPacketHeader header;
3941 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); 4624 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210);
3942 header.public_header.reset_flag = false; 4625 header.public_header.reset_flag = false;
3943 header.public_header.version_flag = false; 4626 header.public_header.version_flag = false;
3944 header.fec_flag = false; 4627 header.fec_flag = false;
3945 header.entropy_flag = true; 4628 header.entropy_flag = true;
3946 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); 4629 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC);
3947 header.fec_group = 0; 4630 header.fec_group = 0;
3948 4631
3949 QuicAckFrame ack_frame; 4632 QuicAckFrame ack_frame;
3950 ack_frame.received_info.largest_observed = 201; 4633 ack_frame.received_info.largest_observed = 201;
3951 ack_frame.sent_info.least_unacked = 0; 4634 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 2;
3952 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; ++i) { 4635 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; ++i) {
3953 ack_frame.received_info.missing_packets.insert(i); 4636 ack_frame.received_info.missing_packets.insert(i);
3954 } 4637 }
3955 4638
3956 // Create a packet with just the ack 4639 // Create a packet with just the ack
3957 QuicFrame frame; 4640 QuicFrame frame;
3958 frame.type = ACK_FRAME; 4641 frame.type = ACK_FRAME;
3959 frame.ack_frame = &ack_frame; 4642 frame.ack_frame = &ack_frame;
3960 QuicFrames frames; 4643 QuicFrames frames;
3961 frames.push_back(frame); 4644 frames.push_back(frame);
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
4113 EXPECT_CALL(visitor, OnPacketComplete()); 4796 EXPECT_CALL(visitor, OnPacketComplete());
4114 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); 4797 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true));
4115 4798
4116 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 4799 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
4117 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 4800 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4118 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 4801 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4119 } 4802 }
4120 4803
4121 } // namespace test 4804 } // namespace test
4122 } // namespace net 4805 } // 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