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 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 fec_count_(0), | 174 fec_count_(0), |
175 complete_packets_(0), | 175 complete_packets_(0), |
176 revived_packets_(0), | 176 revived_packets_(0), |
177 accept_packet_(true), | 177 accept_packet_(true), |
178 accept_public_header_(true) { | 178 accept_public_header_(true) { |
179 } | 179 } |
180 | 180 |
181 ~TestQuicVisitor() override { | 181 ~TestQuicVisitor() override { |
182 STLDeleteElements(&stream_frames_); | 182 STLDeleteElements(&stream_frames_); |
183 STLDeleteElements(&ack_frames_); | 183 STLDeleteElements(&ack_frames_); |
184 STLDeleteElements(&congestion_feedback_frames_); | |
185 STLDeleteElements(&stop_waiting_frames_); | 184 STLDeleteElements(&stop_waiting_frames_); |
186 STLDeleteElements(&ping_frames_); | 185 STLDeleteElements(&ping_frames_); |
187 STLDeleteElements(&fec_data_); | 186 STLDeleteElements(&fec_data_); |
188 } | 187 } |
189 | 188 |
190 void OnError(QuicFramer* f) override { | 189 void OnError(QuicFramer* f) override { |
191 DVLOG(1) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error()) | 190 DVLOG(1) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error()) |
192 << " (" << f->error() << ")"; | 191 << " (" << f->error() << ")"; |
193 ++error_count_; | 192 ++error_count_; |
194 } | 193 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
239 void OnFecProtectedPayload(StringPiece payload) override { | 238 void OnFecProtectedPayload(StringPiece payload) override { |
240 fec_protected_payload_ = payload.as_string(); | 239 fec_protected_payload_ = payload.as_string(); |
241 } | 240 } |
242 | 241 |
243 bool OnAckFrame(const QuicAckFrame& frame) override { | 242 bool OnAckFrame(const QuicAckFrame& frame) override { |
244 ++frame_count_; | 243 ++frame_count_; |
245 ack_frames_.push_back(new QuicAckFrame(frame)); | 244 ack_frames_.push_back(new QuicAckFrame(frame)); |
246 return true; | 245 return true; |
247 } | 246 } |
248 | 247 |
249 bool OnCongestionFeedbackFrame( | |
250 const QuicCongestionFeedbackFrame& frame) override { | |
251 ++frame_count_; | |
252 congestion_feedback_frames_.push_back( | |
253 new QuicCongestionFeedbackFrame(frame)); | |
254 return true; | |
255 } | |
256 | |
257 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override { | 248 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override { |
258 ++frame_count_; | 249 ++frame_count_; |
259 stop_waiting_frames_.push_back(new QuicStopWaitingFrame(frame)); | 250 stop_waiting_frames_.push_back(new QuicStopWaitingFrame(frame)); |
260 return true; | 251 return true; |
261 } | 252 } |
262 | 253 |
263 bool OnPingFrame(const QuicPingFrame& frame) override { | 254 bool OnPingFrame(const QuicPingFrame& frame) override { |
264 ++frame_count_; | 255 ++frame_count_; |
265 ping_frames_.push_back(new QuicPingFrame(frame)); | 256 ping_frames_.push_back(new QuicPingFrame(frame)); |
266 return true; | 257 return true; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 int revived_packets_; | 299 int revived_packets_; |
309 bool accept_packet_; | 300 bool accept_packet_; |
310 bool accept_public_header_; | 301 bool accept_public_header_; |
311 | 302 |
312 scoped_ptr<QuicPacketHeader> header_; | 303 scoped_ptr<QuicPacketHeader> header_; |
313 scoped_ptr<QuicPacketPublicHeader> public_header_; | 304 scoped_ptr<QuicPacketPublicHeader> public_header_; |
314 scoped_ptr<QuicPublicResetPacket> public_reset_packet_; | 305 scoped_ptr<QuicPublicResetPacket> public_reset_packet_; |
315 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; | 306 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; |
316 vector<QuicStreamFrame*> stream_frames_; | 307 vector<QuicStreamFrame*> stream_frames_; |
317 vector<QuicAckFrame*> ack_frames_; | 308 vector<QuicAckFrame*> ack_frames_; |
318 vector<QuicCongestionFeedbackFrame*> congestion_feedback_frames_; | |
319 vector<QuicStopWaitingFrame*> stop_waiting_frames_; | 309 vector<QuicStopWaitingFrame*> stop_waiting_frames_; |
320 vector<QuicPingFrame*> ping_frames_; | 310 vector<QuicPingFrame*> ping_frames_; |
321 vector<QuicFecData*> fec_data_; | 311 vector<QuicFecData*> fec_data_; |
322 string fec_protected_payload_; | 312 string fec_protected_payload_; |
323 QuicRstStreamFrame rst_stream_frame_; | 313 QuicRstStreamFrame rst_stream_frame_; |
324 QuicConnectionCloseFrame connection_close_frame_; | 314 QuicConnectionCloseFrame connection_close_frame_; |
325 QuicGoAwayFrame goaway_frame_; | 315 QuicGoAwayFrame goaway_frame_; |
326 QuicWindowUpdateFrame window_update_frame_; | 316 QuicWindowUpdateFrame window_update_frame_; |
327 QuicBlockedFrame blocked_frame_; | 317 QuicBlockedFrame blocked_frame_; |
328 }; | 318 }; |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
587 | 577 |
588 TEST_P(QuicFramerTest, EmptyPacket) { | 578 TEST_P(QuicFramerTest, EmptyPacket) { |
589 char packet[] = { 0x00 }; | 579 char packet[] = { 0x00 }; |
590 QuicEncryptedPacket encrypted(packet, 0, false); | 580 QuicEncryptedPacket encrypted(packet, 0, false); |
591 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 581 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
592 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); | 582 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); |
593 } | 583 } |
594 | 584 |
595 TEST_P(QuicFramerTest, LargePacket) { | 585 TEST_P(QuicFramerTest, LargePacket) { |
596 unsigned char packet[kMaxPacketSize + 1] = { | 586 unsigned char packet[kMaxPacketSize + 1] = { |
597 // public flags (8 byte connection_id) | 587 // public flags (8 byte connection_id) |
598 0x3C, | 588 0x3C, |
599 // connection_id | 589 // connection_id |
600 0x10, 0x32, 0x54, 0x76, | 590 0x10, |
601 0x98, 0xBA, 0xDC, 0xFE, | 591 0x32, |
602 // packet sequence number | 592 0x54, |
603 0xBC, 0x9A, 0x78, 0x56, | 593 0x76, |
604 0x34, 0x12, | 594 0x98, |
605 // private flags | 595 0xBA, |
606 0x00, | 596 0xDC, |
| 597 0xFE, |
| 598 // packet sequence number |
| 599 0xBC, |
| 600 0x9A, |
| 601 0x78, |
| 602 0x56, |
| 603 0x34, |
| 604 0x12, |
| 605 // private flags |
| 606 0x00, |
607 }; | 607 }; |
608 | 608 |
609 memset(packet + GetPacketHeaderSize( | 609 memset(packet + GetPacketHeaderSize( |
610 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 610 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
611 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 0, | 611 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 0, |
612 kMaxPacketSize - GetPacketHeaderSize( | 612 kMaxPacketSize - GetPacketHeaderSize( |
613 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 613 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
614 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + 1); | 614 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + 1); |
615 | 615 |
616 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 616 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
(...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1647 | 1647 |
1648 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1648 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
1649 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1649 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
1650 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); | 1650 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); |
1651 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1651 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
1652 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1652 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
1653 visitor_.stream_frames_[0]->offset); | 1653 visitor_.stream_frames_[0]->offset); |
1654 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); | 1654 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); |
1655 } | 1655 } |
1656 | 1656 |
1657 TEST_P(QuicFramerTest, AckFramev22) { | 1657 TEST_P(QuicFramerTest, AckFrameTwoTimestamp) { |
1658 if (version_ > QUIC_VERSION_22) { | |
1659 return; | |
1660 } | |
1661 unsigned char packet[] = { | 1658 unsigned char packet[] = { |
1662 // public flags (8 byte connection_id) | 1659 // public flags (8 byte connection_id) |
1663 0x3C, | 1660 0x3C, |
1664 // connection_id | 1661 // connection_id |
1665 0x10, 0x32, 0x54, 0x76, | 1662 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1666 0x98, 0xBA, 0xDC, 0xFE, | 1663 // packet sequence number |
1667 // packet sequence number | 1664 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1668 0xA8, 0x9A, 0x78, 0x56, | 1665 // private flags (entropy) |
1669 0x34, 0x12, | 1666 0x01, |
1670 // private flags (entropy) | |
1671 0x01, | |
1672 | 1667 |
1673 // frame type (ack frame) | 1668 // frame type (ack frame) |
1674 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 1669 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
1675 0x6C, | 1670 0x6C, |
1676 // entropy hash of all received packets. | 1671 // entropy hash of all received packets. |
1677 0xBA, | 1672 0xBA, |
1678 // largest observed packet sequence number | 1673 // largest observed packet sequence number |
1679 0xBF, 0x9A, 0x78, 0x56, | 1674 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1680 0x34, 0x12, | 1675 // Zero delta time. |
1681 // Zero delta time. | 1676 0x00, 0x00, |
1682 0x0, 0x0, | 1677 // Number of timestamps. |
1683 // num missing packets | 1678 0x02, |
1684 0x01, | 1679 // Delta from largest observed. |
1685 // missing packet delta | 1680 0x01, |
1686 0x01, | 1681 // Delta time. |
1687 // 0 more missing packets in range. | 1682 0x10, 0x32, 0x54, 0x76, |
1688 0x00, | 1683 // Delta from largest observed. |
1689 // Number of revived packets. | 1684 0x02, |
1690 0x00, | 1685 // Delta time. |
| 1686 0x10, 0x32, |
| 1687 // num missing packets |
| 1688 0x01, |
| 1689 // missing packet delta |
| 1690 0x01, |
| 1691 // 0 more missing packets in range. |
| 1692 0x00, |
| 1693 // Number of revived packets. |
| 1694 0x00, |
1691 }; | 1695 }; |
1692 | 1696 |
1693 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1697 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1694 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
1695 | |
1696 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
1697 ASSERT_TRUE(visitor_.header_.get()); | |
1698 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | |
1699 | |
1700 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
1701 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
1702 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | |
1703 EXPECT_EQ(0xBA, frame.entropy_hash); | |
1704 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.largest_observed); | |
1705 ASSERT_EQ(1u, frame.missing_packets.size()); | |
1706 SequenceNumberSet::const_iterator missing_iter = | |
1707 frame.missing_packets.begin(); | |
1708 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); | |
1709 | |
1710 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | |
1711 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | |
1712 kQuicEntropyHashSize; | |
1713 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | |
1714 PACKET_6BYTE_SEQUENCE_NUMBER; | |
1715 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | |
1716 kQuicDeltaTimeLargestObservedSize; | |
1717 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | |
1718 kNumberOfNackRangesSize; | |
1719 const size_t kMissingPacketsRange = kMissingPacketsOffset + | |
1720 PACKET_1BYTE_SEQUENCE_NUMBER; | |
1721 const size_t kRevivedPacketsLength = kMissingPacketsRange + | |
1722 PACKET_1BYTE_SEQUENCE_NUMBER; | |
1723 // Now test framing boundaries. | |
1724 const size_t ack_frame_size = kRevivedPacketsLength + | |
1725 PACKET_1BYTE_SEQUENCE_NUMBER; | |
1726 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | |
1727 string expected_error; | |
1728 if (i < kLargestObservedOffset) { | |
1729 expected_error = "Unable to read entropy hash for received packets."; | |
1730 } else if (i < kMissingDeltaTimeOffset) { | |
1731 expected_error = "Unable to read largest observed."; | |
1732 } else if (i < kNumMissingPacketOffset) { | |
1733 expected_error = "Unable to read delta time largest observed."; | |
1734 } else if (i < kMissingPacketsOffset) { | |
1735 expected_error = "Unable to read num missing packet ranges."; | |
1736 } else if (i < kMissingPacketsRange) { | |
1737 expected_error = "Unable to read missing sequence number delta."; | |
1738 } else if (i < kRevivedPacketsLength) { | |
1739 expected_error = "Unable to read missing sequence number range."; | |
1740 } else { | |
1741 expected_error = "Unable to read num revived packets."; | |
1742 } | |
1743 CheckProcessingFails( | |
1744 packet, | |
1745 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | |
1746 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | |
1747 expected_error, QUIC_INVALID_ACK_DATA); | |
1748 } | |
1749 } | |
1750 | |
1751 | |
1752 TEST_P(QuicFramerTest, AckFrameTwoTimestamp) { | |
1753 if (version_ <= QUIC_VERSION_22) { | |
1754 return; | |
1755 } | |
1756 unsigned char packet[] = { | |
1757 // public flags (8 byte connection_id) | |
1758 0x3C, | |
1759 // connection_id | |
1760 0x10, 0x32, 0x54, 0x76, | |
1761 0x98, 0xBA, 0xDC, 0xFE, | |
1762 // packet sequence number | |
1763 0xA8, 0x9A, 0x78, 0x56, | |
1764 0x34, 0x12, | |
1765 // private flags (entropy) | |
1766 0x01, | |
1767 | |
1768 // frame type (ack frame) | |
1769 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
1770 0x6C, | |
1771 // entropy hash of all received packets. | |
1772 0xBA, | |
1773 // largest observed packet sequence number | |
1774 0xBF, 0x9A, 0x78, 0x56, | |
1775 0x34, 0x12, | |
1776 // Zero delta time. | |
1777 0x0, 0x0, | |
1778 // Number of timestamps. | |
1779 0x02, | |
1780 // Delta from largest observed. | |
1781 0x01, | |
1782 // Delta time. | |
1783 0x10, 0x32, 0x54, 0x76, | |
1784 // Delta from largest observed. | |
1785 0x02, | |
1786 // Delta time. | |
1787 0x10, 0x32, | |
1788 // num missing packets | |
1789 0x01, | |
1790 // missing packet delta | |
1791 0x01, | |
1792 // 0 more missing packets in range. | |
1793 0x00, | |
1794 // Number of revived packets. | |
1795 0x00, | |
1796 }; | |
1797 | |
1798 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
1799 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1698 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1800 | 1699 |
1801 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1700 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1802 ASSERT_TRUE(visitor_.header_.get()); | 1701 ASSERT_TRUE(visitor_.header_.get()); |
1803 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1702 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1804 | 1703 |
1805 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1704 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
1806 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1705 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
1807 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | 1706 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
1808 EXPECT_EQ(0xBA, frame.entropy_hash); | 1707 EXPECT_EQ(0xBA, frame.entropy_hash); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1870 CheckProcessingFails( | 1769 CheckProcessingFails( |
1871 packet, | 1770 packet, |
1872 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 1771 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
1873 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 1772 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
1874 expected_error, QUIC_INVALID_ACK_DATA); | 1773 expected_error, QUIC_INVALID_ACK_DATA); |
1875 } | 1774 } |
1876 } | 1775 } |
1877 | 1776 |
1878 | 1777 |
1879 TEST_P(QuicFramerTest, AckFrameOneTimestamp) { | 1778 TEST_P(QuicFramerTest, AckFrameOneTimestamp) { |
1880 if (version_ <= QUIC_VERSION_22) { | |
1881 return; | |
1882 } | |
1883 unsigned char packet[] = { | 1779 unsigned char packet[] = { |
1884 // public flags (8 byte connection_id) | 1780 // public flags (8 byte connection_id) |
1885 0x3C, | 1781 0x3C, |
1886 // connection_id | 1782 // connection_id |
1887 0x10, 0x32, 0x54, 0x76, | 1783 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1888 0x98, 0xBA, 0xDC, 0xFE, | 1784 // packet sequence number |
1889 // packet sequence number | 1785 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1890 0xA8, 0x9A, 0x78, 0x56, | 1786 // private flags (entropy) |
1891 0x34, 0x12, | 1787 0x01, |
1892 // private flags (entropy) | |
1893 0x01, | |
1894 | 1788 |
1895 // frame type (ack frame) | 1789 // frame type (ack frame) |
1896 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 1790 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
1897 0x6C, | 1791 0x6C, |
1898 // entropy hash of all received packets. | 1792 // entropy hash of all received packets. |
1899 0xBA, | 1793 0xBA, |
1900 // largest observed packet sequence number | 1794 // largest observed packet sequence number |
1901 0xBF, 0x9A, 0x78, 0x56, | 1795 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1902 0x34, 0x12, | 1796 // Zero delta time. |
1903 // Zero delta time. | 1797 0x00, 0x00, |
1904 0x0, 0x0, | 1798 // Number of timestamps. |
1905 // Number of timestamps. | 1799 0x01, |
1906 0x01, | 1800 // Delta from largest observed. |
1907 // Delta from largest observed. | 1801 0x01, |
1908 0x01, | 1802 // Delta time. |
1909 // Delta time. | 1803 0x10, 0x32, 0x54, 0x76, |
1910 0x10, 0x32, 0x54, 0x76, | 1804 // num missing packets |
1911 // num missing packets | 1805 0x01, |
1912 0x01, | 1806 // missing packet delta |
1913 // missing packet delta | 1807 0x01, |
1914 0x01, | 1808 // 0 more missing packets in range. |
1915 // 0 more missing packets in range. | 1809 0x00, |
1916 0x00, | 1810 // Number of revived packets. |
1917 // Number of revived packets. | 1811 0x00, |
1918 0x00, | |
1919 }; | 1812 }; |
1920 | 1813 |
1921 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1814 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1922 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1815 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1923 | 1816 |
1924 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1817 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1925 ASSERT_TRUE(visitor_.header_.get()); | 1818 ASSERT_TRUE(visitor_.header_.get()); |
1926 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1819 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1927 | 1820 |
1928 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1821 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1983 CheckProcessingFails( | 1876 CheckProcessingFails( |
1984 packet, | 1877 packet, |
1985 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 1878 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
1986 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 1879 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
1987 expected_error, QUIC_INVALID_ACK_DATA); | 1880 expected_error, QUIC_INVALID_ACK_DATA); |
1988 } | 1881 } |
1989 } | 1882 } |
1990 | 1883 |
1991 | 1884 |
1992 TEST_P(QuicFramerTest, AckFrame) { | 1885 TEST_P(QuicFramerTest, AckFrame) { |
1993 if (version_ <= QUIC_VERSION_22) { | |
1994 return; | |
1995 } | |
1996 unsigned char packet[] = { | 1886 unsigned char packet[] = { |
1997 // public flags (8 byte connection_id) | 1887 // public flags (8 byte connection_id) |
1998 0x3C, | 1888 0x3C, |
1999 // connection_id | 1889 // connection_id |
2000 0x10, 0x32, 0x54, 0x76, | 1890 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2001 0x98, 0xBA, 0xDC, 0xFE, | 1891 // packet sequence number |
2002 // packet sequence number | 1892 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2003 0xA8, 0x9A, 0x78, 0x56, | 1893 // private flags (entropy) |
2004 0x34, 0x12, | 1894 0x01, |
2005 // private flags (entropy) | |
2006 0x01, | |
2007 | 1895 |
2008 // frame type (ack frame) | 1896 // frame type (ack frame) |
2009 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 1897 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2010 0x6C, | 1898 0x6C, |
2011 // entropy hash of all received packets. | 1899 // entropy hash of all received packets. |
2012 0xBA, | 1900 0xBA, |
2013 // largest observed packet sequence number | 1901 // largest observed packet sequence number |
2014 0xBF, 0x9A, 0x78, 0x56, | 1902 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2015 0x34, 0x12, | 1903 // Zero delta time. |
2016 // Zero delta time. | 1904 0x00, 0x00, |
2017 0x0, 0x0, | 1905 // Number of timestamps. |
2018 // Number of timestamps. | 1906 0x00, |
2019 0x00, | 1907 // num missing packets |
2020 // num missing packets | 1908 0x01, |
2021 0x01, | 1909 // missing packet delta |
2022 // missing packet delta | 1910 0x01, |
2023 0x01, | 1911 // 0 more missing packets in range. |
2024 // 0 more missing packets in range. | 1912 0x00, |
2025 0x00, | 1913 // Number of revived packets. |
2026 // Number of revived packets. | 1914 0x00, |
2027 0x00, | |
2028 }; | 1915 }; |
2029 | 1916 |
2030 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1917 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2031 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1918 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2032 | 1919 |
2033 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1920 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2034 ASSERT_TRUE(visitor_.header_.get()); | 1921 ASSERT_TRUE(visitor_.header_.get()); |
2035 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1922 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2036 | 1923 |
2037 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1924 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2083 } | 1970 } |
2084 CheckProcessingFails( | 1971 CheckProcessingFails( |
2085 packet, | 1972 packet, |
2086 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 1973 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
2087 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 1974 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
2088 expected_error, QUIC_INVALID_ACK_DATA); | 1975 expected_error, QUIC_INVALID_ACK_DATA); |
2089 } | 1976 } |
2090 } | 1977 } |
2091 | 1978 |
2092 TEST_P(QuicFramerTest, AckFrameRevivedPackets) { | 1979 TEST_P(QuicFramerTest, AckFrameRevivedPackets) { |
2093 if (version_ <= QUIC_VERSION_22) { | |
2094 return; | |
2095 } | |
2096 unsigned char packet[] = { | 1980 unsigned char packet[] = { |
2097 // public flags (8 byte connection_id) | 1981 // public flags (8 byte connection_id) |
2098 0x3C, | 1982 0x3C, |
2099 // connection_id | 1983 // connection_id |
2100 0x10, 0x32, 0x54, 0x76, | 1984 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2101 0x98, 0xBA, 0xDC, 0xFE, | 1985 // packet sequence number |
2102 // packet sequence number | 1986 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2103 0xA8, 0x9A, 0x78, 0x56, | 1987 // private flags (entropy) |
2104 0x34, 0x12, | 1988 0x01, |
2105 // private flags (entropy) | |
2106 0x01, | |
2107 | 1989 |
2108 // frame type (ack frame) | 1990 // frame type (ack frame) |
2109 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 1991 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2110 0x6C, | 1992 0x6C, |
2111 // entropy hash of all received packets. | 1993 // entropy hash of all received packets. |
2112 0xBA, | 1994 0xBA, |
2113 // largest observed packet sequence number | 1995 // largest observed packet sequence number |
2114 0xBF, 0x9A, 0x78, 0x56, | 1996 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2115 0x34, 0x12, | 1997 // Zero delta time. |
2116 // Zero delta time. | 1998 0x00, 0x00, |
2117 0x0, 0x0, | 1999 // num received packets. |
2118 // num received packets. | 2000 0x00, |
2119 0x00, | 2001 // num missing packets |
2120 // num missing packets | 2002 0x01, |
2121 0x01, | 2003 // missing packet delta |
2122 // missing packet delta | 2004 0x01, |
2123 0x01, | 2005 // 0 more missing packets in range. |
2124 // 0 more missing packets in range. | 2006 0x00, |
2125 0x00, | 2007 // Number of revived packets. |
2126 // Number of revived packets. | 2008 0x01, |
2127 0x01, | 2009 // Revived packet sequence number. |
2128 // Revived packet sequence number. | 2010 0xBE, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2129 0xBE, 0x9A, 0x78, 0x56, | 2011 // Number of revived packets. |
2130 0x34, 0x12, | 2012 0x00, |
2131 // Number of revived packets. | |
2132 0x00, | |
2133 }; | 2013 }; |
2134 | 2014 |
2135 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2015 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2136 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2016 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2137 | 2017 |
2138 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2018 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2139 ASSERT_TRUE(visitor_.header_.get()); | 2019 ASSERT_TRUE(visitor_.header_.get()); |
2140 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2020 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2141 | 2021 |
2142 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2022 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2193 expected_error = "Unable to read revived packet."; | 2073 expected_error = "Unable to read revived packet."; |
2194 } | 2074 } |
2195 CheckProcessingFails( | 2075 CheckProcessingFails( |
2196 packet, | 2076 packet, |
2197 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2077 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
2198 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2078 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
2199 expected_error, QUIC_INVALID_ACK_DATA); | 2079 expected_error, QUIC_INVALID_ACK_DATA); |
2200 } | 2080 } |
2201 } | 2081 } |
2202 | 2082 |
2203 TEST_P(QuicFramerTest, AckFrameRevivedPacketsv22) { | 2083 TEST_P(QuicFramerTest, AckFrameNoNacks) { |
2204 if (version_ > QUIC_VERSION_22) { | |
2205 return; | |
2206 } | |
2207 unsigned char packet[] = { | 2084 unsigned char packet[] = { |
2208 // public flags (8 byte connection_id) | 2085 // public flags (8 byte connection_id) |
2209 0x3C, | 2086 0x3C, |
2210 // connection_id | 2087 // connection_id |
2211 0x10, 0x32, 0x54, 0x76, | 2088 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2212 0x98, 0xBA, 0xDC, 0xFE, | 2089 // packet sequence number |
2213 // packet sequence number | 2090 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2214 0xA8, 0x9A, 0x78, 0x56, | 2091 // private flags (entropy) |
2215 0x34, 0x12, | 2092 0x01, |
2216 // private flags (entropy) | |
2217 0x01, | |
2218 | 2093 |
2219 // frame type (ack frame) | 2094 // frame type (ack frame) |
2220 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 2095 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2221 0x6C, | 2096 0x4C, |
2222 // entropy hash of all received packets. | 2097 // entropy hash of all received packets. |
2223 0xBA, | 2098 0xBA, |
2224 // largest observed packet sequence number | 2099 // largest observed packet sequence number |
2225 0xBF, 0x9A, 0x78, 0x56, | 2100 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2226 0x34, 0x12, | 2101 // Zero delta time. |
2227 // Zero delta time. | 2102 0x00, 0x00, |
2228 0x0, 0x0, | 2103 // Number of received packets. |
2229 // num missing packets | 2104 0x00, |
2230 0x01, | |
2231 // missing packet delta | |
2232 0x01, | |
2233 // 0 more missing packets in range. | |
2234 0x00, | |
2235 // Number of revived packets. | |
2236 0x01, | |
2237 // Revived packet sequence number. | |
2238 0xBE, 0x9A, 0x78, 0x56, | |
2239 0x34, 0x12, | |
2240 // Number of revived packets. | |
2241 0x00, | |
2242 }; | 2105 }; |
2243 | 2106 |
2244 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2107 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2245 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2108 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2246 | 2109 |
2247 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2110 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2248 ASSERT_TRUE(visitor_.header_.get()); | 2111 ASSERT_TRUE(visitor_.header_.get()); |
2249 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2112 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2250 | 2113 |
2251 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2114 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
2252 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 2115 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
2253 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | |
2254 EXPECT_EQ(0xBA, frame.entropy_hash); | |
2255 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.largest_observed); | |
2256 ASSERT_EQ(1u, frame.missing_packets.size()); | |
2257 SequenceNumberSet::const_iterator missing_iter = | |
2258 frame.missing_packets.begin(); | |
2259 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); | |
2260 | |
2261 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | |
2262 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | |
2263 kQuicEntropyHashSize; | |
2264 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | |
2265 PACKET_6BYTE_SEQUENCE_NUMBER; | |
2266 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | |
2267 kQuicDeltaTimeLargestObservedSize; | |
2268 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | |
2269 kNumberOfNackRangesSize; | |
2270 const size_t kMissingPacketsRange = kMissingPacketsOffset + | |
2271 PACKET_1BYTE_SEQUENCE_NUMBER; | |
2272 const size_t kRevivedPacketsLength = kMissingPacketsRange + | |
2273 PACKET_1BYTE_SEQUENCE_NUMBER; | |
2274 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength + | |
2275 PACKET_1BYTE_SEQUENCE_NUMBER; | |
2276 // Now test framing boundaries. | |
2277 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength + | |
2278 PACKET_6BYTE_SEQUENCE_NUMBER; | |
2279 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | |
2280 string expected_error; | |
2281 if (i < kReceivedEntropyOffset) { | |
2282 expected_error = "Unable to read least unacked delta."; | |
2283 } else if (i < kLargestObservedOffset) { | |
2284 expected_error = "Unable to read entropy hash for received packets."; | |
2285 } else if (i < kMissingDeltaTimeOffset) { | |
2286 expected_error = "Unable to read largest observed."; | |
2287 } else if (i < kNumMissingPacketOffset) { | |
2288 expected_error = "Unable to read delta time largest observed."; | |
2289 } else if (i < kMissingPacketsOffset) { | |
2290 expected_error = "Unable to read num missing packet ranges."; | |
2291 } else if (i < kMissingPacketsRange) { | |
2292 expected_error = "Unable to read missing sequence number delta."; | |
2293 } else if (i < kRevivedPacketsLength) { | |
2294 expected_error = "Unable to read missing sequence number range."; | |
2295 } else if (i < kRevivedPacketSequenceNumberLength) { | |
2296 expected_error = "Unable to read num revived packets."; | |
2297 } else { | |
2298 expected_error = "Unable to read revived packet."; | |
2299 } | |
2300 CheckProcessingFails( | |
2301 packet, | |
2302 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | |
2303 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | |
2304 expected_error, QUIC_INVALID_ACK_DATA); | |
2305 } | |
2306 } | |
2307 | |
2308 TEST_P(QuicFramerTest, AckFrameNoNacksv22) { | |
2309 if (version_ > QUIC_VERSION_22) { | |
2310 return; | |
2311 } | |
2312 unsigned char packet[] = { | |
2313 // public flags (8 byte connection_id) | |
2314 0x3C, | |
2315 // connection_id | |
2316 0x10, 0x32, 0x54, 0x76, | |
2317 0x98, 0xBA, 0xDC, 0xFE, | |
2318 // packet sequence number | |
2319 0xA8, 0x9A, 0x78, 0x56, | |
2320 0x34, 0x12, | |
2321 // private flags (entropy) | |
2322 0x01, | |
2323 | |
2324 // frame type (ack frame) | |
2325 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
2326 0x4C, | |
2327 // entropy hash of all received packets. | |
2328 0xBA, | |
2329 // largest observed packet sequence number | |
2330 0xBF, 0x9A, 0x78, 0x56, | |
2331 0x34, 0x12, | |
2332 // Zero delta time. | |
2333 0x0, 0x0, | |
2334 }; | |
2335 | |
2336 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
2337 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
2338 | |
2339 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
2340 ASSERT_TRUE(visitor_.header_.get()); | |
2341 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | |
2342 | |
2343 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
2344 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
2345 QuicAckFrame* frame = visitor_.ack_frames_[0]; | 2116 QuicAckFrame* frame = visitor_.ack_frames_[0]; |
2346 EXPECT_EQ(0xBA, frame->entropy_hash); | 2117 EXPECT_EQ(0xBA, frame->entropy_hash); |
2347 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame->largest_observed); | 2118 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame->largest_observed); |
2348 ASSERT_EQ(0u, frame->missing_packets.size()); | 2119 ASSERT_EQ(0u, frame->missing_packets.size()); |
2349 | 2120 |
2350 // Verify that the packet re-serializes identically. | 2121 // Verify that the packet re-serializes identically. |
2351 QuicFrames frames; | 2122 QuicFrames frames; |
2352 frames.push_back(QuicFrame(frame)); | |
2353 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); | |
2354 ASSERT_TRUE(data != nullptr); | |
2355 | |
2356 test::CompareCharArraysWithHexError("constructed packet", | |
2357 data->data(), data->length(), | |
2358 AsChars(packet), arraysize(packet)); | |
2359 } | |
2360 | |
2361 TEST_P(QuicFramerTest, AckFrameNoNacks) { | |
2362 if (version_ <= QUIC_VERSION_22) { | |
2363 return; | |
2364 } | |
2365 unsigned char packet[] = { | |
2366 // public flags (8 byte connection_id) | |
2367 0x3C, | |
2368 // connection_id | |
2369 0x10, 0x32, 0x54, 0x76, | |
2370 0x98, 0xBA, 0xDC, 0xFE, | |
2371 // packet sequence number | |
2372 0xA8, 0x9A, 0x78, 0x56, | |
2373 0x34, 0x12, | |
2374 // private flags (entropy) | |
2375 0x01, | |
2376 | |
2377 // frame type (ack frame) | |
2378 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
2379 0x4C, | |
2380 // entropy hash of all received packets. | |
2381 0xBA, | |
2382 // largest observed packet sequence number | |
2383 0xBF, 0x9A, 0x78, 0x56, | |
2384 0x34, 0x12, | |
2385 // Zero delta time. | |
2386 0x0, 0x0, | |
2387 // Number of received packets. | |
2388 0x00, | |
2389 }; | |
2390 | |
2391 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
2392 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
2393 | |
2394 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
2395 ASSERT_TRUE(visitor_.header_.get()); | |
2396 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | |
2397 | |
2398 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
2399 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
2400 QuicAckFrame* frame = visitor_.ack_frames_[0]; | |
2401 EXPECT_EQ(0xBA, frame->entropy_hash); | |
2402 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame->largest_observed); | |
2403 ASSERT_EQ(0u, frame->missing_packets.size()); | |
2404 | |
2405 // Verify that the packet re-serializes identically. | |
2406 QuicFrames frames; | |
2407 frames.push_back(QuicFrame(frame)); | |
2408 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); | |
2409 ASSERT_TRUE(data != nullptr); | |
2410 | |
2411 test::CompareCharArraysWithHexError("constructed packet", | |
2412 data->data(), data->length(), | |
2413 AsChars(packet), arraysize(packet)); | |
2414 } | |
2415 | |
2416 TEST_P(QuicFramerTest, AckFrame500Nacksv22) { | |
2417 if (version_ > QUIC_VERSION_22) { | |
2418 return; | |
2419 } | |
2420 unsigned char packet[] = { | |
2421 // public flags (8 byte connection_id) | |
2422 0x3C, | |
2423 // connection_id | |
2424 0x10, 0x32, 0x54, 0x76, | |
2425 0x98, 0xBA, 0xDC, 0xFE, | |
2426 // packet sequence number | |
2427 0xA8, 0x9A, 0x78, 0x56, | |
2428 0x34, 0x12, | |
2429 // private flags (entropy) | |
2430 0x01, | |
2431 | |
2432 // frame type (ack frame) | |
2433 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
2434 0x6C, | |
2435 // entropy hash of all received packets. | |
2436 0xBA, | |
2437 // largest observed packet sequence number | |
2438 0xBF, 0x9A, 0x78, 0x56, | |
2439 0x34, 0x12, | |
2440 // Zero delta time. | |
2441 0x0, 0x0, | |
2442 // num missing packet ranges | |
2443 0x02, | |
2444 // missing packet delta | |
2445 0x01, | |
2446 // 243 more missing packets in range. | |
2447 // The ranges are listed in this order so the re-constructed packet matches. | |
2448 0xF3, | |
2449 // No gap between ranges | |
2450 0x00, | |
2451 // 255 more missing packets in range. | |
2452 0xFF, | |
2453 // No revived packets. | |
2454 0x00, | |
2455 }; | |
2456 | |
2457 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
2458 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
2459 | |
2460 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
2461 ASSERT_TRUE(visitor_.header_.get()); | |
2462 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | |
2463 | |
2464 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
2465 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
2466 QuicAckFrame* frame = visitor_.ack_frames_[0]; | |
2467 EXPECT_EQ(0xBA, frame->entropy_hash); | |
2468 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame->largest_observed); | |
2469 EXPECT_EQ(0u, frame->revived_packets.size()); | |
2470 ASSERT_EQ(500u, frame->missing_packets.size()); | |
2471 SequenceNumberSet::const_iterator first_missing_iter = | |
2472 frame->missing_packets.begin(); | |
2473 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE) - 499, *first_missing_iter); | |
2474 SequenceNumberSet::const_reverse_iterator last_missing_iter = | |
2475 frame->missing_packets.rbegin(); | |
2476 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *last_missing_iter); | |
2477 | |
2478 // Verify that the packet re-serializes identically. | |
2479 QuicFrames frames; | |
2480 frames.push_back(QuicFrame(frame)); | 2123 frames.push_back(QuicFrame(frame)); |
2481 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); | 2124 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); |
2482 ASSERT_TRUE(data != nullptr); | 2125 ASSERT_TRUE(data != nullptr); |
2483 | 2126 |
2484 test::CompareCharArraysWithHexError("constructed packet", | 2127 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
2485 data->data(), data->length(), | 2128 data->length(), AsChars(packet), |
2486 AsChars(packet), arraysize(packet)); | 2129 arraysize(packet)); |
2487 } | 2130 } |
2488 | 2131 |
2489 TEST_P(QuicFramerTest, AckFrame500Nacks) { | 2132 TEST_P(QuicFramerTest, AckFrame500Nacks) { |
2490 if (version_ <= QUIC_VERSION_22) { | |
2491 return; | |
2492 } | |
2493 unsigned char packet[] = { | 2133 unsigned char packet[] = { |
2494 // public flags (8 byte connection_id) | 2134 // public flags (8 byte connection_id) |
2495 0x3C, | 2135 0x3C, |
2496 // connection_id | 2136 // connection_id |
2497 0x10, 0x32, 0x54, 0x76, | 2137 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2498 0x98, 0xBA, 0xDC, 0xFE, | 2138 // packet sequence number |
2499 // packet sequence number | 2139 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2500 0xA8, 0x9A, 0x78, 0x56, | 2140 // private flags (entropy) |
2501 0x34, 0x12, | 2141 0x01, |
2502 // private flags (entropy) | |
2503 0x01, | |
2504 | 2142 |
2505 // frame type (ack frame) | 2143 // frame type (ack frame) |
2506 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 2144 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2507 0x6C, | 2145 0x6C, |
2508 // entropy hash of all received packets. | 2146 // entropy hash of all received packets. |
2509 0xBA, | 2147 0xBA, |
2510 // largest observed packet sequence number | 2148 // largest observed packet sequence number |
2511 0xBF, 0x9A, 0x78, 0x56, | 2149 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2512 0x34, 0x12, | 2150 // Zero delta time. |
2513 // Zero delta time. | 2151 0x00, 0x00, |
2514 0x0, 0x0, | 2152 // No received packets. |
2515 // No received packets. | 2153 0x00, |
2516 0x00, | 2154 // num missing packet ranges |
2517 // num missing packet ranges | 2155 0x02, |
2518 0x02, | 2156 // missing packet delta |
2519 // missing packet delta | 2157 0x01, |
2520 0x01, | 2158 // 243 more missing packets in range. |
2521 // 243 more missing packets in range. | 2159 // The ranges are listed in this order so the re-constructed packet |
2522 // The ranges are listed in this order so the re-constructed packet matches. | 2160 // matches. |
2523 0xF3, | 2161 0xF3, |
2524 // No gap between ranges | 2162 // No gap between ranges |
2525 0x00, | 2163 0x00, |
2526 // 255 more missing packets in range. | 2164 // 255 more missing packets in range. |
2527 0xFF, | 2165 0xFF, |
2528 // No revived packets. | 2166 // No revived packets. |
2529 0x00, | 2167 0x00, |
2530 }; | 2168 }; |
2531 | 2169 |
2532 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2170 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2533 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2171 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2534 | 2172 |
2535 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2173 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2536 ASSERT_TRUE(visitor_.header_.get()); | 2174 ASSERT_TRUE(visitor_.header_.get()); |
2537 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2175 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2538 | 2176 |
2539 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2177 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
(...skipping 14 matching lines...) Expand all Loading... |
2554 QuicFrames frames; | 2192 QuicFrames frames; |
2555 frames.push_back(QuicFrame(frame)); | 2193 frames.push_back(QuicFrame(frame)); |
2556 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); | 2194 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); |
2557 ASSERT_TRUE(data != nullptr); | 2195 ASSERT_TRUE(data != nullptr); |
2558 | 2196 |
2559 test::CompareCharArraysWithHexError("constructed packet", | 2197 test::CompareCharArraysWithHexError("constructed packet", |
2560 data->data(), data->length(), | 2198 data->data(), data->length(), |
2561 AsChars(packet), arraysize(packet)); | 2199 AsChars(packet), arraysize(packet)); |
2562 } | 2200 } |
2563 | 2201 |
2564 TEST_P(QuicFramerTest, CongestionFeedbackFrameTCP) { | |
2565 unsigned char packet[] = { | |
2566 // public flags (8 byte connection_id) | |
2567 0x3C, | |
2568 // connection_id | |
2569 0x10, 0x32, 0x54, 0x76, | |
2570 0x98, 0xBA, 0xDC, 0xFE, | |
2571 // packet sequence number | |
2572 0xBC, 0x9A, 0x78, 0x56, | |
2573 0x34, 0x12, | |
2574 // private flags | |
2575 0x00, | |
2576 | |
2577 // frame type (congestion feedback frame) | |
2578 0x20, | |
2579 // congestion feedback type (tcp) | |
2580 0x00, | |
2581 // ack_frame.feedback.tcp.receive_window | |
2582 0x03, 0x04, | |
2583 }; | |
2584 | |
2585 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
2586 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
2587 | |
2588 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
2589 ASSERT_TRUE(visitor_.header_.get()); | |
2590 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | |
2591 | |
2592 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
2593 ASSERT_EQ(1u, visitor_.congestion_feedback_frames_.size()); | |
2594 const QuicCongestionFeedbackFrame& frame = | |
2595 *visitor_.congestion_feedback_frames_[0]; | |
2596 ASSERT_EQ(kTCP, frame.type); | |
2597 EXPECT_EQ(0x4030u, frame.tcp.receive_window); | |
2598 | |
2599 // Now test framing boundaries. | |
2600 for (size_t i = kQuicFrameTypeSize; i < 4; ++i) { | |
2601 string expected_error; | |
2602 if (i < 2) { | |
2603 expected_error = "Unable to read congestion feedback type."; | |
2604 } else if (i < 4) { | |
2605 expected_error = "Unable to read receive window."; | |
2606 } | |
2607 CheckProcessingFails( | |
2608 packet, | |
2609 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | |
2610 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | |
2611 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA); | |
2612 } | |
2613 } | |
2614 | |
2615 TEST_P(QuicFramerTest, CongestionFeedbackFrameInvalidFeedback) { | |
2616 unsigned char packet[] = { | |
2617 // public flags (8 byte connection_id) | |
2618 0x3C, | |
2619 // connection_id | |
2620 0x10, 0x32, 0x54, 0x76, | |
2621 0x98, 0xBA, 0xDC, 0xFE, | |
2622 // packet sequence number | |
2623 0xBC, 0x9A, 0x78, 0x56, | |
2624 0x34, 0x12, | |
2625 // private flags | |
2626 0x00, | |
2627 | |
2628 // frame type (congestion feedback frame) | |
2629 0x20, | |
2630 // congestion feedback type (invalid) | |
2631 0x03, | |
2632 }; | |
2633 | |
2634 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
2635 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | |
2636 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | |
2637 EXPECT_EQ(QUIC_INVALID_CONGESTION_FEEDBACK_DATA, framer_.error()); | |
2638 } | |
2639 | |
2640 TEST_P(QuicFramerTest, StopWaitingFrame) { | 2202 TEST_P(QuicFramerTest, StopWaitingFrame) { |
2641 unsigned char packet[] = { | 2203 unsigned char packet[] = { |
2642 // public flags (8 byte connection_id) | 2204 // public flags (8 byte connection_id) |
2643 0x3C, | 2205 0x3C, |
2644 // connection_id | 2206 // connection_id |
2645 0x10, 0x32, 0x54, 0x76, | 2207 0x10, 0x32, 0x54, 0x76, |
2646 0x98, 0xBA, 0xDC, 0xFE, | 2208 0x98, 0xBA, 0xDC, 0xFE, |
2647 // packet sequence number | 2209 // packet sequence number |
2648 0xA8, 0x9A, 0x78, 0x56, | 2210 0xA8, 0x9A, 0x78, 0x56, |
2649 0x34, 0x12, | 2211 0x34, 0x12, |
(...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3493 | 3055 |
3494 QuicStreamFrame stream_frame; | 3056 QuicStreamFrame stream_frame; |
3495 stream_frame.stream_id = 0x01020304; | 3057 stream_frame.stream_id = 0x01020304; |
3496 stream_frame.fin = true; | 3058 stream_frame.fin = true; |
3497 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); | 3059 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); |
3498 stream_frame.data = MakeIOVector("hello world!"); | 3060 stream_frame.data = MakeIOVector("hello world!"); |
3499 | 3061 |
3500 QuicFrames frames; | 3062 QuicFrames frames; |
3501 frames.push_back(QuicFrame(&stream_frame)); | 3063 frames.push_back(QuicFrame(&stream_frame)); |
3502 unsigned char packet[] = { | 3064 unsigned char packet[] = { |
3503 // public flags (8 byte connection_id) | 3065 // public flags (8 byte connection_id) |
3504 0x3C, | 3066 0x3C, |
3505 // connection_id | 3067 // connection_id |
3506 0x10, 0x32, 0x54, 0x76, | 3068 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3507 0x98, 0xBA, 0xDC, 0xFE, | 3069 // packet sequence number |
3508 // packet sequence number | 3070 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3509 0xBC, 0x9A, 0x78, 0x56, | 3071 // private flags (entropy, is_in_fec_group) |
3510 0x34, 0x12, | 3072 0x03, |
3511 // private flags (entropy, is_in_fec_group) | 3073 // FEC group |
3512 0x03, | 3074 0x00, |
3513 // FEC group | 3075 // frame type (stream frame with fin and data length field) |
3514 0x00, | 3076 0xFF, |
3515 // frame type (stream frame with fin and data length field) | 3077 // stream id |
3516 0xFF, | 3078 0x04, 0x03, 0x02, 0x01, |
3517 // stream id | 3079 // offset |
3518 0x04, 0x03, 0x02, 0x01, | 3080 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
3519 // offset | 3081 // data length (since packet is in an FEC group) |
3520 0x54, 0x76, 0x10, 0x32, | 3082 0x0C, 0x00, |
3521 0xDC, 0xFE, 0x98, 0xBA, | 3083 // data |
3522 // data length (since packet is in an FEC group) | 3084 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', |
3523 0x0C, 0x00, | |
3524 // data | |
3525 'h', 'e', 'l', 'l', | |
3526 'o', ' ', 'w', 'o', | |
3527 'r', 'l', 'd', '!', | |
3528 }; | 3085 }; |
3529 | 3086 |
3530 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3087 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
3531 ASSERT_TRUE(data != nullptr); | 3088 ASSERT_TRUE(data != nullptr); |
3532 | 3089 |
3533 test::CompareCharArraysWithHexError("constructed packet", | 3090 test::CompareCharArraysWithHexError("constructed packet", |
3534 data->data(), data->length(), | 3091 data->data(), data->length(), |
3535 AsChars(packet), arraysize(packet)); | 3092 AsChars(packet), arraysize(packet)); |
3536 } | 3093 } |
3537 | 3094 |
(...skipping 10 matching lines...) Expand all Loading... |
3548 QuicStreamFrame stream_frame; | 3105 QuicStreamFrame stream_frame; |
3549 stream_frame.stream_id = 0x01020304; | 3106 stream_frame.stream_id = 0x01020304; |
3550 stream_frame.fin = true; | 3107 stream_frame.fin = true; |
3551 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); | 3108 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); |
3552 stream_frame.data = MakeIOVector("hello world!"); | 3109 stream_frame.data = MakeIOVector("hello world!"); |
3553 | 3110 |
3554 QuicFrames frames; | 3111 QuicFrames frames; |
3555 frames.push_back(QuicFrame(&stream_frame)); | 3112 frames.push_back(QuicFrame(&stream_frame)); |
3556 | 3113 |
3557 unsigned char packet[] = { | 3114 unsigned char packet[] = { |
3558 // public flags (version, 8 byte connection_id) | 3115 // public flags (version, 8 byte connection_id) |
3559 0x3D, | 3116 0x3D, |
3560 // connection_id | 3117 // connection_id |
3561 0x10, 0x32, 0x54, 0x76, | 3118 0x10, |
3562 0x98, 0xBA, 0xDC, 0xFE, | 3119 0x32, |
3563 // version tag | 3120 0x54, |
3564 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | 3121 0x76, |
3565 // packet sequence number | 3122 0x98, |
3566 0xBC, 0x9A, 0x78, 0x56, | 3123 0xBA, |
3567 0x34, 0x12, | 3124 0xDC, |
3568 // private flags (entropy) | 3125 0xFE, |
3569 0x01, | 3126 // version tag |
| 3127 'Q', |
| 3128 '0', |
| 3129 GetQuicVersionDigitTens(), |
| 3130 GetQuicVersionDigitOnes(), |
| 3131 // packet sequence number |
| 3132 0xBC, |
| 3133 0x9A, |
| 3134 0x78, |
| 3135 0x56, |
| 3136 0x34, |
| 3137 0x12, |
| 3138 // private flags (entropy) |
| 3139 0x01, |
3570 | 3140 |
3571 // frame type (stream frame with fin and no length) | 3141 // frame type (stream frame with fin and no length) |
3572 0xDF, | 3142 0xDF, |
3573 // stream id | 3143 // stream id |
3574 0x04, 0x03, 0x02, 0x01, | 3144 0x04, |
3575 // offset | 3145 0x03, |
3576 0x54, 0x76, 0x10, 0x32, | 3146 0x02, |
3577 0xDC, 0xFE, 0x98, 0xBA, | 3147 0x01, |
3578 // data | 3148 // offset |
3579 'h', 'e', 'l', 'l', | 3149 0x54, |
3580 'o', ' ', 'w', 'o', | 3150 0x76, |
3581 'r', 'l', 'd', '!', | 3151 0x10, |
| 3152 0x32, |
| 3153 0xDC, |
| 3154 0xFE, |
| 3155 0x98, |
| 3156 0xBA, |
| 3157 // data |
| 3158 'h', |
| 3159 'e', |
| 3160 'l', |
| 3161 'l', |
| 3162 'o', |
| 3163 ' ', |
| 3164 'w', |
| 3165 'o', |
| 3166 'r', |
| 3167 'l', |
| 3168 'd', |
| 3169 '!', |
3582 }; | 3170 }; |
3583 | 3171 |
3584 QuicFramerPeer::SetIsServer(&framer_, false); | 3172 QuicFramerPeer::SetIsServer(&framer_, false); |
3585 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3173 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
3586 ASSERT_TRUE(data != nullptr); | 3174 ASSERT_TRUE(data != nullptr); |
3587 | 3175 |
3588 test::CompareCharArraysWithHexError("constructed packet", | 3176 test::CompareCharArraysWithHexError("constructed packet", |
3589 data->data(), data->length(), | 3177 data->data(), data->length(), |
3590 AsChars(packet), arraysize(packet)); | 3178 AsChars(packet), arraysize(packet)); |
3591 } | 3179 } |
3592 | 3180 |
3593 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) { | 3181 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) { |
3594 QuicPacketPublicHeader header; | 3182 QuicPacketPublicHeader header; |
3595 header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3183 header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3596 header.reset_flag = false; | 3184 header.reset_flag = false; |
3597 header.version_flag = true; | 3185 header.version_flag = true; |
3598 | 3186 |
3599 unsigned char packet[] = { | 3187 unsigned char packet[] = { |
3600 // public flags (version, 8 byte connection_id) | 3188 // public flags (version, 8 byte connection_id) |
3601 0x0D, | 3189 0x0D, |
3602 // connection_id | 3190 // connection_id |
3603 0x10, 0x32, 0x54, 0x76, | 3191 0x10, |
3604 0x98, 0xBA, 0xDC, 0xFE, | 3192 0x32, |
3605 // version tag | 3193 0x54, |
3606 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | 3194 0x76, |
| 3195 0x98, |
| 3196 0xBA, |
| 3197 0xDC, |
| 3198 0xFE, |
| 3199 // version tag |
| 3200 'Q', |
| 3201 '0', |
| 3202 GetQuicVersionDigitTens(), |
| 3203 GetQuicVersionDigitOnes(), |
3607 }; | 3204 }; |
3608 | 3205 |
3609 QuicVersionVector versions; | 3206 QuicVersionVector versions; |
3610 versions.push_back(GetParam()); | 3207 versions.push_back(GetParam()); |
3611 scoped_ptr<QuicEncryptedPacket> data( | 3208 scoped_ptr<QuicEncryptedPacket> data( |
3612 framer_.BuildVersionNegotiationPacket(header, versions)); | 3209 framer_.BuildVersionNegotiationPacket(header, versions)); |
3613 | 3210 |
3614 test::CompareCharArraysWithHexError("constructed packet", | 3211 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
3615 data->data(), data->length(), | 3212 data->length(), AsChars(packet), |
3616 AsChars(packet), arraysize(packet)); | 3213 arraysize(packet)); |
3617 } | 3214 } |
3618 | 3215 |
3619 TEST_P(QuicFramerTest, BuildAckFramePacketv22) { | 3216 TEST_P(QuicFramerTest, BuildAckFramePacket) { |
3620 if (version_ > QUIC_VERSION_22) { | |
3621 return; | |
3622 } | |
3623 QuicPacketHeader header; | 3217 QuicPacketHeader header; |
3624 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3218 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3625 header.public_header.reset_flag = false; | 3219 header.public_header.reset_flag = false; |
3626 header.public_header.version_flag = false; | |
3627 header.fec_flag = false; | |
3628 header.entropy_flag = true; | |
3629 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | |
3630 header.fec_group = 0; | |
3631 | |
3632 QuicAckFrame ack_frame; | |
3633 ack_frame.entropy_hash = 0x43; | |
3634 ack_frame.largest_observed = GG_UINT64_C(0x770123456789ABF); | |
3635 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); | |
3636 ack_frame.missing_packets.insert( | |
3637 GG_UINT64_C(0x770123456789ABE)); | |
3638 | |
3639 QuicFrames frames; | |
3640 frames.push_back(QuicFrame(&ack_frame)); | |
3641 | |
3642 unsigned char packet[] = { | |
3643 // public flags (8 byte connection_id) | |
3644 0x3C, | |
3645 // connection_id | |
3646 0x10, 0x32, 0x54, 0x76, | |
3647 0x98, 0xBA, 0xDC, 0xFE, | |
3648 // packet sequence number | |
3649 0xA8, 0x9A, 0x78, 0x56, | |
3650 0x34, 0x12, | |
3651 // private flags (entropy) | |
3652 0x01, | |
3653 | |
3654 // frame type (ack frame) | |
3655 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
3656 0x6C, | |
3657 // entropy hash of all received packets. | |
3658 0x43, | |
3659 // largest observed packet sequence number | |
3660 0xBF, 0x9A, 0x78, 0x56, | |
3661 0x34, 0x12, | |
3662 // Zero delta time. | |
3663 0x0, 0x0, | |
3664 // num missing packet ranges | |
3665 0x01, | |
3666 // missing packet delta | |
3667 0x01, | |
3668 // 0 more missing packets in range. | |
3669 0x00, | |
3670 // 0 revived packets. | |
3671 0x00, | |
3672 }; | |
3673 | |
3674 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | |
3675 ASSERT_TRUE(data != nullptr); | |
3676 | |
3677 test::CompareCharArraysWithHexError("constructed packet", | |
3678 data->data(), data->length(), | |
3679 AsChars(packet), arraysize(packet)); | |
3680 } | |
3681 | |
3682 TEST_P(QuicFramerTest, BuildAckFramePacket) { | |
3683 if (version_ <= QUIC_VERSION_22) { | |
3684 return; | |
3685 } | |
3686 QuicPacketHeader header; | |
3687 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | |
3688 header.public_header.reset_flag = false; | |
3689 header.public_header.version_flag = false; | 3220 header.public_header.version_flag = false; |
3690 header.fec_flag = false; | 3221 header.fec_flag = false; |
3691 header.entropy_flag = true; | 3222 header.entropy_flag = true; |
3692 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | 3223 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
3693 header.fec_group = 0; | 3224 header.fec_group = 0; |
3694 | 3225 |
3695 QuicAckFrame ack_frame; | 3226 QuicAckFrame ack_frame; |
3696 ack_frame.entropy_hash = 0x43; | 3227 ack_frame.entropy_hash = 0x43; |
3697 ack_frame.largest_observed = GG_UINT64_C(0x770123456789ABF); | 3228 ack_frame.largest_observed = GG_UINT64_C(0x770123456789ABF); |
3698 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); | 3229 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); |
3699 ack_frame.missing_packets.insert( | 3230 ack_frame.missing_packets.insert(GG_UINT64_C(0x770123456789ABE)); |
3700 GG_UINT64_C(0x770123456789ABE)); | |
3701 | 3231 |
3702 QuicFrames frames; | 3232 QuicFrames frames; |
3703 frames.push_back(QuicFrame(&ack_frame)); | 3233 frames.push_back(QuicFrame(&ack_frame)); |
3704 | 3234 |
3705 unsigned char packet[] = { | 3235 unsigned char packet[] = { |
3706 // public flags (8 byte connection_id) | 3236 // public flags (8 byte connection_id) |
3707 0x3C, | 3237 0x3C, |
3708 // connection_id | 3238 // connection_id |
3709 0x10, 0x32, 0x54, 0x76, | 3239 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3710 0x98, 0xBA, 0xDC, 0xFE, | 3240 // packet sequence number |
3711 // packet sequence number | 3241 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3712 0xA8, 0x9A, 0x78, 0x56, | 3242 // private flags (entropy) |
3713 0x34, 0x12, | 3243 0x01, |
3714 // private flags (entropy) | |
3715 0x01, | |
3716 | 3244 |
3717 // frame type (ack frame) | 3245 // frame type (ack frame) |
3718 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 3246 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
3719 0x6C, | 3247 0x6C, |
3720 // entropy hash of all received packets. | 3248 // entropy hash of all received packets. |
3721 0x43, | 3249 0x43, |
3722 // largest observed packet sequence number | 3250 // largest observed packet sequence number |
3723 0xBF, 0x9A, 0x78, 0x56, | 3251 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3724 0x34, 0x12, | 3252 // Zero delta time. |
3725 // Zero delta time. | 3253 0x00, 0x00, |
3726 0x0, 0x0, | 3254 // num received packets. |
3727 // num received packets. | 3255 0x00, |
3728 0x00, | 3256 // num missing packet ranges |
3729 // num missing packet ranges | 3257 0x01, |
3730 0x01, | 3258 // missing packet delta |
3731 // missing packet delta | 3259 0x01, |
3732 0x01, | 3260 // 0 more missing packets in range. |
3733 // 0 more missing packets in range. | 3261 0x00, |
3734 0x00, | 3262 // 0 revived packets. |
3735 // 0 revived packets. | 3263 0x00, |
3736 0x00, | |
3737 }; | 3264 }; |
3738 | 3265 |
3739 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3266 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
3740 ASSERT_TRUE(data != nullptr); | 3267 ASSERT_TRUE(data != nullptr); |
3741 | 3268 |
3742 test::CompareCharArraysWithHexError("constructed packet", | 3269 test::CompareCharArraysWithHexError("constructed packet", |
3743 data->data(), data->length(), | 3270 data->data(), data->length(), |
3744 AsChars(packet), arraysize(packet)); | 3271 AsChars(packet), arraysize(packet)); |
3745 } | 3272 } |
3746 | 3273 |
3747 // TODO(jri): Add test for tuncated packets in which the original ack frame had | 3274 // TODO(jri): Add test for tuncated packets in which the original ack frame had |
3748 // revived packets. (In both the large and small packet cases below). | 3275 // revived packets. (In both the large and small packet cases below). |
3749 | 3276 |
3750 TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacketv22) { | 3277 TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacket) { |
3751 if (version_ > QUIC_VERSION_22) { | |
3752 return; | |
3753 } | |
3754 QuicPacketHeader header; | 3278 QuicPacketHeader header; |
3755 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3279 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3756 header.public_header.reset_flag = false; | 3280 header.public_header.reset_flag = false; |
3757 header.public_header.version_flag = false; | |
3758 header.fec_flag = false; | |
3759 header.entropy_flag = true; | |
3760 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | |
3761 header.fec_group = 0; | |
3762 | |
3763 QuicAckFrame ack_frame; | |
3764 // This entropy hash is different from what shows up in the packet below, | |
3765 // since entropy is recomputed by the framer on ack truncation (by | |
3766 // TestEntropyCalculator for this test.) | |
3767 ack_frame.entropy_hash = 0x43; | |
3768 ack_frame.largest_observed = 2 * 300; | |
3769 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); | |
3770 for (size_t i = 1; i < 2 * 300; i += 2) { | |
3771 ack_frame.missing_packets.insert(i); | |
3772 } | |
3773 | |
3774 QuicFrames frames; | |
3775 frames.push_back(QuicFrame(&ack_frame)); | |
3776 | |
3777 unsigned char packet[] = { | |
3778 // public flags (8 byte connection_id) | |
3779 0x3C, | |
3780 // connection_id | |
3781 0x10, 0x32, 0x54, 0x76, | |
3782 0x98, 0xBA, 0xDC, 0xFE, | |
3783 // packet sequence number | |
3784 0xA8, 0x9A, 0x78, 0x56, | |
3785 0x34, 0x12, | |
3786 // private flags (entropy) | |
3787 0x01, | |
3788 | |
3789 // frame type (ack frame) | |
3790 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) | |
3791 0x74, | |
3792 // entropy hash of all received packets, set to 1 by TestEntropyCalculator | |
3793 // since ack is truncated. | |
3794 0x01, | |
3795 // 2-byte largest observed packet sequence number. | |
3796 // Expected to be 510 (0x1FE), since only 255 nack ranges can fit. | |
3797 0xFE, 0x01, | |
3798 // Zero delta time. | |
3799 0x0, 0x0, | |
3800 // num missing packet ranges (limited to 255 by size of this field). | |
3801 0xFF, | |
3802 // {missing packet delta, further missing packets in range} | |
3803 // 6 nack ranges x 42 + 3 nack ranges | |
3804 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3805 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3806 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3807 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3808 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3809 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3810 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3811 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3812 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3813 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3814 | |
3815 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3816 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3817 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3818 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3819 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3820 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3821 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3822 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3823 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3824 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3825 | |
3826 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3827 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3828 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3829 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3830 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3831 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3832 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3833 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3834 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3835 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3836 | |
3837 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3838 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3839 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3840 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3841 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3842 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3843 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3844 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3845 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3846 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3847 | |
3848 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3849 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3850 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
3851 | |
3852 // 0 revived packets. | |
3853 0x00, | |
3854 }; | |
3855 | |
3856 scoped_ptr<QuicPacket> data( | |
3857 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet); | |
3858 ASSERT_TRUE(data != nullptr); | |
3859 | |
3860 test::CompareCharArraysWithHexError("constructed packet", | |
3861 data->data(), data->length(), | |
3862 AsChars(packet), arraysize(packet)); | |
3863 } | |
3864 | |
3865 TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacket) { | |
3866 if (version_ <= QUIC_VERSION_22) { | |
3867 return; | |
3868 } | |
3869 QuicPacketHeader header; | |
3870 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | |
3871 header.public_header.reset_flag = false; | |
3872 header.public_header.version_flag = false; | 3281 header.public_header.version_flag = false; |
3873 header.fec_flag = false; | 3282 header.fec_flag = false; |
3874 header.entropy_flag = true; | 3283 header.entropy_flag = true; |
3875 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | 3284 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
3876 header.fec_group = 0; | 3285 header.fec_group = 0; |
3877 | 3286 |
3878 QuicAckFrame ack_frame; | 3287 QuicAckFrame ack_frame; |
3879 // This entropy hash is different from what shows up in the packet below, | 3288 // This entropy hash is different from what shows up in the packet below, |
3880 // since entropy is recomputed by the framer on ack truncation (by | 3289 // since entropy is recomputed by the framer on ack truncation (by |
3881 // TestEntropyCalculator for this test.) | 3290 // TestEntropyCalculator for this test.) |
3882 ack_frame.entropy_hash = 0x43; | 3291 ack_frame.entropy_hash = 0x43; |
3883 ack_frame.largest_observed = 2 * 300; | 3292 ack_frame.largest_observed = 2 * 300; |
3884 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); | 3293 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); |
3885 for (size_t i = 1; i < 2 * 300; i += 2) { | 3294 for (size_t i = 1; i < 2 * 300; i += 2) { |
3886 ack_frame.missing_packets.insert(i); | 3295 ack_frame.missing_packets.insert(i); |
3887 } | 3296 } |
3888 | 3297 |
3889 QuicFrames frames; | 3298 QuicFrames frames; |
3890 frames.push_back(QuicFrame(&ack_frame)); | 3299 frames.push_back(QuicFrame(&ack_frame)); |
3891 | 3300 |
3892 unsigned char packet[] = { | 3301 unsigned char packet[] = { |
3893 // public flags (8 byte connection_id) | 3302 // public flags (8 byte connection_id) |
3894 0x3C, | 3303 0x3C, |
3895 // connection_id | 3304 // connection_id |
3896 0x10, 0x32, 0x54, 0x76, | 3305 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3897 0x98, 0xBA, 0xDC, 0xFE, | 3306 // packet sequence number |
3898 // packet sequence number | 3307 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3899 0xA8, 0x9A, 0x78, 0x56, | 3308 // private flags (entropy) |
3900 0x34, 0x12, | 3309 0x01, |
3901 // private flags (entropy) | |
3902 0x01, | |
3903 | 3310 |
3904 // frame type (ack frame) | 3311 // frame type (ack frame) |
3905 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) | 3312 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) |
3906 0x74, | 3313 0x74, |
3907 // entropy hash of all received packets, set to 1 by TestEntropyCalculator | 3314 // entropy hash of all received packets, set to 1 by TestEntropyCalculator |
3908 // since ack is truncated. | 3315 // since ack is truncated. |
3909 0x01, | 3316 0x01, |
3910 // 2-byte largest observed packet sequence number. | 3317 // 2-byte largest observed packet sequence number. |
3911 // Expected to be 510 (0x1FE), since only 255 nack ranges can fit. | 3318 // Expected to be 510 (0x1FE), since only 255 nack ranges can fit. |
3912 0xFE, 0x01, | 3319 0xFE, 0x01, |
3913 // Zero delta time. | 3320 // Zero delta time. |
3914 0x0, 0x0, | 3321 0x00, 0x00, |
3915 // num missing packet ranges (limited to 255 by size of this field). | 3322 // num missing packet ranges (limited to 255 by size of this field). |
3916 0xFF, | 3323 0xFF, |
3917 // {missing packet delta, further missing packets in range} | 3324 // {missing packet delta, further missing packets in range} |
3918 // 6 nack ranges x 42 + 3 nack ranges | 3325 // 6 nack ranges x 42 + 3 nack ranges |
3919 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3326 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3920 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3327 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3921 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3328 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3922 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3329 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3923 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3330 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3924 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3331 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3925 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3332 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3926 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3333 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3927 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3334 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3928 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3335 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3929 | 3336 |
3930 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3337 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3931 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3338 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3932 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3339 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3933 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3340 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3934 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3341 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3935 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3342 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3936 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3343 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3937 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3344 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3938 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3345 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3939 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3346 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3940 | 3347 |
3941 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3348 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3942 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3349 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3943 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3350 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3944 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3351 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3945 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3352 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3946 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3353 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3947 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3354 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3948 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3355 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3949 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3356 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3950 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3357 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3951 | 3358 |
3952 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3359 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3953 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3360 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3954 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3361 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3955 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3362 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3956 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3363 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3957 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3364 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3958 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3365 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3959 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3366 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3960 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3367 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3961 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3368 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3962 | 3369 |
3963 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3370 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3964 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3371 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3965 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3372 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3966 | 3373 |
3967 // 0 revived packets. | 3374 // 0 revived packets. |
3968 0x00, | 3375 0x00, |
3969 }; | 3376 }; |
3970 | 3377 |
3971 scoped_ptr<QuicPacket> data( | 3378 scoped_ptr<QuicPacket> data( |
3972 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet); | 3379 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet); |
3973 ASSERT_TRUE(data != nullptr); | 3380 ASSERT_TRUE(data != nullptr); |
3974 | 3381 |
3975 test::CompareCharArraysWithHexError("constructed packet", | 3382 test::CompareCharArraysWithHexError("constructed packet", |
3976 data->data(), data->length(), | 3383 data->data(), data->length(), |
3977 AsChars(packet), arraysize(packet)); | 3384 AsChars(packet), arraysize(packet)); |
3978 } | 3385 } |
3979 | 3386 |
3980 | |
3981 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacketv22) { | |
3982 if (version_ > QUIC_VERSION_22) { | |
3983 return; | |
3984 } | |
3985 QuicPacketHeader header; | |
3986 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | |
3987 header.public_header.reset_flag = false; | |
3988 header.public_header.version_flag = false; | |
3989 header.fec_flag = false; | |
3990 header.entropy_flag = true; | |
3991 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | |
3992 header.fec_group = 0; | |
3993 | |
3994 QuicAckFrame ack_frame; | |
3995 // This entropy hash is different from what shows up in the packet below, | |
3996 // since entropy is recomputed by the framer on ack truncation (by | |
3997 // TestEntropyCalculator for this test.) | |
3998 ack_frame.entropy_hash = 0x43; | |
3999 ack_frame.largest_observed = 2 * 300; | |
4000 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); | |
4001 for (size_t i = 1; i < 2 * 300; i += 2) { | |
4002 ack_frame.missing_packets.insert(i); | |
4003 } | |
4004 | |
4005 QuicFrames frames; | |
4006 frames.push_back(QuicFrame(&ack_frame)); | |
4007 | |
4008 unsigned char packet[] = { | |
4009 // public flags (8 byte connection_id) | |
4010 0x3C, | |
4011 // connection_id | |
4012 0x10, 0x32, 0x54, 0x76, | |
4013 0x98, 0xBA, 0xDC, 0xFE, | |
4014 // packet sequence number | |
4015 0xA8, 0x9A, 0x78, 0x56, | |
4016 0x34, 0x12, | |
4017 // private flags (entropy) | |
4018 0x01, | |
4019 | |
4020 // frame type (ack frame) | |
4021 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) | |
4022 0x74, | |
4023 // entropy hash of all received packets, set to 1 by TestEntropyCalculator | |
4024 // since ack is truncated. | |
4025 0x01, | |
4026 // 2-byte largest observed packet sequence number. | |
4027 // Expected to be 12 (0x0C), since only 6 nack ranges can fit. | |
4028 0x0C, 0x00, | |
4029 // Zero delta time. | |
4030 0x0, 0x0, | |
4031 // num missing packet ranges (limited to 6 by packet size of 37). | |
4032 0x06, | |
4033 // {missing packet delta, further missing packets in range} | |
4034 // 6 nack ranges | |
4035 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
4036 // 0 revived packets. | |
4037 0x00, | |
4038 }; | |
4039 | |
4040 scoped_ptr<QuicPacket> data( | |
4041 framer_.BuildDataPacket(header, frames, 37u).packet); | |
4042 ASSERT_TRUE(data != nullptr); | |
4043 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. | |
4044 EXPECT_EQ(36u, data->length()); | |
4045 test::CompareCharArraysWithHexError("constructed packet", | |
4046 data->data(), data->length(), | |
4047 AsChars(packet), arraysize(packet)); | |
4048 } | |
4049 | |
4050 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { | 3387 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { |
4051 if (version_ <= QUIC_VERSION_22) { | |
4052 return; | |
4053 } | |
4054 QuicPacketHeader header; | 3388 QuicPacketHeader header; |
4055 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3389 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4056 header.public_header.reset_flag = false; | 3390 header.public_header.reset_flag = false; |
4057 header.public_header.version_flag = false; | 3391 header.public_header.version_flag = false; |
4058 header.fec_flag = false; | 3392 header.fec_flag = false; |
4059 header.entropy_flag = true; | 3393 header.entropy_flag = true; |
4060 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | 3394 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
4061 header.fec_group = 0; | 3395 header.fec_group = 0; |
4062 | 3396 |
4063 QuicAckFrame ack_frame; | 3397 QuicAckFrame ack_frame; |
4064 // This entropy hash is different from what shows up in the packet below, | 3398 // This entropy hash is different from what shows up in the packet below, |
4065 // since entropy is recomputed by the framer on ack truncation (by | 3399 // since entropy is recomputed by the framer on ack truncation (by |
4066 // TestEntropyCalculator for this test.) | 3400 // TestEntropyCalculator for this test.) |
4067 ack_frame.entropy_hash = 0x43; | 3401 ack_frame.entropy_hash = 0x43; |
4068 ack_frame.largest_observed = 2 * 300; | 3402 ack_frame.largest_observed = 2 * 300; |
4069 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); | 3403 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero(); |
4070 for (size_t i = 1; i < 2 * 300; i += 2) { | 3404 for (size_t i = 1; i < 2 * 300; i += 2) { |
4071 ack_frame.missing_packets.insert(i); | 3405 ack_frame.missing_packets.insert(i); |
4072 } | 3406 } |
4073 | 3407 |
4074 QuicFrames frames; | 3408 QuicFrames frames; |
4075 frames.push_back(QuicFrame(&ack_frame)); | 3409 frames.push_back(QuicFrame(&ack_frame)); |
4076 | 3410 |
4077 unsigned char packet[] = { | 3411 unsigned char packet[] = { |
4078 // public flags (8 byte connection_id) | 3412 // public flags (8 byte connection_id) |
4079 0x3C, | 3413 0x3C, |
4080 // connection_id | 3414 // connection_id |
4081 0x10, 0x32, 0x54, 0x76, | 3415 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4082 0x98, 0xBA, 0xDC, 0xFE, | 3416 // packet sequence number |
4083 // packet sequence number | 3417 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4084 0xA8, 0x9A, 0x78, 0x56, | 3418 // private flags (entropy) |
4085 0x34, 0x12, | 3419 0x01, |
4086 // private flags (entropy) | |
4087 0x01, | |
4088 | 3420 |
4089 // frame type (ack frame) | 3421 // frame type (ack frame) |
4090 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) | 3422 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) |
4091 0x74, | 3423 0x74, |
4092 // entropy hash of all received packets, set to 1 by TestEntropyCalculator | 3424 // entropy hash of all received packets, set to 1 by TestEntropyCalculator |
4093 // since ack is truncated. | 3425 // since ack is truncated. |
4094 0x01, | 3426 0x01, |
4095 // 2-byte largest observed packet sequence number. | 3427 // 2-byte largest observed packet sequence number. |
4096 // Expected to be 12 (0x0C), since only 6 nack ranges can fit. | 3428 // Expected to be 12 (0x0C), since only 6 nack ranges can fit. |
4097 0x0C, 0x00, | 3429 0x0C, 0x00, |
4098 // Zero delta time. | 3430 // Zero delta time. |
4099 0x0, 0x0, | 3431 0x00, 0x00, |
4100 // num missing packet ranges (limited to 6 by packet size of 37). | 3432 // num missing packet ranges (limited to 6 by packet size of 37). |
4101 0x06, | 3433 0x06, |
4102 // {missing packet delta, further missing packets in range} | 3434 // {missing packet delta, further missing packets in range} |
4103 // 6 nack ranges | 3435 // 6 nack ranges |
4104 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3436 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
4105 // 0 revived packets. | 3437 // 0 revived packets. |
4106 0x00, | 3438 0x00, |
4107 }; | 3439 }; |
4108 | 3440 |
4109 scoped_ptr<QuicPacket> data( | 3441 scoped_ptr<QuicPacket> data( |
4110 framer_.BuildDataPacket(header, frames, 37u).packet); | 3442 framer_.BuildDataPacket(header, frames, 37u).packet); |
4111 ASSERT_TRUE(data != nullptr); | 3443 ASSERT_TRUE(data != nullptr); |
4112 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. | 3444 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. |
4113 EXPECT_EQ(36u, data->length()); | 3445 EXPECT_EQ(36u, data->length()); |
4114 test::CompareCharArraysWithHexError("constructed packet", | 3446 test::CompareCharArraysWithHexError("constructed packet", |
4115 data->data(), data->length(), | 3447 data->data(), data->length(), |
4116 AsChars(packet), arraysize(packet)); | 3448 AsChars(packet), arraysize(packet)); |
4117 } | 3449 } |
4118 | 3450 |
4119 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCP) { | |
4120 QuicPacketHeader header; | |
4121 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | |
4122 header.public_header.reset_flag = false; | |
4123 header.public_header.version_flag = false; | |
4124 header.fec_flag = false; | |
4125 header.entropy_flag = false; | |
4126 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | |
4127 header.fec_group = 0; | |
4128 | |
4129 QuicCongestionFeedbackFrame congestion_feedback_frame; | |
4130 congestion_feedback_frame.type = kTCP; | |
4131 congestion_feedback_frame.tcp.receive_window = 0x4030; | |
4132 | |
4133 QuicFrames frames; | |
4134 frames.push_back(QuicFrame(&congestion_feedback_frame)); | |
4135 | |
4136 unsigned char packet[] = { | |
4137 // public flags (8 byte connection_id) | |
4138 0x3C, | |
4139 // connection_id | |
4140 0x10, 0x32, 0x54, 0x76, | |
4141 0x98, 0xBA, 0xDC, 0xFE, | |
4142 // packet sequence number | |
4143 0xBC, 0x9A, 0x78, 0x56, | |
4144 0x34, 0x12, | |
4145 // private flags | |
4146 0x00, | |
4147 | |
4148 // frame type (congestion feedback frame) | |
4149 0x20, | |
4150 // congestion feedback type (TCP) | |
4151 0x00, | |
4152 // TCP receive window | |
4153 0x03, 0x04, | |
4154 }; | |
4155 | |
4156 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | |
4157 ASSERT_TRUE(data != nullptr); | |
4158 | |
4159 test::CompareCharArraysWithHexError("constructed packet", | |
4160 data->data(), data->length(), | |
4161 AsChars(packet), arraysize(packet)); | |
4162 } | |
4163 | |
4164 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { | 3451 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { |
4165 QuicPacketHeader header; | 3452 QuicPacketHeader header; |
4166 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3453 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4167 header.public_header.reset_flag = false; | 3454 header.public_header.reset_flag = false; |
4168 header.public_header.version_flag = false; | 3455 header.public_header.version_flag = false; |
4169 header.fec_flag = false; | 3456 header.fec_flag = false; |
4170 header.entropy_flag = true; | 3457 header.entropy_flag = true; |
4171 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | 3458 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
4172 header.fec_group = 0; | 3459 header.fec_group = 0; |
4173 | 3460 |
(...skipping 26 matching lines...) Expand all Loading... |
4200 }; | 3487 }; |
4201 | 3488 |
4202 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3489 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
4203 ASSERT_TRUE(data != nullptr); | 3490 ASSERT_TRUE(data != nullptr); |
4204 | 3491 |
4205 test::CompareCharArraysWithHexError("constructed packet", | 3492 test::CompareCharArraysWithHexError("constructed packet", |
4206 data->data(), data->length(), | 3493 data->data(), data->length(), |
4207 AsChars(packet), arraysize(packet)); | 3494 AsChars(packet), arraysize(packet)); |
4208 } | 3495 } |
4209 | 3496 |
4210 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInvalidFeedback) { | |
4211 QuicPacketHeader header; | |
4212 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | |
4213 header.public_header.reset_flag = false; | |
4214 header.public_header.version_flag = false; | |
4215 header.fec_flag = false; | |
4216 header.entropy_flag = false; | |
4217 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | |
4218 header.fec_group = 0; | |
4219 | |
4220 QuicCongestionFeedbackFrame congestion_feedback_frame; | |
4221 congestion_feedback_frame.type = | |
4222 static_cast<CongestionFeedbackType>(kTCP + 1); | |
4223 | |
4224 QuicFrames frames; | |
4225 frames.push_back(QuicFrame(&congestion_feedback_frame)); | |
4226 | |
4227 scoped_ptr<QuicPacket> data; | |
4228 EXPECT_DFATAL( | |
4229 data.reset(BuildDataPacket(header, frames)), | |
4230 "AppendCongestionFeedbackFrame failed"); | |
4231 ASSERT_TRUE(data == nullptr); | |
4232 } | |
4233 | |
4234 TEST_P(QuicFramerTest, BuildRstFramePacketQuic) { | 3497 TEST_P(QuicFramerTest, BuildRstFramePacketQuic) { |
4235 QuicPacketHeader header; | 3498 QuicPacketHeader header; |
4236 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3499 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4237 header.public_header.reset_flag = false; | 3500 header.public_header.reset_flag = false; |
4238 header.public_header.version_flag = false; | 3501 header.public_header.version_flag = false; |
4239 header.fec_flag = false; | 3502 header.fec_flag = false; |
4240 header.entropy_flag = false; | 3503 header.entropy_flag = false; |
4241 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3504 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4242 header.fec_group = 0; | 3505 header.fec_group = 0; |
4243 | 3506 |
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4761 EXPECT_EQ(510u, processed_ack_frame.largest_observed); | 4024 EXPECT_EQ(510u, processed_ack_frame.largest_observed); |
4762 ASSERT_EQ(255u, processed_ack_frame.missing_packets.size()); | 4025 ASSERT_EQ(255u, processed_ack_frame.missing_packets.size()); |
4763 SequenceNumberSet::const_iterator missing_iter = | 4026 SequenceNumberSet::const_iterator missing_iter = |
4764 processed_ack_frame.missing_packets.begin(); | 4027 processed_ack_frame.missing_packets.begin(); |
4765 EXPECT_EQ(1u, *missing_iter); | 4028 EXPECT_EQ(1u, *missing_iter); |
4766 SequenceNumberSet::const_reverse_iterator last_missing_iter = | 4029 SequenceNumberSet::const_reverse_iterator last_missing_iter = |
4767 processed_ack_frame.missing_packets.rbegin(); | 4030 processed_ack_frame.missing_packets.rbegin(); |
4768 EXPECT_EQ(509u, *last_missing_iter); | 4031 EXPECT_EQ(509u, *last_missing_iter); |
4769 } | 4032 } |
4770 | 4033 |
4771 TEST_P(QuicFramerTest, AckTruncationSmallPacketv22) { | 4034 TEST_P(QuicFramerTest, AckTruncationSmallPacket) { |
4772 if (version_ > QUIC_VERSION_22) { | |
4773 return; | |
4774 } | |
4775 QuicPacketHeader header; | 4035 QuicPacketHeader header; |
4776 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 4036 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4777 header.public_header.reset_flag = false; | 4037 header.public_header.reset_flag = false; |
4778 header.public_header.version_flag = false; | |
4779 header.fec_flag = false; | |
4780 header.entropy_flag = false; | |
4781 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | |
4782 header.fec_group = 0; | |
4783 | |
4784 // Create a packet with just the ack. | |
4785 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); | |
4786 QuicFrame frame; | |
4787 frame.type = ACK_FRAME; | |
4788 frame.ack_frame = &ack_frame; | |
4789 QuicFrames frames; | |
4790 frames.push_back(frame); | |
4791 | |
4792 // Build an ack packet with truncation due to limit in number of nack ranges. | |
4793 scoped_ptr<QuicPacket> raw_ack_packet( | |
4794 framer_.BuildDataPacket(header, frames, 500).packet); | |
4795 ASSERT_TRUE(raw_ack_packet != nullptr); | |
4796 scoped_ptr<QuicEncryptedPacket> ack_packet( | |
4797 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | |
4798 *raw_ack_packet)); | |
4799 // Now make sure we can turn our ack packet back into an ack frame. | |
4800 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | |
4801 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
4802 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | |
4803 EXPECT_TRUE(processed_ack_frame.is_truncated); | |
4804 EXPECT_EQ(476u, processed_ack_frame.largest_observed); | |
4805 ASSERT_EQ(238u, processed_ack_frame.missing_packets.size()); | |
4806 SequenceNumberSet::const_iterator missing_iter = | |
4807 processed_ack_frame.missing_packets.begin(); | |
4808 EXPECT_EQ(1u, *missing_iter); | |
4809 SequenceNumberSet::const_reverse_iterator last_missing_iter = | |
4810 processed_ack_frame.missing_packets.rbegin(); | |
4811 EXPECT_EQ(475u, *last_missing_iter); | |
4812 } | |
4813 | |
4814 | |
4815 TEST_P(QuicFramerTest, AckTruncationSmallPacket) { | |
4816 if (version_ <= QUIC_VERSION_22) { | |
4817 return; | |
4818 } | |
4819 QuicPacketHeader header; | |
4820 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | |
4821 header.public_header.reset_flag = false; | |
4822 header.public_header.version_flag = false; | 4038 header.public_header.version_flag = false; |
4823 header.fec_flag = false; | 4039 header.fec_flag = false; |
4824 header.entropy_flag = false; | 4040 header.entropy_flag = false; |
4825 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4041 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4826 header.fec_group = 0; | 4042 header.fec_group = 0; |
4827 | 4043 |
4828 // Create a packet with just the ack. | 4044 // Create a packet with just the ack. |
4829 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); | 4045 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); |
4830 QuicFrame frame; | 4046 QuicFrame frame; |
4831 frame.type = ACK_FRAME; | 4047 frame.type = ACK_FRAME; |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5029 EXPECT_CALL(visitor, OnPacketComplete()); | 4245 EXPECT_CALL(visitor, OnPacketComplete()); |
5030 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); | 4246 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); |
5031 | 4247 |
5032 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 4248 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
5033 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 4249 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
5034 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 4250 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
5035 } | 4251 } |
5036 | 4252 |
5037 } // namespace test | 4253 } // namespace test |
5038 } // namespace net | 4254 } // namespace net |
OLD | NEW |