| 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" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 (include_version ? kQuicVersionSize : 0); | 50 (include_version ? kQuicVersionSize : 0); |
| 51 } | 51 } |
| 52 | 52 |
| 53 size_t GetSequenceNumberOffset(bool include_version) { | 53 size_t GetSequenceNumberOffset(bool include_version) { |
| 54 return GetSequenceNumberOffset(PACKET_8BYTE_GUID, include_version); | 54 return GetSequenceNumberOffset(PACKET_8BYTE_GUID, include_version); |
| 55 } | 55 } |
| 56 | 56 |
| 57 // Index into the private flags offset in the data packet header. | 57 // Index into the private flags offset in the data packet header. |
| 58 size_t GetPrivateFlagsOffset(QuicGuidLength guid_length, bool include_version) { | 58 size_t GetPrivateFlagsOffset(QuicGuidLength guid_length, bool include_version) { |
| 59 return GetSequenceNumberOffset(guid_length, include_version) + | 59 return GetSequenceNumberOffset(guid_length, include_version) + |
| 60 kSequenceNumberSize; | 60 PACKET_6BYTE_SEQUENCE_NUMBER; |
| 61 } | 61 } |
| 62 | 62 |
| 63 size_t GetPrivateFlagsOffset(bool include_version) { | 63 size_t GetPrivateFlagsOffset(bool include_version) { |
| 64 return GetPrivateFlagsOffset(PACKET_8BYTE_GUID, include_version); | 64 return GetPrivateFlagsOffset(PACKET_8BYTE_GUID, include_version); |
| 65 } | 65 } |
| 66 | 66 |
| 67 size_t GetPrivateFlagsOffset(bool include_version, |
| 68 QuicSequenceNumberLength sequence_number_length) { |
| 69 return GetSequenceNumberOffset(PACKET_8BYTE_GUID, include_version) + |
| 70 sequence_number_length; |
| 71 } |
| 72 |
| 67 // Index into the fec group offset in the header. | 73 // Index into the fec group offset in the header. |
| 68 size_t GetFecGroupOffset(QuicGuidLength guid_length, bool include_version) { | 74 size_t GetFecGroupOffset(QuicGuidLength guid_length, bool include_version) { |
| 69 return GetPrivateFlagsOffset(guid_length, include_version) + | 75 return GetPrivateFlagsOffset(guid_length, include_version) + |
| 70 kPrivateFlagsSize; | 76 kPrivateFlagsSize; |
| 71 } | 77 } |
| 72 | 78 |
| 73 size_t GetFecGroupOffset(bool include_version) { | 79 size_t GetFecGroupOffset(bool include_version) { |
| 74 return GetPrivateFlagsOffset(PACKET_8BYTE_GUID, include_version) + | 80 return GetPrivateFlagsOffset(PACKET_8BYTE_GUID, include_version) + |
| 75 kPrivateFlagsSize; | 81 kPrivateFlagsSize; |
| 76 } | 82 } |
| 77 | 83 |
| 84 size_t GetFecGroupOffset(bool include_version, |
| 85 QuicSequenceNumberLength sequence_number_length) { |
| 86 return GetPrivateFlagsOffset(include_version, sequence_number_length) + |
| 87 kPrivateFlagsSize; |
| 88 } |
| 89 |
| 78 // Index into the nonce proof of the public reset packet. | 90 // Index into the nonce proof of the public reset packet. |
| 79 // Public resets always have full guids. | 91 // Public resets always have full guids. |
| 80 const size_t kPublicResetPacketNonceProofOffset = | 92 const size_t kPublicResetPacketNonceProofOffset = |
| 81 kGuidOffset + PACKET_8BYTE_GUID; | 93 kGuidOffset + PACKET_8BYTE_GUID; |
| 82 | 94 |
| 83 // Index into the rejected sequence number of the public reset packet. | 95 // Index into the rejected sequence number of the public reset packet. |
| 84 const size_t kPublicResetPacketRejectedSequenceNumberOffset = | 96 const size_t kPublicResetPacketRejectedSequenceNumberOffset = |
| 85 kPublicResetPacketNonceProofOffset + kPublicResetNonceSize; | 97 kPublicResetPacketNonceProofOffset + kPublicResetNonceSize; |
| 86 | 98 |
| 87 class TestEncrypter : public QuicEncrypter { | 99 class TestEncrypter : public QuicEncrypter { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 } | 176 } |
| 165 QuicPacketSequenceNumber sequence_number_; | 177 QuicPacketSequenceNumber sequence_number_; |
| 166 string associated_data_; | 178 string associated_data_; |
| 167 string ciphertext_; | 179 string ciphertext_; |
| 168 }; | 180 }; |
| 169 | 181 |
| 170 class TestQuicVisitor : public ::net::QuicFramerVisitorInterface { | 182 class TestQuicVisitor : public ::net::QuicFramerVisitorInterface { |
| 171 public: | 183 public: |
| 172 TestQuicVisitor() | 184 TestQuicVisitor() |
| 173 : error_count_(0), | 185 : error_count_(0), |
| 186 version_mismatch_(0), |
| 174 packet_count_(0), | 187 packet_count_(0), |
| 175 frame_count_(0), | 188 frame_count_(0), |
| 176 fec_count_(0), | 189 fec_count_(0), |
| 177 complete_packets_(0), | 190 complete_packets_(0), |
| 178 revived_packets_(0), | 191 revived_packets_(0), |
| 179 accept_packet_(true) { | 192 accept_packet_(true) { |
| 180 } | 193 } |
| 181 | 194 |
| 182 virtual ~TestQuicVisitor() { | 195 virtual ~TestQuicVisitor() { |
| 183 STLDeleteElements(&stream_frames_); | 196 STLDeleteElements(&stream_frames_); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 202 virtual void OnVersionNegotiationPacket( | 215 virtual void OnVersionNegotiationPacket( |
| 203 const QuicVersionNegotiationPacket& packet) OVERRIDE { | 216 const QuicVersionNegotiationPacket& packet) OVERRIDE { |
| 204 version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet)); | 217 version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet)); |
| 205 } | 218 } |
| 206 | 219 |
| 207 virtual void OnRevivedPacket() OVERRIDE { | 220 virtual void OnRevivedPacket() OVERRIDE { |
| 208 revived_packets_++; | 221 revived_packets_++; |
| 209 } | 222 } |
| 210 | 223 |
| 211 virtual bool OnProtocolVersionMismatch(QuicTag version) OVERRIDE { | 224 virtual bool OnProtocolVersionMismatch(QuicTag version) OVERRIDE { |
| 212 DCHECK(false); | 225 DLOG(INFO) << "QuicFramer Version Mismatch, version: " << version; |
| 226 version_mismatch_++; |
| 213 return true; | 227 return true; |
| 214 } | 228 } |
| 215 | 229 |
| 216 virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE { | 230 virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE { |
| 217 packet_count_++; | 231 packet_count_++; |
| 218 header_.reset(new QuicPacketHeader(header)); | 232 header_.reset(new QuicPacketHeader(header)); |
| 219 return accept_packet_; | 233 return accept_packet_; |
| 220 } | 234 } |
| 221 | 235 |
| 222 virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE { | 236 virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 return true; | 277 return true; |
| 264 } | 278 } |
| 265 | 279 |
| 266 virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) OVERRIDE { | 280 virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) OVERRIDE { |
| 267 goaway_frame_ = frame; | 281 goaway_frame_ = frame; |
| 268 return true; | 282 return true; |
| 269 } | 283 } |
| 270 | 284 |
| 271 // Counters from the visitor_ callbacks. | 285 // Counters from the visitor_ callbacks. |
| 272 int error_count_; | 286 int error_count_; |
| 287 int version_mismatch_; |
| 273 int packet_count_; | 288 int packet_count_; |
| 274 int frame_count_; | 289 int frame_count_; |
| 275 int fec_count_; | 290 int fec_count_; |
| 276 int complete_packets_; | 291 int complete_packets_; |
| 277 int revived_packets_; | 292 int revived_packets_; |
| 278 bool accept_packet_; | 293 bool accept_packet_; |
| 279 | 294 |
| 280 scoped_ptr<QuicPacketHeader> header_; | 295 scoped_ptr<QuicPacketHeader> header_; |
| 281 scoped_ptr<QuicPublicResetPacket> public_reset_packet_; | 296 scoped_ptr<QuicPublicResetPacket> public_reset_packet_; |
| 282 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; | 297 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 bool CheckDecryption(const QuicEncryptedPacket& encrypted, | 344 bool CheckDecryption(const QuicEncryptedPacket& encrypted, |
| 330 bool includes_version) { | 345 bool includes_version) { |
| 331 if (visitor_.header_->packet_sequence_number != | 346 if (visitor_.header_->packet_sequence_number != |
| 332 decrypter_->sequence_number_) { | 347 decrypter_->sequence_number_) { |
| 333 LOG(ERROR) << "Decrypted incorrect packet sequence number. expected " | 348 LOG(ERROR) << "Decrypted incorrect packet sequence number. expected " |
| 334 << visitor_.header_->packet_sequence_number << " actual: " | 349 << visitor_.header_->packet_sequence_number << " actual: " |
| 335 << decrypter_->sequence_number_; | 350 << decrypter_->sequence_number_; |
| 336 return false; | 351 return false; |
| 337 } | 352 } |
| 338 if (QuicFramer::GetAssociatedDataFromEncryptedPacket( | 353 if (QuicFramer::GetAssociatedDataFromEncryptedPacket( |
| 339 encrypted, PACKET_8BYTE_GUID, includes_version) != | 354 encrypted, PACKET_8BYTE_GUID, |
| 340 decrypter_->associated_data_) { | 355 includes_version, PACKET_6BYTE_SEQUENCE_NUMBER) != |
| 356 decrypter_->associated_data_) { |
| 341 LOG(ERROR) << "Decrypted incorrect associated data. expected " | 357 LOG(ERROR) << "Decrypted incorrect associated data. expected " |
| 342 << QuicFramer::GetAssociatedDataFromEncryptedPacket( | 358 << QuicFramer::GetAssociatedDataFromEncryptedPacket( |
| 343 encrypted, PACKET_8BYTE_GUID, includes_version) | 359 encrypted, PACKET_8BYTE_GUID, |
| 360 includes_version, PACKET_6BYTE_SEQUENCE_NUMBER) |
| 344 << " actual: " << decrypter_->associated_data_; | 361 << " actual: " << decrypter_->associated_data_; |
| 345 return false; | 362 return false; |
| 346 } | 363 } |
| 347 StringPiece ciphertext(encrypted.AsStringPiece().substr( | 364 StringPiece ciphertext(encrypted.AsStringPiece().substr( |
| 348 GetStartOfEncryptedData(PACKET_8BYTE_GUID, includes_version))); | 365 GetStartOfEncryptedData(PACKET_8BYTE_GUID, includes_version, |
| 366 PACKET_6BYTE_SEQUENCE_NUMBER))); |
| 349 if (ciphertext != decrypter_->ciphertext_) { | 367 if (ciphertext != decrypter_->ciphertext_) { |
| 350 LOG(ERROR) << "Decrypted incorrect chipertext data. expected " | 368 LOG(ERROR) << "Decrypted incorrect ciphertext data. expected " |
| 351 << ciphertext << " actual: " | 369 << ciphertext << " actual: " |
| 352 << decrypter_->ciphertext_; | 370 << decrypter_->ciphertext_; |
| 353 return false; | 371 return false; |
| 354 } | 372 } |
| 355 return true; | 373 return true; |
| 356 } | 374 } |
| 357 | 375 |
| 358 char* AsChars(unsigned char* data) { | 376 char* AsChars(unsigned char* data) { |
| 359 return reinterpret_cast<char*>(data); | 377 return reinterpret_cast<char*>(data); |
| 360 } | 378 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 377 } | 395 } |
| 378 | 396 |
| 379 void CheckCalculatePacketSequenceNumber( | 397 void CheckCalculatePacketSequenceNumber( |
| 380 QuicPacketSequenceNumber expected_sequence_number, | 398 QuicPacketSequenceNumber expected_sequence_number, |
| 381 QuicPacketSequenceNumber last_sequence_number) { | 399 QuicPacketSequenceNumber last_sequence_number) { |
| 382 QuicPacketSequenceNumber wire_sequence_number = | 400 QuicPacketSequenceNumber wire_sequence_number = |
| 383 expected_sequence_number & kMask; | 401 expected_sequence_number & kMask; |
| 384 QuicFramerPeer::SetLastSequenceNumber(&framer_, last_sequence_number); | 402 QuicFramerPeer::SetLastSequenceNumber(&framer_, last_sequence_number); |
| 385 EXPECT_EQ(expected_sequence_number, | 403 EXPECT_EQ(expected_sequence_number, |
| 386 QuicFramerPeer::CalculatePacketSequenceNumberFromWire( | 404 QuicFramerPeer::CalculatePacketSequenceNumberFromWire( |
| 387 &framer_, wire_sequence_number)) | 405 &framer_, PACKET_6BYTE_SEQUENCE_NUMBER, wire_sequence_number)) |
| 388 << "last_sequence_number: " << last_sequence_number | 406 << "last_sequence_number: " << last_sequence_number |
| 389 << "wire_sequence_number: " << wire_sequence_number; | 407 << " wire_sequence_number: " << wire_sequence_number; |
| 390 } | 408 } |
| 391 | 409 |
| 392 test::TestEncrypter* encrypter_; | 410 test::TestEncrypter* encrypter_; |
| 393 test::TestDecrypter* decrypter_; | 411 test::TestDecrypter* decrypter_; |
| 394 QuicTime start_; | 412 QuicTime start_; |
| 395 QuicFramer framer_; | 413 QuicFramer framer_; |
| 396 test::TestQuicVisitor visitor_; | 414 test::TestQuicVisitor visitor_; |
| 397 test::TestEntropyCalculator entropy_calculator_; | 415 test::TestEntropyCalculator entropy_calculator_; |
| 398 }; | 416 }; |
| 399 | 417 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 } | 492 } |
| 475 } | 493 } |
| 476 } | 494 } |
| 477 | 495 |
| 478 TEST_F(QuicFramerTest, CalculatePacketSequenceNumberFromWireNearNextMax) { | 496 TEST_F(QuicFramerTest, CalculatePacketSequenceNumberFromWireNearNextMax) { |
| 479 const uint64 max_number = numeric_limits<uint64>::max(); | 497 const uint64 max_number = numeric_limits<uint64>::max(); |
| 480 const uint64 max_epoch = max_number & ~kMask; | 498 const uint64 max_epoch = max_number & ~kMask; |
| 481 | 499 |
| 482 // Cases where the last number was close to the end of the range | 500 // Cases where the last number was close to the end of the range |
| 483 for (uint64 i = 0; i < 10; i++) { | 501 for (uint64 i = 0; i < 10; i++) { |
| 484 QuicPacketSequenceNumber last = max_number - i; | 502 // Subtract 1, because the expected next sequence number is 1 more than the |
| 503 // last sequence number. |
| 504 QuicPacketSequenceNumber last = max_number - i - 1; |
| 485 | 505 |
| 486 // Small numbers should not wrap (because they have nowhere to go. | 506 // Small numbers should not wrap, because they have nowhere to go. |
| 487 for (uint64 j = 0; j < 10; j++) { | 507 for (uint64 j = 0; j < 10; j++) { |
| 488 CheckCalculatePacketSequenceNumber(max_epoch + j, last); | 508 CheckCalculatePacketSequenceNumber(max_epoch + j, last); |
| 489 } | 509 } |
| 490 | 510 |
| 491 // Large numbers should not wrap either. | 511 // Large numbers should not wrap either. |
| 492 for (uint64 j = 0; j < 10; j++) { | 512 for (uint64 j = 0; j < 10; j++) { |
| 493 uint64 num = kEpoch - 1 - j; | 513 uint64 num = kEpoch - 1 - j; |
| 494 CheckCalculatePacketSequenceNumber(max_epoch + num, last); | 514 CheckCalculatePacketSequenceNumber(max_epoch + num, last); |
| 495 } | 515 } |
| 496 } | 516 } |
| 497 } | 517 } |
| 498 | 518 |
| 499 TEST_F(QuicFramerTest, EmptyPacket) { | 519 TEST_F(QuicFramerTest, EmptyPacket) { |
| 500 char packet[] = { 0x00 }; | 520 char packet[] = { 0x00 }; |
| 501 QuicEncryptedPacket encrypted(packet, 0, false); | 521 QuicEncryptedPacket encrypted(packet, 0, false); |
| 502 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 522 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 503 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); | 523 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); |
| 504 } | 524 } |
| 505 | 525 |
| 506 TEST_F(QuicFramerTest, LargePacket) { | 526 TEST_F(QuicFramerTest, LargePacket) { |
| 507 unsigned char packet[kMaxPacketSize + 1] = { | 527 unsigned char packet[kMaxPacketSize + 1] = { |
| 508 // public flags (8 byte guid) | 528 // public flags (8 byte guid) |
| 509 0x0C, | 529 0x3C, |
| 510 // guid | 530 // guid |
| 511 0x10, 0x32, 0x54, 0x76, | 531 0x10, 0x32, 0x54, 0x76, |
| 512 0x98, 0xBA, 0xDC, 0xFE, | 532 0x98, 0xBA, 0xDC, 0xFE, |
| 513 // packet sequence number | 533 // packet sequence number |
| 514 0xBC, 0x9A, 0x78, 0x56, | 534 0xBC, 0x9A, 0x78, 0x56, |
| 515 0x34, 0x12, | 535 0x34, 0x12, |
| 516 // private flags | 536 // private flags |
| 517 0x00, | 537 0x00, |
| 518 }; | 538 }; |
| 519 | 539 |
| 520 memset(packet + GetPacketHeaderSize( | 540 memset(packet + GetPacketHeaderSize( |
| 521 PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP), 0, | 541 PACKET_8BYTE_GUID, !kIncludeVersion, |
| 542 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 0, |
| 522 kMaxPacketSize - GetPacketHeaderSize( | 543 kMaxPacketSize - GetPacketHeaderSize( |
| 523 PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP) + 1); | 544 PACKET_8BYTE_GUID, !kIncludeVersion, |
| 545 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + 1); |
| 524 | 546 |
| 525 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 547 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 526 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 548 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 527 | 549 |
| 528 ASSERT_TRUE(visitor_.header_.get()); | 550 ASSERT_TRUE(visitor_.header_.get()); |
| 529 // Make sure we've parsed the packet header, so we can send an error. | 551 // Make sure we've parsed the packet header, so we can send an error. |
| 530 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 552 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
| 531 visitor_.header_->public_header.guid); | 553 visitor_.header_->public_header.guid); |
| 532 // Make sure the correct error is propagated. | 554 // Make sure the correct error is propagated. |
| 533 EXPECT_EQ(QUIC_PACKET_TOO_LARGE, framer_.error()); | 555 EXPECT_EQ(QUIC_PACKET_TOO_LARGE, framer_.error()); |
| 534 } | 556 } |
| 535 | 557 |
| 536 TEST_F(QuicFramerTest, PacketHeader) { | 558 TEST_F(QuicFramerTest, PacketHeader) { |
| 537 unsigned char packet[] = { | 559 unsigned char packet[] = { |
| 538 // public flags (8 byte guid) | 560 // public flags (8 byte guid) |
| 539 0x0C, | 561 0x3C, |
| 540 // guid | 562 // guid |
| 541 0x10, 0x32, 0x54, 0x76, | 563 0x10, 0x32, 0x54, 0x76, |
| 542 0x98, 0xBA, 0xDC, 0xFE, | 564 0x98, 0xBA, 0xDC, 0xFE, |
| 543 // packet sequence number | 565 // packet sequence number |
| 544 0xBC, 0x9A, 0x78, 0x56, | 566 0xBC, 0x9A, 0x78, 0x56, |
| 545 0x34, 0x12, | 567 0x34, 0x12, |
| 546 // private flags | 568 // private flags |
| 547 0x00, | 569 0x00, |
| 548 }; | 570 }; |
| 549 | 571 |
| 550 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 572 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 551 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 573 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 552 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); | 574 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); |
| 553 ASSERT_TRUE(visitor_.header_.get()); | 575 ASSERT_TRUE(visitor_.header_.get()); |
| 554 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 576 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
| 555 visitor_.header_->public_header.guid); | 577 visitor_.header_->public_header.guid); |
| 556 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 578 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 557 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 579 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 558 EXPECT_FALSE(visitor_.header_->fec_flag); | 580 EXPECT_FALSE(visitor_.header_->fec_flag); |
| 559 EXPECT_FALSE(visitor_.header_->entropy_flag); | 581 EXPECT_FALSE(visitor_.header_->entropy_flag); |
| 560 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 582 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
| 561 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 583 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
| 562 visitor_.header_->packet_sequence_number); | 584 visitor_.header_->packet_sequence_number); |
| 563 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 585 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
| 564 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 586 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
| 565 | 587 |
| 566 // Now test framing boundaries | 588 // Now test framing boundaries |
| 567 for (size_t i = 0; | 589 for (size_t i = 0; |
| 568 i < GetPacketHeaderSize( | 590 i < GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 569 PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP); ++i) { | 591 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); |
| 592 ++i) { |
| 570 string expected_error; | 593 string expected_error; |
| 571 if (i < kGuidOffset) { | 594 if (i < kGuidOffset) { |
| 572 expected_error = "Unable to read public flags."; | 595 expected_error = "Unable to read public flags."; |
| 573 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { | 596 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { |
| 574 expected_error = "Unable to read GUID."; | 597 expected_error = "Unable to read GUID."; |
| 575 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion)) { | 598 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion)) { |
| 576 expected_error = "Unable to read sequence number."; | 599 expected_error = "Unable to read sequence number."; |
| 577 } else if (i < GetFecGroupOffset(!kIncludeVersion)) { | 600 } else if (i < GetFecGroupOffset(!kIncludeVersion)) { |
| 578 expected_error = "Unable to read private flags."; | 601 expected_error = "Unable to read private flags."; |
| 579 } else { | 602 } else { |
| 580 expected_error = "Unable to read first fec protected packet offset."; | 603 expected_error = "Unable to read first fec protected packet offset."; |
| 581 } | 604 } |
| 582 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 605 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 583 } | 606 } |
| 584 } | 607 } |
| 585 | 608 |
| 586 TEST_F(QuicFramerTest, PacketHeaderWith4ByteGuid) { | 609 TEST_F(QuicFramerTest, PacketHeaderWith4ByteGuid) { |
| 587 QuicFramerPeer::SetLastSerializedGuid(&framer_, | 610 QuicFramerPeer::SetLastSerializedGuid(&framer_, |
| 588 GG_UINT64_C(0xFEDCBA9876543210)); | 611 GG_UINT64_C(0xFEDCBA9876543210)); |
| 589 | 612 |
| 590 unsigned char packet[] = { | 613 unsigned char packet[] = { |
| 591 // public flags (4 byte guid) | 614 // public flags (4 byte guid) |
| 592 0x08, | 615 0x38, |
| 593 // guid | 616 // guid |
| 594 0x10, 0x32, 0x54, 0x76, | 617 0x10, 0x32, 0x54, 0x76, |
| 595 // packet sequence number | 618 // packet sequence number |
| 596 0xBC, 0x9A, 0x78, 0x56, | 619 0xBC, 0x9A, 0x78, 0x56, |
| 597 0x34, 0x12, | 620 0x34, 0x12, |
| 598 // private flags | 621 // private flags |
| 599 0x00, | 622 0x00, |
| 600 }; | 623 }; |
| 601 | 624 |
| 602 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 625 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 603 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 626 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 604 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); | 627 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); |
| 605 ASSERT_TRUE(visitor_.header_.get()); | 628 ASSERT_TRUE(visitor_.header_.get()); |
| 606 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 629 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
| 607 visitor_.header_->public_header.guid); | 630 visitor_.header_->public_header.guid); |
| 608 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 631 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 609 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 632 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 610 EXPECT_FALSE(visitor_.header_->fec_flag); | 633 EXPECT_FALSE(visitor_.header_->fec_flag); |
| 611 EXPECT_FALSE(visitor_.header_->entropy_flag); | 634 EXPECT_FALSE(visitor_.header_->entropy_flag); |
| 612 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 635 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
| 613 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 636 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
| 614 visitor_.header_->packet_sequence_number); | 637 visitor_.header_->packet_sequence_number); |
| 615 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 638 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
| 616 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 639 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
| 617 | 640 |
| 618 // Now test framing boundaries | 641 // Now test framing boundaries |
| 619 for (size_t i = 0; | 642 for (size_t i = 0; |
| 620 i < GetPacketHeaderSize( | 643 i < GetPacketHeaderSize(PACKET_4BYTE_GUID, !kIncludeVersion, |
| 621 PACKET_4BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP); ++i) { | 644 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); |
| 645 ++i) { |
| 622 string expected_error; | 646 string expected_error; |
| 623 if (i < kGuidOffset) { | 647 if (i < kGuidOffset) { |
| 624 expected_error = "Unable to read public flags."; | 648 expected_error = "Unable to read public flags."; |
| 625 } else if (i < GetSequenceNumberOffset(PACKET_4BYTE_GUID, | 649 } else if (i < GetSequenceNumberOffset(PACKET_4BYTE_GUID, |
| 626 !kIncludeVersion)) { | 650 !kIncludeVersion)) { |
| 627 expected_error = "Unable to read GUID."; | 651 expected_error = "Unable to read GUID."; |
| 628 } else if (i < GetPrivateFlagsOffset(PACKET_4BYTE_GUID, | 652 } else if (i < GetPrivateFlagsOffset(PACKET_4BYTE_GUID, |
| 629 !kIncludeVersion)) { | 653 !kIncludeVersion)) { |
| 630 expected_error = "Unable to read sequence number."; | 654 expected_error = "Unable to read sequence number."; |
| 631 } else if (i < GetFecGroupOffset(PACKET_4BYTE_GUID, !kIncludeVersion)) { | 655 } else if (i < GetFecGroupOffset(PACKET_4BYTE_GUID, !kIncludeVersion)) { |
| 632 expected_error = "Unable to read private flags."; | 656 expected_error = "Unable to read private flags."; |
| 633 } else { | 657 } else { |
| 634 expected_error = "Unable to read first fec protected packet offset."; | 658 expected_error = "Unable to read first fec protected packet offset."; |
| 635 } | 659 } |
| 636 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 660 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 637 } | 661 } |
| 638 } | 662 } |
| 639 | 663 |
| 640 TEST_F(QuicFramerTest, PacketHeader1ByteGuid) { | 664 TEST_F(QuicFramerTest, PacketHeader1ByteGuid) { |
| 641 QuicFramerPeer::SetLastSerializedGuid(&framer_, | 665 QuicFramerPeer::SetLastSerializedGuid(&framer_, |
| 642 GG_UINT64_C(0xFEDCBA9876543210)); | 666 GG_UINT64_C(0xFEDCBA9876543210)); |
| 643 | 667 |
| 644 unsigned char packet[] = { | 668 unsigned char packet[] = { |
| 645 // public flags (1 byte guid) | 669 // public flags (1 byte guid) |
| 646 0x04, | 670 0x34, |
| 647 // guid | 671 // guid |
| 648 0x10, | 672 0x10, |
| 649 // packet sequence number | 673 // packet sequence number |
| 650 0xBC, 0x9A, 0x78, 0x56, | 674 0xBC, 0x9A, 0x78, 0x56, |
| 651 0x34, 0x12, | 675 0x34, 0x12, |
| 652 // private flags | 676 // private flags |
| 653 0x00, | 677 0x00, |
| 654 }; | 678 }; |
| 655 | 679 |
| 656 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 680 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 657 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 681 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 658 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); | 682 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); |
| 659 ASSERT_TRUE(visitor_.header_.get()); | 683 ASSERT_TRUE(visitor_.header_.get()); |
| 660 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 684 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
| 661 visitor_.header_->public_header.guid); | 685 visitor_.header_->public_header.guid); |
| 662 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 686 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 663 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 687 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 664 EXPECT_FALSE(visitor_.header_->fec_flag); | 688 EXPECT_FALSE(visitor_.header_->fec_flag); |
| 665 EXPECT_FALSE(visitor_.header_->entropy_flag); | 689 EXPECT_FALSE(visitor_.header_->entropy_flag); |
| 666 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 690 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
| 667 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 691 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
| 668 visitor_.header_->packet_sequence_number); | 692 visitor_.header_->packet_sequence_number); |
| 669 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 693 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
| 670 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 694 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
| 671 | 695 |
| 672 // Now test framing boundaries | 696 // Now test framing boundaries |
| 673 for (size_t i = 0; | 697 for (size_t i = 0; |
| 674 i < GetPacketHeaderSize( | 698 i < GetPacketHeaderSize(PACKET_1BYTE_GUID, !kIncludeVersion, |
| 675 PACKET_1BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP); ++i) { | 699 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); |
| 700 ++i) { |
| 676 string expected_error; | 701 string expected_error; |
| 677 if (i < kGuidOffset) { | 702 if (i < kGuidOffset) { |
| 678 expected_error = "Unable to read public flags."; | 703 expected_error = "Unable to read public flags."; |
| 679 } else if (i < GetSequenceNumberOffset(PACKET_1BYTE_GUID, | 704 } else if (i < GetSequenceNumberOffset(PACKET_1BYTE_GUID, |
| 680 !kIncludeVersion)) { | 705 !kIncludeVersion)) { |
| 681 expected_error = "Unable to read GUID."; | 706 expected_error = "Unable to read GUID."; |
| 682 } else if (i < GetPrivateFlagsOffset(PACKET_1BYTE_GUID, !kIncludeVersion)) { | 707 } else if (i < GetPrivateFlagsOffset(PACKET_1BYTE_GUID, !kIncludeVersion)) { |
| 683 expected_error = "Unable to read sequence number."; | 708 expected_error = "Unable to read sequence number."; |
| 684 } else if (i < GetFecGroupOffset(PACKET_1BYTE_GUID, !kIncludeVersion)) { | 709 } else if (i < GetFecGroupOffset(PACKET_1BYTE_GUID, !kIncludeVersion)) { |
| 685 expected_error = "Unable to read private flags."; | 710 expected_error = "Unable to read private flags."; |
| 686 } else { | 711 } else { |
| 687 expected_error = "Unable to read first fec protected packet offset."; | 712 expected_error = "Unable to read first fec protected packet offset."; |
| 688 } | 713 } |
| 689 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 714 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 690 } | 715 } |
| 691 } | 716 } |
| 692 | 717 |
| 693 TEST_F(QuicFramerTest, PacketHeaderWith0ByteGuid) { | 718 TEST_F(QuicFramerTest, PacketHeaderWith0ByteGuid) { |
| 694 QuicFramerPeer::SetLastSerializedGuid(&framer_, | 719 QuicFramerPeer::SetLastSerializedGuid(&framer_, |
| 695 GG_UINT64_C(0xFEDCBA9876543210)); | 720 GG_UINT64_C(0xFEDCBA9876543210)); |
| 696 | 721 |
| 697 unsigned char packet[] = { | 722 unsigned char packet[] = { |
| 698 // public flags (0 byte guid) | 723 // public flags (0 byte guid) |
| 699 0x00, | 724 0x30, |
| 700 // guid | 725 // guid |
| 701 // packet sequence number | 726 // packet sequence number |
| 702 0xBC, 0x9A, 0x78, 0x56, | 727 0xBC, 0x9A, 0x78, 0x56, |
| 703 0x34, 0x12, | 728 0x34, 0x12, |
| 704 // private flags | 729 // private flags |
| 705 0x00, | 730 0x00, |
| 706 }; | 731 }; |
| 707 | 732 |
| 708 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 733 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 709 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 734 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 710 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); | 735 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); |
| 711 ASSERT_TRUE(visitor_.header_.get()); | 736 ASSERT_TRUE(visitor_.header_.get()); |
| 712 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 737 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
| 713 visitor_.header_->public_header.guid); | 738 visitor_.header_->public_header.guid); |
| 714 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 739 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 715 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 740 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 716 EXPECT_FALSE(visitor_.header_->fec_flag); | 741 EXPECT_FALSE(visitor_.header_->fec_flag); |
| 717 EXPECT_FALSE(visitor_.header_->entropy_flag); | 742 EXPECT_FALSE(visitor_.header_->entropy_flag); |
| 718 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 743 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
| 719 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 744 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
| 720 visitor_.header_->packet_sequence_number); | 745 visitor_.header_->packet_sequence_number); |
| 721 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 746 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
| 722 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 747 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
| 723 | 748 |
| 724 // Now test framing boundaries | 749 // Now test framing boundaries |
| 725 for (size_t i = 0; | 750 for (size_t i = 0; |
| 726 i < GetPacketHeaderSize( | 751 i < GetPacketHeaderSize(PACKET_0BYTE_GUID, !kIncludeVersion, |
| 727 PACKET_0BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP); ++i) { | 752 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); |
| 753 ++i) { |
| 728 string expected_error; | 754 string expected_error; |
| 729 if (i < kGuidOffset) { | 755 if (i < kGuidOffset) { |
| 730 expected_error = "Unable to read public flags."; | 756 expected_error = "Unable to read public flags."; |
| 731 } else if (i < GetSequenceNumberOffset(PACKET_0BYTE_GUID, | 757 } else if (i < GetSequenceNumberOffset(PACKET_0BYTE_GUID, |
| 732 !kIncludeVersion)) { | 758 !kIncludeVersion)) { |
| 733 expected_error = "Unable to read GUID."; | 759 expected_error = "Unable to read GUID."; |
| 734 } else if (i < GetPrivateFlagsOffset(PACKET_0BYTE_GUID, !kIncludeVersion)) { | 760 } else if (i < GetPrivateFlagsOffset(PACKET_0BYTE_GUID, !kIncludeVersion)) { |
| 735 expected_error = "Unable to read sequence number."; | 761 expected_error = "Unable to read sequence number."; |
| 736 } else if (i < GetFecGroupOffset(PACKET_0BYTE_GUID, !kIncludeVersion)) { | 762 } else if (i < GetFecGroupOffset(PACKET_0BYTE_GUID, !kIncludeVersion)) { |
| 737 expected_error = "Unable to read private flags."; | 763 expected_error = "Unable to read private flags."; |
| 738 } else { | 764 } else { |
| 739 expected_error = "Unable to read first fec protected packet offset."; | 765 expected_error = "Unable to read first fec protected packet offset."; |
| 740 } | 766 } |
| 741 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 767 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 742 } | 768 } |
| 743 } | 769 } |
| 744 | 770 |
| 745 TEST_F(QuicFramerTest, PacketHeaderWithVersionFlag) { | 771 TEST_F(QuicFramerTest, PacketHeaderWithVersionFlag) { |
| 746 unsigned char packet[] = { | 772 unsigned char packet[] = { |
| 747 // public flags (version) | 773 // public flags (version) |
| 748 0x0D, | 774 0x3D, |
| 749 // guid | 775 // guid |
| 750 0x10, 0x32, 0x54, 0x76, | 776 0x10, 0x32, 0x54, 0x76, |
| 751 0x98, 0xBA, 0xDC, 0xFE, | 777 0x98, 0xBA, 0xDC, 0xFE, |
| 752 // version tag | 778 // version tag |
| 753 'Q', '0', '0', '5', | 779 'Q', '0', '0', '6', |
| 754 // packet sequence number | 780 // packet sequence number |
| 755 0xBC, 0x9A, 0x78, 0x56, | 781 0xBC, 0x9A, 0x78, 0x56, |
| 756 0x34, 0x12, | 782 0x34, 0x12, |
| 757 // private flags | 783 // private flags |
| 758 0x00, | 784 0x00, |
| 759 }; | 785 }; |
| 760 | 786 |
| 761 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 787 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 762 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 788 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 763 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); | 789 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); |
| 764 ASSERT_TRUE(visitor_.header_.get()); | 790 ASSERT_TRUE(visitor_.header_.get()); |
| 765 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 791 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
| 766 visitor_.header_->public_header.guid); | 792 visitor_.header_->public_header.guid); |
| 767 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 793 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 768 EXPECT_TRUE(visitor_.header_->public_header.version_flag); | 794 EXPECT_TRUE(visitor_.header_->public_header.version_flag); |
| 769 EXPECT_EQ(kQuicVersion1, visitor_.header_->public_header.versions[0]); | 795 EXPECT_EQ(kQuicVersion1, visitor_.header_->public_header.versions[0]); |
| 770 EXPECT_FALSE(visitor_.header_->fec_flag); | 796 EXPECT_FALSE(visitor_.header_->fec_flag); |
| 771 EXPECT_FALSE(visitor_.header_->entropy_flag); | 797 EXPECT_FALSE(visitor_.header_->entropy_flag); |
| 772 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 798 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
| 773 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 799 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
| 774 visitor_.header_->packet_sequence_number); | 800 visitor_.header_->packet_sequence_number); |
| 775 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 801 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
| 776 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 802 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
| 777 | 803 |
| 778 // Now test framing boundaries | 804 // Now test framing boundaries |
| 779 for (size_t i = 0; | 805 for (size_t i = 0; |
| 780 i < GetPacketHeaderSize( | 806 i < GetPacketHeaderSize(PACKET_8BYTE_GUID, kIncludeVersion, |
| 781 PACKET_8BYTE_GUID, kIncludeVersion, NOT_IN_FEC_GROUP); ++i) { | 807 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); |
| 808 ++i) { |
| 782 string expected_error; | 809 string expected_error; |
| 783 if (i < kGuidOffset) { | 810 if (i < kGuidOffset) { |
| 784 expected_error = "Unable to read public flags."; | 811 expected_error = "Unable to read public flags."; |
| 785 } else if (i < kVersionOffset) { | 812 } else if (i < kVersionOffset) { |
| 786 expected_error = "Unable to read GUID."; | 813 expected_error = "Unable to read GUID."; |
| 787 } else if (i < GetSequenceNumberOffset(kIncludeVersion)) { | 814 } else if (i < GetSequenceNumberOffset(kIncludeVersion)) { |
| 788 expected_error = "Unable to read protocol version."; | 815 expected_error = "Unable to read protocol version."; |
| 789 } else if (i < GetPrivateFlagsOffset(kIncludeVersion)) { | 816 } else if (i < GetPrivateFlagsOffset(kIncludeVersion)) { |
| 790 expected_error = "Unable to read sequence number."; | 817 expected_error = "Unable to read sequence number."; |
| 791 } else if (i < GetFecGroupOffset(kIncludeVersion)) { | 818 } else if (i < GetFecGroupOffset(kIncludeVersion)) { |
| 792 expected_error = "Unable to read private flags."; | 819 expected_error = "Unable to read private flags."; |
| 793 } else { | 820 } else { |
| 794 expected_error = "Unable to read first fec protected packet offset."; | 821 expected_error = "Unable to read first fec protected packet offset."; |
| 795 } | 822 } |
| 796 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 823 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 797 } | 824 } |
| 798 } | 825 } |
| 799 | 826 |
| 827 TEST_F(QuicFramerTest, PacketHeaderWith4ByteSequenceNumber) { |
| 828 QuicFramerPeer::SetLastSequenceNumber(&framer_, |
| 829 GG_UINT64_C(0x123456789ABA)); |
| 830 |
| 831 unsigned char packet[] = { |
| 832 // public flags (8 byte guid and 4 byte sequence number) |
| 833 0x2C, |
| 834 // guid |
| 835 0x10, 0x32, 0x54, 0x76, |
| 836 0x98, 0xBA, 0xDC, 0xFE, |
| 837 // packet sequence number |
| 838 0xBC, 0x9A, 0x78, 0x56, |
| 839 // private flags |
| 840 0x00, |
| 841 }; |
| 842 |
| 843 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 844 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 845 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); |
| 846 ASSERT_TRUE(visitor_.header_.get()); |
| 847 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
| 848 visitor_.header_->public_header.guid); |
| 849 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 850 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 851 EXPECT_FALSE(visitor_.header_->fec_flag); |
| 852 EXPECT_FALSE(visitor_.header_->entropy_flag); |
| 853 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
| 854 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
| 855 visitor_.header_->packet_sequence_number); |
| 856 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
| 857 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
| 858 |
| 859 // Now test framing boundaries |
| 860 for (size_t i = 0; |
| 861 i < GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 862 PACKET_4BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); |
| 863 ++i) { |
| 864 string expected_error; |
| 865 if (i < kGuidOffset) { |
| 866 expected_error = "Unable to read public flags."; |
| 867 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { |
| 868 expected_error = "Unable to read GUID."; |
| 869 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, |
| 870 PACKET_4BYTE_SEQUENCE_NUMBER)) { |
| 871 expected_error = "Unable to read sequence number."; |
| 872 } else if (i < GetFecGroupOffset(!kIncludeVersion, |
| 873 PACKET_4BYTE_SEQUENCE_NUMBER)) { |
| 874 expected_error = "Unable to read private flags."; |
| 875 } else { |
| 876 expected_error = "Unable to read first fec protected packet offset."; |
| 877 } |
| 878 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 879 } |
| 880 } |
| 881 |
| 882 TEST_F(QuicFramerTest, PacketHeaderWith2ByteSequenceNumber) { |
| 883 QuicFramerPeer::SetLastSequenceNumber(&framer_, |
| 884 GG_UINT64_C(0x123456789ABA)); |
| 885 |
| 886 unsigned char packet[] = { |
| 887 // public flags (8 byte guid and 2 byte sequence number) |
| 888 0x1C, |
| 889 // guid |
| 890 0x10, 0x32, 0x54, 0x76, |
| 891 0x98, 0xBA, 0xDC, 0xFE, |
| 892 // packet sequence number |
| 893 0xBC, 0x9A, |
| 894 // private flags |
| 895 0x00, |
| 896 }; |
| 897 |
| 898 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 899 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 900 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); |
| 901 ASSERT_TRUE(visitor_.header_.get()); |
| 902 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
| 903 visitor_.header_->public_header.guid); |
| 904 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 905 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 906 EXPECT_FALSE(visitor_.header_->fec_flag); |
| 907 EXPECT_FALSE(visitor_.header_->entropy_flag); |
| 908 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
| 909 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
| 910 visitor_.header_->packet_sequence_number); |
| 911 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
| 912 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
| 913 |
| 914 // Now test framing boundaries |
| 915 for (size_t i = 0; |
| 916 i < GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 917 PACKET_2BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); |
| 918 ++i) { |
| 919 string expected_error; |
| 920 if (i < kGuidOffset) { |
| 921 expected_error = "Unable to read public flags."; |
| 922 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { |
| 923 expected_error = "Unable to read GUID."; |
| 924 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, |
| 925 PACKET_2BYTE_SEQUENCE_NUMBER)) { |
| 926 expected_error = "Unable to read sequence number."; |
| 927 } else if (i < GetFecGroupOffset(!kIncludeVersion, |
| 928 PACKET_2BYTE_SEQUENCE_NUMBER)) { |
| 929 expected_error = "Unable to read private flags."; |
| 930 } else { |
| 931 expected_error = "Unable to read first fec protected packet offset."; |
| 932 } |
| 933 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 934 } |
| 935 } |
| 936 |
| 937 TEST_F(QuicFramerTest, PacketHeaderWith1ByteSequenceNumber) { |
| 938 QuicFramerPeer::SetLastSequenceNumber(&framer_, |
| 939 GG_UINT64_C(0x123456789ABA)); |
| 940 |
| 941 unsigned char packet[] = { |
| 942 // public flags (8 byte guid and 1 byte sequence number) |
| 943 0x0C, |
| 944 // guid |
| 945 0x10, 0x32, 0x54, 0x76, |
| 946 0x98, 0xBA, 0xDC, 0xFE, |
| 947 // packet sequence number |
| 948 0xBC, |
| 949 // private flags |
| 950 0x00, |
| 951 }; |
| 952 |
| 953 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 954 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 955 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); |
| 956 ASSERT_TRUE(visitor_.header_.get()); |
| 957 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
| 958 visitor_.header_->public_header.guid); |
| 959 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 960 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 961 EXPECT_FALSE(visitor_.header_->fec_flag); |
| 962 EXPECT_FALSE(visitor_.header_->entropy_flag); |
| 963 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
| 964 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
| 965 visitor_.header_->packet_sequence_number); |
| 966 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
| 967 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
| 968 |
| 969 // Now test framing boundaries |
| 970 for (size_t i = 0; |
| 971 i < GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 972 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); |
| 973 ++i) { |
| 974 string expected_error; |
| 975 if (i < kGuidOffset) { |
| 976 expected_error = "Unable to read public flags."; |
| 977 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { |
| 978 expected_error = "Unable to read GUID."; |
| 979 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, |
| 980 PACKET_1BYTE_SEQUENCE_NUMBER)) { |
| 981 expected_error = "Unable to read sequence number."; |
| 982 } else if (i < GetFecGroupOffset(!kIncludeVersion, |
| 983 PACKET_1BYTE_SEQUENCE_NUMBER)) { |
| 984 expected_error = "Unable to read private flags."; |
| 985 } else { |
| 986 expected_error = "Unable to read first fec protected packet offset."; |
| 987 } |
| 988 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 989 } |
| 990 } |
| 800 | 991 |
| 801 TEST_F(QuicFramerTest, InvalidPublicFlag) { | 992 TEST_F(QuicFramerTest, InvalidPublicFlag) { |
| 802 unsigned char packet[] = { | 993 unsigned char packet[] = { |
| 803 // public flags (8 byte guid) | 994 // public flags |
| 804 0x10, | 995 0x40, |
| 805 // guid | 996 // guid |
| 806 0x10, 0x32, 0x54, 0x76, | 997 0x10, 0x32, 0x54, 0x76, |
| 807 0x98, 0xBA, 0xDC, 0xFE, | 998 0x98, 0xBA, 0xDC, 0xFE, |
| 808 // packet sequence number | 999 // packet sequence number |
| 809 0xBC, 0x9A, 0x78, 0x56, | 1000 0xBC, 0x9A, 0x78, 0x56, |
| 810 0x34, 0x12, | 1001 0x34, 0x12, |
| 1002 // private flags |
| 1003 0x00, |
| 1004 |
| 1005 // frame count |
| 1006 0x01, |
| 1007 // frame type (stream frame) |
| 1008 0x01, |
| 1009 // stream id |
| 1010 0x04, 0x03, 0x02, 0x01, |
| 1011 // fin |
| 1012 0x01, |
| 1013 // offset |
| 1014 0x54, 0x76, 0x10, 0x32, |
| 1015 0xDC, 0xFE, 0x98, 0xBA, |
| 1016 // data length |
| 1017 0x0c, 0x00, |
| 1018 // data |
| 1019 'h', 'e', 'l', 'l', |
| 1020 'o', ' ', 'w', 'o', |
| 1021 'r', 'l', 'd', '!', |
| 1022 }; |
| 1023 CheckProcessingFails(packet, |
| 1024 arraysize(packet), |
| 1025 "Illegal public flags value.", |
| 1026 QUIC_INVALID_PACKET_HEADER); |
| 1027 }; |
| 1028 |
| 1029 TEST_F(QuicFramerTest, InvalidPublicFlagWithMatchingVersions) { |
| 1030 unsigned char packet[] = { |
| 1031 // public flags (8 byte guid and version flag and an unknown flag) |
| 1032 0x4D, |
| 1033 // guid |
| 1034 0x10, 0x32, 0x54, 0x76, |
| 1035 0x98, 0xBA, 0xDC, 0xFE, |
| 1036 // version tag |
| 1037 'Q', '0', '0', '6', |
| 1038 // packet sequence number |
| 1039 0xBC, 0x9A, 0x78, 0x56, |
| 1040 0x34, 0x12, |
| 811 // private flags | 1041 // private flags |
| 812 0x00, | 1042 0x00, |
| 813 | 1043 |
| 814 // frame count | 1044 // frame count |
| 815 0x01, | 1045 0x01, |
| 816 // frame type (stream frame) | 1046 // frame type (stream frame) |
| 817 0x01, | 1047 0x01, |
| 818 // stream id | 1048 // stream id |
| 819 0x04, 0x03, 0x02, 0x01, | 1049 0x04, 0x03, 0x02, 0x01, |
| 820 // fin | 1050 // fin |
| 821 0x01, | 1051 0x01, |
| 822 // offset | 1052 // offset |
| 823 0x54, 0x76, 0x10, 0x32, | 1053 0x54, 0x76, 0x10, 0x32, |
| 824 0xDC, 0xFE, 0x98, 0xBA, | 1054 0xDC, 0xFE, 0x98, 0xBA, |
| 825 // data length | 1055 // data length |
| 826 0x0c, 0x00, | 1056 0x0c, 0x00, |
| 827 // data | 1057 // data |
| 828 'h', 'e', 'l', 'l', | 1058 'h', 'e', 'l', 'l', |
| 829 'o', ' ', 'w', 'o', | 1059 'o', ' ', 'w', 'o', |
| 830 'r', 'l', 'd', '!', | 1060 'r', 'l', 'd', '!', |
| 831 }; | 1061 }; |
| 832 CheckProcessingFails(packet, | 1062 CheckProcessingFails(packet, |
| 833 arraysize(packet), | 1063 arraysize(packet), |
| 834 "Illegal public flags value.", | 1064 "Illegal public flags value.", |
| 835 QUIC_INVALID_PACKET_HEADER); | 1065 QUIC_INVALID_PACKET_HEADER); |
| 836 }; | 1066 }; |
| 837 | 1067 |
| 1068 TEST_F(QuicFramerTest, LargePublicFlagWithMismatchedVersions) { |
| 1069 unsigned char packet[] = { |
| 1070 // public flags (8 byte guid, version flag and an unknown flag) |
| 1071 0x7D, |
| 1072 // guid |
| 1073 0x10, 0x32, 0x54, 0x76, |
| 1074 0x98, 0xBA, 0xDC, 0xFE, |
| 1075 // version tag |
| 1076 'Q', '0', '0', '0', |
| 1077 // packet sequence number |
| 1078 0xBC, 0x9A, 0x78, 0x56, |
| 1079 0x34, 0x12, |
| 1080 // private flags |
| 1081 0x00, |
| 1082 |
| 1083 // frame type (padding frame) |
| 1084 0x00, |
| 1085 }; |
| 1086 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1087 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1088 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1089 ASSERT_TRUE(visitor_.header_.get()); |
| 1090 EXPECT_EQ(0, visitor_.frame_count_); |
| 1091 EXPECT_EQ(1, visitor_.version_mismatch_); |
| 1092 }; |
| 1093 |
| 838 TEST_F(QuicFramerTest, InvalidPrivateFlag) { | 1094 TEST_F(QuicFramerTest, InvalidPrivateFlag) { |
| 839 unsigned char packet[] = { | 1095 unsigned char packet[] = { |
| 840 // public flags (8 byte guid) | 1096 // public flags (8 byte guid) |
| 841 0x0C, | 1097 0x3C, |
| 842 // guid | 1098 // guid |
| 843 0x10, 0x32, 0x54, 0x76, | 1099 0x10, 0x32, 0x54, 0x76, |
| 844 0x98, 0xBA, 0xDC, 0xFE, | 1100 0x98, 0xBA, 0xDC, 0xFE, |
| 845 // packet sequence number | 1101 // packet sequence number |
| 846 0xBC, 0x9A, 0x78, 0x56, | 1102 0xBC, 0x9A, 0x78, 0x56, |
| 847 0x34, 0x12, | 1103 0x34, 0x12, |
| 848 // private flags | 1104 // private flags |
| 849 0x10, | 1105 0x10, |
| 850 | 1106 |
| 851 // frame count | 1107 // frame count |
| (...skipping 16 matching lines...) Expand all Loading... |
| 868 }; | 1124 }; |
| 869 CheckProcessingFails(packet, | 1125 CheckProcessingFails(packet, |
| 870 arraysize(packet), | 1126 arraysize(packet), |
| 871 "Illegal private flags value.", | 1127 "Illegal private flags value.", |
| 872 QUIC_INVALID_PACKET_HEADER); | 1128 QUIC_INVALID_PACKET_HEADER); |
| 873 }; | 1129 }; |
| 874 | 1130 |
| 875 TEST_F(QuicFramerTest, PaddingFrame) { | 1131 TEST_F(QuicFramerTest, PaddingFrame) { |
| 876 unsigned char packet[] = { | 1132 unsigned char packet[] = { |
| 877 // public flags (8 byte guid) | 1133 // public flags (8 byte guid) |
| 878 0x0C, | 1134 0x3C, |
| 879 // guid | 1135 // guid |
| 880 0x10, 0x32, 0x54, 0x76, | 1136 0x10, 0x32, 0x54, 0x76, |
| 881 0x98, 0xBA, 0xDC, 0xFE, | 1137 0x98, 0xBA, 0xDC, 0xFE, |
| 882 // packet sequence number | 1138 // packet sequence number |
| 883 0xBC, 0x9A, 0x78, 0x56, | 1139 0xBC, 0x9A, 0x78, 0x56, |
| 884 0x34, 0x12, | 1140 0x34, 0x12, |
| 885 // private flags | 1141 // private flags |
| 886 0x00, | 1142 0x00, |
| 887 | 1143 |
| 888 // frame type (padding frame) | 1144 // frame type (padding frame) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 903 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1159 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 904 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1160 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 905 ASSERT_TRUE(visitor_.header_.get()); | 1161 ASSERT_TRUE(visitor_.header_.get()); |
| 906 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1162 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 907 | 1163 |
| 908 ASSERT_EQ(0u, visitor_.stream_frames_.size()); | 1164 ASSERT_EQ(0u, visitor_.stream_frames_.size()); |
| 909 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1165 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
| 910 // A packet with no frames is not acceptable. | 1166 // A packet with no frames is not acceptable. |
| 911 CheckProcessingFails( | 1167 CheckProcessingFails( |
| 912 packet, | 1168 packet, |
| 913 GetPacketHeaderSize( | 1169 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 914 PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP), | 1170 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 915 "Unable to read frame type.", QUIC_INVALID_FRAME_DATA); | 1171 "Unable to read frame type.", QUIC_INVALID_FRAME_DATA); |
| 916 } | 1172 } |
| 917 | 1173 |
| 918 TEST_F(QuicFramerTest, StreamFrame) { | 1174 TEST_F(QuicFramerTest, StreamFrame) { |
| 919 unsigned char packet[] = { | 1175 unsigned char packet[] = { |
| 920 // public flags (8 byte guid) | 1176 // public flags (8 byte guid) |
| 921 0x0C, | 1177 0x3C, |
| 922 // guid | 1178 // guid |
| 923 0x10, 0x32, 0x54, 0x76, | 1179 0x10, 0x32, 0x54, 0x76, |
| 924 0x98, 0xBA, 0xDC, 0xFE, | 1180 0x98, 0xBA, 0xDC, 0xFE, |
| 925 // packet sequence number | 1181 // packet sequence number |
| 926 0xBC, 0x9A, 0x78, 0x56, | 1182 0xBC, 0x9A, 0x78, 0x56, |
| 927 0x34, 0x12, | 1183 0x34, 0x12, |
| 928 // private flags | 1184 // private flags |
| 929 0x00, | 1185 0x00, |
| 930 | 1186 |
| 931 // frame type (stream frame) | 1187 // frame type (stream frame) |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 972 kQuicStreamFinSize) { | 1228 kQuicStreamFinSize) { |
| 973 expected_error = "Unable to read fin."; | 1229 expected_error = "Unable to read fin."; |
| 974 } else if (i < kQuicFrameTypeSize + kQuicStreamIdSize + | 1230 } else if (i < kQuicFrameTypeSize + kQuicStreamIdSize + |
| 975 kQuicStreamFinSize + kQuicStreamOffsetSize) { | 1231 kQuicStreamFinSize + kQuicStreamOffsetSize) { |
| 976 expected_error = "Unable to read offset."; | 1232 expected_error = "Unable to read offset."; |
| 977 } else { | 1233 } else { |
| 978 expected_error = "Unable to read frame data."; | 1234 expected_error = "Unable to read frame data."; |
| 979 } | 1235 } |
| 980 CheckProcessingFails( | 1236 CheckProcessingFails( |
| 981 packet, | 1237 packet, |
| 982 i + GetPacketHeaderSize( | 1238 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 983 PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP), | 1239 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 984 expected_error, QUIC_INVALID_FRAME_DATA); | 1240 expected_error, QUIC_INVALID_FRAME_DATA); |
| 985 } | 1241 } |
| 986 } | 1242 } |
| 987 | 1243 |
| 988 TEST_F(QuicFramerTest, StreamFrameWithVersion) { | 1244 TEST_F(QuicFramerTest, StreamFrameWithVersion) { |
| 989 unsigned char packet[] = { | 1245 unsigned char packet[] = { |
| 990 // public flags (version, 8 byte guid) | 1246 // public flags (version, 8 byte guid) |
| 991 0x0D, | 1247 0x3D, |
| 992 // guid | 1248 // guid |
| 993 0x10, 0x32, 0x54, 0x76, | 1249 0x10, 0x32, 0x54, 0x76, |
| 994 0x98, 0xBA, 0xDC, 0xFE, | 1250 0x98, 0xBA, 0xDC, 0xFE, |
| 995 // version tag | 1251 // version tag |
| 996 'Q', '0', '0', '5', | 1252 'Q', '0', '0', '6', |
| 997 // packet sequence number | 1253 // packet sequence number |
| 998 0xBC, 0x9A, 0x78, 0x56, | 1254 0xBC, 0x9A, 0x78, 0x56, |
| 999 0x34, 0x12, | 1255 0x34, 0x12, |
| 1000 // private flags | 1256 // private flags |
| 1001 0x00, | 1257 0x00, |
| 1002 | 1258 |
| 1003 // frame type (stream frame) | 1259 // frame type (stream frame) |
| 1004 0x01, | 1260 0x01, |
| 1005 // stream id | 1261 // stream id |
| 1006 0x04, 0x03, 0x02, 0x01, | 1262 0x04, 0x03, 0x02, 0x01, |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1045 } else if (i < kQuicFrameTypeSize + kQuicStreamIdSize + | 1301 } else if (i < kQuicFrameTypeSize + kQuicStreamIdSize + |
| 1046 kQuicStreamFinSize) { | 1302 kQuicStreamFinSize) { |
| 1047 expected_error = "Unable to read fin."; | 1303 expected_error = "Unable to read fin."; |
| 1048 } else if (i < kQuicFrameTypeSize + kQuicStreamIdSize + | 1304 } else if (i < kQuicFrameTypeSize + kQuicStreamIdSize + |
| 1049 kQuicStreamFinSize + kQuicStreamOffsetSize) { | 1305 kQuicStreamFinSize + kQuicStreamOffsetSize) { |
| 1050 expected_error = "Unable to read offset."; | 1306 expected_error = "Unable to read offset."; |
| 1051 } else { | 1307 } else { |
| 1052 expected_error = "Unable to read frame data."; | 1308 expected_error = "Unable to read frame data."; |
| 1053 } | 1309 } |
| 1054 CheckProcessingFails( | 1310 CheckProcessingFails( |
| 1055 packet, i + GetPacketHeaderSize(PACKET_8BYTE_GUID, kIncludeVersion, | 1311 packet, |
| 1056 NOT_IN_FEC_GROUP), | 1312 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, kIncludeVersion, |
| 1313 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 1057 expected_error, QUIC_INVALID_FRAME_DATA); | 1314 expected_error, QUIC_INVALID_FRAME_DATA); |
| 1058 } | 1315 } |
| 1059 } | 1316 } |
| 1060 | 1317 |
| 1061 TEST_F(QuicFramerTest, RejectPacket) { | 1318 TEST_F(QuicFramerTest, RejectPacket) { |
| 1062 visitor_.accept_packet_ = false; | 1319 visitor_.accept_packet_ = false; |
| 1063 | 1320 |
| 1064 unsigned char packet[] = { | 1321 unsigned char packet[] = { |
| 1065 // public flags (8 byte guid) | 1322 // public flags (8 byte guid) |
| 1066 0x0C, | 1323 0x3C, |
| 1067 // guid | 1324 // guid |
| 1068 0x10, 0x32, 0x54, 0x76, | 1325 0x10, 0x32, 0x54, 0x76, |
| 1069 0x98, 0xBA, 0xDC, 0xFE, | 1326 0x98, 0xBA, 0xDC, 0xFE, |
| 1070 // packet sequence number | 1327 // packet sequence number |
| 1071 0xBC, 0x9A, 0x78, 0x56, | 1328 0xBC, 0x9A, 0x78, 0x56, |
| 1072 0x34, 0x12, | 1329 0x34, 0x12, |
| 1073 // private flags | 1330 // private flags |
| 1074 0x00, | 1331 0x00, |
| 1075 | 1332 |
| 1076 // frame type (stream frame) | 1333 // frame type (stream frame) |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1155 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); | 1412 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); |
| 1156 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1413 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
| 1157 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1414 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
| 1158 visitor_.stream_frames_[0]->offset); | 1415 visitor_.stream_frames_[0]->offset); |
| 1159 EXPECT_EQ("hello world!", visitor_.stream_frames_[0]->data); | 1416 EXPECT_EQ("hello world!", visitor_.stream_frames_[0]->data); |
| 1160 } | 1417 } |
| 1161 | 1418 |
| 1162 TEST_F(QuicFramerTest, StreamFrameInFecGroup) { | 1419 TEST_F(QuicFramerTest, StreamFrameInFecGroup) { |
| 1163 unsigned char packet[] = { | 1420 unsigned char packet[] = { |
| 1164 // public flags (8 byte guid) | 1421 // public flags (8 byte guid) |
| 1165 0x0C, | 1422 0x3C, |
| 1166 // guid | 1423 // guid |
| 1167 0x10, 0x32, 0x54, 0x76, | 1424 0x10, 0x32, 0x54, 0x76, |
| 1168 0x98, 0xBA, 0xDC, 0xFE, | 1425 0x98, 0xBA, 0xDC, 0xFE, |
| 1169 // packet sequence number | 1426 // packet sequence number |
| 1170 0xBC, 0x9A, 0x78, 0x56, | 1427 0xBC, 0x9A, 0x78, 0x56, |
| 1171 0x12, 0x34, | 1428 0x12, 0x34, |
| 1172 // private flags (fec group) | 1429 // private flags (fec group) |
| 1173 0x02, | 1430 0x02, |
| 1174 // first fec protected packet offset | 1431 // first fec protected packet offset |
| 1175 0x02, | 1432 0x02, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1193 | 1450 |
| 1194 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1451 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1195 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1452 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1196 | 1453 |
| 1197 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1454 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1198 ASSERT_TRUE(visitor_.header_.get()); | 1455 ASSERT_TRUE(visitor_.header_.get()); |
| 1199 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1456 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 1200 EXPECT_EQ(IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 1457 EXPECT_EQ(IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
| 1201 EXPECT_EQ(GG_UINT64_C(0x341256789ABA), | 1458 EXPECT_EQ(GG_UINT64_C(0x341256789ABA), |
| 1202 visitor_.header_->fec_group); | 1459 visitor_.header_->fec_group); |
| 1460 const size_t fec_offset = GetStartOfFecProtectedData( |
| 1461 PACKET_8BYTE_GUID, !kIncludeVersion, PACKET_6BYTE_SEQUENCE_NUMBER); |
| 1203 EXPECT_EQ( | 1462 EXPECT_EQ( |
| 1204 string(AsChars(packet) + GetStartOfFecProtectedData(PACKET_8BYTE_GUID, | 1463 string(AsChars(packet) + fec_offset, arraysize(packet) - fec_offset), |
| 1205 !kIncludeVersion), | |
| 1206 arraysize(packet) - GetStartOfFecProtectedData(PACKET_8BYTE_GUID, | |
| 1207 !kIncludeVersion)), | |
| 1208 visitor_.fec_protected_payload_); | 1464 visitor_.fec_protected_payload_); |
| 1209 | 1465 |
| 1210 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1466 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
| 1211 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1467 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
| 1212 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); | 1468 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); |
| 1213 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1469 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
| 1214 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1470 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
| 1215 visitor_.stream_frames_[0]->offset); | 1471 visitor_.stream_frames_[0]->offset); |
| 1216 EXPECT_EQ("hello world!", visitor_.stream_frames_[0]->data); | 1472 EXPECT_EQ("hello world!", visitor_.stream_frames_[0]->data); |
| 1217 } | 1473 } |
| 1218 | 1474 |
| 1219 TEST_F(QuicFramerTest, AckFrame) { | 1475 TEST_F(QuicFramerTest, AckFrame) { |
| 1220 unsigned char packet[] = { | 1476 unsigned char packet[] = { |
| 1221 // public flags (8 byte guid) | 1477 // public flags (8 byte guid) |
| 1222 0x0C, | 1478 0x3C, |
| 1223 // guid | 1479 // guid |
| 1224 0x10, 0x32, 0x54, 0x76, | 1480 0x10, 0x32, 0x54, 0x76, |
| 1225 0x98, 0xBA, 0xDC, 0xFE, | 1481 0x98, 0xBA, 0xDC, 0xFE, |
| 1226 // packet sequence number | 1482 // packet sequence number |
| 1227 0xBC, 0x9A, 0x78, 0x56, | 1483 0xBC, 0x9A, 0x78, 0x56, |
| 1228 0x34, 0x12, | 1484 0x34, 0x12, |
| 1229 // private flags | 1485 // private flags |
| 1230 0x00, | 1486 0x00, |
| 1231 | 1487 |
| 1232 // frame type (ack frame) | 1488 // frame type (ack frame) |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1265 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); | 1521 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); |
| 1266 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); | 1522 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); |
| 1267 SequenceNumberSet::const_iterator missing_iter = | 1523 SequenceNumberSet::const_iterator missing_iter = |
| 1268 frame.received_info.missing_packets.begin(); | 1524 frame.received_info.missing_packets.begin(); |
| 1269 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); | 1525 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); |
| 1270 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked); | 1526 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked); |
| 1271 | 1527 |
| 1272 const size_t kSentEntropyOffset = kQuicFrameTypeSize; | 1528 const size_t kSentEntropyOffset = kQuicFrameTypeSize; |
| 1273 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; | 1529 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; |
| 1274 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + | 1530 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + |
| 1275 kSequenceNumberSize; | 1531 PACKET_6BYTE_SEQUENCE_NUMBER; |
| 1276 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 1532 const size_t kLargestObservedOffset = kReceivedEntropyOffset + |
| 1277 kQuicEntropyHashSize; | 1533 kQuicEntropyHashSize; |
| 1278 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | 1534 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + |
| 1279 kSequenceNumberSize; | 1535 PACKET_6BYTE_SEQUENCE_NUMBER; |
| 1280 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | 1536 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + |
| 1281 kQuicDeltaTimeLargestObservedSize; | 1537 kQuicDeltaTimeLargestObservedSize; |
| 1282 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | 1538 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + |
| 1283 kNumberOfMissingPacketsSize; | 1539 kNumberOfMissingPacketsSize; |
| 1284 // Now test framing boundaries | 1540 // Now test framing boundaries |
| 1285 const size_t missing_packets_size = 1 * kSequenceNumberSize; | 1541 const size_t missing_packets_size = 1 * PACKET_6BYTE_SEQUENCE_NUMBER; |
| 1286 for (size_t i = 0; | 1542 for (size_t i = 0; |
| 1287 i < QuicFramer::GetMinAckFrameSize() + missing_packets_size; ++i) { | 1543 i < QuicFramer::GetMinAckFrameSize() + missing_packets_size; ++i) { |
| 1288 string expected_error; | 1544 string expected_error; |
| 1289 if (i < kSentEntropyOffset) { | 1545 if (i < kSentEntropyOffset) { |
| 1290 expected_error = "Unable to read frame type."; | 1546 expected_error = "Unable to read frame type."; |
| 1291 } else if (i < kLeastUnackedOffset) { | 1547 } else if (i < kLeastUnackedOffset) { |
| 1292 expected_error = "Unable to read entropy hash for sent packets."; | 1548 expected_error = "Unable to read entropy hash for sent packets."; |
| 1293 } else if (i < kReceivedEntropyOffset) { | 1549 } else if (i < kReceivedEntropyOffset) { |
| 1294 expected_error = "Unable to read least unacked."; | 1550 expected_error = "Unable to read least unacked."; |
| 1295 } else if (i < kLargestObservedOffset) { | 1551 } else if (i < kLargestObservedOffset) { |
| 1296 expected_error = "Unable to read entropy hash for received packets."; | 1552 expected_error = "Unable to read entropy hash for received packets."; |
| 1297 } else if (i < kMissingDeltaTimeOffset) { | 1553 } else if (i < kMissingDeltaTimeOffset) { |
| 1298 expected_error = "Unable to read largest observed."; | 1554 expected_error = "Unable to read largest observed."; |
| 1299 } else if (i < kNumMissingPacketOffset) { | 1555 } else if (i < kNumMissingPacketOffset) { |
| 1300 expected_error = "Unable to read delta time largest observed."; | 1556 expected_error = "Unable to read delta time largest observed."; |
| 1301 } else if (i < kMissingPacketsOffset) { | 1557 } else if (i < kMissingPacketsOffset) { |
| 1302 expected_error = "Unable to read num missing packets."; | 1558 expected_error = "Unable to read num missing packets."; |
| 1303 } else { | 1559 } else { |
| 1304 expected_error = "Unable to read sequence number in missing packets."; | 1560 expected_error = "Unable to read sequence number in missing packets."; |
| 1305 } | 1561 } |
| 1306 CheckProcessingFails( | 1562 CheckProcessingFails( |
| 1307 packet, | 1563 packet, |
| 1308 i + GetPacketHeaderSize( | 1564 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 1309 PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP), | 1565 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 1310 expected_error, QUIC_INVALID_FRAME_DATA); | 1566 expected_error, QUIC_INVALID_FRAME_DATA); |
| 1311 } | 1567 } |
| 1312 } | 1568 } |
| 1313 | 1569 |
| 1314 TEST_F(QuicFramerTest, CongestionFeedbackFrameTCP) { | 1570 TEST_F(QuicFramerTest, CongestionFeedbackFrameTCP) { |
| 1315 unsigned char packet[] = { | 1571 unsigned char packet[] = { |
| 1316 // public flags (8 byte guid) | 1572 // public flags (8 byte guid) |
| 1317 0x0C, | 1573 0x3C, |
| 1318 // guid | 1574 // guid |
| 1319 0x10, 0x32, 0x54, 0x76, | 1575 0x10, 0x32, 0x54, 0x76, |
| 1320 0x98, 0xBA, 0xDC, 0xFE, | 1576 0x98, 0xBA, 0xDC, 0xFE, |
| 1321 // packet sequence number | 1577 // packet sequence number |
| 1322 0xBC, 0x9A, 0x78, 0x56, | 1578 0xBC, 0x9A, 0x78, 0x56, |
| 1323 0x34, 0x12, | 1579 0x34, 0x12, |
| 1324 // private flags | 1580 // private flags |
| 1325 0x00, | 1581 0x00, |
| 1326 | 1582 |
| 1327 // frame type (congestion feedback frame) | 1583 // frame type (congestion feedback frame) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1357 expected_error = "Unable to read frame type."; | 1613 expected_error = "Unable to read frame type."; |
| 1358 } else if (i < 2) { | 1614 } else if (i < 2) { |
| 1359 expected_error = "Unable to read congestion feedback type."; | 1615 expected_error = "Unable to read congestion feedback type."; |
| 1360 } else if (i < 4) { | 1616 } else if (i < 4) { |
| 1361 expected_error = "Unable to read accumulated number of lost packets."; | 1617 expected_error = "Unable to read accumulated number of lost packets."; |
| 1362 } else if (i < 6) { | 1618 } else if (i < 6) { |
| 1363 expected_error = "Unable to read receive window."; | 1619 expected_error = "Unable to read receive window."; |
| 1364 } | 1620 } |
| 1365 CheckProcessingFails( | 1621 CheckProcessingFails( |
| 1366 packet, | 1622 packet, |
| 1367 i + GetPacketHeaderSize( | 1623 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 1368 PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP), | 1624 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 1369 expected_error, QUIC_INVALID_FRAME_DATA); | 1625 expected_error, QUIC_INVALID_FRAME_DATA); |
| 1370 } | 1626 } |
| 1371 } | 1627 } |
| 1372 | 1628 |
| 1373 TEST_F(QuicFramerTest, CongestionFeedbackFrameInterArrival) { | 1629 TEST_F(QuicFramerTest, CongestionFeedbackFrameInterArrival) { |
| 1374 unsigned char packet[] = { | 1630 unsigned char packet[] = { |
| 1375 // public flags (8 byte guid) | 1631 // public flags (8 byte guid) |
| 1376 0x0C, | 1632 0x3C, |
| 1377 // guid | 1633 // guid |
| 1378 0x10, 0x32, 0x54, 0x76, | 1634 0x10, 0x32, 0x54, 0x76, |
| 1379 0x98, 0xBA, 0xDC, 0xFE, | 1635 0x98, 0xBA, 0xDC, 0xFE, |
| 1380 // packet sequence number | 1636 // packet sequence number |
| 1381 0xBC, 0x9A, 0x78, 0x56, | 1637 0xBC, 0x9A, 0x78, 0x56, |
| 1382 0x34, 0x12, | 1638 0x34, 0x12, |
| 1383 // private flags | 1639 // private flags |
| 1384 0x00, | 1640 0x00, |
| 1385 | 1641 |
| 1386 // frame type (congestion feedback frame) | 1642 // frame type (congestion feedback frame) |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1455 expected_error = "Unable to read sequence delta in received packets."; | 1711 expected_error = "Unable to read sequence delta in received packets."; |
| 1456 } else if (i < 25) { | 1712 } else if (i < 25) { |
| 1457 expected_error = "Unable to read time delta in received packets."; | 1713 expected_error = "Unable to read time delta in received packets."; |
| 1458 } else if (i < 27) { | 1714 } else if (i < 27) { |
| 1459 expected_error = "Unable to read sequence delta in received packets."; | 1715 expected_error = "Unable to read sequence delta in received packets."; |
| 1460 } else if (i < 31) { | 1716 } else if (i < 31) { |
| 1461 expected_error = "Unable to read time delta in received packets."; | 1717 expected_error = "Unable to read time delta in received packets."; |
| 1462 } | 1718 } |
| 1463 CheckProcessingFails( | 1719 CheckProcessingFails( |
| 1464 packet, | 1720 packet, |
| 1465 i + GetPacketHeaderSize( | 1721 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 1466 PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP), | 1722 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 1467 expected_error, QUIC_INVALID_FRAME_DATA); | 1723 expected_error, QUIC_INVALID_FRAME_DATA); |
| 1468 } | 1724 } |
| 1469 } | 1725 } |
| 1470 | 1726 |
| 1471 TEST_F(QuicFramerTest, CongestionFeedbackFrameFixRate) { | 1727 TEST_F(QuicFramerTest, CongestionFeedbackFrameFixRate) { |
| 1472 unsigned char packet[] = { | 1728 unsigned char packet[] = { |
| 1473 // public flags (8 byte guid) | 1729 // public flags (8 byte guid) |
| 1474 0x0C, | 1730 0x3C, |
| 1475 // guid | 1731 // guid |
| 1476 0x10, 0x32, 0x54, 0x76, | 1732 0x10, 0x32, 0x54, 0x76, |
| 1477 0x98, 0xBA, 0xDC, 0xFE, | 1733 0x98, 0xBA, 0xDC, 0xFE, |
| 1478 // packet sequence number | 1734 // packet sequence number |
| 1479 0xBC, 0x9A, 0x78, 0x56, | 1735 0xBC, 0x9A, 0x78, 0x56, |
| 1480 0x34, 0x12, | 1736 0x34, 0x12, |
| 1481 // private flags | 1737 // private flags |
| 1482 0x00, | 1738 0x00, |
| 1483 | 1739 |
| 1484 // frame type (congestion feedback frame) | 1740 // frame type (congestion feedback frame) |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1509 string expected_error; | 1765 string expected_error; |
| 1510 if (i < 1) { | 1766 if (i < 1) { |
| 1511 expected_error = "Unable to read frame type."; | 1767 expected_error = "Unable to read frame type."; |
| 1512 } else if (i < 2) { | 1768 } else if (i < 2) { |
| 1513 expected_error = "Unable to read congestion feedback type."; | 1769 expected_error = "Unable to read congestion feedback type."; |
| 1514 } else if (i < 6) { | 1770 } else if (i < 6) { |
| 1515 expected_error = "Unable to read bitrate."; | 1771 expected_error = "Unable to read bitrate."; |
| 1516 } | 1772 } |
| 1517 CheckProcessingFails( | 1773 CheckProcessingFails( |
| 1518 packet, | 1774 packet, |
| 1519 i + GetPacketHeaderSize( | 1775 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 1520 PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP), | 1776 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 1521 expected_error, QUIC_INVALID_FRAME_DATA); | 1777 expected_error, QUIC_INVALID_FRAME_DATA); |
| 1522 } | 1778 } |
| 1523 } | 1779 } |
| 1524 | 1780 |
| 1525 | 1781 |
| 1526 TEST_F(QuicFramerTest, CongestionFeedbackFrameInvalidFeedback) { | 1782 TEST_F(QuicFramerTest, CongestionFeedbackFrameInvalidFeedback) { |
| 1527 unsigned char packet[] = { | 1783 unsigned char packet[] = { |
| 1528 // public flags (8 byte guid) | 1784 // public flags (8 byte guid) |
| 1529 0x0C, | 1785 0x3C, |
| 1530 // guid | 1786 // guid |
| 1531 0x10, 0x32, 0x54, 0x76, | 1787 0x10, 0x32, 0x54, 0x76, |
| 1532 0x98, 0xBA, 0xDC, 0xFE, | 1788 0x98, 0xBA, 0xDC, 0xFE, |
| 1533 // packet sequence number | 1789 // packet sequence number |
| 1534 0xBC, 0x9A, 0x78, 0x56, | 1790 0xBC, 0x9A, 0x78, 0x56, |
| 1535 0x34, 0x12, | 1791 0x34, 0x12, |
| 1536 // private flags | 1792 // private flags |
| 1537 0x00, | 1793 0x00, |
| 1538 | 1794 |
| 1539 // frame type (congestion feedback frame) | 1795 // frame type (congestion feedback frame) |
| 1540 0x03, | 1796 0x03, |
| 1541 // congestion feedback type (invalid) | 1797 // congestion feedback type (invalid) |
| 1542 0x03, | 1798 0x03, |
| 1543 }; | 1799 }; |
| 1544 | 1800 |
| 1545 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1801 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1546 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 1802 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 1547 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1803 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 1548 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); | 1804 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); |
| 1549 } | 1805 } |
| 1550 | 1806 |
| 1551 TEST_F(QuicFramerTest, RstStreamFrame) { | 1807 TEST_F(QuicFramerTest, RstStreamFrame) { |
| 1552 unsigned char packet[] = { | 1808 unsigned char packet[] = { |
| 1553 // public flags (8 byte guid) | 1809 // public flags (8 byte guid) |
| 1554 0x0C, | 1810 0x3C, |
| 1555 // guid | 1811 // guid |
| 1556 0x10, 0x32, 0x54, 0x76, | 1812 0x10, 0x32, 0x54, 0x76, |
| 1557 0x98, 0xBA, 0xDC, 0xFE, | 1813 0x98, 0xBA, 0xDC, 0xFE, |
| 1558 // packet sequence number | 1814 // packet sequence number |
| 1559 0xBC, 0x9A, 0x78, 0x56, | 1815 0xBC, 0x9A, 0x78, 0x56, |
| 1560 0x34, 0x12, | 1816 0x34, 0x12, |
| 1561 // private flags | 1817 // private flags |
| 1562 0x00, | 1818 0x00, |
| 1563 | 1819 |
| 1564 // frame type (rst stream frame) | 1820 // frame type (rst stream frame) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1594 if (i < kQuicFrameTypeSize + kQuicStreamIdSize) { | 1850 if (i < kQuicFrameTypeSize + kQuicStreamIdSize) { |
| 1595 expected_error = "Unable to read stream_id."; | 1851 expected_error = "Unable to read stream_id."; |
| 1596 } else if (i < kQuicFrameTypeSize + kQuicStreamIdSize + | 1852 } else if (i < kQuicFrameTypeSize + kQuicStreamIdSize + |
| 1597 kQuicErrorCodeSize) { | 1853 kQuicErrorCodeSize) { |
| 1598 expected_error = "Unable to read rst stream error code."; | 1854 expected_error = "Unable to read rst stream error code."; |
| 1599 } else { | 1855 } else { |
| 1600 expected_error = "Unable to read rst stream error details."; | 1856 expected_error = "Unable to read rst stream error details."; |
| 1601 } | 1857 } |
| 1602 CheckProcessingFails( | 1858 CheckProcessingFails( |
| 1603 packet, | 1859 packet, |
| 1604 i + GetPacketHeaderSize( | 1860 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 1605 PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP), | 1861 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 1606 expected_error, QUIC_INVALID_RST_STREAM_DATA); | 1862 expected_error, QUIC_INVALID_RST_STREAM_DATA); |
| 1607 } | 1863 } |
| 1608 } | 1864 } |
| 1609 | 1865 |
| 1610 TEST_F(QuicFramerTest, ConnectionCloseFrame) { | 1866 TEST_F(QuicFramerTest, ConnectionCloseFrame) { |
| 1611 unsigned char packet[] = { | 1867 unsigned char packet[] = { |
| 1612 // public flags (8 byte guid) | 1868 // public flags (8 byte guid) |
| 1613 0x0C, | 1869 0x3C, |
| 1614 // guid | 1870 // guid |
| 1615 0x10, 0x32, 0x54, 0x76, | 1871 0x10, 0x32, 0x54, 0x76, |
| 1616 0x98, 0xBA, 0xDC, 0xFE, | 1872 0x98, 0xBA, 0xDC, 0xFE, |
| 1617 // packet sequence number | 1873 // packet sequence number |
| 1618 0xBC, 0x9A, 0x78, 0x56, | 1874 0xBC, 0x9A, 0x78, 0x56, |
| 1619 0x34, 0x12, | 1875 0x34, 0x12, |
| 1620 // private flags | 1876 // private flags |
| 1621 0x00, | 1877 0x00, |
| 1622 | 1878 |
| 1623 // frame type (connection close frame) | 1879 // frame type (connection close frame) |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1681 i < QuicFramer::GetMinConnectionCloseFrameSize() - | 1937 i < QuicFramer::GetMinConnectionCloseFrameSize() - |
| 1682 QuicFramer::GetMinAckFrameSize(); ++i) { | 1938 QuicFramer::GetMinAckFrameSize(); ++i) { |
| 1683 string expected_error; | 1939 string expected_error; |
| 1684 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { | 1940 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { |
| 1685 expected_error = "Unable to read connection close error code."; | 1941 expected_error = "Unable to read connection close error code."; |
| 1686 } else { | 1942 } else { |
| 1687 expected_error = "Unable to read connection close error details."; | 1943 expected_error = "Unable to read connection close error details."; |
| 1688 } | 1944 } |
| 1689 CheckProcessingFails( | 1945 CheckProcessingFails( |
| 1690 packet, | 1946 packet, |
| 1691 i + GetPacketHeaderSize( | 1947 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 1692 PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP), | 1948 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 1693 expected_error, QUIC_INVALID_CONNECTION_CLOSE_DATA); | 1949 expected_error, QUIC_INVALID_CONNECTION_CLOSE_DATA); |
| 1694 } | 1950 } |
| 1695 } | 1951 } |
| 1696 | 1952 |
| 1697 TEST_F(QuicFramerTest, GoAwayFrame) { | 1953 TEST_F(QuicFramerTest, GoAwayFrame) { |
| 1698 unsigned char packet[] = { | 1954 unsigned char packet[] = { |
| 1699 // public flags (8 byte guid) | 1955 // public flags (8 byte guid) |
| 1700 0x0C, | 1956 0x3C, |
| 1701 // guid | 1957 // guid |
| 1702 0x10, 0x32, 0x54, 0x76, | 1958 0x10, 0x32, 0x54, 0x76, |
| 1703 0x98, 0xBA, 0xDC, 0xFE, | 1959 0x98, 0xBA, 0xDC, 0xFE, |
| 1704 // packet sequence number | 1960 // packet sequence number |
| 1705 0xBC, 0x9A, 0x78, 0x56, | 1961 0xBC, 0x9A, 0x78, 0x56, |
| 1706 0x34, 0x12, | 1962 0x34, 0x12, |
| 1707 // private flags | 1963 // private flags |
| 1708 0x00, | 1964 0x00, |
| 1709 | 1965 |
| 1710 // frame type (go away frame) | 1966 // frame type (go away frame) |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1742 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { | 1998 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { |
| 1743 expected_error = "Unable to read go away error code."; | 1999 expected_error = "Unable to read go away error code."; |
| 1744 } else if (i < kQuicFrameTypeSize + kQuicErrorCodeSize + | 2000 } else if (i < kQuicFrameTypeSize + kQuicErrorCodeSize + |
| 1745 kQuicStreamIdSize) { | 2001 kQuicStreamIdSize) { |
| 1746 expected_error = "Unable to read last good stream id."; | 2002 expected_error = "Unable to read last good stream id."; |
| 1747 } else { | 2003 } else { |
| 1748 expected_error = "Unable to read goaway reason."; | 2004 expected_error = "Unable to read goaway reason."; |
| 1749 } | 2005 } |
| 1750 CheckProcessingFails( | 2006 CheckProcessingFails( |
| 1751 packet, | 2007 packet, |
| 1752 i + GetPacketHeaderSize( | 2008 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 1753 PACKET_8BYTE_GUID, !kIncludeVersion, NOT_IN_FEC_GROUP), | 2009 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 1754 expected_error, QUIC_INVALID_GOAWAY_DATA); | 2010 expected_error, QUIC_INVALID_GOAWAY_DATA); |
| 1755 } | 2011 } |
| 1756 } | 2012 } |
| 1757 | 2013 |
| 1758 TEST_F(QuicFramerTest, PublicResetPacket) { | 2014 TEST_F(QuicFramerTest, PublicResetPacket) { |
| 1759 unsigned char packet[] = { | 2015 unsigned char packet[] = { |
| 1760 // public flags (public reset, 8 byte guid) | 2016 // public flags (public reset, 8 byte guid) |
| 1761 0x0E, | 2017 0x3E, |
| 1762 // guid | 2018 // guid |
| 1763 0x10, 0x32, 0x54, 0x76, | 2019 0x10, 0x32, 0x54, 0x76, |
| 1764 0x98, 0xBA, 0xDC, 0xFE, | 2020 0x98, 0xBA, 0xDC, 0xFE, |
| 1765 // nonce proof | 2021 // nonce proof |
| 1766 0x89, 0x67, 0x45, 0x23, | 2022 0x89, 0x67, 0x45, 0x23, |
| 1767 0x01, 0xEF, 0xCD, 0xAB, | 2023 0x01, 0xEF, 0xCD, 0xAB, |
| 1768 // rejected sequence number | 2024 // rejected sequence number |
| 1769 0xBC, 0x9A, 0x78, 0x56, | 2025 0xBC, 0x9A, 0x78, 0x56, |
| 1770 0x34, 0x12, | 2026 0x34, 0x12, |
| 1771 }; | 2027 }; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1803 expected_error = "Unable to read rejected sequence number."; | 2059 expected_error = "Unable to read rejected sequence number."; |
| 1804 CheckProcessingFails(packet, i, expected_error, | 2060 CheckProcessingFails(packet, i, expected_error, |
| 1805 QUIC_INVALID_PUBLIC_RST_PACKET); | 2061 QUIC_INVALID_PUBLIC_RST_PACKET); |
| 1806 } | 2062 } |
| 1807 } | 2063 } |
| 1808 } | 2064 } |
| 1809 | 2065 |
| 1810 TEST_F(QuicFramerTest, VersionNegotiationPacket) { | 2066 TEST_F(QuicFramerTest, VersionNegotiationPacket) { |
| 1811 unsigned char packet[] = { | 2067 unsigned char packet[] = { |
| 1812 // public flags (version, 8 byte guid) | 2068 // public flags (version, 8 byte guid) |
| 1813 0x0D, | 2069 0x3D, |
| 1814 // guid | 2070 // guid |
| 1815 0x10, 0x32, 0x54, 0x76, | 2071 0x10, 0x32, 0x54, 0x76, |
| 1816 0x98, 0xBA, 0xDC, 0xFE, | 2072 0x98, 0xBA, 0xDC, 0xFE, |
| 1817 // version tag | 2073 // version tag |
| 1818 'Q', '0', '0', '5', | 2074 'Q', '0', '0', '6', |
| 1819 'Q', '2', '.', '0', | 2075 'Q', '2', '.', '0', |
| 1820 }; | 2076 }; |
| 1821 | 2077 |
| 1822 QuicFramerPeer::SetIsServer(&framer_, false); | 2078 QuicFramerPeer::SetIsServer(&framer_, false); |
| 1823 | 2079 |
| 1824 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2080 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1825 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2081 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1826 ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); | 2082 ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1827 ASSERT_TRUE(visitor_.version_negotiation_packet_.get()); | 2083 ASSERT_TRUE(visitor_.version_negotiation_packet_.get()); |
| 1828 EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size()); | 2084 EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1840 expected_error = "Unable to read supported version in negotiation."; | 2096 expected_error = "Unable to read supported version in negotiation."; |
| 1841 error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET; | 2097 error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET; |
| 1842 } | 2098 } |
| 1843 CheckProcessingFails(packet, i, expected_error, error_code); | 2099 CheckProcessingFails(packet, i, expected_error, error_code); |
| 1844 } | 2100 } |
| 1845 } | 2101 } |
| 1846 | 2102 |
| 1847 TEST_F(QuicFramerTest, FecPacket) { | 2103 TEST_F(QuicFramerTest, FecPacket) { |
| 1848 unsigned char packet[] = { | 2104 unsigned char packet[] = { |
| 1849 // public flags (8 byte guid) | 2105 // public flags (8 byte guid) |
| 1850 0x0C, | 2106 0x3C, |
| 1851 // guid | 2107 // guid |
| 1852 0x10, 0x32, 0x54, 0x76, | 2108 0x10, 0x32, 0x54, 0x76, |
| 1853 0x98, 0xBA, 0xDC, 0xFE, | 2109 0x98, 0xBA, 0xDC, 0xFE, |
| 1854 // packet sequence number | 2110 // packet sequence number |
| 1855 0xBC, 0x9A, 0x78, 0x56, | 2111 0xBC, 0x9A, 0x78, 0x56, |
| 1856 0x34, 0x12, | 2112 0x34, 0x12, |
| 1857 // private flags (fec group & FEC) | 2113 // private flags (fec group & FEC) |
| 1858 0x06, | 2114 0x06, |
| 1859 // first fec protected packet offset | 2115 // first fec protected packet offset |
| 1860 0x01, | 2116 0x01, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1891 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 2147 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
| 1892 header.fec_group = 0; | 2148 header.fec_group = 0; |
| 1893 | 2149 |
| 1894 QuicPaddingFrame padding_frame; | 2150 QuicPaddingFrame padding_frame; |
| 1895 | 2151 |
| 1896 QuicFrames frames; | 2152 QuicFrames frames; |
| 1897 frames.push_back(QuicFrame(&padding_frame)); | 2153 frames.push_back(QuicFrame(&padding_frame)); |
| 1898 | 2154 |
| 1899 unsigned char packet[kMaxPacketSize] = { | 2155 unsigned char packet[kMaxPacketSize] = { |
| 1900 // public flags (8 byte guid) | 2156 // public flags (8 byte guid) |
| 1901 0x0C, | 2157 0x3C, |
| 1902 // guid | 2158 // guid |
| 1903 0x10, 0x32, 0x54, 0x76, | 2159 0x10, 0x32, 0x54, 0x76, |
| 1904 0x98, 0xBA, 0xDC, 0xFE, | 2160 0x98, 0xBA, 0xDC, 0xFE, |
| 1905 // packet sequence number | 2161 // packet sequence number |
| 1906 0xBC, 0x9A, 0x78, 0x56, | 2162 0xBC, 0x9A, 0x78, 0x56, |
| 1907 0x34, 0x12, | 2163 0x34, 0x12, |
| 1908 // private flags | 2164 // private flags |
| 1909 0x00, | 2165 0x00, |
| 1910 | 2166 |
| 1911 // frame type (padding frame) | 2167 // frame type (padding frame) |
| 1912 0x00, | 2168 0x00, |
| 1913 }; | 2169 }; |
| 1914 | 2170 |
| 1915 uint64 header_size = GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, | 2171 uint64 header_size = |
| 1916 NOT_IN_FEC_GROUP); | 2172 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 2173 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); |
| 1917 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); | 2174 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
| 1918 | 2175 |
| 1919 scoped_ptr<QuicPacket> data( | 2176 scoped_ptr<QuicPacket> data( |
| 2177 framer_.ConstructFrameDataPacket(header, frames).packet); |
| 2178 ASSERT_TRUE(data != NULL); |
| 2179 |
| 2180 test::CompareCharArraysWithHexError("constructed packet", |
| 2181 data->data(), data->length(), |
| 2182 AsChars(packet), arraysize(packet)); |
| 2183 } |
| 2184 |
| 2185 TEST_F(QuicFramerTest, Construct4ByteSequenceNumberPaddingFramePacket) { |
| 2186 QuicPacketHeader header; |
| 2187 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
| 2188 header.public_header.reset_flag = false; |
| 2189 header.public_header.version_flag = false; |
| 2190 header.fec_flag = false; |
| 2191 header.entropy_flag = false; |
| 2192 header.public_header.sequence_number_length = PACKET_4BYTE_SEQUENCE_NUMBER; |
| 2193 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
| 2194 header.fec_group = 0; |
| 2195 |
| 2196 QuicPaddingFrame padding_frame; |
| 2197 |
| 2198 QuicFrames frames; |
| 2199 frames.push_back(QuicFrame(&padding_frame)); |
| 2200 |
| 2201 unsigned char packet[kMaxPacketSize] = { |
| 2202 // public flags (8 byte guid and 4 byte sequence number) |
| 2203 0x2C, |
| 2204 // guid |
| 2205 0x10, 0x32, 0x54, 0x76, |
| 2206 0x98, 0xBA, 0xDC, 0xFE, |
| 2207 // packet sequence number |
| 2208 0xBC, 0x9A, 0x78, 0x56, |
| 2209 // private flags |
| 2210 0x00, |
| 2211 |
| 2212 // frame type (padding frame) |
| 2213 0x00, |
| 2214 }; |
| 2215 |
| 2216 uint64 header_size = |
| 2217 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 2218 PACKET_4BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); |
| 2219 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
| 2220 |
| 2221 scoped_ptr<QuicPacket> data( |
| 2222 framer_.ConstructFrameDataPacket(header, frames).packet); |
| 2223 ASSERT_TRUE(data != NULL); |
| 2224 |
| 2225 test::CompareCharArraysWithHexError("constructed packet", |
| 2226 data->data(), data->length(), |
| 2227 AsChars(packet), arraysize(packet)); |
| 2228 } |
| 2229 |
| 2230 TEST_F(QuicFramerTest, Construct2ByteSequenceNumberPaddingFramePacket) { |
| 2231 QuicPacketHeader header; |
| 2232 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
| 2233 header.public_header.reset_flag = false; |
| 2234 header.public_header.version_flag = false; |
| 2235 header.fec_flag = false; |
| 2236 header.entropy_flag = false; |
| 2237 header.public_header.sequence_number_length = PACKET_2BYTE_SEQUENCE_NUMBER; |
| 2238 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
| 2239 header.fec_group = 0; |
| 2240 |
| 2241 QuicPaddingFrame padding_frame; |
| 2242 |
| 2243 QuicFrames frames; |
| 2244 frames.push_back(QuicFrame(&padding_frame)); |
| 2245 |
| 2246 unsigned char packet[kMaxPacketSize] = { |
| 2247 // public flags (8 byte guid and 2 byte sequence number) |
| 2248 0x1C, |
| 2249 // guid |
| 2250 0x10, 0x32, 0x54, 0x76, |
| 2251 0x98, 0xBA, 0xDC, 0xFE, |
| 2252 // packet sequence number |
| 2253 0xBC, 0x9A, |
| 2254 // private flags |
| 2255 0x00, |
| 2256 |
| 2257 // frame type (padding frame) |
| 2258 0x00, |
| 2259 }; |
| 2260 |
| 2261 uint64 header_size = |
| 2262 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 2263 PACKET_2BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); |
| 2264 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
| 2265 |
| 2266 scoped_ptr<QuicPacket> data( |
| 2267 framer_.ConstructFrameDataPacket(header, frames).packet); |
| 2268 ASSERT_TRUE(data != NULL); |
| 2269 |
| 2270 test::CompareCharArraysWithHexError("constructed packet", |
| 2271 data->data(), data->length(), |
| 2272 AsChars(packet), arraysize(packet)); |
| 2273 } |
| 2274 |
| 2275 TEST_F(QuicFramerTest, Construct1ByteSequenceNumberPaddingFramePacket) { |
| 2276 QuicPacketHeader header; |
| 2277 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
| 2278 header.public_header.reset_flag = false; |
| 2279 header.public_header.version_flag = false; |
| 2280 header.fec_flag = false; |
| 2281 header.entropy_flag = false; |
| 2282 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; |
| 2283 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
| 2284 header.fec_group = 0; |
| 2285 |
| 2286 QuicPaddingFrame padding_frame; |
| 2287 |
| 2288 QuicFrames frames; |
| 2289 frames.push_back(QuicFrame(&padding_frame)); |
| 2290 |
| 2291 unsigned char packet[kMaxPacketSize] = { |
| 2292 // public flags (8 byte guid and 1 byte sequence number) |
| 2293 0x0C, |
| 2294 // guid |
| 2295 0x10, 0x32, 0x54, 0x76, |
| 2296 0x98, 0xBA, 0xDC, 0xFE, |
| 2297 // packet sequence number |
| 2298 0xBC, |
| 2299 // private flags |
| 2300 0x00, |
| 2301 |
| 2302 // frame type (padding frame) |
| 2303 0x00, |
| 2304 }; |
| 2305 |
| 2306 uint64 header_size = |
| 2307 GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 2308 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); |
| 2309 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
| 2310 |
| 2311 scoped_ptr<QuicPacket> data( |
| 1920 framer_.ConstructFrameDataPacket(header, frames).packet); | 2312 framer_.ConstructFrameDataPacket(header, frames).packet); |
| 1921 ASSERT_TRUE(data != NULL); | 2313 ASSERT_TRUE(data != NULL); |
| 1922 | 2314 |
| 1923 test::CompareCharArraysWithHexError("constructed packet", | 2315 test::CompareCharArraysWithHexError("constructed packet", |
| 1924 data->data(), data->length(), | 2316 data->data(), data->length(), |
| 1925 AsChars(packet), arraysize(packet)); | 2317 AsChars(packet), arraysize(packet)); |
| 1926 } | 2318 } |
| 1927 | 2319 |
| 1928 TEST_F(QuicFramerTest, ConstructStreamFramePacket) { | 2320 TEST_F(QuicFramerTest, ConstructStreamFramePacket) { |
| 1929 QuicPacketHeader header; | 2321 QuicPacketHeader header; |
| 1930 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); | 2322 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
| 1931 header.public_header.reset_flag = false; | 2323 header.public_header.reset_flag = false; |
| 1932 header.public_header.version_flag = false; | 2324 header.public_header.version_flag = false; |
| 1933 header.fec_flag = false; | 2325 header.fec_flag = false; |
| 1934 header.entropy_flag = true; | 2326 header.entropy_flag = true; |
| 1935 header.packet_sequence_number = GG_UINT64_C(0x77123456789ABC); | 2327 header.packet_sequence_number = GG_UINT64_C(0x77123456789ABC); |
| 1936 header.fec_group = 0; | 2328 header.fec_group = 0; |
| 1937 | 2329 |
| 1938 QuicStreamFrame stream_frame; | 2330 QuicStreamFrame stream_frame; |
| 1939 stream_frame.stream_id = 0x01020304; | 2331 stream_frame.stream_id = 0x01020304; |
| 1940 stream_frame.fin = true; | 2332 stream_frame.fin = true; |
| 1941 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); | 2333 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); |
| 1942 stream_frame.data = "hello world!"; | 2334 stream_frame.data = "hello world!"; |
| 1943 | 2335 |
| 1944 QuicFrames frames; | 2336 QuicFrames frames; |
| 1945 frames.push_back(QuicFrame(&stream_frame)); | 2337 frames.push_back(QuicFrame(&stream_frame)); |
| 1946 | 2338 |
| 1947 unsigned char packet[] = { | 2339 unsigned char packet[] = { |
| 1948 // public flags (8 byte guid) | 2340 // public flags (8 byte guid) |
| 1949 0x0C, | 2341 0x3C, |
| 1950 // guid | 2342 // guid |
| 1951 0x10, 0x32, 0x54, 0x76, | 2343 0x10, 0x32, 0x54, 0x76, |
| 1952 0x98, 0xBA, 0xDC, 0xFE, | 2344 0x98, 0xBA, 0xDC, 0xFE, |
| 1953 // packet sequence number | 2345 // packet sequence number |
| 1954 0xBC, 0x9A, 0x78, 0x56, | 2346 0xBC, 0x9A, 0x78, 0x56, |
| 1955 0x34, 0x12, | 2347 0x34, 0x12, |
| 1956 // private flags (entropy) | 2348 // private flags (entropy) |
| 1957 0x01, | 2349 0x01, |
| 1958 | 2350 |
| 1959 // frame type (stream frame) | 2351 // frame type (stream frame) |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1996 stream_frame.stream_id = 0x01020304; | 2388 stream_frame.stream_id = 0x01020304; |
| 1997 stream_frame.fin = true; | 2389 stream_frame.fin = true; |
| 1998 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); | 2390 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); |
| 1999 stream_frame.data = "hello world!"; | 2391 stream_frame.data = "hello world!"; |
| 2000 | 2392 |
| 2001 QuicFrames frames; | 2393 QuicFrames frames; |
| 2002 frames.push_back(QuicFrame(&stream_frame)); | 2394 frames.push_back(QuicFrame(&stream_frame)); |
| 2003 | 2395 |
| 2004 unsigned char packet[] = { | 2396 unsigned char packet[] = { |
| 2005 // public flags (version, 8 byte guid) | 2397 // public flags (version, 8 byte guid) |
| 2006 0x0D, | 2398 0x3D, |
| 2007 // guid | 2399 // guid |
| 2008 0x10, 0x32, 0x54, 0x76, | 2400 0x10, 0x32, 0x54, 0x76, |
| 2009 0x98, 0xBA, 0xDC, 0xFE, | 2401 0x98, 0xBA, 0xDC, 0xFE, |
| 2010 // version tag | 2402 // version tag |
| 2011 'Q', '0', '0', '5', | 2403 'Q', '0', '0', '6', |
| 2012 // packet sequence number | 2404 // packet sequence number |
| 2013 0xBC, 0x9A, 0x78, 0x56, | 2405 0xBC, 0x9A, 0x78, 0x56, |
| 2014 0x34, 0x12, | 2406 0x34, 0x12, |
| 2015 // private flags (entropy) | 2407 // private flags (entropy) |
| 2016 0x01, | 2408 0x01, |
| 2017 | 2409 |
| 2018 // frame type (stream frame) | 2410 // frame type (stream frame) |
| 2019 0x01, | 2411 0x01, |
| 2020 // stream id | 2412 // stream id |
| 2021 0x04, 0x03, 0x02, 0x01, | 2413 0x04, 0x03, 0x02, 0x01, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2043 } | 2435 } |
| 2044 | 2436 |
| 2045 TEST_F(QuicFramerTest, ConstructVersionNegotiationPacket) { | 2437 TEST_F(QuicFramerTest, ConstructVersionNegotiationPacket) { |
| 2046 QuicPacketPublicHeader header; | 2438 QuicPacketPublicHeader header; |
| 2047 header.guid = GG_UINT64_C(0xFEDCBA9876543210); | 2439 header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
| 2048 header.reset_flag = false; | 2440 header.reset_flag = false; |
| 2049 header.version_flag = true; | 2441 header.version_flag = true; |
| 2050 | 2442 |
| 2051 unsigned char packet[] = { | 2443 unsigned char packet[] = { |
| 2052 // public flags (version, 8 byte guid) | 2444 // public flags (version, 8 byte guid) |
| 2053 0x0D, | 2445 0x3D, |
| 2054 // guid | 2446 // guid |
| 2055 0x10, 0x32, 0x54, 0x76, | 2447 0x10, 0x32, 0x54, 0x76, |
| 2056 0x98, 0xBA, 0xDC, 0xFE, | 2448 0x98, 0xBA, 0xDC, 0xFE, |
| 2057 // version tag | 2449 // version tag |
| 2058 'Q', '0', '0', '5', | 2450 'Q', '0', '0', '6', |
| 2059 'Q', '2', '.', '0', | 2451 'Q', '2', '.', '0', |
| 2060 }; | 2452 }; |
| 2061 | 2453 |
| 2062 const int kQuicVersion2 = MakeQuicTag('Q', '2', '.', '0'); | 2454 const int kQuicVersion2 = MakeQuicTag('Q', '2', '.', '0'); |
| 2063 QuicTagVector versions; | 2455 QuicTagVector versions; |
| 2064 versions.push_back(kQuicVersion1); | 2456 versions.push_back(kQuicVersion1); |
| 2065 versions.push_back(kQuicVersion2); | 2457 versions.push_back(kQuicVersion2); |
| 2066 scoped_ptr<QuicEncryptedPacket> data( | 2458 scoped_ptr<QuicEncryptedPacket> data( |
| 2067 framer_.ConstructVersionNegotiationPacket(header, versions)); | 2459 framer_.ConstructVersionNegotiationPacket(header, versions)); |
| 2068 | 2460 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2088 ack_frame.received_info.missing_packets.insert( | 2480 ack_frame.received_info.missing_packets.insert( |
| 2089 GG_UINT64_C(0x770123456789ABE)); | 2481 GG_UINT64_C(0x770123456789ABE)); |
| 2090 ack_frame.sent_info.entropy_hash = 0x14; | 2482 ack_frame.sent_info.entropy_hash = 0x14; |
| 2091 ack_frame.sent_info.least_unacked = GG_UINT64_C(0x770123456789AA0); | 2483 ack_frame.sent_info.least_unacked = GG_UINT64_C(0x770123456789AA0); |
| 2092 | 2484 |
| 2093 QuicFrames frames; | 2485 QuicFrames frames; |
| 2094 frames.push_back(QuicFrame(&ack_frame)); | 2486 frames.push_back(QuicFrame(&ack_frame)); |
| 2095 | 2487 |
| 2096 unsigned char packet[] = { | 2488 unsigned char packet[] = { |
| 2097 // public flags (8 byte guid) | 2489 // public flags (8 byte guid) |
| 2098 0x0C, | 2490 0x3C, |
| 2099 // guid | 2491 // guid |
| 2100 0x10, 0x32, 0x54, 0x76, | 2492 0x10, 0x32, 0x54, 0x76, |
| 2101 0x98, 0xBA, 0xDC, 0xFE, | 2493 0x98, 0xBA, 0xDC, 0xFE, |
| 2102 // packet sequence number | 2494 // packet sequence number |
| 2103 0xBC, 0x9A, 0x78, 0x56, | 2495 0xBC, 0x9A, 0x78, 0x56, |
| 2104 0x34, 0x12, | 2496 0x34, 0x12, |
| 2105 // private flags (entropy) | 2497 // private flags (entropy) |
| 2106 0x01, | 2498 0x01, |
| 2107 | 2499 |
| 2108 // frame type (ack frame) | 2500 // frame type (ack frame) |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2148 QuicCongestionFeedbackFrame congestion_feedback_frame; | 2540 QuicCongestionFeedbackFrame congestion_feedback_frame; |
| 2149 congestion_feedback_frame.type = kTCP; | 2541 congestion_feedback_frame.type = kTCP; |
| 2150 congestion_feedback_frame.tcp.accumulated_number_of_lost_packets = 0x0201; | 2542 congestion_feedback_frame.tcp.accumulated_number_of_lost_packets = 0x0201; |
| 2151 congestion_feedback_frame.tcp.receive_window = 0x4030; | 2543 congestion_feedback_frame.tcp.receive_window = 0x4030; |
| 2152 | 2544 |
| 2153 QuicFrames frames; | 2545 QuicFrames frames; |
| 2154 frames.push_back(QuicFrame(&congestion_feedback_frame)); | 2546 frames.push_back(QuicFrame(&congestion_feedback_frame)); |
| 2155 | 2547 |
| 2156 unsigned char packet[] = { | 2548 unsigned char packet[] = { |
| 2157 // public flags (8 byte guid) | 2549 // public flags (8 byte guid) |
| 2158 0x0C, | 2550 0x3C, |
| 2159 // guid | 2551 // guid |
| 2160 0x10, 0x32, 0x54, 0x76, | 2552 0x10, 0x32, 0x54, 0x76, |
| 2161 0x98, 0xBA, 0xDC, 0xFE, | 2553 0x98, 0xBA, 0xDC, 0xFE, |
| 2162 // packet sequence number | 2554 // packet sequence number |
| 2163 0xBC, 0x9A, 0x78, 0x56, | 2555 0xBC, 0x9A, 0x78, 0x56, |
| 2164 0x34, 0x12, | 2556 0x34, 0x12, |
| 2165 // private flags | 2557 // private flags |
| 2166 0x00, | 2558 0x00, |
| 2167 | 2559 |
| 2168 // frame type (congestion feedback frame) | 2560 // frame type (congestion feedback frame) |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2207 GG_UINT64_C(0x07E1D2C3B4A59688))))); | 2599 GG_UINT64_C(0x07E1D2C3B4A59688))))); |
| 2208 frame.inter_arrival.received_packet_times.insert( | 2600 frame.inter_arrival.received_packet_times.insert( |
| 2209 make_pair(GG_UINT64_C(0x0123456789ABD), | 2601 make_pair(GG_UINT64_C(0x0123456789ABD), |
| 2210 start_.Add(QuicTime::Delta::FromMicroseconds( | 2602 start_.Add(QuicTime::Delta::FromMicroseconds( |
| 2211 GG_UINT64_C(0x07E1D2C3B4A59689))))); | 2603 GG_UINT64_C(0x07E1D2C3B4A59689))))); |
| 2212 QuicFrames frames; | 2604 QuicFrames frames; |
| 2213 frames.push_back(QuicFrame(&frame)); | 2605 frames.push_back(QuicFrame(&frame)); |
| 2214 | 2606 |
| 2215 unsigned char packet[] = { | 2607 unsigned char packet[] = { |
| 2216 // public flags (8 byte guid) | 2608 // public flags (8 byte guid) |
| 2217 0x0C, | 2609 0x3C, |
| 2218 // guid | 2610 // guid |
| 2219 0x10, 0x32, 0x54, 0x76, | 2611 0x10, 0x32, 0x54, 0x76, |
| 2220 0x98, 0xBA, 0xDC, 0xFE, | 2612 0x98, 0xBA, 0xDC, 0xFE, |
| 2221 // packet sequence number | 2613 // packet sequence number |
| 2222 0xBC, 0x9A, 0x78, 0x56, | 2614 0xBC, 0x9A, 0x78, 0x56, |
| 2223 0x34, 0x12, | 2615 0x34, 0x12, |
| 2224 // private flags | 2616 // private flags |
| 2225 0x00, | 2617 0x00, |
| 2226 | 2618 |
| 2227 // frame type (congestion feedback frame) | 2619 // frame type (congestion feedback frame) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2270 QuicCongestionFeedbackFrame congestion_feedback_frame; | 2662 QuicCongestionFeedbackFrame congestion_feedback_frame; |
| 2271 congestion_feedback_frame.type = kFixRate; | 2663 congestion_feedback_frame.type = kFixRate; |
| 2272 congestion_feedback_frame.fix_rate.bitrate | 2664 congestion_feedback_frame.fix_rate.bitrate |
| 2273 = QuicBandwidth::FromBytesPerSecond(0x04030201); | 2665 = QuicBandwidth::FromBytesPerSecond(0x04030201); |
| 2274 | 2666 |
| 2275 QuicFrames frames; | 2667 QuicFrames frames; |
| 2276 frames.push_back(QuicFrame(&congestion_feedback_frame)); | 2668 frames.push_back(QuicFrame(&congestion_feedback_frame)); |
| 2277 | 2669 |
| 2278 unsigned char packet[] = { | 2670 unsigned char packet[] = { |
| 2279 // public flags (8 byte guid) | 2671 // public flags (8 byte guid) |
| 2280 0x0C, | 2672 0x3C, |
| 2281 // guid | 2673 // guid |
| 2282 0x10, 0x32, 0x54, 0x76, | 2674 0x10, 0x32, 0x54, 0x76, |
| 2283 0x98, 0xBA, 0xDC, 0xFE, | 2675 0x98, 0xBA, 0xDC, 0xFE, |
| 2284 // packet sequence number | 2676 // packet sequence number |
| 2285 0xBC, 0x9A, 0x78, 0x56, | 2677 0xBC, 0x9A, 0x78, 0x56, |
| 2286 0x34, 0x12, | 2678 0x34, 0x12, |
| 2287 // private flags | 2679 // private flags |
| 2288 0x00, | 2680 0x00, |
| 2289 | 2681 |
| 2290 // frame type (congestion feedback frame) | 2682 // frame type (congestion feedback frame) |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2336 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 2728 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
| 2337 header.fec_group = 0; | 2729 header.fec_group = 0; |
| 2338 | 2730 |
| 2339 QuicRstStreamFrame rst_frame; | 2731 QuicRstStreamFrame rst_frame; |
| 2340 rst_frame.stream_id = 0x01020304; | 2732 rst_frame.stream_id = 0x01020304; |
| 2341 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708); | 2733 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708); |
| 2342 rst_frame.error_details = "because I can"; | 2734 rst_frame.error_details = "because I can"; |
| 2343 | 2735 |
| 2344 unsigned char packet[] = { | 2736 unsigned char packet[] = { |
| 2345 // public flags (8 byte guid) | 2737 // public flags (8 byte guid) |
| 2346 0x0C, | 2738 0x3C, |
| 2347 // guid | 2739 // guid |
| 2348 0x10, 0x32, 0x54, 0x76, | 2740 0x10, 0x32, 0x54, 0x76, |
| 2349 0x98, 0xBA, 0xDC, 0xFE, | 2741 0x98, 0xBA, 0xDC, 0xFE, |
| 2350 // packet sequence number | 2742 // packet sequence number |
| 2351 0xBC, 0x9A, 0x78, 0x56, | 2743 0xBC, 0x9A, 0x78, 0x56, |
| 2352 0x34, 0x12, | 2744 0x34, 0x12, |
| 2353 // private flags | 2745 // private flags |
| 2354 0x00, | 2746 0x00, |
| 2355 | 2747 |
| 2356 // frame type (rst stream frame) | 2748 // frame type (rst stream frame) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2399 ack_frame->received_info.largest_observed = GG_UINT64_C(0x0123456789ABF); | 2791 ack_frame->received_info.largest_observed = GG_UINT64_C(0x0123456789ABF); |
| 2400 ack_frame->received_info.missing_packets.insert(GG_UINT64_C(0x0123456789ABE)); | 2792 ack_frame->received_info.missing_packets.insert(GG_UINT64_C(0x0123456789ABE)); |
| 2401 ack_frame->sent_info.entropy_hash = 0xE0; | 2793 ack_frame->sent_info.entropy_hash = 0xE0; |
| 2402 ack_frame->sent_info.least_unacked = GG_UINT64_C(0x0123456789AA0); | 2794 ack_frame->sent_info.least_unacked = GG_UINT64_C(0x0123456789AA0); |
| 2403 | 2795 |
| 2404 QuicFrames frames; | 2796 QuicFrames frames; |
| 2405 frames.push_back(QuicFrame(&close_frame)); | 2797 frames.push_back(QuicFrame(&close_frame)); |
| 2406 | 2798 |
| 2407 unsigned char packet[] = { | 2799 unsigned char packet[] = { |
| 2408 // public flags (8 byte guid) | 2800 // public flags (8 byte guid) |
| 2409 0x0C, | 2801 0x3C, |
| 2410 // guid | 2802 // guid |
| 2411 0x10, 0x32, 0x54, 0x76, | 2803 0x10, 0x32, 0x54, 0x76, |
| 2412 0x98, 0xBA, 0xDC, 0xFE, | 2804 0x98, 0xBA, 0xDC, 0xFE, |
| 2413 // packet sequence number | 2805 // packet sequence number |
| 2414 0xBC, 0x9A, 0x78, 0x56, | 2806 0xBC, 0x9A, 0x78, 0x56, |
| 2415 0x34, 0x12, | 2807 0x34, 0x12, |
| 2416 // private flags (entropy) | 2808 // private flags (entropy) |
| 2417 0x01, | 2809 0x01, |
| 2418 | 2810 |
| 2419 // frame type (connection close frame) | 2811 // frame type (connection close frame) |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2470 QuicGoAwayFrame goaway_frame; | 2862 QuicGoAwayFrame goaway_frame; |
| 2471 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708); | 2863 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708); |
| 2472 goaway_frame.last_good_stream_id = 0x01020304; | 2864 goaway_frame.last_good_stream_id = 0x01020304; |
| 2473 goaway_frame.reason_phrase = "because I can"; | 2865 goaway_frame.reason_phrase = "because I can"; |
| 2474 | 2866 |
| 2475 QuicFrames frames; | 2867 QuicFrames frames; |
| 2476 frames.push_back(QuicFrame(&goaway_frame)); | 2868 frames.push_back(QuicFrame(&goaway_frame)); |
| 2477 | 2869 |
| 2478 unsigned char packet[] = { | 2870 unsigned char packet[] = { |
| 2479 // public flags (8 byte guid) | 2871 // public flags (8 byte guid) |
| 2480 0x0C, | 2872 0x3C, |
| 2481 // guid | 2873 // guid |
| 2482 0x10, 0x32, 0x54, 0x76, | 2874 0x10, 0x32, 0x54, 0x76, |
| 2483 0x98, 0xBA, 0xDC, 0xFE, | 2875 0x98, 0xBA, 0xDC, 0xFE, |
| 2484 // packet sequence number | 2876 // packet sequence number |
| 2485 0xBC, 0x9A, 0x78, 0x56, | 2877 0xBC, 0x9A, 0x78, 0x56, |
| 2486 0x34, 0x12, | 2878 0x34, 0x12, |
| 2487 // private flags(entropy) | 2879 // private flags(entropy) |
| 2488 0x01, | 2880 0x01, |
| 2489 | 2881 |
| 2490 // frame type (go away frame) | 2882 // frame type (go away frame) |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2514 TEST_F(QuicFramerTest, ConstructPublicResetPacket) { | 2906 TEST_F(QuicFramerTest, ConstructPublicResetPacket) { |
| 2515 QuicPublicResetPacket reset_packet; | 2907 QuicPublicResetPacket reset_packet; |
| 2516 reset_packet.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); | 2908 reset_packet.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
| 2517 reset_packet.public_header.reset_flag = true; | 2909 reset_packet.public_header.reset_flag = true; |
| 2518 reset_packet.public_header.version_flag = false; | 2910 reset_packet.public_header.version_flag = false; |
| 2519 reset_packet.rejected_sequence_number = GG_UINT64_C(0x123456789ABC); | 2911 reset_packet.rejected_sequence_number = GG_UINT64_C(0x123456789ABC); |
| 2520 reset_packet.nonce_proof = GG_UINT64_C(0xABCDEF0123456789); | 2912 reset_packet.nonce_proof = GG_UINT64_C(0xABCDEF0123456789); |
| 2521 | 2913 |
| 2522 unsigned char packet[] = { | 2914 unsigned char packet[] = { |
| 2523 // public flags (public reset, 8 byte GUID) | 2915 // public flags (public reset, 8 byte GUID) |
| 2524 0x0E, | 2916 0x3E, |
| 2525 // guid | 2917 // guid |
| 2526 0x10, 0x32, 0x54, 0x76, | 2918 0x10, 0x32, 0x54, 0x76, |
| 2527 0x98, 0xBA, 0xDC, 0xFE, | 2919 0x98, 0xBA, 0xDC, 0xFE, |
| 2528 // nonce proof | 2920 // nonce proof |
| 2529 0x89, 0x67, 0x45, 0x23, | 2921 0x89, 0x67, 0x45, 0x23, |
| 2530 0x01, 0xEF, 0xCD, 0xAB, | 2922 0x01, 0xEF, 0xCD, 0xAB, |
| 2531 // rejected sequence number | 2923 // rejected sequence number |
| 2532 0xBC, 0x9A, 0x78, 0x56, | 2924 0xBC, 0x9A, 0x78, 0x56, |
| 2533 0x34, 0x12, | 2925 0x34, 0x12, |
| 2534 }; | 2926 }; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2552 header.packet_sequence_number = (GG_UINT64_C(0x123456789ABC)); | 2944 header.packet_sequence_number = (GG_UINT64_C(0x123456789ABC)); |
| 2553 header.is_in_fec_group = IN_FEC_GROUP; | 2945 header.is_in_fec_group = IN_FEC_GROUP; |
| 2554 header.fec_group = GG_UINT64_C(0x123456789ABB);; | 2946 header.fec_group = GG_UINT64_C(0x123456789ABB);; |
| 2555 | 2947 |
| 2556 QuicFecData fec_data; | 2948 QuicFecData fec_data; |
| 2557 fec_data.fec_group = 1; | 2949 fec_data.fec_group = 1; |
| 2558 fec_data.redundancy = "abcdefghijklmnop"; | 2950 fec_data.redundancy = "abcdefghijklmnop"; |
| 2559 | 2951 |
| 2560 unsigned char packet[] = { | 2952 unsigned char packet[] = { |
| 2561 // public flags (8 byte guid) | 2953 // public flags (8 byte guid) |
| 2562 0x0C, | 2954 0x3C, |
| 2563 // guid | 2955 // guid |
| 2564 0x10, 0x32, 0x54, 0x76, | 2956 0x10, 0x32, 0x54, 0x76, |
| 2565 0x98, 0xBA, 0xDC, 0xFE, | 2957 0x98, 0xBA, 0xDC, 0xFE, |
| 2566 // packet sequence number | 2958 // packet sequence number |
| 2567 0xBC, 0x9A, 0x78, 0x56, | 2959 0xBC, 0x9A, 0x78, 0x56, |
| 2568 0x34, 0x12, | 2960 0x34, 0x12, |
| 2569 // private flags (entropy & fec group & fec packet) | 2961 // private flags (entropy & fec group & fec packet) |
| 2570 0x07, | 2962 0x07, |
| 2571 // first fec protected packet offset | 2963 // first fec protected packet offset |
| 2572 0x01, | 2964 0x01, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2584 | 2976 |
| 2585 test::CompareCharArraysWithHexError("constructed packet", | 2977 test::CompareCharArraysWithHexError("constructed packet", |
| 2586 data->data(), data->length(), | 2978 data->data(), data->length(), |
| 2587 AsChars(packet), arraysize(packet)); | 2979 AsChars(packet), arraysize(packet)); |
| 2588 } | 2980 } |
| 2589 | 2981 |
| 2590 TEST_F(QuicFramerTest, EncryptPacket) { | 2982 TEST_F(QuicFramerTest, EncryptPacket) { |
| 2591 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); | 2983 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); |
| 2592 unsigned char packet[] = { | 2984 unsigned char packet[] = { |
| 2593 // public flags (8 byte guid) | 2985 // public flags (8 byte guid) |
| 2594 0x0C, | 2986 0x3C, |
| 2595 // guid | 2987 // guid |
| 2596 0x10, 0x32, 0x54, 0x76, | 2988 0x10, 0x32, 0x54, 0x76, |
| 2597 0x98, 0xBA, 0xDC, 0xFE, | 2989 0x98, 0xBA, 0xDC, 0xFE, |
| 2598 // packet sequence number | 2990 // packet sequence number |
| 2599 0xBC, 0x9A, 0x78, 0x56, | 2991 0xBC, 0x9A, 0x78, 0x56, |
| 2600 0x34, 0x12, | 2992 0x34, 0x12, |
| 2601 // private flags (fec group & fec packet) | 2993 // private flags (fec group & fec packet) |
| 2602 0x06, | 2994 0x06, |
| 2603 // first fec protected packet offset | 2995 // first fec protected packet offset |
| 2604 0x01, | 2996 0x01, |
| 2605 | 2997 |
| 2606 // redundancy | 2998 // redundancy |
| 2607 'a', 'b', 'c', 'd', | 2999 'a', 'b', 'c', 'd', |
| 2608 'e', 'f', 'g', 'h', | 3000 'e', 'f', 'g', 'h', |
| 2609 'i', 'j', 'k', 'l', | 3001 'i', 'j', 'k', 'l', |
| 2610 'm', 'n', 'o', 'p', | 3002 'm', 'n', 'o', 'p', |
| 2611 }; | 3003 }; |
| 2612 | 3004 |
| 2613 scoped_ptr<QuicPacket> raw( | 3005 scoped_ptr<QuicPacket> raw( |
| 2614 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, | 3006 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, |
| 2615 PACKET_8BYTE_GUID, !kIncludeVersion)); | 3007 PACKET_8BYTE_GUID, !kIncludeVersion, |
| 3008 PACKET_6BYTE_SEQUENCE_NUMBER)); |
| 2616 scoped_ptr<QuicEncryptedPacket> encrypted( | 3009 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 2617 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); | 3010 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); |
| 2618 | 3011 |
| 2619 ASSERT_TRUE(encrypted.get() != NULL); | 3012 ASSERT_TRUE(encrypted.get() != NULL); |
| 2620 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); | 3013 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); |
| 2621 } | 3014 } |
| 2622 | 3015 |
| 2623 TEST_F(QuicFramerTest, EncryptPacketWithVersionFlag) { | 3016 TEST_F(QuicFramerTest, EncryptPacketWithVersionFlag) { |
| 2624 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); | 3017 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); |
| 2625 unsigned char packet[] = { | 3018 unsigned char packet[] = { |
| 2626 // public flags (version, 8 byte guid) | 3019 // public flags (version, 8 byte guid) |
| 2627 0x0D, | 3020 0x3D, |
| 2628 // guid | 3021 // guid |
| 2629 0x10, 0x32, 0x54, 0x76, | 3022 0x10, 0x32, 0x54, 0x76, |
| 2630 0x98, 0xBA, 0xDC, 0xFE, | 3023 0x98, 0xBA, 0xDC, 0xFE, |
| 2631 // version tag | 3024 // version tag |
| 2632 'Q', '.', '1', '0', | 3025 'Q', '.', '1', '0', |
| 2633 // packet sequence number | 3026 // packet sequence number |
| 2634 0xBC, 0x9A, 0x78, 0x56, | 3027 0xBC, 0x9A, 0x78, 0x56, |
| 2635 0x34, 0x12, | 3028 0x34, 0x12, |
| 2636 // private flags (fec group & fec flags) | 3029 // private flags (fec group & fec flags) |
| 2637 0x06, | 3030 0x06, |
| 2638 // first fec protected packet offset | 3031 // first fec protected packet offset |
| 2639 0x01, | 3032 0x01, |
| 2640 | 3033 |
| 2641 // redundancy | 3034 // redundancy |
| 2642 'a', 'b', 'c', 'd', | 3035 'a', 'b', 'c', 'd', |
| 2643 'e', 'f', 'g', 'h', | 3036 'e', 'f', 'g', 'h', |
| 2644 'i', 'j', 'k', 'l', | 3037 'i', 'j', 'k', 'l', |
| 2645 'm', 'n', 'o', 'p', | 3038 'm', 'n', 'o', 'p', |
| 2646 }; | 3039 }; |
| 2647 | 3040 |
| 2648 scoped_ptr<QuicPacket> raw( | 3041 scoped_ptr<QuicPacket> raw( |
| 2649 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, | 3042 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, |
| 2650 PACKET_8BYTE_GUID, kIncludeVersion)); | 3043 PACKET_8BYTE_GUID, kIncludeVersion, |
| 3044 PACKET_6BYTE_SEQUENCE_NUMBER)); |
| 2651 scoped_ptr<QuicEncryptedPacket> encrypted( | 3045 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 2652 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); | 3046 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); |
| 2653 | 3047 |
| 2654 ASSERT_TRUE(encrypted.get() != NULL); | 3048 ASSERT_TRUE(encrypted.get() != NULL); |
| 2655 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); | 3049 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); |
| 2656 } | 3050 } |
| 2657 | 3051 |
| 2658 // TODO(rch): re-enable after https://codereview.chromium.org/11820005/ | 3052 // TODO(rch): re-enable after https://codereview.chromium.org/11820005/ |
| 2659 // lands. Currently this is causing valgrind problems, but it should be | 3053 // lands. Currently this is causing valgrind problems, but it should be |
| 2660 // fixed in the followup CL. | 3054 // fixed in the followup CL. |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2809 original_raw_length = raw_close_packet->length(); | 3203 original_raw_length = raw_close_packet->length(); |
| 2810 raw_close_packet.reset( | 3204 raw_close_packet.reset( |
| 2811 framer_.ConstructFrameDataPacket(header, frames).packet); | 3205 framer_.ConstructFrameDataPacket(header, frames).packet); |
| 2812 ASSERT_TRUE(raw_ack_packet != NULL); | 3206 ASSERT_TRUE(raw_ack_packet != NULL); |
| 2813 EXPECT_EQ(original_raw_length, raw_close_packet->length()); | 3207 EXPECT_EQ(original_raw_length, raw_close_packet->length()); |
| 2814 } | 3208 } |
| 2815 | 3209 |
| 2816 TEST_F(QuicFramerTest, EntropyFlagTest) { | 3210 TEST_F(QuicFramerTest, EntropyFlagTest) { |
| 2817 unsigned char packet[] = { | 3211 unsigned char packet[] = { |
| 2818 // public flags (8 byte guid) | 3212 // public flags (8 byte guid) |
| 2819 0x0C, | 3213 0x3C, |
| 2820 // guid | 3214 // guid |
| 2821 0x10, 0x32, 0x54, 0x76, | 3215 0x10, 0x32, 0x54, 0x76, |
| 2822 0x98, 0xBA, 0xDC, 0xFE, | 3216 0x98, 0xBA, 0xDC, 0xFE, |
| 2823 // packet sequence number | 3217 // packet sequence number |
| 2824 0xBC, 0x9A, 0x78, 0x56, | 3218 0xBC, 0x9A, 0x78, 0x56, |
| 2825 0x34, 0x12, | 3219 0x34, 0x12, |
| 2826 // private flags (Entropy) | 3220 // private flags (Entropy) |
| 2827 0x01, | 3221 0x01, |
| 2828 | 3222 |
| 2829 // frame type (stream frame) | 3223 // frame type (stream frame) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2848 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 3242 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2849 ASSERT_TRUE(visitor_.header_.get()); | 3243 ASSERT_TRUE(visitor_.header_.get()); |
| 2850 EXPECT_TRUE(visitor_.header_->entropy_flag); | 3244 EXPECT_TRUE(visitor_.header_->entropy_flag); |
| 2851 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); | 3245 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); |
| 2852 EXPECT_FALSE(visitor_.header_->fec_flag); | 3246 EXPECT_FALSE(visitor_.header_->fec_flag); |
| 2853 }; | 3247 }; |
| 2854 | 3248 |
| 2855 TEST_F(QuicFramerTest, FecEntropyTest) { | 3249 TEST_F(QuicFramerTest, FecEntropyTest) { |
| 2856 unsigned char packet[] = { | 3250 unsigned char packet[] = { |
| 2857 // public flags (8 byte guid) | 3251 // public flags (8 byte guid) |
| 2858 0x0C, | 3252 0x3C, |
| 2859 // guid | 3253 // guid |
| 2860 0x10, 0x32, 0x54, 0x76, | 3254 0x10, 0x32, 0x54, 0x76, |
| 2861 0x98, 0xBA, 0xDC, 0xFE, | 3255 0x98, 0xBA, 0xDC, 0xFE, |
| 2862 // packet sequence number | 3256 // packet sequence number |
| 2863 0xBC, 0x9A, 0x78, 0x56, | 3257 0xBC, 0x9A, 0x78, 0x56, |
| 2864 0x34, 0x12, | 3258 0x34, 0x12, |
| 2865 // private flags (Entropy & fec group & FEC) | 3259 // private flags (Entropy & fec group & FEC) |
| 2866 0x07, | 3260 0x07, |
| 2867 // first fec protected packet offset | 3261 // first fec protected packet offset |
| 2868 0xFF, | 3262 0xFF, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2889 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 3283 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2890 ASSERT_TRUE(visitor_.header_.get()); | 3284 ASSERT_TRUE(visitor_.header_.get()); |
| 2891 EXPECT_TRUE(visitor_.header_->fec_flag); | 3285 EXPECT_TRUE(visitor_.header_->fec_flag); |
| 2892 EXPECT_TRUE(visitor_.header_->entropy_flag); | 3286 EXPECT_TRUE(visitor_.header_->entropy_flag); |
| 2893 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); | 3287 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); |
| 2894 }; | 3288 }; |
| 2895 | 3289 |
| 2896 TEST_F(QuicFramerTest, StopPacketProcessing) { | 3290 TEST_F(QuicFramerTest, StopPacketProcessing) { |
| 2897 unsigned char packet[] = { | 3291 unsigned char packet[] = { |
| 2898 // public flags (8 byte guid) | 3292 // public flags (8 byte guid) |
| 2899 0x0C, | 3293 0x3C, |
| 2900 // guid | 3294 // guid |
| 2901 0x10, 0x32, 0x54, 0x76, | 3295 0x10, 0x32, 0x54, 0x76, |
| 2902 0x98, 0xBA, 0xDC, 0xFE, | 3296 0x98, 0xBA, 0xDC, 0xFE, |
| 2903 // packet sequence number | 3297 // packet sequence number |
| 2904 0xBC, 0x9A, 0x78, 0x56, | 3298 0xBC, 0x9A, 0x78, 0x56, |
| 2905 0x34, 0x12, | 3299 0x34, 0x12, |
| 2906 // Entropy | 3300 // Entropy |
| 2907 0x01, | 3301 0x01, |
| 2908 | 3302 |
| 2909 // frame type (stream frame) | 3303 // frame type (stream frame) |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2950 EXPECT_CALL(visitor, OnPacketComplete()); | 3344 EXPECT_CALL(visitor, OnPacketComplete()); |
| 2951 | 3345 |
| 2952 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 3346 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2953 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 3347 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2954 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 3348 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2955 } | 3349 } |
| 2956 | 3350 |
| 2957 TEST_F(QuicFramerTest, ConnectionCloseWithInvalidAck) { | 3351 TEST_F(QuicFramerTest, ConnectionCloseWithInvalidAck) { |
| 2958 unsigned char packet[] = { | 3352 unsigned char packet[] = { |
| 2959 // public flags (8 byte guid) | 3353 // public flags (8 byte guid) |
| 2960 0x0C, | 3354 0x3C, |
| 2961 // guid | 3355 // guid |
| 2962 0x10, 0x32, 0x54, 0x76, | 3356 0x10, 0x32, 0x54, 0x76, |
| 2963 0x98, 0xBA, 0xDC, 0xFE, | 3357 0x98, 0xBA, 0xDC, 0xFE, |
| 2964 // packet sequence number | 3358 // packet sequence number |
| 2965 0xBC, 0x9A, 0x78, 0x56, | 3359 0xBC, 0x9A, 0x78, 0x56, |
| 2966 0x34, 0x12, | 3360 0x34, 0x12, |
| 2967 // private flags | 3361 // private flags |
| 2968 0x00, | 3362 0x00, |
| 2969 | 3363 |
| 2970 // frame type (connection close frame) | 3364 // frame type (connection close frame) |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3007 EXPECT_CALL(visitor, OnConnectionCloseFrame(_)).Times(0); | 3401 EXPECT_CALL(visitor, OnConnectionCloseFrame(_)).Times(0); |
| 3008 EXPECT_CALL(visitor, OnPacketComplete()); | 3402 EXPECT_CALL(visitor, OnPacketComplete()); |
| 3009 | 3403 |
| 3010 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 3404 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 3011 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 3405 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 3012 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 3406 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 3013 } | 3407 } |
| 3014 | 3408 |
| 3015 } // namespace test | 3409 } // namespace test |
| 3016 } // namespace net | 3410 } // namespace net |
| OLD | NEW |