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 <algorithm> | 5 #include <algorithm> |
6 #include <map> | 6 #include <map> |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/hash_tables.h" | 10 #include "base/hash_tables.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/port.h" | 13 #include "base/port.h" |
14 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
15 #include "net/quic/crypto/quic_decrypter.h" | 15 #include "net/quic/crypto/quic_decrypter.h" |
16 #include "net/quic/crypto/quic_encrypter.h" | 16 #include "net/quic/crypto/quic_encrypter.h" |
17 #include "net/quic/quic_framer.h" | 17 #include "net/quic/quic_framer.h" |
18 #include "net/quic/quic_protocol.h" | 18 #include "net/quic/quic_protocol.h" |
19 #include "net/quic/quic_utils.h" | 19 #include "net/quic/quic_utils.h" |
| 20 #include "net/quic/test_tools/quic_framer_peer.h" |
20 #include "net/quic/test_tools/quic_test_utils.h" | 21 #include "net/quic/test_tools/quic_test_utils.h" |
21 | 22 |
22 using base::hash_set; | 23 using base::hash_set; |
23 using base::StringPiece; | 24 using base::StringPiece; |
24 using std::make_pair; | 25 using std::make_pair; |
25 using std::map; | 26 using std::map; |
26 using std::numeric_limits; | 27 using std::numeric_limits; |
27 using std::string; | 28 using std::string; |
28 using std::vector; | 29 using std::vector; |
29 | 30 |
(...skipping 27 matching lines...) Expand all Loading... |
57 } | 58 } |
58 | 59 |
59 // Index into the nonce proof of the public reset packet. | 60 // Index into the nonce proof of the public reset packet. |
60 const size_t kPublicResetPacketNonceProofOffset = | 61 const size_t kPublicResetPacketNonceProofOffset = |
61 kPublicFlagsOffset + | 62 kPublicFlagsOffset + |
62 kPublicFlagsSize; | 63 kPublicFlagsSize; |
63 // Index into the rejected sequence number of the public reset packet. | 64 // Index into the rejected sequence number of the public reset packet. |
64 const size_t kPublicResetPacketRejectedSequenceNumberOffset = | 65 const size_t kPublicResetPacketRejectedSequenceNumberOffset = |
65 kPublicResetPacketNonceProofOffset + kPublicResetNonceSize; | 66 kPublicResetPacketNonceProofOffset + kPublicResetNonceSize; |
66 | 67 |
67 class QuicFramerPeer { | |
68 public: | |
69 static QuicPacketSequenceNumber CalculatePacketSequenceNumberFromWire( | |
70 QuicFramer* framer, | |
71 QuicPacketSequenceNumber packet_sequence_number) { | |
72 return framer->CalculatePacketSequenceNumberFromWire( | |
73 packet_sequence_number); | |
74 } | |
75 static void SetLastSequenceNumber( | |
76 QuicFramer* framer, | |
77 QuicPacketSequenceNumber packet_sequence_number) { | |
78 framer->last_sequence_number_ = packet_sequence_number; | |
79 } | |
80 }; | |
81 | |
82 class TestEncrypter : public QuicEncrypter { | 68 class TestEncrypter : public QuicEncrypter { |
83 public: | 69 public: |
84 virtual ~TestEncrypter() {} | 70 virtual ~TestEncrypter() {} |
85 virtual bool SetKey(StringPiece key) OVERRIDE { | 71 virtual bool SetKey(StringPiece key) OVERRIDE { |
86 return true; | 72 return true; |
87 } | 73 } |
88 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { | 74 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { |
89 return true; | 75 return true; |
90 } | 76 } |
91 virtual QuicData* Encrypt(QuicPacketSequenceNumber sequence_number, | 77 virtual QuicData* Encrypt(QuicPacketSequenceNumber sequence_number, |
92 StringPiece associated_data, | 78 StringPiece associated_data, |
93 StringPiece plaintext) OVERRIDE { | 79 StringPiece plaintext) OVERRIDE { |
94 sequence_number_ = sequence_number; | 80 sequence_number_ = sequence_number; |
95 associated_data_ = associated_data.as_string(); | 81 associated_data_ = associated_data.as_string(); |
96 plaintext_ = plaintext.as_string(); | 82 plaintext_ = plaintext.as_string(); |
97 return new QuicData(plaintext.data(), plaintext.length()); | 83 return new QuicData(plaintext.data(), plaintext.length()); |
98 } | 84 } |
99 virtual size_t GetKeySize() const OVERRIDE { | 85 virtual size_t GetKeySize() const OVERRIDE { |
100 return 0; | 86 return 0; |
101 } | 87 } |
102 virtual size_t GetNoncePrefixSize() const OVERRIDE { | 88 virtual size_t GetNoncePrefixSize() const OVERRIDE { |
103 return 0; | 89 return 0; |
104 } | 90 } |
105 virtual size_t GetMaxPlaintextSize(size_t ciphertext_size) const OVERRIDE { | 91 virtual size_t GetMaxPlaintextSize(size_t ciphertext_size) const OVERRIDE { |
106 return ciphertext_size; | 92 return ciphertext_size; |
107 } | 93 } |
108 virtual size_t GetCiphertextSize(size_t plaintext_size) const OVERRIDE { | 94 virtual size_t GetCiphertextSize(size_t plaintext_size) const OVERRIDE { |
109 return plaintext_size; | 95 return plaintext_size; |
110 } | 96 } |
| 97 virtual StringPiece GetKey() const { |
| 98 return StringPiece(); |
| 99 } |
| 100 virtual StringPiece GetNoncePrefix() const { |
| 101 return StringPiece(); |
| 102 } |
111 QuicPacketSequenceNumber sequence_number_; | 103 QuicPacketSequenceNumber sequence_number_; |
112 string associated_data_; | 104 string associated_data_; |
113 string plaintext_; | 105 string plaintext_; |
114 }; | 106 }; |
115 | 107 |
116 class TestDecrypter : public QuicDecrypter { | 108 class TestDecrypter : public QuicDecrypter { |
117 public: | 109 public: |
118 virtual ~TestDecrypter() {} | 110 virtual ~TestDecrypter() {} |
119 virtual bool SetKey(StringPiece key) OVERRIDE { | 111 virtual bool SetKey(StringPiece key) OVERRIDE { |
120 return true; | 112 return true; |
121 } | 113 } |
122 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { | 114 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { |
123 return true; | 115 return true; |
124 } | 116 } |
125 virtual QuicData* Decrypt(QuicPacketSequenceNumber sequence_number, | 117 virtual QuicData* Decrypt(QuicPacketSequenceNumber sequence_number, |
126 StringPiece associated_data, | 118 StringPiece associated_data, |
127 StringPiece ciphertext) OVERRIDE { | 119 StringPiece ciphertext) OVERRIDE { |
128 sequence_number_ = sequence_number; | 120 sequence_number_ = sequence_number; |
129 associated_data_ = associated_data.as_string(); | 121 associated_data_ = associated_data.as_string(); |
130 ciphertext_ = ciphertext.as_string(); | 122 ciphertext_ = ciphertext.as_string(); |
131 return new QuicData(ciphertext.data(), ciphertext.length()); | 123 return new QuicData(ciphertext.data(), ciphertext.length()); |
132 } | 124 } |
| 125 virtual StringPiece GetKey() const { |
| 126 return StringPiece(); |
| 127 } |
| 128 virtual StringPiece GetNoncePrefix() const { |
| 129 return StringPiece(); |
| 130 } |
133 QuicPacketSequenceNumber sequence_number_; | 131 QuicPacketSequenceNumber sequence_number_; |
134 string associated_data_; | 132 string associated_data_; |
135 string ciphertext_; | 133 string ciphertext_; |
136 }; | 134 }; |
137 | 135 |
138 class TestQuicVisitor : public ::net::QuicFramerVisitorInterface { | 136 class TestQuicVisitor : public ::net::QuicFramerVisitorInterface { |
139 public: | 137 public: |
140 TestQuicVisitor() | 138 TestQuicVisitor() |
141 : error_count_(0), | 139 : error_count_(0), |
142 packet_count_(0), | 140 packet_count_(0), |
(...skipping 17 matching lines...) Expand all Loading... |
160 error_count_++; | 158 error_count_++; |
161 } | 159 } |
162 | 160 |
163 virtual void OnPacket() OVERRIDE {} | 161 virtual void OnPacket() OVERRIDE {} |
164 | 162 |
165 virtual void OnPublicResetPacket( | 163 virtual void OnPublicResetPacket( |
166 const QuicPublicResetPacket& packet) OVERRIDE { | 164 const QuicPublicResetPacket& packet) OVERRIDE { |
167 public_reset_packet_.reset(new QuicPublicResetPacket(packet)); | 165 public_reset_packet_.reset(new QuicPublicResetPacket(packet)); |
168 } | 166 } |
169 | 167 |
| 168 virtual void OnVersionNegotiationPacket( |
| 169 const QuicVersionNegotiationPacket& packet) OVERRIDE { |
| 170 version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet)); |
| 171 } |
| 172 |
170 virtual void OnRevivedPacket() OVERRIDE { | 173 virtual void OnRevivedPacket() OVERRIDE { |
171 revived_packets_++; | 174 revived_packets_++; |
172 } | 175 } |
173 | 176 |
| 177 virtual bool OnProtocolVersionMismatch( |
| 178 QuicVersionTag version) OVERRIDE { |
| 179 DCHECK(false); |
| 180 return true; |
| 181 } |
| 182 |
174 virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE { | 183 virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE { |
175 packet_count_++; | 184 packet_count_++; |
176 header_.reset(new QuicPacketHeader(header)); | 185 header_.reset(new QuicPacketHeader(header)); |
177 return accept_packet_; | 186 return accept_packet_; |
178 } | 187 } |
179 | 188 |
180 virtual void OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE { | 189 virtual void OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE { |
181 frame_count_++; | 190 frame_count_++; |
182 stream_frames_.push_back(new QuicStreamFrame(frame)); | 191 stream_frames_.push_back(new QuicStreamFrame(frame)); |
183 } | 192 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 int error_count_; | 233 int error_count_; |
225 int packet_count_; | 234 int packet_count_; |
226 int frame_count_; | 235 int frame_count_; |
227 int fec_count_; | 236 int fec_count_; |
228 int complete_packets_; | 237 int complete_packets_; |
229 int revived_packets_; | 238 int revived_packets_; |
230 bool accept_packet_; | 239 bool accept_packet_; |
231 | 240 |
232 scoped_ptr<QuicPacketHeader> header_; | 241 scoped_ptr<QuicPacketHeader> header_; |
233 scoped_ptr<QuicPublicResetPacket> public_reset_packet_; | 242 scoped_ptr<QuicPublicResetPacket> public_reset_packet_; |
| 243 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; |
234 vector<QuicStreamFrame*> stream_frames_; | 244 vector<QuicStreamFrame*> stream_frames_; |
235 vector<QuicAckFrame*> ack_frames_; | 245 vector<QuicAckFrame*> ack_frames_; |
236 vector<QuicCongestionFeedbackFrame*> congestion_feedback_frames_; | 246 vector<QuicCongestionFeedbackFrame*> congestion_feedback_frames_; |
237 vector<QuicFecData*> fec_data_; | 247 vector<QuicFecData*> fec_data_; |
238 string fec_protected_payload_; | 248 string fec_protected_payload_; |
239 QuicRstStreamFrame rst_stream_frame_; | 249 QuicRstStreamFrame rst_stream_frame_; |
240 QuicConnectionCloseFrame connection_close_frame_; | 250 QuicConnectionCloseFrame connection_close_frame_; |
241 QuicGoAwayFrame goaway_frame_; | 251 QuicGoAwayFrame goaway_frame_; |
242 }; | 252 }; |
243 | 253 |
244 class QuicFramerTest : public ::testing::Test { | 254 class QuicFramerTest : public ::testing::Test { |
245 public: | 255 public: |
246 QuicFramerTest() | 256 QuicFramerTest() |
247 : encrypter_(new test::TestEncrypter()), | 257 : encrypter_(new test::TestEncrypter()), |
248 decrypter_(new test::TestDecrypter()), | 258 decrypter_(new test::TestDecrypter()), |
249 framer_(kQuicVersion1, decrypter_, encrypter_) { | 259 framer_(kQuicVersion1, decrypter_, encrypter_, true) { |
250 framer_.set_visitor(&visitor_); | 260 framer_.set_visitor(&visitor_); |
251 framer_.set_entropy_calculator(&entropy_calculator_); | 261 framer_.set_entropy_calculator(&entropy_calculator_); |
252 } | 262 } |
253 | 263 |
254 bool CheckEncryption(QuicPacketSequenceNumber sequence_number, | 264 bool CheckEncryption(QuicPacketSequenceNumber sequence_number, |
255 QuicPacket* packet) { | 265 QuicPacket* packet) { |
256 if (sequence_number != encrypter_->sequence_number_) { | 266 if (sequence_number != encrypter_->sequence_number_) { |
257 LOG(ERROR) << "Encrypted incorrect packet sequence number. expected " | 267 LOG(ERROR) << "Encrypted incorrect packet sequence number. expected " |
258 << sequence_number << " actual: " | 268 << sequence_number << " actual: " |
259 << encrypter_->sequence_number_; | 269 << encrypter_->sequence_number_; |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 }; | 558 }; |
549 | 559 |
550 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 560 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
551 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 561 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
552 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); | 562 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); |
553 ASSERT_TRUE(visitor_.header_.get()); | 563 ASSERT_TRUE(visitor_.header_.get()); |
554 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 564 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
555 visitor_.header_->public_header.guid); | 565 visitor_.header_->public_header.guid); |
556 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 566 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
557 EXPECT_TRUE(visitor_.header_->public_header.version_flag); | 567 EXPECT_TRUE(visitor_.header_->public_header.version_flag); |
558 EXPECT_EQ(kQuicVersion1, visitor_.header_->public_header.version); | 568 EXPECT_EQ(kQuicVersion1, visitor_.header_->public_header.versions[0]); |
559 EXPECT_FALSE(visitor_.header_->fec_flag); | 569 EXPECT_FALSE(visitor_.header_->fec_flag); |
560 EXPECT_FALSE(visitor_.header_->entropy_flag); | 570 EXPECT_FALSE(visitor_.header_->entropy_flag); |
561 EXPECT_FALSE(visitor_.header_->fec_entropy_flag); | 571 EXPECT_FALSE(visitor_.header_->fec_entropy_flag); |
562 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 572 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
563 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 573 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
564 visitor_.header_->packet_sequence_number); | 574 visitor_.header_->packet_sequence_number); |
565 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 575 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
566 | 576 |
567 // Now test framing boundaries | 577 // Now test framing boundaries |
568 for (size_t i = 0; i < GetPacketHeaderSize(kIncludeVersion); ++i) { | 578 for (size_t i = 0; i < GetPacketHeaderSize(kIncludeVersion); ++i) { |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
807 'o', ' ', 'w', 'o', | 817 'o', ' ', 'w', 'o', |
808 'r', 'l', 'd', '!', | 818 'r', 'l', 'd', '!', |
809 }; | 819 }; |
810 | 820 |
811 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 821 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
812 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 822 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
813 | 823 |
814 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 824 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
815 ASSERT_TRUE(visitor_.header_.get()); | 825 ASSERT_TRUE(visitor_.header_.get()); |
816 EXPECT_TRUE(visitor_.header_.get()->public_header.version_flag); | 826 EXPECT_TRUE(visitor_.header_.get()->public_header.version_flag); |
817 EXPECT_EQ(kQuicVersion1, visitor_.header_.get()->public_header.version); | 827 EXPECT_EQ(kQuicVersion1, visitor_.header_.get()->public_header.versions[0]); |
818 EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion)); | 828 EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion)); |
819 | 829 |
820 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 830 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
821 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 831 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
822 EXPECT_EQ(static_cast<uint64>(0x01020304), | 832 EXPECT_EQ(static_cast<uint64>(0x01020304), |
823 visitor_.stream_frames_[0]->stream_id); | 833 visitor_.stream_frames_[0]->stream_id); |
824 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 834 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
825 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 835 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
826 visitor_.stream_frames_[0]->offset); | 836 visitor_.stream_frames_[0]->offset); |
827 EXPECT_EQ("hello world!", visitor_.stream_frames_[0]->data); | 837 EXPECT_EQ("hello world!", visitor_.stream_frames_[0]->data); |
(...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1555 EXPECT_TRUE(visitor_.public_reset_packet_->public_header.reset_flag); | 1565 EXPECT_TRUE(visitor_.public_reset_packet_->public_header.reset_flag); |
1556 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); | 1566 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); |
1557 EXPECT_EQ(GG_UINT64_C(0xABCDEF0123456789), | 1567 EXPECT_EQ(GG_UINT64_C(0xABCDEF0123456789), |
1558 visitor_.public_reset_packet_->nonce_proof); | 1568 visitor_.public_reset_packet_->nonce_proof); |
1559 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 1569 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
1560 visitor_.public_reset_packet_->rejected_sequence_number); | 1570 visitor_.public_reset_packet_->rejected_sequence_number); |
1561 | 1571 |
1562 // Now test framing boundaries | 1572 // Now test framing boundaries |
1563 for (size_t i = 0; i < GetPublicResetPacketSize(); ++i) { | 1573 for (size_t i = 0; i < GetPublicResetPacketSize(); ++i) { |
1564 string expected_error; | 1574 string expected_error; |
| 1575 DLOG(INFO) << "iteration: " << i; |
1565 if (i < kPublicFlagsOffset) { | 1576 if (i < kPublicFlagsOffset) { |
1566 expected_error = "Unable to read GUID."; | 1577 expected_error = "Unable to read GUID."; |
1567 } else if (i < kPublicResetPacketNonceProofOffset) { | 1578 } else if (i < kPublicResetPacketNonceProofOffset) { |
1568 expected_error = "Unable to read public flags."; | 1579 expected_error = "Unable to read public flags."; |
1569 } else if (i < kPublicResetPacketRejectedSequenceNumberOffset) { | 1580 } else if (i < kPublicResetPacketRejectedSequenceNumberOffset) { |
1570 expected_error = "Unable to read nonce proof."; | 1581 expected_error = "Unable to read nonce proof."; |
1571 } else { | 1582 } else { |
1572 expected_error = "Unable to read rejected sequence number."; | 1583 expected_error = "Unable to read rejected sequence number."; |
1573 } | 1584 } |
1574 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 1585 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
1575 } | 1586 } |
1576 } | 1587 } |
1577 | 1588 |
| 1589 TEST_F(QuicFramerTest, VersionNegotiationPacket) { |
| 1590 unsigned char packet[] = { |
| 1591 0x10, 0x32, 0x54, 0x76, |
| 1592 0x98, 0xBA, 0xDC, 0xFE, |
| 1593 // public flags (version) |
| 1594 0x01, |
| 1595 // version tag |
| 1596 'Q', '1', '.', '0', |
| 1597 'Q', '2', '.', '0', |
| 1598 }; |
| 1599 |
| 1600 QuicFramerPeer::SetIsServer(&framer_, false); |
| 1601 |
| 1602 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1603 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1604 ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1605 ASSERT_TRUE(visitor_.version_negotiation_packet_.get()); |
| 1606 EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size()); |
| 1607 EXPECT_EQ(kQuicVersion1, |
| 1608 visitor_.version_negotiation_packet_->versions[0]); |
| 1609 |
| 1610 for (size_t i = 0; i <= kQuicGuidSize + kPublicFlagsSize; ++i) { |
| 1611 string expected_error; |
| 1612 QuicErrorCode error_code = QUIC_INVALID_PACKET_HEADER; |
| 1613 if (i < kPublicFlagsOffset) { |
| 1614 expected_error = "Unable to read GUID."; |
| 1615 } else if (i < kVersionOffset) { |
| 1616 expected_error = "Unable to read public flags."; |
| 1617 } else { |
| 1618 expected_error = "Unable to read supported version in negotiation."; |
| 1619 error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET; |
| 1620 } |
| 1621 CheckProcessingFails(packet, i, expected_error, error_code); |
| 1622 } |
| 1623 } |
| 1624 |
1578 TEST_F(QuicFramerTest, FecPacket) { | 1625 TEST_F(QuicFramerTest, FecPacket) { |
1579 unsigned char packet[] = { | 1626 unsigned char packet[] = { |
1580 // guid | 1627 // guid |
1581 0x10, 0x32, 0x54, 0x76, | 1628 0x10, 0x32, 0x54, 0x76, |
1582 0x98, 0xBA, 0xDC, 0xFE, | 1629 0x98, 0xBA, 0xDC, 0xFE, |
1583 // public flags | 1630 // public flags |
1584 0x00, | 1631 0x00, |
1585 // packet sequence number | 1632 // packet sequence number |
1586 0xBC, 0x9A, 0x78, 0x56, | 1633 0xBC, 0x9A, 0x78, 0x56, |
1587 0x34, 0x12, | 1634 0x34, 0x12, |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1764 0x54, 0x76, 0x10, 0x32, | 1811 0x54, 0x76, 0x10, 0x32, |
1765 0xDC, 0xFE, 0x98, 0xBA, | 1812 0xDC, 0xFE, 0x98, 0xBA, |
1766 // data length | 1813 // data length |
1767 0x0c, 0x00, | 1814 0x0c, 0x00, |
1768 // data | 1815 // data |
1769 'h', 'e', 'l', 'l', | 1816 'h', 'e', 'l', 'l', |
1770 'o', ' ', 'w', 'o', | 1817 'o', ' ', 'w', 'o', |
1771 'r', 'l', 'd', '!', | 1818 'r', 'l', 'd', '!', |
1772 }; | 1819 }; |
1773 | 1820 |
| 1821 QuicFramerPeer::SetIsServer(&framer_, false); |
1774 scoped_ptr<QuicPacket> data( | 1822 scoped_ptr<QuicPacket> data( |
1775 framer_.ConstructFrameDataPacket(header, frames).packet); | 1823 framer_.ConstructFrameDataPacket(header, frames).packet); |
1776 ASSERT_TRUE(data != NULL); | 1824 ASSERT_TRUE(data != NULL); |
1777 | 1825 |
1778 test::CompareCharArraysWithHexError("constructed packet", | 1826 test::CompareCharArraysWithHexError("constructed packet", |
1779 data->data(), data->length(), | 1827 data->data(), data->length(), |
1780 AsChars(packet), arraysize(packet)); | 1828 AsChars(packet), arraysize(packet)); |
1781 } | 1829 } |
1782 | 1830 |
| 1831 TEST_F(QuicFramerTest, ConstructVersionNegotiationPacket) { |
| 1832 QuicPacketPublicHeader header; |
| 1833 header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
| 1834 header.reset_flag = false; |
| 1835 header.version_flag = true; |
| 1836 |
| 1837 unsigned char packet[] = { |
| 1838 0x10, 0x32, 0x54, 0x76, |
| 1839 0x98, 0xBA, 0xDC, 0xFE, |
| 1840 // public flags (version) |
| 1841 0x01, |
| 1842 // version tag |
| 1843 'Q', '1', '.', '0', |
| 1844 'Q', '2', '.', '0', |
| 1845 }; |
| 1846 |
| 1847 const int kQuicVersion2 = MAKE_TAG('Q', '2', '.', '0'); |
| 1848 QuicVersionTagList versions; |
| 1849 versions.push_back(kQuicVersion1); |
| 1850 versions.push_back(kQuicVersion2); |
| 1851 scoped_ptr<QuicEncryptedPacket> data( |
| 1852 framer_.ConstructVersionNegotiationPacket(header, versions)); |
| 1853 |
| 1854 test::CompareCharArraysWithHexError("constructed packet", |
| 1855 data->data(), data->length(), |
| 1856 AsChars(packet), arraysize(packet)); |
| 1857 } |
1783 | 1858 |
1784 TEST_F(QuicFramerTest, ConstructAckFramePacket) { | 1859 TEST_F(QuicFramerTest, ConstructAckFramePacket) { |
1785 QuicPacketHeader header; | 1860 QuicPacketHeader header; |
1786 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); | 1861 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
1787 header.public_header.reset_flag = false; | 1862 header.public_header.reset_flag = false; |
1788 header.public_header.version_flag = false; | 1863 header.public_header.version_flag = false; |
1789 header.fec_flag = false; | 1864 header.fec_flag = false; |
1790 header.entropy_flag = true; | 1865 header.entropy_flag = true; |
1791 header.fec_entropy_flag = true; | 1866 header.fec_entropy_flag = true; |
1792 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 1867 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
(...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2613 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2688 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2614 ASSERT_TRUE(visitor_.header_.get()); | 2689 ASSERT_TRUE(visitor_.header_.get()); |
2615 EXPECT_TRUE(visitor_.header_->fec_flag); | 2690 EXPECT_TRUE(visitor_.header_->fec_flag); |
2616 EXPECT_TRUE(visitor_.header_->entropy_flag); | 2691 EXPECT_TRUE(visitor_.header_->entropy_flag); |
2617 EXPECT_TRUE(visitor_.header_->fec_entropy_flag); | 2692 EXPECT_TRUE(visitor_.header_->fec_entropy_flag); |
2618 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); | 2693 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); |
2619 }; | 2694 }; |
2620 | 2695 |
2621 } // namespace test | 2696 } // namespace test |
2622 } // namespace net | 2697 } // namespace net |
OLD | NEW |