Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Side by Side Diff: net/quic/core/quic_framer_test.cc

Issue 2515613002: deprecate FLAGS_quic_disable_pre_34 (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/core/quic_framer.cc ('k') | net/quic/core/quic_multipath_sent_packet_manager_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/core/quic_framer.cc ('k') | net/quic/core/quic_multipath_sent_packet_manager_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698