| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/core/quic_framer.h" | 5 #include "net/quic/core/quic_framer.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <map> | 10 #include <map> |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 namespace test { | 38 namespace test { |
| 39 | 39 |
| 40 const QuicPacketNumber kEpoch = UINT64_C(1) << 48; | 40 const QuicPacketNumber kEpoch = UINT64_C(1) << 48; |
| 41 const QuicPacketNumber kMask = kEpoch - 1; | 41 const QuicPacketNumber kMask = kEpoch - 1; |
| 42 | 42 |
| 43 // Use fields in which each byte is distinct to ensure that every byte is | 43 // Use fields in which each byte is distinct to ensure that every byte is |
| 44 // framed correctly. The values are otherwise arbitrary. | 44 // framed correctly. The values are otherwise arbitrary. |
| 45 const QuicConnectionId kConnectionId = UINT64_C(0xFEDCBA9876543210); | 45 const QuicConnectionId kConnectionId = UINT64_C(0xFEDCBA9876543210); |
| 46 const QuicPathId kPathId = 0x42; | 46 const QuicPathId kPathId = 0x42; |
| 47 const QuicPacketNumber kPacketNumber = UINT64_C(0x123456789ABC); | 47 const QuicPacketNumber kPacketNumber = UINT64_C(0x123456789ABC); |
| 48 const QuicPacketNumber kLargestObserved = UINT64_C(0x0123456789ABF); | |
| 49 const QuicPacketNumber kSmallLargestObserved = UINT16_C(0x1234); | 48 const QuicPacketNumber kSmallLargestObserved = UINT16_C(0x1234); |
| 50 const QuicPacketNumber kMissingPacket = UINT64_C(0x0123456789ABE); | |
| 51 const QuicPacketNumber kSmallMissingPacket = UINT16_C(0x1233); | 49 const QuicPacketNumber kSmallMissingPacket = UINT16_C(0x1233); |
| 52 const QuicPacketNumber kLeastUnacked = UINT64_C(0x0123456789AA0); | 50 const QuicPacketNumber kLeastUnacked = UINT64_C(0x0123456789AA0); |
| 53 const QuicStreamId kStreamId = UINT64_C(0x01020304); | 51 const QuicStreamId kStreamId = UINT64_C(0x01020304); |
| 54 const QuicStreamOffset kStreamOffset = UINT64_C(0xBA98FEDC32107654); | 52 const QuicStreamOffset kStreamOffset = UINT64_C(0xBA98FEDC32107654); |
| 55 const QuicPublicResetNonceProof kNonceProof = UINT64_C(0xABCDEF0123456789); | 53 const QuicPublicResetNonceProof kNonceProof = UINT64_C(0xABCDEF0123456789); |
| 56 | 54 |
| 57 // Index into the connection_id offset in the header. | 55 // Index into the connection_id offset in the header. |
| 58 const size_t kConnectionIdOffset = kPublicFlagsSize; | 56 const size_t kConnectionIdOffset = kPublicFlagsSize; |
| 59 // Index into the version string in the header. (if present). | 57 // Index into the version string in the header. (if present). |
| 60 const size_t kVersionOffset = kConnectionIdOffset + PACKET_8BYTE_CONNECTION_ID; | 58 const size_t kVersionOffset = kConnectionIdOffset + PACKET_8BYTE_CONNECTION_ID; |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 version_mismatch_(0), | 192 version_mismatch_(0), |
| 195 packet_count_(0), | 193 packet_count_(0), |
| 196 frame_count_(0), | 194 frame_count_(0), |
| 197 complete_packets_(0), | 195 complete_packets_(0), |
| 198 accept_packet_(true), | 196 accept_packet_(true), |
| 199 accept_public_header_(true) {} | 197 accept_public_header_(true) {} |
| 200 | 198 |
| 201 ~TestQuicVisitor() override {} | 199 ~TestQuicVisitor() override {} |
| 202 | 200 |
| 203 void OnError(QuicFramer* f) override { | 201 void OnError(QuicFramer* f) override { |
| 204 DVLOG(1) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error()) | 202 DVLOG(1) << "QuicFramer Error: " << QuicErrorCodeToString(f->error()) |
| 205 << " (" << f->error() << ")"; | 203 << " (" << f->error() << ")"; |
| 206 ++error_count_; | 204 ++error_count_; |
| 207 } | 205 } |
| 208 | 206 |
| 209 void OnPacket() override {} | 207 void OnPacket() override {} |
| 210 | 208 |
| 211 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override { | 209 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override { |
| 212 public_reset_packet_.reset(new QuicPublicResetPacket(packet)); | 210 public_reset_packet_.reset(new QuicPublicResetPacket(packet)); |
| 213 } | 211 } |
| 214 | 212 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 int packet_count_; | 313 int packet_count_; |
| 316 int frame_count_; | 314 int frame_count_; |
| 317 int complete_packets_; | 315 int complete_packets_; |
| 318 bool accept_packet_; | 316 bool accept_packet_; |
| 319 bool accept_public_header_; | 317 bool accept_public_header_; |
| 320 | 318 |
| 321 std::unique_ptr<QuicPacketHeader> header_; | 319 std::unique_ptr<QuicPacketHeader> header_; |
| 322 std::unique_ptr<QuicPacketPublicHeader> public_header_; | 320 std::unique_ptr<QuicPacketPublicHeader> public_header_; |
| 323 std::unique_ptr<QuicPublicResetPacket> public_reset_packet_; | 321 std::unique_ptr<QuicPublicResetPacket> public_reset_packet_; |
| 324 std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; | 322 std::unique_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; |
| 325 vector<std::unique_ptr<QuicStreamFrame>> stream_frames_; | 323 std::vector<std::unique_ptr<QuicStreamFrame>> stream_frames_; |
| 326 vector<std::unique_ptr<QuicAckFrame>> ack_frames_; | 324 std::vector<std::unique_ptr<QuicAckFrame>> ack_frames_; |
| 327 vector<std::unique_ptr<QuicStopWaitingFrame>> stop_waiting_frames_; | 325 std::vector<std::unique_ptr<QuicStopWaitingFrame>> stop_waiting_frames_; |
| 328 vector<std::unique_ptr<QuicPaddingFrame>> padding_frames_; | 326 std::vector<std::unique_ptr<QuicPaddingFrame>> padding_frames_; |
| 329 vector<std::unique_ptr<QuicPingFrame>> ping_frames_; | 327 std::vector<std::unique_ptr<QuicPingFrame>> ping_frames_; |
| 330 QuicRstStreamFrame rst_stream_frame_; | 328 QuicRstStreamFrame rst_stream_frame_; |
| 331 QuicConnectionCloseFrame connection_close_frame_; | 329 QuicConnectionCloseFrame connection_close_frame_; |
| 332 QuicGoAwayFrame goaway_frame_; | 330 QuicGoAwayFrame goaway_frame_; |
| 333 QuicWindowUpdateFrame window_update_frame_; | 331 QuicWindowUpdateFrame window_update_frame_; |
| 334 QuicBlockedFrame blocked_frame_; | 332 QuicBlockedFrame blocked_frame_; |
| 335 QuicPathCloseFrame path_close_frame_; | 333 QuicPathCloseFrame path_close_frame_; |
| 336 vector<std::unique_ptr<string>> stream_data_; | 334 std::vector<std::unique_ptr<string>> stream_data_; |
| 337 }; | 335 }; |
| 338 | 336 |
| 339 class QuicFramerTest : public ::testing::TestWithParam<QuicVersion> { | 337 class QuicFramerTest : public ::testing::TestWithParam<QuicVersion> { |
| 340 public: | 338 public: |
| 341 QuicFramerTest() | 339 QuicFramerTest() |
| 342 : encrypter_(new test::TestEncrypter()), | 340 : encrypter_(new test::TestEncrypter()), |
| 343 decrypter_(new test::TestDecrypter()), | 341 decrypter_(new test::TestDecrypter()), |
| 344 start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)), | 342 start_(QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(0x10)), |
| 345 framer_(AllSupportedVersions(), start_, Perspective::IS_SERVER) { | 343 framer_(AllSupportedVersions(), start_, Perspective::IS_SERVER) { |
| 346 version_ = GetParam(); | 344 version_ = GetParam(); |
| 347 framer_.set_version(version_); | 345 framer_.set_version(version_); |
| 348 framer_.SetDecrypter(ENCRYPTION_NONE, decrypter_); | 346 framer_.SetDecrypter(ENCRYPTION_NONE, decrypter_); |
| 349 framer_.SetEncrypter(ENCRYPTION_NONE, encrypter_); | 347 framer_.SetEncrypter(ENCRYPTION_NONE, encrypter_); |
| 350 framer_.set_visitor(&visitor_); | 348 framer_.set_visitor(&visitor_); |
| 351 framer_.set_received_entropy_calculator(&entropy_calculator_); | |
| 352 } | 349 } |
| 353 | 350 |
| 354 // Helper function to get unsigned char representation of digit in the | 351 // Helper function to get unsigned char representation of digit in the |
| 355 // units place of the current QUIC version number. | 352 // units place of the current QUIC version number. |
| 356 unsigned char GetQuicVersionDigitOnes() { | 353 unsigned char GetQuicVersionDigitOnes() { |
| 357 return static_cast<unsigned char>('0' + version_ % 10); | 354 return static_cast<unsigned char>('0' + version_ % 10); |
| 358 } | 355 } |
| 359 | 356 |
| 360 // Helper function to get unsigned char representation of digit in the | 357 // Helper function to get unsigned char representation of digit in the |
| 361 // tens place of the current QUIC version number. | 358 // tens place of the current QUIC version number. |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 return BuildUnsizedDataPacket(&framer_, header, frames, packet_size); | 485 return BuildUnsizedDataPacket(&framer_, header, frames, packet_size); |
| 489 } | 486 } |
| 490 | 487 |
| 491 QuicFlagSaver flags_; // Save/restore all QUIC flag values. | 488 QuicFlagSaver flags_; // Save/restore all QUIC flag values. |
| 492 test::TestEncrypter* encrypter_; | 489 test::TestEncrypter* encrypter_; |
| 493 test::TestDecrypter* decrypter_; | 490 test::TestDecrypter* decrypter_; |
| 494 QuicVersion version_; | 491 QuicVersion version_; |
| 495 QuicTime start_; | 492 QuicTime start_; |
| 496 QuicFramer framer_; | 493 QuicFramer framer_; |
| 497 test::TestQuicVisitor visitor_; | 494 test::TestQuicVisitor visitor_; |
| 498 test::TestEntropyCalculator entropy_calculator_; | |
| 499 }; | 495 }; |
| 500 | 496 |
| 501 // Run all framer tests with all supported versions of QUIC. | 497 // Run all framer tests with all supported versions of QUIC. |
| 502 INSTANTIATE_TEST_CASE_P(QuicFramerTests, | 498 INSTANTIATE_TEST_CASE_P(QuicFramerTests, |
| 503 QuicFramerTest, | 499 QuicFramerTest, |
| 504 ::testing::ValuesIn(kSupportedQuicVersions)); | 500 ::testing::ValuesIn(kSupportedQuicVersions)); |
| 505 | 501 |
| 506 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochStart) { | 502 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearEpochStart) { |
| 507 // A few quick manual sanity checks. | 503 // A few quick manual sanity checks. |
| 508 CheckCalculatePacketNumber(UINT64_C(1), UINT64_C(0)); | 504 CheckCalculatePacketNumber(UINT64_C(1), UINT64_C(0)); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 575 | 571 |
| 576 // but large numbers should not (even if they're out of order). | 572 // but large numbers should not (even if they're out of order). |
| 577 for (uint64_t j = 0; j < 10; j++) { | 573 for (uint64_t j = 0; j < 10; j++) { |
| 578 uint64_t num = kEpoch - 1 - j; | 574 uint64_t num = kEpoch - 1 - j; |
| 579 CheckCalculatePacketNumber(cur_epoch + num, last); | 575 CheckCalculatePacketNumber(cur_epoch + num, last); |
| 580 } | 576 } |
| 581 } | 577 } |
| 582 } | 578 } |
| 583 | 579 |
| 584 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextMax) { | 580 TEST_P(QuicFramerTest, CalculatePacketNumberFromWireNearNextMax) { |
| 585 const uint64_t max_number = numeric_limits<uint64_t>::max(); | 581 const uint64_t max_number = std::numeric_limits<uint64_t>::max(); |
| 586 const uint64_t max_epoch = max_number & ~kMask; | 582 const uint64_t max_epoch = max_number & ~kMask; |
| 587 | 583 |
| 588 // Cases where the last number was close to the end of the range | 584 // Cases where the last number was close to the end of the range |
| 589 for (uint64_t i = 0; i < 10; i++) { | 585 for (uint64_t i = 0; i < 10; i++) { |
| 590 // Subtract 1, because the expected next packet number is 1 more than the | 586 // Subtract 1, because the expected next packet number is 1 more than the |
| 591 // last packet number. | 587 // last packet number. |
| 592 QuicPacketNumber last = max_number - i - 1; | 588 QuicPacketNumber last = max_number - i - 1; |
| 593 | 589 |
| 594 // Small numbers should not wrap, because they have nowhere to go. | 590 // Small numbers should not wrap, because they have nowhere to go. |
| 595 for (uint64_t j = 0; j < 10; j++) { | 591 for (uint64_t j = 0; j < 10; j++) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 644 | 640 |
| 645 TEST_P(QuicFramerTest, PacketHeader) { | 641 TEST_P(QuicFramerTest, PacketHeader) { |
| 646 // clang-format off | 642 // clang-format off |
| 647 unsigned char packet[] = { | 643 unsigned char packet[] = { |
| 648 // public flags (8 byte connection_id) | 644 // public flags (8 byte connection_id) |
| 649 0x38, | 645 0x38, |
| 650 // connection_id | 646 // connection_id |
| 651 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 647 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 652 // packet number | 648 // packet number |
| 653 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 649 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 654 // private flags | |
| 655 0x00, | |
| 656 }; | |
| 657 unsigned char packet_34[] = { | |
| 658 // public flags (8 byte connection_id) | |
| 659 0x38, | |
| 660 // connection_id | |
| 661 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 662 // packet number | |
| 663 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 664 }; | 650 }; |
| 665 // clang-format on | 651 // clang-format on |
| 666 | 652 |
| 667 QuicEncryptedPacket encrypted( | 653 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 668 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 669 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 670 : arraysize(packet_34), | |
| 671 false); | |
| 672 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 654 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 673 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 655 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
| 674 ASSERT_TRUE(visitor_.header_.get()); | 656 ASSERT_TRUE(visitor_.header_.get()); |
| 675 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 657 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 676 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); | 658 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); |
| 677 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 659 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 678 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 660 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 679 EXPECT_FALSE(visitor_.header_->entropy_flag); | |
| 680 EXPECT_EQ(0, visitor_.header_->entropy_hash); | |
| 681 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); | 661 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); |
| 682 | 662 |
| 683 // Now test framing boundaries. | 663 // Now test framing boundaries. |
| 684 for (size_t i = 0; | 664 for (size_t i = 0; |
| 685 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 665 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 686 !kIncludeVersion, !kIncludePathId, | 666 !kIncludeVersion, !kIncludePathId, |
| 687 !kIncludeDiversificationNonce, | 667 !kIncludeDiversificationNonce, |
| 688 PACKET_6BYTE_PACKET_NUMBER); | 668 PACKET_6BYTE_PACKET_NUMBER); |
| 689 ++i) { | 669 ++i) { |
| 690 string expected_error; | 670 string expected_error; |
| 691 if (i < kConnectionIdOffset) { | 671 if (i < kConnectionIdOffset) { |
| 692 expected_error = "Unable to read public flags."; | 672 expected_error = "Unable to read public flags."; |
| 693 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { | 673 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { |
| 694 expected_error = "Unable to read ConnectionId."; | 674 expected_error = "Unable to read ConnectionId."; |
| 695 } else { | 675 } else { |
| 696 if (framer_.version() <= QUIC_VERSION_33) { | 676 expected_error = "Unable to read packet number."; |
| 697 if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId)) { | |
| 698 expected_error = "Unable to read packet number."; | |
| 699 } else { | |
| 700 expected_error = "Unable to read private flags."; | |
| 701 } | |
| 702 } else { | |
| 703 expected_error = "Unable to read packet number."; | |
| 704 } | |
| 705 } | 677 } |
| 706 CheckProcessingFails( | 678 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 707 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, | |
| 708 expected_error, QUIC_INVALID_PACKET_HEADER); | |
| 709 } | 679 } |
| 710 } | 680 } |
| 711 | 681 |
| 712 TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) { | 682 TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) { |
| 713 QuicFramerPeer::SetLastSerializedConnectionId(&framer_, kConnectionId); | 683 QuicFramerPeer::SetLastSerializedConnectionId(&framer_, kConnectionId); |
| 714 | 684 |
| 715 // clang-format off | 685 // clang-format off |
| 716 unsigned char packet[] = { | 686 unsigned char packet[] = { |
| 717 // public flags (0 byte connection_id) | 687 // public flags (0 byte connection_id) |
| 718 0x30, | 688 0x30, |
| 719 // connection_id | 689 // connection_id |
| 720 // packet number | 690 // packet number |
| 721 0xBC, 0x9A, 0x78, 0x56, | 691 0xBC, 0x9A, 0x78, 0x56, |
| 722 0x34, 0x12, | 692 0x34, 0x12, |
| 723 // private flags | |
| 724 0x00, | |
| 725 }; | |
| 726 unsigned char packet_34[] = { | |
| 727 // public flags (0 byte connection_id) | |
| 728 0x30, | |
| 729 // connection_id | |
| 730 // packet number | |
| 731 0xBC, 0x9A, 0x78, 0x56, | |
| 732 0x34, 0x12, | |
| 733 }; | 693 }; |
| 734 // clang-format on | 694 // clang-format on |
| 735 | 695 |
| 736 QuicEncryptedPacket encrypted( | 696 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 737 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 738 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 739 : arraysize(packet_34), | |
| 740 false); | |
| 741 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 697 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 742 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 698 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
| 743 ASSERT_TRUE(visitor_.header_.get()); | 699 ASSERT_TRUE(visitor_.header_.get()); |
| 744 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 700 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 745 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); | 701 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); |
| 746 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 702 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 747 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 703 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 748 EXPECT_FALSE(visitor_.header_->entropy_flag); | |
| 749 EXPECT_EQ(0, visitor_.header_->entropy_hash); | |
| 750 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); | 704 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); |
| 751 | 705 |
| 752 // Now test framing boundaries. | 706 // Now test framing boundaries. |
| 753 for (size_t i = 0; | 707 for (size_t i = 0; |
| 754 i < GetPacketHeaderSize(framer_.version(), PACKET_0BYTE_CONNECTION_ID, | 708 i < GetPacketHeaderSize(framer_.version(), PACKET_0BYTE_CONNECTION_ID, |
| 755 !kIncludeVersion, !kIncludePathId, | 709 !kIncludeVersion, !kIncludePathId, |
| 756 !kIncludeDiversificationNonce, | 710 !kIncludeDiversificationNonce, |
| 757 PACKET_6BYTE_PACKET_NUMBER); | 711 PACKET_6BYTE_PACKET_NUMBER); |
| 758 ++i) { | 712 ++i) { |
| 759 string expected_error; | 713 string expected_error; |
| 760 if (i < kConnectionIdOffset) { | 714 if (i < kConnectionIdOffset) { |
| 761 expected_error = "Unable to read public flags."; | 715 expected_error = "Unable to read public flags."; |
| 762 } else if (i < GetPacketNumberOffset(PACKET_0BYTE_CONNECTION_ID, | 716 } else if (i < GetPacketNumberOffset(PACKET_0BYTE_CONNECTION_ID, |
| 763 !kIncludeVersion, !kIncludePathId)) { | 717 !kIncludeVersion, !kIncludePathId)) { |
| 764 expected_error = "Unable to read ConnectionId."; | 718 expected_error = "Unable to read ConnectionId."; |
| 765 } else { | 719 } else { |
| 766 if (framer_.version() <= QUIC_VERSION_33) { | 720 expected_error = "Unable to read packet number."; |
| 767 if (i < GetPrivateFlagsOffset(PACKET_0BYTE_CONNECTION_ID, | |
| 768 !kIncludeVersion, !kIncludePathId)) { | |
| 769 expected_error = "Unable to read packet number."; | |
| 770 } else { | |
| 771 expected_error = "Unable to read private flags."; | |
| 772 } | |
| 773 } else { | |
| 774 expected_error = "Unable to read packet number."; | |
| 775 } | |
| 776 } | 721 } |
| 777 CheckProcessingFails( | 722 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 778 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, | |
| 779 expected_error, QUIC_INVALID_PACKET_HEADER); | |
| 780 } | 723 } |
| 781 } | 724 } |
| 782 | 725 |
| 783 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) { | 726 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) { |
| 784 // clang-format off | 727 // clang-format off |
| 785 unsigned char packet[] = { | 728 unsigned char packet[] = { |
| 786 // public flags (version) | 729 // public flags (version) |
| 787 0x39, | 730 0x39, |
| 788 // connection_id | 731 // connection_id |
| 789 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 732 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 790 // version tag | 733 // version tag |
| 791 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | 734 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
| 792 // packet number | 735 // packet number |
| 793 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 736 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 794 // private flags | |
| 795 0x00, | |
| 796 }; | |
| 797 unsigned char packet_34[] = { | |
| 798 // public flags (version) | |
| 799 0x39, | |
| 800 // connection_id | |
| 801 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 802 // version tag | |
| 803 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | |
| 804 // packet number | |
| 805 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 806 }; | 737 }; |
| 807 // clang-format on | 738 // clang-format on |
| 808 | 739 |
| 809 QuicEncryptedPacket encrypted( | 740 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 810 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 811 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 812 : arraysize(packet_34), | |
| 813 false); | |
| 814 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 741 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 815 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 742 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
| 816 ASSERT_TRUE(visitor_.header_.get()); | 743 ASSERT_TRUE(visitor_.header_.get()); |
| 817 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 744 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 818 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); | 745 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); |
| 819 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 746 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 820 EXPECT_TRUE(visitor_.header_->public_header.version_flag); | 747 EXPECT_TRUE(visitor_.header_->public_header.version_flag); |
| 821 EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]); | 748 EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]); |
| 822 EXPECT_FALSE(visitor_.header_->entropy_flag); | |
| 823 EXPECT_EQ(0, visitor_.header_->entropy_hash); | |
| 824 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); | 749 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); |
| 825 | 750 |
| 826 // Now test framing boundaries. | 751 // Now test framing boundaries. |
| 827 for (size_t i = 0; | 752 for (size_t i = 0; |
| 828 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 753 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 829 kIncludeVersion, !kIncludePathId, | 754 kIncludeVersion, !kIncludePathId, |
| 830 !kIncludeDiversificationNonce, | 755 !kIncludeDiversificationNonce, |
| 831 PACKET_6BYTE_PACKET_NUMBER); | 756 PACKET_6BYTE_PACKET_NUMBER); |
| 832 ++i) { | 757 ++i) { |
| 833 string expected_error; | 758 string expected_error; |
| 834 if (i < kConnectionIdOffset) { | 759 if (i < kConnectionIdOffset) { |
| 835 expected_error = "Unable to read public flags."; | 760 expected_error = "Unable to read public flags."; |
| 836 } else if (i < kVersionOffset) { | 761 } else if (i < kVersionOffset) { |
| 837 expected_error = "Unable to read ConnectionId."; | 762 expected_error = "Unable to read ConnectionId."; |
| 838 } else if (i < GetPacketNumberOffset(kIncludeVersion, !kIncludePathId)) { | 763 } else if (i < GetPacketNumberOffset(kIncludeVersion, !kIncludePathId)) { |
| 839 expected_error = "Unable to read protocol version."; | 764 expected_error = "Unable to read protocol version."; |
| 840 } else { | 765 } else { |
| 841 if (framer_.version() <= QUIC_VERSION_33) { | 766 expected_error = "Unable to read packet number."; |
| 842 if (i < GetPrivateFlagsOffset(kIncludeVersion, !kIncludePathId)) { | |
| 843 expected_error = "Unable to read packet number."; | |
| 844 } else { | |
| 845 expected_error = "Unable to read private flags."; | |
| 846 } | |
| 847 } else { | |
| 848 expected_error = "Unable to read packet number."; | |
| 849 } | |
| 850 } | 767 } |
| 851 CheckProcessingFails( | 768 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 852 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, | |
| 853 expected_error, QUIC_INVALID_PACKET_HEADER); | |
| 854 } | 769 } |
| 855 } | 770 } |
| 856 | 771 |
| 857 TEST_P(QuicFramerTest, PacketHeaderWithMultipathFlag) { | 772 TEST_P(QuicFramerTest, PacketHeaderWithMultipathFlag) { |
| 858 // clang-format off | 773 // clang-format off |
| 859 unsigned char packet[] = { | 774 unsigned char packet[] = { |
| 860 // public flags (version) | 775 // public flags (version) |
| 861 0x78, | 776 0x78, |
| 862 // connection_id | 777 // connection_id |
| 863 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 778 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 864 // path_id | 779 // path_id |
| 865 0x42, | 780 0x42, |
| 866 // packet number | 781 // packet number |
| 867 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 782 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 868 // private flags | |
| 869 0x00, | |
| 870 }; | |
| 871 unsigned char packet_34[] = { | |
| 872 // public flags (version) | |
| 873 0x78, | |
| 874 // connection_id | |
| 875 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 876 // path_id | |
| 877 0x42, | |
| 878 // packet number | |
| 879 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 880 }; | 783 }; |
| 881 // clang-format on | 784 // clang-format on |
| 882 | 785 |
| 883 QuicEncryptedPacket encrypted( | 786 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 884 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 885 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 886 : arraysize(packet_34), | |
| 887 false); | |
| 888 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 787 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 889 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 788 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
| 890 ASSERT_TRUE(visitor_.header_.get()); | 789 ASSERT_TRUE(visitor_.header_.get()); |
| 891 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, kIncludePathId, | 790 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, kIncludePathId, |
| 892 !kIncludeDiversificationNonce)); | 791 !kIncludeDiversificationNonce)); |
| 893 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 792 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 894 EXPECT_TRUE(visitor_.header_->public_header.multipath_flag); | 793 EXPECT_TRUE(visitor_.header_->public_header.multipath_flag); |
| 895 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 794 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 896 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 795 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 897 EXPECT_FALSE(visitor_.header_->entropy_flag); | |
| 898 EXPECT_EQ(0, visitor_.header_->entropy_hash); | |
| 899 EXPECT_EQ(kPathId, visitor_.header_->path_id); | 796 EXPECT_EQ(kPathId, visitor_.header_->path_id); |
| 900 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); | 797 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); |
| 901 | 798 |
| 902 // Now test framing boundaries. | 799 // Now test framing boundaries. |
| 903 for (size_t i = 0; | 800 for (size_t i = 0; |
| 904 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 801 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 905 !kIncludeVersion, kIncludePathId, | 802 !kIncludeVersion, kIncludePathId, |
| 906 !kIncludeDiversificationNonce, | 803 !kIncludeDiversificationNonce, |
| 907 PACKET_6BYTE_PACKET_NUMBER); | 804 PACKET_6BYTE_PACKET_NUMBER); |
| 908 ++i) { | 805 ++i) { |
| 909 string expected_error; | 806 string expected_error; |
| 910 if (i < kConnectionIdOffset) { | 807 if (i < kConnectionIdOffset) { |
| 911 expected_error = "Unable to read public flags."; | 808 expected_error = "Unable to read public flags."; |
| 912 } else if (i < | 809 } else if (i < |
| 913 GetPathIdOffset(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion)) { | 810 GetPathIdOffset(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion)) { |
| 914 expected_error = "Unable to read ConnectionId."; | 811 expected_error = "Unable to read ConnectionId."; |
| 915 } else if (i < GetPacketNumberOffset(!kIncludeVersion, kIncludePathId)) { | 812 } else if (i < GetPacketNumberOffset(!kIncludeVersion, kIncludePathId)) { |
| 916 expected_error = "Unable to read path id."; | 813 expected_error = "Unable to read path id."; |
| 917 } else { | 814 } else { |
| 918 if (framer_.version() <= QUIC_VERSION_33) { | 815 expected_error = "Unable to read packet number."; |
| 919 if (i < GetPrivateFlagsOffset(!kIncludeVersion, kIncludePathId)) { | |
| 920 expected_error = "Unable to read packet number."; | |
| 921 } else { | |
| 922 expected_error = "Unable to read private flags."; | |
| 923 } | |
| 924 } else { | |
| 925 expected_error = "Unable to read packet number."; | |
| 926 } | |
| 927 } | 816 } |
| 928 CheckProcessingFails( | 817 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 929 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, | |
| 930 expected_error, QUIC_INVALID_PACKET_HEADER); | |
| 931 } | 818 } |
| 932 } | 819 } |
| 933 | 820 |
| 934 TEST_P(QuicFramerTest, PacketHeaderWithBothVersionFlagAndMultipathFlag) { | 821 TEST_P(QuicFramerTest, PacketHeaderWithBothVersionFlagAndMultipathFlag) { |
| 935 // clang-format off | 822 // clang-format off |
| 936 unsigned char packet[] = { | 823 unsigned char packet[] = { |
| 937 // public flags (version) | 824 // public flags (version) |
| 938 0x79, | 825 0x79, |
| 939 // connection_id | 826 // connection_id |
| 940 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 827 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 941 // version tag | 828 // version tag |
| 942 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | 829 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
| 943 // path_id | 830 // path_id |
| 944 0x42, | 831 0x42, |
| 945 // packet number | 832 // packet number |
| 946 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 833 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 947 // private flags | |
| 948 0x00, | |
| 949 }; | |
| 950 unsigned char packet_34[] = { | |
| 951 // public flags (version) | |
| 952 0x79, | |
| 953 // connection_id | |
| 954 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 955 // version tag | |
| 956 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | |
| 957 // path_id | |
| 958 0x42, | |
| 959 // packet number | |
| 960 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 961 }; | 834 }; |
| 962 // clang-format on | 835 // clang-format on |
| 963 | 836 |
| 964 QuicEncryptedPacket encrypted( | 837 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 965 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 966 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 967 : arraysize(packet_34), | |
| 968 false); | |
| 969 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 838 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 970 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 839 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
| 971 ASSERT_TRUE(visitor_.header_.get()); | 840 ASSERT_TRUE(visitor_.header_.get()); |
| 972 EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion, kIncludePathId, | 841 EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion, kIncludePathId, |
| 973 !kIncludeDiversificationNonce)); | 842 !kIncludeDiversificationNonce)); |
| 974 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 843 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 975 EXPECT_TRUE(visitor_.header_->public_header.multipath_flag); | 844 EXPECT_TRUE(visitor_.header_->public_header.multipath_flag); |
| 976 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 845 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 977 EXPECT_TRUE(visitor_.header_->public_header.version_flag); | 846 EXPECT_TRUE(visitor_.header_->public_header.version_flag); |
| 978 EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]); | 847 EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]); |
| 979 EXPECT_FALSE(visitor_.header_->entropy_flag); | |
| 980 EXPECT_EQ(0, visitor_.header_->entropy_hash); | |
| 981 EXPECT_EQ(kPathId, visitor_.header_->path_id); | 848 EXPECT_EQ(kPathId, visitor_.header_->path_id); |
| 982 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); | 849 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); |
| 983 | 850 |
| 984 // Now test framing boundaries. | 851 // Now test framing boundaries. |
| 985 for (size_t i = 0; | 852 for (size_t i = 0; |
| 986 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 853 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 987 !kIncludeVersion, kIncludePathId, | 854 !kIncludeVersion, kIncludePathId, |
| 988 !kIncludeDiversificationNonce, | 855 !kIncludeDiversificationNonce, |
| 989 PACKET_6BYTE_PACKET_NUMBER); | 856 PACKET_6BYTE_PACKET_NUMBER); |
| 990 ++i) { | 857 ++i) { |
| 991 string expected_error; | 858 string expected_error; |
| 992 if (i < kConnectionIdOffset) { | 859 if (i < kConnectionIdOffset) { |
| 993 expected_error = "Unable to read public flags."; | 860 expected_error = "Unable to read public flags."; |
| 994 } else if (i < kVersionOffset) { | 861 } else if (i < kVersionOffset) { |
| 995 expected_error = "Unable to read ConnectionId."; | 862 expected_error = "Unable to read ConnectionId."; |
| 996 } else if (i < | 863 } else if (i < |
| 997 GetPathIdOffset(PACKET_8BYTE_CONNECTION_ID, kIncludeVersion)) { | 864 GetPathIdOffset(PACKET_8BYTE_CONNECTION_ID, kIncludeVersion)) { |
| 998 expected_error = "Unable to read protocol version."; | 865 expected_error = "Unable to read protocol version."; |
| 999 } else if (i < GetPacketNumberOffset(kIncludeVersion, kIncludePathId)) { | 866 } else if (i < GetPacketNumberOffset(kIncludeVersion, kIncludePathId)) { |
| 1000 expected_error = "Unable to read path id."; | 867 expected_error = "Unable to read path id."; |
| 1001 } else { | 868 } else { |
| 1002 if (framer_.version() <= QUIC_VERSION_33) { | 869 expected_error = "Unable to read packet number."; |
| 1003 if (i < GetPrivateFlagsOffset(kIncludeVersion, kIncludePathId)) { | |
| 1004 expected_error = "Unable to read packet number."; | |
| 1005 } else { | |
| 1006 expected_error = "Unable to read private flags."; | |
| 1007 } | |
| 1008 } else { | |
| 1009 expected_error = "Unable to read packet number."; | |
| 1010 } | |
| 1011 } | 870 } |
| 1012 CheckProcessingFails( | 871 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 1013 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, | |
| 1014 expected_error, QUIC_INVALID_PACKET_HEADER); | |
| 1015 } | 872 } |
| 1016 } | 873 } |
| 1017 | 874 |
| 1018 TEST_P(QuicFramerTest, PacketHeaderWithPathChange) { | 875 TEST_P(QuicFramerTest, PacketHeaderWithPathChange) { |
| 1019 // Packet 1 from path 0x42. | 876 // Packet 1 from path 0x42. |
| 1020 // clang-format off | 877 // clang-format off |
| 1021 unsigned char packet1[] = { | 878 unsigned char packet1[] = { |
| 1022 // public flags (version) | 879 // public flags (version) |
| 1023 0x78, | 880 0x78, |
| 1024 // connection_id | 881 // connection_id |
| 1025 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 882 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 1026 // path_id | 883 // path_id |
| 1027 0x42, | 884 0x42, |
| 1028 // packet number | 885 // packet number |
| 1029 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 886 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 1030 // private flags | |
| 1031 0x00, | |
| 1032 }; | |
| 1033 unsigned char packet1_34[] = { | |
| 1034 // public flags (version) | |
| 1035 0x78, | |
| 1036 // connection_id | |
| 1037 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 1038 // path_id | |
| 1039 0x42, | |
| 1040 // packet number | |
| 1041 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 1042 }; | 887 }; |
| 1043 // clang-format on | 888 // clang-format on |
| 1044 | 889 |
| 1045 EXPECT_EQ(0u, QuicFramerPeer::GetLastPacketNumber(&framer_)); | 890 EXPECT_EQ(0u, QuicFramerPeer::GetLastPacketNumber(&framer_)); |
| 1046 EXPECT_EQ(kInvalidPathId, QuicFramerPeer::GetLastPathId(&framer_)); | 891 EXPECT_EQ(kInvalidPathId, QuicFramerPeer::GetLastPathId(&framer_)); |
| 1047 QuicEncryptedPacket encrypted1( | 892 QuicEncryptedPacket encrypted1(AsChars(packet1), arraysize(packet1), false); |
| 1048 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet1 : packet1_34), | |
| 1049 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet1) | |
| 1050 : arraysize(packet1_34), | |
| 1051 false); | |
| 1052 EXPECT_FALSE(framer_.ProcessPacket(encrypted1)); | 893 EXPECT_FALSE(framer_.ProcessPacket(encrypted1)); |
| 1053 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 894 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
| 1054 ASSERT_TRUE(visitor_.header_.get()); | 895 ASSERT_TRUE(visitor_.header_.get()); |
| 1055 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 896 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 1056 EXPECT_EQ(kPathId, visitor_.header_->path_id); | 897 EXPECT_EQ(kPathId, visitor_.header_->path_id); |
| 1057 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); | 898 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); |
| 1058 EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLastPacketNumber(&framer_)); | 899 EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLastPacketNumber(&framer_)); |
| 1059 EXPECT_EQ(kPathId, QuicFramerPeer::GetLastPathId(&framer_)); | 900 EXPECT_EQ(kPathId, QuicFramerPeer::GetLastPathId(&framer_)); |
| 1060 | 901 |
| 1061 // Packet 2 from default path. | 902 // Packet 2 from default path. |
| 1062 // clang-format off | 903 // clang-format off |
| 1063 unsigned char packet2[] = { | 904 unsigned char packet2[] = { |
| 1064 // public flags (version) | 905 // public flags (version) |
| 1065 0x78, | 906 0x78, |
| 1066 // connection_id | 907 // connection_id |
| 1067 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 908 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 1068 // path_id | 909 // path_id |
| 1069 0x00, | 910 0x00, |
| 1070 // packet number | 911 // packet number |
| 1071 0xCC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 912 0xCC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 1072 // private flags | |
| 1073 0x00, | |
| 1074 }; | |
| 1075 unsigned char packet2_34[] = { | |
| 1076 // public flags (version) | |
| 1077 0x78, | |
| 1078 // connection_id | |
| 1079 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 1080 // path_id | |
| 1081 0x00, | |
| 1082 // packet number | |
| 1083 0xCC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 1084 }; | 913 }; |
| 1085 // clang-format on | 914 // clang-format on |
| 1086 | 915 |
| 1087 QuicEncryptedPacket encrypted2( | 916 QuicEncryptedPacket encrypted2(AsChars(packet2), arraysize(packet2), false); |
| 1088 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet2 : packet2_34), | |
| 1089 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet2) | |
| 1090 : arraysize(packet2_34), | |
| 1091 false); | |
| 1092 EXPECT_FALSE(framer_.ProcessPacket(encrypted2)); | 917 EXPECT_FALSE(framer_.ProcessPacket(encrypted2)); |
| 1093 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 918 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
| 1094 ASSERT_TRUE(visitor_.header_.get()); | 919 ASSERT_TRUE(visitor_.header_.get()); |
| 1095 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 920 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 1096 EXPECT_EQ(kDefaultPathId, visitor_.header_->path_id); | 921 EXPECT_EQ(kDefaultPathId, visitor_.header_->path_id); |
| 1097 EXPECT_EQ(kPacketNumber + 16, visitor_.header_->packet_number); | 922 EXPECT_EQ(kPacketNumber + 16, visitor_.header_->packet_number); |
| 1098 EXPECT_EQ(kPacketNumber + 16, QuicFramerPeer::GetLastPacketNumber(&framer_)); | 923 EXPECT_EQ(kPacketNumber + 16, QuicFramerPeer::GetLastPacketNumber(&framer_)); |
| 1099 EXPECT_EQ(kDefaultPathId, QuicFramerPeer::GetLastPathId(&framer_)); | 924 EXPECT_EQ(kDefaultPathId, QuicFramerPeer::GetLastPathId(&framer_)); |
| 1100 | 925 |
| 1101 // Packet 3 from path 0x42. | 926 // Packet 3 from path 0x42. |
| 1102 // clang-format off | 927 // clang-format off |
| 1103 unsigned char packet3[] = { | 928 unsigned char packet3[] = { |
| 1104 // public flags (version) | 929 // public flags (version) |
| 1105 0x78, | 930 0x78, |
| 1106 // connection_id | 931 // connection_id |
| 1107 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 932 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 1108 // path_id | 933 // path_id |
| 1109 0x42, | 934 0x42, |
| 1110 // packet number | 935 // packet number |
| 1111 0xBD, 0x9A, 0x78, 0x56, 0x34, 0x12, | 936 0xBD, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 1112 // private flags | |
| 1113 0x00, | |
| 1114 }; | |
| 1115 unsigned char packet3_34[] = { | |
| 1116 // public flags (version) | |
| 1117 0x78, | |
| 1118 // connection_id | |
| 1119 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 1120 // path_id | |
| 1121 0x42, | |
| 1122 // packet number | |
| 1123 0xBD, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 1124 }; | 937 }; |
| 1125 // clang-format on | 938 // clang-format on |
| 1126 | 939 |
| 1127 QuicEncryptedPacket encrypted3( | 940 QuicEncryptedPacket encrypted3(AsChars(packet3), arraysize(packet3), false); |
| 1128 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet3 : packet3_34), | |
| 1129 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet3) | |
| 1130 : arraysize(packet3_34), | |
| 1131 false); | |
| 1132 EXPECT_FALSE(framer_.ProcessPacket(encrypted3)); | 941 EXPECT_FALSE(framer_.ProcessPacket(encrypted3)); |
| 1133 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 942 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
| 1134 ASSERT_TRUE(visitor_.header_.get()); | 943 ASSERT_TRUE(visitor_.header_.get()); |
| 1135 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 944 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 1136 EXPECT_EQ(kPathId, visitor_.header_->path_id); | 945 EXPECT_EQ(kPathId, visitor_.header_->path_id); |
| 1137 EXPECT_EQ(kPacketNumber + 1, visitor_.header_->packet_number); | 946 EXPECT_EQ(kPacketNumber + 1, visitor_.header_->packet_number); |
| 1138 EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLastPacketNumber(&framer_)); | 947 EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLastPacketNumber(&framer_)); |
| 1139 EXPECT_EQ(kPathId, QuicFramerPeer::GetLastPathId(&framer_)); | 948 EXPECT_EQ(kPathId, QuicFramerPeer::GetLastPathId(&framer_)); |
| 1140 } | 949 } |
| 1141 | 950 |
| 1142 TEST_P(QuicFramerTest, ReceivedPacketOnClosedPath) { | 951 TEST_P(QuicFramerTest, ReceivedPacketOnClosedPath) { |
| 1143 // Packet 1 from path 0x42. | 952 // Packet 1 from path 0x42. |
| 1144 // clang-format off | 953 // clang-format off |
| 1145 unsigned char packet[] = { | 954 unsigned char packet[] = { |
| 1146 // public flags (version) | 955 // public flags (version) |
| 1147 0x78, | 956 0x78, |
| 1148 // connection_id | 957 // connection_id |
| 1149 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 958 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 1150 // path_id | 959 // path_id |
| 1151 0x42, | 960 0x42, |
| 1152 // packet number | 961 // packet number |
| 1153 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 962 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 1154 // private flags | 963 // private flags |
| 1155 0x00, | 964 0x00, |
| 1156 }; | 965 }; |
| 1157 unsigned char packet_34[] = { | |
| 1158 // public flags (version) | |
| 1159 0x78, | |
| 1160 // connection_id | |
| 1161 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 1162 // path_id | |
| 1163 0x42, | |
| 1164 // packet number | |
| 1165 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 1166 // private flags | |
| 1167 0x00, | |
| 1168 }; | |
| 1169 // clang-format on | 966 // clang-format on |
| 1170 | 967 |
| 1171 framer_.OnPathClosed(kPathId); | 968 framer_.OnPathClosed(kPathId); |
| 1172 QuicEncryptedPacket encrypted( | 969 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1173 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 1174 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 1175 : arraysize(packet_34), | |
| 1176 false); | |
| 1177 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 970 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 1178 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 971 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1179 EXPECT_EQ(0u, QuicFramerPeer::GetLastPacketNumber(&framer_)); | 972 EXPECT_EQ(0u, QuicFramerPeer::GetLastPacketNumber(&framer_)); |
| 1180 EXPECT_EQ(kInvalidPathId, QuicFramerPeer::GetLastPathId(&framer_)); | 973 EXPECT_EQ(kInvalidPathId, QuicFramerPeer::GetLastPathId(&framer_)); |
| 1181 } | 974 } |
| 1182 | 975 |
| 1183 TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) { | 976 TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) { |
| 1184 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2); | 977 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2); |
| 1185 | 978 |
| 1186 // clang-format off | 979 // clang-format off |
| 1187 unsigned char packet[] = { | 980 unsigned char packet[] = { |
| 1188 // public flags (8 byte connection_id and 4 byte packet number) | 981 // public flags (8 byte connection_id and 4 byte packet number) |
| 1189 0x28, | 982 0x28, |
| 1190 // connection_id | 983 // connection_id |
| 1191 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 984 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 1192 // packet number | 985 // packet number |
| 1193 0xBC, 0x9A, 0x78, 0x56, | 986 0xBC, 0x9A, 0x78, 0x56, |
| 1194 // private flags | |
| 1195 0x00, | |
| 1196 }; | |
| 1197 unsigned char packet_34[] = { | |
| 1198 // public flags (8 byte connection_id and 4 byte packet number) | |
| 1199 0x28, | |
| 1200 // connection_id | |
| 1201 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 1202 // packet number | |
| 1203 0xBC, 0x9A, 0x78, 0x56, | |
| 1204 }; | 987 }; |
| 1205 // clang-format on | 988 // clang-format on |
| 1206 | 989 |
| 1207 QuicEncryptedPacket encrypted( | 990 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1208 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 1209 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 1210 : arraysize(packet_34), | |
| 1211 false); | |
| 1212 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 991 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 1213 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 992 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
| 1214 ASSERT_TRUE(visitor_.header_.get()); | 993 ASSERT_TRUE(visitor_.header_.get()); |
| 1215 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 994 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 1216 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); | 995 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); |
| 1217 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 996 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 1218 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 997 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 1219 EXPECT_FALSE(visitor_.header_->entropy_flag); | |
| 1220 EXPECT_EQ(0, visitor_.header_->entropy_hash); | |
| 1221 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); | 998 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); |
| 1222 | 999 |
| 1223 // Now test framing boundaries. | 1000 // Now test framing boundaries. |
| 1224 for (size_t i = 0; | 1001 for (size_t i = 0; |
| 1225 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 1002 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 1226 !kIncludeVersion, !kIncludePathId, | 1003 !kIncludeVersion, !kIncludePathId, |
| 1227 !kIncludeDiversificationNonce, | 1004 !kIncludeDiversificationNonce, |
| 1228 PACKET_4BYTE_PACKET_NUMBER); | 1005 PACKET_4BYTE_PACKET_NUMBER); |
| 1229 ++i) { | 1006 ++i) { |
| 1230 string expected_error; | 1007 string expected_error; |
| 1231 if (i < kConnectionIdOffset) { | 1008 if (i < kConnectionIdOffset) { |
| 1232 expected_error = "Unable to read public flags."; | 1009 expected_error = "Unable to read public flags."; |
| 1233 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { | 1010 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { |
| 1234 expected_error = "Unable to read ConnectionId."; | 1011 expected_error = "Unable to read ConnectionId."; |
| 1235 } else { | 1012 } else { |
| 1236 if (framer_.version() <= QUIC_VERSION_33) { | 1013 expected_error = "Unable to read packet number."; |
| 1237 if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId, | |
| 1238 PACKET_4BYTE_PACKET_NUMBER)) { | |
| 1239 expected_error = "Unable to read packet number."; | |
| 1240 } else { | |
| 1241 expected_error = "Unable to read private flags."; | |
| 1242 } | |
| 1243 } else { | |
| 1244 expected_error = "Unable to read packet number."; | |
| 1245 } | |
| 1246 } | 1014 } |
| 1247 CheckProcessingFails( | 1015 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 1248 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, | |
| 1249 expected_error, QUIC_INVALID_PACKET_HEADER); | |
| 1250 } | 1016 } |
| 1251 } | 1017 } |
| 1252 | 1018 |
| 1253 TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) { | 1019 TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) { |
| 1254 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2); | 1020 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2); |
| 1255 | 1021 |
| 1256 // clang-format off | 1022 // clang-format off |
| 1257 unsigned char packet[] = { | 1023 unsigned char packet[] = { |
| 1258 // public flags (8 byte connection_id and 2 byte packet number) | 1024 // public flags (8 byte connection_id and 2 byte packet number) |
| 1259 0x18, | 1025 0x18, |
| 1260 // connection_id | 1026 // connection_id |
| 1261 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 1027 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 1262 // packet number | 1028 // packet number |
| 1263 0xBC, 0x9A, | 1029 0xBC, 0x9A, |
| 1264 // private flags | |
| 1265 0x00, | |
| 1266 }; | |
| 1267 unsigned char packet_34[] = { | |
| 1268 // public flags (8 byte connection_id and 2 byte packet number) | |
| 1269 0x18, | |
| 1270 // connection_id | |
| 1271 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 1272 // packet number | |
| 1273 0xBC, 0x9A, | |
| 1274 }; | 1030 }; |
| 1275 // clang-format on | 1031 // clang-format on |
| 1276 | 1032 |
| 1277 QuicEncryptedPacket encrypted( | 1033 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1278 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 1279 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 1280 : arraysize(packet_34), | |
| 1281 false); | |
| 1282 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 1034 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 1283 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 1035 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
| 1284 ASSERT_TRUE(visitor_.header_.get()); | 1036 ASSERT_TRUE(visitor_.header_.get()); |
| 1285 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 1037 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 1286 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); | 1038 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); |
| 1287 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 1039 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 1288 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 1040 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 1289 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, | 1041 EXPECT_EQ(PACKET_2BYTE_PACKET_NUMBER, |
| 1290 visitor_.header_->public_header.packet_number_length); | 1042 visitor_.header_->public_header.packet_number_length); |
| 1291 EXPECT_FALSE(visitor_.header_->entropy_flag); | |
| 1292 EXPECT_EQ(0, visitor_.header_->entropy_hash); | |
| 1293 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); | 1043 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); |
| 1294 | 1044 |
| 1295 // Now test framing boundaries. | 1045 // Now test framing boundaries. |
| 1296 for (size_t i = 0; | 1046 for (size_t i = 0; |
| 1297 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 1047 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 1298 !kIncludeVersion, !kIncludePathId, | 1048 !kIncludeVersion, !kIncludePathId, |
| 1299 !kIncludeDiversificationNonce, | 1049 !kIncludeDiversificationNonce, |
| 1300 PACKET_2BYTE_PACKET_NUMBER); | 1050 PACKET_2BYTE_PACKET_NUMBER); |
| 1301 ++i) { | 1051 ++i) { |
| 1302 string expected_error; | 1052 string expected_error; |
| 1303 if (i < kConnectionIdOffset) { | 1053 if (i < kConnectionIdOffset) { |
| 1304 expected_error = "Unable to read public flags."; | 1054 expected_error = "Unable to read public flags."; |
| 1305 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { | 1055 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { |
| 1306 expected_error = "Unable to read ConnectionId."; | 1056 expected_error = "Unable to read ConnectionId."; |
| 1307 } else { | 1057 } else { |
| 1308 if (framer_.version() <= QUIC_VERSION_33) { | 1058 expected_error = "Unable to read packet number."; |
| 1309 if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId, | |
| 1310 PACKET_2BYTE_PACKET_NUMBER)) { | |
| 1311 expected_error = "Unable to read packet number."; | |
| 1312 } else { | |
| 1313 expected_error = "Unable to read private flags."; | |
| 1314 } | |
| 1315 } else { | |
| 1316 expected_error = "Unable to read packet number."; | |
| 1317 } | |
| 1318 } | 1059 } |
| 1319 CheckProcessingFails( | 1060 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 1320 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, | |
| 1321 expected_error, QUIC_INVALID_PACKET_HEADER); | |
| 1322 } | 1061 } |
| 1323 } | 1062 } |
| 1324 | 1063 |
| 1325 TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) { | 1064 TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) { |
| 1326 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2); | 1065 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2); |
| 1327 | 1066 |
| 1328 // clang-format off | 1067 // clang-format off |
| 1329 unsigned char packet[] = { | 1068 unsigned char packet[] = { |
| 1330 // public flags (8 byte connection_id and 1 byte packet number) | 1069 // public flags (8 byte connection_id and 1 byte packet number) |
| 1331 0x08, | 1070 0x08, |
| 1332 // connection_id | 1071 // connection_id |
| 1333 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 1072 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 1334 // packet number | 1073 // packet number |
| 1335 0xBC, | 1074 0xBC, |
| 1336 // private flags | |
| 1337 0x00, | |
| 1338 }; | |
| 1339 unsigned char packet_34[] = { | |
| 1340 // public flags (8 byte connection_id and 1 byte packet number) | |
| 1341 0x08, | |
| 1342 // connection_id | |
| 1343 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 1344 // packet number | |
| 1345 0xBC, | |
| 1346 }; | 1075 }; |
| 1347 // clang-format on | 1076 // clang-format on |
| 1348 | 1077 |
| 1349 QuicEncryptedPacket encrypted( | 1078 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1350 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 1351 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 1352 : arraysize(packet_34), | |
| 1353 false); | |
| 1354 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 1079 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 1355 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 1080 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
| 1356 ASSERT_TRUE(visitor_.header_.get()); | 1081 ASSERT_TRUE(visitor_.header_.get()); |
| 1357 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 1082 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 1358 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); | 1083 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); |
| 1359 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 1084 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
| 1360 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 1085 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
| 1361 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1086 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
| 1362 visitor_.header_->public_header.packet_number_length); | 1087 visitor_.header_->public_header.packet_number_length); |
| 1363 EXPECT_FALSE(visitor_.header_->entropy_flag); | |
| 1364 EXPECT_EQ(0, visitor_.header_->entropy_hash); | |
| 1365 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); | 1088 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); |
| 1366 | 1089 |
| 1367 // Now test framing boundaries. | 1090 // Now test framing boundaries. |
| 1368 for (size_t i = 0; | 1091 for (size_t i = 0; |
| 1369 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 1092 i < GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 1370 !kIncludeVersion, !kIncludePathId, | 1093 !kIncludeVersion, !kIncludePathId, |
| 1371 !kIncludeDiversificationNonce, | 1094 !kIncludeDiversificationNonce, |
| 1372 PACKET_1BYTE_PACKET_NUMBER); | 1095 PACKET_1BYTE_PACKET_NUMBER); |
| 1373 ++i) { | 1096 ++i) { |
| 1374 string expected_error; | 1097 string expected_error; |
| 1375 if (i < kConnectionIdOffset) { | 1098 if (i < kConnectionIdOffset) { |
| 1376 expected_error = "Unable to read public flags."; | 1099 expected_error = "Unable to read public flags."; |
| 1377 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { | 1100 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { |
| 1378 expected_error = "Unable to read ConnectionId."; | 1101 expected_error = "Unable to read ConnectionId."; |
| 1379 } else { | 1102 } else { |
| 1380 if (framer_.version() <= QUIC_VERSION_33) { | 1103 expected_error = "Unable to read packet number."; |
| 1381 if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId, | |
| 1382 PACKET_1BYTE_PACKET_NUMBER)) { | |
| 1383 expected_error = "Unable to read packet number."; | |
| 1384 } else { | |
| 1385 expected_error = "Unable to read private flags."; | |
| 1386 } | |
| 1387 } else { | |
| 1388 expected_error = "Unable to read packet number."; | |
| 1389 } | |
| 1390 } | 1104 } |
| 1391 CheckProcessingFails( | 1105 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
| 1392 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, i, | |
| 1393 expected_error, QUIC_INVALID_PACKET_HEADER); | |
| 1394 } | 1106 } |
| 1395 } | 1107 } |
| 1396 | 1108 |
| 1397 TEST_P(QuicFramerTest, PacketNumberDecreasesThenIncreases) { | 1109 TEST_P(QuicFramerTest, PacketNumberDecreasesThenIncreases) { |
| 1398 // Test the case when a packet is received from the past and future packet | 1110 // Test the case when a packet is received from the past and future packet |
| 1399 // numbers are still calculated relative to the largest received packet. | 1111 // numbers are still calculated relative to the largest received packet. |
| 1400 QuicPacketHeader header; | 1112 QuicPacketHeader header; |
| 1401 header.public_header.connection_id = kConnectionId; | 1113 header.public_header.connection_id = kConnectionId; |
| 1402 header.public_header.reset_flag = false; | 1114 header.public_header.reset_flag = false; |
| 1403 header.public_header.version_flag = false; | 1115 header.public_header.version_flag = false; |
| 1404 header.entropy_flag = false; | |
| 1405 header.packet_number = kPacketNumber - 2; | 1116 header.packet_number = kPacketNumber - 2; |
| 1406 | 1117 |
| 1407 QuicPaddingFrame padding_frame; | 1118 QuicPaddingFrame padding_frame; |
| 1408 QuicFrames frames; | 1119 QuicFrames frames; |
| 1409 frames.push_back(QuicFrame(padding_frame)); | 1120 frames.push_back(QuicFrame(padding_frame)); |
| 1410 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 1121 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 1411 ASSERT_TRUE(data != nullptr); | 1122 ASSERT_TRUE(data != nullptr); |
| 1412 | 1123 |
| 1413 QuicEncryptedPacket encrypted(data->data(), data->length(), false); | 1124 QuicEncryptedPacket encrypted(data->data(), data->length(), false); |
| 1414 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1125 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1448 data.reset(BuildDataPacket(header, frames)); | 1159 data.reset(BuildDataPacket(header, frames)); |
| 1449 QuicEncryptedPacket encrypted3(data->data(), data->length(), false); | 1160 QuicEncryptedPacket encrypted3(data->data(), data->length(), false); |
| 1450 EXPECT_TRUE(framer_.ProcessPacket(encrypted3)); | 1161 EXPECT_TRUE(framer_.ProcessPacket(encrypted3)); |
| 1451 ASSERT_TRUE(visitor_.header_.get()); | 1162 ASSERT_TRUE(visitor_.header_.get()); |
| 1452 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | 1163 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); |
| 1453 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, | 1164 EXPECT_EQ(PACKET_1BYTE_PACKET_NUMBER, |
| 1454 visitor_.header_->public_header.packet_number_length); | 1165 visitor_.header_->public_header.packet_number_length); |
| 1455 EXPECT_EQ(kPacketNumber - 1, visitor_.header_->packet_number); | 1166 EXPECT_EQ(kPacketNumber - 1, visitor_.header_->packet_number); |
| 1456 } | 1167 } |
| 1457 | 1168 |
| 1458 TEST_P(QuicFramerTest, InvalidPublicFlag) { | |
| 1459 if (framer_.version() > QUIC_VERSION_33) { | |
| 1460 return; | |
| 1461 } | |
| 1462 // clang-format off | |
| 1463 unsigned char packet[] = { | |
| 1464 // public flags: all flags set but the public reset flag and version flag. | |
| 1465 0xF8, | |
| 1466 // connection_id | |
| 1467 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 1468 // packet number | |
| 1469 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 1470 // private flags | |
| 1471 0x00, | |
| 1472 | |
| 1473 // frame type (padding) | |
| 1474 0x00, | |
| 1475 0x00, 0x00, 0x00, 0x00 | |
| 1476 }; | |
| 1477 // clang-format on | |
| 1478 | |
| 1479 CheckProcessingFails(packet, arraysize(packet), "Illegal public flags value.", | |
| 1480 QUIC_INVALID_PACKET_HEADER); | |
| 1481 | |
| 1482 // Now turn off validation. | |
| 1483 framer_.set_validate_flags(false); | |
| 1484 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
| 1485 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
| 1486 }; | |
| 1487 | |
| 1488 TEST_P(QuicFramerTest, PacketWithDiversificationNonce) { | 1169 TEST_P(QuicFramerTest, PacketWithDiversificationNonce) { |
| 1489 // clang-format off | 1170 // clang-format off |
| 1490 unsigned char packet[] = { | 1171 unsigned char packet[] = { |
| 1491 // public flags: includes nonce flag | 1172 // public flags: includes nonce flag |
| 1492 0x7C, | 1173 0x7C, |
| 1493 // connection_id | 1174 // connection_id |
| 1494 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 1175 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 1495 // nonce | 1176 // nonce |
| 1496 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | 1177 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, |
| 1497 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | 1178 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, |
| 1498 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | 1179 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, |
| 1499 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, | 1180 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, |
| 1500 // packet number | 1181 // packet number |
| 1501 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 1182 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 1502 // private flags | |
| 1503 0x00, | |
| 1504 | |
| 1505 // frame type (padding) | |
| 1506 0x00, | |
| 1507 0x00, 0x00, 0x00, 0x00 | |
| 1508 }; | |
| 1509 unsigned char packet_34[] = { | |
| 1510 // public flags: includes nonce flag | |
| 1511 0x7C, | |
| 1512 // connection_id | |
| 1513 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 1514 // nonce | |
| 1515 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, | |
| 1516 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, | |
| 1517 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, | |
| 1518 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, | |
| 1519 // packet number | |
| 1520 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 1521 | 1183 |
| 1522 // frame type (padding) | 1184 // frame type (padding) |
| 1523 0x00, | 1185 0x00, |
| 1524 0x00, 0x00, 0x00, 0x00 | 1186 0x00, 0x00, 0x00, 0x00 |
| 1525 }; | 1187 }; |
| 1526 // clang-format on | 1188 // clang-format on |
| 1527 | 1189 |
| 1528 QuicEncryptedPacket encrypted( | 1190 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1529 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 1530 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 1531 : arraysize(packet_34), | |
| 1532 false); | |
| 1533 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); | 1191 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); |
| 1534 if (framer_.version() > QUIC_VERSION_32) { | 1192 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1535 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1193 ASSERT_TRUE(visitor_.public_header_->nonce != nullptr); |
| 1536 ASSERT_TRUE(visitor_.public_header_->nonce != nullptr); | 1194 for (char i = 0; i < 32; ++i) { |
| 1537 for (char i = 0; i < 32; ++i) { | 1195 EXPECT_EQ(i, (*visitor_.public_header_->nonce)[static_cast<int>(i)]); |
| 1538 EXPECT_EQ(i, (*visitor_.public_header_->nonce)[static_cast<int>(i)]); | |
| 1539 } | |
| 1540 } else if (framer_.version() < QUIC_VERSION_32) { | |
| 1541 // Packet is successfully parsed by accident. | |
| 1542 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
| 1543 ASSERT_TRUE(visitor_.public_header_ != nullptr); | |
| 1544 } else { | |
| 1545 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | |
| 1546 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); | |
| 1547 EXPECT_EQ("Illegal private flags value.", framer_.detailed_error()); | |
| 1548 } | 1196 } |
| 1549 }; | 1197 }; |
| 1550 | 1198 |
| 1551 TEST_P(QuicFramerTest, InvalidPublicFlagWithMatchingVersions) { | |
| 1552 if (framer_.version() > QUIC_VERSION_33) { | |
| 1553 return; | |
| 1554 } | |
| 1555 // clang-format off | |
| 1556 unsigned char packet[] = { | |
| 1557 // public flags (8 byte connection_id and version flag and an unknown flag) | |
| 1558 0x8D, | |
| 1559 // connection_id | |
| 1560 0x10, 0x32, 0x54, 0x76, | |
| 1561 0x98, 0xBA, 0xDC, 0xFE, | |
| 1562 // version tag | |
| 1563 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | |
| 1564 // packet number | |
| 1565 0xBC, 0x9A, 0x78, 0x56, | |
| 1566 0x34, 0x12, | |
| 1567 // private flags | |
| 1568 0x00, | |
| 1569 | |
| 1570 // frame type (padding) | |
| 1571 0x00, | |
| 1572 0x00, 0x00, 0x00, 0x00 | |
| 1573 }; | |
| 1574 // clang-format on | |
| 1575 CheckProcessingFails(packet, arraysize(packet), "Illegal public flags value.", | |
| 1576 QUIC_INVALID_PACKET_HEADER); | |
| 1577 }; | |
| 1578 | |
| 1579 TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) { | 1199 TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) { |
| 1580 // clang-format off | 1200 // clang-format off |
| 1581 unsigned char packet[] = { | 1201 unsigned char packet[] = { |
| 1582 // public flags (8 byte connection_id, version flag and an unknown flag) | 1202 // public flags (8 byte connection_id, version flag and an unknown flag) |
| 1583 0x79, | 1203 0x79, |
| 1584 // connection_id | 1204 // connection_id |
| 1585 0x10, 0x32, 0x54, 0x76, | 1205 0x10, 0x32, 0x54, 0x76, |
| 1586 0x98, 0xBA, 0xDC, 0xFE, | 1206 0x98, 0xBA, 0xDC, 0xFE, |
| 1587 // version tag | 1207 // version tag |
| 1588 'Q', '0', '0', '0', | 1208 'Q', '0', '0', '0', |
| 1589 // packet number | 1209 // packet number |
| 1590 0xBC, 0x9A, 0x78, 0x56, | 1210 0xBC, 0x9A, 0x78, 0x56, |
| 1591 0x34, 0x12, | 1211 0x34, 0x12, |
| 1592 // private flags | |
| 1593 0x00, | |
| 1594 | |
| 1595 // frame type (padding frame) | |
| 1596 0x00, | |
| 1597 0x00, 0x00, 0x00, 0x00 | |
| 1598 }; | |
| 1599 unsigned char packet_34[] = { | |
| 1600 // public flags (8 byte connection_id, version flag and an unknown flag) | |
| 1601 0x79, | |
| 1602 // connection_id | |
| 1603 0x10, 0x32, 0x54, 0x76, | |
| 1604 0x98, 0xBA, 0xDC, 0xFE, | |
| 1605 // version tag | |
| 1606 'Q', '0', '0', '0', | |
| 1607 // packet number | |
| 1608 0xBC, 0x9A, 0x78, 0x56, | |
| 1609 0x34, 0x12, | |
| 1610 | 1212 |
| 1611 // frame type (padding frame) | 1213 // frame type (padding frame) |
| 1612 0x00, | 1214 0x00, |
| 1613 0x00, 0x00, 0x00, 0x00 | 1215 0x00, 0x00, 0x00, 0x00 |
| 1614 }; | 1216 }; |
| 1615 // clang-format on | 1217 // clang-format on |
| 1616 QuicEncryptedPacket encrypted( | 1218 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1617 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 1618 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 1619 : arraysize(packet_34), | |
| 1620 false); | |
| 1621 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1219 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1622 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1220 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1623 ASSERT_TRUE(visitor_.header_.get()); | 1221 ASSERT_TRUE(visitor_.header_.get()); |
| 1624 EXPECT_EQ(0, visitor_.frame_count_); | 1222 EXPECT_EQ(0, visitor_.frame_count_); |
| 1625 EXPECT_EQ(1, visitor_.version_mismatch_); | 1223 EXPECT_EQ(1, visitor_.version_mismatch_); |
| 1626 }; | 1224 }; |
| 1627 | 1225 |
| 1628 TEST_P(QuicFramerTest, InvalidPrivateFlag) { | 1226 TEST_P(QuicFramerTest, PaddingFrame) { |
| 1629 if (framer_.version() > QUIC_VERSION_33) { | |
| 1630 return; | |
| 1631 } | |
| 1632 // clang-format off | 1227 // clang-format off |
| 1633 unsigned char packet[] = { | 1228 unsigned char packet[] = { |
| 1634 // public flags (8 byte connection_id) | 1229 // public flags (8 byte connection_id) |
| 1635 0x38, | 1230 0x38, |
| 1636 // connection_id | 1231 // connection_id |
| 1637 0x10, 0x32, 0x54, 0x76, | 1232 0x10, 0x32, 0x54, 0x76, |
| 1638 0x98, 0xBA, 0xDC, 0xFE, | 1233 0x98, 0xBA, 0xDC, 0xFE, |
| 1639 // packet number | 1234 // packet number |
| 1640 0xBC, 0x9A, 0x78, 0x56, | 1235 0xBC, 0x9A, 0x78, 0x56, |
| 1641 0x34, 0x12, | 1236 0x34, 0x12, |
| 1642 // private flags | |
| 1643 0x10, | |
| 1644 | |
| 1645 // frame type (padding) | |
| 1646 0x00, | |
| 1647 0x00, 0x00, 0x00, 0x00 | |
| 1648 }; | |
| 1649 // clang-format on | |
| 1650 CheckProcessingFails(packet, arraysize(packet), | |
| 1651 "Illegal private flags value.", | |
| 1652 QUIC_INVALID_PACKET_HEADER); | |
| 1653 }; | |
| 1654 | |
| 1655 TEST_P(QuicFramerTest, PaddingFrame) { | |
| 1656 // clang-format off | |
| 1657 unsigned char packet[] = { | |
| 1658 // public flags (8 byte connection_id) | |
| 1659 0x38, | |
| 1660 // connection_id | |
| 1661 0x10, 0x32, 0x54, 0x76, | |
| 1662 0x98, 0xBA, 0xDC, 0xFE, | |
| 1663 // packet number | |
| 1664 0xBC, 0x9A, 0x78, 0x56, | |
| 1665 0x34, 0x12, | |
| 1666 // private flags | |
| 1667 0x00, | |
| 1668 | |
| 1669 // frame type (padding frame) | |
| 1670 0x00, | |
| 1671 // Ignored data (which in this case is a stream frame) | |
| 1672 // frame type (stream frame with fin) | |
| 1673 0xFF, | |
| 1674 // stream id | |
| 1675 0x04, 0x03, 0x02, 0x01, | |
| 1676 // offset | |
| 1677 0x54, 0x76, 0x10, 0x32, | |
| 1678 0xDC, 0xFE, 0x98, 0xBA, | |
| 1679 // data length | |
| 1680 0x0c, 0x00, | |
| 1681 // data | |
| 1682 'h', 'e', 'l', 'l', | |
| 1683 'o', ' ', 'w', 'o', | |
| 1684 'r', 'l', 'd', '!', | |
| 1685 }; | |
| 1686 unsigned char packet_34[] = { | |
| 1687 // public flags (8 byte connection_id) | |
| 1688 0x38, | |
| 1689 // connection_id | |
| 1690 0x10, 0x32, 0x54, 0x76, | |
| 1691 0x98, 0xBA, 0xDC, 0xFE, | |
| 1692 // packet number | |
| 1693 0xBC, 0x9A, 0x78, 0x56, | |
| 1694 0x34, 0x12, | |
| 1695 | 1237 |
| 1696 // frame type (padding frame) | 1238 // frame type (padding frame) |
| 1697 0x00, | 1239 0x00, |
| 1698 // Ignored data (which in this case is a stream frame) | 1240 // Ignored data (which in this case is a stream frame) |
| 1699 // frame type (stream frame with fin) | 1241 // frame type (stream frame with fin) |
| 1700 0xFF, | 1242 0xFF, |
| 1701 // stream id | 1243 // stream id |
| 1702 0x04, 0x03, 0x02, 0x01, | 1244 0x04, 0x03, 0x02, 0x01, |
| 1703 // offset | 1245 // offset |
| 1704 0x54, 0x76, 0x10, 0x32, | 1246 0x54, 0x76, 0x10, 0x32, |
| 1705 0xDC, 0xFE, 0x98, 0xBA, | 1247 0xDC, 0xFE, 0x98, 0xBA, |
| 1706 // data length | 1248 // data length |
| 1707 0x0c, 0x00, | 1249 0x0c, 0x00, |
| 1708 // data | 1250 // data |
| 1709 'h', 'e', 'l', 'l', | 1251 'h', 'e', 'l', 'l', |
| 1710 'o', ' ', 'w', 'o', | 1252 'o', ' ', 'w', 'o', |
| 1711 'r', 'l', 'd', '!', | 1253 'r', 'l', 'd', '!', |
| 1712 }; | 1254 }; |
| 1713 // clang-format on | 1255 // clang-format on |
| 1714 | 1256 |
| 1715 QuicEncryptedPacket encrypted( | 1257 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1716 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 1717 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 1718 : arraysize(packet_34), | |
| 1719 false); | |
| 1720 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1258 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1721 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1259 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1722 ASSERT_TRUE(visitor_.header_.get()); | 1260 ASSERT_TRUE(visitor_.header_.get()); |
| 1723 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 1261 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 1724 !kIncludeDiversificationNonce)); | 1262 !kIncludeDiversificationNonce)); |
| 1725 | 1263 |
| 1726 ASSERT_EQ(0u, visitor_.stream_frames_.size()); | 1264 ASSERT_EQ(0u, visitor_.stream_frames_.size()); |
| 1727 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1265 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
| 1728 // A packet with no frames is not acceptable. | 1266 // A packet with no frames is not acceptable. |
| 1729 CheckProcessingFails( | 1267 CheckProcessingFails( |
| 1730 packet, GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 1268 packet, GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 1731 !kIncludeVersion, !kIncludePathId, | 1269 !kIncludeVersion, !kIncludePathId, |
| 1732 !kIncludeDiversificationNonce, | 1270 !kIncludeDiversificationNonce, |
| 1733 PACKET_6BYTE_PACKET_NUMBER), | 1271 PACKET_6BYTE_PACKET_NUMBER), |
| 1734 "Packet has no frames.", QUIC_MISSING_PAYLOAD); | 1272 "Packet has no frames.", QUIC_MISSING_PAYLOAD); |
| 1735 } | 1273 } |
| 1736 | 1274 |
| 1737 TEST_P(QuicFramerTest, StreamFrame) { | 1275 TEST_P(QuicFramerTest, StreamFrame) { |
| 1738 // clang-format off | 1276 // clang-format off |
| 1739 unsigned char packet[] = { | 1277 unsigned char packet[] = { |
| 1740 // public flags (8 byte connection_id) | |
| 1741 0x38, | |
| 1742 // connection_id | |
| 1743 0x10, 0x32, 0x54, 0x76, | |
| 1744 0x98, 0xBA, 0xDC, 0xFE, | |
| 1745 // packet number | |
| 1746 0xBC, 0x9A, 0x78, 0x56, | |
| 1747 0x34, 0x12, | |
| 1748 // private flags | |
| 1749 0x00, | |
| 1750 | |
| 1751 // frame type (stream frame with fin) | |
| 1752 0xFF, | |
| 1753 // stream id | |
| 1754 0x04, 0x03, 0x02, 0x01, | |
| 1755 // offset | |
| 1756 0x54, 0x76, 0x10, 0x32, | |
| 1757 0xDC, 0xFE, 0x98, 0xBA, | |
| 1758 // data length | |
| 1759 0x0c, 0x00, | |
| 1760 // data | |
| 1761 'h', 'e', 'l', 'l', | |
| 1762 'o', ' ', 'w', 'o', | |
| 1763 'r', 'l', 'd', '!', | |
| 1764 }; | |
| 1765 unsigned char packet_34[] = { | |
| 1766 // public flags (8 byte connection_id) | 1278 // public flags (8 byte connection_id) |
| 1767 0x38, | 1279 0x38, |
| 1768 // connection_id | 1280 // connection_id |
| 1769 0x10, 0x32, 0x54, 0x76, | 1281 0x10, 0x32, 0x54, 0x76, |
| 1770 0x98, 0xBA, 0xDC, 0xFE, | 1282 0x98, 0xBA, 0xDC, 0xFE, |
| 1771 // packet number | 1283 // packet number |
| 1772 0xBC, 0x9A, 0x78, 0x56, | 1284 0xBC, 0x9A, 0x78, 0x56, |
| 1773 0x34, 0x12, | 1285 0x34, 0x12, |
| 1774 | 1286 |
| 1775 // frame type (stream frame with fin) | 1287 // frame type (stream frame with fin) |
| 1776 0xFF, | 1288 0xFF, |
| 1777 // stream id | 1289 // stream id |
| 1778 0x04, 0x03, 0x02, 0x01, | 1290 0x04, 0x03, 0x02, 0x01, |
| 1779 // offset | 1291 // offset |
| 1780 0x54, 0x76, 0x10, 0x32, | 1292 0x54, 0x76, 0x10, 0x32, |
| 1781 0xDC, 0xFE, 0x98, 0xBA, | 1293 0xDC, 0xFE, 0x98, 0xBA, |
| 1782 // data length | 1294 // data length |
| 1783 0x0c, 0x00, | 1295 0x0c, 0x00, |
| 1784 // data | 1296 // data |
| 1785 'h', 'e', 'l', 'l', | 1297 'h', 'e', 'l', 'l', |
| 1786 'o', ' ', 'w', 'o', | 1298 'o', ' ', 'w', 'o', |
| 1787 'r', 'l', 'd', '!', | 1299 'r', 'l', 'd', '!', |
| 1788 }; | 1300 }; |
| 1789 // clang-format on | 1301 // clang-format on |
| 1790 | 1302 |
| 1791 QuicEncryptedPacket encrypted( | 1303 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1792 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 1793 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 1794 : arraysize(packet_34), | |
| 1795 false); | |
| 1796 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1304 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1797 | 1305 |
| 1798 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1306 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1799 ASSERT_TRUE(visitor_.header_.get()); | 1307 ASSERT_TRUE(visitor_.header_.get()); |
| 1800 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 1308 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 1801 !kIncludeDiversificationNonce)); | 1309 !kIncludeDiversificationNonce)); |
| 1802 | 1310 |
| 1803 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1311 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
| 1804 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1312 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
| 1805 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id); | 1313 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id); |
| 1806 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1314 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
| 1807 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); | 1315 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); |
| 1808 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get()); | 1316 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get()); |
| 1809 | 1317 |
| 1810 // Now test framing boundaries. | 1318 // Now test framing boundaries. |
| 1811 CheckStreamFrameBoundaries( | 1319 CheckStreamFrameBoundaries(packet, kQuicMaxStreamIdSize, !kIncludeVersion); |
| 1812 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, | |
| 1813 kQuicMaxStreamIdSize, !kIncludeVersion); | |
| 1814 } | 1320 } |
| 1815 | 1321 |
| 1816 TEST_P(QuicFramerTest, MissingDiversificationNonce) { | 1322 TEST_P(QuicFramerTest, MissingDiversificationNonce) { |
| 1817 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); | 1323 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); |
| 1818 framer_.SetDecrypter(ENCRYPTION_NONE, new NullDecrypter()); | 1324 framer_.SetDecrypter(ENCRYPTION_NONE, new NullDecrypter()); |
| 1819 decrypter_ = new test::TestDecrypter(); | 1325 decrypter_ = new test::TestDecrypter(); |
| 1820 framer_.SetAlternativeDecrypter(ENCRYPTION_INITIAL, decrypter_, false); | 1326 framer_.SetAlternativeDecrypter(ENCRYPTION_INITIAL, decrypter_, false); |
| 1821 | 1327 |
| 1822 // clang-format off | 1328 // clang-format off |
| 1823 unsigned char packet[] = { | 1329 unsigned char packet[] = { |
| 1824 // public flags (8 byte connection_id) | |
| 1825 0x38, | |
| 1826 // connection_id | |
| 1827 0x10, 0x32, 0x54, 0x76, | |
| 1828 0x98, 0xBA, 0xDC, 0xFE, | |
| 1829 // packet number | |
| 1830 0xBC, 0x9A, 0x78, 0x56, | |
| 1831 0x34, 0x12, | |
| 1832 // private flags | |
| 1833 0x00, | |
| 1834 | |
| 1835 // frame type (stream frame with fin) | |
| 1836 0xFF, | |
| 1837 // stream id | |
| 1838 0x04, 0x03, 0x02, 0x01, | |
| 1839 // offset | |
| 1840 0x54, 0x76, 0x10, 0x32, | |
| 1841 0xDC, 0xFE, 0x98, 0xBA, | |
| 1842 // data length | |
| 1843 0x0c, 0x00, | |
| 1844 // data | |
| 1845 'h', 'e', 'l', 'l', | |
| 1846 'o', ' ', 'w', 'o', | |
| 1847 'r', 'l', 'd', '!', | |
| 1848 }; | |
| 1849 unsigned char packet_34[] = { | |
| 1850 // public flags (8 byte connection_id) | 1330 // public flags (8 byte connection_id) |
| 1851 0x38, | 1331 0x38, |
| 1852 // connection_id | 1332 // connection_id |
| 1853 0x10, 0x32, 0x54, 0x76, | 1333 0x10, 0x32, 0x54, 0x76, |
| 1854 0x98, 0xBA, 0xDC, 0xFE, | 1334 0x98, 0xBA, 0xDC, 0xFE, |
| 1855 // packet number | 1335 // packet number |
| 1856 0xBC, 0x9A, 0x78, 0x56, | 1336 0xBC, 0x9A, 0x78, 0x56, |
| 1857 0x34, 0x12, | 1337 0x34, 0x12, |
| 1858 | 1338 |
| 1859 // frame type (stream frame with fin) | 1339 // frame type (stream frame with fin) |
| 1860 0xFF, | 1340 0xFF, |
| 1861 // stream id | 1341 // stream id |
| 1862 0x04, 0x03, 0x02, 0x01, | 1342 0x04, 0x03, 0x02, 0x01, |
| 1863 // offset | 1343 // offset |
| 1864 0x54, 0x76, 0x10, 0x32, | 1344 0x54, 0x76, 0x10, 0x32, |
| 1865 0xDC, 0xFE, 0x98, 0xBA, | 1345 0xDC, 0xFE, 0x98, 0xBA, |
| 1866 // data length | 1346 // data length |
| 1867 0x0c, 0x00, | 1347 0x0c, 0x00, |
| 1868 // data | 1348 // data |
| 1869 'h', 'e', 'l', 'l', | 1349 'h', 'e', 'l', 'l', |
| 1870 'o', ' ', 'w', 'o', | 1350 'o', ' ', 'w', 'o', |
| 1871 'r', 'l', 'd', '!', | 1351 'r', 'l', 'd', '!', |
| 1872 }; | 1352 }; |
| 1873 // clang-format on | 1353 // clang-format on |
| 1874 | 1354 |
| 1875 QuicEncryptedPacket encrypted( | 1355 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1876 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 1356 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
| 1877 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | 1357 EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error()); |
| 1878 : arraysize(packet_34), | |
| 1879 false); | |
| 1880 if (framer_.version() > QUIC_VERSION_32) { | |
| 1881 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | |
| 1882 EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error()); | |
| 1883 | |
| 1884 } else { | |
| 1885 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
| 1886 | |
| 1887 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
| 1888 ASSERT_TRUE(visitor_.header_.get()); | |
| 1889 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | |
| 1890 !kIncludeDiversificationNonce)); | |
| 1891 } | |
| 1892 } | 1358 } |
| 1893 | 1359 |
| 1894 TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) { | 1360 TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) { |
| 1895 // clang-format off | 1361 // clang-format off |
| 1896 unsigned char packet[] = { | 1362 unsigned char packet[] = { |
| 1897 // public flags (8 byte connection_id) | 1363 // public flags (8 byte connection_id) |
| 1898 0x38, | 1364 0x38, |
| 1899 // connection_id | 1365 // connection_id |
| 1900 0x10, 0x32, 0x54, 0x76, | 1366 0x10, 0x32, 0x54, 0x76, |
| 1901 0x98, 0xBA, 0xDC, 0xFE, | 1367 0x98, 0xBA, 0xDC, 0xFE, |
| 1902 // packet number | 1368 // packet number |
| 1903 0xBC, 0x9A, 0x78, 0x56, | 1369 0xBC, 0x9A, 0x78, 0x56, |
| 1904 0x34, 0x12, | 1370 0x34, 0x12, |
| 1905 // private flags | |
| 1906 0x00, | |
| 1907 | |
| 1908 // frame type (stream frame with fin) | |
| 1909 0xFE, | |
| 1910 // stream id | |
| 1911 0x04, 0x03, 0x02, | |
| 1912 // offset | |
| 1913 0x54, 0x76, 0x10, 0x32, | |
| 1914 0xDC, 0xFE, 0x98, 0xBA, | |
| 1915 // data length | |
| 1916 0x0c, 0x00, | |
| 1917 // data | |
| 1918 'h', 'e', 'l', 'l', | |
| 1919 'o', ' ', 'w', 'o', | |
| 1920 'r', 'l', 'd', '!', | |
| 1921 }; | |
| 1922 unsigned char packet_34[] = { | |
| 1923 // public flags (8 byte connection_id) | |
| 1924 0x38, | |
| 1925 // connection_id | |
| 1926 0x10, 0x32, 0x54, 0x76, | |
| 1927 0x98, 0xBA, 0xDC, 0xFE, | |
| 1928 // packet number | |
| 1929 0xBC, 0x9A, 0x78, 0x56, | |
| 1930 0x34, 0x12, | |
| 1931 | 1371 |
| 1932 // frame type (stream frame with fin) | 1372 // frame type (stream frame with fin) |
| 1933 0xFE, | 1373 0xFE, |
| 1934 // stream id | 1374 // stream id |
| 1935 0x04, 0x03, 0x02, | 1375 0x04, 0x03, 0x02, |
| 1936 // offset | 1376 // offset |
| 1937 0x54, 0x76, 0x10, 0x32, | 1377 0x54, 0x76, 0x10, 0x32, |
| 1938 0xDC, 0xFE, 0x98, 0xBA, | 1378 0xDC, 0xFE, 0x98, 0xBA, |
| 1939 // data length | 1379 // data length |
| 1940 0x0c, 0x00, | 1380 0x0c, 0x00, |
| 1941 // data | 1381 // data |
| 1942 'h', 'e', 'l', 'l', | 1382 'h', 'e', 'l', 'l', |
| 1943 'o', ' ', 'w', 'o', | 1383 'o', ' ', 'w', 'o', |
| 1944 'r', 'l', 'd', '!', | 1384 'r', 'l', 'd', '!', |
| 1945 }; | 1385 }; |
| 1946 // clang-format on | 1386 // clang-format on |
| 1947 | 1387 |
| 1948 QuicEncryptedPacket encrypted( | 1388 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1949 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 1950 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 1951 : arraysize(packet_34), | |
| 1952 false); | |
| 1953 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1389 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1954 | 1390 |
| 1955 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1391 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1956 ASSERT_TRUE(visitor_.header_.get()); | 1392 ASSERT_TRUE(visitor_.header_.get()); |
| 1957 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 1393 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 1958 !kIncludeDiversificationNonce)); | 1394 !kIncludeDiversificationNonce)); |
| 1959 | 1395 |
| 1960 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1396 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
| 1961 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1397 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
| 1962 // Stream ID should be the last 3 bytes of kStreamId. | 1398 // Stream ID should be the last 3 bytes of kStreamId. |
| 1963 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id); | 1399 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id); |
| 1964 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1400 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
| 1965 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); | 1401 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); |
| 1966 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get()); | 1402 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get()); |
| 1967 | 1403 |
| 1968 // Now test framing boundaries. | 1404 // Now test framing boundaries. |
| 1969 const size_t stream_id_size = 3; | 1405 const size_t stream_id_size = 3; |
| 1970 CheckStreamFrameBoundaries( | 1406 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); |
| 1971 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, stream_id_size, | |
| 1972 !kIncludeVersion); | |
| 1973 } | 1407 } |
| 1974 | 1408 |
| 1975 TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) { | 1409 TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) { |
| 1976 // clang-format off | 1410 // clang-format off |
| 1977 unsigned char packet[] = { | 1411 unsigned char packet[] = { |
| 1978 // public flags (8 byte connection_id) | 1412 // public flags (8 byte connection_id) |
| 1979 0x38, | 1413 0x38, |
| 1980 // connection_id | 1414 // connection_id |
| 1981 0x10, 0x32, 0x54, 0x76, | 1415 0x10, 0x32, 0x54, 0x76, |
| 1982 0x98, 0xBA, 0xDC, 0xFE, | 1416 0x98, 0xBA, 0xDC, 0xFE, |
| 1983 // packet number | 1417 // packet number |
| 1984 0xBC, 0x9A, 0x78, 0x56, | 1418 0xBC, 0x9A, 0x78, 0x56, |
| 1985 0x34, 0x12, | 1419 0x34, 0x12, |
| 1986 // private flags | |
| 1987 0x00, | |
| 1988 | |
| 1989 // frame type (stream frame with fin) | |
| 1990 0xFD, | |
| 1991 // stream id | |
| 1992 0x04, 0x03, | |
| 1993 // offset | |
| 1994 0x54, 0x76, 0x10, 0x32, | |
| 1995 0xDC, 0xFE, 0x98, 0xBA, | |
| 1996 // data length | |
| 1997 0x0c, 0x00, | |
| 1998 // data | |
| 1999 'h', 'e', 'l', 'l', | |
| 2000 'o', ' ', 'w', 'o', | |
| 2001 'r', 'l', 'd', '!', | |
| 2002 }; | |
| 2003 unsigned char packet_34[] = { | |
| 2004 // public flags (8 byte connection_id) | |
| 2005 0x38, | |
| 2006 // connection_id | |
| 2007 0x10, 0x32, 0x54, 0x76, | |
| 2008 0x98, 0xBA, 0xDC, 0xFE, | |
| 2009 // packet number | |
| 2010 0xBC, 0x9A, 0x78, 0x56, | |
| 2011 0x34, 0x12, | |
| 2012 | 1420 |
| 2013 // frame type (stream frame with fin) | 1421 // frame type (stream frame with fin) |
| 2014 0xFD, | 1422 0xFD, |
| 2015 // stream id | 1423 // stream id |
| 2016 0x04, 0x03, | 1424 0x04, 0x03, |
| 2017 // offset | 1425 // offset |
| 2018 0x54, 0x76, 0x10, 0x32, | 1426 0x54, 0x76, 0x10, 0x32, |
| 2019 0xDC, 0xFE, 0x98, 0xBA, | 1427 0xDC, 0xFE, 0x98, 0xBA, |
| 2020 // data length | 1428 // data length |
| 2021 0x0c, 0x00, | 1429 0x0c, 0x00, |
| 2022 // data | 1430 // data |
| 2023 'h', 'e', 'l', 'l', | 1431 'h', 'e', 'l', 'l', |
| 2024 'o', ' ', 'w', 'o', | 1432 'o', ' ', 'w', 'o', |
| 2025 'r', 'l', 'd', '!', | 1433 'r', 'l', 'd', '!', |
| 2026 }; | 1434 }; |
| 2027 // clang-format on | 1435 // clang-format on |
| 2028 | 1436 |
| 2029 QuicEncryptedPacket encrypted( | 1437 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2030 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 2031 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 2032 : arraysize(packet_34), | |
| 2033 false); | |
| 2034 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1438 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2035 | 1439 |
| 2036 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1440 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2037 ASSERT_TRUE(visitor_.header_.get()); | 1441 ASSERT_TRUE(visitor_.header_.get()); |
| 2038 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 1442 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 2039 !kIncludeDiversificationNonce)); | 1443 !kIncludeDiversificationNonce)); |
| 2040 | 1444 |
| 2041 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1445 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
| 2042 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1446 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
| 2043 // Stream ID should be the last 2 bytes of kStreamId. | 1447 // Stream ID should be the last 2 bytes of kStreamId. |
| 2044 EXPECT_EQ(0x0000FFFF & kStreamId, visitor_.stream_frames_[0]->stream_id); | 1448 EXPECT_EQ(0x0000FFFF & kStreamId, visitor_.stream_frames_[0]->stream_id); |
| 2045 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1449 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
| 2046 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); | 1450 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); |
| 2047 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get()); | 1451 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get()); |
| 2048 | 1452 |
| 2049 // Now test framing boundaries. | 1453 // Now test framing boundaries. |
| 2050 const size_t stream_id_size = 2; | 1454 const size_t stream_id_size = 2; |
| 2051 CheckStreamFrameBoundaries( | 1455 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); |
| 2052 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, stream_id_size, | |
| 2053 !kIncludeVersion); | |
| 2054 } | 1456 } |
| 2055 | 1457 |
| 2056 TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) { | 1458 TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) { |
| 2057 // clang-format off | 1459 // clang-format off |
| 2058 unsigned char packet[] = { | 1460 unsigned char packet[] = { |
| 2059 // public flags (8 byte connection_id) | 1461 // public flags (8 byte connection_id) |
| 2060 0x38, | 1462 0x38, |
| 2061 // connection_id | 1463 // connection_id |
| 2062 0x10, 0x32, 0x54, 0x76, | 1464 0x10, 0x32, 0x54, 0x76, |
| 2063 0x98, 0xBA, 0xDC, 0xFE, | 1465 0x98, 0xBA, 0xDC, 0xFE, |
| 2064 // packet number | 1466 // packet number |
| 2065 0xBC, 0x9A, 0x78, 0x56, | 1467 0xBC, 0x9A, 0x78, 0x56, |
| 2066 0x34, 0x12, | 1468 0x34, 0x12, |
| 2067 // private flags | |
| 2068 0x00, | |
| 2069 | |
| 2070 // frame type (stream frame with fin) | |
| 2071 0xFC, | |
| 2072 // stream id | |
| 2073 0x04, | |
| 2074 // offset | |
| 2075 0x54, 0x76, 0x10, 0x32, | |
| 2076 0xDC, 0xFE, 0x98, 0xBA, | |
| 2077 // data length | |
| 2078 0x0c, 0x00, | |
| 2079 // data | |
| 2080 'h', 'e', 'l', 'l', | |
| 2081 'o', ' ', 'w', 'o', | |
| 2082 'r', 'l', 'd', '!', | |
| 2083 }; | |
| 2084 unsigned char packet_34[] = { | |
| 2085 // public flags (8 byte connection_id) | |
| 2086 0x38, | |
| 2087 // connection_id | |
| 2088 0x10, 0x32, 0x54, 0x76, | |
| 2089 0x98, 0xBA, 0xDC, 0xFE, | |
| 2090 // packet number | |
| 2091 0xBC, 0x9A, 0x78, 0x56, | |
| 2092 0x34, 0x12, | |
| 2093 | 1469 |
| 2094 // frame type (stream frame with fin) | 1470 // frame type (stream frame with fin) |
| 2095 0xFC, | 1471 0xFC, |
| 2096 // stream id | 1472 // stream id |
| 2097 0x04, | 1473 0x04, |
| 2098 // offset | 1474 // offset |
| 2099 0x54, 0x76, 0x10, 0x32, | 1475 0x54, 0x76, 0x10, 0x32, |
| 2100 0xDC, 0xFE, 0x98, 0xBA, | 1476 0xDC, 0xFE, 0x98, 0xBA, |
| 2101 // data length | 1477 // data length |
| 2102 0x0c, 0x00, | 1478 0x0c, 0x00, |
| 2103 // data | 1479 // data |
| 2104 'h', 'e', 'l', 'l', | 1480 'h', 'e', 'l', 'l', |
| 2105 'o', ' ', 'w', 'o', | 1481 'o', ' ', 'w', 'o', |
| 2106 'r', 'l', 'd', '!', | 1482 'r', 'l', 'd', '!', |
| 2107 }; | 1483 }; |
| 2108 // clang-format on | 1484 // clang-format on |
| 2109 | 1485 |
| 2110 QuicEncryptedPacket encrypted( | 1486 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2111 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 2112 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 2113 : arraysize(packet_34), | |
| 2114 false); | |
| 2115 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1487 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2116 | 1488 |
| 2117 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1489 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2118 ASSERT_TRUE(visitor_.header_.get()); | 1490 ASSERT_TRUE(visitor_.header_.get()); |
| 2119 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 1491 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 2120 !kIncludeDiversificationNonce)); | 1492 !kIncludeDiversificationNonce)); |
| 2121 | 1493 |
| 2122 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1494 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
| 2123 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1495 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
| 2124 // Stream ID should be the last byte of kStreamId. | 1496 // Stream ID should be the last byte of kStreamId. |
| 2125 EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id); | 1497 EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id); |
| 2126 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1498 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
| 2127 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); | 1499 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); |
| 2128 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get()); | 1500 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get()); |
| 2129 | 1501 |
| 2130 // Now test framing boundaries. | 1502 // Now test framing boundaries. |
| 2131 const size_t stream_id_size = 1; | 1503 const size_t stream_id_size = 1; |
| 2132 CheckStreamFrameBoundaries( | 1504 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); |
| 2133 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, stream_id_size, | |
| 2134 !kIncludeVersion); | |
| 2135 } | 1505 } |
| 2136 | 1506 |
| 2137 TEST_P(QuicFramerTest, StreamFrameWithVersion) { | 1507 TEST_P(QuicFramerTest, StreamFrameWithVersion) { |
| 2138 // clang-format off | 1508 // clang-format off |
| 2139 unsigned char packet[] = { | 1509 unsigned char packet[] = { |
| 2140 // public flags (version, 8 byte connection_id) | 1510 // public flags (version, 8 byte connection_id) |
| 2141 0x39, | 1511 0x39, |
| 2142 // connection_id | 1512 // connection_id |
| 2143 0x10, 0x32, 0x54, 0x76, | 1513 0x10, 0x32, 0x54, 0x76, |
| 2144 0x98, 0xBA, 0xDC, 0xFE, | 1514 0x98, 0xBA, 0xDC, 0xFE, |
| 2145 // version tag | 1515 // version tag |
| 2146 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | 1516 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
| 2147 // packet number | 1517 // packet number |
| 2148 0xBC, 0x9A, 0x78, 0x56, | 1518 0xBC, 0x9A, 0x78, 0x56, |
| 2149 0x34, 0x12, | 1519 0x34, 0x12, |
| 2150 // private flags | |
| 2151 0x00, | |
| 2152 | |
| 2153 // frame type (stream frame with fin) | |
| 2154 0xFF, | |
| 2155 // stream id | |
| 2156 0x04, 0x03, 0x02, 0x01, | |
| 2157 // offset | |
| 2158 0x54, 0x76, 0x10, 0x32, | |
| 2159 0xDC, 0xFE, 0x98, 0xBA, | |
| 2160 // data length | |
| 2161 0x0c, 0x00, | |
| 2162 // data | |
| 2163 'h', 'e', 'l', 'l', | |
| 2164 'o', ' ', 'w', 'o', | |
| 2165 'r', 'l', 'd', '!', | |
| 2166 }; | |
| 2167 unsigned char packet_34[] = { | |
| 2168 // public flags (version, 8 byte connection_id) | |
| 2169 0x39, | |
| 2170 // connection_id | |
| 2171 0x10, 0x32, 0x54, 0x76, | |
| 2172 0x98, 0xBA, 0xDC, 0xFE, | |
| 2173 // version tag | |
| 2174 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | |
| 2175 // packet number | |
| 2176 0xBC, 0x9A, 0x78, 0x56, | |
| 2177 0x34, 0x12, | |
| 2178 | 1520 |
| 2179 // frame type (stream frame with fin) | 1521 // frame type (stream frame with fin) |
| 2180 0xFF, | 1522 0xFF, |
| 2181 // stream id | 1523 // stream id |
| 2182 0x04, 0x03, 0x02, 0x01, | 1524 0x04, 0x03, 0x02, 0x01, |
| 2183 // offset | 1525 // offset |
| 2184 0x54, 0x76, 0x10, 0x32, | 1526 0x54, 0x76, 0x10, 0x32, |
| 2185 0xDC, 0xFE, 0x98, 0xBA, | 1527 0xDC, 0xFE, 0x98, 0xBA, |
| 2186 // data length | 1528 // data length |
| 2187 0x0c, 0x00, | 1529 0x0c, 0x00, |
| 2188 // data | 1530 // data |
| 2189 'h', 'e', 'l', 'l', | 1531 'h', 'e', 'l', 'l', |
| 2190 'o', ' ', 'w', 'o', | 1532 'o', ' ', 'w', 'o', |
| 2191 'r', 'l', 'd', '!', | 1533 'r', 'l', 'd', '!', |
| 2192 }; | 1534 }; |
| 2193 // clang-format on | 1535 // clang-format on |
| 2194 | 1536 |
| 2195 QuicEncryptedPacket encrypted( | 1537 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2196 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 2197 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 2198 : arraysize(packet_34), | |
| 2199 false); | |
| 2200 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1538 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2201 | 1539 |
| 2202 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1540 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2203 ASSERT_TRUE(visitor_.header_.get()); | 1541 ASSERT_TRUE(visitor_.header_.get()); |
| 2204 EXPECT_TRUE(visitor_.header_->public_header.version_flag); | 1542 EXPECT_TRUE(visitor_.header_->public_header.version_flag); |
| 2205 EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]); | 1543 EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]); |
| 2206 EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion, !kIncludePathId, | 1544 EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion, !kIncludePathId, |
| 2207 !kIncludeDiversificationNonce)); | 1545 !kIncludeDiversificationNonce)); |
| 2208 | 1546 |
| 2209 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1547 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
| 2210 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1548 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
| 2211 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id); | 1549 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id); |
| 2212 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1550 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
| 2213 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); | 1551 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); |
| 2214 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get()); | 1552 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get()); |
| 2215 | 1553 |
| 2216 // Now test framing boundaries. | 1554 // Now test framing boundaries. |
| 2217 CheckStreamFrameBoundaries( | 1555 CheckStreamFrameBoundaries(packet, kQuicMaxStreamIdSize, kIncludeVersion); |
| 2218 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, | |
| 2219 kQuicMaxStreamIdSize, kIncludeVersion); | |
| 2220 } | 1556 } |
| 2221 | 1557 |
| 2222 TEST_P(QuicFramerTest, RejectPacket) { | 1558 TEST_P(QuicFramerTest, RejectPacket) { |
| 2223 visitor_.accept_packet_ = false; | 1559 visitor_.accept_packet_ = false; |
| 2224 | 1560 |
| 2225 // clang-format off | 1561 // clang-format off |
| 2226 unsigned char packet[] = { | 1562 unsigned char packet[] = { |
| 2227 // public flags (8 byte connection_id) | |
| 2228 0x38, | |
| 2229 // connection_id | |
| 2230 0x10, 0x32, 0x54, 0x76, | |
| 2231 0x98, 0xBA, 0xDC, 0xFE, | |
| 2232 // packet number | |
| 2233 0xBC, 0x9A, 0x78, 0x56, | |
| 2234 0x34, 0x12, | |
| 2235 // private flags | |
| 2236 0x00, | |
| 2237 | |
| 2238 // frame type (stream frame with fin) | |
| 2239 0xFF, | |
| 2240 // stream id | |
| 2241 0x04, 0x03, 0x02, 0x01, | |
| 2242 // offset | |
| 2243 0x54, 0x76, 0x10, 0x32, | |
| 2244 0xDC, 0xFE, 0x98, 0xBA, | |
| 2245 // data length | |
| 2246 0x0c, 0x00, | |
| 2247 // data | |
| 2248 'h', 'e', 'l', 'l', | |
| 2249 'o', ' ', 'w', 'o', | |
| 2250 'r', 'l', 'd', '!', | |
| 2251 }; | |
| 2252 unsigned char packet_34[] = { | |
| 2253 // public flags (8 byte connection_id) | 1563 // public flags (8 byte connection_id) |
| 2254 0x38, | 1564 0x38, |
| 2255 // connection_id | 1565 // connection_id |
| 2256 0x10, 0x32, 0x54, 0x76, | 1566 0x10, 0x32, 0x54, 0x76, |
| 2257 0x98, 0xBA, 0xDC, 0xFE, | 1567 0x98, 0xBA, 0xDC, 0xFE, |
| 2258 // packet number | 1568 // packet number |
| 2259 0xBC, 0x9A, 0x78, 0x56, | 1569 0xBC, 0x9A, 0x78, 0x56, |
| 2260 0x34, 0x12, | 1570 0x34, 0x12, |
| 2261 | 1571 |
| 2262 // frame type (stream frame with fin) | 1572 // frame type (stream frame with fin) |
| 2263 0xFF, | 1573 0xFF, |
| 2264 // stream id | 1574 // stream id |
| 2265 0x04, 0x03, 0x02, 0x01, | 1575 0x04, 0x03, 0x02, 0x01, |
| 2266 // offset | 1576 // offset |
| 2267 0x54, 0x76, 0x10, 0x32, | 1577 0x54, 0x76, 0x10, 0x32, |
| 2268 0xDC, 0xFE, 0x98, 0xBA, | 1578 0xDC, 0xFE, 0x98, 0xBA, |
| 2269 // data length | 1579 // data length |
| 2270 0x0c, 0x00, | 1580 0x0c, 0x00, |
| 2271 // data | 1581 // data |
| 2272 'h', 'e', 'l', 'l', | 1582 'h', 'e', 'l', 'l', |
| 2273 'o', ' ', 'w', 'o', | 1583 'o', ' ', 'w', 'o', |
| 2274 'r', 'l', 'd', '!', | 1584 'r', 'l', 'd', '!', |
| 2275 }; | 1585 }; |
| 2276 // clang-format on | 1586 // clang-format on |
| 2277 | 1587 |
| 2278 QuicEncryptedPacket encrypted( | 1588 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2279 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 2280 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 2281 : arraysize(packet_34), | |
| 2282 false); | |
| 2283 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1589 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2284 | 1590 |
| 2285 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1591 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2286 ASSERT_TRUE(visitor_.header_.get()); | 1592 ASSERT_TRUE(visitor_.header_.get()); |
| 2287 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 1593 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 2288 !kIncludeDiversificationNonce)); | 1594 !kIncludeDiversificationNonce)); |
| 2289 | 1595 |
| 2290 ASSERT_EQ(0u, visitor_.stream_frames_.size()); | 1596 ASSERT_EQ(0u, visitor_.stream_frames_.size()); |
| 2291 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1597 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
| 2292 } | 1598 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2305 // clang-format on | 1611 // clang-format on |
| 2306 | 1612 |
| 2307 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1613 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2308 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1614 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2309 | 1615 |
| 2310 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1616 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2311 ASSERT_TRUE(visitor_.public_header_.get()); | 1617 ASSERT_TRUE(visitor_.public_header_.get()); |
| 2312 ASSERT_FALSE(visitor_.header_.get()); | 1618 ASSERT_FALSE(visitor_.header_.get()); |
| 2313 } | 1619 } |
| 2314 | 1620 |
| 2315 TEST_P(QuicFramerTest, AckFrameTwoTimestampVersion32) { | |
| 2316 // clang-format off | |
| 2317 unsigned char packet[] = { | |
| 2318 // public flags (8 byte connection_id) | |
| 2319 0x3C, | |
| 2320 // connection_id | |
| 2321 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 2322 // packet number | |
| 2323 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 2324 // private flags (entropy) | |
| 2325 0x01, | |
| 2326 | |
| 2327 // frame type (ack frame) | |
| 2328 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
| 2329 0x6C, | |
| 2330 // entropy hash of all received packets. | |
| 2331 0xBA, | |
| 2332 // largest observed packet number | |
| 2333 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 2334 // Zero delta time. | |
| 2335 0x00, 0x00, | |
| 2336 // Number of timestamps. | |
| 2337 0x02, | |
| 2338 // Delta from largest observed. | |
| 2339 0x01, | |
| 2340 // Delta time. | |
| 2341 0x10, 0x32, 0x54, 0x76, | |
| 2342 // Delta from largest observed. | |
| 2343 0x02, | |
| 2344 // Delta time. | |
| 2345 0x10, 0x32, | |
| 2346 // num missing packets | |
| 2347 0x01, | |
| 2348 // missing packet delta | |
| 2349 0x01, | |
| 2350 // 0 more missing packets in range. | |
| 2351 0x00, | |
| 2352 }; | |
| 2353 // clang-format on | |
| 2354 | |
| 2355 if (framer_.version() > QUIC_VERSION_33) { | |
| 2356 return; | |
| 2357 } | |
| 2358 | |
| 2359 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
| 2360 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
| 2361 | |
| 2362 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
| 2363 ASSERT_TRUE(visitor_.header_.get()); | |
| 2364 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | |
| 2365 !kIncludeDiversificationNonce)); | |
| 2366 | |
| 2367 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
| 2368 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
| 2369 const QuicAckFrame& frame = *visitor_.ack_frames_[0].get(); | |
| 2370 EXPECT_EQ(0xBA, frame.entropy_hash); | |
| 2371 EXPECT_EQ(kLargestObserved, frame.largest_observed); | |
| 2372 ASSERT_EQ(1u, frame.packets.NumPacketsSlow()); | |
| 2373 ASSERT_EQ(2u, frame.received_packet_times.size()); | |
| 2374 EXPECT_EQ(kMissingPacket, frame.packets.Min()); | |
| 2375 | |
| 2376 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | |
| 2377 const size_t kLargestObservedOffset = | |
| 2378 kReceivedEntropyOffset + kQuicEntropyHashSize; | |
| 2379 const size_t kMissingDeltaTimeOffset = | |
| 2380 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; | |
| 2381 const size_t kNumTimestampsOffset = | |
| 2382 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | |
| 2383 const size_t kTimestampDeltaLargestObserved1 = | |
| 2384 kNumTimestampsOffset + kQuicNumTimestampsSize; | |
| 2385 const size_t kTimestampTimeDeltaLargestObserved1 = | |
| 2386 kTimestampDeltaLargestObserved1 + 1; | |
| 2387 const size_t kTimestampDeltaLargestObserved2 = | |
| 2388 kTimestampTimeDeltaLargestObserved1 + 4; | |
| 2389 const size_t kTimestampTimeDeltaLargestObserved2 = | |
| 2390 kTimestampDeltaLargestObserved2 + 1; | |
| 2391 const size_t kNumMissingPacketOffset = | |
| 2392 kTimestampTimeDeltaLargestObserved2 + 2; | |
| 2393 const size_t kMissingPacketsOffset = | |
| 2394 kNumMissingPacketOffset + kNumberOfNackRangesSize; | |
| 2395 // Now test framing boundaries. | |
| 2396 const size_t ack_frame_size = PACKET_1BYTE_PACKET_NUMBER; | |
| 2397 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | |
| 2398 string expected_error; | |
| 2399 if (i < kLargestObservedOffset) { | |
| 2400 expected_error = "Unable to read entropy hash for received packets."; | |
| 2401 } else if (i < kMissingDeltaTimeOffset) { | |
| 2402 expected_error = "Unable to read largest observed."; | |
| 2403 } else if (i < kNumTimestampsOffset) { | |
| 2404 expected_error = "Unable to read ack delay time."; | |
| 2405 } else if (i < kTimestampDeltaLargestObserved1) { | |
| 2406 expected_error = "Unable to read num received packets."; | |
| 2407 } else if (i < kTimestampTimeDeltaLargestObserved1) { | |
| 2408 expected_error = "Unable to read sequence delta in received packets."; | |
| 2409 } else if (i < kTimestampDeltaLargestObserved2) { | |
| 2410 expected_error = "Unable to read time delta in received packets."; | |
| 2411 } else if (i < kTimestampTimeDeltaLargestObserved2) { | |
| 2412 expected_error = "Unable to read sequence delta in received packets."; | |
| 2413 } else if (i < kNumMissingPacketOffset) { | |
| 2414 expected_error = | |
| 2415 "Unable to read incremental time delta in received packets."; | |
| 2416 } else if (i < kMissingPacketsOffset) { | |
| 2417 expected_error = "Unable to read num missing packet ranges."; | |
| 2418 } else { | |
| 2419 expected_error = "Unable to read missing packet number delta."; | |
| 2420 } | |
| 2421 CheckProcessingFails( | |
| 2422 packet, | |
| 2423 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | |
| 2424 !kIncludeVersion, !kIncludePathId, | |
| 2425 !kIncludeDiversificationNonce, | |
| 2426 PACKET_6BYTE_PACKET_NUMBER), | |
| 2427 expected_error, QUIC_INVALID_ACK_DATA); | |
| 2428 } | |
| 2429 } | |
| 2430 | |
| 2431 TEST_P(QuicFramerTest, AckFrameOneTimestampVersion32) { | |
| 2432 // clang-format off | |
| 2433 unsigned char packet[] = { | |
| 2434 // public flags (8 byte connection_id) | |
| 2435 0x3C, | |
| 2436 // connection_id | |
| 2437 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 2438 // packet number | |
| 2439 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 2440 // private flags (entropy) | |
| 2441 0x01, | |
| 2442 | |
| 2443 // frame type (ack frame) | |
| 2444 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
| 2445 0x6C, | |
| 2446 // entropy hash of all received packets. | |
| 2447 0xBA, | |
| 2448 // largest observed packet number | |
| 2449 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 2450 // Zero delta time. | |
| 2451 0x00, 0x00, | |
| 2452 // Number of timestamps. | |
| 2453 0x01, | |
| 2454 // Delta from largest observed. | |
| 2455 0x01, | |
| 2456 // Delta time. | |
| 2457 0x10, 0x32, 0x54, 0x76, | |
| 2458 // num missing packets | |
| 2459 0x01, | |
| 2460 // missing packet delta | |
| 2461 0x01, | |
| 2462 // 0 more missing packets in range. | |
| 2463 0x00, | |
| 2464 }; | |
| 2465 // clang-format on | |
| 2466 | |
| 2467 if (framer_.version() > QUIC_VERSION_33) { | |
| 2468 return; | |
| 2469 } | |
| 2470 | |
| 2471 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
| 2472 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
| 2473 | |
| 2474 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
| 2475 ASSERT_TRUE(visitor_.header_.get()); | |
| 2476 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | |
| 2477 !kIncludeDiversificationNonce)); | |
| 2478 | |
| 2479 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
| 2480 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
| 2481 const QuicAckFrame& frame = *visitor_.ack_frames_[0].get(); | |
| 2482 EXPECT_EQ(0xBA, frame.entropy_hash); | |
| 2483 EXPECT_EQ(kLargestObserved, frame.largest_observed); | |
| 2484 ASSERT_EQ(1u, frame.packets.NumPacketsSlow()); | |
| 2485 ASSERT_EQ(1u, frame.received_packet_times.size()); | |
| 2486 EXPECT_EQ(kMissingPacket, frame.packets.Min()); | |
| 2487 | |
| 2488 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | |
| 2489 const size_t kLargestObservedOffset = | |
| 2490 kReceivedEntropyOffset + kQuicEntropyHashSize; | |
| 2491 const size_t kMissingDeltaTimeOffset = | |
| 2492 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; | |
| 2493 const size_t kNumTimestampsOffset = | |
| 2494 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | |
| 2495 const size_t kTimestampDeltaLargestObserved = | |
| 2496 kNumTimestampsOffset + kQuicNumTimestampsSize; | |
| 2497 const size_t kTimestampTimeDeltaLargestObserved = | |
| 2498 kTimestampDeltaLargestObserved + 1; | |
| 2499 const size_t kNumMissingPacketOffset = kTimestampTimeDeltaLargestObserved + 4; | |
| 2500 const size_t kMissingPacketsOffset = | |
| 2501 kNumMissingPacketOffset + kNumberOfNackRangesSize; | |
| 2502 // Now test framing boundaries. | |
| 2503 const size_t ack_frame_size = PACKET_1BYTE_PACKET_NUMBER; | |
| 2504 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | |
| 2505 string expected_error; | |
| 2506 if (i < kLargestObservedOffset) { | |
| 2507 expected_error = "Unable to read entropy hash for received packets."; | |
| 2508 } else if (i < kMissingDeltaTimeOffset) { | |
| 2509 expected_error = "Unable to read largest observed."; | |
| 2510 } else if (i < kNumTimestampsOffset) { | |
| 2511 expected_error = "Unable to read ack delay time."; | |
| 2512 } else if (i < kTimestampDeltaLargestObserved) { | |
| 2513 expected_error = "Unable to read num received packets."; | |
| 2514 } else if (i < kTimestampTimeDeltaLargestObserved) { | |
| 2515 expected_error = "Unable to read sequence delta in received packets."; | |
| 2516 } else if (i < kNumMissingPacketOffset) { | |
| 2517 expected_error = "Unable to read time delta in received packets."; | |
| 2518 } else if (i < kMissingPacketsOffset) { | |
| 2519 expected_error = "Unable to read num missing packet ranges."; | |
| 2520 } else { | |
| 2521 expected_error = "Unable to read missing packet number delta."; | |
| 2522 } | |
| 2523 CheckProcessingFails( | |
| 2524 packet, | |
| 2525 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | |
| 2526 !kIncludeVersion, !kIncludePathId, | |
| 2527 !kIncludeDiversificationNonce, | |
| 2528 PACKET_6BYTE_PACKET_NUMBER), | |
| 2529 expected_error, QUIC_INVALID_ACK_DATA); | |
| 2530 } | |
| 2531 } | |
| 2532 | |
| 2533 TEST_P(QuicFramerTest, NewAckFrameOneAckBlock) { | 1621 TEST_P(QuicFramerTest, NewAckFrameOneAckBlock) { |
| 2534 // clang-format off | 1622 // clang-format off |
| 2535 unsigned char packet[] = { | 1623 unsigned char packet[] = { |
| 2536 // public flags (8 byte connection_id) | 1624 // public flags (8 byte connection_id) |
| 2537 0x3C, | 1625 0x3C, |
| 2538 // connection_id | 1626 // connection_id |
| 2539 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 1627 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 2540 // packet number | 1628 // packet number |
| 2541 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 1629 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 2542 | 1630 |
| 2543 // frame type (ack frame) | 1631 // frame type (ack frame) |
| 2544 // (one ack block, 2 byte largest observed, 2 byte block length) | 1632 // (one ack block, 2 byte largest observed, 2 byte block length) |
| 2545 0x45, | 1633 0x45, |
| 2546 // largest acked | 1634 // largest acked |
| 2547 0x34, 0x12, | 1635 0x34, 0x12, |
| 2548 // Zero delta time. | 1636 // Zero delta time. |
| 2549 0x00, 0x00, | 1637 0x00, 0x00, |
| 2550 // first ack block length. | 1638 // first ack block length. |
| 2551 0x34, 0x12, | 1639 0x34, 0x12, |
| 2552 // num timestamps. | 1640 // num timestamps. |
| 2553 0x00, | 1641 0x00, |
| 2554 }; | 1642 }; |
| 2555 // clang-format on | 1643 // clang-format on |
| 2556 | 1644 |
| 2557 if (framer_.version() <= QUIC_VERSION_33) { | |
| 2558 return; | |
| 2559 } | |
| 2560 | |
| 2561 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1645 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2562 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1646 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2563 | 1647 |
| 2564 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1648 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2565 ASSERT_TRUE(visitor_.header_.get()); | 1649 ASSERT_TRUE(visitor_.header_.get()); |
| 2566 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 1650 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 2567 !kIncludeDiversificationNonce)); | 1651 !kIncludeDiversificationNonce)); |
| 2568 | 1652 |
| 2569 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1653 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 2570 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1654 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 2571 const QuicAckFrame& frame = *visitor_.ack_frames_[0].get(); | 1655 const QuicAckFrame& frame = *visitor_.ack_frames_[0].get(); |
| 2572 EXPECT_EQ(kSmallLargestObserved, frame.largest_observed); | 1656 EXPECT_EQ(kSmallLargestObserved, frame.largest_observed); |
| 2573 EXPECT_FALSE(frame.missing); | |
| 2574 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow()); | 1657 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow()); |
| 2575 | 1658 |
| 2576 const size_t kLargestAckedOffset = kQuicFrameTypeSize; | 1659 const size_t kLargestAckedOffset = kQuicFrameTypeSize; |
| 2577 const size_t kLargestAckedDeltaTimeOffset = | 1660 const size_t kLargestAckedDeltaTimeOffset = |
| 2578 kLargestAckedOffset + PACKET_2BYTE_PACKET_NUMBER; | 1661 kLargestAckedOffset + PACKET_2BYTE_PACKET_NUMBER; |
| 2579 const size_t kFirstAckBlockLengthOffset = | 1662 const size_t kFirstAckBlockLengthOffset = |
| 2580 kLargestAckedDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | 1663 kLargestAckedDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; |
| 2581 const size_t kNumTimestampsOffset = | 1664 const size_t kNumTimestampsOffset = |
| 2582 kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER; | 1665 kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER; |
| 2583 // Now test framing boundaries. | 1666 // Now test framing boundaries. |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2647 0x01, | 1730 0x01, |
| 2648 // Delta time. | 1731 // Delta time. |
| 2649 0x10, 0x32, 0x54, 0x76, | 1732 0x10, 0x32, 0x54, 0x76, |
| 2650 // Delta from largest observed. | 1733 // Delta from largest observed. |
| 2651 0x02, | 1734 0x02, |
| 2652 // Delta time. | 1735 // Delta time. |
| 2653 0x10, 0x32, | 1736 0x10, 0x32, |
| 2654 }; | 1737 }; |
| 2655 // clang-format on | 1738 // clang-format on |
| 2656 | 1739 |
| 2657 if (framer_.version() <= QUIC_VERSION_33) { | |
| 2658 return; | |
| 2659 } | |
| 2660 | |
| 2661 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1740 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2662 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1741 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2663 | 1742 |
| 2664 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1743 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2665 ASSERT_TRUE(visitor_.header_.get()); | 1744 ASSERT_TRUE(visitor_.header_.get()); |
| 2666 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 1745 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 2667 !kIncludeDiversificationNonce)); | 1746 !kIncludeDiversificationNonce)); |
| 2668 | 1747 |
| 2669 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1748 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 2670 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1749 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 2671 const QuicAckFrame& frame = *visitor_.ack_frames_[0].get(); | 1750 const QuicAckFrame& frame = *visitor_.ack_frames_[0].get(); |
| 2672 EXPECT_EQ(kSmallLargestObserved, frame.largest_observed); | 1751 EXPECT_EQ(kSmallLargestObserved, frame.largest_observed); |
| 2673 EXPECT_FALSE(frame.missing); | |
| 2674 ASSERT_EQ(4254u, frame.packets.NumPacketsSlow()); | 1752 ASSERT_EQ(4254u, frame.packets.NumPacketsSlow()); |
| 2675 | 1753 |
| 2676 const size_t kLargestAckedOffset = kQuicFrameTypeSize; | 1754 const size_t kLargestAckedOffset = kQuicFrameTypeSize; |
| 2677 const size_t kLargestAckedDeltaTimeOffset = | 1755 const size_t kLargestAckedDeltaTimeOffset = |
| 2678 kLargestAckedOffset + PACKET_2BYTE_PACKET_NUMBER; | 1756 kLargestAckedOffset + PACKET_2BYTE_PACKET_NUMBER; |
| 2679 const size_t kNumberOfAckBlocksOffset = | 1757 const size_t kNumberOfAckBlocksOffset = |
| 2680 kLargestAckedDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | 1758 kLargestAckedDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; |
| 2681 const size_t kFirstAckBlockLengthOffset = | 1759 const size_t kFirstAckBlockLengthOffset = |
| 2682 kNumberOfAckBlocksOffset + kNumberOfAckBlocksSize; | 1760 kNumberOfAckBlocksOffset + kNumberOfAckBlocksSize; |
| 2683 const size_t kGapToNextBlockOffset1 = | 1761 const size_t kGapToNextBlockOffset1 = |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2748 CheckProcessingFails( | 1826 CheckProcessingFails( |
| 2749 packet, | 1827 packet, |
| 2750 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 1828 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 2751 !kIncludeVersion, !kIncludePathId, | 1829 !kIncludeVersion, !kIncludePathId, |
| 2752 !kIncludeDiversificationNonce, | 1830 !kIncludeDiversificationNonce, |
| 2753 PACKET_6BYTE_PACKET_NUMBER), | 1831 PACKET_6BYTE_PACKET_NUMBER), |
| 2754 expected_error, QUIC_INVALID_ACK_DATA); | 1832 expected_error, QUIC_INVALID_ACK_DATA); |
| 2755 } | 1833 } |
| 2756 } | 1834 } |
| 2757 | 1835 |
| 2758 TEST_P(QuicFramerTest, AckFrameVersion32) { | 1836 TEST_P(QuicFramerTest, NewStopWaitingFrame) { |
| 2759 // clang-format off | 1837 // clang-format off |
| 2760 unsigned char packet[] = { | 1838 unsigned char packet[] = { |
| 2761 // public flags (8 byte connection_id) | 1839 // public flags (8 byte connection_id) |
| 2762 0x38, | 1840 0x3C, |
| 2763 // connection_id | 1841 // connection_id |
| 2764 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 1842 0x10, 0x32, 0x54, 0x76, |
| 2765 // packet number | 1843 0x98, 0xBA, 0xDC, 0xFE, |
| 2766 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, | 1844 // packet number |
| 2767 // private flags (entropy) | 1845 0xA8, 0x9A, 0x78, 0x56, |
| 2768 0x01, | 1846 0x34, 0x12, |
| 2769 | 1847 // frame type (stop waiting frame) |
| 2770 // frame type (ack frame) | 1848 0x06, |
| 2771 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 1849 // least packet number awaiting an ack, delta from packet number. |
| 2772 0x6C, | 1850 0x08, 0x00, 0x00, 0x00, |
| 2773 // entropy hash of all received packets. | 1851 0x00, 0x00, |
| 2774 0xBA, | |
| 2775 // largest observed packet number | |
| 2776 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 2777 // Zero delta time. | |
| 2778 0x00, 0x00, | |
| 2779 // Number of timestamps. | |
| 2780 0x00, | |
| 2781 // num missing packets | |
| 2782 0x01, | |
| 2783 // missing packet delta | |
| 2784 0x01, | |
| 2785 // 0 more missing packets in range. | |
| 2786 0x00, | |
| 2787 }; | 1852 }; |
| 2788 // clang-format on | 1853 // clang-format on |
| 2789 | 1854 |
| 2790 if (framer_.version() > QUIC_VERSION_33) { | |
| 2791 return; | |
| 2792 } | |
| 2793 | |
| 2794 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1855 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2795 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1856 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2796 | 1857 |
| 2797 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1858 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2798 ASSERT_TRUE(visitor_.header_.get()); | 1859 ASSERT_TRUE(visitor_.header_.get()); |
| 2799 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 1860 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 2800 !kIncludeDiversificationNonce)); | 1861 !kIncludeDiversificationNonce)); |
| 2801 | 1862 |
| 2802 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1863 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 2803 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1864 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size()); |
| 2804 const QuicAckFrame& frame = *visitor_.ack_frames_[0].get(); | 1865 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0].get(); |
| 2805 EXPECT_EQ(0xBA, frame.entropy_hash); | 1866 EXPECT_EQ(kLeastUnacked, frame.least_unacked); |
| 2806 EXPECT_EQ(kLargestObserved, frame.largest_observed); | |
| 2807 ASSERT_EQ(1u, frame.packets.NumPacketsSlow()); | |
| 2808 EXPECT_EQ(kMissingPacket, frame.packets.Min()); | |
| 2809 | 1867 |
| 2810 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | 1868 const size_t frame_size = 7; |
| 2811 const size_t kLargestObservedOffset = | 1869 for (size_t i = kQuicFrameTypeSize; i < frame_size; ++i) { |
| 2812 kReceivedEntropyOffset + kQuicEntropyHashSize; | |
| 2813 const size_t kMissingDeltaTimeOffset = | |
| 2814 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; | |
| 2815 const size_t kNumTimestampsOffset = | |
| 2816 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | |
| 2817 const size_t kNumMissingPacketOffset = | |
| 2818 kNumTimestampsOffset + kQuicNumTimestampsSize; | |
| 2819 const size_t kMissingPacketsOffset = | |
| 2820 kNumMissingPacketOffset + kNumberOfNackRangesSize; | |
| 2821 // Now test framing boundaries. | |
| 2822 const size_t ack_frame_size = PACKET_1BYTE_PACKET_NUMBER; | |
| 2823 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | |
| 2824 string expected_error; | 1870 string expected_error; |
| 2825 if (i < kLargestObservedOffset) { | 1871 expected_error = "Unable to read least unacked delta."; |
| 2826 expected_error = "Unable to read entropy hash for received packets."; | |
| 2827 } else if (i < kMissingDeltaTimeOffset) { | |
| 2828 expected_error = "Unable to read largest observed."; | |
| 2829 } else if (i < kNumTimestampsOffset) { | |
| 2830 expected_error = "Unable to read ack delay time."; | |
| 2831 } else if (i < kNumMissingPacketOffset) { | |
| 2832 expected_error = "Unable to read num received packets."; | |
| 2833 } else if (i < kMissingPacketsOffset) { | |
| 2834 expected_error = "Unable to read num missing packet ranges."; | |
| 2835 } else { | |
| 2836 expected_error = "Unable to read missing packet number delta."; | |
| 2837 } | |
| 2838 CheckProcessingFails( | 1872 CheckProcessingFails( |
| 2839 packet, | 1873 packet, |
| 2840 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 1874 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 2841 !kIncludeVersion, !kIncludePathId, | 1875 !kIncludeVersion, !kIncludePathId, |
| 2842 !kIncludeDiversificationNonce, | 1876 !kIncludeDiversificationNonce, |
| 2843 PACKET_6BYTE_PACKET_NUMBER), | 1877 PACKET_6BYTE_PACKET_NUMBER), |
| 2844 expected_error, QUIC_INVALID_ACK_DATA); | 1878 expected_error, QUIC_INVALID_STOP_WAITING_DATA); |
| 2845 } | 1879 } |
| 2846 } | 1880 } |
| 2847 | 1881 |
| 2848 TEST_P(QuicFramerTest, AckFrame500NacksVersion32) { | 1882 TEST_P(QuicFramerTest, RstStreamFrameQuic) { |
| 2849 // clang-format off | |
| 2850 unsigned char packet[] = { | |
| 2851 // public flags (8 byte connection_id) | |
| 2852 static_cast<unsigned char>( | |
| 2853 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 2854 // connection_id | |
| 2855 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 2856 // packet number | |
| 2857 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 2858 // private flags (entropy) | |
| 2859 0x01, | |
| 2860 | |
| 2861 // frame type (ack frame) | |
| 2862 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
| 2863 0x6C, | |
| 2864 // entropy hash of all received packets. | |
| 2865 0xBA, | |
| 2866 // largest observed packet number | |
| 2867 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 2868 // Zero delta time. | |
| 2869 0x00, 0x00, | |
| 2870 // No received packets. | |
| 2871 0x00, | |
| 2872 // num missing packet ranges | |
| 2873 0x02, | |
| 2874 // missing packet delta | |
| 2875 0x01, | |
| 2876 // 243 more missing packets in range. | |
| 2877 // The ranges are listed in this order so the re-constructed packet | |
| 2878 // matches. | |
| 2879 0xF3, | |
| 2880 // No gap between ranges | |
| 2881 0x00, | |
| 2882 // 255 more missing packets in range. | |
| 2883 0xFF, | |
| 2884 }; | |
| 2885 // clang-format on | |
| 2886 | |
| 2887 if (framer_.version() > QUIC_VERSION_33) { | |
| 2888 return; | |
| 2889 } | |
| 2890 | |
| 2891 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
| 2892 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
| 2893 | |
| 2894 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
| 2895 ASSERT_TRUE(visitor_.header_.get()); | |
| 2896 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | |
| 2897 !kIncludeDiversificationNonce)); | |
| 2898 | |
| 2899 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
| 2900 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
| 2901 QuicAckFrame* frame = visitor_.ack_frames_[0].get(); | |
| 2902 EXPECT_EQ(0xBA, frame->entropy_hash); | |
| 2903 EXPECT_EQ(kLargestObserved, frame->largest_observed); | |
| 2904 ASSERT_EQ(500u, frame->packets.NumPacketsSlow()); | |
| 2905 EXPECT_EQ(kMissingPacket - 499, frame->packets.Min()); | |
| 2906 EXPECT_EQ(kMissingPacket, frame->packets.Max()); | |
| 2907 | |
| 2908 // Verify that the packet re-serializes identically. | |
| 2909 QuicFrames frames; | |
| 2910 frames.push_back(QuicFrame(frame)); | |
| 2911 std::unique_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); | |
| 2912 ASSERT_TRUE(data != nullptr); | |
| 2913 | |
| 2914 test::CompareCharArraysWithHexError("constructed packet", data->data(), | |
| 2915 data->length(), AsChars(packet), | |
| 2916 arraysize(packet)); | |
| 2917 } | |
| 2918 | |
| 2919 TEST_P(QuicFramerTest, StopWaitingFrame) { | |
| 2920 if (framer_.version() > QUIC_VERSION_33) { | |
| 2921 return; | |
| 2922 } | |
| 2923 // clang-format off | 1883 // clang-format off |
| 2924 unsigned char packet[] = { | 1884 unsigned char packet[] = { |
| 2925 // public flags (8 byte connection_id) | 1885 // public flags (8 byte connection_id) |
| 2926 0x38, | 1886 0x38, |
| 2927 // connection_id | 1887 // connection_id |
| 2928 0x10, 0x32, 0x54, 0x76, | 1888 0x10, 0x32, 0x54, 0x76, |
| 2929 0x98, 0xBA, 0xDC, 0xFE, | 1889 0x98, 0xBA, 0xDC, 0xFE, |
| 2930 // packet number | 1890 // packet number |
| 2931 0xA8, 0x9A, 0x78, 0x56, | 1891 0xBC, 0x9A, 0x78, 0x56, |
| 2932 0x34, 0x12, | 1892 0x34, 0x12, |
| 2933 // private flags (entropy) | 1893 |
| 1894 // frame type (rst stream frame) |
| 2934 0x01, | 1895 0x01, |
| 1896 // stream id |
| 1897 0x04, 0x03, 0x02, 0x01, |
| 2935 | 1898 |
| 2936 // frame type (ack frame) | 1899 // sent byte offset |
| 2937 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 1900 0x54, 0x76, 0x10, 0x32, |
| 2938 0x06, | 1901 0xDC, 0xFE, 0x98, 0xBA, |
| 2939 // entropy hash of sent packets till least awaiting - 1. | 1902 |
| 2940 0xAB, | 1903 // error code |
| 2941 // least packet number awaiting an ack, delta from packet number. | 1904 0x01, 0x00, 0x00, 0x00, |
| 2942 0x08, 0x00, 0x00, 0x00, | |
| 2943 0x00, 0x00, | |
| 2944 }; | 1905 }; |
| 2945 // clang-format on | 1906 // clang-format on |
| 2946 | 1907 |
| 2947 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1908 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2948 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1909 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2949 | 1910 |
| 2950 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1911 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2951 ASSERT_TRUE(visitor_.header_.get()); | 1912 ASSERT_TRUE(visitor_.header_.get()); |
| 2952 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 1913 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 2953 !kIncludeDiversificationNonce)); | 1914 !kIncludeDiversificationNonce)); |
| 2954 | 1915 |
| 2955 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1916 EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id); |
| 2956 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size()); | 1917 EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code); |
| 2957 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0].get(); | 1918 EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset); |
| 2958 EXPECT_EQ(0xAB, frame.entropy_hash); | |
| 2959 EXPECT_EQ(kLeastUnacked, frame.least_unacked); | |
| 2960 | 1919 |
| 2961 const size_t kSentEntropyOffset = kQuicFrameTypeSize; | 1920 // Now test framing boundaries. |
| 2962 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; | 1921 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetRstStreamFrameSize(); |
| 2963 const size_t frame_size = 7; | 1922 ++i) { |
| 2964 for (size_t i = kQuicFrameTypeSize; i < frame_size; ++i) { | |
| 2965 string expected_error; | 1923 string expected_error; |
| 2966 if (i < kLeastUnackedOffset) { | 1924 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { |
| 2967 expected_error = "Unable to read entropy hash for sent packets."; | 1925 expected_error = "Unable to read stream_id."; |
| 2968 } else { | 1926 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + |
| 2969 expected_error = "Unable to read least unacked delta."; | 1927 kQuicMaxStreamOffsetSize) { |
| 1928 expected_error = "Unable to read rst stream sent byte offset."; |
| 1929 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + |
| 1930 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize) { |
| 1931 expected_error = "Unable to read rst stream error code."; |
| 2970 } | 1932 } |
| 2971 CheckProcessingFails( | 1933 CheckProcessingFails( |
| 2972 packet, | 1934 packet, |
| 2973 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 1935 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 2974 !kIncludeVersion, !kIncludePathId, | 1936 !kIncludeVersion, !kIncludePathId, |
| 2975 !kIncludeDiversificationNonce, | 1937 !kIncludeDiversificationNonce, |
| 2976 PACKET_6BYTE_PACKET_NUMBER), | 1938 PACKET_6BYTE_PACKET_NUMBER), |
| 2977 expected_error, QUIC_INVALID_STOP_WAITING_DATA); | |
| 2978 } | |
| 2979 } | |
| 2980 | |
| 2981 TEST_P(QuicFramerTest, NewStopWaitingFrame) { | |
| 2982 if (framer_.version() <= QUIC_VERSION_33) { | |
| 2983 return; | |
| 2984 } | |
| 2985 // clang-format off | |
| 2986 unsigned char packet[] = { | |
| 2987 // public flags (8 byte connection_id) | |
| 2988 0x3C, | |
| 2989 // connection_id | |
| 2990 0x10, 0x32, 0x54, 0x76, | |
| 2991 0x98, 0xBA, 0xDC, 0xFE, | |
| 2992 // packet number | |
| 2993 0xA8, 0x9A, 0x78, 0x56, | |
| 2994 0x34, 0x12, | |
| 2995 // frame type (stop waiting frame) | |
| 2996 0x06, | |
| 2997 // least packet number awaiting an ack, delta from packet number. | |
| 2998 0x08, 0x00, 0x00, 0x00, | |
| 2999 0x00, 0x00, | |
| 3000 }; | |
| 3001 // clang-format on | |
| 3002 | |
| 3003 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
| 3004 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
| 3005 | |
| 3006 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
| 3007 ASSERT_TRUE(visitor_.header_.get()); | |
| 3008 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | |
| 3009 !kIncludeDiversificationNonce)); | |
| 3010 | |
| 3011 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
| 3012 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size()); | |
| 3013 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0].get(); | |
| 3014 EXPECT_EQ(kLeastUnacked, frame.least_unacked); | |
| 3015 | |
| 3016 const size_t frame_size = 7; | |
| 3017 for (size_t i = kQuicFrameTypeSize; i < frame_size; ++i) { | |
| 3018 string expected_error; | |
| 3019 expected_error = "Unable to read least unacked delta."; | |
| 3020 CheckProcessingFails( | |
| 3021 packet, | |
| 3022 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | |
| 3023 !kIncludeVersion, !kIncludePathId, | |
| 3024 !kIncludeDiversificationNonce, | |
| 3025 PACKET_6BYTE_PACKET_NUMBER), | |
| 3026 expected_error, QUIC_INVALID_STOP_WAITING_DATA); | |
| 3027 } | |
| 3028 } | |
| 3029 | |
| 3030 TEST_P(QuicFramerTest, RstStreamFrameQuic) { | |
| 3031 // clang-format off | |
| 3032 unsigned char packet[] = { | |
| 3033 // public flags (8 byte connection_id) | |
| 3034 0x38, | |
| 3035 // connection_id | |
| 3036 0x10, 0x32, 0x54, 0x76, | |
| 3037 0x98, 0xBA, 0xDC, 0xFE, | |
| 3038 // packet number | |
| 3039 0xBC, 0x9A, 0x78, 0x56, | |
| 3040 0x34, 0x12, | |
| 3041 // private flags | |
| 3042 0x00, | |
| 3043 | |
| 3044 // frame type (rst stream frame) | |
| 3045 0x01, | |
| 3046 // stream id | |
| 3047 0x04, 0x03, 0x02, 0x01, | |
| 3048 | |
| 3049 // sent byte offset | |
| 3050 0x54, 0x76, 0x10, 0x32, | |
| 3051 0xDC, 0xFE, 0x98, 0xBA, | |
| 3052 | |
| 3053 // error code | |
| 3054 0x01, 0x00, 0x00, 0x00, | |
| 3055 }; | |
| 3056 unsigned char packet_34[] = { | |
| 3057 // public flags (8 byte connection_id) | |
| 3058 0x38, | |
| 3059 // connection_id | |
| 3060 0x10, 0x32, 0x54, 0x76, | |
| 3061 0x98, 0xBA, 0xDC, 0xFE, | |
| 3062 // packet number | |
| 3063 0xBC, 0x9A, 0x78, 0x56, | |
| 3064 0x34, 0x12, | |
| 3065 | |
| 3066 // frame type (rst stream frame) | |
| 3067 0x01, | |
| 3068 // stream id | |
| 3069 0x04, 0x03, 0x02, 0x01, | |
| 3070 | |
| 3071 // sent byte offset | |
| 3072 0x54, 0x76, 0x10, 0x32, | |
| 3073 0xDC, 0xFE, 0x98, 0xBA, | |
| 3074 | |
| 3075 // error code | |
| 3076 0x01, 0x00, 0x00, 0x00, | |
| 3077 }; | |
| 3078 // clang-format on | |
| 3079 | |
| 3080 QuicEncryptedPacket encrypted( | |
| 3081 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 3082 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 3083 : arraysize(packet_34), | |
| 3084 false); | |
| 3085 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
| 3086 | |
| 3087 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
| 3088 ASSERT_TRUE(visitor_.header_.get()); | |
| 3089 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | |
| 3090 !kIncludeDiversificationNonce)); | |
| 3091 | |
| 3092 EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id); | |
| 3093 EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code); | |
| 3094 EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset); | |
| 3095 | |
| 3096 // Now test framing boundaries. | |
| 3097 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetRstStreamFrameSize(); | |
| 3098 ++i) { | |
| 3099 string expected_error; | |
| 3100 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { | |
| 3101 expected_error = "Unable to read stream_id."; | |
| 3102 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + | |
| 3103 kQuicMaxStreamOffsetSize) { | |
| 3104 expected_error = "Unable to read rst stream sent byte offset."; | |
| 3105 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + | |
| 3106 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize) { | |
| 3107 expected_error = "Unable to read rst stream error code."; | |
| 3108 } | |
| 3109 CheckProcessingFails( | |
| 3110 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, | |
| 3111 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | |
| 3112 !kIncludeVersion, !kIncludePathId, | |
| 3113 !kIncludeDiversificationNonce, | |
| 3114 PACKET_6BYTE_PACKET_NUMBER), | |
| 3115 expected_error, QUIC_INVALID_RST_STREAM_DATA); | 1939 expected_error, QUIC_INVALID_RST_STREAM_DATA); |
| 3116 } | 1940 } |
| 3117 } | 1941 } |
| 3118 | 1942 |
| 3119 TEST_P(QuicFramerTest, ConnectionCloseFrame) { | 1943 TEST_P(QuicFramerTest, ConnectionCloseFrame) { |
| 3120 // clang-format off | 1944 // clang-format off |
| 3121 unsigned char packet[] = { | 1945 unsigned char packet[] = { |
| 3122 // public flags (8 byte connection_id) | 1946 // public flags (8 byte connection_id) |
| 3123 0x38, | 1947 0x38, |
| 3124 // connection_id | 1948 // connection_id |
| 3125 0x10, 0x32, 0x54, 0x76, | 1949 0x10, 0x32, 0x54, 0x76, |
| 3126 0x98, 0xBA, 0xDC, 0xFE, | 1950 0x98, 0xBA, 0xDC, 0xFE, |
| 3127 // packet number | |
| 3128 0xBC, 0x9A, 0x78, 0x56, | |
| 3129 0x34, 0x12, | |
| 3130 // private flags | |
| 3131 0x00, | |
| 3132 | |
| 3133 // frame type (connection close frame) | |
| 3134 0x02, | |
| 3135 // error code | |
| 3136 0x11, 0x00, 0x00, 0x00, | |
| 3137 | |
| 3138 // error details length | |
| 3139 0x0d, 0x00, | |
| 3140 // error details | |
| 3141 'b', 'e', 'c', 'a', | |
| 3142 'u', 's', 'e', ' ', | |
| 3143 'I', ' ', 'c', 'a', | |
| 3144 'n', | |
| 3145 }; | |
| 3146 unsigned char packet_34[] = { | |
| 3147 // public flags (8 byte connection_id) | |
| 3148 0x38, | |
| 3149 // connection_id | |
| 3150 0x10, 0x32, 0x54, 0x76, | |
| 3151 0x98, 0xBA, 0xDC, 0xFE, | |
| 3152 // packet number | 1951 // packet number |
| 3153 0xBC, 0x9A, 0x78, 0x56, | 1952 0xBC, 0x9A, 0x78, 0x56, |
| 3154 0x34, 0x12, | 1953 0x34, 0x12, |
| 3155 | 1954 |
| 3156 // frame type (connection close frame) | 1955 // frame type (connection close frame) |
| 3157 0x02, | 1956 0x02, |
| 3158 // error code | 1957 // error code |
| 3159 0x11, 0x00, 0x00, 0x00, | 1958 0x11, 0x00, 0x00, 0x00, |
| 3160 | 1959 |
| 3161 // error details length | 1960 // error details length |
| 3162 0x0d, 0x00, | 1961 0x0d, 0x00, |
| 3163 // error details | 1962 // error details |
| 3164 'b', 'e', 'c', 'a', | 1963 'b', 'e', 'c', 'a', |
| 3165 'u', 's', 'e', ' ', | 1964 'u', 's', 'e', ' ', |
| 3166 'I', ' ', 'c', 'a', | 1965 'I', ' ', 'c', 'a', |
| 3167 'n', | 1966 'n', |
| 3168 }; | 1967 }; |
| 3169 // clang-format on | 1968 // clang-format on |
| 3170 | 1969 |
| 3171 QuicEncryptedPacket encrypted( | 1970 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 3172 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 3173 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 3174 : arraysize(packet_34), | |
| 3175 false); | |
| 3176 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1971 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 3177 | 1972 |
| 3178 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1973 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 3179 ASSERT_TRUE(visitor_.header_.get()); | 1974 ASSERT_TRUE(visitor_.header_.get()); |
| 3180 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 1975 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 3181 !kIncludeDiversificationNonce)); | 1976 !kIncludeDiversificationNonce)); |
| 3182 | 1977 |
| 3183 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1978 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 3184 | 1979 |
| 3185 EXPECT_EQ(0x11, visitor_.connection_close_frame_.error_code); | 1980 EXPECT_EQ(0x11, visitor_.connection_close_frame_.error_code); |
| 3186 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details); | 1981 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details); |
| 3187 | 1982 |
| 3188 ASSERT_EQ(0u, visitor_.ack_frames_.size()); | 1983 ASSERT_EQ(0u, visitor_.ack_frames_.size()); |
| 3189 | 1984 |
| 3190 // Now test framing boundaries. | 1985 // Now test framing boundaries. |
| 3191 for (size_t i = kQuicFrameTypeSize; | 1986 for (size_t i = kQuicFrameTypeSize; |
| 3192 i < QuicFramer::GetMinConnectionCloseFrameSize(); ++i) { | 1987 i < QuicFramer::GetMinConnectionCloseFrameSize(); ++i) { |
| 3193 string expected_error; | 1988 string expected_error; |
| 3194 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { | 1989 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { |
| 3195 expected_error = "Unable to read connection close error code."; | 1990 expected_error = "Unable to read connection close error code."; |
| 3196 } else { | 1991 } else { |
| 3197 expected_error = "Unable to read connection close error details."; | 1992 expected_error = "Unable to read connection close error details."; |
| 3198 } | 1993 } |
| 3199 CheckProcessingFails( | 1994 CheckProcessingFails( |
| 3200 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, | 1995 packet, |
| 3201 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 1996 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 3202 !kIncludeVersion, !kIncludePathId, | 1997 !kIncludeVersion, !kIncludePathId, |
| 3203 !kIncludeDiversificationNonce, | 1998 !kIncludeDiversificationNonce, |
| 3204 PACKET_6BYTE_PACKET_NUMBER), | 1999 PACKET_6BYTE_PACKET_NUMBER), |
| 3205 expected_error, QUIC_INVALID_CONNECTION_CLOSE_DATA); | 2000 expected_error, QUIC_INVALID_CONNECTION_CLOSE_DATA); |
| 3206 } | 2001 } |
| 3207 } | 2002 } |
| 3208 | 2003 |
| 3209 TEST_P(QuicFramerTest, GoAwayFrame) { | 2004 TEST_P(QuicFramerTest, GoAwayFrame) { |
| 3210 // clang-format off | 2005 // clang-format off |
| 3211 unsigned char packet[] = { | 2006 unsigned char packet[] = { |
| 3212 // public flags (8 byte connection_id) | 2007 // public flags (8 byte connection_id) |
| 3213 0x38, | 2008 0x38, |
| 3214 // connection_id | 2009 // connection_id |
| 3215 0x10, 0x32, 0x54, 0x76, | 2010 0x10, 0x32, 0x54, 0x76, |
| 3216 0x98, 0xBA, 0xDC, 0xFE, | 2011 0x98, 0xBA, 0xDC, 0xFE, |
| 3217 // packet number | 2012 // packet number |
| 3218 0xBC, 0x9A, 0x78, 0x56, | 2013 0xBC, 0x9A, 0x78, 0x56, |
| 3219 0x34, 0x12, | 2014 0x34, 0x12, |
| 3220 // private flags | |
| 3221 0x00, | |
| 3222 | |
| 3223 // frame type (go away frame) | |
| 3224 0x03, | |
| 3225 // error code | |
| 3226 0x09, 0x00, 0x00, 0x00, | |
| 3227 // stream id | |
| 3228 0x04, 0x03, 0x02, 0x01, | |
| 3229 // error details length | |
| 3230 0x0d, 0x00, | |
| 3231 // error details | |
| 3232 'b', 'e', 'c', 'a', | |
| 3233 'u', 's', 'e', ' ', | |
| 3234 'I', ' ', 'c', 'a', | |
| 3235 'n', | |
| 3236 }; | |
| 3237 unsigned char packet_34[] = { | |
| 3238 // public flags (8 byte connection_id) | |
| 3239 0x38, | |
| 3240 // connection_id | |
| 3241 0x10, 0x32, 0x54, 0x76, | |
| 3242 0x98, 0xBA, 0xDC, 0xFE, | |
| 3243 // packet number | |
| 3244 0xBC, 0x9A, 0x78, 0x56, | |
| 3245 0x34, 0x12, | |
| 3246 | 2015 |
| 3247 // frame type (go away frame) | 2016 // frame type (go away frame) |
| 3248 0x03, | 2017 0x03, |
| 3249 // error code | 2018 // error code |
| 3250 0x09, 0x00, 0x00, 0x00, | 2019 0x09, 0x00, 0x00, 0x00, |
| 3251 // stream id | 2020 // stream id |
| 3252 0x04, 0x03, 0x02, 0x01, | 2021 0x04, 0x03, 0x02, 0x01, |
| 3253 // error details length | 2022 // error details length |
| 3254 0x0d, 0x00, | 2023 0x0d, 0x00, |
| 3255 // error details | 2024 // error details |
| 3256 'b', 'e', 'c', 'a', | 2025 'b', 'e', 'c', 'a', |
| 3257 'u', 's', 'e', ' ', | 2026 'u', 's', 'e', ' ', |
| 3258 'I', ' ', 'c', 'a', | 2027 'I', ' ', 'c', 'a', |
| 3259 'n', | 2028 'n', |
| 3260 }; | 2029 }; |
| 3261 // clang-format on | 2030 // clang-format on |
| 3262 | 2031 |
| 3263 QuicEncryptedPacket encrypted( | 2032 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 3264 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 3265 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 3266 : arraysize(packet_34), | |
| 3267 false); | |
| 3268 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2033 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 3269 | 2034 |
| 3270 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2035 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 3271 ASSERT_TRUE(visitor_.header_.get()); | 2036 ASSERT_TRUE(visitor_.header_.get()); |
| 3272 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 2037 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 3273 !kIncludeDiversificationNonce)); | 2038 !kIncludeDiversificationNonce)); |
| 3274 | 2039 |
| 3275 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id); | 2040 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id); |
| 3276 EXPECT_EQ(0x9, visitor_.goaway_frame_.error_code); | 2041 EXPECT_EQ(0x9, visitor_.goaway_frame_.error_code); |
| 3277 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase); | 2042 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase); |
| 3278 | 2043 |
| 3279 const size_t reason_size = arraysize("because I can") - 1; | 2044 const size_t reason_size = arraysize("because I can") - 1; |
| 3280 // Now test framing boundaries. | 2045 // Now test framing boundaries. |
| 3281 for (size_t i = kQuicFrameTypeSize; | 2046 for (size_t i = kQuicFrameTypeSize; |
| 3282 i < QuicFramer::GetMinGoAwayFrameSize() + reason_size; ++i) { | 2047 i < QuicFramer::GetMinGoAwayFrameSize() + reason_size; ++i) { |
| 3283 string expected_error; | 2048 string expected_error; |
| 3284 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { | 2049 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { |
| 3285 expected_error = "Unable to read go away error code."; | 2050 expected_error = "Unable to read go away error code."; |
| 3286 } else if (i < | 2051 } else if (i < |
| 3287 kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicMaxStreamIdSize) { | 2052 kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicMaxStreamIdSize) { |
| 3288 expected_error = "Unable to read last good stream id."; | 2053 expected_error = "Unable to read last good stream id."; |
| 3289 } else { | 2054 } else { |
| 3290 expected_error = "Unable to read goaway reason."; | 2055 expected_error = "Unable to read goaway reason."; |
| 3291 } | 2056 } |
| 3292 CheckProcessingFails( | 2057 CheckProcessingFails( |
| 3293 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, | 2058 packet, |
| 3294 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 2059 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 3295 !kIncludeVersion, !kIncludePathId, | 2060 !kIncludeVersion, !kIncludePathId, |
| 3296 !kIncludeDiversificationNonce, | 2061 !kIncludeDiversificationNonce, |
| 3297 PACKET_6BYTE_PACKET_NUMBER), | 2062 PACKET_6BYTE_PACKET_NUMBER), |
| 3298 expected_error, QUIC_INVALID_GOAWAY_DATA); | 2063 expected_error, QUIC_INVALID_GOAWAY_DATA); |
| 3299 } | 2064 } |
| 3300 } | 2065 } |
| 3301 | 2066 |
| 3302 TEST_P(QuicFramerTest, WindowUpdateFrame) { | 2067 TEST_P(QuicFramerTest, WindowUpdateFrame) { |
| 3303 // clang-format off | 2068 // clang-format off |
| 3304 unsigned char packet[] = { | 2069 unsigned char packet[] = { |
| 3305 // public flags (8 byte connection_id) | 2070 // public flags (8 byte connection_id) |
| 3306 0x38, | 2071 0x38, |
| 3307 // connection_id | 2072 // connection_id |
| 3308 0x10, 0x32, 0x54, 0x76, | 2073 0x10, 0x32, 0x54, 0x76, |
| 3309 0x98, 0xBA, 0xDC, 0xFE, | 2074 0x98, 0xBA, 0xDC, 0xFE, |
| 3310 // packet number | 2075 // packet number |
| 3311 0xBC, 0x9A, 0x78, 0x56, | 2076 0xBC, 0x9A, 0x78, 0x56, |
| 3312 0x34, 0x12, | 2077 0x34, 0x12, |
| 3313 // private flags | |
| 3314 0x00, | |
| 3315 | |
| 3316 // frame type (window update frame) | |
| 3317 0x04, | |
| 3318 // stream id | |
| 3319 0x04, 0x03, 0x02, 0x01, | |
| 3320 // byte offset | |
| 3321 0x54, 0x76, 0x10, 0x32, | |
| 3322 0xDC, 0xFE, 0x98, 0xBA, | |
| 3323 }; | |
| 3324 unsigned char packet_34[] = { | |
| 3325 // public flags (8 byte connection_id) | |
| 3326 0x38, | |
| 3327 // connection_id | |
| 3328 0x10, 0x32, 0x54, 0x76, | |
| 3329 0x98, 0xBA, 0xDC, 0xFE, | |
| 3330 // packet number | |
| 3331 0xBC, 0x9A, 0x78, 0x56, | |
| 3332 0x34, 0x12, | |
| 3333 | 2078 |
| 3334 // frame type (window update frame) | 2079 // frame type (window update frame) |
| 3335 0x04, | 2080 0x04, |
| 3336 // stream id | 2081 // stream id |
| 3337 0x04, 0x03, 0x02, 0x01, | 2082 0x04, 0x03, 0x02, 0x01, |
| 3338 // byte offset | 2083 // byte offset |
| 3339 0x54, 0x76, 0x10, 0x32, | 2084 0x54, 0x76, 0x10, 0x32, |
| 3340 0xDC, 0xFE, 0x98, 0xBA, | 2085 0xDC, 0xFE, 0x98, 0xBA, |
| 3341 }; | 2086 }; |
| 3342 // clang-format on | 2087 // clang-format on |
| 3343 | 2088 |
| 3344 QuicEncryptedPacket encrypted( | 2089 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 3345 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 3346 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 3347 : arraysize(packet_34), | |
| 3348 false); | |
| 3349 | |
| 3350 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2090 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 3351 | 2091 |
| 3352 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2092 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 3353 ASSERT_TRUE(visitor_.header_.get()); | 2093 ASSERT_TRUE(visitor_.header_.get()); |
| 3354 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 2094 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 3355 !kIncludeDiversificationNonce)); | 2095 !kIncludeDiversificationNonce)); |
| 3356 | 2096 |
| 3357 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id); | 2097 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id); |
| 3358 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset); | 2098 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset); |
| 3359 | 2099 |
| 3360 // Now test framing boundaries. | 2100 // Now test framing boundaries. |
| 3361 for (size_t i = kQuicFrameTypeSize; | 2101 for (size_t i = kQuicFrameTypeSize; |
| 3362 i < QuicFramer::GetWindowUpdateFrameSize(); ++i) { | 2102 i < QuicFramer::GetWindowUpdateFrameSize(); ++i) { |
| 3363 string expected_error; | 2103 string expected_error; |
| 3364 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { | 2104 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { |
| 3365 expected_error = "Unable to read stream_id."; | 2105 expected_error = "Unable to read stream_id."; |
| 3366 } else { | 2106 } else { |
| 3367 expected_error = "Unable to read window byte_offset."; | 2107 expected_error = "Unable to read window byte_offset."; |
| 3368 } | 2108 } |
| 3369 CheckProcessingFails( | 2109 CheckProcessingFails( |
| 3370 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, | 2110 packet, |
| 3371 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 2111 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 3372 !kIncludeVersion, !kIncludePathId, | 2112 !kIncludeVersion, !kIncludePathId, |
| 3373 !kIncludeDiversificationNonce, | 2113 !kIncludeDiversificationNonce, |
| 3374 PACKET_6BYTE_PACKET_NUMBER), | 2114 PACKET_6BYTE_PACKET_NUMBER), |
| 3375 expected_error, QUIC_INVALID_WINDOW_UPDATE_DATA); | 2115 expected_error, QUIC_INVALID_WINDOW_UPDATE_DATA); |
| 3376 } | 2116 } |
| 3377 } | 2117 } |
| 3378 | 2118 |
| 3379 TEST_P(QuicFramerTest, BlockedFrame) { | 2119 TEST_P(QuicFramerTest, BlockedFrame) { |
| 3380 // clang-format off | 2120 // clang-format off |
| 3381 unsigned char packet[] = { | 2121 unsigned char packet[] = { |
| 3382 // public flags (8 byte connection_id) | 2122 // public flags (8 byte connection_id) |
| 3383 0x38, | 2123 0x38, |
| 3384 // connection_id | 2124 // connection_id |
| 3385 0x10, 0x32, 0x54, 0x76, | 2125 0x10, 0x32, 0x54, 0x76, |
| 3386 0x98, 0xBA, 0xDC, 0xFE, | 2126 0x98, 0xBA, 0xDC, 0xFE, |
| 3387 // packet number | 2127 // packet number |
| 3388 0xBC, 0x9A, 0x78, 0x56, | 2128 0xBC, 0x9A, 0x78, 0x56, |
| 3389 0x34, 0x12, | 2129 0x34, 0x12, |
| 3390 // private flags | |
| 3391 0x00, | |
| 3392 | |
| 3393 // frame type (blocked frame) | |
| 3394 0x05, | |
| 3395 // stream id | |
| 3396 0x04, 0x03, 0x02, 0x01, | |
| 3397 }; | |
| 3398 unsigned char packet_34[] = { | |
| 3399 // public flags (8 byte connection_id) | |
| 3400 0x38, | |
| 3401 // connection_id | |
| 3402 0x10, 0x32, 0x54, 0x76, | |
| 3403 0x98, 0xBA, 0xDC, 0xFE, | |
| 3404 // packet number | |
| 3405 0xBC, 0x9A, 0x78, 0x56, | |
| 3406 0x34, 0x12, | |
| 3407 | 2130 |
| 3408 // frame type (blocked frame) | 2131 // frame type (blocked frame) |
| 3409 0x05, | 2132 0x05, |
| 3410 // stream id | 2133 // stream id |
| 3411 0x04, 0x03, 0x02, 0x01, | 2134 0x04, 0x03, 0x02, 0x01, |
| 3412 }; | 2135 }; |
| 3413 // clang-format on | 2136 // clang-format on |
| 3414 | 2137 |
| 3415 QuicEncryptedPacket encrypted( | 2138 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 3416 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 3417 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 3418 : arraysize(packet_34), | |
| 3419 false); | |
| 3420 | |
| 3421 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2139 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 3422 | 2140 |
| 3423 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2141 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 3424 ASSERT_TRUE(visitor_.header_.get()); | 2142 ASSERT_TRUE(visitor_.header_.get()); |
| 3425 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 2143 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 3426 !kIncludeDiversificationNonce)); | 2144 !kIncludeDiversificationNonce)); |
| 3427 | 2145 |
| 3428 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id); | 2146 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id); |
| 3429 | 2147 |
| 3430 // Now test framing boundaries. | 2148 // Now test framing boundaries. |
| 3431 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetBlockedFrameSize(); | 2149 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetBlockedFrameSize(); |
| 3432 ++i) { | 2150 ++i) { |
| 3433 string expected_error = "Unable to read stream_id."; | 2151 string expected_error = "Unable to read stream_id."; |
| 3434 CheckProcessingFails( | 2152 CheckProcessingFails( |
| 3435 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, | 2153 packet, |
| 3436 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 2154 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 3437 !kIncludeVersion, !kIncludePathId, | 2155 !kIncludeVersion, !kIncludePathId, |
| 3438 !kIncludeDiversificationNonce, | 2156 !kIncludeDiversificationNonce, |
| 3439 PACKET_6BYTE_PACKET_NUMBER), | 2157 PACKET_6BYTE_PACKET_NUMBER), |
| 3440 expected_error, QUIC_INVALID_BLOCKED_DATA); | 2158 expected_error, QUIC_INVALID_BLOCKED_DATA); |
| 3441 } | 2159 } |
| 3442 } | 2160 } |
| 3443 | 2161 |
| 3444 TEST_P(QuicFramerTest, PingFrame) { | 2162 TEST_P(QuicFramerTest, PingFrame) { |
| 3445 // clang-format off | 2163 // clang-format off |
| 3446 unsigned char packet[] = { | 2164 unsigned char packet[] = { |
| 3447 // public flags (8 byte connection_id) | 2165 // public flags (8 byte connection_id) |
| 3448 0x38, | 2166 0x38, |
| 3449 // connection_id | 2167 // connection_id |
| 3450 0x10, 0x32, 0x54, 0x76, | 2168 0x10, 0x32, 0x54, 0x76, |
| 3451 0x98, 0xBA, 0xDC, 0xFE, | 2169 0x98, 0xBA, 0xDC, 0xFE, |
| 3452 // packet number | 2170 // packet number |
| 3453 0xBC, 0x9A, 0x78, 0x56, | 2171 0xBC, 0x9A, 0x78, 0x56, |
| 3454 0x34, 0x12, | 2172 0x34, 0x12, |
| 3455 // private flags | |
| 3456 0x00, | |
| 3457 | |
| 3458 // frame type (ping frame) | |
| 3459 0x07, | |
| 3460 }; | |
| 3461 unsigned char packet_34[] = { | |
| 3462 // public flags (8 byte connection_id) | |
| 3463 0x38, | |
| 3464 // connection_id | |
| 3465 0x10, 0x32, 0x54, 0x76, | |
| 3466 0x98, 0xBA, 0xDC, 0xFE, | |
| 3467 // packet number | |
| 3468 0xBC, 0x9A, 0x78, 0x56, | |
| 3469 0x34, 0x12, | |
| 3470 | 2173 |
| 3471 // frame type (ping frame) | 2174 // frame type (ping frame) |
| 3472 0x07, | 2175 0x07, |
| 3473 }; | 2176 }; |
| 3474 // clang-format on | 2177 // clang-format on |
| 3475 | 2178 |
| 3476 QuicEncryptedPacket encrypted( | 2179 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 3477 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 3478 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 3479 : arraysize(packet_34), | |
| 3480 false); | |
| 3481 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2180 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 3482 | 2181 |
| 3483 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2182 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 3484 ASSERT_TRUE(visitor_.header_.get()); | 2183 ASSERT_TRUE(visitor_.header_.get()); |
| 3485 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 2184 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
| 3486 !kIncludeDiversificationNonce)); | 2185 !kIncludeDiversificationNonce)); |
| 3487 | 2186 |
| 3488 EXPECT_EQ(1u, visitor_.ping_frames_.size()); | 2187 EXPECT_EQ(1u, visitor_.ping_frames_.size()); |
| 3489 | 2188 |
| 3490 // No need to check the PING frame boundaries because it has no payload. | 2189 // No need to check the PING frame boundaries because it has no payload. |
| 3491 } | 2190 } |
| 3492 | 2191 |
| 3493 TEST_P(QuicFramerTest, PathCloseFrame) { | 2192 TEST_P(QuicFramerTest, PathCloseFrame) { |
| 3494 // clang-format off | 2193 // clang-format off |
| 3495 unsigned char packet[] = { | 2194 unsigned char packet[] = { |
| 3496 // public flags (version) | 2195 // public flags (version) |
| 3497 0x78, | 2196 0x78, |
| 3498 // connection_id | 2197 // connection_id |
| 3499 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 2198 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 3500 // path_id | 2199 // path_id |
| 3501 0x00, | 2200 0x00, |
| 3502 // packet number | 2201 // packet number |
| 3503 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 2202 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 3504 // private flags | |
| 3505 0x00, | |
| 3506 | |
| 3507 // frame type (path_close_frame) | |
| 3508 0x08, | |
| 3509 // path id | |
| 3510 0x42, | |
| 3511 }; | |
| 3512 unsigned char packet_34[] = { | |
| 3513 // public flags (version) | |
| 3514 0x78, | |
| 3515 // connection_id | |
| 3516 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 3517 // path_id | |
| 3518 0x00, | |
| 3519 // packet number | |
| 3520 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 3521 | 2203 |
| 3522 // frame type (path_close_frame) | 2204 // frame type (path_close_frame) |
| 3523 0x08, | 2205 0x08, |
| 3524 // path id | 2206 // path id |
| 3525 0x42, | 2207 0x42, |
| 3526 }; | 2208 }; |
| 3527 // clang-format on | 2209 // clang-format on |
| 3528 | 2210 |
| 3529 QuicEncryptedPacket encrypted( | 2211 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 3530 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 3531 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 3532 : arraysize(packet_34), | |
| 3533 false); | |
| 3534 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2212 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 3535 | 2213 |
| 3536 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2214 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 3537 ASSERT_TRUE(visitor_.header_.get()); | 2215 ASSERT_TRUE(visitor_.header_.get()); |
| 3538 // TODO(fayang): CheckDecryption after cl/110553865 is landed. | 2216 // TODO(fayang): CheckDecryption after cl/110553865 is landed. |
| 3539 EXPECT_EQ(kPathId, visitor_.path_close_frame_.path_id); | 2217 EXPECT_EQ(kPathId, visitor_.path_close_frame_.path_id); |
| 3540 | 2218 |
| 3541 // Now test framing boundaries. | 2219 // Now test framing boundaries. |
| 3542 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetPathCloseFrameSize(); | 2220 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetPathCloseFrameSize(); |
| 3543 ++i) { | 2221 ++i) { |
| 3544 string expected_error; | 2222 string expected_error; |
| 3545 if (i < kQuicFrameTypeSize + kQuicPathIdSize) { | 2223 if (i < kQuicFrameTypeSize + kQuicPathIdSize) { |
| 3546 expected_error = "Unable to read path_id."; | 2224 expected_error = "Unable to read path_id."; |
| 3547 } | 2225 } |
| 3548 CheckProcessingFails( | 2226 CheckProcessingFails( |
| 3549 framer_.version() <= QUIC_VERSION_33 ? packet : packet_34, | 2227 packet, |
| 3550 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 2228 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 3551 !kIncludeVersion, kIncludePathId, | 2229 !kIncludeVersion, kIncludePathId, |
| 3552 !kIncludeDiversificationNonce, | 2230 !kIncludeDiversificationNonce, |
| 3553 PACKET_6BYTE_PACKET_NUMBER), | 2231 PACKET_6BYTE_PACKET_NUMBER), |
| 3554 expected_error, QUIC_INVALID_PATH_CLOSE_DATA); | 2232 expected_error, QUIC_INVALID_PATH_CLOSE_DATA); |
| 3555 } | 2233 } |
| 3556 } | 2234 } |
| 3557 | 2235 |
| 3558 TEST_P(QuicFramerTest, PublicResetPacketV33) { | 2236 TEST_P(QuicFramerTest, PublicResetPacketV33) { |
| 3559 // clang-format off | 2237 // clang-format off |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3862 } | 2540 } |
| 3863 CheckProcessingFails(packet, i, expected_error, error_code); | 2541 CheckProcessingFails(packet, i, expected_error, error_code); |
| 3864 } | 2542 } |
| 3865 } | 2543 } |
| 3866 | 2544 |
| 3867 TEST_P(QuicFramerTest, BuildPaddingFramePacket) { | 2545 TEST_P(QuicFramerTest, BuildPaddingFramePacket) { |
| 3868 QuicPacketHeader header; | 2546 QuicPacketHeader header; |
| 3869 header.public_header.connection_id = kConnectionId; | 2547 header.public_header.connection_id = kConnectionId; |
| 3870 header.public_header.reset_flag = false; | 2548 header.public_header.reset_flag = false; |
| 3871 header.public_header.version_flag = false; | 2549 header.public_header.version_flag = false; |
| 3872 header.entropy_flag = false; | |
| 3873 header.packet_number = kPacketNumber; | 2550 header.packet_number = kPacketNumber; |
| 3874 | 2551 |
| 3875 QuicPaddingFrame padding_frame; | 2552 QuicPaddingFrame padding_frame; |
| 3876 | 2553 |
| 3877 QuicFrames frames; | 2554 QuicFrames frames; |
| 3878 frames.push_back(QuicFrame(padding_frame)); | 2555 frames.push_back(QuicFrame(padding_frame)); |
| 3879 | 2556 |
| 3880 // clang-format off | 2557 // clang-format off |
| 3881 unsigned char packet[kMaxPacketSize] = { | 2558 unsigned char packet[kMaxPacketSize] = { |
| 3882 // public flags (8 byte connection_id) | 2559 // public flags (8 byte connection_id) |
| 3883 static_cast<unsigned char>( | |
| 3884 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 3885 // connection_id | |
| 3886 0x10, 0x32, 0x54, 0x76, | |
| 3887 0x98, 0xBA, 0xDC, 0xFE, | |
| 3888 // packet number | |
| 3889 0xBC, 0x9A, 0x78, 0x56, | |
| 3890 0x34, 0x12, | |
| 3891 // private flags | |
| 3892 0x00, | |
| 3893 | |
| 3894 // frame type (padding frame) | |
| 3895 0x00, | |
| 3896 0x00, 0x00, 0x00, 0x00 | |
| 3897 }; | |
| 3898 unsigned char packet_34[kMaxPacketSize] = { | |
| 3899 // public flags (8 byte connection_id) | |
| 3900 0x38, | 2560 0x38, |
| 3901 // connection_id | 2561 // connection_id |
| 3902 0x10, 0x32, 0x54, 0x76, | 2562 0x10, 0x32, 0x54, 0x76, |
| 3903 0x98, 0xBA, 0xDC, 0xFE, | 2563 0x98, 0xBA, 0xDC, 0xFE, |
| 3904 // packet number | 2564 // packet number |
| 3905 0xBC, 0x9A, 0x78, 0x56, | 2565 0xBC, 0x9A, 0x78, 0x56, |
| 3906 0x34, 0x12, | 2566 0x34, 0x12, |
| 3907 | 2567 |
| 3908 // frame type (padding frame) | 2568 // frame type (padding frame) |
| 3909 0x00, | 2569 0x00, |
| 3910 0x00, 0x00, 0x00, 0x00 | 2570 0x00, 0x00, 0x00, 0x00 |
| 3911 }; | 2571 }; |
| 3912 // clang-format on | 2572 // clang-format on |
| 3913 | 2573 |
| 3914 uint64_t header_size = GetPacketHeaderSize( | 2574 uint64_t header_size = GetPacketHeaderSize( |
| 3915 framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2575 framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
| 3916 !kIncludePathId, !kIncludeDiversificationNonce, | 2576 !kIncludePathId, !kIncludeDiversificationNonce, |
| 3917 PACKET_6BYTE_PACKET_NUMBER); | 2577 PACKET_6BYTE_PACKET_NUMBER); |
| 3918 memset((framer_.version() <= QUIC_VERSION_33 ? packet : packet_34) + | 2578 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
| 3919 header_size + 1, | |
| 3920 0x00, kMaxPacketSize - header_size - 1); | |
| 3921 | 2579 |
| 3922 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 2580 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 3923 ASSERT_TRUE(data != nullptr); | 2581 ASSERT_TRUE(data != nullptr); |
| 3924 | 2582 |
| 3925 test::CompareCharArraysWithHexError( | 2583 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3926 "constructed packet", data->data(), data->length(), | 2584 data->length(), AsChars(packet), |
| 3927 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 2585 arraysize(packet)); |
| 3928 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 3929 : arraysize(packet_34)); | |
| 3930 } | 2586 } |
| 3931 | 2587 |
| 3932 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) { | 2588 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) { |
| 3933 QuicPacketHeader header; | 2589 QuicPacketHeader header; |
| 3934 header.public_header.connection_id = kConnectionId; | 2590 header.public_header.connection_id = kConnectionId; |
| 3935 header.public_header.reset_flag = false; | 2591 header.public_header.reset_flag = false; |
| 3936 header.public_header.version_flag = false; | 2592 header.public_header.version_flag = false; |
| 3937 header.entropy_flag = false; | |
| 3938 header.public_header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER; | 2593 header.public_header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER; |
| 3939 header.packet_number = kPacketNumber; | 2594 header.packet_number = kPacketNumber; |
| 3940 | 2595 |
| 3941 QuicPaddingFrame padding_frame; | 2596 QuicPaddingFrame padding_frame; |
| 3942 | 2597 |
| 3943 QuicFrames frames; | 2598 QuicFrames frames; |
| 3944 frames.push_back(QuicFrame(padding_frame)); | 2599 frames.push_back(QuicFrame(padding_frame)); |
| 3945 | 2600 |
| 3946 // clang-format off | 2601 // clang-format off |
| 3947 unsigned char packet[kMaxPacketSize] = { | 2602 unsigned char packet[kMaxPacketSize] = { |
| 3948 // public flags (8 byte connection_id and 4 byte packet number) | 2603 // public flags (8 byte connection_id and 4 byte packet number) |
| 3949 static_cast<unsigned char>( | |
| 3950 framer_.version() > QUIC_VERSION_32 ? 0x28 : 0x2C), | |
| 3951 // connection_id | |
| 3952 0x10, 0x32, 0x54, 0x76, | |
| 3953 0x98, 0xBA, 0xDC, 0xFE, | |
| 3954 // packet number | |
| 3955 0xBC, 0x9A, 0x78, 0x56, | |
| 3956 // private flags | |
| 3957 0x00, | |
| 3958 | |
| 3959 // frame type (padding frame) | |
| 3960 0x00, | |
| 3961 0x00, 0x00, 0x00, 0x00 | |
| 3962 }; | |
| 3963 unsigned char packet_34[kMaxPacketSize] = { | |
| 3964 // public flags (8 byte connection_id and 4 byte packet number) | |
| 3965 0x28, | 2604 0x28, |
| 3966 // connection_id | 2605 // connection_id |
| 3967 0x10, 0x32, 0x54, 0x76, | 2606 0x10, 0x32, 0x54, 0x76, |
| 3968 0x98, 0xBA, 0xDC, 0xFE, | 2607 0x98, 0xBA, 0xDC, 0xFE, |
| 3969 // packet number | 2608 // packet number |
| 3970 0xBC, 0x9A, 0x78, 0x56, | 2609 0xBC, 0x9A, 0x78, 0x56, |
| 3971 | 2610 |
| 3972 // frame type (padding frame) | 2611 // frame type (padding frame) |
| 3973 0x00, | 2612 0x00, |
| 3974 0x00, 0x00, 0x00, 0x00 | 2613 0x00, 0x00, 0x00, 0x00 |
| 3975 }; | 2614 }; |
| 3976 // clang-format on | 2615 // clang-format on |
| 3977 | 2616 |
| 3978 uint64_t header_size = GetPacketHeaderSize( | 2617 uint64_t header_size = GetPacketHeaderSize( |
| 3979 framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2618 framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
| 3980 !kIncludePathId, !kIncludeDiversificationNonce, | 2619 !kIncludePathId, !kIncludeDiversificationNonce, |
| 3981 PACKET_4BYTE_PACKET_NUMBER); | 2620 PACKET_4BYTE_PACKET_NUMBER); |
| 3982 memset((framer_.version() <= QUIC_VERSION_33 ? packet : packet_34) + | 2621 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
| 3983 header_size + 1, | |
| 3984 0x00, kMaxPacketSize - header_size - 1); | |
| 3985 | 2622 |
| 3986 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 2623 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 3987 ASSERT_TRUE(data != nullptr); | 2624 ASSERT_TRUE(data != nullptr); |
| 3988 | 2625 |
| 3989 test::CompareCharArraysWithHexError( | 2626 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 3990 "constructed packet", data->data(), data->length(), | 2627 data->length(), AsChars(packet), |
| 3991 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 2628 arraysize(packet)); |
| 3992 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 3993 : arraysize(packet_34)); | |
| 3994 } | 2629 } |
| 3995 | 2630 |
| 3996 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) { | 2631 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) { |
| 3997 QuicPacketHeader header; | 2632 QuicPacketHeader header; |
| 3998 header.public_header.connection_id = kConnectionId; | 2633 header.public_header.connection_id = kConnectionId; |
| 3999 header.public_header.reset_flag = false; | 2634 header.public_header.reset_flag = false; |
| 4000 header.public_header.version_flag = false; | 2635 header.public_header.version_flag = false; |
| 4001 header.entropy_flag = false; | |
| 4002 header.public_header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER; | 2636 header.public_header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER; |
| 4003 header.packet_number = kPacketNumber; | 2637 header.packet_number = kPacketNumber; |
| 4004 | 2638 |
| 4005 QuicPaddingFrame padding_frame; | 2639 QuicPaddingFrame padding_frame; |
| 4006 | 2640 |
| 4007 QuicFrames frames; | 2641 QuicFrames frames; |
| 4008 frames.push_back(QuicFrame(padding_frame)); | 2642 frames.push_back(QuicFrame(padding_frame)); |
| 4009 | 2643 |
| 4010 // clang-format off | 2644 // clang-format off |
| 4011 unsigned char packet[kMaxPacketSize] = { | 2645 unsigned char packet[kMaxPacketSize] = { |
| 4012 // public flags (8 byte connection_id and 2 byte packet number) | 2646 // public flags (8 byte connection_id and 2 byte packet number) |
| 4013 static_cast<unsigned char>( | |
| 4014 framer_.version() > QUIC_VERSION_32 ? 0x18 : 0x1C), | |
| 4015 // connection_id | |
| 4016 0x10, 0x32, 0x54, 0x76, | |
| 4017 0x98, 0xBA, 0xDC, 0xFE, | |
| 4018 // packet number | |
| 4019 0xBC, 0x9A, | |
| 4020 // private flags | |
| 4021 0x00, | |
| 4022 | |
| 4023 // frame type (padding frame) | |
| 4024 0x00, | |
| 4025 0x00, 0x00, 0x00, 0x00 | |
| 4026 }; | |
| 4027 unsigned char packet_34[kMaxPacketSize] = { | |
| 4028 // public flags (8 byte connection_id and 2 byte packet number) | |
| 4029 0x18, | 2647 0x18, |
| 4030 // connection_id | 2648 // connection_id |
| 4031 0x10, 0x32, 0x54, 0x76, | 2649 0x10, 0x32, 0x54, 0x76, |
| 4032 0x98, 0xBA, 0xDC, 0xFE, | 2650 0x98, 0xBA, 0xDC, 0xFE, |
| 4033 // packet number | 2651 // packet number |
| 4034 0xBC, 0x9A, | 2652 0xBC, 0x9A, |
| 4035 | 2653 |
| 4036 // frame type (padding frame) | 2654 // frame type (padding frame) |
| 4037 0x00, | 2655 0x00, |
| 4038 0x00, 0x00, 0x00, 0x00 | 2656 0x00, 0x00, 0x00, 0x00 |
| 4039 }; | 2657 }; |
| 4040 // clang-format on | 2658 // clang-format on |
| 4041 | 2659 |
| 4042 uint64_t header_size = GetPacketHeaderSize( | 2660 uint64_t header_size = GetPacketHeaderSize( |
| 4043 framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2661 framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
| 4044 !kIncludePathId, !kIncludeDiversificationNonce, | 2662 !kIncludePathId, !kIncludeDiversificationNonce, |
| 4045 PACKET_2BYTE_PACKET_NUMBER); | 2663 PACKET_2BYTE_PACKET_NUMBER); |
| 4046 memset((framer_.version() <= QUIC_VERSION_33 ? packet : packet_34) + | 2664 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
| 4047 header_size + 1, | |
| 4048 0x00, kMaxPacketSize - header_size - 1); | |
| 4049 | 2665 |
| 4050 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 2666 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 4051 ASSERT_TRUE(data != nullptr); | 2667 ASSERT_TRUE(data != nullptr); |
| 4052 | 2668 |
| 4053 test::CompareCharArraysWithHexError( | 2669 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 4054 "constructed packet", data->data(), data->length(), | 2670 data->length(), AsChars(packet), |
| 4055 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 2671 arraysize(packet)); |
| 4056 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 4057 : arraysize(packet_34)); | |
| 4058 } | 2672 } |
| 4059 | 2673 |
| 4060 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) { | 2674 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) { |
| 4061 QuicPacketHeader header; | 2675 QuicPacketHeader header; |
| 4062 header.public_header.connection_id = kConnectionId; | 2676 header.public_header.connection_id = kConnectionId; |
| 4063 header.public_header.reset_flag = false; | 2677 header.public_header.reset_flag = false; |
| 4064 header.public_header.version_flag = false; | 2678 header.public_header.version_flag = false; |
| 4065 header.entropy_flag = false; | |
| 4066 header.public_header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER; | 2679 header.public_header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER; |
| 4067 header.packet_number = kPacketNumber; | 2680 header.packet_number = kPacketNumber; |
| 4068 | 2681 |
| 4069 QuicPaddingFrame padding_frame; | 2682 QuicPaddingFrame padding_frame; |
| 4070 | 2683 |
| 4071 QuicFrames frames; | 2684 QuicFrames frames; |
| 4072 frames.push_back(QuicFrame(padding_frame)); | 2685 frames.push_back(QuicFrame(padding_frame)); |
| 4073 | 2686 |
| 4074 // clang-format off | 2687 // clang-format off |
| 4075 unsigned char packet[kMaxPacketSize] = { | 2688 unsigned char packet[kMaxPacketSize] = { |
| 4076 // public flags (8 byte connection_id and 1 byte packet number) | 2689 // public flags (8 byte connection_id and 1 byte packet number) |
| 4077 static_cast<unsigned char>( | |
| 4078 framer_.version() > QUIC_VERSION_32 ? 0x08 : 0x0C), | |
| 4079 // connection_id | |
| 4080 0x10, 0x32, 0x54, 0x76, | |
| 4081 0x98, 0xBA, 0xDC, 0xFE, | |
| 4082 // packet number | |
| 4083 0xBC, | |
| 4084 // private flags | |
| 4085 0x00, | |
| 4086 | |
| 4087 // frame type (padding frame) | |
| 4088 0x00, | |
| 4089 0x00, 0x00, 0x00, 0x00 | |
| 4090 }; | |
| 4091 unsigned char packet_34[kMaxPacketSize] = { | |
| 4092 // public flags (8 byte connection_id and 1 byte packet number) | |
| 4093 0x08, | 2690 0x08, |
| 4094 // connection_id | 2691 // connection_id |
| 4095 0x10, 0x32, 0x54, 0x76, | 2692 0x10, 0x32, 0x54, 0x76, |
| 4096 0x98, 0xBA, 0xDC, 0xFE, | 2693 0x98, 0xBA, 0xDC, 0xFE, |
| 4097 // packet number | 2694 // packet number |
| 4098 0xBC, | 2695 0xBC, |
| 4099 | 2696 |
| 4100 // frame type (padding frame) | 2697 // frame type (padding frame) |
| 4101 0x00, | 2698 0x00, |
| 4102 0x00, 0x00, 0x00, 0x00 | 2699 0x00, 0x00, 0x00, 0x00 |
| 4103 }; | 2700 }; |
| 4104 // clang-format on | 2701 // clang-format on |
| 4105 | 2702 |
| 4106 uint64_t header_size = GetPacketHeaderSize( | 2703 uint64_t header_size = GetPacketHeaderSize( |
| 4107 framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2704 framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, |
| 4108 !kIncludePathId, !kIncludeDiversificationNonce, | 2705 !kIncludePathId, !kIncludeDiversificationNonce, |
| 4109 PACKET_1BYTE_PACKET_NUMBER); | 2706 PACKET_1BYTE_PACKET_NUMBER); |
| 4110 memset((framer_.version() <= QUIC_VERSION_33 ? packet : packet_34) + | 2707 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
| 4111 header_size + 1, | |
| 4112 0x00, kMaxPacketSize - header_size - 1); | |
| 4113 | 2708 |
| 4114 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 2709 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 4115 ASSERT_TRUE(data != nullptr); | 2710 ASSERT_TRUE(data != nullptr); |
| 4116 | 2711 |
| 4117 test::CompareCharArraysWithHexError( | 2712 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 4118 "constructed packet", data->data(), data->length(), | 2713 data->length(), AsChars(packet), |
| 4119 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 2714 arraysize(packet)); |
| 4120 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 4121 : arraysize(packet_34)); | |
| 4122 } | 2715 } |
| 4123 | 2716 |
| 4124 TEST_P(QuicFramerTest, BuildStreamFramePacket) { | 2717 TEST_P(QuicFramerTest, BuildStreamFramePacket) { |
| 4125 QuicPacketHeader header; | 2718 QuicPacketHeader header; |
| 4126 header.public_header.connection_id = kConnectionId; | 2719 header.public_header.connection_id = kConnectionId; |
| 4127 header.public_header.reset_flag = false; | 2720 header.public_header.reset_flag = false; |
| 4128 header.public_header.version_flag = false; | 2721 header.public_header.version_flag = false; |
| 4129 header.entropy_flag = true; | |
| 4130 header.packet_number = kPacketNumber; | 2722 header.packet_number = kPacketNumber; |
| 4131 | 2723 |
| 4132 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, | 2724 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, |
| 4133 StringPiece("hello world!")); | 2725 StringPiece("hello world!")); |
| 4134 | 2726 |
| 4135 QuicFrames frames; | 2727 QuicFrames frames; |
| 4136 frames.push_back(QuicFrame(&stream_frame)); | 2728 frames.push_back(QuicFrame(&stream_frame)); |
| 4137 | 2729 |
| 4138 // clang-format off | 2730 // clang-format off |
| 4139 unsigned char packet[] = { | 2731 unsigned char packet[] = { |
| 4140 // public flags (8 byte connection_id) | 2732 // public flags (8 byte connection_id) |
| 4141 static_cast<unsigned char>( | |
| 4142 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 4143 // connection_id | |
| 4144 0x10, 0x32, 0x54, 0x76, | |
| 4145 0x98, 0xBA, 0xDC, 0xFE, | |
| 4146 // packet number | |
| 4147 0xBC, 0x9A, 0x78, 0x56, | |
| 4148 0x34, 0x12, | |
| 4149 // private flags (entropy) | |
| 4150 0x01, | |
| 4151 | |
| 4152 // frame type (stream frame with fin and no length) | |
| 4153 0xDF, | |
| 4154 // stream id | |
| 4155 0x04, 0x03, 0x02, 0x01, | |
| 4156 // offset | |
| 4157 0x54, 0x76, 0x10, 0x32, | |
| 4158 0xDC, 0xFE, 0x98, 0xBA, | |
| 4159 // data | |
| 4160 'h', 'e', 'l', 'l', | |
| 4161 'o', ' ', 'w', 'o', | |
| 4162 'r', 'l', 'd', '!', | |
| 4163 }; | |
| 4164 unsigned char packet_34[] = { | |
| 4165 // public flags (8 byte connection_id) | |
| 4166 0x38, | 2733 0x38, |
| 4167 // connection_id | 2734 // connection_id |
| 4168 0x10, 0x32, 0x54, 0x76, | 2735 0x10, 0x32, 0x54, 0x76, |
| 4169 0x98, 0xBA, 0xDC, 0xFE, | 2736 0x98, 0xBA, 0xDC, 0xFE, |
| 4170 // packet number | 2737 // packet number |
| 4171 0xBC, 0x9A, 0x78, 0x56, | 2738 0xBC, 0x9A, 0x78, 0x56, |
| 4172 0x34, 0x12, | 2739 0x34, 0x12, |
| 4173 | 2740 |
| 4174 // frame type (stream frame with fin and no length) | 2741 // frame type (stream frame with fin and no length) |
| 4175 0xDF, | 2742 0xDF, |
| 4176 // stream id | 2743 // stream id |
| 4177 0x04, 0x03, 0x02, 0x01, | 2744 0x04, 0x03, 0x02, 0x01, |
| 4178 // offset | 2745 // offset |
| 4179 0x54, 0x76, 0x10, 0x32, | 2746 0x54, 0x76, 0x10, 0x32, |
| 4180 0xDC, 0xFE, 0x98, 0xBA, | 2747 0xDC, 0xFE, 0x98, 0xBA, |
| 4181 // data | 2748 // data |
| 4182 'h', 'e', 'l', 'l', | 2749 'h', 'e', 'l', 'l', |
| 4183 'o', ' ', 'w', 'o', | 2750 'o', ' ', 'w', 'o', |
| 4184 'r', 'l', 'd', '!', | 2751 'r', 'l', 'd', '!', |
| 4185 }; | 2752 }; |
| 4186 // clang-format on | 2753 // clang-format on |
| 4187 | 2754 |
| 4188 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 2755 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 4189 ASSERT_TRUE(data != nullptr); | 2756 ASSERT_TRUE(data != nullptr); |
| 4190 | 2757 |
| 4191 test::CompareCharArraysWithHexError( | 2758 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 4192 "constructed packet", data->data(), data->length(), | 2759 data->length(), AsChars(packet), |
| 4193 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 2760 arraysize(packet)); |
| 4194 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 4195 : arraysize(packet_34)); | |
| 4196 } | 2761 } |
| 4197 | 2762 |
| 4198 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) { | 2763 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) { |
| 4199 QuicPacketHeader header; | 2764 QuicPacketHeader header; |
| 4200 header.public_header.connection_id = kConnectionId; | 2765 header.public_header.connection_id = kConnectionId; |
| 4201 header.public_header.reset_flag = false; | 2766 header.public_header.reset_flag = false; |
| 4202 header.public_header.version_flag = true; | 2767 header.public_header.version_flag = true; |
| 4203 header.entropy_flag = true; | |
| 4204 header.packet_number = kPacketNumber; | 2768 header.packet_number = kPacketNumber; |
| 4205 | 2769 |
| 4206 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, | 2770 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, |
| 4207 StringPiece("hello world!")); | 2771 StringPiece("hello world!")); |
| 4208 | 2772 |
| 4209 QuicFrames frames; | 2773 QuicFrames frames; |
| 4210 frames.push_back(QuicFrame(&stream_frame)); | 2774 frames.push_back(QuicFrame(&stream_frame)); |
| 4211 | 2775 |
| 4212 // clang-format off | 2776 // clang-format off |
| 4213 unsigned char packet[] = { | 2777 unsigned char packet[] = { |
| 4214 // public flags (version, 8 byte connection_id) | 2778 // public flags (version, 8 byte connection_id) |
| 4215 static_cast<unsigned char>( | 2779 static_cast<unsigned char>( |
| 4216 (FLAGS_quic_remove_v33_hacks2 && | |
| 4217 framer_.version() > QUIC_VERSION_32) ? 0x39 : 0x3D), | |
| 4218 // connection_id | |
| 4219 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 4220 // version tag | |
| 4221 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | |
| 4222 // packet number | |
| 4223 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 4224 // private flags (entropy) | |
| 4225 0x01, | |
| 4226 | |
| 4227 // frame type (stream frame with fin and no length) | |
| 4228 0xDF, | |
| 4229 // stream id | |
| 4230 0x04, 0x03, 0x02, 0x01, | |
| 4231 // offset | |
| 4232 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, | |
| 4233 // data | |
| 4234 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', | |
| 4235 }; | |
| 4236 unsigned char packet_34[] = { | |
| 4237 // public flags (version, 8 byte connection_id) | |
| 4238 static_cast<unsigned char>( | |
| 4239 FLAGS_quic_remove_v33_hacks2 ? 0x39 : 0x3D), | 2780 FLAGS_quic_remove_v33_hacks2 ? 0x39 : 0x3D), |
| 4240 // connection_id | 2781 // connection_id |
| 4241 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 2782 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 4242 // version tag | 2783 // version tag |
| 4243 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | 2784 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
| 4244 // packet number | 2785 // packet number |
| 4245 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 2786 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 4246 | 2787 |
| 4247 // frame type (stream frame with fin and no length) | 2788 // frame type (stream frame with fin and no length) |
| 4248 0xDF, | 2789 0xDF, |
| 4249 // stream id | 2790 // stream id |
| 4250 0x04, 0x03, 0x02, 0x01, | 2791 0x04, 0x03, 0x02, 0x01, |
| 4251 // offset | 2792 // offset |
| 4252 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, | 2793 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
| 4253 // data | 2794 // data |
| 4254 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', | 2795 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', |
| 4255 }; | 2796 }; |
| 4256 // clang-format on | 2797 // clang-format on |
| 4257 | 2798 |
| 4258 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); | 2799 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); |
| 4259 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 2800 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 4260 ASSERT_TRUE(data != nullptr); | 2801 ASSERT_TRUE(data != nullptr); |
| 4261 | 2802 |
| 4262 test::CompareCharArraysWithHexError( | 2803 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 4263 "constructed packet", data->data(), data->length(), | 2804 data->length(), AsChars(packet), |
| 4264 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 2805 arraysize(packet)); |
| 4265 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 4266 : arraysize(packet_34)); | |
| 4267 } | 2806 } |
| 4268 | 2807 |
| 4269 TEST_P(QuicFramerTest, BuildStreamFramePacketWithMultipathFlag) { | 2808 TEST_P(QuicFramerTest, BuildStreamFramePacketWithMultipathFlag) { |
| 4270 QuicPacketHeader header; | 2809 QuicPacketHeader header; |
| 4271 header.public_header.connection_id = kConnectionId; | 2810 header.public_header.connection_id = kConnectionId; |
| 4272 header.public_header.multipath_flag = true; | 2811 header.public_header.multipath_flag = true; |
| 4273 header.public_header.reset_flag = false; | 2812 header.public_header.reset_flag = false; |
| 4274 header.public_header.version_flag = false; | 2813 header.public_header.version_flag = false; |
| 4275 header.entropy_flag = true; | |
| 4276 header.path_id = kPathId; | 2814 header.path_id = kPathId; |
| 4277 header.packet_number = kPacketNumber; | 2815 header.packet_number = kPacketNumber; |
| 4278 | 2816 |
| 4279 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, | 2817 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, |
| 4280 StringPiece("hello world!")); | 2818 StringPiece("hello world!")); |
| 4281 | 2819 |
| 4282 QuicFrames frames; | 2820 QuicFrames frames; |
| 4283 frames.push_back(QuicFrame(&stream_frame)); | 2821 frames.push_back(QuicFrame(&stream_frame)); |
| 4284 | 2822 |
| 4285 // clang-format off | 2823 // clang-format off |
| 4286 unsigned char packet[] = { | 2824 unsigned char packet[] = { |
| 4287 // public flags (8 byte connection_id) | 2825 // public flags (8 byte connection_id) |
| 4288 static_cast<unsigned char>( | |
| 4289 framer_.version() > QUIC_VERSION_32 ? 0x78 : 0x7C), | |
| 4290 // connection_id | |
| 4291 0x10, 0x32, 0x54, 0x76, | |
| 4292 0x98, 0xBA, 0xDC, 0xFE, | |
| 4293 // path_id | |
| 4294 0x42, | |
| 4295 // packet number | |
| 4296 0xBC, 0x9A, 0x78, 0x56, | |
| 4297 0x34, 0x12, | |
| 4298 // private flags (entropy) | |
| 4299 0x01, | |
| 4300 | |
| 4301 // frame type (stream frame with fin and no length) | |
| 4302 0xDF, | |
| 4303 // stream id | |
| 4304 0x04, 0x03, 0x02, 0x01, | |
| 4305 // offset | |
| 4306 0x54, 0x76, 0x10, 0x32, | |
| 4307 0xDC, 0xFE, 0x98, 0xBA, | |
| 4308 // data | |
| 4309 'h', 'e', 'l', 'l', | |
| 4310 'o', ' ', 'w', 'o', | |
| 4311 'r', 'l', 'd', '!', | |
| 4312 }; | |
| 4313 unsigned char packet_34[] = { | |
| 4314 // public flags (8 byte connection_id) | |
| 4315 0x78, | 2826 0x78, |
| 4316 // connection_id | 2827 // connection_id |
| 4317 0x10, 0x32, 0x54, 0x76, | 2828 0x10, 0x32, 0x54, 0x76, |
| 4318 0x98, 0xBA, 0xDC, 0xFE, | 2829 0x98, 0xBA, 0xDC, 0xFE, |
| 4319 // path_id | 2830 // path_id |
| 4320 0x42, | 2831 0x42, |
| 4321 // packet number | 2832 // packet number |
| 4322 0xBC, 0x9A, 0x78, 0x56, | 2833 0xBC, 0x9A, 0x78, 0x56, |
| 4323 0x34, 0x12, | 2834 0x34, 0x12, |
| 4324 | 2835 |
| 4325 // frame type (stream frame with fin and no length) | 2836 // frame type (stream frame with fin and no length) |
| 4326 0xDF, | 2837 0xDF, |
| 4327 // stream id | 2838 // stream id |
| 4328 0x04, 0x03, 0x02, 0x01, | 2839 0x04, 0x03, 0x02, 0x01, |
| 4329 // offset | 2840 // offset |
| 4330 0x54, 0x76, 0x10, 0x32, | 2841 0x54, 0x76, 0x10, 0x32, |
| 4331 0xDC, 0xFE, 0x98, 0xBA, | 2842 0xDC, 0xFE, 0x98, 0xBA, |
| 4332 // data | 2843 // data |
| 4333 'h', 'e', 'l', 'l', | 2844 'h', 'e', 'l', 'l', |
| 4334 'o', ' ', 'w', 'o', | 2845 'o', ' ', 'w', 'o', |
| 4335 'r', 'l', 'd', '!', | 2846 'r', 'l', 'd', '!', |
| 4336 }; | 2847 }; |
| 4337 // clang-format on | 2848 // clang-format on |
| 4338 | 2849 |
| 4339 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | |
| 4340 ASSERT_TRUE(data != nullptr); | |
| 4341 | |
| 4342 test::CompareCharArraysWithHexError( | |
| 4343 "constructed packet", data->data(), data->length(), | |
| 4344 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 4345 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 4346 : arraysize(packet_34)); | |
| 4347 } | |
| 4348 | |
| 4349 TEST_P(QuicFramerTest, BuildStreamFramePacketWithBothVersionAndMultipathFlag) { | |
| 4350 QuicPacketHeader header; | |
| 4351 header.public_header.connection_id = kConnectionId; | |
| 4352 header.public_header.multipath_flag = true; | |
| 4353 header.public_header.reset_flag = false; | |
| 4354 header.public_header.version_flag = true; | |
| 4355 header.entropy_flag = true; | |
| 4356 header.path_id = kPathId; | |
| 4357 header.packet_number = kPacketNumber; | |
| 4358 | |
| 4359 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, | |
| 4360 StringPiece("hello world!")); | |
| 4361 | |
| 4362 QuicFrames frames; | |
| 4363 frames.push_back(QuicFrame(&stream_frame)); | |
| 4364 | |
| 4365 // clang-format off | |
| 4366 unsigned char packet[] = { | |
| 4367 // public flags (8 byte connection_id) | |
| 4368 static_cast<unsigned char>( | |
| 4369 (FLAGS_quic_remove_v33_hacks2 && | |
| 4370 framer_.version() > QUIC_VERSION_32) ? 0x79 : 0x7D), | |
| 4371 // connection_id | |
| 4372 0x10, 0x32, 0x54, 0x76, | |
| 4373 0x98, 0xBA, 0xDC, 0xFE, | |
| 4374 // version tag | |
| 4375 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | |
| 4376 // path_id | |
| 4377 0x42, | |
| 4378 // packet number | |
| 4379 0xBC, 0x9A, 0x78, 0x56, | |
| 4380 0x34, 0x12, | |
| 4381 // private flags (entropy) | |
| 4382 0x01, | |
| 4383 | |
| 4384 // frame type (stream frame with fin and no length) | |
| 4385 0xDF, | |
| 4386 // stream id | |
| 4387 0x04, 0x03, 0x02, 0x01, | |
| 4388 // offset | |
| 4389 0x54, 0x76, 0x10, 0x32, | |
| 4390 0xDC, 0xFE, 0x98, 0xBA, | |
| 4391 // data | |
| 4392 'h', 'e', 'l', 'l', | |
| 4393 'o', ' ', 'w', 'o', | |
| 4394 'r', 'l', 'd', '!', | |
| 4395 }; | |
| 4396 unsigned char packet_34[] = { | |
| 4397 // public flags (8 byte connection_id) | |
| 4398 static_cast<unsigned char>( | |
| 4399 FLAGS_quic_remove_v33_hacks2 ? 0x79 : 0x7D), | |
| 4400 // connection_id | |
| 4401 0x10, 0x32, 0x54, 0x76, | |
| 4402 0x98, 0xBA, 0xDC, 0xFE, | |
| 4403 // version tag | |
| 4404 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | |
| 4405 // path_id | |
| 4406 0x42, | |
| 4407 // packet number | |
| 4408 0xBC, 0x9A, 0x78, 0x56, | |
| 4409 0x34, 0x12, | |
| 4410 | |
| 4411 // frame type (stream frame with fin and no length) | |
| 4412 0xDF, | |
| 4413 // stream id | |
| 4414 0x04, 0x03, 0x02, 0x01, | |
| 4415 // offset | |
| 4416 0x54, 0x76, 0x10, 0x32, | |
| 4417 0xDC, 0xFE, 0x98, 0xBA, | |
| 4418 // data | |
| 4419 'h', 'e', 'l', 'l', | |
| 4420 'o', ' ', 'w', 'o', | |
| 4421 'r', 'l', 'd', '!', | |
| 4422 }; | |
| 4423 // clang-format on | |
| 4424 | |
| 4425 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); | |
| 4426 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | |
| 4427 ASSERT_TRUE(data != nullptr); | |
| 4428 | |
| 4429 test::CompareCharArraysWithHexError( | |
| 4430 "constructed packet", data->data(), data->length(), | |
| 4431 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 4432 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 4433 : arraysize(packet_34)); | |
| 4434 } | |
| 4435 | |
| 4436 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) { | |
| 4437 // clang-format off | |
| 4438 unsigned char packet[] = { | |
| 4439 // public flags (version, 8 byte connection_id) | |
| 4440 0x0D, | |
| 4441 // connection_id | |
| 4442 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 4443 // version tag | |
| 4444 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | |
| 4445 }; | |
| 4446 // clang-format on | |
| 4447 | |
| 4448 QuicConnectionId connection_id = kConnectionId; | |
| 4449 std::unique_ptr<QuicEncryptedPacket> data( | |
| 4450 framer_.BuildVersionNegotiationPacket(connection_id, | |
| 4451 SupportedVersions(GetParam()))); | |
| 4452 test::CompareCharArraysWithHexError("constructed packet", data->data(), | |
| 4453 data->length(), AsChars(packet), | |
| 4454 arraysize(packet)); | |
| 4455 } | |
| 4456 | |
| 4457 TEST_P(QuicFramerTest, BuildAckFramePacket) { | |
| 4458 if (framer_.version() > QUIC_VERSION_33) { | |
| 4459 return; | |
| 4460 } | |
| 4461 | |
| 4462 QuicPacketHeader header; | |
| 4463 header.public_header.connection_id = kConnectionId; | |
| 4464 header.public_header.reset_flag = false; | |
| 4465 header.public_header.version_flag = false; | |
| 4466 header.entropy_flag = true; | |
| 4467 header.packet_number = kPacketNumber; | |
| 4468 | |
| 4469 QuicAckFrame ack_frame; | |
| 4470 ack_frame.entropy_hash = 0x43; | |
| 4471 ack_frame.largest_observed = kLargestObserved; | |
| 4472 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); | |
| 4473 ack_frame.packets.Add(kMissingPacket); | |
| 4474 | |
| 4475 QuicFrames frames; | |
| 4476 frames.push_back(QuicFrame(&ack_frame)); | |
| 4477 | |
| 4478 // clang-format off | |
| 4479 unsigned char packet[] = { | |
| 4480 // public flags (8 byte connection_id) | |
| 4481 static_cast<unsigned char>( | |
| 4482 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 4483 // connection_id | |
| 4484 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 4485 // packet number | |
| 4486 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 4487 // private flags (entropy) | |
| 4488 0x01, | |
| 4489 | |
| 4490 // frame type (ack frame) | |
| 4491 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
| 4492 0x6C, | |
| 4493 // entropy hash of all received packets. | |
| 4494 0x43, | |
| 4495 // largest observed packet number | |
| 4496 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 4497 // Zero delta time. | |
| 4498 0x00, 0x00, | |
| 4499 // num received packets. | |
| 4500 0x00, | |
| 4501 // num missing packet ranges | |
| 4502 0x01, | |
| 4503 // missing packet delta | |
| 4504 0x01, | |
| 4505 // 0 more missing packets in range. | |
| 4506 0x00, | |
| 4507 }; | |
| 4508 // clang-format on | |
| 4509 | |
| 4510 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 2850 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 4511 ASSERT_TRUE(data != nullptr); | 2851 ASSERT_TRUE(data != nullptr); |
| 4512 | 2852 |
| 4513 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 2853 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 4514 data->length(), AsChars(packet), | 2854 data->length(), AsChars(packet), |
| 4515 arraysize(packet)); | 2855 arraysize(packet)); |
| 4516 } | 2856 } |
| 4517 | 2857 |
| 4518 // TODO(jri): Add test for tuncated packets in which the original ack frame had | 2858 TEST_P(QuicFramerTest, BuildStreamFramePacketWithBothVersionAndMultipathFlag) { |
| 4519 // revived packets. (In both the large and small packet cases below). | |
| 4520 | |
| 4521 TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacket) { | |
| 4522 if (framer_.version() > QUIC_VERSION_33) { | |
| 4523 return; | |
| 4524 } | |
| 4525 | |
| 4526 QuicPacketHeader header; | 2859 QuicPacketHeader header; |
| 4527 header.public_header.connection_id = kConnectionId; | 2860 header.public_header.connection_id = kConnectionId; |
| 2861 header.public_header.multipath_flag = true; |
| 4528 header.public_header.reset_flag = false; | 2862 header.public_header.reset_flag = false; |
| 4529 header.public_header.version_flag = false; | 2863 header.public_header.version_flag = true; |
| 4530 header.entropy_flag = true; | 2864 header.path_id = kPathId; |
| 4531 header.packet_number = kPacketNumber; | 2865 header.packet_number = kPacketNumber; |
| 4532 | 2866 |
| 4533 QuicAckFrame ack_frame; | 2867 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, |
| 4534 // This entropy hash is different from what shows up in the packet below, | 2868 StringPiece("hello world!")); |
| 4535 // since entropy is recomputed by the framer on ack truncation (by | |
| 4536 // TestEntropyCalculator for this test.) | |
| 4537 ack_frame.entropy_hash = 0x43; | |
| 4538 ack_frame.largest_observed = 2 * 300; | |
| 4539 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); | |
| 4540 for (size_t i = 1; i < 2 * 300; i += 2) { | |
| 4541 ack_frame.packets.Add(i); | |
| 4542 } | |
| 4543 | 2869 |
| 4544 QuicFrames frames; | 2870 QuicFrames frames; |
| 4545 frames.push_back(QuicFrame(&ack_frame)); | 2871 frames.push_back(QuicFrame(&stream_frame)); |
| 4546 | 2872 |
| 4547 // clang-format off | 2873 // clang-format off |
| 4548 unsigned char packet[] = { | 2874 unsigned char packet[] = { |
| 4549 // public flags (8 byte connection_id) | 2875 // public flags (8 byte connection_id) |
| 4550 static_cast<unsigned char>( | 2876 static_cast<unsigned char>( |
| 4551 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | 2877 FLAGS_quic_remove_v33_hacks2 ? 0x79 : 0x7D), |
| 4552 // connection_id | 2878 // connection_id |
| 4553 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 2879 0x10, 0x32, 0x54, 0x76, |
| 4554 // packet number | 2880 0x98, 0xBA, 0xDC, 0xFE, |
| 4555 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 2881 // version tag |
| 4556 // private flags (entropy) | 2882 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
| 4557 0x01, | 2883 // path_id |
| 2884 0x42, |
| 2885 // packet number |
| 2886 0xBC, 0x9A, 0x78, 0x56, |
| 2887 0x34, 0x12, |
| 4558 | 2888 |
| 4559 // frame type (ack frame) | 2889 // frame type (stream frame with fin and no length) |
| 4560 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) | 2890 0xDF, |
| 4561 0x74, | 2891 // stream id |
| 4562 // entropy hash of all received packets, set to 1 by TestEntropyCalculator | 2892 0x04, 0x03, 0x02, 0x01, |
| 4563 // since ack is truncated. | 2893 // offset |
| 4564 0x01, | 2894 0x54, 0x76, 0x10, 0x32, |
| 4565 // 2-byte largest observed packet number. | 2895 0xDC, 0xFE, 0x98, 0xBA, |
| 4566 // Expected to be 510 (0x1FE), since only 255 nack ranges can fit. | 2896 // data |
| 4567 0xFE, 0x01, | 2897 'h', 'e', 'l', 'l', |
| 4568 // Zero delta time. | 2898 'o', ' ', 'w', 'o', |
| 4569 0x00, 0x00, | 2899 'r', 'l', 'd', '!', |
| 4570 // num missing packet ranges (limited to 255 by size of this field). | |
| 4571 0xFF, | |
| 4572 // {missing packet delta, further missing packets in range} | |
| 4573 // 6 nack ranges x 42 + 3 nack ranges | |
| 4574 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4575 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4576 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4577 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4578 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4579 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4580 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4581 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4582 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4583 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4584 | |
| 4585 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4586 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4587 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4588 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4589 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4590 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4591 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4592 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4593 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4594 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4595 | |
| 4596 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4597 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4598 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4599 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4600 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4601 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4602 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4603 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4604 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4605 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4606 | |
| 4607 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4608 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4609 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4610 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4611 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4612 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4613 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4614 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4615 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4616 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4617 | |
| 4618 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4619 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4620 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4621 }; | 2900 }; |
| 4622 // clang-format on | 2901 // clang-format on |
| 4623 | 2902 |
| 2903 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); |
| 4624 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 2904 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 4625 ASSERT_TRUE(data != nullptr); | 2905 ASSERT_TRUE(data != nullptr); |
| 4626 | 2906 |
| 4627 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 2907 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 4628 data->length(), AsChars(packet), | 2908 data->length(), AsChars(packet), |
| 4629 arraysize(packet)); | 2909 arraysize(packet)); |
| 4630 } | 2910 } |
| 4631 | 2911 |
| 4632 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { | 2912 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) { |
| 4633 if (framer_.version() > QUIC_VERSION_33) { | |
| 4634 return; | |
| 4635 } | |
| 4636 | |
| 4637 QuicPacketHeader header; | |
| 4638 header.public_header.connection_id = kConnectionId; | |
| 4639 header.public_header.reset_flag = false; | |
| 4640 header.public_header.version_flag = false; | |
| 4641 header.entropy_flag = true; | |
| 4642 header.packet_number = kPacketNumber; | |
| 4643 | |
| 4644 QuicAckFrame ack_frame; | |
| 4645 // This entropy hash is different from what shows up in the packet below, | |
| 4646 // since entropy is recomputed by the framer on ack truncation (by | |
| 4647 // TestEntropyCalculator for this test.) | |
| 4648 ack_frame.entropy_hash = 0x43; | |
| 4649 ack_frame.largest_observed = 2 * 300; | |
| 4650 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); | |
| 4651 for (size_t i = 1; i < 2 * 300; i += 2) { | |
| 4652 ack_frame.packets.Add(i); | |
| 4653 } | |
| 4654 | |
| 4655 QuicFrames frames; | |
| 4656 frames.push_back(QuicFrame(&ack_frame)); | |
| 4657 | |
| 4658 // clang-format off | 2913 // clang-format off |
| 4659 unsigned char packet[] = { | 2914 unsigned char packet[] = { |
| 4660 // public flags (8 byte connection_id) | 2915 // public flags (version, 8 byte connection_id) |
| 4661 static_cast<unsigned char>( | 2916 0x0D, |
| 4662 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 4663 // connection_id | 2917 // connection_id |
| 4664 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 2918 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 4665 // packet number | 2919 // version tag |
| 4666 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 2920 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
| 4667 // private flags (entropy) | |
| 4668 0x01, | |
| 4669 | |
| 4670 // frame type (ack frame) | |
| 4671 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) | |
| 4672 0x74, | |
| 4673 // entropy hash of all received packets, set to 1 by TestEntropyCalculator | |
| 4674 // since ack is truncated. | |
| 4675 0x01, | |
| 4676 // 2-byte largest observed packet number. | |
| 4677 // Expected to be 12 (0x0C), since only 6 nack ranges can fit. | |
| 4678 0x0C, 0x00, | |
| 4679 // Zero delta time. | |
| 4680 0x00, 0x00, | |
| 4681 // num missing packet ranges (limited to 6 by packet size of 37). | |
| 4682 0x06, | |
| 4683 // {missing packet delta, further missing packets in range} | |
| 4684 // 6 nack ranges | |
| 4685 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
| 4686 }; | 2921 }; |
| 4687 // clang-format on | 2922 // clang-format on |
| 4688 | 2923 |
| 4689 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames, 36u)); | 2924 QuicConnectionId connection_id = kConnectionId; |
| 4690 ASSERT_TRUE(data != nullptr); | 2925 std::unique_ptr<QuicEncryptedPacket> data( |
| 4691 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. | 2926 framer_.BuildVersionNegotiationPacket(connection_id, |
| 4692 EXPECT_EQ(35u, data->length()); | 2927 SupportedVersions(GetParam()))); |
| 4693 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 2928 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 4694 data->length(), AsChars(packet), | 2929 data->length(), AsChars(packet), |
| 4695 arraysize(packet)); | 2930 arraysize(packet)); |
| 4696 } | 2931 } |
| 4697 | 2932 |
| 4698 TEST_P(QuicFramerTest, BuildNewAckFramePacketOneAckBlock) { | 2933 TEST_P(QuicFramerTest, BuildNewAckFramePacketOneAckBlock) { |
| 4699 if (framer_.version() <= QUIC_VERSION_33) { | |
| 4700 return; | |
| 4701 } | |
| 4702 | |
| 4703 QuicPacketHeader header; | 2934 QuicPacketHeader header; |
| 4704 header.public_header.connection_id = kConnectionId; | 2935 header.public_header.connection_id = kConnectionId; |
| 4705 header.public_header.reset_flag = false; | 2936 header.public_header.reset_flag = false; |
| 4706 header.public_header.version_flag = false; | 2937 header.public_header.version_flag = false; |
| 4707 header.packet_number = kPacketNumber; | 2938 header.packet_number = kPacketNumber; |
| 4708 | 2939 |
| 4709 // Use kSmallLargestObserved to make this test finished in a short time. | 2940 // Use kSmallLargestObserved to make this test finished in a short time. |
| 4710 QuicAckFrame ack_frame; | 2941 QuicAckFrame ack_frame; |
| 4711 ack_frame.largest_observed = kSmallLargestObserved; | 2942 ack_frame.largest_observed = kSmallLargestObserved; |
| 4712 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); | 2943 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); |
| 4713 ack_frame.missing = false; | |
| 4714 ack_frame.packets.Add(1, kSmallLargestObserved + 1); | 2944 ack_frame.packets.Add(1, kSmallLargestObserved + 1); |
| 4715 | 2945 |
| 4716 QuicFrames frames; | 2946 QuicFrames frames; |
| 4717 frames.push_back(QuicFrame(&ack_frame)); | 2947 frames.push_back(QuicFrame(&ack_frame)); |
| 4718 | 2948 |
| 4719 // clang-format off | 2949 // clang-format off |
| 4720 unsigned char packet[] = { | 2950 unsigned char packet[] = { |
| 4721 // public flags (8 byte connection_id) | 2951 // public flags (8 byte connection_id) |
| 4722 0x38, | 2952 0x38, |
| 4723 // connection_id | 2953 // connection_id |
| (...skipping 17 matching lines...) Expand all Loading... |
| 4741 | 2971 |
| 4742 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 2972 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 4743 ASSERT_TRUE(data != nullptr); | 2973 ASSERT_TRUE(data != nullptr); |
| 4744 | 2974 |
| 4745 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 2975 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 4746 data->length(), AsChars(packet), | 2976 data->length(), AsChars(packet), |
| 4747 arraysize(packet)); | 2977 arraysize(packet)); |
| 4748 } | 2978 } |
| 4749 | 2979 |
| 4750 TEST_P(QuicFramerTest, BuildNewAckFramePacketMultipleAckBlocks) { | 2980 TEST_P(QuicFramerTest, BuildNewAckFramePacketMultipleAckBlocks) { |
| 4751 if (framer_.version() <= QUIC_VERSION_33) { | |
| 4752 return; | |
| 4753 } | |
| 4754 | |
| 4755 QuicPacketHeader header; | 2981 QuicPacketHeader header; |
| 4756 header.public_header.connection_id = kConnectionId; | 2982 header.public_header.connection_id = kConnectionId; |
| 4757 header.public_header.reset_flag = false; | 2983 header.public_header.reset_flag = false; |
| 4758 header.public_header.version_flag = false; | 2984 header.public_header.version_flag = false; |
| 4759 header.packet_number = kPacketNumber; | 2985 header.packet_number = kPacketNumber; |
| 4760 | 2986 |
| 4761 // Use kSmallLargestObserved to make this test finished in a short time. | 2987 // Use kSmallLargestObserved to make this test finished in a short time. |
| 4762 QuicAckFrame ack_frame; | 2988 QuicAckFrame ack_frame; |
| 4763 ack_frame.largest_observed = kSmallLargestObserved; | 2989 ack_frame.largest_observed = kSmallLargestObserved; |
| 4764 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); | 2990 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); |
| 4765 ack_frame.missing = false; | |
| 4766 ack_frame.packets.Add(1, 5); | 2991 ack_frame.packets.Add(1, 5); |
| 4767 ack_frame.packets.Add(10, 500); | 2992 ack_frame.packets.Add(10, 500); |
| 4768 ack_frame.packets.Add(900, kSmallMissingPacket); | 2993 ack_frame.packets.Add(900, kSmallMissingPacket); |
| 4769 ack_frame.packets.Add(kSmallMissingPacket + 1, kSmallLargestObserved + 1); | 2994 ack_frame.packets.Add(kSmallMissingPacket + 1, kSmallLargestObserved + 1); |
| 4770 | 2995 |
| 4771 QuicFrames frames; | 2996 QuicFrames frames; |
| 4772 frames.push_back(QuicFrame(&ack_frame)); | 2997 frames.push_back(QuicFrame(&ack_frame)); |
| 4773 | 2998 |
| 4774 // clang-format off | 2999 // clang-format off |
| 4775 unsigned char packet[] = { | 3000 unsigned char packet[] = { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4814 | 3039 |
| 4815 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3040 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 4816 ASSERT_TRUE(data != nullptr); | 3041 ASSERT_TRUE(data != nullptr); |
| 4817 | 3042 |
| 4818 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 3043 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 4819 data->length(), AsChars(packet), | 3044 data->length(), AsChars(packet), |
| 4820 arraysize(packet)); | 3045 arraysize(packet)); |
| 4821 } | 3046 } |
| 4822 | 3047 |
| 4823 TEST_P(QuicFramerTest, BuildNewAckFramePacketMaxAckBlocks) { | 3048 TEST_P(QuicFramerTest, BuildNewAckFramePacketMaxAckBlocks) { |
| 4824 if (framer_.version() <= QUIC_VERSION_33) { | |
| 4825 return; | |
| 4826 } | |
| 4827 | |
| 4828 QuicPacketHeader header; | 3049 QuicPacketHeader header; |
| 4829 header.public_header.connection_id = kConnectionId; | 3050 header.public_header.connection_id = kConnectionId; |
| 4830 header.public_header.reset_flag = false; | 3051 header.public_header.reset_flag = false; |
| 4831 header.public_header.version_flag = false; | 3052 header.public_header.version_flag = false; |
| 4832 header.packet_number = kPacketNumber; | 3053 header.packet_number = kPacketNumber; |
| 4833 | 3054 |
| 4834 // Use kSmallLargestObservedto make this test finished in a short time. | 3055 // Use kSmallLargestObservedto make this test finished in a short time. |
| 4835 QuicAckFrame ack_frame; | 3056 QuicAckFrame ack_frame; |
| 4836 ack_frame.largest_observed = kSmallLargestObserved; | 3057 ack_frame.largest_observed = kSmallLargestObserved; |
| 4837 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); | 3058 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); |
| 4838 ack_frame.missing = false; | |
| 4839 // 300 ack blocks. | 3059 // 300 ack blocks. |
| 4840 for (size_t i = 2; i < 2 * 300; i += 2) { | 3060 for (size_t i = 2; i < 2 * 300; i += 2) { |
| 4841 ack_frame.packets.Add(i); | 3061 ack_frame.packets.Add(i); |
| 4842 } | 3062 } |
| 4843 ack_frame.packets.Add(600, kSmallLargestObserved + 1); | 3063 ack_frame.packets.Add(600, kSmallLargestObserved + 1); |
| 4844 | 3064 |
| 4845 QuicFrames frames; | 3065 QuicFrames frames; |
| 4846 frames.push_back(QuicFrame(&ack_frame)); | 3066 frames.push_back(QuicFrame(&ack_frame)); |
| 4847 | 3067 |
| 4848 // clang-format off | 3068 // clang-format off |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4940 }; | 3160 }; |
| 4941 | 3161 |
| 4942 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3162 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 4943 ASSERT_TRUE(data != nullptr); | 3163 ASSERT_TRUE(data != nullptr); |
| 4944 | 3164 |
| 4945 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 3165 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 4946 data->length(), AsChars(packet), | 3166 data->length(), AsChars(packet), |
| 4947 arraysize(packet)); | 3167 arraysize(packet)); |
| 4948 } | 3168 } |
| 4949 | 3169 |
| 4950 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { | 3170 TEST_P(QuicFramerTest, BuildNewStopWaitingPacket) { |
| 4951 if (framer_.version() > QUIC_VERSION_33) { | |
| 4952 return; | |
| 4953 } | |
| 4954 QuicPacketHeader header; | 3171 QuicPacketHeader header; |
| 4955 header.public_header.connection_id = kConnectionId; | 3172 header.public_header.connection_id = kConnectionId; |
| 4956 header.public_header.reset_flag = false; | 3173 header.public_header.reset_flag = false; |
| 4957 header.public_header.version_flag = false; | 3174 header.public_header.version_flag = false; |
| 4958 header.entropy_flag = true; | |
| 4959 header.packet_number = kPacketNumber; | 3175 header.packet_number = kPacketNumber; |
| 4960 | 3176 |
| 4961 QuicStopWaitingFrame stop_waiting_frame; | 3177 QuicStopWaitingFrame stop_waiting_frame; |
| 4962 stop_waiting_frame.entropy_hash = 0x14; | |
| 4963 stop_waiting_frame.least_unacked = kLeastUnacked; | |
| 4964 | |
| 4965 QuicFrames frames; | |
| 4966 frames.push_back(QuicFrame(&stop_waiting_frame)); | |
| 4967 | |
| 4968 // clang-format off | |
| 4969 unsigned char packet[] = { | |
| 4970 // public flags (8 byte connection_id) | |
| 4971 static_cast<unsigned char>( | |
| 4972 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 4973 // connection_id | |
| 4974 0x10, 0x32, 0x54, 0x76, | |
| 4975 0x98, 0xBA, 0xDC, 0xFE, | |
| 4976 // packet number | |
| 4977 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 4978 // private flags (entropy) | |
| 4979 0x01, | |
| 4980 | |
| 4981 // frame type (stop waiting frame) | |
| 4982 0x06, | |
| 4983 // entropy hash of sent packets till least awaiting - 1. | |
| 4984 0x14, | |
| 4985 // least packet number awaiting an ack, delta from packet number. | |
| 4986 0x1C, 0x00, 0x00, 0x00, | |
| 4987 0x00, 0x00, | |
| 4988 }; | |
| 4989 // clang-format on | |
| 4990 | |
| 4991 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | |
| 4992 ASSERT_TRUE(data != nullptr); | |
| 4993 | |
| 4994 test::CompareCharArraysWithHexError("constructed packet", data->data(), | |
| 4995 data->length(), AsChars(packet), | |
| 4996 arraysize(packet)); | |
| 4997 } | |
| 4998 | |
| 4999 TEST_P(QuicFramerTest, BuildNewStopWaitingPacket) { | |
| 5000 if (framer_.version() <= QUIC_VERSION_33) { | |
| 5001 return; | |
| 5002 } | |
| 5003 QuicPacketHeader header; | |
| 5004 header.public_header.connection_id = kConnectionId; | |
| 5005 header.public_header.reset_flag = false; | |
| 5006 header.public_header.version_flag = false; | |
| 5007 header.entropy_flag = false; | |
| 5008 header.packet_number = kPacketNumber; | |
| 5009 | |
| 5010 QuicStopWaitingFrame stop_waiting_frame; | |
| 5011 stop_waiting_frame.least_unacked = kLeastUnacked; | 3178 stop_waiting_frame.least_unacked = kLeastUnacked; |
| 5012 | 3179 |
| 5013 QuicFrames frames; | 3180 QuicFrames frames; |
| 5014 frames.push_back(QuicFrame(&stop_waiting_frame)); | 3181 frames.push_back(QuicFrame(&stop_waiting_frame)); |
| 5015 | 3182 |
| 5016 // clang-format off | 3183 // clang-format off |
| 5017 unsigned char packet[] = { | 3184 unsigned char packet[] = { |
| 5018 // public flags (8 byte connection_id) | 3185 // public flags (8 byte connection_id) |
| 5019 0x38, | 3186 0x38, |
| 5020 // connection_id | 3187 // connection_id |
| (...skipping 16 matching lines...) Expand all Loading... |
| 5037 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 3204 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 5038 data->length(), AsChars(packet), | 3205 data->length(), AsChars(packet), |
| 5039 arraysize(packet)); | 3206 arraysize(packet)); |
| 5040 } | 3207 } |
| 5041 | 3208 |
| 5042 TEST_P(QuicFramerTest, BuildRstFramePacketQuic) { | 3209 TEST_P(QuicFramerTest, BuildRstFramePacketQuic) { |
| 5043 QuicPacketHeader header; | 3210 QuicPacketHeader header; |
| 5044 header.public_header.connection_id = kConnectionId; | 3211 header.public_header.connection_id = kConnectionId; |
| 5045 header.public_header.reset_flag = false; | 3212 header.public_header.reset_flag = false; |
| 5046 header.public_header.version_flag = false; | 3213 header.public_header.version_flag = false; |
| 5047 header.entropy_flag = false; | |
| 5048 header.packet_number = kPacketNumber; | 3214 header.packet_number = kPacketNumber; |
| 5049 | 3215 |
| 5050 QuicRstStreamFrame rst_frame; | 3216 QuicRstStreamFrame rst_frame; |
| 5051 rst_frame.stream_id = kStreamId; | 3217 rst_frame.stream_id = kStreamId; |
| 5052 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708); | 3218 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708); |
| 5053 rst_frame.byte_offset = 0x0807060504030201; | 3219 rst_frame.byte_offset = 0x0807060504030201; |
| 5054 | 3220 |
| 5055 // clang-format off | 3221 // clang-format off |
| 5056 unsigned char packet[] = { | 3222 unsigned char packet[] = { |
| 5057 // public flags (8 byte connection_id) | 3223 // public flags (8 byte connection_id) |
| 5058 static_cast<unsigned char>( | |
| 5059 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 5060 // connection_id | |
| 5061 0x10, 0x32, 0x54, 0x76, | |
| 5062 0x98, 0xBA, 0xDC, 0xFE, | |
| 5063 // packet number | |
| 5064 0xBC, 0x9A, 0x78, 0x56, | |
| 5065 0x34, 0x12, | |
| 5066 // private flags | |
| 5067 0x00, | |
| 5068 | |
| 5069 // frame type (rst stream frame) | |
| 5070 0x01, | |
| 5071 // stream id | |
| 5072 0x04, 0x03, 0x02, 0x01, | |
| 5073 // sent byte offset | |
| 5074 0x01, 0x02, 0x03, 0x04, | |
| 5075 0x05, 0x06, 0x07, 0x08, | |
| 5076 // error code | |
| 5077 0x08, 0x07, 0x06, 0x05, | |
| 5078 }; | |
| 5079 unsigned char packet_34[] = { | |
| 5080 // public flags (8 byte connection_id) | |
| 5081 0x38, | 3224 0x38, |
| 5082 // connection_id | 3225 // connection_id |
| 5083 0x10, 0x32, 0x54, 0x76, | 3226 0x10, 0x32, 0x54, 0x76, |
| 5084 0x98, 0xBA, 0xDC, 0xFE, | 3227 0x98, 0xBA, 0xDC, 0xFE, |
| 5085 // packet number | 3228 // packet number |
| 5086 0xBC, 0x9A, 0x78, 0x56, | 3229 0xBC, 0x9A, 0x78, 0x56, |
| 5087 0x34, 0x12, | 3230 0x34, 0x12, |
| 5088 | 3231 |
| 5089 // frame type (rst stream frame) | 3232 // frame type (rst stream frame) |
| 5090 0x01, | 3233 0x01, |
| 5091 // stream id | 3234 // stream id |
| 5092 0x04, 0x03, 0x02, 0x01, | 3235 0x04, 0x03, 0x02, 0x01, |
| 5093 // sent byte offset | 3236 // sent byte offset |
| 5094 0x01, 0x02, 0x03, 0x04, | 3237 0x01, 0x02, 0x03, 0x04, |
| 5095 0x05, 0x06, 0x07, 0x08, | 3238 0x05, 0x06, 0x07, 0x08, |
| 5096 // error code | 3239 // error code |
| 5097 0x08, 0x07, 0x06, 0x05, | 3240 0x08, 0x07, 0x06, 0x05, |
| 5098 }; | 3241 }; |
| 5099 // clang-format on | 3242 // clang-format on |
| 5100 | 3243 |
| 5101 QuicFrames frames; | 3244 QuicFrames frames; |
| 5102 frames.push_back(QuicFrame(&rst_frame)); | 3245 frames.push_back(QuicFrame(&rst_frame)); |
| 5103 | 3246 |
| 5104 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3247 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 5105 ASSERT_TRUE(data != nullptr); | 3248 ASSERT_TRUE(data != nullptr); |
| 5106 | 3249 |
| 5107 test::CompareCharArraysWithHexError( | 3250 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 5108 "constructed packet", data->data(), data->length(), | 3251 data->length(), AsChars(packet), |
| 5109 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 3252 arraysize(packet)); |
| 5110 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 5111 : arraysize(packet_34)); | |
| 5112 } | 3253 } |
| 5113 | 3254 |
| 5114 TEST_P(QuicFramerTest, BuildCloseFramePacket) { | 3255 TEST_P(QuicFramerTest, BuildCloseFramePacket) { |
| 5115 QuicPacketHeader header; | 3256 QuicPacketHeader header; |
| 5116 header.public_header.connection_id = kConnectionId; | 3257 header.public_header.connection_id = kConnectionId; |
| 5117 header.public_header.reset_flag = false; | 3258 header.public_header.reset_flag = false; |
| 5118 header.public_header.version_flag = false; | 3259 header.public_header.version_flag = false; |
| 5119 header.entropy_flag = true; | |
| 5120 header.packet_number = kPacketNumber; | 3260 header.packet_number = kPacketNumber; |
| 5121 | 3261 |
| 5122 QuicConnectionCloseFrame close_frame; | 3262 QuicConnectionCloseFrame close_frame; |
| 5123 close_frame.error_code = static_cast<QuicErrorCode>(0x05060708); | 3263 close_frame.error_code = static_cast<QuicErrorCode>(0x05060708); |
| 5124 close_frame.error_details = "because I can"; | 3264 close_frame.error_details = "because I can"; |
| 5125 | 3265 |
| 5126 QuicFrames frames; | 3266 QuicFrames frames; |
| 5127 frames.push_back(QuicFrame(&close_frame)); | 3267 frames.push_back(QuicFrame(&close_frame)); |
| 5128 | 3268 |
| 5129 // clang-format off | 3269 // clang-format off |
| 5130 unsigned char packet[] = { | 3270 unsigned char packet[] = { |
| 5131 // public flags (8 byte connection_id) | 3271 // public flags (8 byte connection_id) |
| 5132 static_cast<unsigned char>( | 3272 0x38, |
| 5133 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 5134 // connection_id | 3273 // connection_id |
| 5135 0x10, 0x32, 0x54, 0x76, | 3274 0x10, 0x32, 0x54, 0x76, |
| 5136 0x98, 0xBA, 0xDC, 0xFE, | 3275 0x98, 0xBA, 0xDC, 0xFE, |
| 5137 // packet number | |
| 5138 0xBC, 0x9A, 0x78, 0x56, | |
| 5139 0x34, 0x12, | |
| 5140 // private flags (entropy) | |
| 5141 0x01, | |
| 5142 | |
| 5143 // frame type (connection close frame) | |
| 5144 0x02, | |
| 5145 // error code | |
| 5146 0x08, 0x07, 0x06, 0x05, | |
| 5147 // error details length | |
| 5148 0x0d, 0x00, | |
| 5149 // error details | |
| 5150 'b', 'e', 'c', 'a', | |
| 5151 'u', 's', 'e', ' ', | |
| 5152 'I', ' ', 'c', 'a', | |
| 5153 'n', | |
| 5154 }; | |
| 5155 unsigned char packet_34[] = { | |
| 5156 // public flags (8 byte connection_id) | |
| 5157 static_cast<unsigned char>( | |
| 5158 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 5159 // connection_id | |
| 5160 0x10, 0x32, 0x54, 0x76, | |
| 5161 0x98, 0xBA, 0xDC, 0xFE, | |
| 5162 // packet number | 3276 // packet number |
| 5163 0xBC, 0x9A, 0x78, 0x56, | 3277 0xBC, 0x9A, 0x78, 0x56, |
| 5164 0x34, 0x12, | 3278 0x34, 0x12, |
| 5165 | 3279 |
| 5166 // frame type (connection close frame) | 3280 // frame type (connection close frame) |
| 5167 0x02, | 3281 0x02, |
| 5168 // error code | 3282 // error code |
| 5169 0x08, 0x07, 0x06, 0x05, | 3283 0x08, 0x07, 0x06, 0x05, |
| 5170 // error details length | 3284 // error details length |
| 5171 0x0d, 0x00, | 3285 0x0d, 0x00, |
| 5172 // error details | 3286 // error details |
| 5173 'b', 'e', 'c', 'a', | 3287 'b', 'e', 'c', 'a', |
| 5174 'u', 's', 'e', ' ', | 3288 'u', 's', 'e', ' ', |
| 5175 'I', ' ', 'c', 'a', | 3289 'I', ' ', 'c', 'a', |
| 5176 'n', | 3290 'n', |
| 5177 }; | 3291 }; |
| 5178 // clang-format on | 3292 // clang-format on |
| 5179 | 3293 |
| 5180 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3294 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 5181 ASSERT_TRUE(data != nullptr); | 3295 ASSERT_TRUE(data != nullptr); |
| 5182 | 3296 |
| 5183 test::CompareCharArraysWithHexError( | 3297 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 5184 "constructed packet", data->data(), data->length(), | 3298 data->length(), AsChars(packet), |
| 5185 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 3299 arraysize(packet)); |
| 5186 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 5187 : arraysize(packet_34)); | |
| 5188 } | 3300 } |
| 5189 | 3301 |
| 5190 TEST_P(QuicFramerTest, BuildGoAwayPacket) { | 3302 TEST_P(QuicFramerTest, BuildGoAwayPacket) { |
| 5191 QuicPacketHeader header; | 3303 QuicPacketHeader header; |
| 5192 header.public_header.connection_id = kConnectionId; | 3304 header.public_header.connection_id = kConnectionId; |
| 5193 header.public_header.reset_flag = false; | 3305 header.public_header.reset_flag = false; |
| 5194 header.public_header.version_flag = false; | 3306 header.public_header.version_flag = false; |
| 5195 header.entropy_flag = true; | |
| 5196 header.packet_number = kPacketNumber; | 3307 header.packet_number = kPacketNumber; |
| 5197 | 3308 |
| 5198 QuicGoAwayFrame goaway_frame; | 3309 QuicGoAwayFrame goaway_frame; |
| 5199 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708); | 3310 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708); |
| 5200 goaway_frame.last_good_stream_id = kStreamId; | 3311 goaway_frame.last_good_stream_id = kStreamId; |
| 5201 goaway_frame.reason_phrase = "because I can"; | 3312 goaway_frame.reason_phrase = "because I can"; |
| 5202 | 3313 |
| 5203 QuicFrames frames; | 3314 QuicFrames frames; |
| 5204 frames.push_back(QuicFrame(&goaway_frame)); | 3315 frames.push_back(QuicFrame(&goaway_frame)); |
| 5205 | 3316 |
| 5206 // clang-format off | 3317 // clang-format off |
| 5207 unsigned char packet[] = { | 3318 unsigned char packet[] = { |
| 5208 // public flags (8 byte connection_id) | 3319 // public flags (8 byte connection_id) |
| 5209 static_cast<unsigned char>( | |
| 5210 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 5211 // connection_id | |
| 5212 0x10, 0x32, 0x54, 0x76, | |
| 5213 0x98, 0xBA, 0xDC, 0xFE, | |
| 5214 // packet number | |
| 5215 0xBC, 0x9A, 0x78, 0x56, | |
| 5216 0x34, 0x12, | |
| 5217 // private flags(entropy) | |
| 5218 0x01, | |
| 5219 | |
| 5220 // frame type (go away frame) | |
| 5221 0x03, | |
| 5222 // error code | |
| 5223 0x08, 0x07, 0x06, 0x05, | |
| 5224 // stream id | |
| 5225 0x04, 0x03, 0x02, 0x01, | |
| 5226 // error details length | |
| 5227 0x0d, 0x00, | |
| 5228 // error details | |
| 5229 'b', 'e', 'c', 'a', | |
| 5230 'u', 's', 'e', ' ', | |
| 5231 'I', ' ', 'c', 'a', | |
| 5232 'n', | |
| 5233 }; | |
| 5234 unsigned char packet_34[] = { | |
| 5235 // public flags (8 byte connection_id) | |
| 5236 0x38, | 3320 0x38, |
| 5237 // connection_id | 3321 // connection_id |
| 5238 0x10, 0x32, 0x54, 0x76, | 3322 0x10, 0x32, 0x54, 0x76, |
| 5239 0x98, 0xBA, 0xDC, 0xFE, | 3323 0x98, 0xBA, 0xDC, 0xFE, |
| 5240 // packet number | 3324 // packet number |
| 5241 0xBC, 0x9A, 0x78, 0x56, | 3325 0xBC, 0x9A, 0x78, 0x56, |
| 5242 0x34, 0x12, | 3326 0x34, 0x12, |
| 5243 | 3327 |
| 5244 // frame type (go away frame) | 3328 // frame type (go away frame) |
| 5245 0x03, | 3329 0x03, |
| 5246 // error code | 3330 // error code |
| 5247 0x08, 0x07, 0x06, 0x05, | 3331 0x08, 0x07, 0x06, 0x05, |
| 5248 // stream id | 3332 // stream id |
| 5249 0x04, 0x03, 0x02, 0x01, | 3333 0x04, 0x03, 0x02, 0x01, |
| 5250 // error details length | 3334 // error details length |
| 5251 0x0d, 0x00, | 3335 0x0d, 0x00, |
| 5252 // error details | 3336 // error details |
| 5253 'b', 'e', 'c', 'a', | 3337 'b', 'e', 'c', 'a', |
| 5254 'u', 's', 'e', ' ', | 3338 'u', 's', 'e', ' ', |
| 5255 'I', ' ', 'c', 'a', | 3339 'I', ' ', 'c', 'a', |
| 5256 'n', | 3340 'n', |
| 5257 }; | 3341 }; |
| 5258 // clang-format on | 3342 // clang-format on |
| 5259 | 3343 |
| 5260 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3344 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 5261 ASSERT_TRUE(data != nullptr); | 3345 ASSERT_TRUE(data != nullptr); |
| 5262 | 3346 |
| 5263 test::CompareCharArraysWithHexError( | 3347 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 5264 "constructed packet", data->data(), data->length(), | 3348 data->length(), AsChars(packet), |
| 5265 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 3349 arraysize(packet)); |
| 5266 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 5267 : arraysize(packet_34)); | |
| 5268 } | 3350 } |
| 5269 | 3351 |
| 5270 TEST_P(QuicFramerTest, BuildWindowUpdatePacket) { | 3352 TEST_P(QuicFramerTest, BuildWindowUpdatePacket) { |
| 5271 QuicPacketHeader header; | 3353 QuicPacketHeader header; |
| 5272 header.public_header.connection_id = kConnectionId; | 3354 header.public_header.connection_id = kConnectionId; |
| 5273 header.public_header.reset_flag = false; | 3355 header.public_header.reset_flag = false; |
| 5274 header.public_header.version_flag = false; | 3356 header.public_header.version_flag = false; |
| 5275 header.entropy_flag = true; | |
| 5276 header.packet_number = kPacketNumber; | 3357 header.packet_number = kPacketNumber; |
| 5277 | 3358 |
| 5278 QuicWindowUpdateFrame window_update_frame; | 3359 QuicWindowUpdateFrame window_update_frame; |
| 5279 window_update_frame.stream_id = kStreamId; | 3360 window_update_frame.stream_id = kStreamId; |
| 5280 window_update_frame.byte_offset = 0x1122334455667788; | 3361 window_update_frame.byte_offset = 0x1122334455667788; |
| 5281 | 3362 |
| 5282 QuicFrames frames; | 3363 QuicFrames frames; |
| 5283 frames.push_back(QuicFrame(&window_update_frame)); | 3364 frames.push_back(QuicFrame(&window_update_frame)); |
| 5284 | 3365 |
| 5285 // clang-format off | 3366 // clang-format off |
| 5286 unsigned char packet[] = { | 3367 unsigned char packet[] = { |
| 5287 // public flags (8 byte connection_id) | 3368 // public flags (8 byte connection_id) |
| 5288 static_cast<unsigned char>( | |
| 5289 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 5290 // connection_id | |
| 5291 0x10, 0x32, 0x54, 0x76, | |
| 5292 0x98, 0xBA, 0xDC, 0xFE, | |
| 5293 // packet number | |
| 5294 0xBC, 0x9A, 0x78, 0x56, | |
| 5295 0x34, 0x12, | |
| 5296 // private flags(entropy) | |
| 5297 0x01, | |
| 5298 | |
| 5299 // frame type (window update frame) | |
| 5300 0x04, | |
| 5301 // stream id | |
| 5302 0x04, 0x03, 0x02, 0x01, | |
| 5303 // byte offset | |
| 5304 0x88, 0x77, 0x66, 0x55, | |
| 5305 0x44, 0x33, 0x22, 0x11, | |
| 5306 }; | |
| 5307 unsigned char packet_34[] = { | |
| 5308 // public flags (8 byte connection_id) | |
| 5309 0x38, | 3369 0x38, |
| 5310 // connection_id | 3370 // connection_id |
| 5311 0x10, 0x32, 0x54, 0x76, | 3371 0x10, 0x32, 0x54, 0x76, |
| 5312 0x98, 0xBA, 0xDC, 0xFE, | 3372 0x98, 0xBA, 0xDC, 0xFE, |
| 5313 // packet number | 3373 // packet number |
| 5314 0xBC, 0x9A, 0x78, 0x56, | 3374 0xBC, 0x9A, 0x78, 0x56, |
| 5315 0x34, 0x12, | 3375 0x34, 0x12, |
| 5316 | 3376 |
| 5317 // frame type (window update frame) | 3377 // frame type (window update frame) |
| 5318 0x04, | 3378 0x04, |
| 5319 // stream id | 3379 // stream id |
| 5320 0x04, 0x03, 0x02, 0x01, | 3380 0x04, 0x03, 0x02, 0x01, |
| 5321 // byte offset | 3381 // byte offset |
| 5322 0x88, 0x77, 0x66, 0x55, | 3382 0x88, 0x77, 0x66, 0x55, |
| 5323 0x44, 0x33, 0x22, 0x11, | 3383 0x44, 0x33, 0x22, 0x11, |
| 5324 }; | 3384 }; |
| 5325 // clang-format on | 3385 // clang-format on |
| 5326 | 3386 |
| 5327 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3387 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 5328 ASSERT_TRUE(data != nullptr); | 3388 ASSERT_TRUE(data != nullptr); |
| 5329 | 3389 |
| 5330 test::CompareCharArraysWithHexError( | 3390 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 5331 "constructed packet", data->data(), data->length(), | 3391 data->length(), AsChars(packet), |
| 5332 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 3392 arraysize(packet)); |
| 5333 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 5334 : arraysize(packet_34)); | |
| 5335 } | 3393 } |
| 5336 | 3394 |
| 5337 TEST_P(QuicFramerTest, BuildBlockedPacket) { | 3395 TEST_P(QuicFramerTest, BuildBlockedPacket) { |
| 5338 QuicPacketHeader header; | 3396 QuicPacketHeader header; |
| 5339 header.public_header.connection_id = kConnectionId; | 3397 header.public_header.connection_id = kConnectionId; |
| 5340 header.public_header.reset_flag = false; | 3398 header.public_header.reset_flag = false; |
| 5341 header.public_header.version_flag = false; | 3399 header.public_header.version_flag = false; |
| 5342 header.entropy_flag = true; | |
| 5343 header.packet_number = kPacketNumber; | 3400 header.packet_number = kPacketNumber; |
| 5344 | 3401 |
| 5345 QuicBlockedFrame blocked_frame; | 3402 QuicBlockedFrame blocked_frame; |
| 5346 blocked_frame.stream_id = kStreamId; | 3403 blocked_frame.stream_id = kStreamId; |
| 5347 | 3404 |
| 5348 QuicFrames frames; | 3405 QuicFrames frames; |
| 5349 frames.push_back(QuicFrame(&blocked_frame)); | 3406 frames.push_back(QuicFrame(&blocked_frame)); |
| 5350 | 3407 |
| 5351 // clang-format off | 3408 // clang-format off |
| 5352 unsigned char packet[] = { | 3409 unsigned char packet[] = { |
| 5353 // public flags (8 byte connection_id) | 3410 // public flags (8 byte connection_id) |
| 5354 static_cast<unsigned char>( | |
| 5355 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 5356 // connection_id | |
| 5357 0x10, 0x32, 0x54, 0x76, | |
| 5358 0x98, 0xBA, 0xDC, 0xFE, | |
| 5359 // packet number | |
| 5360 0xBC, 0x9A, 0x78, 0x56, | |
| 5361 0x34, 0x12, | |
| 5362 // private flags(entropy) | |
| 5363 0x01, | |
| 5364 | |
| 5365 // frame type (blocked frame) | |
| 5366 0x05, | |
| 5367 // stream id | |
| 5368 0x04, 0x03, 0x02, 0x01, | |
| 5369 }; | |
| 5370 unsigned char packet_34[] = { | |
| 5371 // public flags (8 byte connection_id) | |
| 5372 0x38, | 3411 0x38, |
| 5373 // connection_id | 3412 // connection_id |
| 5374 0x10, 0x32, 0x54, 0x76, | 3413 0x10, 0x32, 0x54, 0x76, |
| 5375 0x98, 0xBA, 0xDC, 0xFE, | 3414 0x98, 0xBA, 0xDC, 0xFE, |
| 5376 // packet number | 3415 // packet number |
| 5377 0xBC, 0x9A, 0x78, 0x56, | 3416 0xBC, 0x9A, 0x78, 0x56, |
| 5378 0x34, 0x12, | 3417 0x34, 0x12, |
| 5379 | 3418 |
| 5380 // frame type (blocked frame) | 3419 // frame type (blocked frame) |
| 5381 0x05, | 3420 0x05, |
| 5382 // stream id | 3421 // stream id |
| 5383 0x04, 0x03, 0x02, 0x01, | 3422 0x04, 0x03, 0x02, 0x01, |
| 5384 }; | 3423 }; |
| 5385 // clang-format on | 3424 // clang-format on |
| 5386 | 3425 |
| 5387 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3426 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 5388 ASSERT_TRUE(data != nullptr); | 3427 ASSERT_TRUE(data != nullptr); |
| 5389 | 3428 |
| 5390 test::CompareCharArraysWithHexError( | 3429 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 5391 "constructed packet", data->data(), data->length(), | 3430 data->length(), AsChars(packet), |
| 5392 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 3431 arraysize(packet)); |
| 5393 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 5394 : arraysize(packet_34)); | |
| 5395 } | 3432 } |
| 5396 | 3433 |
| 5397 TEST_P(QuicFramerTest, BuildPingPacket) { | 3434 TEST_P(QuicFramerTest, BuildPingPacket) { |
| 5398 QuicPacketHeader header; | 3435 QuicPacketHeader header; |
| 5399 header.public_header.connection_id = kConnectionId; | 3436 header.public_header.connection_id = kConnectionId; |
| 5400 header.public_header.reset_flag = false; | 3437 header.public_header.reset_flag = false; |
| 5401 header.public_header.version_flag = false; | 3438 header.public_header.version_flag = false; |
| 5402 header.entropy_flag = true; | |
| 5403 header.packet_number = kPacketNumber; | 3439 header.packet_number = kPacketNumber; |
| 5404 | 3440 |
| 5405 QuicPingFrame ping_frame; | 3441 QuicPingFrame ping_frame; |
| 5406 | 3442 |
| 5407 QuicFrames frames; | 3443 QuicFrames frames; |
| 5408 frames.push_back(QuicFrame(ping_frame)); | 3444 frames.push_back(QuicFrame(ping_frame)); |
| 5409 | 3445 |
| 5410 // clang-format off | 3446 // clang-format off |
| 5411 unsigned char packet[] = { | 3447 unsigned char packet[] = { |
| 5412 // public flags (8 byte connection_id) | 3448 // public flags (8 byte connection_id) |
| 5413 static_cast<unsigned char>( | 3449 0x38, |
| 5414 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 5415 // connection_id | 3450 // connection_id |
| 5416 0x10, 0x32, 0x54, 0x76, | 3451 0x10, 0x32, 0x54, 0x76, |
| 5417 0x98, 0xBA, 0xDC, 0xFE, | 3452 0x98, 0xBA, 0xDC, 0xFE, |
| 5418 // packet number | |
| 5419 0xBC, 0x9A, 0x78, 0x56, | |
| 5420 0x34, 0x12, | |
| 5421 // private flags(entropy) | |
| 5422 0x01, | |
| 5423 | |
| 5424 // frame type (ping frame) | |
| 5425 0x07, | |
| 5426 }; | |
| 5427 unsigned char packet_34[] = { | |
| 5428 // public flags (8 byte connection_id) | |
| 5429 static_cast<unsigned char>( | |
| 5430 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 5431 // connection_id | |
| 5432 0x10, 0x32, 0x54, 0x76, | |
| 5433 0x98, 0xBA, 0xDC, 0xFE, | |
| 5434 // packet number | 3453 // packet number |
| 5435 0xBC, 0x9A, 0x78, 0x56, | 3454 0xBC, 0x9A, 0x78, 0x56, |
| 5436 0x34, 0x12, | 3455 0x34, 0x12, |
| 5437 | 3456 |
| 5438 // frame type (ping frame) | 3457 // frame type (ping frame) |
| 5439 0x07, | 3458 0x07, |
| 5440 }; | 3459 }; |
| 5441 // clang-format on | 3460 // clang-format on |
| 5442 | 3461 |
| 5443 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3462 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 5444 ASSERT_TRUE(data != nullptr); | 3463 ASSERT_TRUE(data != nullptr); |
| 5445 | 3464 |
| 5446 test::CompareCharArraysWithHexError( | 3465 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 5447 "constructed packet", data->data(), data->length(), | 3466 data->length(), AsChars(packet), |
| 5448 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 3467 arraysize(packet)); |
| 5449 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 5450 : arraysize(packet_34)); | |
| 5451 } | 3468 } |
| 5452 | 3469 |
| 5453 TEST_P(QuicFramerTest, BuildPathClosePacket) { | 3470 TEST_P(QuicFramerTest, BuildPathClosePacket) { |
| 5454 QuicPacketHeader header; | 3471 QuicPacketHeader header; |
| 5455 header.public_header.connection_id = kConnectionId; | 3472 header.public_header.connection_id = kConnectionId; |
| 5456 header.public_header.multipath_flag = true; | 3473 header.public_header.multipath_flag = true; |
| 5457 header.public_header.reset_flag = false; | 3474 header.public_header.reset_flag = false; |
| 5458 header.public_header.version_flag = false; | 3475 header.public_header.version_flag = false; |
| 5459 header.entropy_flag = true; | |
| 5460 header.path_id = kDefaultPathId; | 3476 header.path_id = kDefaultPathId; |
| 5461 header.packet_number = kPacketNumber; | 3477 header.packet_number = kPacketNumber; |
| 5462 | 3478 |
| 5463 QuicPathCloseFrame path_close; | 3479 QuicPathCloseFrame path_close; |
| 5464 path_close.path_id = kPathId; | 3480 path_close.path_id = kPathId; |
| 5465 QuicFrames frames; | 3481 QuicFrames frames; |
| 5466 frames.push_back(QuicFrame(&path_close)); | 3482 frames.push_back(QuicFrame(&path_close)); |
| 5467 | 3483 |
| 5468 // clang-format off | 3484 // clang-format off |
| 5469 unsigned char packet[] = { | 3485 unsigned char packet[] = { |
| 5470 // public flags (version) | 3486 // public flags (version) |
| 5471 static_cast<unsigned char>( | 3487 0x78, |
| 5472 framer_.version() > QUIC_VERSION_32 ? 0x78 : 0X7C), | |
| 5473 // connection_id | 3488 // connection_id |
| 5474 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 3489 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
| 5475 // path_id | 3490 // path_id |
| 5476 0x00, | |
| 5477 // packet number | |
| 5478 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
| 5479 // private flags (entropy) | |
| 5480 0x01, | |
| 5481 | |
| 5482 // frame type (path_close_frame) | |
| 5483 0x08, | |
| 5484 // path id | |
| 5485 0x42, | |
| 5486 }; | |
| 5487 unsigned char packet_34[] = { | |
| 5488 // public flags (version) | |
| 5489 static_cast<unsigned char>( | |
| 5490 framer_.version() > QUIC_VERSION_32 ? 0x78 : 0X7C), | |
| 5491 // connection_id | |
| 5492 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
| 5493 // path_id | |
| 5494 0x00, | 3491 0x00, |
| 5495 // packet number | 3492 // packet number |
| 5496 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 3493 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
| 5497 | 3494 |
| 5498 // frame type (path_close_frame) | 3495 // frame type (path_close_frame) |
| 5499 0x08, | 3496 0x08, |
| 5500 // path id | 3497 // path id |
| 5501 0x42, | 3498 0x42, |
| 5502 }; | 3499 }; |
| 5503 // clang-format on | 3500 // clang-format on |
| 5504 | 3501 |
| 5505 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3502 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 5506 ASSERT_TRUE(data != nullptr); | 3503 ASSERT_TRUE(data != nullptr); |
| 5507 | 3504 |
| 5508 test::CompareCharArraysWithHexError( | 3505 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 5509 "constructed packet", data->data(), data->length(), | 3506 data->length(), AsChars(packet), |
| 5510 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 3507 arraysize(packet)); |
| 5511 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 5512 : arraysize(packet_34)); | |
| 5513 } | 3508 } |
| 5514 | 3509 |
| 5515 // Test that the MTU discovery packet is serialized correctly as a PING packet. | 3510 // Test that the MTU discovery packet is serialized correctly as a PING packet. |
| 5516 TEST_P(QuicFramerTest, BuildMtuDiscoveryPacket) { | 3511 TEST_P(QuicFramerTest, BuildMtuDiscoveryPacket) { |
| 5517 QuicPacketHeader header; | 3512 QuicPacketHeader header; |
| 5518 header.public_header.connection_id = kConnectionId; | 3513 header.public_header.connection_id = kConnectionId; |
| 5519 header.public_header.reset_flag = false; | 3514 header.public_header.reset_flag = false; |
| 5520 header.public_header.version_flag = false; | 3515 header.public_header.version_flag = false; |
| 5521 header.entropy_flag = true; | |
| 5522 header.packet_number = kPacketNumber; | 3516 header.packet_number = kPacketNumber; |
| 5523 | 3517 |
| 5524 QuicMtuDiscoveryFrame mtu_discovery_frame; | 3518 QuicMtuDiscoveryFrame mtu_discovery_frame; |
| 5525 | 3519 |
| 5526 QuicFrames frames; | 3520 QuicFrames frames; |
| 5527 frames.push_back(QuicFrame(mtu_discovery_frame)); | 3521 frames.push_back(QuicFrame(mtu_discovery_frame)); |
| 5528 | 3522 |
| 5529 // clang-format off | 3523 // clang-format off |
| 5530 unsigned char packet[] = { | 3524 unsigned char packet[] = { |
| 5531 // public flags (8 byte connection_id) | 3525 // public flags (8 byte connection_id) |
| 5532 static_cast<unsigned char>( | 3526 0x38, |
| 5533 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 5534 // connection_id | 3527 // connection_id |
| 5535 0x10, 0x32, 0x54, 0x76, | 3528 0x10, 0x32, 0x54, 0x76, |
| 5536 0x98, 0xBA, 0xDC, 0xFE, | 3529 0x98, 0xBA, 0xDC, 0xFE, |
| 5537 // packet number | |
| 5538 0xBC, 0x9A, 0x78, 0x56, | |
| 5539 0x34, 0x12, | |
| 5540 // private flags(entropy) | |
| 5541 0x01, | |
| 5542 | |
| 5543 // frame type (ping frame) | |
| 5544 0x07, | |
| 5545 }; | |
| 5546 unsigned char packet_34[] = { | |
| 5547 // public flags (8 byte connection_id) | |
| 5548 static_cast<unsigned char>( | |
| 5549 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 5550 // connection_id | |
| 5551 0x10, 0x32, 0x54, 0x76, | |
| 5552 0x98, 0xBA, 0xDC, 0xFE, | |
| 5553 // packet number | 3530 // packet number |
| 5554 0xBC, 0x9A, 0x78, 0x56, | 3531 0xBC, 0x9A, 0x78, 0x56, |
| 5555 0x34, 0x12, | 3532 0x34, 0x12, |
| 5556 | 3533 |
| 5557 // frame type (ping frame) | 3534 // frame type (ping frame) |
| 5558 0x07, | 3535 0x07, |
| 5559 }; | 3536 }; |
| 5560 // clang-format on | 3537 // clang-format on |
| 5561 | 3538 |
| 5562 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 3539 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 5563 ASSERT_TRUE(data != nullptr); | 3540 ASSERT_TRUE(data != nullptr); |
| 5564 | 3541 |
| 5565 test::CompareCharArraysWithHexError( | 3542 test::CompareCharArraysWithHexError("constructed packet", data->data(), |
| 5566 "constructed packet", data->data(), data->length(), | 3543 data->length(), AsChars(packet), |
| 5567 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 3544 arraysize(packet)); |
| 5568 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 5569 : arraysize(packet_34)); | |
| 5570 } | 3545 } |
| 5571 | 3546 |
| 5572 TEST_P(QuicFramerTest, BuildPublicResetPacketOld) { | 3547 TEST_P(QuicFramerTest, BuildPublicResetPacketOld) { |
| 5573 FLAGS_quic_use_old_public_reset_packets = true; | 3548 FLAGS_quic_use_old_public_reset_packets = true; |
| 5574 QuicPublicResetPacket reset_packet; | 3549 QuicPublicResetPacket reset_packet; |
| 5575 reset_packet.public_header.connection_id = kConnectionId; | 3550 reset_packet.public_header.connection_id = kConnectionId; |
| 5576 reset_packet.public_header.reset_flag = true; | 3551 reset_packet.public_header.reset_flag = true; |
| 5577 reset_packet.public_header.version_flag = false; | 3552 reset_packet.public_header.version_flag = false; |
| 5578 reset_packet.rejected_packet_number = kPacketNumber; | 3553 reset_packet.rejected_packet_number = kPacketNumber; |
| 5579 reset_packet.nonce_proof = kNonceProof; | 3554 reset_packet.nonce_proof = kNonceProof; |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5796 data->length(), AsChars(packet), | 3771 data->length(), AsChars(packet), |
| 5797 arraysize(packet)); | 3772 arraysize(packet)); |
| 5798 } | 3773 } |
| 5799 } | 3774 } |
| 5800 | 3775 |
| 5801 TEST_P(QuicFramerTest, EncryptPacket) { | 3776 TEST_P(QuicFramerTest, EncryptPacket) { |
| 5802 QuicPacketNumber packet_number = kPacketNumber; | 3777 QuicPacketNumber packet_number = kPacketNumber; |
| 5803 // clang-format off | 3778 // clang-format off |
| 5804 unsigned char packet[] = { | 3779 unsigned char packet[] = { |
| 5805 // public flags (8 byte connection_id) | 3780 // public flags (8 byte connection_id) |
| 5806 static_cast<unsigned char>( | 3781 0x38, |
| 5807 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 5808 // connection_id | 3782 // connection_id |
| 5809 0x10, 0x32, 0x54, 0x76, | 3783 0x10, 0x32, 0x54, 0x76, |
| 5810 0x98, 0xBA, 0xDC, 0xFE, | 3784 0x98, 0xBA, 0xDC, 0xFE, |
| 5811 // packet number | |
| 5812 0xBC, 0x9A, 0x78, 0x56, | |
| 5813 0x34, 0x12, | |
| 5814 // private flags | |
| 5815 0x00, | |
| 5816 | |
| 5817 // redundancy | |
| 5818 'a', 'b', 'c', 'd', | |
| 5819 'e', 'f', 'g', 'h', | |
| 5820 'i', 'j', 'k', 'l', | |
| 5821 'm', 'n', 'o', 'p', | |
| 5822 }; | |
| 5823 unsigned char packet_34[] = { | |
| 5824 // public flags (8 byte connection_id) | |
| 5825 static_cast<unsigned char>( | |
| 5826 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 5827 // connection_id | |
| 5828 0x10, 0x32, 0x54, 0x76, | |
| 5829 0x98, 0xBA, 0xDC, 0xFE, | |
| 5830 // packet number | 3785 // packet number |
| 5831 0xBC, 0x9A, 0x78, 0x56, | 3786 0xBC, 0x9A, 0x78, 0x56, |
| 5832 0x34, 0x12, | 3787 0x34, 0x12, |
| 5833 | 3788 |
| 5834 // redundancy | 3789 // redundancy |
| 5835 'a', 'b', 'c', 'd', | 3790 'a', 'b', 'c', 'd', |
| 5836 'e', 'f', 'g', 'h', | 3791 'e', 'f', 'g', 'h', |
| 5837 'i', 'j', 'k', 'l', | 3792 'i', 'j', 'k', 'l', |
| 5838 'm', 'n', 'o', 'p', | 3793 'm', 'n', 'o', 'p', |
| 5839 }; | 3794 }; |
| 5840 // clang-format on | 3795 // clang-format on |
| 5841 | 3796 |
| 5842 std::unique_ptr<QuicPacket> raw(new QuicPacket( | 3797 std::unique_ptr<QuicPacket> raw(new QuicPacket( |
| 5843 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 3798 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
| 5844 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | 3799 !kIncludeVersion, !kIncludePathId, !kIncludeDiversificationNonce, |
| 5845 : arraysize(packet_34), | 3800 PACKET_6BYTE_PACKET_NUMBER)); |
| 5846 false, PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId, | |
| 5847 !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER)); | |
| 5848 char buffer[kMaxPacketSize]; | 3801 char buffer[kMaxPacketSize]; |
| 5849 size_t encrypted_length = | 3802 size_t encrypted_length = |
| 5850 framer_.EncryptPayload(ENCRYPTION_NONE, kDefaultPathId, packet_number, | 3803 framer_.EncryptPayload(ENCRYPTION_NONE, kDefaultPathId, packet_number, |
| 5851 *raw, buffer, kMaxPacketSize); | 3804 *raw, buffer, kMaxPacketSize); |
| 5852 | 3805 |
| 5853 ASSERT_NE(0u, encrypted_length); | 3806 ASSERT_NE(0u, encrypted_length); |
| 5854 EXPECT_TRUE(CheckEncryption(kDefaultPathId, packet_number, raw.get())); | 3807 EXPECT_TRUE(CheckEncryption(kDefaultPathId, packet_number, raw.get())); |
| 5855 } | 3808 } |
| 5856 | 3809 |
| 5857 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { | 3810 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { |
| 5858 QuicPacketNumber packet_number = kPacketNumber; | 3811 QuicPacketNumber packet_number = kPacketNumber; |
| 5859 // clang-format off | 3812 // clang-format off |
| 5860 unsigned char packet[] = { | 3813 unsigned char packet[] = { |
| 5861 // public flags (version, 8 byte connection_id) | 3814 // public flags (version, 8 byte connection_id) |
| 5862 0x39, | 3815 0x39, |
| 5863 // connection_id | 3816 // connection_id |
| 5864 0x10, 0x32, 0x54, 0x76, | 3817 0x10, 0x32, 0x54, 0x76, |
| 5865 0x98, 0xBA, 0xDC, 0xFE, | 3818 0x98, 0xBA, 0xDC, 0xFE, |
| 5866 // version tag | 3819 // version tag |
| 5867 'Q', '.', '1', '0', | 3820 'Q', '.', '1', '0', |
| 5868 // packet number | 3821 // packet number |
| 5869 0xBC, 0x9A, 0x78, 0x56, | 3822 0xBC, 0x9A, 0x78, 0x56, |
| 5870 0x34, 0x12, | 3823 0x34, 0x12, |
| 5871 // private flags | |
| 5872 0x00, | |
| 5873 | |
| 5874 // redundancy | |
| 5875 'a', 'b', 'c', 'd', | |
| 5876 'e', 'f', 'g', 'h', | |
| 5877 'i', 'j', 'k', 'l', | |
| 5878 'm', 'n', 'o', 'p', | |
| 5879 }; | |
| 5880 unsigned char packet_34[] = { | |
| 5881 // public flags (version, 8 byte connection_id) | |
| 5882 0x39, | |
| 5883 // connection_id | |
| 5884 0x10, 0x32, 0x54, 0x76, | |
| 5885 0x98, 0xBA, 0xDC, 0xFE, | |
| 5886 // version tag | |
| 5887 'Q', '.', '1', '0', | |
| 5888 // packet number | |
| 5889 0xBC, 0x9A, 0x78, 0x56, | |
| 5890 0x34, 0x12, | |
| 5891 | 3824 |
| 5892 // redundancy | 3825 // redundancy |
| 5893 'a', 'b', 'c', 'd', | 3826 'a', 'b', 'c', 'd', |
| 5894 'e', 'f', 'g', 'h', | 3827 'e', 'f', 'g', 'h', |
| 5895 'i', 'j', 'k', 'l', | 3828 'i', 'j', 'k', 'l', |
| 5896 'm', 'n', 'o', 'p', | 3829 'm', 'n', 'o', 'p', |
| 5897 }; | 3830 }; |
| 5898 // clang-format on | 3831 // clang-format on |
| 5899 | 3832 |
| 5900 std::unique_ptr<QuicPacket> raw(new QuicPacket( | 3833 std::unique_ptr<QuicPacket> raw(new QuicPacket( |
| 5901 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 3834 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
| 5902 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | 3835 kIncludeVersion, !kIncludePathId, !kIncludeDiversificationNonce, |
| 5903 : arraysize(packet_34), | 3836 PACKET_6BYTE_PACKET_NUMBER)); |
| 5904 false, PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, !kIncludePathId, | |
| 5905 !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER)); | |
| 5906 char buffer[kMaxPacketSize]; | 3837 char buffer[kMaxPacketSize]; |
| 5907 size_t encrypted_length = | 3838 size_t encrypted_length = |
| 5908 framer_.EncryptPayload(ENCRYPTION_NONE, kDefaultPathId, packet_number, | 3839 framer_.EncryptPayload(ENCRYPTION_NONE, kDefaultPathId, packet_number, |
| 5909 *raw, buffer, kMaxPacketSize); | 3840 *raw, buffer, kMaxPacketSize); |
| 5910 | 3841 |
| 5911 ASSERT_NE(0u, encrypted_length); | 3842 ASSERT_NE(0u, encrypted_length); |
| 5912 EXPECT_TRUE(CheckEncryption(kDefaultPathId, packet_number, raw.get())); | 3843 EXPECT_TRUE(CheckEncryption(kDefaultPathId, packet_number, raw.get())); |
| 5913 } | 3844 } |
| 5914 | 3845 |
| 5915 TEST_P(QuicFramerTest, EncryptPacketWithMultipathFlag) { | 3846 TEST_P(QuicFramerTest, EncryptPacketWithMultipathFlag) { |
| 5916 QuicPacketNumber packet_number = kPacketNumber; | 3847 QuicPacketNumber packet_number = kPacketNumber; |
| 5917 // clang-format off | 3848 // clang-format off |
| 5918 unsigned char packet[] = { | 3849 unsigned char packet[] = { |
| 5919 // public flags (version, 8 byte connection_id) | 3850 // public flags (version, 8 byte connection_id) |
| 5920 0x78, | 3851 0x78, |
| 5921 // connection_id | 3852 // connection_id |
| 5922 0x10, 0x32, 0x54, 0x76, | 3853 0x10, 0x32, 0x54, 0x76, |
| 5923 0x98, 0xBA, 0xDC, 0xFE, | 3854 0x98, 0xBA, 0xDC, 0xFE, |
| 5924 // path_id | 3855 // path_id |
| 5925 0x42, | 3856 0x42, |
| 5926 // packet number | 3857 // packet number |
| 5927 0xBC, 0x9A, 0x78, 0x56, | 3858 0xBC, 0x9A, 0x78, 0x56, |
| 5928 0x34, 0x12, | 3859 0x34, 0x12, |
| 5929 // private flags | |
| 5930 0x00, | |
| 5931 | |
| 5932 // redundancy | |
| 5933 'a', 'b', 'c', 'd', | |
| 5934 'e', 'f', 'g', 'h', | |
| 5935 'i', 'j', 'k', 'l', | |
| 5936 'm', 'n', 'o', 'p', | |
| 5937 }; | |
| 5938 unsigned char packet_34[] = { | |
| 5939 // public flags (version, 8 byte connection_id) | |
| 5940 0x78, | |
| 5941 // connection_id | |
| 5942 0x10, 0x32, 0x54, 0x76, | |
| 5943 0x98, 0xBA, 0xDC, 0xFE, | |
| 5944 // path_id | |
| 5945 0x42, | |
| 5946 // packet number | |
| 5947 0xBC, 0x9A, 0x78, 0x56, | |
| 5948 0x34, 0x12, | |
| 5949 | 3860 |
| 5950 // redundancy | 3861 // redundancy |
| 5951 'a', 'b', 'c', 'd', | 3862 'a', 'b', 'c', 'd', |
| 5952 'e', 'f', 'g', 'h', | 3863 'e', 'f', 'g', 'h', |
| 5953 'i', 'j', 'k', 'l', | 3864 'i', 'j', 'k', 'l', |
| 5954 'm', 'n', 'o', 'p', | 3865 'm', 'n', 'o', 'p', |
| 5955 }; | 3866 }; |
| 5956 // clang-format on | 3867 // clang-format on |
| 5957 | 3868 |
| 5958 std::unique_ptr<QuicPacket> raw(new QuicPacket( | 3869 std::unique_ptr<QuicPacket> raw(new QuicPacket( |
| 5959 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 3870 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
| 5960 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | 3871 !kIncludeVersion, kIncludePathId, !kIncludeDiversificationNonce, |
| 5961 : arraysize(packet_34), | 3872 PACKET_6BYTE_PACKET_NUMBER)); |
| 5962 false, PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, kIncludePathId, | |
| 5963 !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER)); | |
| 5964 char buffer[kMaxPacketSize]; | 3873 char buffer[kMaxPacketSize]; |
| 5965 size_t encrypted_length = framer_.EncryptPayload( | 3874 size_t encrypted_length = framer_.EncryptPayload( |
| 5966 ENCRYPTION_NONE, kPathId, packet_number, *raw, buffer, kMaxPacketSize); | 3875 ENCRYPTION_NONE, kPathId, packet_number, *raw, buffer, kMaxPacketSize); |
| 5967 | 3876 |
| 5968 ASSERT_NE(0u, encrypted_length); | 3877 ASSERT_NE(0u, encrypted_length); |
| 5969 EXPECT_TRUE(CheckEncryption(kPathId, packet_number, raw.get())); | 3878 EXPECT_TRUE(CheckEncryption(kPathId, packet_number, raw.get())); |
| 5970 } | 3879 } |
| 5971 | 3880 |
| 5972 TEST_P(QuicFramerTest, EncryptPacketWithBothVersionFlagAndMultipathFlag) { | 3881 TEST_P(QuicFramerTest, EncryptPacketWithBothVersionFlagAndMultipathFlag) { |
| 5973 QuicPacketNumber packet_number = kPacketNumber; | 3882 QuicPacketNumber packet_number = kPacketNumber; |
| 5974 // clang-format off | 3883 // clang-format off |
| 5975 unsigned char packet[] = { | 3884 unsigned char packet[] = { |
| 5976 // public flags (version, 8 byte connection_id) | 3885 // public flags (version, 8 byte connection_id) |
| 5977 0x79, | 3886 0x79, |
| 5978 // connection_id | 3887 // connection_id |
| 5979 0x10, 0x32, 0x54, 0x76, | 3888 0x10, 0x32, 0x54, 0x76, |
| 5980 0x98, 0xBA, 0xDC, 0xFE, | 3889 0x98, 0xBA, 0xDC, 0xFE, |
| 5981 // version tag | 3890 // version tag |
| 5982 'Q', '.', '1', '0', | 3891 'Q', '.', '1', '0', |
| 5983 // path_id | 3892 // path_id |
| 5984 0x42, | 3893 0x42, |
| 5985 // packet number | 3894 // packet number |
| 5986 0xBC, 0x9A, 0x78, 0x56, | 3895 0xBC, 0x9A, 0x78, 0x56, |
| 5987 0x34, 0x12, | 3896 0x34, 0x12, |
| 5988 // private flags | |
| 5989 0x00, | |
| 5990 | |
| 5991 // redundancy | |
| 5992 'a', 'b', 'c', 'd', | |
| 5993 'e', 'f', 'g', 'h', | |
| 5994 'i', 'j', 'k', 'l', | |
| 5995 'm', 'n', 'o', 'p', | |
| 5996 }; | |
| 5997 unsigned char packet_34[] = { | |
| 5998 // public flags (version, 8 byte connection_id) | |
| 5999 0x79, | |
| 6000 // connection_id | |
| 6001 0x10, 0x32, 0x54, 0x76, | |
| 6002 0x98, 0xBA, 0xDC, 0xFE, | |
| 6003 // version tag | |
| 6004 'Q', '.', '1', '0', | |
| 6005 // path_id | |
| 6006 0x42, | |
| 6007 // packet number | |
| 6008 0xBC, 0x9A, 0x78, 0x56, | |
| 6009 0x34, 0x12, | |
| 6010 | 3897 |
| 6011 // redundancy | 3898 // redundancy |
| 6012 'a', 'b', 'c', 'd', | 3899 'a', 'b', 'c', 'd', |
| 6013 'e', 'f', 'g', 'h', | 3900 'e', 'f', 'g', 'h', |
| 6014 'i', 'j', 'k', 'l', | 3901 'i', 'j', 'k', 'l', |
| 6015 'm', 'n', 'o', 'p', | 3902 'm', 'n', 'o', 'p', |
| 6016 }; | 3903 }; |
| 6017 // clang-format on | 3904 // clang-format on |
| 6018 | 3905 |
| 6019 std::unique_ptr<QuicPacket> raw(new QuicPacket( | 3906 std::unique_ptr<QuicPacket> raw(new QuicPacket( |
| 6020 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | 3907 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
| 6021 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | 3908 kIncludeVersion, kIncludePathId, !kIncludeDiversificationNonce, |
| 6022 : arraysize(packet_34), | 3909 PACKET_6BYTE_PACKET_NUMBER)); |
| 6023 false, PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, kIncludePathId, | |
| 6024 !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER)); | |
| 6025 char buffer[kMaxPacketSize]; | 3910 char buffer[kMaxPacketSize]; |
| 6026 size_t encrypted_length = framer_.EncryptPayload( | 3911 size_t encrypted_length = framer_.EncryptPayload( |
| 6027 ENCRYPTION_NONE, kPathId, packet_number, *raw, buffer, kMaxPacketSize); | 3912 ENCRYPTION_NONE, kPathId, packet_number, *raw, buffer, kMaxPacketSize); |
| 6028 | 3913 |
| 6029 ASSERT_NE(0u, encrypted_length); | 3914 ASSERT_NE(0u, encrypted_length); |
| 6030 EXPECT_TRUE(CheckEncryption(kPathId, packet_number, raw.get())); | 3915 EXPECT_TRUE(CheckEncryption(kPathId, packet_number, raw.get())); |
| 6031 } | 3916 } |
| 6032 | 3917 |
| 6033 TEST_P(QuicFramerTest, AckTruncationLargePacket) { | 3918 TEST_P(QuicFramerTest, AckTruncationLargePacket) { |
| 6034 QuicPacketHeader header; | 3919 QuicPacketHeader header; |
| 6035 header.public_header.connection_id = kConnectionId; | 3920 header.public_header.connection_id = kConnectionId; |
| 6036 header.public_header.reset_flag = false; | 3921 header.public_header.reset_flag = false; |
| 6037 header.public_header.version_flag = false; | 3922 header.public_header.version_flag = false; |
| 6038 header.entropy_flag = false; | |
| 6039 header.packet_number = kPacketNumber; | 3923 header.packet_number = kPacketNumber; |
| 6040 | 3924 |
| 6041 QuicAckFrame ack_frame; | 3925 QuicAckFrame ack_frame; |
| 6042 // Create a packet with just the ack. | 3926 // Create a packet with just the ack. |
| 6043 if (framer_.version() <= QUIC_VERSION_33) { | 3927 ack_frame = MakeAckFrameWithAckBlocks(300, 0u); |
| 6044 ack_frame = MakeAckFrameWithNackRanges(300, 0u); | |
| 6045 } else { | |
| 6046 ack_frame = MakeAckFrameWithAckBlocks(300, 0u); | |
| 6047 } | |
| 6048 QuicFrame frame; | 3928 QuicFrame frame; |
| 6049 frame.type = ACK_FRAME; | 3929 frame.type = ACK_FRAME; |
| 6050 frame.ack_frame = &ack_frame; | 3930 frame.ack_frame = &ack_frame; |
| 6051 QuicFrames frames; | 3931 QuicFrames frames; |
| 6052 frames.push_back(frame); | 3932 frames.push_back(frame); |
| 6053 | 3933 |
| 6054 // Build an ack packet with truncation due to limit in number of nack ranges. | 3934 // Build an ack packet with truncation due to limit in number of nack ranges. |
| 6055 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); | 3935 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); |
| 6056 ASSERT_TRUE(raw_ack_packet != nullptr); | 3936 ASSERT_TRUE(raw_ack_packet != nullptr); |
| 6057 char buffer[kMaxPacketSize]; | 3937 char buffer[kMaxPacketSize]; |
| 6058 size_t encrypted_length = framer_.EncryptPayload( | 3938 size_t encrypted_length = framer_.EncryptPayload( |
| 6059 ENCRYPTION_NONE, kDefaultPathId, header.packet_number, *raw_ack_packet, | 3939 ENCRYPTION_NONE, kDefaultPathId, header.packet_number, *raw_ack_packet, |
| 6060 buffer, kMaxPacketSize); | 3940 buffer, kMaxPacketSize); |
| 6061 ASSERT_NE(0u, encrypted_length); | 3941 ASSERT_NE(0u, encrypted_length); |
| 6062 // Now make sure we can turn our ack packet back into an ack frame. | 3942 // Now make sure we can turn our ack packet back into an ack frame. |
| 6063 ASSERT_TRUE(framer_.ProcessPacket( | 3943 ASSERT_TRUE(framer_.ProcessPacket( |
| 6064 QuicEncryptedPacket(buffer, encrypted_length, false))); | 3944 QuicEncryptedPacket(buffer, encrypted_length, false))); |
| 6065 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 3945 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 6066 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0].get(); | 3946 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0].get(); |
| 6067 if (framer_.version() <= QUIC_VERSION_33) { | 3947 EXPECT_EQ(600u, processed_ack_frame.largest_observed); |
| 6068 EXPECT_TRUE(processed_ack_frame.is_truncated); | 3948 ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow()); |
| 6069 EXPECT_EQ(510u, processed_ack_frame.largest_observed); | 3949 EXPECT_EQ(90u, processed_ack_frame.packets.Min()); |
| 6070 EXPECT_TRUE(processed_ack_frame.missing); | 3950 EXPECT_EQ(600u, processed_ack_frame.packets.Max()); |
| 6071 ASSERT_EQ(255u, processed_ack_frame.packets.NumPacketsSlow()); | |
| 6072 EXPECT_EQ(1u, processed_ack_frame.packets.Min()); | |
| 6073 EXPECT_EQ(509u, processed_ack_frame.packets.Max()); | |
| 6074 } else { | |
| 6075 EXPECT_FALSE(processed_ack_frame.is_truncated); | |
| 6076 EXPECT_FALSE(processed_ack_frame.missing); | |
| 6077 EXPECT_EQ(600u, processed_ack_frame.largest_observed); | |
| 6078 ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow()); | |
| 6079 EXPECT_EQ(90u, processed_ack_frame.packets.Min()); | |
| 6080 EXPECT_EQ(600u, processed_ack_frame.packets.Max()); | |
| 6081 } | |
| 6082 } | 3951 } |
| 6083 | 3952 |
| 6084 TEST_P(QuicFramerTest, AckTruncationSmallPacket) { | 3953 TEST_P(QuicFramerTest, AckTruncationSmallPacket) { |
| 6085 QuicPacketHeader header; | 3954 QuicPacketHeader header; |
| 6086 header.public_header.connection_id = kConnectionId; | 3955 header.public_header.connection_id = kConnectionId; |
| 6087 header.public_header.reset_flag = false; | 3956 header.public_header.reset_flag = false; |
| 6088 header.public_header.version_flag = false; | 3957 header.public_header.version_flag = false; |
| 6089 header.entropy_flag = false; | |
| 6090 header.packet_number = kPacketNumber; | 3958 header.packet_number = kPacketNumber; |
| 6091 | 3959 |
| 6092 // Create a packet with just the ack. | 3960 // Create a packet with just the ack. |
| 6093 QuicAckFrame ack_frame; | 3961 QuicAckFrame ack_frame; |
| 6094 if (framer_.version() <= QUIC_VERSION_33) { | 3962 ack_frame = MakeAckFrameWithAckBlocks(300, 0u); |
| 6095 ack_frame = MakeAckFrameWithNackRanges(300, 0u); | |
| 6096 } else { | |
| 6097 ack_frame = MakeAckFrameWithAckBlocks(300, 0u); | |
| 6098 } | |
| 6099 QuicFrame frame; | 3963 QuicFrame frame; |
| 6100 frame.type = ACK_FRAME; | 3964 frame.type = ACK_FRAME; |
| 6101 frame.ack_frame = &ack_frame; | 3965 frame.ack_frame = &ack_frame; |
| 6102 QuicFrames frames; | 3966 QuicFrames frames; |
| 6103 frames.push_back(frame); | 3967 frames.push_back(frame); |
| 6104 | 3968 |
| 6105 // Build an ack packet with truncation due to limit in number of nack ranges. | 3969 // Build an ack packet with truncation due to limit in number of nack ranges. |
| 6106 std::unique_ptr<QuicPacket> raw_ack_packet( | 3970 std::unique_ptr<QuicPacket> raw_ack_packet( |
| 6107 BuildDataPacket(header, frames, 500)); | 3971 BuildDataPacket(header, frames, 500)); |
| 6108 ASSERT_TRUE(raw_ack_packet != nullptr); | 3972 ASSERT_TRUE(raw_ack_packet != nullptr); |
| 6109 char buffer[kMaxPacketSize]; | 3973 char buffer[kMaxPacketSize]; |
| 6110 size_t encrypted_length = framer_.EncryptPayload( | 3974 size_t encrypted_length = framer_.EncryptPayload( |
| 6111 ENCRYPTION_NONE, kDefaultPathId, header.packet_number, *raw_ack_packet, | 3975 ENCRYPTION_NONE, kDefaultPathId, header.packet_number, *raw_ack_packet, |
| 6112 buffer, kMaxPacketSize); | 3976 buffer, kMaxPacketSize); |
| 6113 ASSERT_NE(0u, encrypted_length); | 3977 ASSERT_NE(0u, encrypted_length); |
| 6114 // Now make sure we can turn our ack packet back into an ack frame. | 3978 // Now make sure we can turn our ack packet back into an ack frame. |
| 6115 ASSERT_TRUE(framer_.ProcessPacket( | 3979 ASSERT_TRUE(framer_.ProcessPacket( |
| 6116 QuicEncryptedPacket(buffer, encrypted_length, false))); | 3980 QuicEncryptedPacket(buffer, encrypted_length, false))); |
| 6117 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 3981 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 6118 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0].get(); | 3982 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0].get(); |
| 6119 if (framer_.version() <= QUIC_VERSION_33) { | 3983 EXPECT_EQ(600u, processed_ack_frame.largest_observed); |
| 6120 EXPECT_TRUE(processed_ack_frame.is_truncated); | 3984 ASSERT_EQ(239u, processed_ack_frame.packets.NumPacketsSlow()); |
| 6121 EXPECT_EQ(476u, processed_ack_frame.largest_observed); | 3985 EXPECT_EQ(124u, processed_ack_frame.packets.Min()); |
| 6122 EXPECT_TRUE(processed_ack_frame.missing); | 3986 EXPECT_EQ(600u, processed_ack_frame.packets.Max()); |
| 6123 ASSERT_EQ(238u, processed_ack_frame.packets.NumPacketsSlow()); | |
| 6124 EXPECT_EQ(1u, processed_ack_frame.packets.Min()); | |
| 6125 EXPECT_EQ(475u, processed_ack_frame.packets.Max()); | |
| 6126 } else { | |
| 6127 EXPECT_FALSE(processed_ack_frame.is_truncated); | |
| 6128 EXPECT_EQ(600u, processed_ack_frame.largest_observed); | |
| 6129 EXPECT_FALSE(processed_ack_frame.missing); | |
| 6130 ASSERT_EQ(239u, processed_ack_frame.packets.NumPacketsSlow()); | |
| 6131 EXPECT_EQ(124u, processed_ack_frame.packets.Min()); | |
| 6132 EXPECT_EQ(600u, processed_ack_frame.packets.Max()); | |
| 6133 } | |
| 6134 } | 3987 } |
| 6135 | 3988 |
| 6136 TEST_P(QuicFramerTest, CleanTruncation) { | 3989 TEST_P(QuicFramerTest, CleanTruncation) { |
| 6137 QuicPacketHeader header; | 3990 QuicPacketHeader header; |
| 6138 header.public_header.connection_id = kConnectionId; | 3991 header.public_header.connection_id = kConnectionId; |
| 6139 header.public_header.reset_flag = false; | 3992 header.public_header.reset_flag = false; |
| 6140 header.public_header.version_flag = false; | 3993 header.public_header.version_flag = false; |
| 6141 header.entropy_flag = true; | |
| 6142 header.packet_number = kPacketNumber; | 3994 header.packet_number = kPacketNumber; |
| 6143 | 3995 |
| 6144 QuicAckFrame ack_frame; | 3996 QuicAckFrame ack_frame; |
| 6145 ack_frame.largest_observed = 201; | 3997 ack_frame.largest_observed = 201; |
| 6146 ack_frame.packets.Add(1, ack_frame.largest_observed); | 3998 ack_frame.packets.Add(1, ack_frame.largest_observed); |
| 6147 | 3999 |
| 6148 // Create a packet with just the ack. | 4000 // Create a packet with just the ack. |
| 6149 QuicFrame frame; | 4001 QuicFrame frame; |
| 6150 frame.type = ACK_FRAME; | 4002 frame.type = ACK_FRAME; |
| 6151 frame.ack_frame = &ack_frame; | 4003 frame.ack_frame = &ack_frame; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 6172 frame.ack_frame = visitor_.ack_frames_[0].get(); | 4024 frame.ack_frame = visitor_.ack_frames_[0].get(); |
| 6173 frames.push_back(frame); | 4025 frames.push_back(frame); |
| 6174 | 4026 |
| 6175 size_t original_raw_length = raw_ack_packet->length(); | 4027 size_t original_raw_length = raw_ack_packet->length(); |
| 6176 raw_ack_packet.reset(BuildDataPacket(header, frames)); | 4028 raw_ack_packet.reset(BuildDataPacket(header, frames)); |
| 6177 ASSERT_TRUE(raw_ack_packet != nullptr); | 4029 ASSERT_TRUE(raw_ack_packet != nullptr); |
| 6178 EXPECT_EQ(original_raw_length, raw_ack_packet->length()); | 4030 EXPECT_EQ(original_raw_length, raw_ack_packet->length()); |
| 6179 ASSERT_TRUE(raw_ack_packet != nullptr); | 4031 ASSERT_TRUE(raw_ack_packet != nullptr); |
| 6180 } | 4032 } |
| 6181 | 4033 |
| 6182 TEST_P(QuicFramerTest, EntropyFlagTest) { | |
| 6183 if (framer_.version() > QUIC_VERSION_33) { | |
| 6184 return; | |
| 6185 } | |
| 6186 // clang-format off | |
| 6187 unsigned char packet[] = { | |
| 6188 // public flags (8 byte connection_id) | |
| 6189 static_cast<unsigned char>( | |
| 6190 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 6191 // connection_id | |
| 6192 0x10, 0x32, 0x54, 0x76, | |
| 6193 0x98, 0xBA, 0xDC, 0xFE, | |
| 6194 // packet number | |
| 6195 0xBC, 0x9A, 0x78, 0x56, | |
| 6196 0x34, 0x12, | |
| 6197 // private flags (Entropy) | |
| 6198 0x01, | |
| 6199 | |
| 6200 // frame type (stream frame with fin and no length) | |
| 6201 0xDF, | |
| 6202 // stream id | |
| 6203 0x04, 0x03, 0x02, 0x01, | |
| 6204 // offset | |
| 6205 0x54, 0x76, 0x10, 0x32, | |
| 6206 0xDC, 0xFE, 0x98, 0xBA, | |
| 6207 // data | |
| 6208 'h', 'e', 'l', 'l', | |
| 6209 'o', ' ', 'w', 'o', | |
| 6210 'r', 'l', 'd', '!', | |
| 6211 }; | |
| 6212 // clang-format on | |
| 6213 | |
| 6214 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
| 6215 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
| 6216 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
| 6217 ASSERT_TRUE(visitor_.header_.get()); | |
| 6218 EXPECT_TRUE(visitor_.header_->entropy_flag); | |
| 6219 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); | |
| 6220 }; | |
| 6221 | |
| 6222 TEST_P(QuicFramerTest, StopPacketProcessing) { | 4034 TEST_P(QuicFramerTest, StopPacketProcessing) { |
| 6223 // clang-format off | 4035 // clang-format off |
| 6224 unsigned char packet[] = { | 4036 unsigned char packet[] = { |
| 6225 // public flags (8 byte connection_id) | 4037 // public flags (8 byte connection_id) |
| 6226 static_cast<unsigned char>( | 4038 0x38, |
| 6227 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 6228 // connection_id | 4039 // connection_id |
| 6229 0x10, 0x32, 0x54, 0x76, | 4040 0x10, 0x32, 0x54, 0x76, |
| 6230 0x98, 0xBA, 0xDC, 0xFE, | 4041 0x98, 0xBA, 0xDC, 0xFE, |
| 6231 // packet number | |
| 6232 0xBC, 0x9A, 0x78, 0x56, | |
| 6233 0x34, 0x12, | |
| 6234 // Entropy | |
| 6235 0x01, | |
| 6236 | |
| 6237 // frame type (stream frame with fin) | |
| 6238 0xFF, | |
| 6239 // stream id | |
| 6240 0x04, 0x03, 0x02, 0x01, | |
| 6241 // offset | |
| 6242 0x54, 0x76, 0x10, 0x32, | |
| 6243 0xDC, 0xFE, 0x98, 0xBA, | |
| 6244 // data length | |
| 6245 0x0c, 0x00, | |
| 6246 // data | |
| 6247 'h', 'e', 'l', 'l', | |
| 6248 'o', ' ', 'w', 'o', | |
| 6249 'r', 'l', 'd', '!', | |
| 6250 | |
| 6251 // frame type (ack frame) | |
| 6252 0x40, | |
| 6253 // entropy hash of sent packets till least awaiting - 1. | |
| 6254 0x14, | |
| 6255 // least packet number awaiting an ack | |
| 6256 0xA0, 0x9A, 0x78, 0x56, | |
| 6257 0x34, 0x12, | |
| 6258 // entropy hash of all received packets. | |
| 6259 0x43, | |
| 6260 // largest observed packet number | |
| 6261 0xBF, 0x9A, 0x78, 0x56, | |
| 6262 0x34, 0x12, | |
| 6263 // num missing packets | |
| 6264 0x01, | |
| 6265 // missing packet | |
| 6266 0xBE, 0x9A, 0x78, 0x56, | |
| 6267 0x34, 0x12, | |
| 6268 }; | |
| 6269 unsigned char packet_34[] = { | |
| 6270 // public flags (8 byte connection_id) | |
| 6271 static_cast<unsigned char>( | |
| 6272 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
| 6273 // connection_id | |
| 6274 0x10, 0x32, 0x54, 0x76, | |
| 6275 0x98, 0xBA, 0xDC, 0xFE, | |
| 6276 // packet number | 4042 // packet number |
| 6277 0xBC, 0x9A, 0x78, 0x56, | 4043 0xBC, 0x9A, 0x78, 0x56, |
| 6278 0x34, 0x12, | 4044 0x34, 0x12, |
| 6279 | 4045 |
| 6280 // frame type (stream frame with fin) | 4046 // frame type (stream frame with fin) |
| 6281 0xFF, | 4047 0xFF, |
| 6282 // stream id | 4048 // stream id |
| 6283 0x04, 0x03, 0x02, 0x01, | 4049 0x04, 0x03, 0x02, 0x01, |
| 6284 // offset | 4050 // offset |
| 6285 0x54, 0x76, 0x10, 0x32, | 4051 0x54, 0x76, 0x10, 0x32, |
| 6286 0xDC, 0xFE, 0x98, 0xBA, | 4052 0xDC, 0xFE, 0x98, 0xBA, |
| 6287 // data length | 4053 // data length |
| 6288 0x0c, 0x00, | 4054 0x0c, 0x00, |
| 6289 // data | 4055 // data |
| 6290 'h', 'e', 'l', 'l', | 4056 'h', 'e', 'l', 'l', |
| 6291 'o', ' ', 'w', 'o', | 4057 'o', ' ', 'w', 'o', |
| 6292 'r', 'l', 'd', '!', | 4058 'r', 'l', 'd', '!', |
| 6293 | 4059 |
| 6294 // frame type (ack frame) | 4060 // frame type (ack frame) |
| 6295 0x40, | 4061 0x40, |
| 6296 // entropy hash of sent packets till least awaiting - 1. | |
| 6297 0x14, | |
| 6298 // least packet number awaiting an ack | 4062 // least packet number awaiting an ack |
| 6299 0xA0, 0x9A, 0x78, 0x56, | 4063 0xA0, 0x9A, 0x78, 0x56, |
| 6300 0x34, 0x12, | 4064 0x34, 0x12, |
| 6301 // entropy hash of all received packets. | |
| 6302 0x43, | |
| 6303 // largest observed packet number | 4065 // largest observed packet number |
| 6304 0xBF, 0x9A, 0x78, 0x56, | 4066 0xBF, 0x9A, 0x78, 0x56, |
| 6305 0x34, 0x12, | 4067 0x34, 0x12, |
| 6306 // num missing packets | 4068 // num missing packets |
| 6307 0x01, | 4069 0x01, |
| 6308 // missing packet | 4070 // missing packet |
| 6309 0xBE, 0x9A, 0x78, 0x56, | 4071 0xBE, 0x9A, 0x78, 0x56, |
| 6310 0x34, 0x12, | 4072 0x34, 0x12, |
| 6311 }; | 4073 }; |
| 6312 // clang-format on | 4074 // clang-format on |
| 6313 | 4075 |
| 6314 MockFramerVisitor visitor; | 4076 MockFramerVisitor visitor; |
| 6315 framer_.set_visitor(&visitor); | 4077 framer_.set_visitor(&visitor); |
| 6316 EXPECT_CALL(visitor, OnPacket()); | 4078 EXPECT_CALL(visitor, OnPacket()); |
| 6317 EXPECT_CALL(visitor, OnPacketHeader(_)); | 4079 EXPECT_CALL(visitor, OnPacketHeader(_)); |
| 6318 EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false)); | 4080 EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false)); |
| 6319 EXPECT_CALL(visitor, OnAckFrame(_)).Times(0); | 4081 EXPECT_CALL(visitor, OnAckFrame(_)).Times(0); |
| 6320 EXPECT_CALL(visitor, OnPacketComplete()); | 4082 EXPECT_CALL(visitor, OnPacketComplete()); |
| 6321 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); | 4083 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); |
| 6322 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true)); | 4084 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true)); |
| 6323 EXPECT_CALL(visitor, OnDecryptedPacket(_)); | 4085 EXPECT_CALL(visitor, OnDecryptedPacket(_)); |
| 6324 | 4086 |
| 6325 QuicEncryptedPacket encrypted( | 4087 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 6326 AsChars(framer_.version() <= QUIC_VERSION_33 ? packet : packet_34), | |
| 6327 framer_.version() <= QUIC_VERSION_33 ? arraysize(packet) | |
| 6328 : arraysize(packet_34), | |
| 6329 false); | |
| 6330 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 4088 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 6331 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 4089 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 6332 } | 4090 } |
| 6333 | 4091 |
| 6334 static char kTestString[] = "At least 20 characters."; | 4092 static char kTestString[] = "At least 20 characters."; |
| 6335 static QuicStreamId kTestQuicStreamId = 1; | 4093 static QuicStreamId kTestQuicStreamId = 1; |
| 6336 static bool ExpectedStreamFrame(const QuicStreamFrame& frame) { | 4094 static bool ExpectedStreamFrame(const QuicStreamFrame& frame) { |
| 6337 return frame.stream_id == kTestQuicStreamId && !frame.fin && | 4095 return frame.stream_id == kTestQuicStreamId && !frame.fin && |
| 6338 frame.offset == 0 && | 4096 frame.offset == 0 && |
| 6339 string(frame.data_buffer, frame.data_length) == kTestString; | 4097 string(frame.data_buffer, frame.data_length) == kTestString; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6391 | 4149 |
| 6392 MockFramerVisitor visitor; | 4150 MockFramerVisitor visitor; |
| 6393 framer_.set_visitor(&visitor); | 4151 framer_.set_visitor(&visitor); |
| 6394 EXPECT_CALL(visitor, OnPacket()).Times(1); | 4152 EXPECT_CALL(visitor, OnPacket()).Times(1); |
| 6395 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)) | 4153 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)) |
| 6396 .Times(1) | 4154 .Times(1) |
| 6397 .WillOnce(Return(true)); | 4155 .WillOnce(Return(true)); |
| 6398 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)) | 4156 EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)) |
| 6399 .Times(1) | 4157 .Times(1) |
| 6400 .WillOnce(Return(true)); | 4158 .WillOnce(Return(true)); |
| 6401 if (framer_.version() <= QUIC_VERSION_33) { | 4159 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1); |
| 6402 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(0); | |
| 6403 } else { | |
| 6404 EXPECT_CALL(visitor, OnPacketHeader(_)).Times(1); | |
| 6405 } | |
| 6406 EXPECT_CALL(visitor, OnDecryptedPacket(_)).Times(1); | 4160 EXPECT_CALL(visitor, OnDecryptedPacket(_)).Times(1); |
| 6407 EXPECT_CALL(visitor, OnError(_)).Times(1); | 4161 EXPECT_CALL(visitor, OnError(_)).Times(1); |
| 6408 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0); | 4162 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0); |
| 6409 EXPECT_CALL(visitor, OnAckFrame(_)).Times(0); | 4163 EXPECT_CALL(visitor, OnAckFrame(_)).Times(0); |
| 6410 EXPECT_CALL(visitor, OnPacketComplete()).Times(0); | 4164 EXPECT_CALL(visitor, OnPacketComplete()).Times(0); |
| 6411 | 4165 |
| 6412 EXPECT_FALSE(framer_.ProcessPacket(*packet)); | 4166 EXPECT_FALSE(framer_.ProcessPacket(*packet)); |
| 6413 if (framer_.version() <= QUIC_VERSION_33) { | 4167 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); |
| 6414 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); | |
| 6415 } else { | |
| 6416 EXPECT_EQ(QUIC_INVALID_FRAME_DATA, framer_.error()); | |
| 6417 } | |
| 6418 } | 4168 } |
| 6419 | 4169 |
| 6420 // Tests for fuzzing with Dr. Fuzz | 4170 // Tests for fuzzing with Dr. Fuzz |
| 6421 // Xref http://www.chromium.org/developers/testing/dr-fuzz for more details. | 4171 // Xref http://www.chromium.org/developers/testing/dr-fuzz for more details. |
| 6422 #ifdef __cplusplus | 4172 #ifdef __cplusplus |
| 6423 extern "C" { | 4173 extern "C" { |
| 6424 #endif | 4174 #endif |
| 6425 | 4175 |
| 6426 // target function to be fuzzed by Dr. Fuzz | 4176 // target function to be fuzzed by Dr. Fuzz |
| 6427 void QuicFramerFuzzFunc(unsigned char* data, size_t size) { | 4177 void QuicFramerFuzzFunc(unsigned char* data, size_t size) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6473 'o', ' ', 'w', 'o', | 4223 'o', ' ', 'w', 'o', |
| 6474 'r', 'l', 'd', '!', | 4224 'r', 'l', 'd', '!', |
| 6475 }; | 4225 }; |
| 6476 // clang-format on | 4226 // clang-format on |
| 6477 | 4227 |
| 6478 QuicFramerFuzzFunc(packet, arraysize(packet)); | 4228 QuicFramerFuzzFunc(packet, arraysize(packet)); |
| 6479 } | 4229 } |
| 6480 | 4230 |
| 6481 } // namespace test | 4231 } // namespace test |
| 6482 } // namespace net | 4232 } // namespace net |
| OLD | NEW |