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_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 1665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1676 | 1676 |
1677 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1677 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
1678 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1678 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
1679 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); | 1679 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); |
1680 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1680 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
1681 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1681 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
1682 visitor_.stream_frames_[0]->offset); | 1682 visitor_.stream_frames_[0]->offset); |
1683 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); | 1683 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); |
1684 } | 1684 } |
1685 | 1685 |
1686 TEST_P(QuicFramerTest, AckFrame15) { | 1686 TEST_P(QuicFramerTest, AckFrame) { |
1687 if (framer_.version() != QUIC_VERSION_15) { | |
1688 return; | |
1689 } | |
1690 | |
1691 unsigned char packet[] = { | 1687 unsigned char packet[] = { |
1692 // public flags (8 byte connection_id) | 1688 // public flags (8 byte connection_id) |
1693 0x3C, | 1689 0x3C, |
1694 // connection_id | |
1695 0x10, 0x32, 0x54, 0x76, | |
1696 0x98, 0xBA, 0xDC, 0xFE, | |
1697 // packet sequence number | |
1698 0xA8, 0x9A, 0x78, 0x56, | |
1699 0x34, 0x12, | |
1700 // private flags (entropy) | |
1701 0x01, | |
1702 | |
1703 // frame type (ack frame) | |
1704 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
1705 0x6C, | |
1706 // entropy hash of sent packets till least awaiting - 1. | |
1707 0xAB, | |
1708 // least packet sequence number awaiting an ack, delta from sequence number. | |
1709 0x08, 0x00, 0x00, 0x00, | |
1710 0x00, 0x00, | |
1711 // entropy hash of all received packets. | |
1712 0xBA, | |
1713 // largest observed packet sequence number | |
1714 0xBF, 0x9A, 0x78, 0x56, | |
1715 0x34, 0x12, | |
1716 // Zero delta time. | |
1717 0x0, 0x0, | |
1718 // num missing packets | |
1719 0x01, | |
1720 // missing packet delta | |
1721 0x01, | |
1722 // 0 more missing packets in range. | |
1723 0x00, | |
1724 // Number of revived packets. | |
1725 0x00, | |
1726 }; | |
1727 | |
1728 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
1729 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
1730 | |
1731 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
1732 ASSERT_TRUE(visitor_.header_.get()); | |
1733 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | |
1734 | |
1735 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
1736 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
1737 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | |
1738 EXPECT_EQ(0xAB, frame.sent_info.entropy_hash); | |
1739 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); | |
1740 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); | |
1741 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); | |
1742 SequenceNumberSet::const_iterator missing_iter = | |
1743 frame.received_info.missing_packets.begin(); | |
1744 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); | |
1745 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked); | |
1746 | |
1747 const size_t kSentEntropyOffset = kQuicFrameTypeSize; | |
1748 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; | |
1749 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + | |
1750 PACKET_6BYTE_SEQUENCE_NUMBER; | |
1751 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | |
1752 kQuicEntropyHashSize; | |
1753 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | |
1754 PACKET_6BYTE_SEQUENCE_NUMBER; | |
1755 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | |
1756 kQuicDeltaTimeLargestObservedSize; | |
1757 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | |
1758 kNumberOfNackRangesSize; | |
1759 const size_t kMissingPacketsRange = kMissingPacketsOffset + | |
1760 PACKET_1BYTE_SEQUENCE_NUMBER; | |
1761 const size_t kRevivedPacketsLength = kMissingPacketsRange + | |
1762 PACKET_1BYTE_SEQUENCE_NUMBER; | |
1763 // Now test framing boundaries | |
1764 const size_t ack_frame_size = kRevivedPacketsLength + | |
1765 PACKET_1BYTE_SEQUENCE_NUMBER; | |
1766 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | |
1767 string expected_error; | |
1768 if (i < kLeastUnackedOffset) { | |
1769 expected_error = "Unable to read entropy hash for sent packets."; | |
1770 } else if (i < kReceivedEntropyOffset) { | |
1771 expected_error = "Unable to read least unacked delta."; | |
1772 } else if (i < kLargestObservedOffset) { | |
1773 expected_error = "Unable to read entropy hash for received packets."; | |
1774 } else if (i < kMissingDeltaTimeOffset) { | |
1775 expected_error = "Unable to read largest observed."; | |
1776 } else if (i < kNumMissingPacketOffset) { | |
1777 expected_error = "Unable to read delta time largest observed."; | |
1778 } else if (i < kMissingPacketsOffset) { | |
1779 expected_error = "Unable to read num missing packet ranges."; | |
1780 } else if (i < kMissingPacketsRange) { | |
1781 expected_error = "Unable to read missing sequence number delta."; | |
1782 } else if (i < kRevivedPacketsLength) { | |
1783 expected_error = "Unable to read missing sequence number range."; | |
1784 } else { | |
1785 expected_error = "Unable to read num revived packets."; | |
1786 } | |
1787 CheckProcessingFails( | |
1788 packet, | |
1789 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | |
1790 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | |
1791 expected_error, QUIC_INVALID_ACK_DATA); | |
1792 } | |
1793 } | |
1794 | |
1795 TEST_P(QuicFramerTest, AckFrame) { | |
1796 if (framer_.version() <= QUIC_VERSION_15) { | |
1797 return; | |
1798 } | |
1799 | |
1800 unsigned char packet[] = { | |
1801 // public flags (8 byte connection_id) | |
1802 0x3C, | |
1803 // connection_id | 1690 // connection_id |
1804 0x10, 0x32, 0x54, 0x76, | 1691 0x10, 0x32, 0x54, 0x76, |
1805 0x98, 0xBA, 0xDC, 0xFE, | 1692 0x98, 0xBA, 0xDC, 0xFE, |
1806 // packet sequence number | 1693 // packet sequence number |
1807 0xA8, 0x9A, 0x78, 0x56, | 1694 0xA8, 0x9A, 0x78, 0x56, |
1808 0x34, 0x12, | 1695 0x34, 0x12, |
1809 // private flags (entropy) | 1696 // private flags (entropy) |
1810 0x01, | 1697 0x01, |
1811 | 1698 |
1812 // frame type (ack frame) | 1699 // frame type (ack frame) |
(...skipping 19 matching lines...) Expand all Loading... |
1832 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1719 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1833 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1720 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1834 | 1721 |
1835 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1722 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1836 ASSERT_TRUE(visitor_.header_.get()); | 1723 ASSERT_TRUE(visitor_.header_.get()); |
1837 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1724 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1838 | 1725 |
1839 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1726 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
1840 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1727 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
1841 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | 1728 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
1842 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); | 1729 EXPECT_EQ(0xBA, frame.entropy_hash); |
1843 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); | 1730 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.largest_observed); |
1844 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); | 1731 ASSERT_EQ(1u, frame.missing_packets.size()); |
1845 SequenceNumberSet::const_iterator missing_iter = | 1732 SequenceNumberSet::const_iterator missing_iter = |
1846 frame.received_info.missing_packets.begin(); | 1733 frame.missing_packets.begin(); |
1847 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); | 1734 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); |
1848 | 1735 |
1849 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | 1736 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; |
1850 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 1737 const size_t kLargestObservedOffset = kReceivedEntropyOffset + |
1851 kQuicEntropyHashSize; | 1738 kQuicEntropyHashSize; |
1852 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | 1739 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + |
1853 PACKET_6BYTE_SEQUENCE_NUMBER; | 1740 PACKET_6BYTE_SEQUENCE_NUMBER; |
1854 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | 1741 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + |
1855 kQuicDeltaTimeLargestObservedSize; | 1742 kQuicDeltaTimeLargestObservedSize; |
1856 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | 1743 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + |
(...skipping 24 matching lines...) Expand all Loading... |
1881 } | 1768 } |
1882 CheckProcessingFails( | 1769 CheckProcessingFails( |
1883 packet, | 1770 packet, |
1884 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 1771 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
1885 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 1772 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
1886 expected_error, QUIC_INVALID_ACK_DATA); | 1773 expected_error, QUIC_INVALID_ACK_DATA); |
1887 } | 1774 } |
1888 } | 1775 } |
1889 | 1776 |
1890 TEST_P(QuicFramerTest, AckFrameRevivedPackets) { | 1777 TEST_P(QuicFramerTest, AckFrameRevivedPackets) { |
1891 if (framer_.version() <= QUIC_VERSION_15) { | |
1892 return; | |
1893 } | |
1894 | |
1895 unsigned char packet[] = { | 1778 unsigned char packet[] = { |
1896 // public flags (8 byte connection_id) | 1779 // public flags (8 byte connection_id) |
1897 0x3C, | 1780 0x3C, |
1898 // connection_id | 1781 // connection_id |
1899 0x10, 0x32, 0x54, 0x76, | 1782 0x10, 0x32, 0x54, 0x76, |
1900 0x98, 0xBA, 0xDC, 0xFE, | 1783 0x98, 0xBA, 0xDC, 0xFE, |
1901 // packet sequence number | 1784 // packet sequence number |
1902 0xA8, 0x9A, 0x78, 0x56, | 1785 0xA8, 0x9A, 0x78, 0x56, |
1903 0x34, 0x12, | 1786 0x34, 0x12, |
1904 // private flags (entropy) | 1787 // private flags (entropy) |
(...skipping 25 matching lines...) Expand all Loading... |
1930 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1813 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1931 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1814 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1932 | 1815 |
1933 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1816 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1934 ASSERT_TRUE(visitor_.header_.get()); | 1817 ASSERT_TRUE(visitor_.header_.get()); |
1935 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1818 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1936 | 1819 |
1937 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1820 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
1938 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1821 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
1939 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | 1822 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
1940 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); | 1823 EXPECT_EQ(0xBA, frame.entropy_hash); |
1941 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); | 1824 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.largest_observed); |
1942 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); | 1825 ASSERT_EQ(1u, frame.missing_packets.size()); |
1943 SequenceNumberSet::const_iterator missing_iter = | 1826 SequenceNumberSet::const_iterator missing_iter = |
1944 frame.received_info.missing_packets.begin(); | 1827 frame.missing_packets.begin(); |
1945 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); | 1828 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); |
1946 | 1829 |
1947 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | 1830 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; |
1948 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 1831 const size_t kLargestObservedOffset = kReceivedEntropyOffset + |
1949 kQuicEntropyHashSize; | 1832 kQuicEntropyHashSize; |
1950 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | 1833 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + |
1951 PACKET_6BYTE_SEQUENCE_NUMBER; | 1834 PACKET_6BYTE_SEQUENCE_NUMBER; |
1952 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | 1835 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + |
1953 kQuicDeltaTimeLargestObservedSize; | 1836 kQuicDeltaTimeLargestObservedSize; |
1954 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | 1837 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + |
(...skipping 29 matching lines...) Expand all Loading... |
1984 expected_error = "Unable to read revived packet."; | 1867 expected_error = "Unable to read revived packet."; |
1985 } | 1868 } |
1986 CheckProcessingFails( | 1869 CheckProcessingFails( |
1987 packet, | 1870 packet, |
1988 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 1871 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
1989 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 1872 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
1990 expected_error, QUIC_INVALID_ACK_DATA); | 1873 expected_error, QUIC_INVALID_ACK_DATA); |
1991 } | 1874 } |
1992 } | 1875 } |
1993 | 1876 |
1994 TEST_P(QuicFramerTest, AckFrameRevivedPackets15) { | 1877 TEST_P(QuicFramerTest, AckFrameNoNacks) { |
1995 if (framer_.version() != QUIC_VERSION_15) { | |
1996 return; | |
1997 } | |
1998 | |
1999 unsigned char packet[] = { | 1878 unsigned char packet[] = { |
2000 // public flags (8 byte connection_id) | 1879 // public flags (8 byte connection_id) |
2001 0x3C, | 1880 0x3C, |
2002 // connection_id | |
2003 0x10, 0x32, 0x54, 0x76, | |
2004 0x98, 0xBA, 0xDC, 0xFE, | |
2005 // packet sequence number | |
2006 0xA8, 0x9A, 0x78, 0x56, | |
2007 0x34, 0x12, | |
2008 // private flags (entropy) | |
2009 0x01, | |
2010 | |
2011 // frame type (ack frame) | |
2012 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
2013 0x6C, | |
2014 // entropy hash of sent packets till least awaiting - 1. | |
2015 0xAB, | |
2016 // least packet sequence number awaiting an ack, delta from sequence number. | |
2017 0x08, 0x00, 0x00, 0x00, | |
2018 0x00, 0x00, | |
2019 // entropy hash of all received packets. | |
2020 0xBA, | |
2021 // largest observed packet sequence number | |
2022 0xBF, 0x9A, 0x78, 0x56, | |
2023 0x34, 0x12, | |
2024 // Zero delta time. | |
2025 0x0, 0x0, | |
2026 // num missing packets | |
2027 0x01, | |
2028 // missing packet delta | |
2029 0x01, | |
2030 // 0 more missing packets in range. | |
2031 0x00, | |
2032 // Number of revived packets. | |
2033 0x01, | |
2034 // Revived packet sequence number. | |
2035 0xBE, 0x9A, 0x78, 0x56, | |
2036 0x34, 0x12, | |
2037 }; | |
2038 | |
2039 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
2040 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
2041 | |
2042 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
2043 ASSERT_TRUE(visitor_.header_.get()); | |
2044 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | |
2045 | |
2046 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
2047 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
2048 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | |
2049 EXPECT_EQ(0xAB, frame.sent_info.entropy_hash); | |
2050 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); | |
2051 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); | |
2052 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); | |
2053 SequenceNumberSet::const_iterator missing_iter = | |
2054 frame.received_info.missing_packets.begin(); | |
2055 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); | |
2056 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked); | |
2057 | |
2058 const size_t kSentEntropyOffset = kQuicFrameTypeSize; | |
2059 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; | |
2060 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + | |
2061 PACKET_6BYTE_SEQUENCE_NUMBER; | |
2062 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | |
2063 kQuicEntropyHashSize; | |
2064 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | |
2065 PACKET_6BYTE_SEQUENCE_NUMBER; | |
2066 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | |
2067 kQuicDeltaTimeLargestObservedSize; | |
2068 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | |
2069 kNumberOfNackRangesSize; | |
2070 const size_t kMissingPacketsRange = kMissingPacketsOffset + | |
2071 PACKET_1BYTE_SEQUENCE_NUMBER; | |
2072 const size_t kRevivedPacketsLength = kMissingPacketsRange + | |
2073 PACKET_1BYTE_SEQUENCE_NUMBER; | |
2074 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength + | |
2075 PACKET_1BYTE_SEQUENCE_NUMBER; | |
2076 // Now test framing boundaries | |
2077 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength + | |
2078 PACKET_6BYTE_SEQUENCE_NUMBER; | |
2079 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | |
2080 string expected_error; | |
2081 if (i < kLeastUnackedOffset) { | |
2082 expected_error = "Unable to read entropy hash for sent packets."; | |
2083 } else if (i < kReceivedEntropyOffset) { | |
2084 expected_error = "Unable to read least unacked delta."; | |
2085 } else if (i < kLargestObservedOffset) { | |
2086 expected_error = "Unable to read entropy hash for received packets."; | |
2087 } else if (i < kMissingDeltaTimeOffset) { | |
2088 expected_error = "Unable to read largest observed."; | |
2089 } else if (i < kNumMissingPacketOffset) { | |
2090 expected_error = "Unable to read delta time largest observed."; | |
2091 } else if (i < kMissingPacketsOffset) { | |
2092 expected_error = "Unable to read num missing packet ranges."; | |
2093 } else if (i < kMissingPacketsRange) { | |
2094 expected_error = "Unable to read missing sequence number delta."; | |
2095 } else if (i < kRevivedPacketsLength) { | |
2096 expected_error = "Unable to read missing sequence number range."; | |
2097 } else if (i < kRevivedPacketSequenceNumberLength) { | |
2098 expected_error = "Unable to read num revived packets."; | |
2099 } else { | |
2100 expected_error = "Unable to read revived packet."; | |
2101 } | |
2102 CheckProcessingFails( | |
2103 packet, | |
2104 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | |
2105 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | |
2106 expected_error, QUIC_INVALID_ACK_DATA); | |
2107 } | |
2108 } | |
2109 | |
2110 TEST_P(QuicFramerTest, AckFrameNoNacks) { | |
2111 if (framer_.version() <= QUIC_VERSION_15) { | |
2112 return; | |
2113 } | |
2114 unsigned char packet[] = { | |
2115 // public flags (8 byte connection_id) | |
2116 0x3C, | |
2117 // connection_id | |
2118 0x10, 0x32, 0x54, 0x76, | |
2119 0x98, 0xBA, 0xDC, 0xFE, | |
2120 // packet sequence number | |
2121 0xA8, 0x9A, 0x78, 0x56, | |
2122 0x34, 0x12, | |
2123 // private flags (entropy) | |
2124 0x01, | |
2125 | |
2126 // frame type (ack frame) | |
2127 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
2128 0x4C, | |
2129 // entropy hash of all received packets. | |
2130 0xBA, | |
2131 // largest observed packet sequence number | |
2132 0xBF, 0x9A, 0x78, 0x56, | |
2133 0x34, 0x12, | |
2134 // Zero delta time. | |
2135 0x0, 0x0, | |
2136 }; | |
2137 | |
2138 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
2139 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
2140 | |
2141 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
2142 ASSERT_TRUE(visitor_.header_.get()); | |
2143 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | |
2144 | |
2145 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
2146 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
2147 QuicAckFrame* frame = visitor_.ack_frames_[0]; | |
2148 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); | |
2149 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), | |
2150 frame->received_info.largest_observed); | |
2151 ASSERT_EQ(0u, frame->received_info.missing_packets.size()); | |
2152 | |
2153 // Verify that the packet re-serializes identically. | |
2154 QuicFrames frames; | |
2155 frames.push_back(QuicFrame(frame)); | |
2156 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); | |
2157 ASSERT_TRUE(data != NULL); | |
2158 | |
2159 test::CompareCharArraysWithHexError("constructed packet", | |
2160 data->data(), data->length(), | |
2161 AsChars(packet), arraysize(packet)); | |
2162 } | |
2163 | |
2164 TEST_P(QuicFramerTest, AckFrameNoNacks15) { | |
2165 if (framer_.version() > QUIC_VERSION_15) { | |
2166 return; | |
2167 } | |
2168 unsigned char packet[] = { | |
2169 // public flags (8 byte connection_id) | |
2170 0x3C, | |
2171 // connection_id | |
2172 0x10, 0x32, 0x54, 0x76, | |
2173 0x98, 0xBA, 0xDC, 0xFE, | |
2174 // packet sequence number | |
2175 0xA8, 0x9A, 0x78, 0x56, | |
2176 0x34, 0x12, | |
2177 // private flags (entropy) | |
2178 0x01, | |
2179 | |
2180 // frame type (ack frame) | |
2181 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
2182 0x4C, | |
2183 // entropy hash of sent packets till least awaiting - 1. | |
2184 0xAB, | |
2185 // least packet sequence number awaiting an ack, delta from sequence number. | |
2186 0x08, 0x00, 0x00, 0x00, | |
2187 0x00, 0x00, | |
2188 // entropy hash of all received packets. | |
2189 0xBA, | |
2190 // largest observed packet sequence number | |
2191 0xBF, 0x9A, 0x78, 0x56, | |
2192 0x34, 0x12, | |
2193 // Zero delta time. | |
2194 0x0, 0x0, | |
2195 }; | |
2196 | |
2197 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
2198 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
2199 | |
2200 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
2201 ASSERT_TRUE(visitor_.header_.get()); | |
2202 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | |
2203 | |
2204 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
2205 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
2206 QuicAckFrame* frame = visitor_.ack_frames_[0]; | |
2207 EXPECT_EQ(0xAB, frame->sent_info.entropy_hash); | |
2208 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); | |
2209 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), | |
2210 frame->received_info.largest_observed); | |
2211 ASSERT_EQ(0u, frame->received_info.missing_packets.size()); | |
2212 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked); | |
2213 | |
2214 // Verify that the packet re-serializes identically. | |
2215 QuicFrames frames; | |
2216 frames.push_back(QuicFrame(frame)); | |
2217 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); | |
2218 ASSERT_TRUE(data != NULL); | |
2219 | |
2220 test::CompareCharArraysWithHexError("constructed packet", | |
2221 data->data(), data->length(), | |
2222 AsChars(packet), arraysize(packet)); | |
2223 } | |
2224 | |
2225 TEST_P(QuicFramerTest, AckFrame500Nacks) { | |
2226 if (framer_.version() <= QUIC_VERSION_15) { | |
2227 return; | |
2228 } | |
2229 unsigned char packet[] = { | |
2230 // public flags (8 byte connection_id) | |
2231 0x3C, | |
2232 // connection_id | 1881 // connection_id |
2233 0x10, 0x32, 0x54, 0x76, | 1882 0x10, 0x32, 0x54, 0x76, |
2234 0x98, 0xBA, 0xDC, 0xFE, | 1883 0x98, 0xBA, 0xDC, 0xFE, |
2235 // packet sequence number | 1884 // packet sequence number |
2236 0xA8, 0x9A, 0x78, 0x56, | 1885 0xA8, 0x9A, 0x78, 0x56, |
2237 0x34, 0x12, | 1886 0x34, 0x12, |
2238 // private flags (entropy) | 1887 // private flags (entropy) |
2239 0x01, | 1888 0x01, |
2240 | 1889 |
2241 // frame type (ack frame) | 1890 // frame type (ack frame) |
2242 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 1891 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2243 0x6C, | 1892 0x4C, |
2244 // entropy hash of all received packets. | 1893 // entropy hash of all received packets. |
2245 0xBA, | 1894 0xBA, |
2246 // largest observed packet sequence number | 1895 // largest observed packet sequence number |
2247 0xBF, 0x9A, 0x78, 0x56, | 1896 0xBF, 0x9A, 0x78, 0x56, |
2248 0x34, 0x12, | 1897 0x34, 0x12, |
2249 // Zero delta time. | 1898 // Zero delta time. |
2250 0x0, 0x0, | 1899 0x0, 0x0, |
2251 // num missing packet ranges | |
2252 0x02, | |
2253 // missing packet delta | |
2254 0x01, | |
2255 // 243 more missing packets in range. | |
2256 // The ranges are listed in this order so the re-constructed packet matches. | |
2257 0xF3, | |
2258 // No gap between ranges | |
2259 0x00, | |
2260 // 255 more missing packets in range. | |
2261 0xFF, | |
2262 // No revived packets. | |
2263 0x00, | |
2264 }; | 1900 }; |
2265 | 1901 |
2266 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1902 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2267 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1903 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2268 | 1904 |
2269 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1905 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2270 ASSERT_TRUE(visitor_.header_.get()); | 1906 ASSERT_TRUE(visitor_.header_.get()); |
2271 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1907 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2272 | 1908 |
2273 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1909 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
2274 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1910 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
2275 QuicAckFrame* frame = visitor_.ack_frames_[0]; | 1911 QuicAckFrame* frame = visitor_.ack_frames_[0]; |
2276 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); | 1912 EXPECT_EQ(0xBA, frame->entropy_hash); |
2277 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), | 1913 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame->largest_observed); |
2278 frame->received_info.largest_observed); | 1914 ASSERT_EQ(0u, frame->missing_packets.size()); |
2279 EXPECT_EQ(0u, frame->received_info.revived_packets.size()); | |
2280 ASSERT_EQ(500u, frame->received_info.missing_packets.size()); | |
2281 SequenceNumberSet::const_iterator first_missing_iter = | |
2282 frame->received_info.missing_packets.begin(); | |
2283 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE) - 499, *first_missing_iter); | |
2284 SequenceNumberSet::const_reverse_iterator last_missing_iter = | |
2285 frame->received_info.missing_packets.rbegin(); | |
2286 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *last_missing_iter); | |
2287 | 1915 |
2288 // Verify that the packet re-serializes identically. | 1916 // Verify that the packet re-serializes identically. |
2289 QuicFrames frames; | 1917 QuicFrames frames; |
2290 frames.push_back(QuicFrame(frame)); | 1918 frames.push_back(QuicFrame(frame)); |
2291 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); | 1919 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); |
2292 ASSERT_TRUE(data != NULL); | 1920 ASSERT_TRUE(data != NULL); |
2293 | 1921 |
2294 test::CompareCharArraysWithHexError("constructed packet", | 1922 test::CompareCharArraysWithHexError("constructed packet", |
2295 data->data(), data->length(), | 1923 data->data(), data->length(), |
2296 AsChars(packet), arraysize(packet)); | 1924 AsChars(packet), arraysize(packet)); |
2297 } | 1925 } |
2298 | 1926 |
2299 TEST_P(QuicFramerTest, AckFrame500Nacks15) { | 1927 TEST_P(QuicFramerTest, AckFrame500Nacks) { |
2300 if (framer_.version() != QUIC_VERSION_15) { | |
2301 return; | |
2302 } | |
2303 unsigned char packet[] = { | 1928 unsigned char packet[] = { |
2304 // public flags (8 byte connection_id) | 1929 // public flags (8 byte connection_id) |
2305 0x3C, | 1930 0x3C, |
2306 // connection_id | 1931 // connection_id |
2307 0x10, 0x32, 0x54, 0x76, | 1932 0x10, 0x32, 0x54, 0x76, |
2308 0x98, 0xBA, 0xDC, 0xFE, | 1933 0x98, 0xBA, 0xDC, 0xFE, |
2309 // packet sequence number | 1934 // packet sequence number |
2310 0xA8, 0x9A, 0x78, 0x56, | 1935 0xA8, 0x9A, 0x78, 0x56, |
2311 0x34, 0x12, | 1936 0x34, 0x12, |
2312 // private flags (entropy) | 1937 // private flags (entropy) |
2313 0x01, | 1938 0x01, |
2314 | 1939 |
2315 // frame type (ack frame) | 1940 // frame type (ack frame) |
2316 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 1941 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2317 0x6C, | 1942 0x6C, |
2318 // entropy hash of sent packets till least awaiting - 1. | |
2319 0xAB, | |
2320 // least packet sequence number awaiting an ack, delta from sequence number. | |
2321 0x08, 0x00, 0x00, 0x00, | |
2322 0x00, 0x00, | |
2323 // entropy hash of all received packets. | 1943 // entropy hash of all received packets. |
2324 0xBA, | 1944 0xBA, |
2325 // largest observed packet sequence number | 1945 // largest observed packet sequence number |
2326 0xBF, 0x9A, 0x78, 0x56, | 1946 0xBF, 0x9A, 0x78, 0x56, |
2327 0x34, 0x12, | 1947 0x34, 0x12, |
2328 // Zero delta time. | 1948 // Zero delta time. |
2329 0x0, 0x0, | 1949 0x0, 0x0, |
2330 // num missing packet ranges | 1950 // num missing packet ranges |
2331 0x02, | 1951 0x02, |
2332 // missing packet delta | 1952 // missing packet delta |
(...skipping 12 matching lines...) Expand all Loading... |
2345 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1965 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2346 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1966 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2347 | 1967 |
2348 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1968 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2349 ASSERT_TRUE(visitor_.header_.get()); | 1969 ASSERT_TRUE(visitor_.header_.get()); |
2350 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1970 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2351 | 1971 |
2352 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1972 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
2353 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1973 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
2354 QuicAckFrame* frame = visitor_.ack_frames_[0]; | 1974 QuicAckFrame* frame = visitor_.ack_frames_[0]; |
2355 EXPECT_EQ(0xAB, frame->sent_info.entropy_hash); | 1975 EXPECT_EQ(0xBA, frame->entropy_hash); |
2356 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); | 1976 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame->largest_observed); |
2357 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), | 1977 EXPECT_EQ(0u, frame->revived_packets.size()); |
2358 frame->received_info.largest_observed); | 1978 ASSERT_EQ(500u, frame->missing_packets.size()); |
2359 EXPECT_EQ(0u, frame->received_info.revived_packets.size()); | |
2360 ASSERT_EQ(500u, frame->received_info.missing_packets.size()); | |
2361 SequenceNumberSet::const_iterator first_missing_iter = | 1979 SequenceNumberSet::const_iterator first_missing_iter = |
2362 frame->received_info.missing_packets.begin(); | 1980 frame->missing_packets.begin(); |
2363 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE) - 499, *first_missing_iter); | 1981 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE) - 499, *first_missing_iter); |
2364 SequenceNumberSet::const_reverse_iterator last_missing_iter = | 1982 SequenceNumberSet::const_reverse_iterator last_missing_iter = |
2365 frame->received_info.missing_packets.rbegin(); | 1983 frame->missing_packets.rbegin(); |
2366 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *last_missing_iter); | 1984 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *last_missing_iter); |
2367 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked); | |
2368 | 1985 |
2369 // Verify that the packet re-serializes identically. | 1986 // Verify that the packet re-serializes identically. |
2370 QuicFrames frames; | 1987 QuicFrames frames; |
2371 frames.push_back(QuicFrame(frame)); | 1988 frames.push_back(QuicFrame(frame)); |
2372 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); | 1989 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); |
2373 ASSERT_TRUE(data != NULL); | 1990 ASSERT_TRUE(data != NULL); |
2374 | 1991 |
2375 test::CompareCharArraysWithHexError("constructed packet", | 1992 test::CompareCharArraysWithHexError("constructed packet", |
2376 data->data(), data->length(), | 1993 data->data(), data->length(), |
2377 AsChars(packet), arraysize(packet)); | 1994 AsChars(packet), arraysize(packet)); |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2511 expected_error = "Unable to read time delta in received packets."; | 2128 expected_error = "Unable to read time delta in received packets."; |
2512 } | 2129 } |
2513 CheckProcessingFails( | 2130 CheckProcessingFails( |
2514 packet, | 2131 packet, |
2515 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2132 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
2516 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2133 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
2517 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA); | 2134 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA); |
2518 } | 2135 } |
2519 } | 2136 } |
2520 | 2137 |
2521 TEST_P(QuicFramerTest, CongestionFeedbackFrameFixRate) { | |
2522 unsigned char packet[] = { | |
2523 // public flags (8 byte connection_id) | |
2524 0x3C, | |
2525 // connection_id | |
2526 0x10, 0x32, 0x54, 0x76, | |
2527 0x98, 0xBA, 0xDC, 0xFE, | |
2528 // packet sequence number | |
2529 0xBC, 0x9A, 0x78, 0x56, | |
2530 0x34, 0x12, | |
2531 // private flags | |
2532 0x00, | |
2533 | |
2534 // frame type (congestion feedback frame) | |
2535 0x20, | |
2536 // congestion feedback type (fix rate) | |
2537 0x02, | |
2538 // bitrate_in_bytes_per_second; | |
2539 0x01, 0x02, 0x03, 0x04, | |
2540 }; | |
2541 | |
2542 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
2543 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
2544 | |
2545 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
2546 ASSERT_TRUE(visitor_.header_.get()); | |
2547 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | |
2548 | |
2549 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
2550 ASSERT_EQ(1u, visitor_.congestion_feedback_frames_.size()); | |
2551 const QuicCongestionFeedbackFrame& frame = | |
2552 *visitor_.congestion_feedback_frames_[0]; | |
2553 ASSERT_EQ(kFixRate, frame.type); | |
2554 EXPECT_EQ(static_cast<uint32>(0x04030201), | |
2555 frame.fix_rate.bitrate.ToBytesPerSecond()); | |
2556 | |
2557 // Now test framing boundaries | |
2558 for (size_t i = kQuicFrameTypeSize; i < 6; ++i) { | |
2559 string expected_error; | |
2560 if (i < 2) { | |
2561 expected_error = "Unable to read congestion feedback type."; | |
2562 } else if (i < 6) { | |
2563 expected_error = "Unable to read bitrate."; | |
2564 } | |
2565 CheckProcessingFails( | |
2566 packet, | |
2567 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | |
2568 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | |
2569 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA); | |
2570 } | |
2571 } | |
2572 | |
2573 TEST_P(QuicFramerTest, CongestionFeedbackFrameInvalidFeedback) { | 2138 TEST_P(QuicFramerTest, CongestionFeedbackFrameInvalidFeedback) { |
2574 unsigned char packet[] = { | 2139 unsigned char packet[] = { |
2575 // public flags (8 byte connection_id) | 2140 // public flags (8 byte connection_id) |
2576 0x3C, | 2141 0x3C, |
2577 // connection_id | 2142 // connection_id |
2578 0x10, 0x32, 0x54, 0x76, | 2143 0x10, 0x32, 0x54, 0x76, |
2579 0x98, 0xBA, 0xDC, 0xFE, | 2144 0x98, 0xBA, 0xDC, 0xFE, |
2580 // packet sequence number | 2145 // packet sequence number |
2581 0xBC, 0x9A, 0x78, 0x56, | 2146 0xBC, 0x9A, 0x78, 0x56, |
2582 0x34, 0x12, | 2147 0x34, 0x12, |
2583 // private flags | 2148 // private flags |
2584 0x00, | 2149 0x00, |
2585 | 2150 |
2586 // frame type (congestion feedback frame) | 2151 // frame type (congestion feedback frame) |
2587 0x20, | 2152 0x20, |
2588 // congestion feedback type (invalid) | 2153 // congestion feedback type (invalid) |
2589 0x03, | 2154 0x03, |
2590 }; | 2155 }; |
2591 | 2156 |
2592 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2157 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2593 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 2158 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
2594 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2159 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2595 EXPECT_EQ(QUIC_INVALID_CONGESTION_FEEDBACK_DATA, framer_.error()); | 2160 EXPECT_EQ(QUIC_INVALID_CONGESTION_FEEDBACK_DATA, framer_.error()); |
2596 } | 2161 } |
2597 | 2162 |
2598 TEST_P(QuicFramerTest, StopWaitingFrame) { | 2163 TEST_P(QuicFramerTest, StopWaitingFrame) { |
2599 if (framer_.version() <= QUIC_VERSION_15) { | |
2600 return; | |
2601 } | |
2602 unsigned char packet[] = { | 2164 unsigned char packet[] = { |
2603 // public flags (8 byte connection_id) | 2165 // public flags (8 byte connection_id) |
2604 0x3C, | 2166 0x3C, |
2605 // connection_id | 2167 // connection_id |
2606 0x10, 0x32, 0x54, 0x76, | 2168 0x10, 0x32, 0x54, 0x76, |
2607 0x98, 0xBA, 0xDC, 0xFE, | 2169 0x98, 0xBA, 0xDC, 0xFE, |
2608 // packet sequence number | 2170 // packet sequence number |
2609 0xA8, 0x9A, 0x78, 0x56, | 2171 0xA8, 0x9A, 0x78, 0x56, |
2610 0x34, 0x12, | 2172 0x34, 0x12, |
2611 // private flags (entropy) | 2173 // private flags (entropy) |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2694 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2256 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2695 | 2257 |
2696 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.rst_stream_frame_.stream_id); | 2258 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.rst_stream_frame_.stream_id); |
2697 EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code); | 2259 EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code); |
2698 EXPECT_EQ("because I can", visitor_.rst_stream_frame_.error_details); | 2260 EXPECT_EQ("because I can", visitor_.rst_stream_frame_.error_details); |
2699 EXPECT_EQ(GG_UINT64_C(0x0807060504030201), | 2261 EXPECT_EQ(GG_UINT64_C(0x0807060504030201), |
2700 visitor_.rst_stream_frame_.byte_offset); | 2262 visitor_.rst_stream_frame_.byte_offset); |
2701 | 2263 |
2702 // Now test framing boundaries | 2264 // Now test framing boundaries |
2703 for (size_t i = kQuicFrameTypeSize; | 2265 for (size_t i = kQuicFrameTypeSize; |
2704 i < QuicFramer::GetMinRstStreamFrameSize(version_); ++i) { | 2266 i < QuicFramer::GetMinRstStreamFrameSize(); ++i) { |
2705 string expected_error; | 2267 string expected_error; |
2706 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { | 2268 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { |
2707 expected_error = "Unable to read stream_id."; | 2269 expected_error = "Unable to read stream_id."; |
2708 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + | 2270 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + |
2709 + kQuicMaxStreamOffsetSize) { | 2271 + kQuicMaxStreamOffsetSize) { |
2710 expected_error = "Unable to read rst stream sent byte offset."; | 2272 expected_error = "Unable to read rst stream sent byte offset."; |
2711 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + | 2273 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + |
2712 + kQuicMaxStreamOffsetSize + kQuicErrorCodeSize) { | 2274 + kQuicMaxStreamOffsetSize + kQuicErrorCodeSize) { |
2713 expected_error = "Unable to read rst stream error code."; | 2275 expected_error = "Unable to read rst stream error code."; |
2714 } else { | 2276 } else { |
(...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3575 versions.push_back(GetParam()); | 3137 versions.push_back(GetParam()); |
3576 scoped_ptr<QuicEncryptedPacket> data( | 3138 scoped_ptr<QuicEncryptedPacket> data( |
3577 framer_.BuildVersionNegotiationPacket(header, versions)); | 3139 framer_.BuildVersionNegotiationPacket(header, versions)); |
3578 | 3140 |
3579 test::CompareCharArraysWithHexError("constructed packet", | 3141 test::CompareCharArraysWithHexError("constructed packet", |
3580 data->data(), data->length(), | 3142 data->data(), data->length(), |
3581 AsChars(packet), arraysize(packet)); | 3143 AsChars(packet), arraysize(packet)); |
3582 } | 3144 } |
3583 | 3145 |
3584 TEST_P(QuicFramerTest, BuildAckFramePacket) { | 3146 TEST_P(QuicFramerTest, BuildAckFramePacket) { |
3585 if (version_ <= QUIC_VERSION_15) { | |
3586 return; | |
3587 } | |
3588 QuicPacketHeader header; | 3147 QuicPacketHeader header; |
3589 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3148 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3590 header.public_header.reset_flag = false; | 3149 header.public_header.reset_flag = false; |
3591 header.public_header.version_flag = false; | |
3592 header.fec_flag = false; | |
3593 header.entropy_flag = true; | |
3594 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | |
3595 header.fec_group = 0; | |
3596 | |
3597 QuicAckFrame ack_frame; | |
3598 ack_frame.received_info.entropy_hash = 0x43; | |
3599 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF); | |
3600 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); | |
3601 ack_frame.received_info.missing_packets.insert( | |
3602 GG_UINT64_C(0x770123456789ABE)); | |
3603 | |
3604 QuicFrames frames; | |
3605 frames.push_back(QuicFrame(&ack_frame)); | |
3606 | |
3607 unsigned char packet[] = { | |
3608 // public flags (8 byte connection_id) | |
3609 0x3C, | |
3610 // connection_id | |
3611 0x10, 0x32, 0x54, 0x76, | |
3612 0x98, 0xBA, 0xDC, 0xFE, | |
3613 // packet sequence number | |
3614 0xA8, 0x9A, 0x78, 0x56, | |
3615 0x34, 0x12, | |
3616 // private flags (entropy) | |
3617 0x01, | |
3618 | |
3619 // frame type (ack frame) | |
3620 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
3621 0x6C, | |
3622 // entropy hash of all received packets. | |
3623 0x43, | |
3624 // largest observed packet sequence number | |
3625 0xBF, 0x9A, 0x78, 0x56, | |
3626 0x34, 0x12, | |
3627 // Zero delta time. | |
3628 0x0, 0x0, | |
3629 // num missing packet ranges | |
3630 0x01, | |
3631 // missing packet delta | |
3632 0x01, | |
3633 // 0 more missing packets in range. | |
3634 0x00, | |
3635 // 0 revived packets. | |
3636 0x00, | |
3637 }; | |
3638 | |
3639 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | |
3640 ASSERT_TRUE(data != NULL); | |
3641 | |
3642 test::CompareCharArraysWithHexError("constructed packet", | |
3643 data->data(), data->length(), | |
3644 AsChars(packet), arraysize(packet)); | |
3645 } | |
3646 | |
3647 TEST_P(QuicFramerTest, BuildAckFramePacket15) { | |
3648 if (version_ != QUIC_VERSION_15) { | |
3649 return; | |
3650 } | |
3651 QuicPacketHeader header; | |
3652 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | |
3653 header.public_header.reset_flag = false; | |
3654 header.public_header.version_flag = false; | 3150 header.public_header.version_flag = false; |
3655 header.fec_flag = false; | 3151 header.fec_flag = false; |
3656 header.entropy_flag = true; | 3152 header.entropy_flag = true; |
3657 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | 3153 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
3658 header.fec_group = 0; | 3154 header.fec_group = 0; |
3659 | 3155 |
3660 QuicAckFrame ack_frame; | 3156 QuicAckFrame ack_frame; |
3661 ack_frame.received_info.entropy_hash = 0x43; | 3157 ack_frame.entropy_hash = 0x43; |
3662 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF); | 3158 ack_frame.largest_observed = GG_UINT64_C(0x770123456789ABF); |
3663 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); | 3159 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); |
3664 ack_frame.received_info.missing_packets.insert( | 3160 ack_frame.missing_packets.insert( |
3665 GG_UINT64_C(0x770123456789ABE)); | 3161 GG_UINT64_C(0x770123456789ABE)); |
3666 ack_frame.sent_info.entropy_hash = 0x14; | |
3667 ack_frame.sent_info.least_unacked = GG_UINT64_C(0x770123456789AA0); | |
3668 | 3162 |
3669 QuicFrames frames; | 3163 QuicFrames frames; |
3670 frames.push_back(QuicFrame(&ack_frame)); | 3164 frames.push_back(QuicFrame(&ack_frame)); |
3671 | 3165 |
3672 unsigned char packet[] = { | 3166 unsigned char packet[] = { |
3673 // public flags (8 byte connection_id) | 3167 // public flags (8 byte connection_id) |
3674 0x3C, | 3168 0x3C, |
3675 // connection_id | 3169 // connection_id |
3676 0x10, 0x32, 0x54, 0x76, | 3170 0x10, 0x32, 0x54, 0x76, |
3677 0x98, 0xBA, 0xDC, 0xFE, | 3171 0x98, 0xBA, 0xDC, 0xFE, |
3678 // packet sequence number | 3172 // packet sequence number |
3679 0xA8, 0x9A, 0x78, 0x56, | 3173 0xA8, 0x9A, 0x78, 0x56, |
3680 0x34, 0x12, | 3174 0x34, 0x12, |
3681 // private flags (entropy) | 3175 // private flags (entropy) |
3682 0x01, | 3176 0x01, |
3683 | 3177 |
3684 // frame type (ack frame) | 3178 // frame type (ack frame) |
3685 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 3179 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
3686 0x6C, | 3180 0x6C, |
3687 // entropy hash of sent packets till least awaiting - 1. | |
3688 0x14, | |
3689 // least packet sequence number awaiting an ack, delta from sequence number. | |
3690 0x08, 0x00, 0x00, 0x00, | |
3691 0x00, 0x00, | |
3692 // entropy hash of all received packets. | 3181 // entropy hash of all received packets. |
3693 0x43, | 3182 0x43, |
3694 // largest observed packet sequence number | 3183 // largest observed packet sequence number |
3695 0xBF, 0x9A, 0x78, 0x56, | 3184 0xBF, 0x9A, 0x78, 0x56, |
3696 0x34, 0x12, | 3185 0x34, 0x12, |
3697 // Zero delta time. | 3186 // Zero delta time. |
3698 0x0, 0x0, | 3187 0x0, 0x0, |
3699 // num missing packet ranges | 3188 // num missing packet ranges |
3700 0x01, | 3189 0x01, |
3701 // missing packet delta | 3190 // missing packet delta |
3702 0x01, | 3191 0x01, |
3703 // 0 more missing packets in range. | 3192 // 0 more missing packets in range. |
3704 0x00, | 3193 0x00, |
3705 // 0 revived packets. | 3194 // 0 revived packets. |
3706 0x00, | 3195 0x00, |
3707 }; | 3196 }; |
3708 | 3197 |
3709 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3198 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
3710 ASSERT_TRUE(data != NULL); | 3199 ASSERT_TRUE(data != NULL); |
3711 | 3200 |
3712 test::CompareCharArraysWithHexError("constructed packet", | 3201 test::CompareCharArraysWithHexError("constructed packet", |
3713 data->data(), data->length(), | 3202 data->data(), data->length(), |
3714 AsChars(packet), arraysize(packet)); | 3203 AsChars(packet), arraysize(packet)); |
3715 } | 3204 } |
3716 | 3205 |
3717 // TODO(jri): Add test for tuncated packets in which the original ack frame had | 3206 // TODO(jri): Add test for tuncated packets in which the original ack frame had |
3718 // revived packets. (In both the large and small packet cases below). | 3207 // revived packets. (In both the large and small packet cases below). |
3719 TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacket) { | 3208 TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacket) { |
3720 if (version_ <= QUIC_VERSION_15) { | |
3721 return; | |
3722 } | |
3723 QuicPacketHeader header; | 3209 QuicPacketHeader header; |
3724 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3210 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3725 header.public_header.reset_flag = false; | 3211 header.public_header.reset_flag = false; |
3726 header.public_header.version_flag = false; | 3212 header.public_header.version_flag = false; |
3727 header.fec_flag = false; | 3213 header.fec_flag = false; |
3728 header.entropy_flag = true; | 3214 header.entropy_flag = true; |
3729 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | 3215 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
3730 header.fec_group = 0; | 3216 header.fec_group = 0; |
3731 | 3217 |
3732 QuicAckFrame ack_frame; | 3218 QuicAckFrame ack_frame; |
3733 // This entropy hash is different from what shows up in the packet below, | 3219 // This entropy hash is different from what shows up in the packet below, |
3734 // since entropy is recomputed by the framer on ack truncation (by | 3220 // since entropy is recomputed by the framer on ack truncation (by |
3735 // TestEntropyCalculator for this test.) | 3221 // TestEntropyCalculator for this test.) |
3736 ack_frame.received_info.entropy_hash = 0x43; | 3222 ack_frame.entropy_hash = 0x43; |
3737 ack_frame.received_info.largest_observed = 2 * 300; | 3223 ack_frame.largest_observed = 2 * 300; |
3738 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); | 3224 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); |
3739 for (size_t i = 1; i < 2 * 300; i += 2) { | 3225 for (size_t i = 1; i < 2 * 300; i += 2) { |
3740 ack_frame.received_info.missing_packets.insert(i); | 3226 ack_frame.missing_packets.insert(i); |
3741 } | 3227 } |
3742 | 3228 |
3743 QuicFrames frames; | 3229 QuicFrames frames; |
3744 frames.push_back(QuicFrame(&ack_frame)); | 3230 frames.push_back(QuicFrame(&ack_frame)); |
3745 | 3231 |
3746 unsigned char packet[] = { | 3232 unsigned char packet[] = { |
3747 // public flags (8 byte connection_id) | 3233 // public flags (8 byte connection_id) |
3748 0x3C, | 3234 0x3C, |
3749 // connection_id | 3235 // connection_id |
3750 0x10, 0x32, 0x54, 0x76, | 3236 0x10, 0x32, 0x54, 0x76, |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3826 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet); | 3312 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet); |
3827 ASSERT_TRUE(data != NULL); | 3313 ASSERT_TRUE(data != NULL); |
3828 | 3314 |
3829 test::CompareCharArraysWithHexError("constructed packet", | 3315 test::CompareCharArraysWithHexError("constructed packet", |
3830 data->data(), data->length(), | 3316 data->data(), data->length(), |
3831 AsChars(packet), arraysize(packet)); | 3317 AsChars(packet), arraysize(packet)); |
3832 } | 3318 } |
3833 | 3319 |
3834 | 3320 |
3835 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { | 3321 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { |
3836 if (version_ <= QUIC_VERSION_15) { | |
3837 return; | |
3838 } | |
3839 QuicPacketHeader header; | 3322 QuicPacketHeader header; |
3840 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3323 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3841 header.public_header.reset_flag = false; | 3324 header.public_header.reset_flag = false; |
3842 header.public_header.version_flag = false; | 3325 header.public_header.version_flag = false; |
3843 header.fec_flag = false; | 3326 header.fec_flag = false; |
3844 header.entropy_flag = true; | 3327 header.entropy_flag = true; |
3845 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | 3328 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
3846 header.fec_group = 0; | 3329 header.fec_group = 0; |
3847 | 3330 |
3848 QuicAckFrame ack_frame; | 3331 QuicAckFrame ack_frame; |
3849 // This entropy hash is different from what shows up in the packet below, | 3332 // This entropy hash is different from what shows up in the packet below, |
3850 // since entropy is recomputed by the framer on ack truncation (by | 3333 // since entropy is recomputed by the framer on ack truncation (by |
3851 // TestEntropyCalculator for this test.) | 3334 // TestEntropyCalculator for this test.) |
3852 ack_frame.received_info.entropy_hash = 0x43; | 3335 ack_frame.entropy_hash = 0x43; |
3853 ack_frame.received_info.largest_observed = 2 * 300; | 3336 ack_frame.largest_observed = 2 * 300; |
3854 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); | 3337 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); |
3855 for (size_t i = 1; i < 2 * 300; i += 2) { | 3338 for (size_t i = 1; i < 2 * 300; i += 2) { |
3856 ack_frame.received_info.missing_packets.insert(i); | 3339 ack_frame.missing_packets.insert(i); |
3857 } | 3340 } |
3858 | 3341 |
3859 QuicFrames frames; | 3342 QuicFrames frames; |
3860 frames.push_back(QuicFrame(&ack_frame)); | 3343 frames.push_back(QuicFrame(&ack_frame)); |
3861 | 3344 |
3862 unsigned char packet[] = { | 3345 unsigned char packet[] = { |
3863 // public flags (8 byte connection_id) | 3346 // public flags (8 byte connection_id) |
3864 0x3C, | 3347 0x3C, |
3865 // connection_id | 3348 // connection_id |
3866 0x10, 0x32, 0x54, 0x76, | 3349 0x10, 0x32, 0x54, 0x76, |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4009 | 3492 |
4010 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3493 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
4011 ASSERT_TRUE(data != NULL); | 3494 ASSERT_TRUE(data != NULL); |
4012 | 3495 |
4013 test::CompareCharArraysWithHexError("constructed packet", | 3496 test::CompareCharArraysWithHexError("constructed packet", |
4014 data->data(), data->length(), | 3497 data->data(), data->length(), |
4015 AsChars(packet), arraysize(packet)); | 3498 AsChars(packet), arraysize(packet)); |
4016 } | 3499 } |
4017 | 3500 |
4018 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { | 3501 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { |
4019 if (version_ <= QUIC_VERSION_15) { | |
4020 return; | |
4021 } | |
4022 QuicPacketHeader header; | 3502 QuicPacketHeader header; |
4023 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3503 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4024 header.public_header.reset_flag = false; | 3504 header.public_header.reset_flag = false; |
4025 header.public_header.version_flag = false; | 3505 header.public_header.version_flag = false; |
4026 header.fec_flag = false; | 3506 header.fec_flag = false; |
4027 header.entropy_flag = true; | 3507 header.entropy_flag = true; |
4028 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | 3508 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
4029 header.fec_group = 0; | 3509 header.fec_group = 0; |
4030 | 3510 |
4031 QuicStopWaitingFrame stop_waiting_frame; | 3511 QuicStopWaitingFrame stop_waiting_frame; |
(...skipping 25 matching lines...) Expand all Loading... |
4057 }; | 3537 }; |
4058 | 3538 |
4059 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3539 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
4060 ASSERT_TRUE(data != NULL); | 3540 ASSERT_TRUE(data != NULL); |
4061 | 3541 |
4062 test::CompareCharArraysWithHexError("constructed packet", | 3542 test::CompareCharArraysWithHexError("constructed packet", |
4063 data->data(), data->length(), | 3543 data->data(), data->length(), |
4064 AsChars(packet), arraysize(packet)); | 3544 AsChars(packet), arraysize(packet)); |
4065 } | 3545 } |
4066 | 3546 |
4067 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketFixRate) { | |
4068 QuicPacketHeader header; | |
4069 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | |
4070 header.public_header.reset_flag = false; | |
4071 header.public_header.version_flag = false; | |
4072 header.fec_flag = false; | |
4073 header.entropy_flag = false; | |
4074 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | |
4075 header.fec_group = 0; | |
4076 | |
4077 QuicCongestionFeedbackFrame congestion_feedback_frame; | |
4078 congestion_feedback_frame.type = kFixRate; | |
4079 congestion_feedback_frame.fix_rate.bitrate | |
4080 = QuicBandwidth::FromBytesPerSecond(0x04030201); | |
4081 | |
4082 QuicFrames frames; | |
4083 frames.push_back(QuicFrame(&congestion_feedback_frame)); | |
4084 | |
4085 unsigned char packet[] = { | |
4086 // public flags (8 byte connection_id) | |
4087 0x3C, | |
4088 // connection_id | |
4089 0x10, 0x32, 0x54, 0x76, | |
4090 0x98, 0xBA, 0xDC, 0xFE, | |
4091 // packet sequence number | |
4092 0xBC, 0x9A, 0x78, 0x56, | |
4093 0x34, 0x12, | |
4094 // private flags | |
4095 0x00, | |
4096 | |
4097 // frame type (congestion feedback frame) | |
4098 0x20, | |
4099 // congestion feedback type (fix rate) | |
4100 0x02, | |
4101 // bitrate_in_bytes_per_second; | |
4102 0x01, 0x02, 0x03, 0x04, | |
4103 }; | |
4104 | |
4105 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | |
4106 ASSERT_TRUE(data != NULL); | |
4107 | |
4108 test::CompareCharArraysWithHexError("constructed packet", | |
4109 data->data(), data->length(), | |
4110 AsChars(packet), arraysize(packet)); | |
4111 } | |
4112 | |
4113 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInvalidFeedback) { | 3547 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInvalidFeedback) { |
4114 QuicPacketHeader header; | 3548 QuicPacketHeader header; |
4115 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3549 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4116 header.public_header.reset_flag = false; | 3550 header.public_header.reset_flag = false; |
4117 header.public_header.version_flag = false; | 3551 header.public_header.version_flag = false; |
4118 header.fec_flag = false; | 3552 header.fec_flag = false; |
4119 header.entropy_flag = false; | 3553 header.entropy_flag = false; |
4120 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3554 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4121 header.fec_group = 0; | 3555 header.fec_group = 0; |
4122 | 3556 |
4123 QuicCongestionFeedbackFrame congestion_feedback_frame; | 3557 QuicCongestionFeedbackFrame congestion_feedback_frame; |
4124 congestion_feedback_frame.type = | 3558 congestion_feedback_frame.type = |
4125 static_cast<CongestionFeedbackType>(kFixRate + 1); | 3559 static_cast<CongestionFeedbackType>(kInterArrival + 1); |
4126 | 3560 |
4127 QuicFrames frames; | 3561 QuicFrames frames; |
4128 frames.push_back(QuicFrame(&congestion_feedback_frame)); | 3562 frames.push_back(QuicFrame(&congestion_feedback_frame)); |
4129 | 3563 |
4130 scoped_ptr<QuicPacket> data; | 3564 scoped_ptr<QuicPacket> data; |
4131 EXPECT_DFATAL( | 3565 EXPECT_DFATAL( |
4132 data.reset(BuildDataPacket(header, frames)), | 3566 data.reset(BuildDataPacket(header, frames)), |
4133 "AppendCongestionFeedbackFrame failed"); | 3567 "AppendCongestionFeedbackFrame failed"); |
4134 ASSERT_TRUE(data == NULL); | 3568 ASSERT_TRUE(data == NULL); |
4135 } | 3569 } |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4633 PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, | 4067 PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, |
4634 PACKET_6BYTE_SEQUENCE_NUMBER)); | 4068 PACKET_6BYTE_SEQUENCE_NUMBER)); |
4635 scoped_ptr<QuicEncryptedPacket> encrypted( | 4069 scoped_ptr<QuicEncryptedPacket> encrypted( |
4636 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); | 4070 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); |
4637 | 4071 |
4638 ASSERT_TRUE(encrypted.get() != NULL); | 4072 ASSERT_TRUE(encrypted.get() != NULL); |
4639 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); | 4073 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); |
4640 } | 4074 } |
4641 | 4075 |
4642 TEST_P(QuicFramerTest, AckTruncationLargePacket) { | 4076 TEST_P(QuicFramerTest, AckTruncationLargePacket) { |
4643 if (framer_.version() <= QUIC_VERSION_15) { | |
4644 return; | |
4645 } | |
4646 QuicPacketHeader header; | 4077 QuicPacketHeader header; |
4647 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 4078 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4648 header.public_header.reset_flag = false; | 4079 header.public_header.reset_flag = false; |
4649 header.public_header.version_flag = false; | 4080 header.public_header.version_flag = false; |
4650 header.fec_flag = false; | 4081 header.fec_flag = false; |
4651 header.entropy_flag = false; | 4082 header.entropy_flag = false; |
4652 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4083 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4653 header.fec_group = 0; | 4084 header.fec_group = 0; |
4654 | 4085 |
4655 // Create a packet with just the ack. | 4086 // Create a packet with just the ack. |
4656 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); | 4087 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); |
4657 QuicFrame frame; | 4088 QuicFrame frame; |
4658 frame.type = ACK_FRAME; | 4089 frame.type = ACK_FRAME; |
4659 frame.ack_frame = &ack_frame; | 4090 frame.ack_frame = &ack_frame; |
4660 QuicFrames frames; | 4091 QuicFrames frames; |
4661 frames.push_back(frame); | 4092 frames.push_back(frame); |
4662 | 4093 |
4663 // Build an ack packet with truncation due to limit in number of nack ranges. | 4094 // Build an ack packet with truncation due to limit in number of nack ranges. |
4664 scoped_ptr<QuicPacket> raw_ack_packet( | 4095 scoped_ptr<QuicPacket> raw_ack_packet( |
4665 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet); | 4096 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet); |
4666 ASSERT_TRUE(raw_ack_packet != NULL); | 4097 ASSERT_TRUE(raw_ack_packet != NULL); |
4667 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4098 scoped_ptr<QuicEncryptedPacket> ack_packet( |
4668 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | 4099 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, |
4669 *raw_ack_packet)); | 4100 *raw_ack_packet)); |
4670 // Now make sure we can turn our ack packet back into an ack frame. | 4101 // Now make sure we can turn our ack packet back into an ack frame. |
4671 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4102 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
4672 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 4103 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
4673 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 4104 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
4674 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); | 4105 EXPECT_TRUE(processed_ack_frame.is_truncated); |
4675 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); | 4106 EXPECT_EQ(510u, processed_ack_frame.largest_observed); |
4676 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); | 4107 ASSERT_EQ(255u, processed_ack_frame.missing_packets.size()); |
4677 SequenceNumberSet::const_iterator missing_iter = | 4108 SequenceNumberSet::const_iterator missing_iter = |
4678 processed_ack_frame.received_info.missing_packets.begin(); | 4109 processed_ack_frame.missing_packets.begin(); |
4679 EXPECT_EQ(1u, *missing_iter); | 4110 EXPECT_EQ(1u, *missing_iter); |
4680 SequenceNumberSet::const_reverse_iterator last_missing_iter = | 4111 SequenceNumberSet::const_reverse_iterator last_missing_iter = |
4681 processed_ack_frame.received_info.missing_packets.rbegin(); | 4112 processed_ack_frame.missing_packets.rbegin(); |
4682 EXPECT_EQ(509u, *last_missing_iter); | 4113 EXPECT_EQ(509u, *last_missing_iter); |
4683 } | 4114 } |
4684 | 4115 |
4685 TEST_P(QuicFramerTest, AckTruncationSmallPacket) { | 4116 TEST_P(QuicFramerTest, AckTruncationSmallPacket) { |
4686 if (framer_.version() <= QUIC_VERSION_15) { | |
4687 return; | |
4688 } | |
4689 QuicPacketHeader header; | 4117 QuicPacketHeader header; |
4690 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 4118 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4691 header.public_header.reset_flag = false; | 4119 header.public_header.reset_flag = false; |
4692 header.public_header.version_flag = false; | 4120 header.public_header.version_flag = false; |
4693 header.fec_flag = false; | 4121 header.fec_flag = false; |
4694 header.entropy_flag = false; | 4122 header.entropy_flag = false; |
4695 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4123 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4696 header.fec_group = 0; | 4124 header.fec_group = 0; |
4697 | 4125 |
4698 // Create a packet with just the ack. | 4126 // Create a packet with just the ack. |
4699 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); | 4127 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); |
4700 QuicFrame frame; | 4128 QuicFrame frame; |
4701 frame.type = ACK_FRAME; | 4129 frame.type = ACK_FRAME; |
4702 frame.ack_frame = &ack_frame; | 4130 frame.ack_frame = &ack_frame; |
4703 QuicFrames frames; | 4131 QuicFrames frames; |
4704 frames.push_back(frame); | 4132 frames.push_back(frame); |
4705 | 4133 |
4706 // Build an ack packet with truncation due to limit in number of nack ranges. | 4134 // Build an ack packet with truncation due to limit in number of nack ranges. |
4707 scoped_ptr<QuicPacket> raw_ack_packet( | 4135 scoped_ptr<QuicPacket> raw_ack_packet( |
4708 framer_.BuildDataPacket(header, frames, 500).packet); | 4136 framer_.BuildDataPacket(header, frames, 500).packet); |
4709 ASSERT_TRUE(raw_ack_packet != NULL); | 4137 ASSERT_TRUE(raw_ack_packet != NULL); |
4710 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4138 scoped_ptr<QuicEncryptedPacket> ack_packet( |
4711 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | 4139 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, |
4712 *raw_ack_packet)); | 4140 *raw_ack_packet)); |
4713 // Now make sure we can turn our ack packet back into an ack frame. | 4141 // Now make sure we can turn our ack packet back into an ack frame. |
4714 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4142 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
4715 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 4143 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
4716 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 4144 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
4717 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); | 4145 EXPECT_TRUE(processed_ack_frame.is_truncated); |
4718 EXPECT_EQ(476u, processed_ack_frame.received_info.largest_observed); | 4146 EXPECT_EQ(476u, processed_ack_frame.largest_observed); |
4719 ASSERT_EQ(238u, processed_ack_frame.received_info.missing_packets.size()); | 4147 ASSERT_EQ(238u, processed_ack_frame.missing_packets.size()); |
4720 SequenceNumberSet::const_iterator missing_iter = | 4148 SequenceNumberSet::const_iterator missing_iter = |
4721 processed_ack_frame.received_info.missing_packets.begin(); | 4149 processed_ack_frame.missing_packets.begin(); |
4722 EXPECT_EQ(1u, *missing_iter); | 4150 EXPECT_EQ(1u, *missing_iter); |
4723 SequenceNumberSet::const_reverse_iterator last_missing_iter = | 4151 SequenceNumberSet::const_reverse_iterator last_missing_iter = |
4724 processed_ack_frame.received_info.missing_packets.rbegin(); | 4152 processed_ack_frame.missing_packets.rbegin(); |
4725 EXPECT_EQ(475u, *last_missing_iter); | 4153 EXPECT_EQ(475u, *last_missing_iter); |
4726 } | 4154 } |
4727 | 4155 |
4728 TEST_P(QuicFramerTest, Truncation15) { | |
4729 if (framer_.version() > QUIC_VERSION_15) { | |
4730 return; | |
4731 } | |
4732 QuicPacketHeader header; | |
4733 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | |
4734 header.public_header.reset_flag = false; | |
4735 header.public_header.version_flag = false; | |
4736 header.fec_flag = false; | |
4737 header.entropy_flag = false; | |
4738 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | |
4739 header.fec_group = 0; | |
4740 | |
4741 QuicAckFrame ack_frame; | |
4742 ack_frame.received_info.largest_observed = 601; | |
4743 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 1; | |
4744 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) { | |
4745 ack_frame.received_info.missing_packets.insert(i); | |
4746 } | |
4747 | |
4748 // Create a packet with just the ack. | |
4749 QuicFrame frame; | |
4750 frame.type = ACK_FRAME; | |
4751 frame.ack_frame = &ack_frame; | |
4752 QuicFrames frames; | |
4753 frames.push_back(frame); | |
4754 | |
4755 scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); | |
4756 ASSERT_TRUE(raw_ack_packet != NULL); | |
4757 | |
4758 scoped_ptr<QuicEncryptedPacket> ack_packet( | |
4759 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | |
4760 *raw_ack_packet)); | |
4761 | |
4762 // Now make sure we can turn our ack packet back into an ack frame. | |
4763 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | |
4764 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
4765 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | |
4766 EXPECT_EQ(header.packet_sequence_number - 1, | |
4767 processed_ack_frame.sent_info.least_unacked); | |
4768 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); | |
4769 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); | |
4770 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); | |
4771 SequenceNumberSet::const_iterator missing_iter = | |
4772 processed_ack_frame.received_info.missing_packets.begin(); | |
4773 EXPECT_EQ(1u, *missing_iter); | |
4774 SequenceNumberSet::const_reverse_iterator last_missing_iter = | |
4775 processed_ack_frame.received_info.missing_packets.rbegin(); | |
4776 EXPECT_EQ(509u, *last_missing_iter); | |
4777 } | |
4778 | |
4779 TEST_P(QuicFramerTest, CleanTruncation) { | 4156 TEST_P(QuicFramerTest, CleanTruncation) { |
4780 QuicPacketHeader header; | 4157 QuicPacketHeader header; |
4781 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 4158 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4782 header.public_header.reset_flag = false; | 4159 header.public_header.reset_flag = false; |
4783 header.public_header.version_flag = false; | 4160 header.public_header.version_flag = false; |
4784 header.fec_flag = false; | 4161 header.fec_flag = false; |
4785 header.entropy_flag = true; | 4162 header.entropy_flag = true; |
4786 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4163 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4787 header.fec_group = 0; | 4164 header.fec_group = 0; |
4788 | 4165 |
4789 QuicAckFrame ack_frame; | 4166 QuicAckFrame ack_frame; |
4790 ack_frame.received_info.largest_observed = 201; | 4167 ack_frame.largest_observed = 201; |
4791 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 2; | 4168 for (uint64 i = 1; i < ack_frame.largest_observed; ++i) { |
4792 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; ++i) { | 4169 ack_frame.missing_packets.insert(i); |
4793 ack_frame.received_info.missing_packets.insert(i); | |
4794 } | 4170 } |
4795 | 4171 |
4796 // Create a packet with just the ack. | 4172 // Create a packet with just the ack. |
4797 QuicFrame frame; | 4173 QuicFrame frame; |
4798 frame.type = ACK_FRAME; | 4174 frame.type = ACK_FRAME; |
4799 frame.ack_frame = &ack_frame; | 4175 frame.ack_frame = &ack_frame; |
4800 QuicFrames frames; | 4176 QuicFrames frames; |
4801 frames.push_back(frame); | 4177 frames.push_back(frame); |
4802 | 4178 |
4803 scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); | 4179 scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4951 EXPECT_CALL(visitor, OnPacketComplete()); | 4327 EXPECT_CALL(visitor, OnPacketComplete()); |
4952 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); | 4328 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); |
4953 | 4329 |
4954 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 4330 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
4955 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 4331 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
4956 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 4332 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
4957 } | 4333 } |
4958 | 4334 |
4959 } // namespace test | 4335 } // namespace test |
4960 } // namespace net | 4336 } // namespace net |
OLD | NEW |