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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 ~TestEncrypter() override {} | 106 ~TestEncrypter() override {} |
107 bool SetKey(StringPiece key) override { return true; } | 107 bool SetKey(StringPiece key) override { return true; } |
108 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } | 108 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } |
109 bool Encrypt(StringPiece nonce, | 109 bool Encrypt(StringPiece nonce, |
110 StringPiece associated_data, | 110 StringPiece associated_data, |
111 StringPiece plaintext, | 111 StringPiece plaintext, |
112 unsigned char* output) override { | 112 unsigned char* output) override { |
113 CHECK(false) << "Not implemented"; | 113 CHECK(false) << "Not implemented"; |
114 return false; | 114 return false; |
115 } | 115 } |
116 QuicData* EncryptPacket(QuicPacketSequenceNumber sequence_number, | 116 bool EncryptPacket(QuicPacketSequenceNumber sequence_number, |
117 StringPiece associated_data, | 117 StringPiece associated_data, |
118 StringPiece plaintext) override { | 118 StringPiece plaintext, |
| 119 char* output, |
| 120 size_t* output_length, |
| 121 size_t max_output_length) override { |
119 sequence_number_ = sequence_number; | 122 sequence_number_ = sequence_number; |
120 associated_data_ = associated_data.as_string(); | 123 associated_data_ = associated_data.as_string(); |
121 plaintext_ = plaintext.as_string(); | 124 plaintext_ = plaintext.as_string(); |
122 return new QuicData(plaintext.data(), plaintext.length()); | 125 memcpy(output, plaintext.data(), plaintext.length()); |
| 126 *output_length = plaintext.length(); |
| 127 return true; |
123 } | 128 } |
124 size_t GetKeySize() const override { return 0; } | 129 size_t GetKeySize() const override { return 0; } |
125 size_t GetNoncePrefixSize() const override { return 0; } | 130 size_t GetNoncePrefixSize() const override { return 0; } |
126 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override { | 131 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override { |
127 return ciphertext_size; | 132 return ciphertext_size; |
128 } | 133 } |
129 size_t GetCiphertextSize(size_t plaintext_size) const override { | 134 size_t GetCiphertextSize(size_t plaintext_size) const override { |
130 return plaintext_size; | 135 return plaintext_size; |
131 } | 136 } |
132 StringPiece GetKey() const override { return StringPiece(); } | 137 StringPiece GetKey() const override { return StringPiece(); } |
133 StringPiece GetNoncePrefix() const override { return StringPiece(); } | 138 StringPiece GetNoncePrefix() const override { return StringPiece(); } |
134 QuicPacketSequenceNumber sequence_number_; | 139 QuicPacketSequenceNumber sequence_number_; |
135 string associated_data_; | 140 string associated_data_; |
136 string plaintext_; | 141 string plaintext_; |
137 }; | 142 }; |
138 | 143 |
139 class TestDecrypter : public QuicDecrypter { | 144 class TestDecrypter : public QuicDecrypter { |
140 public: | 145 public: |
141 ~TestDecrypter() override {} | 146 ~TestDecrypter() override {} |
142 bool SetKey(StringPiece key) override { return true; } | 147 bool SetKey(StringPiece key) override { return true; } |
143 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } | 148 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } |
144 QuicData* DecryptPacket(QuicPacketSequenceNumber sequence_number, | 149 bool DecryptPacket(QuicPacketSequenceNumber sequence_number, |
145 StringPiece associated_data, | 150 const StringPiece& associated_data, |
146 StringPiece ciphertext) override { | 151 const StringPiece& ciphertext, |
| 152 char* output, |
| 153 size_t* output_length, |
| 154 size_t max_output_length) override { |
147 sequence_number_ = sequence_number; | 155 sequence_number_ = sequence_number; |
148 associated_data_ = associated_data.as_string(); | 156 associated_data_ = associated_data.as_string(); |
149 ciphertext_ = ciphertext.as_string(); | 157 ciphertext_ = ciphertext.as_string(); |
150 return new QuicData(ciphertext.data(), ciphertext.length()); | 158 memcpy(output, ciphertext.data(), ciphertext.length()); |
| 159 *output_length = ciphertext.length(); |
| 160 return true; |
151 } | 161 } |
152 StringPiece GetKey() const override { return StringPiece(); } | 162 StringPiece GetKey() const override { return StringPiece(); } |
153 StringPiece GetNoncePrefix() const override { return StringPiece(); } | 163 StringPiece GetNoncePrefix() const override { return StringPiece(); } |
154 QuicPacketSequenceNumber sequence_number_; | 164 QuicPacketSequenceNumber sequence_number_; |
155 string associated_data_; | 165 string associated_data_; |
156 string ciphertext_; | 166 string ciphertext_; |
157 }; | 167 }; |
158 | 168 |
159 class TestQuicVisitor : public ::net::QuicFramerVisitorInterface { | 169 class TestQuicVisitor : public ::net::QuicFramerVisitorInterface { |
160 public: | 170 public: |
161 TestQuicVisitor() | 171 TestQuicVisitor() |
162 : error_count_(0), | 172 : error_count_(0), |
163 version_mismatch_(0), | 173 version_mismatch_(0), |
164 packet_count_(0), | 174 packet_count_(0), |
165 frame_count_(0), | 175 frame_count_(0), |
166 fec_count_(0), | 176 fec_count_(0), |
167 complete_packets_(0), | 177 complete_packets_(0), |
168 revived_packets_(0), | 178 revived_packets_(0), |
169 accept_packet_(true), | 179 accept_packet_(true), |
170 accept_public_header_(true) { | 180 accept_public_header_(true) { |
171 } | 181 } |
172 | 182 |
173 ~TestQuicVisitor() override { | 183 ~TestQuicVisitor() override { |
174 STLDeleteElements(&stream_frames_); | 184 STLDeleteElements(&stream_frames_); |
175 STLDeleteElements(&ack_frames_); | 185 STLDeleteElements(&ack_frames_); |
176 STLDeleteElements(&stop_waiting_frames_); | 186 STLDeleteElements(&stop_waiting_frames_); |
177 STLDeleteElements(&ping_frames_); | 187 STLDeleteElements(&ping_frames_); |
178 STLDeleteElements(&fec_data_); | 188 STLDeleteElements(&fec_data_); |
| 189 STLDeleteElements(&stream_data_); |
| 190 STLDeleteElements(&fec_data_redundancy_); |
179 } | 191 } |
180 | 192 |
181 void OnError(QuicFramer* f) override { | 193 void OnError(QuicFramer* f) override { |
182 DVLOG(1) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error()) | 194 DVLOG(1) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error()) |
183 << " (" << f->error() << ")"; | 195 << " (" << f->error() << ")"; |
184 ++error_count_; | 196 ++error_count_; |
185 } | 197 } |
186 | 198 |
187 void OnPacket() override {} | 199 void OnPacket() override {} |
188 | 200 |
(...skipping 27 matching lines...) Expand all Loading... |
216 void OnDecryptedPacket(EncryptionLevel level) override {} | 228 void OnDecryptedPacket(EncryptionLevel level) override {} |
217 | 229 |
218 bool OnPacketHeader(const QuicPacketHeader& header) override { | 230 bool OnPacketHeader(const QuicPacketHeader& header) override { |
219 ++packet_count_; | 231 ++packet_count_; |
220 header_.reset(new QuicPacketHeader(header)); | 232 header_.reset(new QuicPacketHeader(header)); |
221 return accept_packet_; | 233 return accept_packet_; |
222 } | 234 } |
223 | 235 |
224 bool OnStreamFrame(const QuicStreamFrame& frame) override { | 236 bool OnStreamFrame(const QuicStreamFrame& frame) override { |
225 ++frame_count_; | 237 ++frame_count_; |
226 stream_frames_.push_back(new QuicStreamFrame(frame)); | 238 // Save a copy of the data so it is valid after the packet is processed. |
| 239 stream_data_.push_back(frame.GetDataAsString()); |
| 240 QuicStreamFrame* stream_frame = new QuicStreamFrame(frame); |
| 241 // Make sure that the stream frame points to this data. |
| 242 stream_frame->data.Clear(); |
| 243 stream_frame->data.Append(const_cast<char*>(stream_data_.back()->data()), |
| 244 stream_data_.back()->size()); |
| 245 stream_frames_.push_back(stream_frame); |
227 return true; | 246 return true; |
228 } | 247 } |
229 | 248 |
230 void OnFecProtectedPayload(StringPiece payload) override { | 249 void OnFecProtectedPayload(StringPiece payload) override { |
231 fec_protected_payload_ = payload.as_string(); | 250 fec_protected_payload_ = payload.as_string(); |
232 } | 251 } |
233 | 252 |
234 bool OnAckFrame(const QuicAckFrame& frame) override { | 253 bool OnAckFrame(const QuicAckFrame& frame) override { |
235 ++frame_count_; | 254 ++frame_count_; |
236 ack_frames_.push_back(new QuicAckFrame(frame)); | 255 ack_frames_.push_back(new QuicAckFrame(frame)); |
237 return true; | 256 return true; |
238 } | 257 } |
239 | 258 |
240 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override { | 259 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override { |
241 ++frame_count_; | 260 ++frame_count_; |
242 stop_waiting_frames_.push_back(new QuicStopWaitingFrame(frame)); | 261 stop_waiting_frames_.push_back(new QuicStopWaitingFrame(frame)); |
243 return true; | 262 return true; |
244 } | 263 } |
245 | 264 |
246 bool OnPingFrame(const QuicPingFrame& frame) override { | 265 bool OnPingFrame(const QuicPingFrame& frame) override { |
247 ++frame_count_; | 266 ++frame_count_; |
248 ping_frames_.push_back(new QuicPingFrame(frame)); | 267 ping_frames_.push_back(new QuicPingFrame(frame)); |
249 return true; | 268 return true; |
250 } | 269 } |
251 | 270 |
252 void OnFecData(const QuicFecData& fec) override { | 271 void OnFecData(const QuicFecData& fec) override { |
253 ++fec_count_; | 272 ++fec_count_; |
254 fec_data_.push_back(new QuicFecData(fec)); | 273 QuicFecData* fec_data = new QuicFecData(); |
| 274 fec_data->fec_group = fec.fec_group; |
| 275 // Save a copy of the data so it is valid after the packet is processed. |
| 276 string* redundancy = new string(fec.redundancy.as_string()); |
| 277 fec_data_redundancy_.push_back(redundancy); |
| 278 fec_data->redundancy = StringPiece(*redundancy); |
| 279 fec_data_.push_back(fec_data); |
255 } | 280 } |
256 | 281 |
257 void OnPacketComplete() override { ++complete_packets_; } | 282 void OnPacketComplete() override { ++complete_packets_; } |
258 | 283 |
259 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override { | 284 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override { |
260 rst_stream_frame_ = frame; | 285 rst_stream_frame_ = frame; |
261 return true; | 286 return true; |
262 } | 287 } |
263 | 288 |
264 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override { | 289 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 vector<QuicAckFrame*> ack_frames_; | 325 vector<QuicAckFrame*> ack_frames_; |
301 vector<QuicStopWaitingFrame*> stop_waiting_frames_; | 326 vector<QuicStopWaitingFrame*> stop_waiting_frames_; |
302 vector<QuicPingFrame*> ping_frames_; | 327 vector<QuicPingFrame*> ping_frames_; |
303 vector<QuicFecData*> fec_data_; | 328 vector<QuicFecData*> fec_data_; |
304 string fec_protected_payload_; | 329 string fec_protected_payload_; |
305 QuicRstStreamFrame rst_stream_frame_; | 330 QuicRstStreamFrame rst_stream_frame_; |
306 QuicConnectionCloseFrame connection_close_frame_; | 331 QuicConnectionCloseFrame connection_close_frame_; |
307 QuicGoAwayFrame goaway_frame_; | 332 QuicGoAwayFrame goaway_frame_; |
308 QuicWindowUpdateFrame window_update_frame_; | 333 QuicWindowUpdateFrame window_update_frame_; |
309 QuicBlockedFrame blocked_frame_; | 334 QuicBlockedFrame blocked_frame_; |
| 335 vector<string*> stream_data_; |
| 336 vector<string*> fec_data_redundancy_; |
310 }; | 337 }; |
311 | 338 |
312 class QuicFramerTest : public ::testing::TestWithParam<QuicVersion> { | 339 class QuicFramerTest : public ::testing::TestWithParam<QuicVersion> { |
313 public: | 340 public: |
314 QuicFramerTest() | 341 QuicFramerTest() |
315 : encrypter_(new test::TestEncrypter()), | 342 : encrypter_(new test::TestEncrypter()), |
316 decrypter_(new test::TestDecrypter()), | 343 decrypter_(new test::TestDecrypter()), |
317 start_(QuicTime::Zero().Add(QuicTime::Delta::FromMicroseconds(0x10))), | 344 start_(QuicTime::Zero().Add(QuicTime::Delta::FromMicroseconds(0x10))), |
318 framer_(QuicSupportedVersions(), start_, true) { | 345 framer_(QuicSupportedVersions(), start_, true) { |
319 version_ = GetParam(); | 346 version_ = GetParam(); |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 QuicFramerPeer::SetLastSequenceNumber(&framer_, last_sequence_number); | 469 QuicFramerPeer::SetLastSequenceNumber(&framer_, last_sequence_number); |
443 EXPECT_EQ(expected_sequence_number, | 470 EXPECT_EQ(expected_sequence_number, |
444 QuicFramerPeer::CalculatePacketSequenceNumberFromWire( | 471 QuicFramerPeer::CalculatePacketSequenceNumberFromWire( |
445 &framer_, PACKET_6BYTE_SEQUENCE_NUMBER, wire_sequence_number)) | 472 &framer_, PACKET_6BYTE_SEQUENCE_NUMBER, wire_sequence_number)) |
446 << "last_sequence_number: " << last_sequence_number | 473 << "last_sequence_number: " << last_sequence_number |
447 << " wire_sequence_number: " << wire_sequence_number; | 474 << " wire_sequence_number: " << wire_sequence_number; |
448 } | 475 } |
449 | 476 |
450 QuicPacket* BuildDataPacket(const QuicPacketHeader& header, | 477 QuicPacket* BuildDataPacket(const QuicPacketHeader& header, |
451 const QuicFrames& frames) { | 478 const QuicFrames& frames) { |
452 return BuildUnsizedDataPacket(&framer_, header, frames).packet; | 479 return BuildUnsizedDataPacket(&framer_, header, frames); |
| 480 } |
| 481 |
| 482 QuicPacket* BuildDataPacket(const QuicPacketHeader& header, |
| 483 const QuicFrames& frames, |
| 484 size_t packet_size) { |
| 485 return BuildUnsizedDataPacket(&framer_, header, frames, packet_size); |
453 } | 486 } |
454 | 487 |
455 test::TestEncrypter* encrypter_; | 488 test::TestEncrypter* encrypter_; |
456 test::TestDecrypter* decrypter_; | 489 test::TestDecrypter* decrypter_; |
457 QuicVersion version_; | 490 QuicVersion version_; |
458 QuicTime start_; | 491 QuicTime start_; |
459 QuicFramer framer_; | 492 QuicFramer framer_; |
460 test::TestQuicVisitor visitor_; | 493 test::TestQuicVisitor visitor_; |
461 test::TestEntropyCalculator entropy_calculator_; | 494 test::TestEntropyCalculator entropy_calculator_; |
462 }; | 495 }; |
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1305 | 1338 |
1306 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1339 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1307 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1340 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1308 | 1341 |
1309 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1342 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1310 ASSERT_TRUE(visitor_.header_.get()); | 1343 ASSERT_TRUE(visitor_.header_.get()); |
1311 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1344 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1312 | 1345 |
1313 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1346 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
1314 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1347 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
1315 EXPECT_EQ(GG_UINT64_C(0x00020304), | 1348 EXPECT_EQ(GG_UINT64_C(0x00020304), visitor_.stream_frames_[0]->stream_id); |
1316 visitor_.stream_frames_[0]->stream_id); | |
1317 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1349 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
1318 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1350 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
1319 visitor_.stream_frames_[0]->offset); | 1351 visitor_.stream_frames_[0]->offset); |
1320 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); | 1352 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); |
1321 | 1353 |
1322 // Now test framing boundaries. | 1354 // Now test framing boundaries. |
1323 const size_t stream_id_size = 3; | 1355 const size_t stream_id_size = 3; |
1324 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); | 1356 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); |
1325 } | 1357 } |
1326 | 1358 |
(...skipping 2033 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3360 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3392 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3361 | 3393 |
3362 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3394 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, | 3395 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3364 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3396 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3365 | 3397 |
3366 // 0 revived packets. | 3398 // 0 revived packets. |
3367 0x00, | 3399 0x00, |
3368 }; | 3400 }; |
3369 | 3401 |
3370 scoped_ptr<QuicPacket> data( | 3402 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
3371 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet); | |
3372 ASSERT_TRUE(data != nullptr); | 3403 ASSERT_TRUE(data != nullptr); |
3373 | 3404 |
3374 test::CompareCharArraysWithHexError("constructed packet", | 3405 test::CompareCharArraysWithHexError("constructed packet", |
3375 data->data(), data->length(), | 3406 data->data(), data->length(), |
3376 AsChars(packet), arraysize(packet)); | 3407 AsChars(packet), arraysize(packet)); |
3377 } | 3408 } |
3378 | 3409 |
3379 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { | 3410 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { |
3380 QuicPacketHeader header; | 3411 QuicPacketHeader header; |
3381 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3412 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3423 0x00, 0x00, | 3454 0x00, 0x00, |
3424 // num missing packet ranges (limited to 6 by packet size of 37). | 3455 // num missing packet ranges (limited to 6 by packet size of 37). |
3425 0x06, | 3456 0x06, |
3426 // {missing packet delta, further missing packets in range} | 3457 // {missing packet delta, further missing packets in range} |
3427 // 6 nack ranges | 3458 // 6 nack ranges |
3428 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3459 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
3429 // 0 revived packets. | 3460 // 0 revived packets. |
3430 0x00, | 3461 0x00, |
3431 }; | 3462 }; |
3432 | 3463 |
3433 scoped_ptr<QuicPacket> data( | 3464 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames, 37u)); |
3434 framer_.BuildDataPacket(header, frames, 37u).packet); | |
3435 ASSERT_TRUE(data != nullptr); | 3465 ASSERT_TRUE(data != nullptr); |
3436 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. | 3466 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. |
3437 EXPECT_EQ(36u, data->length()); | 3467 EXPECT_EQ(36u, data->length()); |
3438 test::CompareCharArraysWithHexError("constructed packet", | 3468 test::CompareCharArraysWithHexError("constructed packet", |
3439 data->data(), data->length(), | 3469 data->data(), data->length(), |
3440 AsChars(packet), arraysize(packet)); | 3470 AsChars(packet), arraysize(packet)); |
3441 } | 3471 } |
3442 | 3472 |
3443 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { | 3473 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { |
3444 QuicPacketHeader header; | 3474 QuicPacketHeader header; |
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3897 // first fec protected packet offset | 3927 // first fec protected packet offset |
3898 0x01, | 3928 0x01, |
3899 | 3929 |
3900 // redundancy | 3930 // redundancy |
3901 'a', 'b', 'c', 'd', | 3931 'a', 'b', 'c', 'd', |
3902 'e', 'f', 'g', 'h', | 3932 'e', 'f', 'g', 'h', |
3903 'i', 'j', 'k', 'l', | 3933 'i', 'j', 'k', 'l', |
3904 'm', 'n', 'o', 'p', | 3934 'm', 'n', 'o', 'p', |
3905 }; | 3935 }; |
3906 | 3936 |
3907 scoped_ptr<QuicPacket> data( | 3937 scoped_ptr<QuicPacket> data(framer_.BuildFecPacket(header, fec_data)); |
3908 framer_.BuildFecPacket(header, fec_data).packet); | |
3909 ASSERT_TRUE(data != nullptr); | 3938 ASSERT_TRUE(data != nullptr); |
3910 | 3939 |
3911 test::CompareCharArraysWithHexError("constructed packet", | 3940 test::CompareCharArraysWithHexError("constructed packet", |
3912 data->data(), data->length(), | 3941 data->data(), data->length(), |
3913 AsChars(packet), arraysize(packet)); | 3942 AsChars(packet), arraysize(packet)); |
3914 } | 3943 } |
3915 | 3944 |
3916 TEST_P(QuicFramerTest, EncryptPacket) { | 3945 TEST_P(QuicFramerTest, EncryptPacket) { |
3917 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); | 3946 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); |
3918 unsigned char packet[] = { | 3947 unsigned char packet[] = { |
(...skipping 10 matching lines...) Expand all Loading... |
3929 // first fec protected packet offset | 3958 // first fec protected packet offset |
3930 0x01, | 3959 0x01, |
3931 | 3960 |
3932 // redundancy | 3961 // redundancy |
3933 'a', 'b', 'c', 'd', | 3962 'a', 'b', 'c', 'd', |
3934 'e', 'f', 'g', 'h', | 3963 'e', 'f', 'g', 'h', |
3935 'i', 'j', 'k', 'l', | 3964 'i', 'j', 'k', 'l', |
3936 'm', 'n', 'o', 'p', | 3965 'm', 'n', 'o', 'p', |
3937 }; | 3966 }; |
3938 | 3967 |
3939 scoped_ptr<QuicPacket> raw( | 3968 scoped_ptr<QuicPacket> raw(new QuicPacket( |
3940 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, | 3969 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
3941 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 3970 !kIncludeVersion, PACKET_6BYTE_SEQUENCE_NUMBER)); |
3942 PACKET_6BYTE_SEQUENCE_NUMBER)); | |
3943 scoped_ptr<QuicEncryptedPacket> encrypted( | 3971 scoped_ptr<QuicEncryptedPacket> encrypted( |
3944 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); | 3972 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); |
3945 | 3973 |
3946 ASSERT_TRUE(encrypted.get() != nullptr); | 3974 ASSERT_TRUE(encrypted.get() != nullptr); |
3947 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); | 3975 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); |
3948 } | 3976 } |
3949 | 3977 |
3950 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { | 3978 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { |
3951 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); | 3979 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); |
3952 unsigned char packet[] = { | 3980 unsigned char packet[] = { |
(...skipping 12 matching lines...) Expand all Loading... |
3965 // first fec protected packet offset | 3993 // first fec protected packet offset |
3966 0x01, | 3994 0x01, |
3967 | 3995 |
3968 // redundancy | 3996 // redundancy |
3969 'a', 'b', 'c', 'd', | 3997 'a', 'b', 'c', 'd', |
3970 'e', 'f', 'g', 'h', | 3998 'e', 'f', 'g', 'h', |
3971 'i', 'j', 'k', 'l', | 3999 'i', 'j', 'k', 'l', |
3972 'm', 'n', 'o', 'p', | 4000 'm', 'n', 'o', 'p', |
3973 }; | 4001 }; |
3974 | 4002 |
3975 scoped_ptr<QuicPacket> raw( | 4003 scoped_ptr<QuicPacket> raw(new QuicPacket( |
3976 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, | 4004 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
3977 PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, | 4005 kIncludeVersion, PACKET_6BYTE_SEQUENCE_NUMBER)); |
3978 PACKET_6BYTE_SEQUENCE_NUMBER)); | |
3979 scoped_ptr<QuicEncryptedPacket> encrypted( | 4006 scoped_ptr<QuicEncryptedPacket> encrypted( |
3980 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); | 4007 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); |
3981 | 4008 |
3982 ASSERT_TRUE(encrypted.get() != nullptr); | 4009 ASSERT_TRUE(encrypted.get() != nullptr); |
3983 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); | 4010 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); |
3984 } | 4011 } |
3985 | 4012 |
3986 TEST_P(QuicFramerTest, AckTruncationLargePacket) { | 4013 TEST_P(QuicFramerTest, AckTruncationLargePacket) { |
3987 QuicPacketHeader header; | 4014 QuicPacketHeader header; |
3988 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 4015 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3989 header.public_header.reset_flag = false; | 4016 header.public_header.reset_flag = false; |
3990 header.public_header.version_flag = false; | 4017 header.public_header.version_flag = false; |
3991 header.fec_flag = false; | 4018 header.fec_flag = false; |
3992 header.entropy_flag = false; | 4019 header.entropy_flag = false; |
3993 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4020 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3994 header.fec_group = 0; | 4021 header.fec_group = 0; |
3995 | 4022 |
3996 // Create a packet with just the ack. | 4023 // Create a packet with just the ack. |
3997 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); | 4024 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); |
3998 QuicFrame frame; | 4025 QuicFrame frame; |
3999 frame.type = ACK_FRAME; | 4026 frame.type = ACK_FRAME; |
4000 frame.ack_frame = &ack_frame; | 4027 frame.ack_frame = &ack_frame; |
4001 QuicFrames frames; | 4028 QuicFrames frames; |
4002 frames.push_back(frame); | 4029 frames.push_back(frame); |
4003 | 4030 |
4004 // Build an ack packet with truncation due to limit in number of nack ranges. | 4031 // Build an ack packet with truncation due to limit in number of nack ranges. |
4005 scoped_ptr<QuicPacket> raw_ack_packet( | 4032 scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); |
4006 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet); | |
4007 ASSERT_TRUE(raw_ack_packet != nullptr); | 4033 ASSERT_TRUE(raw_ack_packet != nullptr); |
4008 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4034 scoped_ptr<QuicEncryptedPacket> ack_packet( |
4009 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | 4035 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, |
4010 *raw_ack_packet)); | 4036 *raw_ack_packet)); |
4011 // Now make sure we can turn our ack packet back into an ack frame. | 4037 // Now make sure we can turn our ack packet back into an ack frame. |
4012 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4038 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
4013 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 4039 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
4014 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 4040 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
4015 EXPECT_TRUE(processed_ack_frame.is_truncated); | 4041 EXPECT_TRUE(processed_ack_frame.is_truncated); |
4016 EXPECT_EQ(510u, processed_ack_frame.largest_observed); | 4042 EXPECT_EQ(510u, processed_ack_frame.largest_observed); |
(...skipping 18 matching lines...) Expand all Loading... |
4035 | 4061 |
4036 // Create a packet with just the ack. | 4062 // Create a packet with just the ack. |
4037 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); | 4063 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); |
4038 QuicFrame frame; | 4064 QuicFrame frame; |
4039 frame.type = ACK_FRAME; | 4065 frame.type = ACK_FRAME; |
4040 frame.ack_frame = &ack_frame; | 4066 frame.ack_frame = &ack_frame; |
4041 QuicFrames frames; | 4067 QuicFrames frames; |
4042 frames.push_back(frame); | 4068 frames.push_back(frame); |
4043 | 4069 |
4044 // Build an ack packet with truncation due to limit in number of nack ranges. | 4070 // Build an ack packet with truncation due to limit in number of nack ranges. |
4045 scoped_ptr<QuicPacket> raw_ack_packet( | 4071 scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames, 500)); |
4046 framer_.BuildDataPacket(header, frames, 500).packet); | |
4047 ASSERT_TRUE(raw_ack_packet != nullptr); | 4072 ASSERT_TRUE(raw_ack_packet != nullptr); |
4048 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4073 scoped_ptr<QuicEncryptedPacket> ack_packet( |
4049 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | 4074 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, |
4050 *raw_ack_packet)); | 4075 *raw_ack_packet)); |
4051 // Now make sure we can turn our ack packet back into an ack frame. | 4076 // Now make sure we can turn our ack packet back into an ack frame. |
4052 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4077 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
4053 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 4078 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
4054 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 4079 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
4055 EXPECT_TRUE(processed_ack_frame.is_truncated); | 4080 EXPECT_TRUE(processed_ack_frame.is_truncated); |
4056 EXPECT_EQ(476u, processed_ack_frame.largest_observed); | 4081 EXPECT_EQ(476u, processed_ack_frame.largest_observed); |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4237 EXPECT_CALL(visitor, OnPacketComplete()); | 4262 EXPECT_CALL(visitor, OnPacketComplete()); |
4238 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); | 4263 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); |
4239 | 4264 |
4240 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 4265 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
4241 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 4266 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
4242 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 4267 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
4243 } | 4268 } |
4244 | 4269 |
4245 } // namespace test | 4270 } // namespace test |
4246 } // namespace net | 4271 } // namespace net |
OLD | NEW |