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 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 complete_packets_(0), | 204 complete_packets_(0), |
205 revived_packets_(0), | 205 revived_packets_(0), |
206 accept_packet_(true), | 206 accept_packet_(true), |
207 accept_public_header_(true) { | 207 accept_public_header_(true) { |
208 } | 208 } |
209 | 209 |
210 virtual ~TestQuicVisitor() { | 210 virtual ~TestQuicVisitor() { |
211 STLDeleteElements(&stream_frames_); | 211 STLDeleteElements(&stream_frames_); |
212 STLDeleteElements(&ack_frames_); | 212 STLDeleteElements(&ack_frames_); |
213 STLDeleteElements(&congestion_feedback_frames_); | 213 STLDeleteElements(&congestion_feedback_frames_); |
| 214 STLDeleteElements(&stop_waiting_frames_); |
214 STLDeleteElements(&fec_data_); | 215 STLDeleteElements(&fec_data_); |
215 } | 216 } |
216 | 217 |
217 virtual void OnError(QuicFramer* f) OVERRIDE { | 218 virtual void OnError(QuicFramer* f) OVERRIDE { |
218 DVLOG(1) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error()) | 219 DVLOG(1) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error()) |
219 << " (" << f->error() << ")"; | 220 << " (" << f->error() << ")"; |
220 error_count_++; | 221 ++error_count_; |
221 } | 222 } |
222 | 223 |
223 virtual void OnPacket() OVERRIDE {} | 224 virtual void OnPacket() OVERRIDE {} |
224 | 225 |
225 virtual void OnPublicResetPacket( | 226 virtual void OnPublicResetPacket( |
226 const QuicPublicResetPacket& packet) OVERRIDE { | 227 const QuicPublicResetPacket& packet) OVERRIDE { |
227 public_reset_packet_.reset(new QuicPublicResetPacket(packet)); | 228 public_reset_packet_.reset(new QuicPublicResetPacket(packet)); |
228 } | 229 } |
229 | 230 |
230 virtual void OnVersionNegotiationPacket( | 231 virtual void OnVersionNegotiationPacket( |
231 const QuicVersionNegotiationPacket& packet) OVERRIDE { | 232 const QuicVersionNegotiationPacket& packet) OVERRIDE { |
232 version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet)); | 233 version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet)); |
233 } | 234 } |
234 | 235 |
235 virtual void OnRevivedPacket() OVERRIDE { | 236 virtual void OnRevivedPacket() OVERRIDE { |
236 revived_packets_++; | 237 ++revived_packets_; |
237 } | 238 } |
238 | 239 |
239 virtual bool OnProtocolVersionMismatch(QuicVersion version) OVERRIDE { | 240 virtual bool OnProtocolVersionMismatch(QuicVersion version) OVERRIDE { |
240 DVLOG(1) << "QuicFramer Version Mismatch, version: " << version; | 241 DVLOG(1) << "QuicFramer Version Mismatch, version: " << version; |
241 version_mismatch_++; | 242 ++version_mismatch_; |
242 return true; | 243 return true; |
243 } | 244 } |
244 | 245 |
245 virtual bool OnUnauthenticatedPublicHeader( | 246 virtual bool OnUnauthenticatedPublicHeader( |
246 const QuicPacketPublicHeader& header) OVERRIDE { | 247 const QuicPacketPublicHeader& header) OVERRIDE { |
247 public_header_.reset(new QuicPacketPublicHeader(header)); | 248 public_header_.reset(new QuicPacketPublicHeader(header)); |
248 return accept_public_header_; | 249 return accept_public_header_; |
249 } | 250 } |
250 | 251 |
251 virtual bool OnUnauthenticatedHeader( | 252 virtual bool OnUnauthenticatedHeader( |
252 const QuicPacketHeader& header) OVERRIDE { | 253 const QuicPacketHeader& header) OVERRIDE { |
253 return true; | 254 return true; |
254 } | 255 } |
255 | 256 |
256 virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE { | 257 virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE { |
257 packet_count_++; | 258 ++packet_count_; |
258 header_.reset(new QuicPacketHeader(header)); | 259 header_.reset(new QuicPacketHeader(header)); |
259 return accept_packet_; | 260 return accept_packet_; |
260 } | 261 } |
261 | 262 |
262 virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE { | 263 virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE { |
263 frame_count_++; | 264 ++frame_count_; |
264 stream_frames_.push_back(new QuicStreamFrame(frame)); | 265 stream_frames_.push_back(new QuicStreamFrame(frame)); |
265 return true; | 266 return true; |
266 } | 267 } |
267 | 268 |
268 virtual void OnFecProtectedPayload(StringPiece payload) OVERRIDE { | 269 virtual void OnFecProtectedPayload(StringPiece payload) OVERRIDE { |
269 fec_protected_payload_ = payload.as_string(); | 270 fec_protected_payload_ = payload.as_string(); |
270 } | 271 } |
271 | 272 |
272 virtual bool OnAckFrame(const QuicAckFrame& frame) OVERRIDE { | 273 virtual bool OnAckFrame(const QuicAckFrame& frame) OVERRIDE { |
273 frame_count_++; | 274 ++frame_count_; |
274 ack_frames_.push_back(new QuicAckFrame(frame)); | 275 ack_frames_.push_back(new QuicAckFrame(frame)); |
275 return true; | 276 return true; |
276 } | 277 } |
277 | 278 |
278 virtual bool OnCongestionFeedbackFrame( | 279 virtual bool OnCongestionFeedbackFrame( |
279 const QuicCongestionFeedbackFrame& frame) OVERRIDE { | 280 const QuicCongestionFeedbackFrame& frame) OVERRIDE { |
280 frame_count_++; | 281 ++frame_count_; |
281 congestion_feedback_frames_.push_back( | 282 congestion_feedback_frames_.push_back( |
282 new QuicCongestionFeedbackFrame(frame)); | 283 new QuicCongestionFeedbackFrame(frame)); |
283 return true; | 284 return true; |
284 } | 285 } |
285 | 286 |
| 287 virtual bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) OVERRIDE { |
| 288 ++frame_count_; |
| 289 stop_waiting_frames_.push_back(new QuicStopWaitingFrame(frame)); |
| 290 return true; |
| 291 } |
| 292 |
286 virtual void OnFecData(const QuicFecData& fec) OVERRIDE { | 293 virtual void OnFecData(const QuicFecData& fec) OVERRIDE { |
287 fec_count_++; | 294 ++fec_count_; |
288 fec_data_.push_back(new QuicFecData(fec)); | 295 fec_data_.push_back(new QuicFecData(fec)); |
289 } | 296 } |
290 | 297 |
291 virtual void OnPacketComplete() OVERRIDE { | 298 virtual void OnPacketComplete() OVERRIDE { |
292 complete_packets_++; | 299 ++complete_packets_; |
293 } | 300 } |
294 | 301 |
295 virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) OVERRIDE { | 302 virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) OVERRIDE { |
296 rst_stream_frame_ = frame; | 303 rst_stream_frame_ = frame; |
297 return true; | 304 return true; |
298 } | 305 } |
299 | 306 |
300 virtual bool OnConnectionCloseFrame( | 307 virtual bool OnConnectionCloseFrame( |
301 const QuicConnectionCloseFrame& frame) OVERRIDE { | 308 const QuicConnectionCloseFrame& frame) OVERRIDE { |
302 connection_close_frame_ = frame; | 309 connection_close_frame_ = frame; |
(...skipping 27 matching lines...) Expand all Loading... |
330 bool accept_packet_; | 337 bool accept_packet_; |
331 bool accept_public_header_; | 338 bool accept_public_header_; |
332 | 339 |
333 scoped_ptr<QuicPacketHeader> header_; | 340 scoped_ptr<QuicPacketHeader> header_; |
334 scoped_ptr<QuicPacketPublicHeader> public_header_; | 341 scoped_ptr<QuicPacketPublicHeader> public_header_; |
335 scoped_ptr<QuicPublicResetPacket> public_reset_packet_; | 342 scoped_ptr<QuicPublicResetPacket> public_reset_packet_; |
336 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; | 343 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; |
337 vector<QuicStreamFrame*> stream_frames_; | 344 vector<QuicStreamFrame*> stream_frames_; |
338 vector<QuicAckFrame*> ack_frames_; | 345 vector<QuicAckFrame*> ack_frames_; |
339 vector<QuicCongestionFeedbackFrame*> congestion_feedback_frames_; | 346 vector<QuicCongestionFeedbackFrame*> congestion_feedback_frames_; |
| 347 vector<QuicStopWaitingFrame*> stop_waiting_frames_; |
340 vector<QuicFecData*> fec_data_; | 348 vector<QuicFecData*> fec_data_; |
341 string fec_protected_payload_; | 349 string fec_protected_payload_; |
342 QuicRstStreamFrame rst_stream_frame_; | 350 QuicRstStreamFrame rst_stream_frame_; |
343 QuicConnectionCloseFrame connection_close_frame_; | 351 QuicConnectionCloseFrame connection_close_frame_; |
344 QuicGoAwayFrame goaway_frame_; | 352 QuicGoAwayFrame goaway_frame_; |
345 QuicWindowUpdateFrame window_update_frame_; | 353 QuicWindowUpdateFrame window_update_frame_; |
346 QuicBlockedFrame blocked_frame_; | 354 QuicBlockedFrame blocked_frame_; |
347 }; | 355 }; |
348 | 356 |
349 class QuicFramerTest : public ::testing::TestWithParam<QuicVersion> { | 357 class QuicFramerTest : public ::testing::TestWithParam<QuicVersion> { |
(...skipping 1403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1753 expected_error = "Unable to read missing sequence number range."; | 1761 expected_error = "Unable to read missing sequence number range."; |
1754 } | 1762 } |
1755 CheckProcessingFails( | 1763 CheckProcessingFails( |
1756 packet, | 1764 packet, |
1757 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, | 1765 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
1758 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 1766 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
1759 expected_error, QUIC_INVALID_ACK_DATA); | 1767 expected_error, QUIC_INVALID_ACK_DATA); |
1760 } | 1768 } |
1761 } | 1769 } |
1762 | 1770 |
1763 TEST_P(QuicFramerTest, AckFrame) { | 1771 TEST_P(QuicFramerTest, AckFrame15) { |
1764 if (framer_.version() <= QUIC_VERSION_14) { | 1772 if (framer_.version() != QUIC_VERSION_15) { |
1765 return; | 1773 return; |
1766 } | 1774 } |
1767 | 1775 |
1768 unsigned char packet[] = { | 1776 unsigned char packet[] = { |
1769 // public flags (8 byte guid) | 1777 // public flags (8 byte guid) |
1770 0x3C, | 1778 0x3C, |
1771 // guid | 1779 // guid |
1772 0x10, 0x32, 0x54, 0x76, | 1780 0x10, 0x32, 0x54, 0x76, |
1773 0x98, 0xBA, 0xDC, 0xFE, | 1781 0x98, 0xBA, 0xDC, 0xFE, |
1774 // packet sequence number | 1782 // packet sequence number |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1862 expected_error = "Unable to read num revived packets."; | 1870 expected_error = "Unable to read num revived packets."; |
1863 } | 1871 } |
1864 CheckProcessingFails( | 1872 CheckProcessingFails( |
1865 packet, | 1873 packet, |
1866 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, | 1874 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
1867 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 1875 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
1868 expected_error, QUIC_INVALID_ACK_DATA); | 1876 expected_error, QUIC_INVALID_ACK_DATA); |
1869 } | 1877 } |
1870 } | 1878 } |
1871 | 1879 |
| 1880 TEST_P(QuicFramerTest, AckFrame) { |
| 1881 if (framer_.version() <= QUIC_VERSION_15) { |
| 1882 return; |
| 1883 } |
| 1884 |
| 1885 unsigned char packet[] = { |
| 1886 // public flags (8 byte guid) |
| 1887 0x3C, |
| 1888 // guid |
| 1889 0x10, 0x32, 0x54, 0x76, |
| 1890 0x98, 0xBA, 0xDC, 0xFE, |
| 1891 // packet sequence number |
| 1892 0xA8, 0x9A, 0x78, 0x56, |
| 1893 0x34, 0x12, |
| 1894 // private flags (entropy) |
| 1895 0x01, |
| 1896 |
| 1897 // frame type (ack frame) |
| 1898 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
| 1899 0x6C, |
| 1900 // entropy hash of all received packets. |
| 1901 0xBA, |
| 1902 // largest observed packet sequence number |
| 1903 0xBF, 0x9A, 0x78, 0x56, |
| 1904 0x34, 0x12, |
| 1905 // Zero delta time. |
| 1906 0x0, 0x0, |
| 1907 // num missing packets |
| 1908 0x01, |
| 1909 // missing packet delta |
| 1910 0x01, |
| 1911 // 0 more missing packets in range. |
| 1912 0x00, |
| 1913 // Number of revived packets. |
| 1914 0x00, |
| 1915 }; |
| 1916 |
| 1917 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1918 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1919 |
| 1920 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1921 ASSERT_TRUE(visitor_.header_.get()); |
| 1922 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 1923 |
| 1924 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 1925 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 1926 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
| 1927 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); |
| 1928 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); |
| 1929 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); |
| 1930 SequenceNumberSet::const_iterator missing_iter = |
| 1931 frame.received_info.missing_packets.begin(); |
| 1932 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); |
| 1933 |
| 1934 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; |
| 1935 const size_t kLargestObservedOffset = kReceivedEntropyOffset + |
| 1936 kQuicEntropyHashSize; |
| 1937 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + |
| 1938 PACKET_6BYTE_SEQUENCE_NUMBER; |
| 1939 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + |
| 1940 kQuicDeltaTimeLargestObservedSize; |
| 1941 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + |
| 1942 kNumberOfMissingPacketsSize; |
| 1943 const size_t kMissingPacketsRange = kMissingPacketsOffset + |
| 1944 PACKET_1BYTE_SEQUENCE_NUMBER; |
| 1945 const size_t kRevivedPacketsLength = kMissingPacketsRange + |
| 1946 PACKET_1BYTE_SEQUENCE_NUMBER; |
| 1947 // Now test framing boundaries |
| 1948 const size_t ack_frame_size = kRevivedPacketsLength + |
| 1949 PACKET_1BYTE_SEQUENCE_NUMBER; |
| 1950 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
| 1951 string expected_error; |
| 1952 if (i < kLargestObservedOffset) { |
| 1953 expected_error = "Unable to read entropy hash for received packets."; |
| 1954 } else if (i < kMissingDeltaTimeOffset) { |
| 1955 expected_error = "Unable to read largest observed."; |
| 1956 } else if (i < kNumMissingPacketOffset) { |
| 1957 expected_error = "Unable to read delta time largest observed."; |
| 1958 } else if (i < kMissingPacketsOffset) { |
| 1959 expected_error = "Unable to read num missing packet ranges."; |
| 1960 } else if (i < kMissingPacketsRange) { |
| 1961 expected_error = "Unable to read missing sequence number delta."; |
| 1962 } else if (i < kRevivedPacketsLength) { |
| 1963 expected_error = "Unable to read missing sequence number range."; |
| 1964 } else { |
| 1965 expected_error = "Unable to read num revived packets."; |
| 1966 } |
| 1967 CheckProcessingFails( |
| 1968 packet, |
| 1969 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 1970 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 1971 expected_error, QUIC_INVALID_ACK_DATA); |
| 1972 } |
| 1973 } |
| 1974 |
1872 TEST_P(QuicFramerTest, AckFrameRevivedPackets) { | 1975 TEST_P(QuicFramerTest, AckFrameRevivedPackets) { |
1873 if (framer_.version() <= QUIC_VERSION_14) { | 1976 if (framer_.version() <= QUIC_VERSION_15) { |
1874 return; | 1977 return; |
1875 } | 1978 } |
1876 | 1979 |
| 1980 unsigned char packet[] = { |
| 1981 // public flags (8 byte guid) |
| 1982 0x3C, |
| 1983 // guid |
| 1984 0x10, 0x32, 0x54, 0x76, |
| 1985 0x98, 0xBA, 0xDC, 0xFE, |
| 1986 // packet sequence number |
| 1987 0xA8, 0x9A, 0x78, 0x56, |
| 1988 0x34, 0x12, |
| 1989 // private flags (entropy) |
| 1990 0x01, |
| 1991 |
| 1992 // frame type (ack frame) |
| 1993 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
| 1994 0x6C, |
| 1995 // entropy hash of all received packets. |
| 1996 0xBA, |
| 1997 // largest observed packet sequence number |
| 1998 0xBF, 0x9A, 0x78, 0x56, |
| 1999 0x34, 0x12, |
| 2000 // Zero delta time. |
| 2001 0x0, 0x0, |
| 2002 // num missing packets |
| 2003 0x01, |
| 2004 // missing packet delta |
| 2005 0x01, |
| 2006 // 0 more missing packets in range. |
| 2007 0x00, |
| 2008 // Number of revived packets. |
| 2009 0x01, |
| 2010 // Revived packet sequence number. |
| 2011 0xBE, 0x9A, 0x78, 0x56, |
| 2012 0x34, 0x12, |
| 2013 }; |
| 2014 |
| 2015 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2016 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2017 |
| 2018 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2019 ASSERT_TRUE(visitor_.header_.get()); |
| 2020 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 2021 |
| 2022 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 2023 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 2024 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
| 2025 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); |
| 2026 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); |
| 2027 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); |
| 2028 SequenceNumberSet::const_iterator missing_iter = |
| 2029 frame.received_info.missing_packets.begin(); |
| 2030 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); |
| 2031 |
| 2032 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; |
| 2033 const size_t kLargestObservedOffset = kReceivedEntropyOffset + |
| 2034 kQuicEntropyHashSize; |
| 2035 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + |
| 2036 PACKET_6BYTE_SEQUENCE_NUMBER; |
| 2037 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + |
| 2038 kQuicDeltaTimeLargestObservedSize; |
| 2039 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + |
| 2040 kNumberOfMissingPacketsSize; |
| 2041 const size_t kMissingPacketsRange = kMissingPacketsOffset + |
| 2042 PACKET_1BYTE_SEQUENCE_NUMBER; |
| 2043 const size_t kRevivedPacketsLength = kMissingPacketsRange + |
| 2044 PACKET_1BYTE_SEQUENCE_NUMBER; |
| 2045 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength + |
| 2046 PACKET_1BYTE_SEQUENCE_NUMBER; |
| 2047 // Now test framing boundaries |
| 2048 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength + |
| 2049 PACKET_6BYTE_SEQUENCE_NUMBER; |
| 2050 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
| 2051 string expected_error; |
| 2052 if (i < kReceivedEntropyOffset) { |
| 2053 expected_error = "Unable to read least unacked delta."; |
| 2054 } else if (i < kLargestObservedOffset) { |
| 2055 expected_error = "Unable to read entropy hash for received packets."; |
| 2056 } else if (i < kMissingDeltaTimeOffset) { |
| 2057 expected_error = "Unable to read largest observed."; |
| 2058 } else if (i < kNumMissingPacketOffset) { |
| 2059 expected_error = "Unable to read delta time largest observed."; |
| 2060 } else if (i < kMissingPacketsOffset) { |
| 2061 expected_error = "Unable to read num missing packet ranges."; |
| 2062 } else if (i < kMissingPacketsRange) { |
| 2063 expected_error = "Unable to read missing sequence number delta."; |
| 2064 } else if (i < kRevivedPacketsLength) { |
| 2065 expected_error = "Unable to read missing sequence number range."; |
| 2066 } else if (i < kRevivedPacketSequenceNumberLength) { |
| 2067 expected_error = "Unable to read num revived packets."; |
| 2068 } else { |
| 2069 expected_error = "Unable to read revived packet."; |
| 2070 } |
| 2071 CheckProcessingFails( |
| 2072 packet, |
| 2073 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 2074 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 2075 expected_error, QUIC_INVALID_ACK_DATA); |
| 2076 } |
| 2077 } |
| 2078 |
| 2079 TEST_P(QuicFramerTest, AckFrameRevivedPackets15) { |
| 2080 if (framer_.version() != QUIC_VERSION_15) { |
| 2081 return; |
| 2082 } |
| 2083 |
1877 unsigned char packet[] = { | 2084 unsigned char packet[] = { |
1878 // public flags (8 byte guid) | 2085 // public flags (8 byte guid) |
1879 0x3C, | 2086 0x3C, |
1880 // guid | 2087 // guid |
1881 0x10, 0x32, 0x54, 0x76, | 2088 0x10, 0x32, 0x54, 0x76, |
1882 0x98, 0xBA, 0xDC, 0xFE, | 2089 0x98, 0xBA, 0xDC, 0xFE, |
1883 // packet sequence number | 2090 // packet sequence number |
1884 0xA8, 0x9A, 0x78, 0x56, | 2091 0xA8, 0x9A, 0x78, 0x56, |
1885 0x34, 0x12, | 2092 0x34, 0x12, |
1886 // private flags (entropy) | 2093 // private flags (entropy) |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1979 } | 2186 } |
1980 CheckProcessingFails( | 2187 CheckProcessingFails( |
1981 packet, | 2188 packet, |
1982 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, | 2189 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
1983 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2190 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
1984 expected_error, QUIC_INVALID_ACK_DATA); | 2191 expected_error, QUIC_INVALID_ACK_DATA); |
1985 } | 2192 } |
1986 } | 2193 } |
1987 | 2194 |
1988 TEST_P(QuicFramerTest, AckFrameNoNacks) { | 2195 TEST_P(QuicFramerTest, AckFrameNoNacks) { |
| 2196 if (framer_.version() <= QUIC_VERSION_15) { |
| 2197 return; |
| 2198 } |
1989 unsigned char packet[] = { | 2199 unsigned char packet[] = { |
1990 // public flags (8 byte guid) | 2200 // public flags (8 byte guid) |
1991 0x3C, | 2201 0x3C, |
| 2202 // guid |
| 2203 0x10, 0x32, 0x54, 0x76, |
| 2204 0x98, 0xBA, 0xDC, 0xFE, |
| 2205 // packet sequence number |
| 2206 0xA8, 0x9A, 0x78, 0x56, |
| 2207 0x34, 0x12, |
| 2208 // private flags (entropy) |
| 2209 0x01, |
| 2210 |
| 2211 // frame type (ack frame) |
| 2212 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) |
| 2213 0x4C, |
| 2214 // entropy hash of all received packets. |
| 2215 0xBA, |
| 2216 // largest observed packet sequence number |
| 2217 0xBF, 0x9A, 0x78, 0x56, |
| 2218 0x34, 0x12, |
| 2219 // Zero delta time. |
| 2220 0x0, 0x0, |
| 2221 }; |
| 2222 |
| 2223 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2224 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2225 |
| 2226 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2227 ASSERT_TRUE(visitor_.header_.get()); |
| 2228 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 2229 |
| 2230 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 2231 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 2232 QuicAckFrame* frame = visitor_.ack_frames_[0]; |
| 2233 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); |
| 2234 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), |
| 2235 frame->received_info.largest_observed); |
| 2236 ASSERT_EQ(0u, frame->received_info.missing_packets.size()); |
| 2237 |
| 2238 // Verify that the packet re-serializes identically. |
| 2239 QuicFrames frames; |
| 2240 frames.push_back(QuicFrame(frame)); |
| 2241 scoped_ptr<QuicPacket> data( |
| 2242 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); |
| 2243 ASSERT_TRUE(data != NULL); |
| 2244 |
| 2245 test::CompareCharArraysWithHexError("constructed packet", |
| 2246 data->data(), data->length(), |
| 2247 AsChars(packet), arraysize(packet)); |
| 2248 } |
| 2249 |
| 2250 TEST_P(QuicFramerTest, AckFrameNoNacks15) { |
| 2251 if (framer_.version() > QUIC_VERSION_15) { |
| 2252 return; |
| 2253 } |
| 2254 unsigned char packet[] = { |
| 2255 // public flags (8 byte guid) |
| 2256 0x3C, |
| 2257 // guid |
| 2258 0x10, 0x32, 0x54, 0x76, |
| 2259 0x98, 0xBA, 0xDC, 0xFE, |
| 2260 // packet sequence number |
| 2261 0xA8, 0x9A, 0x78, 0x56, |
| 2262 0x34, 0x12, |
| 2263 // private flags (entropy) |
| 2264 0x01, |
| 2265 |
| 2266 // frame type (ack frame) |
| 2267 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) |
| 2268 0x4C, |
| 2269 // entropy hash of sent packets till least awaiting - 1. |
| 2270 0xAB, |
| 2271 // least packet sequence number awaiting an ack, delta from sequence number. |
| 2272 0x08, 0x00, 0x00, 0x00, |
| 2273 0x00, 0x00, |
| 2274 // entropy hash of all received packets. |
| 2275 0xBA, |
| 2276 // largest observed packet sequence number |
| 2277 0xBF, 0x9A, 0x78, 0x56, |
| 2278 0x34, 0x12, |
| 2279 // Zero delta time. |
| 2280 0x0, 0x0, |
| 2281 }; |
| 2282 |
| 2283 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2284 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2285 |
| 2286 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2287 ASSERT_TRUE(visitor_.header_.get()); |
| 2288 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 2289 |
| 2290 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 2291 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 2292 QuicAckFrame* frame = visitor_.ack_frames_[0]; |
| 2293 EXPECT_EQ(0xAB, frame->sent_info.entropy_hash); |
| 2294 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); |
| 2295 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), |
| 2296 frame->received_info.largest_observed); |
| 2297 ASSERT_EQ(0u, frame->received_info.missing_packets.size()); |
| 2298 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked); |
| 2299 |
| 2300 // Verify that the packet re-serializes identically. |
| 2301 QuicFrames frames; |
| 2302 frames.push_back(QuicFrame(frame)); |
| 2303 scoped_ptr<QuicPacket> data( |
| 2304 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); |
| 2305 ASSERT_TRUE(data != NULL); |
| 2306 |
| 2307 test::CompareCharArraysWithHexError("constructed packet", |
| 2308 data->data(), data->length(), |
| 2309 AsChars(packet), arraysize(packet)); |
| 2310 } |
| 2311 |
| 2312 TEST_P(QuicFramerTest, AckFrame500Nacks) { |
| 2313 if (framer_.version() <= QUIC_VERSION_15) { |
| 2314 return; |
| 2315 } |
| 2316 unsigned char packet[] = { |
| 2317 // public flags (8 byte guid) |
| 2318 0x3C, |
1992 // guid | 2319 // guid |
1993 0x10, 0x32, 0x54, 0x76, | 2320 0x10, 0x32, 0x54, 0x76, |
1994 0x98, 0xBA, 0xDC, 0xFE, | 2321 0x98, 0xBA, 0xDC, 0xFE, |
1995 // packet sequence number | 2322 // packet sequence number |
1996 0xA8, 0x9A, 0x78, 0x56, | 2323 0xA8, 0x9A, 0x78, 0x56, |
1997 0x34, 0x12, | 2324 0x34, 0x12, |
1998 // private flags (entropy) | 2325 // private flags (entropy) |
1999 0x01, | 2326 0x01, |
2000 | 2327 |
2001 // frame type (ack frame) | 2328 // frame type (ack frame) |
2002 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) | 2329 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2003 0x4C, | 2330 0x6C, |
2004 // entropy hash of sent packets till least awaiting - 1. | |
2005 0xAB, | |
2006 // least packet sequence number awaiting an ack, delta from sequence number. | |
2007 0x08, 0x00, 0x00, 0x00, | |
2008 0x00, 0x00, | |
2009 // entropy hash of all received packets. | 2331 // entropy hash of all received packets. |
2010 0xBA, | 2332 0xBA, |
2011 // largest observed packet sequence number | 2333 // largest observed packet sequence number |
2012 0xBF, 0x9A, 0x78, 0x56, | 2334 0xBF, 0x9A, 0x78, 0x56, |
2013 0x34, 0x12, | 2335 0x34, 0x12, |
2014 // Zero delta time. | 2336 // Zero delta time. |
2015 0x0, 0x0, | 2337 0x0, 0x0, |
| 2338 // num missing packet ranges |
| 2339 0x02, |
| 2340 // missing packet delta |
| 2341 0x01, |
| 2342 // 243 more missing packets in range. |
| 2343 // The ranges are listed in this order so the re-constructed packet matches. |
| 2344 0xF3, |
| 2345 // No gap between ranges |
| 2346 0x00, |
| 2347 // 255 more missing packets in range. |
| 2348 0xFF, |
| 2349 // No revived packets. |
| 2350 0x00, |
2016 }; | 2351 }; |
2017 | 2352 |
2018 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2353 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2019 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2354 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2020 | 2355 |
2021 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2356 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2022 ASSERT_TRUE(visitor_.header_.get()); | 2357 ASSERT_TRUE(visitor_.header_.get()); |
2023 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2358 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2024 | 2359 |
2025 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2360 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
2026 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 2361 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
2027 QuicAckFrame* frame = visitor_.ack_frames_[0]; | 2362 QuicAckFrame* frame = visitor_.ack_frames_[0]; |
2028 EXPECT_EQ(0xAB, frame->sent_info.entropy_hash); | |
2029 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); | 2363 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); |
2030 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), | 2364 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), |
2031 frame->received_info.largest_observed); | 2365 frame->received_info.largest_observed); |
2032 ASSERT_EQ(0u, frame->received_info.missing_packets.size()); | 2366 EXPECT_EQ(0u, frame->received_info.revived_packets.size()); |
2033 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked); | 2367 ASSERT_EQ(500u, frame->received_info.missing_packets.size()); |
| 2368 SequenceNumberSet::const_iterator first_missing_iter = |
| 2369 frame->received_info.missing_packets.begin(); |
| 2370 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE) - 499, *first_missing_iter); |
| 2371 SequenceNumberSet::const_reverse_iterator last_missing_iter = |
| 2372 frame->received_info.missing_packets.rbegin(); |
| 2373 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *last_missing_iter); |
2034 | 2374 |
2035 // Verify that the packet re-serializes identically. | 2375 // Verify that the packet re-serializes identically. |
2036 QuicFrames frames; | 2376 QuicFrames frames; |
2037 frames.push_back(QuicFrame(frame)); | 2377 frames.push_back(QuicFrame(frame)); |
2038 scoped_ptr<QuicPacket> data( | 2378 scoped_ptr<QuicPacket> data( |
2039 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); | 2379 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); |
2040 ASSERT_TRUE(data != NULL); | 2380 ASSERT_TRUE(data != NULL); |
2041 | 2381 |
2042 test::CompareCharArraysWithHexError("constructed packet", | 2382 test::CompareCharArraysWithHexError("constructed packet", |
2043 data->data(), data->length(), | 2383 data->data(), data->length(), |
2044 AsChars(packet), arraysize(packet)); | 2384 AsChars(packet), arraysize(packet)); |
2045 } | 2385 } |
2046 | 2386 |
2047 TEST_P(QuicFramerTest, AckFrame500Nacks) { | 2387 TEST_P(QuicFramerTest, AckFrame500Nacks15) { |
2048 if (framer_.version() <= QUIC_VERSION_14) { | 2388 if (framer_.version() != QUIC_VERSION_15) { |
2049 return; | 2389 return; |
2050 } | 2390 } |
2051 unsigned char packet[] = { | 2391 unsigned char packet[] = { |
2052 // public flags (8 byte guid) | 2392 // public flags (8 byte guid) |
2053 0x3C, | 2393 0x3C, |
2054 // guid | 2394 // guid |
2055 0x10, 0x32, 0x54, 0x76, | 2395 0x10, 0x32, 0x54, 0x76, |
2056 0x98, 0xBA, 0xDC, 0xFE, | 2396 0x98, 0xBA, 0xDC, 0xFE, |
2057 // packet sequence number | 2397 // packet sequence number |
2058 0xA8, 0x9A, 0x78, 0x56, | 2398 0xA8, 0x9A, 0x78, 0x56, |
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2577 // congestion feedback type (invalid) | 2917 // congestion feedback type (invalid) |
2578 0x03, | 2918 0x03, |
2579 }; | 2919 }; |
2580 | 2920 |
2581 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2921 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2582 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 2922 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
2583 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2923 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2584 EXPECT_EQ(QUIC_INVALID_CONGESTION_FEEDBACK_DATA, framer_.error()); | 2924 EXPECT_EQ(QUIC_INVALID_CONGESTION_FEEDBACK_DATA, framer_.error()); |
2585 } | 2925 } |
2586 | 2926 |
| 2927 TEST_P(QuicFramerTest, StopWaitingFrame) { |
| 2928 if (framer_.version() <= QUIC_VERSION_15) { |
| 2929 return; |
| 2930 } |
| 2931 unsigned char packet[] = { |
| 2932 // public flags (8 byte guid) |
| 2933 0x3C, |
| 2934 // guid |
| 2935 0x10, 0x32, 0x54, 0x76, |
| 2936 0x98, 0xBA, 0xDC, 0xFE, |
| 2937 // packet sequence number |
| 2938 0xA8, 0x9A, 0x78, 0x56, |
| 2939 0x34, 0x12, |
| 2940 // private flags (entropy) |
| 2941 0x01, |
| 2942 |
| 2943 // frame type (ack frame) |
| 2944 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
| 2945 0x06, |
| 2946 // entropy hash of sent packets till least awaiting - 1. |
| 2947 0xAB, |
| 2948 // least packet sequence number awaiting an ack, delta from sequence number. |
| 2949 0x08, 0x00, 0x00, 0x00, |
| 2950 0x00, 0x00, |
| 2951 }; |
| 2952 |
| 2953 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2954 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2955 |
| 2956 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2957 ASSERT_TRUE(visitor_.header_.get()); |
| 2958 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 2959 |
| 2960 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 2961 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size()); |
| 2962 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0]; |
| 2963 EXPECT_EQ(0xAB, frame.entropy_hash); |
| 2964 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.least_unacked); |
| 2965 |
| 2966 const size_t kSentEntropyOffset = kQuicFrameTypeSize; |
| 2967 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; |
| 2968 const size_t frame_size = 7; |
| 2969 for (size_t i = kQuicFrameTypeSize; i < frame_size; ++i) { |
| 2970 string expected_error; |
| 2971 if (i < kLeastUnackedOffset) { |
| 2972 expected_error = "Unable to read entropy hash for sent packets."; |
| 2973 } else { |
| 2974 expected_error = "Unable to read least unacked delta."; |
| 2975 } |
| 2976 CheckProcessingFails( |
| 2977 packet, |
| 2978 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 2979 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 2980 expected_error, QUIC_INVALID_STOP_WAITING_DATA); |
| 2981 } |
| 2982 } |
| 2983 |
2587 TEST_P(QuicFramerTest, RstStreamFrameVersion13) { | 2984 TEST_P(QuicFramerTest, RstStreamFrameVersion13) { |
2588 if (version_ > QUIC_VERSION_13) { | 2985 if (version_ > QUIC_VERSION_13) { |
2589 return; | 2986 return; |
2590 } | 2987 } |
2591 | 2988 |
2592 unsigned char packet[] = { | 2989 unsigned char packet[] = { |
2593 // public flags (8 byte guid) | 2990 // public flags (8 byte guid) |
2594 0x3C, | 2991 0x3C, |
2595 // guid | 2992 // guid |
2596 0x10, 0x32, 0x54, 0x76, | 2993 0x10, 0x32, 0x54, 0x76, |
(...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3564 versions.push_back(GetParam()); | 3961 versions.push_back(GetParam()); |
3565 scoped_ptr<QuicEncryptedPacket> data( | 3962 scoped_ptr<QuicEncryptedPacket> data( |
3566 framer_.BuildVersionNegotiationPacket(header, versions)); | 3963 framer_.BuildVersionNegotiationPacket(header, versions)); |
3567 | 3964 |
3568 test::CompareCharArraysWithHexError("constructed packet", | 3965 test::CompareCharArraysWithHexError("constructed packet", |
3569 data->data(), data->length(), | 3966 data->data(), data->length(), |
3570 AsChars(packet), arraysize(packet)); | 3967 AsChars(packet), arraysize(packet)); |
3571 } | 3968 } |
3572 | 3969 |
3573 TEST_P(QuicFramerTest, BuildAckFramePacket) { | 3970 TEST_P(QuicFramerTest, BuildAckFramePacket) { |
3574 if (version_ <= QUIC_VERSION_14) { | 3971 if (version_ <= QUIC_VERSION_15) { |
3575 return; | 3972 return; |
3576 } | 3973 } |
3577 QuicPacketHeader header; | 3974 QuicPacketHeader header; |
| 3975 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
| 3976 header.public_header.reset_flag = false; |
| 3977 header.public_header.version_flag = false; |
| 3978 header.fec_flag = false; |
| 3979 header.entropy_flag = true; |
| 3980 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
| 3981 header.fec_group = 0; |
| 3982 |
| 3983 QuicAckFrame ack_frame; |
| 3984 ack_frame.received_info.entropy_hash = 0x43; |
| 3985 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF); |
| 3986 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); |
| 3987 ack_frame.received_info.missing_packets.insert( |
| 3988 GG_UINT64_C(0x770123456789ABE)); |
| 3989 |
| 3990 QuicFrames frames; |
| 3991 frames.push_back(QuicFrame(&ack_frame)); |
| 3992 |
| 3993 unsigned char packet[] = { |
| 3994 // public flags (8 byte guid) |
| 3995 0x3C, |
| 3996 // guid |
| 3997 0x10, 0x32, 0x54, 0x76, |
| 3998 0x98, 0xBA, 0xDC, 0xFE, |
| 3999 // packet sequence number |
| 4000 0xA8, 0x9A, 0x78, 0x56, |
| 4001 0x34, 0x12, |
| 4002 // private flags (entropy) |
| 4003 0x01, |
| 4004 |
| 4005 // frame type (ack frame) |
| 4006 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
| 4007 0x6C, |
| 4008 // entropy hash of all received packets. |
| 4009 0x43, |
| 4010 // largest observed packet sequence number |
| 4011 0xBF, 0x9A, 0x78, 0x56, |
| 4012 0x34, 0x12, |
| 4013 // Zero delta time. |
| 4014 0x0, 0x0, |
| 4015 // num missing packet ranges |
| 4016 0x01, |
| 4017 // missing packet delta |
| 4018 0x01, |
| 4019 // 0 more missing packets in range. |
| 4020 0x00, |
| 4021 // 0 revived packets. |
| 4022 0x00, |
| 4023 }; |
| 4024 |
| 4025 scoped_ptr<QuicPacket> data( |
| 4026 framer_.BuildUnsizedDataPacket(header, frames).packet); |
| 4027 ASSERT_TRUE(data != NULL); |
| 4028 |
| 4029 test::CompareCharArraysWithHexError("constructed packet", |
| 4030 data->data(), data->length(), |
| 4031 AsChars(packet), arraysize(packet)); |
| 4032 } |
| 4033 |
| 4034 TEST_P(QuicFramerTest, BuildAckFramePacket15) { |
| 4035 if (version_ != QUIC_VERSION_15) { |
| 4036 return; |
| 4037 } |
| 4038 QuicPacketHeader header; |
3578 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); | 4039 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
3579 header.public_header.reset_flag = false; | 4040 header.public_header.reset_flag = false; |
3580 header.public_header.version_flag = false; | 4041 header.public_header.version_flag = false; |
3581 header.fec_flag = false; | 4042 header.fec_flag = false; |
3582 header.entropy_flag = true; | 4043 header.entropy_flag = true; |
3583 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | 4044 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
3584 header.fec_group = 0; | 4045 header.fec_group = 0; |
3585 | 4046 |
3586 QuicAckFrame ack_frame; | 4047 QuicAckFrame ack_frame; |
3587 ack_frame.received_info.entropy_hash = 0x43; | 4048 ack_frame.received_info.entropy_hash = 0x43; |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3951 | 4412 |
3952 scoped_ptr<QuicPacket> data( | 4413 scoped_ptr<QuicPacket> data( |
3953 framer_.BuildUnsizedDataPacket(header, frames).packet); | 4414 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3954 ASSERT_TRUE(data != NULL); | 4415 ASSERT_TRUE(data != NULL); |
3955 | 4416 |
3956 test::CompareCharArraysWithHexError("constructed packet", | 4417 test::CompareCharArraysWithHexError("constructed packet", |
3957 data->data(), data->length(), | 4418 data->data(), data->length(), |
3958 AsChars(packet), arraysize(packet)); | 4419 AsChars(packet), arraysize(packet)); |
3959 } | 4420 } |
3960 | 4421 |
| 4422 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { |
| 4423 if (version_ <= QUIC_VERSION_15) { |
| 4424 return; |
| 4425 } |
| 4426 QuicPacketHeader header; |
| 4427 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
| 4428 header.public_header.reset_flag = false; |
| 4429 header.public_header.version_flag = false; |
| 4430 header.fec_flag = false; |
| 4431 header.entropy_flag = true; |
| 4432 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
| 4433 header.fec_group = 0; |
| 4434 |
| 4435 QuicStopWaitingFrame stop_waiting_frame; |
| 4436 stop_waiting_frame.entropy_hash = 0x14; |
| 4437 stop_waiting_frame.least_unacked = GG_UINT64_C(0x770123456789AA0); |
| 4438 |
| 4439 QuicFrames frames; |
| 4440 frames.push_back(QuicFrame(&stop_waiting_frame)); |
| 4441 |
| 4442 unsigned char packet[] = { |
| 4443 // public flags (8 byte guid) |
| 4444 0x3C, |
| 4445 // guid |
| 4446 0x10, 0x32, 0x54, 0x76, |
| 4447 0x98, 0xBA, 0xDC, 0xFE, |
| 4448 // packet sequence number |
| 4449 0xA8, 0x9A, 0x78, 0x56, |
| 4450 0x34, 0x12, |
| 4451 // private flags (entropy) |
| 4452 0x01, |
| 4453 |
| 4454 // frame type (stop waiting frame) |
| 4455 0x06, |
| 4456 // entropy hash of sent packets till least awaiting - 1. |
| 4457 0x14, |
| 4458 // least packet sequence number awaiting an ack, delta from sequence number. |
| 4459 0x08, 0x00, 0x00, 0x00, |
| 4460 0x00, 0x00, |
| 4461 }; |
| 4462 |
| 4463 scoped_ptr<QuicPacket> data( |
| 4464 framer_.BuildUnsizedDataPacket(header, frames).packet); |
| 4465 ASSERT_TRUE(data != NULL); |
| 4466 |
| 4467 test::CompareCharArraysWithHexError("constructed packet", |
| 4468 data->data(), data->length(), |
| 4469 AsChars(packet), arraysize(packet)); |
| 4470 } |
| 4471 |
3961 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketFixRate) { | 4472 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketFixRate) { |
3962 QuicPacketHeader header; | 4473 QuicPacketHeader header; |
3963 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); | 4474 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
3964 header.public_header.reset_flag = false; | 4475 header.public_header.reset_flag = false; |
3965 header.public_header.version_flag = false; | 4476 header.public_header.version_flag = false; |
3966 header.fec_flag = false; | 4477 header.fec_flag = false; |
3967 header.entropy_flag = false; | 4478 header.entropy_flag = false; |
3968 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4479 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3969 header.fec_group = 0; | 4480 header.fec_group = 0; |
3970 | 4481 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4018 QuicCongestionFeedbackFrame congestion_feedback_frame; | 4529 QuicCongestionFeedbackFrame congestion_feedback_frame; |
4019 congestion_feedback_frame.type = | 4530 congestion_feedback_frame.type = |
4020 static_cast<CongestionFeedbackType>(kFixRate + 1); | 4531 static_cast<CongestionFeedbackType>(kFixRate + 1); |
4021 | 4532 |
4022 QuicFrames frames; | 4533 QuicFrames frames; |
4023 frames.push_back(QuicFrame(&congestion_feedback_frame)); | 4534 frames.push_back(QuicFrame(&congestion_feedback_frame)); |
4024 | 4535 |
4025 scoped_ptr<QuicPacket> data; | 4536 scoped_ptr<QuicPacket> data; |
4026 EXPECT_DFATAL( | 4537 EXPECT_DFATAL( |
4027 data.reset(framer_.BuildUnsizedDataPacket(header, frames).packet), | 4538 data.reset(framer_.BuildUnsizedDataPacket(header, frames).packet), |
4028 "AppendQuicCongestionFeedbackFrame failed"); | 4539 "AppendCongestionFeedbackFrame failed"); |
4029 ASSERT_TRUE(data == NULL); | 4540 ASSERT_TRUE(data == NULL); |
4030 } | 4541 } |
4031 | 4542 |
4032 TEST_P(QuicFramerTest, BuildRstFramePacketVersion13) { | 4543 TEST_P(QuicFramerTest, BuildRstFramePacketVersion13) { |
4033 if (version_ > QUIC_VERSION_13) { | 4544 if (version_ > QUIC_VERSION_13) { |
4034 return; | 4545 return; |
4035 } | 4546 } |
4036 | 4547 |
4037 QuicPacketHeader header; | 4548 QuicPacketHeader header; |
4038 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); | 4549 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4564 PACKET_8BYTE_GUID, kIncludeVersion, | 5075 PACKET_8BYTE_GUID, kIncludeVersion, |
4565 PACKET_6BYTE_SEQUENCE_NUMBER)); | 5076 PACKET_6BYTE_SEQUENCE_NUMBER)); |
4566 scoped_ptr<QuicEncryptedPacket> encrypted( | 5077 scoped_ptr<QuicEncryptedPacket> encrypted( |
4567 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); | 5078 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); |
4568 | 5079 |
4569 ASSERT_TRUE(encrypted.get() != NULL); | 5080 ASSERT_TRUE(encrypted.get() != NULL); |
4570 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); | 5081 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); |
4571 } | 5082 } |
4572 | 5083 |
4573 TEST_P(QuicFramerTest, Truncation) { | 5084 TEST_P(QuicFramerTest, Truncation) { |
| 5085 if (framer_.version() <= QUIC_VERSION_15) { |
| 5086 return; |
| 5087 } |
4574 QuicPacketHeader header; | 5088 QuicPacketHeader header; |
4575 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); | 5089 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
4576 header.public_header.reset_flag = false; | 5090 header.public_header.reset_flag = false; |
| 5091 header.public_header.version_flag = false; |
| 5092 header.fec_flag = false; |
| 5093 header.entropy_flag = false; |
| 5094 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
| 5095 header.fec_group = 0; |
| 5096 |
| 5097 QuicAckFrame ack_frame; |
| 5098 ack_frame.received_info.largest_observed = 601; |
| 5099 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) { |
| 5100 ack_frame.received_info.missing_packets.insert(i); |
| 5101 } |
| 5102 |
| 5103 // Create a packet with just the ack |
| 5104 QuicFrame frame; |
| 5105 frame.type = ACK_FRAME; |
| 5106 frame.ack_frame = &ack_frame; |
| 5107 QuicFrames frames; |
| 5108 frames.push_back(frame); |
| 5109 |
| 5110 scoped_ptr<QuicPacket> raw_ack_packet( |
| 5111 framer_.BuildUnsizedDataPacket(header, frames).packet); |
| 5112 ASSERT_TRUE(raw_ack_packet != NULL); |
| 5113 |
| 5114 scoped_ptr<QuicEncryptedPacket> ack_packet( |
| 5115 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, |
| 5116 *raw_ack_packet)); |
| 5117 |
| 5118 // Now make sure we can turn our ack packet back into an ack frame |
| 5119 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
| 5120 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 5121 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
| 5122 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); |
| 5123 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); |
| 5124 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); |
| 5125 SequenceNumberSet::const_iterator missing_iter = |
| 5126 processed_ack_frame.received_info.missing_packets.begin(); |
| 5127 EXPECT_EQ(1u, *missing_iter); |
| 5128 SequenceNumberSet::const_reverse_iterator last_missing_iter = |
| 5129 processed_ack_frame.received_info.missing_packets.rbegin(); |
| 5130 EXPECT_EQ(509u, *last_missing_iter); |
| 5131 } |
| 5132 |
| 5133 TEST_P(QuicFramerTest, Truncation15) { |
| 5134 if (framer_.version() > QUIC_VERSION_15) { |
| 5135 return; |
| 5136 } |
| 5137 QuicPacketHeader header; |
| 5138 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
| 5139 header.public_header.reset_flag = false; |
4577 header.public_header.version_flag = false; | 5140 header.public_header.version_flag = false; |
4578 header.fec_flag = false; | 5141 header.fec_flag = false; |
4579 header.entropy_flag = false; | 5142 header.entropy_flag = false; |
4580 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 5143 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4581 header.fec_group = 0; | 5144 header.fec_group = 0; |
4582 | 5145 |
4583 QuicAckFrame ack_frame; | 5146 QuicAckFrame ack_frame; |
4584 ack_frame.received_info.largest_observed = 601; | 5147 ack_frame.received_info.largest_observed = 601; |
4585 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 1; | 5148 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 1; |
4586 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) { | 5149 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) { |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4796 EXPECT_CALL(visitor, OnPacketComplete()); | 5359 EXPECT_CALL(visitor, OnPacketComplete()); |
4797 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); | 5360 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); |
4798 | 5361 |
4799 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 5362 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
4800 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 5363 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
4801 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 5364 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
4802 } | 5365 } |
4803 | 5366 |
4804 } // namespace test | 5367 } // namespace test |
4805 } // namespace net | 5368 } // namespace net |
OLD | NEW |