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

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

Issue 1904213002: QUIC: support diversified keys with version 33. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@hkdf
Patch Set: Rebase Created 4 years, 8 months 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/quic_framer.cc ('k') | net/quic/quic_packet_creator.h » ('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/quic_framer.h" 5 #include "net/quic/quic_framer.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <map> 10 #include <map>
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 QuicPacketNumber packet_number_; 144 QuicPacketNumber packet_number_;
145 string associated_data_; 145 string associated_data_;
146 string plaintext_; 146 string plaintext_;
147 }; 147 };
148 148
149 class TestDecrypter : public QuicDecrypter { 149 class TestDecrypter : public QuicDecrypter {
150 public: 150 public:
151 ~TestDecrypter() override {} 151 ~TestDecrypter() override {}
152 bool SetKey(StringPiece key) override { return true; } 152 bool SetKey(StringPiece key) override { return true; }
153 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } 153 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; }
154 bool SetPreliminaryKey(StringPiece key) override {
155 QUIC_BUG << "should not be called";
156 return false;
157 }
158 bool SetDiversificationNonce(DiversificationNonce key) override {
159 return true;
160 }
154 bool DecryptPacket(QuicPathId path_id, 161 bool DecryptPacket(QuicPathId path_id,
155 QuicPacketNumber packet_number, 162 QuicPacketNumber packet_number,
156 StringPiece associated_data, 163 StringPiece associated_data,
157 StringPiece ciphertext, 164 StringPiece ciphertext,
158 char* output, 165 char* output,
159 size_t* output_length, 166 size_t* output_length,
160 size_t max_output_length) override { 167 size_t max_output_length) override {
161 path_id_ = path_id; 168 path_id_ = path_id;
162 packet_number_ = packet_number; 169 packet_number_ = packet_number;
163 associated_data_ = associated_data.as_string(); 170 associated_data_ = associated_data.as_string();
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 LOG(ERROR) << "Encrypted incorrect plaintext data. expected " 381 LOG(ERROR) << "Encrypted incorrect plaintext data. expected "
375 << packet->Plaintext() 382 << packet->Plaintext()
376 << " actual: " << encrypter_->plaintext_; 383 << " actual: " << encrypter_->plaintext_;
377 return false; 384 return false;
378 } 385 }
379 return true; 386 return true;
380 } 387 }
381 388
382 bool CheckDecryption(const QuicEncryptedPacket& encrypted, 389 bool CheckDecryption(const QuicEncryptedPacket& encrypted,
383 bool includes_version, 390 bool includes_version,
384 bool includes_path_id) { 391 bool includes_path_id,
392 bool includes_diversification_nonce) {
385 if (visitor_.header_->packet_number != decrypter_->packet_number_) { 393 if (visitor_.header_->packet_number != decrypter_->packet_number_) {
386 LOG(ERROR) << "Decrypted incorrect packet number. expected " 394 LOG(ERROR) << "Decrypted incorrect packet number. expected "
387 << visitor_.header_->packet_number 395 << visitor_.header_->packet_number
388 << " actual: " << decrypter_->packet_number_; 396 << " actual: " << decrypter_->packet_number_;
389 return false; 397 return false;
390 } 398 }
391 if (QuicFramer::GetAssociatedDataFromEncryptedPacket( 399 if (QuicFramer::GetAssociatedDataFromEncryptedPacket(
392 encrypted, PACKET_8BYTE_CONNECTION_ID, includes_version, 400 encrypted, PACKET_8BYTE_CONNECTION_ID, includes_version,
393 includes_path_id, 401 includes_path_id, includes_diversification_nonce,
394 PACKET_6BYTE_PACKET_NUMBER) != decrypter_->associated_data_) { 402 PACKET_6BYTE_PACKET_NUMBER) != decrypter_->associated_data_) {
395 LOG(ERROR) << "Decrypted incorrect associated data. expected " 403 LOG(ERROR) << "Decrypted incorrect associated data. expected "
396 << QuicFramer::GetAssociatedDataFromEncryptedPacket( 404 << QuicFramer::GetAssociatedDataFromEncryptedPacket(
397 encrypted, PACKET_8BYTE_CONNECTION_ID, includes_version, 405 encrypted, PACKET_8BYTE_CONNECTION_ID, includes_version,
398 includes_path_id, PACKET_6BYTE_PACKET_NUMBER) 406 includes_path_id, includes_diversification_nonce,
407 PACKET_6BYTE_PACKET_NUMBER)
399 << " actual: " << decrypter_->associated_data_; 408 << " actual: " << decrypter_->associated_data_;
400 return false; 409 return false;
401 } 410 }
402 StringPiece ciphertext(encrypted.AsStringPiece().substr( 411 StringPiece ciphertext(
403 GetStartOfEncryptedData(PACKET_8BYTE_CONNECTION_ID, includes_version, 412 encrypted.AsStringPiece().substr(GetStartOfEncryptedData(
404 includes_path_id, PACKET_6BYTE_PACKET_NUMBER))); 413 PACKET_8BYTE_CONNECTION_ID, includes_version, includes_path_id,
414 includes_diversification_nonce, PACKET_6BYTE_PACKET_NUMBER)));
405 if (ciphertext != decrypter_->ciphertext_) { 415 if (ciphertext != decrypter_->ciphertext_) {
406 LOG(ERROR) << "Decrypted incorrect ciphertext data. expected " 416 LOG(ERROR) << "Decrypted incorrect ciphertext data. expected "
407 << ciphertext << " actual: " << decrypter_->ciphertext_; 417 << ciphertext << " actual: " << decrypter_->ciphertext_;
408 return false; 418 return false;
409 } 419 }
410 return true; 420 return true;
411 } 421 }
412 422
413 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); } 423 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); }
414 424
(...skipping 21 matching lines...) Expand all
436 if (i < kQuicFrameTypeSize + stream_id_size) { 446 if (i < kQuicFrameTypeSize + stream_id_size) {
437 expected_error = "Unable to read stream_id."; 447 expected_error = "Unable to read stream_id.";
438 } else if (i < kQuicFrameTypeSize + stream_id_size + 448 } else if (i < kQuicFrameTypeSize + stream_id_size +
439 kQuicMaxStreamOffsetSize) { 449 kQuicMaxStreamOffsetSize) {
440 expected_error = "Unable to read offset."; 450 expected_error = "Unable to read offset.";
441 } else { 451 } else {
442 expected_error = "Unable to read frame data."; 452 expected_error = "Unable to read frame data.";
443 } 453 }
444 CheckProcessingFails( 454 CheckProcessingFails(
445 packet, 455 packet,
446 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, include_version, 456 i + GetPacketHeaderSize(
447 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 457 PACKET_8BYTE_CONNECTION_ID, include_version, !kIncludePathId,
458 !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER),
448 expected_error, QUIC_INVALID_STREAM_DATA); 459 expected_error, QUIC_INVALID_STREAM_DATA);
449 } 460 }
450 } 461 }
451 462
452 void CheckCalculatePacketNumber(QuicPacketNumber expected_packet_number, 463 void CheckCalculatePacketNumber(QuicPacketNumber expected_packet_number,
453 QuicPacketNumber last_packet_number) { 464 QuicPacketNumber last_packet_number) {
454 QuicPacketNumber wire_packet_number = expected_packet_number & kMask; 465 QuicPacketNumber wire_packet_number = expected_packet_number & kMask;
455 QuicFramerPeer::SetLastPacketNumber(&framer_, last_packet_number); 466 QuicFramerPeer::SetLastPacketNumber(&framer_, last_packet_number);
456 EXPECT_EQ( 467 EXPECT_EQ(
457 expected_packet_number, 468 expected_packet_number,
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 char packet[] = {0x00}; 603 char packet[] = {0x00};
593 QuicEncryptedPacket encrypted(packet, 0, false); 604 QuicEncryptedPacket encrypted(packet, 0, false);
594 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 605 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
595 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); 606 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
596 } 607 }
597 608
598 TEST_P(QuicFramerTest, LargePacket) { 609 TEST_P(QuicFramerTest, LargePacket) {
599 // clang-format off 610 // clang-format off
600 unsigned char packet[kMaxPacketSize + 1] = { 611 unsigned char packet[kMaxPacketSize + 1] = {
601 // public flags (8 byte connection_id) 612 // public flags (8 byte connection_id)
602 0x3C, 613 0x38,
603 // connection_id 614 // connection_id
604 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 615 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
605 // packet number 616 // packet number
606 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 617 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
607 // private flags 618 // private flags
608 0x00, 619 0x00,
609 }; 620 };
621 // clang-format on
610 622
611 memset(packet + GetPacketHeaderSize( 623 const size_t header_size = GetPacketHeaderSize(
612 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId, 624 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId,
613 PACKET_6BYTE_PACKET_NUMBER), 0, 625 !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER);
614 kMaxPacketSize - GetPacketHeaderSize( 626
615 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId, 627 memset(packet + header_size, 0, kMaxPacketSize - header_size);
616 PACKET_6BYTE_PACKET_NUMBER) + 1);
617 // clang-format on
618 628
619 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 629 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
620 EXPECT_DFATAL(framer_.ProcessPacket(encrypted), "Packet too large:1"); 630 EXPECT_DFATAL(framer_.ProcessPacket(encrypted), "Packet too large:1");
621 631
622 ASSERT_TRUE(visitor_.header_.get()); 632 ASSERT_TRUE(visitor_.header_.get());
623 // Make sure we've parsed the packet header, so we can send an error. 633 // Make sure we've parsed the packet header, so we can send an error.
624 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); 634 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
625 // Make sure the correct error is propagated. 635 // Make sure the correct error is propagated.
626 EXPECT_EQ(QUIC_PACKET_TOO_LARGE, framer_.error()); 636 EXPECT_EQ(QUIC_PACKET_TOO_LARGE, framer_.error());
627 } 637 }
628 638
629 TEST_P(QuicFramerTest, PacketHeader) { 639 TEST_P(QuicFramerTest, PacketHeader) {
630 // clang-format off 640 // clang-format off
631 unsigned char packet[] = { 641 unsigned char packet[] = {
632 // public flags (8 byte connection_id) 642 // public flags (8 byte connection_id)
633 0x3C, 643 0x38,
634 // connection_id 644 // connection_id
635 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 645 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
636 // packet number 646 // packet number
637 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 647 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
638 // private flags 648 // private flags
639 0x00, 649 0x00,
640 }; 650 };
641 // clang-format on 651 // clang-format on
642 652
643 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 653 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
644 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 654 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
645 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); 655 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
646 ASSERT_TRUE(visitor_.header_.get()); 656 ASSERT_TRUE(visitor_.header_.get());
647 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); 657 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
648 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); 658 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag);
649 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 659 EXPECT_FALSE(visitor_.header_->public_header.reset_flag);
650 EXPECT_FALSE(visitor_.header_->public_header.version_flag); 660 EXPECT_FALSE(visitor_.header_->public_header.version_flag);
651 EXPECT_FALSE(visitor_.header_->fec_flag); 661 EXPECT_FALSE(visitor_.header_->fec_flag);
652 EXPECT_FALSE(visitor_.header_->entropy_flag); 662 EXPECT_FALSE(visitor_.header_->entropy_flag);
653 EXPECT_EQ(0, visitor_.header_->entropy_hash); 663 EXPECT_EQ(0, visitor_.header_->entropy_hash);
654 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 664 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
655 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 665 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
656 EXPECT_EQ(0u, visitor_.header_->fec_group); 666 EXPECT_EQ(0u, visitor_.header_->fec_group);
657 667
658 // Now test framing boundaries. 668 // Now test framing boundaries.
659 for (size_t i = 0; 669 for (size_t i = 0;
660 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 670 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
661 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER); 671 !kIncludePathId, !kIncludeDiversificationNonce,
672 PACKET_6BYTE_PACKET_NUMBER);
662 ++i) { 673 ++i) {
663 string expected_error; 674 string expected_error;
664 if (i < kConnectionIdOffset) { 675 if (i < kConnectionIdOffset) {
665 expected_error = "Unable to read public flags."; 676 expected_error = "Unable to read public flags.";
666 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { 677 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) {
667 expected_error = "Unable to read ConnectionId."; 678 expected_error = "Unable to read ConnectionId.";
668 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId)) { 679 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId)) {
669 expected_error = "Unable to read packet number."; 680 expected_error = "Unable to read packet number.";
670 } else { 681 } else {
671 expected_error = "Unable to read private flags."; 682 expected_error = "Unable to read private flags.";
672 } 683 }
673 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 684 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
674 } 685 }
675 } 686 }
676 687
677 TEST_P(QuicFramerTest, PacketHeaderWith4ByteConnectionId) {
678 QuicFramerPeer::SetLastSerializedConnectionId(&framer_, kConnectionId);
679
680 // clang-format off
681 unsigned char packet[] = {
682 // public flags (4 byte connection_id)
683 0x38,
684 // connection_id
685 0x10, 0x32, 0x54, 0x76,
686 // packet number
687 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
688 // private flags
689 0x00,
690 };
691 // clang-format on
692
693 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
694 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
695 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
696 ASSERT_TRUE(visitor_.header_.get());
697 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
698 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag);
699 EXPECT_FALSE(visitor_.header_->public_header.reset_flag);
700 EXPECT_FALSE(visitor_.header_->public_header.version_flag);
701 EXPECT_FALSE(visitor_.header_->fec_flag);
702 EXPECT_FALSE(visitor_.header_->entropy_flag);
703 EXPECT_EQ(0, visitor_.header_->entropy_hash);
704 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
705 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
706 EXPECT_EQ(0u, visitor_.header_->fec_group);
707
708 // Now test framing boundaries.
709 for (size_t i = 0;
710 i < GetPacketHeaderSize(PACKET_4BYTE_CONNECTION_ID, !kIncludeVersion,
711 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER);
712 ++i) {
713 string expected_error;
714 if (i < kConnectionIdOffset) {
715 expected_error = "Unable to read public flags.";
716 } else if (i < GetPacketNumberOffset(PACKET_4BYTE_CONNECTION_ID,
717 !kIncludeVersion, !kIncludePathId)) {
718 expected_error = "Unable to read ConnectionId.";
719 } else if (i < GetPrivateFlagsOffset(PACKET_4BYTE_CONNECTION_ID,
720 !kIncludeVersion, !kIncludePathId)) {
721 expected_error = "Unable to read packet number.";
722 } else {
723 expected_error = "Unable to read private flags.";
724 }
725 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
726 }
727 }
728
729 TEST_P(QuicFramerTest, PacketHeader1ByteConnectionId) {
730 QuicFramerPeer::SetLastSerializedConnectionId(&framer_, kConnectionId);
731
732 // clang-format off
733 unsigned char packet[] = {
734 // public flags (1 byte connection_id)
735 0x34,
736 // connection_id
737 0x10,
738 // packet number
739 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
740 // private flags
741 0x00,
742 };
743 // clang-format on
744
745 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
746 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
747 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
748 ASSERT_TRUE(visitor_.header_.get());
749 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
750 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag);
751 EXPECT_FALSE(visitor_.header_->public_header.reset_flag);
752 EXPECT_FALSE(visitor_.header_->public_header.version_flag);
753 EXPECT_FALSE(visitor_.header_->fec_flag);
754 EXPECT_FALSE(visitor_.header_->entropy_flag);
755 EXPECT_EQ(0, visitor_.header_->entropy_hash);
756 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
757 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
758 EXPECT_EQ(0u, visitor_.header_->fec_group);
759
760 // Now test framing boundaries.
761 for (size_t i = 0;
762 i < GetPacketHeaderSize(PACKET_1BYTE_CONNECTION_ID, !kIncludeVersion,
763 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER);
764 ++i) {
765 string expected_error;
766 if (i < kConnectionIdOffset) {
767 expected_error = "Unable to read public flags.";
768 } else if (i < GetPacketNumberOffset(PACKET_1BYTE_CONNECTION_ID,
769 !kIncludeVersion, !kIncludePathId)) {
770 expected_error = "Unable to read ConnectionId.";
771 } else if (i < GetPrivateFlagsOffset(PACKET_1BYTE_CONNECTION_ID,
772 !kIncludeVersion, !kIncludePathId)) {
773 expected_error = "Unable to read packet number.";
774 } else {
775 expected_error = "Unable to read private flags.";
776 }
777 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
778 }
779 }
780
781 TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) { 688 TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) {
782 QuicFramerPeer::SetLastSerializedConnectionId(&framer_, kConnectionId); 689 QuicFramerPeer::SetLastSerializedConnectionId(&framer_, kConnectionId);
783 690
784 // clang-format off 691 // clang-format off
785 unsigned char packet[] = { 692 unsigned char packet[] = {
786 // public flags (0 byte connection_id) 693 // public flags (0 byte connection_id)
787 0x30, 694 0x30,
788 // connection_id 695 // connection_id
789 // packet number 696 // packet number
790 0xBC, 0x9A, 0x78, 0x56, 697 0xBC, 0x9A, 0x78, 0x56,
(...skipping 14 matching lines...) Expand all
805 EXPECT_FALSE(visitor_.header_->fec_flag); 712 EXPECT_FALSE(visitor_.header_->fec_flag);
806 EXPECT_FALSE(visitor_.header_->entropy_flag); 713 EXPECT_FALSE(visitor_.header_->entropy_flag);
807 EXPECT_EQ(0, visitor_.header_->entropy_hash); 714 EXPECT_EQ(0, visitor_.header_->entropy_hash);
808 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 715 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
809 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 716 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
810 EXPECT_EQ(0u, visitor_.header_->fec_group); 717 EXPECT_EQ(0u, visitor_.header_->fec_group);
811 718
812 // Now test framing boundaries. 719 // Now test framing boundaries.
813 for (size_t i = 0; 720 for (size_t i = 0;
814 i < GetPacketHeaderSize(PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion, 721 i < GetPacketHeaderSize(PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
815 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER); 722 !kIncludePathId, !kIncludeDiversificationNonce,
723 PACKET_6BYTE_PACKET_NUMBER);
816 ++i) { 724 ++i) {
817 string expected_error; 725 string expected_error;
818 if (i < kConnectionIdOffset) { 726 if (i < kConnectionIdOffset) {
819 expected_error = "Unable to read public flags."; 727 expected_error = "Unable to read public flags.";
820 } else if (i < GetPacketNumberOffset(PACKET_0BYTE_CONNECTION_ID, 728 } else if (i < GetPacketNumberOffset(PACKET_0BYTE_CONNECTION_ID,
821 !kIncludeVersion, !kIncludePathId)) { 729 !kIncludeVersion, !kIncludePathId)) {
822 expected_error = "Unable to read ConnectionId."; 730 expected_error = "Unable to read ConnectionId.";
823 } else if (i < GetPrivateFlagsOffset(PACKET_0BYTE_CONNECTION_ID, 731 } else if (i < GetPrivateFlagsOffset(PACKET_0BYTE_CONNECTION_ID,
824 !kIncludeVersion, !kIncludePathId)) { 732 !kIncludeVersion, !kIncludePathId)) {
825 expected_error = "Unable to read packet number."; 733 expected_error = "Unable to read packet number.";
826 } else { 734 } else {
827 expected_error = "Unable to read private flags."; 735 expected_error = "Unable to read private flags.";
828 } 736 }
829 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 737 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
830 } 738 }
831 } 739 }
832 740
833 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) { 741 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) {
834 // clang-format off 742 // clang-format off
835 unsigned char packet[] = { 743 unsigned char packet[] = {
836 // public flags (version) 744 // public flags (version)
837 0x3D, 745 0x39,
838 // connection_id 746 // connection_id
839 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 747 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
840 // version tag 748 // version tag
841 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), 749 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
842 // packet number 750 // packet number
843 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 751 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
844 // private flags 752 // private flags
845 0x00, 753 0x00,
846 }; 754 };
847 // clang-format on 755 // clang-format on
(...skipping 10 matching lines...) Expand all
858 EXPECT_FALSE(visitor_.header_->fec_flag); 766 EXPECT_FALSE(visitor_.header_->fec_flag);
859 EXPECT_FALSE(visitor_.header_->entropy_flag); 767 EXPECT_FALSE(visitor_.header_->entropy_flag);
860 EXPECT_EQ(0, visitor_.header_->entropy_hash); 768 EXPECT_EQ(0, visitor_.header_->entropy_hash);
861 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 769 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
862 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 770 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
863 EXPECT_EQ(0u, visitor_.header_->fec_group); 771 EXPECT_EQ(0u, visitor_.header_->fec_group);
864 772
865 // Now test framing boundaries. 773 // Now test framing boundaries.
866 for (size_t i = 0; 774 for (size_t i = 0;
867 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, 775 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, kIncludeVersion,
868 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER); 776 !kIncludePathId, !kIncludeDiversificationNonce,
777 PACKET_6BYTE_PACKET_NUMBER);
869 ++i) { 778 ++i) {
870 string expected_error; 779 string expected_error;
871 if (i < kConnectionIdOffset) { 780 if (i < kConnectionIdOffset) {
872 expected_error = "Unable to read public flags."; 781 expected_error = "Unable to read public flags.";
873 } else if (i < kVersionOffset) { 782 } else if (i < kVersionOffset) {
874 expected_error = "Unable to read ConnectionId."; 783 expected_error = "Unable to read ConnectionId.";
875 } else if (i < GetPacketNumberOffset(kIncludeVersion, !kIncludePathId)) { 784 } else if (i < GetPacketNumberOffset(kIncludeVersion, !kIncludePathId)) {
876 expected_error = "Unable to read protocol version."; 785 expected_error = "Unable to read protocol version.";
877 } else if (i < GetPrivateFlagsOffset(kIncludeVersion, !kIncludePathId)) { 786 } else if (i < GetPrivateFlagsOffset(kIncludeVersion, !kIncludePathId)) {
878 expected_error = "Unable to read packet number."; 787 expected_error = "Unable to read packet number.";
879 } else { 788 } else {
880 expected_error = "Unable to read private flags."; 789 expected_error = "Unable to read private flags.";
881 } 790 }
882 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 791 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
883 } 792 }
884 } 793 }
885 794
886 TEST_P(QuicFramerTest, PacketHeaderWithMultipathFlag) { 795 TEST_P(QuicFramerTest, PacketHeaderWithMultipathFlag) {
887 // clang-format off 796 // clang-format off
888 unsigned char packet[] = { 797 unsigned char packet[] = {
889 // public flags (version) 798 // public flags (version)
890 0x7C, 799 0x78,
891 // connection_id 800 // connection_id
892 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 801 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
893 // path_id 802 // path_id
894 0x42, 803 0x42,
895 // packet number 804 // packet number
896 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 805 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
897 // private flags 806 // private flags
898 0x00, 807 0x00,
899 }; 808 };
900 // clang-format on 809 // clang-format on
901 810
902 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 811 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
903 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 812 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
904 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); 813 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
905 ASSERT_TRUE(visitor_.header_.get()); 814 ASSERT_TRUE(visitor_.header_.get());
906 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, kIncludePathId)); 815 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, kIncludePathId,
816 !kIncludeDiversificationNonce));
907 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); 817 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
908 EXPECT_TRUE(visitor_.header_->public_header.multipath_flag); 818 EXPECT_TRUE(visitor_.header_->public_header.multipath_flag);
909 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 819 EXPECT_FALSE(visitor_.header_->public_header.reset_flag);
910 EXPECT_FALSE(visitor_.header_->public_header.version_flag); 820 EXPECT_FALSE(visitor_.header_->public_header.version_flag);
911 EXPECT_FALSE(visitor_.header_->fec_flag); 821 EXPECT_FALSE(visitor_.header_->fec_flag);
912 EXPECT_FALSE(visitor_.header_->entropy_flag); 822 EXPECT_FALSE(visitor_.header_->entropy_flag);
913 EXPECT_EQ(0, visitor_.header_->entropy_hash); 823 EXPECT_EQ(0, visitor_.header_->entropy_hash);
914 EXPECT_EQ(kPathId, visitor_.header_->path_id); 824 EXPECT_EQ(kPathId, visitor_.header_->path_id);
915 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 825 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
916 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 826 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
917 EXPECT_EQ(0u, visitor_.header_->fec_group); 827 EXPECT_EQ(0u, visitor_.header_->fec_group);
918 828
919 // Now test framing boundaries. 829 // Now test framing boundaries.
920 for (size_t i = 0; 830 for (size_t i = 0;
921 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 831 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
922 kIncludePathId, PACKET_6BYTE_PACKET_NUMBER); 832 kIncludePathId, !kIncludeDiversificationNonce,
833 PACKET_6BYTE_PACKET_NUMBER);
923 ++i) { 834 ++i) {
924 string expected_error; 835 string expected_error;
925 if (i < kConnectionIdOffset) { 836 if (i < kConnectionIdOffset) {
926 expected_error = "Unable to read public flags."; 837 expected_error = "Unable to read public flags.";
927 } else if (i < 838 } else if (i <
928 GetPathIdOffset(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion)) { 839 GetPathIdOffset(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion)) {
929 expected_error = "Unable to read ConnectionId."; 840 expected_error = "Unable to read ConnectionId.";
930 } else if (i < GetPacketNumberOffset(!kIncludeVersion, kIncludePathId)) { 841 } else if (i < GetPacketNumberOffset(!kIncludeVersion, kIncludePathId)) {
931 expected_error = "Unable to read path id."; 842 expected_error = "Unable to read path id.";
932 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, kIncludePathId)) { 843 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, kIncludePathId)) {
933 expected_error = "Unable to read packet number."; 844 expected_error = "Unable to read packet number.";
934 } else { 845 } else {
935 expected_error = "Unable to read private flags."; 846 expected_error = "Unable to read private flags.";
936 } 847 }
937 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 848 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
938 } 849 }
939 } 850 }
940 851
941 TEST_P(QuicFramerTest, PacketHeaderWithBothVersionFlagAndMultipathFlag) { 852 TEST_P(QuicFramerTest, PacketHeaderWithBothVersionFlagAndMultipathFlag) {
942 // clang-format off 853 // clang-format off
943 unsigned char packet[] = { 854 unsigned char packet[] = {
944 // public flags (version) 855 // public flags (version)
945 0x7D, 856 0x79,
946 // connection_id 857 // connection_id
947 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 858 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
948 // version tag 859 // version tag
949 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), 860 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
950 // path_id 861 // path_id
951 0x42, 862 0x42,
952 // packet number 863 // packet number
953 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 864 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
954 // private flags 865 // private flags
955 0x00, 866 0x00,
956 }; 867 };
957 // clang-format on 868 // clang-format on
958 869
959 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 870 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
960 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 871 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
961 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); 872 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
962 ASSERT_TRUE(visitor_.header_.get()); 873 ASSERT_TRUE(visitor_.header_.get());
963 EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion, kIncludePathId)); 874 EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion, kIncludePathId,
875 !kIncludeDiversificationNonce));
964 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); 876 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
965 EXPECT_TRUE(visitor_.header_->public_header.multipath_flag); 877 EXPECT_TRUE(visitor_.header_->public_header.multipath_flag);
966 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 878 EXPECT_FALSE(visitor_.header_->public_header.reset_flag);
967 EXPECT_TRUE(visitor_.header_->public_header.version_flag); 879 EXPECT_TRUE(visitor_.header_->public_header.version_flag);
968 EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]); 880 EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]);
969 EXPECT_FALSE(visitor_.header_->fec_flag); 881 EXPECT_FALSE(visitor_.header_->fec_flag);
970 EXPECT_FALSE(visitor_.header_->entropy_flag); 882 EXPECT_FALSE(visitor_.header_->entropy_flag);
971 EXPECT_EQ(0, visitor_.header_->entropy_hash); 883 EXPECT_EQ(0, visitor_.header_->entropy_hash);
972 EXPECT_EQ(kPathId, visitor_.header_->path_id); 884 EXPECT_EQ(kPathId, visitor_.header_->path_id);
973 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 885 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
974 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 886 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
975 EXPECT_EQ(0u, visitor_.header_->fec_group); 887 EXPECT_EQ(0u, visitor_.header_->fec_group);
976 888
977 // Now test framing boundaries. 889 // Now test framing boundaries.
978 for (size_t i = 0; 890 for (size_t i = 0;
979 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 891 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
980 kIncludePathId, PACKET_6BYTE_PACKET_NUMBER); 892 kIncludePathId, !kIncludeDiversificationNonce,
893 PACKET_6BYTE_PACKET_NUMBER);
981 ++i) { 894 ++i) {
982 string expected_error; 895 string expected_error;
983 if (i < kConnectionIdOffset) { 896 if (i < kConnectionIdOffset) {
984 expected_error = "Unable to read public flags."; 897 expected_error = "Unable to read public flags.";
985 } else if (i < kVersionOffset) { 898 } else if (i < kVersionOffset) {
986 expected_error = "Unable to read ConnectionId."; 899 expected_error = "Unable to read ConnectionId.";
987 } else if (i < 900 } else if (i <
988 GetPathIdOffset(PACKET_8BYTE_CONNECTION_ID, kIncludeVersion)) { 901 GetPathIdOffset(PACKET_8BYTE_CONNECTION_ID, kIncludeVersion)) {
989 expected_error = "Unable to read protocol version."; 902 expected_error = "Unable to read protocol version.";
990 } else if (i < GetPacketNumberOffset(kIncludeVersion, kIncludePathId)) { 903 } else if (i < GetPacketNumberOffset(kIncludeVersion, kIncludePathId)) {
991 expected_error = "Unable to read path id."; 904 expected_error = "Unable to read path id.";
992 } else if (i < GetPrivateFlagsOffset(kIncludeVersion, kIncludePathId)) { 905 } else if (i < GetPrivateFlagsOffset(kIncludeVersion, kIncludePathId)) {
993 expected_error = "Unable to read packet number."; 906 expected_error = "Unable to read packet number.";
994 } else { 907 } else {
995 expected_error = "Unable to read private flags."; 908 expected_error = "Unable to read private flags.";
996 } 909 }
997 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 910 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
998 } 911 }
999 } 912 }
1000 913
1001 TEST_P(QuicFramerTest, PacketHeaderWithPathChange) { 914 TEST_P(QuicFramerTest, PacketHeaderWithPathChange) {
1002 // Packet 1 from path 0x42. 915 // Packet 1 from path 0x42.
1003 // clang-format off 916 // clang-format off
1004 unsigned char packet1[] = { 917 unsigned char packet1[] = {
1005 // public flags (version) 918 // public flags (version)
1006 0x7C, 919 0x78,
1007 // connection_id 920 // connection_id
1008 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 921 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1009 // path_id 922 // path_id
1010 0x42, 923 0x42,
1011 // packet number 924 // packet number
1012 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 925 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
1013 // private flags 926 // private flags
1014 0x00, 927 0x00,
1015 }; 928 };
1016 // clang-format on 929 // clang-format on
1017 930
1018 EXPECT_EQ(0u, QuicFramerPeer::GetLastPacketNumber(&framer_)); 931 EXPECT_EQ(0u, QuicFramerPeer::GetLastPacketNumber(&framer_));
1019 EXPECT_EQ(kInvalidPathId, QuicFramerPeer::GetLastPathId(&framer_)); 932 EXPECT_EQ(kInvalidPathId, QuicFramerPeer::GetLastPathId(&framer_));
1020 QuicEncryptedPacket encrypted1(AsChars(packet1), arraysize(packet1), false); 933 QuicEncryptedPacket encrypted1(AsChars(packet1), arraysize(packet1), false);
1021 EXPECT_FALSE(framer_.ProcessPacket(encrypted1)); 934 EXPECT_FALSE(framer_.ProcessPacket(encrypted1));
1022 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); 935 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1023 ASSERT_TRUE(visitor_.header_.get()); 936 ASSERT_TRUE(visitor_.header_.get());
1024 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); 937 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
1025 EXPECT_EQ(kPathId, visitor_.header_->path_id); 938 EXPECT_EQ(kPathId, visitor_.header_->path_id);
1026 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 939 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1027 EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLastPacketNumber(&framer_)); 940 EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLastPacketNumber(&framer_));
1028 EXPECT_EQ(kPathId, QuicFramerPeer::GetLastPathId(&framer_)); 941 EXPECT_EQ(kPathId, QuicFramerPeer::GetLastPathId(&framer_));
1029 942
1030 // Packet 2 from default path. 943 // Packet 2 from default path.
1031 // clang-format off 944 // clang-format off
1032 unsigned char packet2[] = { 945 unsigned char packet2[] = {
1033 // public flags (version) 946 // public flags (version)
1034 0x7C, 947 0x78,
1035 // connection_id 948 // connection_id
1036 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 949 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1037 // path_id 950 // path_id
1038 0x00, 951 0x00,
1039 // packet number 952 // packet number
1040 0xCC, 0x9A, 0x78, 0x56, 0x34, 0x12, 953 0xCC, 0x9A, 0x78, 0x56, 0x34, 0x12,
1041 // private flags 954 // private flags
1042 0x00, 955 0x00,
1043 }; 956 };
1044 // clang-format on 957 // clang-format on
1045 958
1046 QuicEncryptedPacket encrypted2(AsChars(packet2), arraysize(packet2), false); 959 QuicEncryptedPacket encrypted2(AsChars(packet2), arraysize(packet2), false);
1047 EXPECT_FALSE(framer_.ProcessPacket(encrypted2)); 960 EXPECT_FALSE(framer_.ProcessPacket(encrypted2));
1048 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); 961 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1049 ASSERT_TRUE(visitor_.header_.get()); 962 ASSERT_TRUE(visitor_.header_.get());
1050 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); 963 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
1051 EXPECT_EQ(kDefaultPathId, visitor_.header_->path_id); 964 EXPECT_EQ(kDefaultPathId, visitor_.header_->path_id);
1052 EXPECT_EQ(kPacketNumber + 16, visitor_.header_->packet_number); 965 EXPECT_EQ(kPacketNumber + 16, visitor_.header_->packet_number);
1053 EXPECT_EQ(kPacketNumber + 16, QuicFramerPeer::GetLastPacketNumber(&framer_)); 966 EXPECT_EQ(kPacketNumber + 16, QuicFramerPeer::GetLastPacketNumber(&framer_));
1054 EXPECT_EQ(kDefaultPathId, QuicFramerPeer::GetLastPathId(&framer_)); 967 EXPECT_EQ(kDefaultPathId, QuicFramerPeer::GetLastPathId(&framer_));
1055 968
1056 // Packet 3 from path 0x42. 969 // Packet 3 from path 0x42.
1057 // clang-format off 970 // clang-format off
1058 unsigned char packet3[] = { 971 unsigned char packet3[] = {
1059 // public flags (version) 972 // public flags (version)
1060 0x7C, 973 0x78,
1061 // connection_id 974 // connection_id
1062 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 975 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1063 // path_id 976 // path_id
1064 0x42, 977 0x42,
1065 // packet number 978 // packet number
1066 0xBD, 0x9A, 0x78, 0x56, 0x34, 0x12, 979 0xBD, 0x9A, 0x78, 0x56, 0x34, 0x12,
1067 // private flags 980 // private flags
1068 0x00, 981 0x00,
1069 }; 982 };
1070 // clang-format on 983 // clang-format on
1071 984
1072 QuicEncryptedPacket encrypted3(AsChars(packet3), arraysize(packet3), false); 985 QuicEncryptedPacket encrypted3(AsChars(packet3), arraysize(packet3), false);
1073 EXPECT_FALSE(framer_.ProcessPacket(encrypted3)); 986 EXPECT_FALSE(framer_.ProcessPacket(encrypted3));
1074 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); 987 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1075 ASSERT_TRUE(visitor_.header_.get()); 988 ASSERT_TRUE(visitor_.header_.get());
1076 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); 989 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
1077 EXPECT_EQ(kPathId, visitor_.header_->path_id); 990 EXPECT_EQ(kPathId, visitor_.header_->path_id);
1078 EXPECT_EQ(kPacketNumber + 1, visitor_.header_->packet_number); 991 EXPECT_EQ(kPacketNumber + 1, visitor_.header_->packet_number);
1079 EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLastPacketNumber(&framer_)); 992 EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLastPacketNumber(&framer_));
1080 EXPECT_EQ(kPathId, QuicFramerPeer::GetLastPathId(&framer_)); 993 EXPECT_EQ(kPathId, QuicFramerPeer::GetLastPathId(&framer_));
1081 } 994 }
1082 995
1083 TEST_P(QuicFramerTest, ReceivedPacketOnClosedPath) { 996 TEST_P(QuicFramerTest, ReceivedPacketOnClosedPath) {
1084 // Packet 1 from path 0x42. 997 // Packet 1 from path 0x42.
1085 // clang-format off 998 // clang-format off
1086 unsigned char packet[] = { 999 unsigned char packet[] = {
1087 // public flags (version) 1000 // public flags (version)
1088 0x7C, 1001 0x78,
1089 // connection_id 1002 // connection_id
1090 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 1003 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1091 // path_id 1004 // path_id
1092 0x42, 1005 0x42,
1093 // packet number 1006 // packet number
1094 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 1007 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
1095 // private flags 1008 // private flags
1096 0x00, 1009 0x00,
1097 }; 1010 };
1098 // clang-format on 1011 // clang-format on
1099 1012
1100 framer_.OnPathClosed(kPathId); 1013 framer_.OnPathClosed(kPathId);
1101 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1014 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1102 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 1015 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
1103 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1016 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1104 EXPECT_EQ(0u, QuicFramerPeer::GetLastPacketNumber(&framer_)); 1017 EXPECT_EQ(0u, QuicFramerPeer::GetLastPacketNumber(&framer_));
1105 EXPECT_EQ(kInvalidPathId, QuicFramerPeer::GetLastPathId(&framer_)); 1018 EXPECT_EQ(kInvalidPathId, QuicFramerPeer::GetLastPathId(&framer_));
1106 } 1019 }
1107 1020
1108 TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) { 1021 TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) {
1109 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2); 1022 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2);
1110 1023
1111 // clang-format off 1024 // clang-format off
1112 unsigned char packet[] = { 1025 unsigned char packet[] = {
1113 // public flags (8 byte connection_id and 4 byte packet number) 1026 // public flags (8 byte connection_id and 4 byte packet number)
1114 0x2C, 1027 0x28,
1115 // connection_id 1028 // connection_id
1116 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 1029 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1117 // packet number 1030 // packet number
1118 0xBC, 0x9A, 0x78, 0x56, 1031 0xBC, 0x9A, 0x78, 0x56,
1119 // private flags 1032 // private flags
1120 0x00, 1033 0x00,
1121 }; 1034 };
1122 // clang-format on 1035 // clang-format on
1123 1036
1124 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1037 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1125 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 1038 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
1126 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); 1039 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1127 ASSERT_TRUE(visitor_.header_.get()); 1040 ASSERT_TRUE(visitor_.header_.get());
1128 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); 1041 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
1129 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); 1042 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag);
1130 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 1043 EXPECT_FALSE(visitor_.header_->public_header.reset_flag);
1131 EXPECT_FALSE(visitor_.header_->public_header.version_flag); 1044 EXPECT_FALSE(visitor_.header_->public_header.version_flag);
1132 EXPECT_FALSE(visitor_.header_->fec_flag); 1045 EXPECT_FALSE(visitor_.header_->fec_flag);
1133 EXPECT_FALSE(visitor_.header_->entropy_flag); 1046 EXPECT_FALSE(visitor_.header_->entropy_flag);
1134 EXPECT_EQ(0, visitor_.header_->entropy_hash); 1047 EXPECT_EQ(0, visitor_.header_->entropy_hash);
1135 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 1048 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1136 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 1049 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
1137 EXPECT_EQ(0u, visitor_.header_->fec_group); 1050 EXPECT_EQ(0u, visitor_.header_->fec_group);
1138 1051
1139 // Now test framing boundaries. 1052 // Now test framing boundaries.
1140 for (size_t i = 0; 1053 for (size_t i = 0;
1141 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 1054 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
1142 !kIncludePathId, PACKET_4BYTE_PACKET_NUMBER); 1055 !kIncludePathId, !kIncludeDiversificationNonce,
1056 PACKET_4BYTE_PACKET_NUMBER);
1143 ++i) { 1057 ++i) {
1144 string expected_error; 1058 string expected_error;
1145 if (i < kConnectionIdOffset) { 1059 if (i < kConnectionIdOffset) {
1146 expected_error = "Unable to read public flags."; 1060 expected_error = "Unable to read public flags.";
1147 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { 1061 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) {
1148 expected_error = "Unable to read ConnectionId."; 1062 expected_error = "Unable to read ConnectionId.";
1149 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId, 1063 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId,
1150 PACKET_4BYTE_PACKET_NUMBER)) { 1064 PACKET_4BYTE_PACKET_NUMBER)) {
1151 expected_error = "Unable to read packet number."; 1065 expected_error = "Unable to read packet number.";
1152 } else { 1066 } else {
1153 expected_error = "Unable to read private flags."; 1067 expected_error = "Unable to read private flags.";
1154 } 1068 }
1155 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 1069 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
1156 } 1070 }
1157 } 1071 }
1158 1072
1159 TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) { 1073 TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) {
1160 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2); 1074 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2);
1161 1075
1162 // clang-format off 1076 // clang-format off
1163 unsigned char packet[] = { 1077 unsigned char packet[] = {
1164 // public flags (8 byte connection_id and 2 byte packet number) 1078 // public flags (8 byte connection_id and 2 byte packet number)
1165 0x1C, 1079 0x18,
1166 // connection_id 1080 // connection_id
1167 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 1081 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1168 // packet number 1082 // packet number
1169 0xBC, 0x9A, 1083 0xBC, 0x9A,
1170 // private flags 1084 // private flags
1171 0x00, 1085 0x00,
1172 }; 1086 };
1173 // clang-format on 1087 // clang-format on
1174 1088
1175 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1089 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1176 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 1090 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
1177 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); 1091 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1178 ASSERT_TRUE(visitor_.header_.get()); 1092 ASSERT_TRUE(visitor_.header_.get());
1179 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); 1093 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
1180 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); 1094 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag);
1181 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 1095 EXPECT_FALSE(visitor_.header_->public_header.reset_flag);
1182 EXPECT_FALSE(visitor_.header_->public_header.version_flag); 1096 EXPECT_FALSE(visitor_.header_->public_header.version_flag);
1183 EXPECT_FALSE(visitor_.header_->fec_flag); 1097 EXPECT_FALSE(visitor_.header_->fec_flag);
1184 EXPECT_FALSE(visitor_.header_->entropy_flag); 1098 EXPECT_FALSE(visitor_.header_->entropy_flag);
1185 EXPECT_EQ(0, visitor_.header_->entropy_hash); 1099 EXPECT_EQ(0, visitor_.header_->entropy_hash);
1186 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 1100 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1187 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 1101 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
1188 EXPECT_EQ(0u, visitor_.header_->fec_group); 1102 EXPECT_EQ(0u, visitor_.header_->fec_group);
1189 1103
1190 // Now test framing boundaries. 1104 // Now test framing boundaries.
1191 for (size_t i = 0; 1105 for (size_t i = 0;
1192 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 1106 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
1193 !kIncludePathId, PACKET_2BYTE_PACKET_NUMBER); 1107 !kIncludePathId, !kIncludeDiversificationNonce,
1108 PACKET_2BYTE_PACKET_NUMBER);
1194 ++i) { 1109 ++i) {
1195 string expected_error; 1110 string expected_error;
1196 if (i < kConnectionIdOffset) { 1111 if (i < kConnectionIdOffset) {
1197 expected_error = "Unable to read public flags."; 1112 expected_error = "Unable to read public flags.";
1198 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { 1113 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) {
1199 expected_error = "Unable to read ConnectionId."; 1114 expected_error = "Unable to read ConnectionId.";
1200 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId, 1115 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId,
1201 PACKET_2BYTE_PACKET_NUMBER)) { 1116 PACKET_2BYTE_PACKET_NUMBER)) {
1202 expected_error = "Unable to read packet number."; 1117 expected_error = "Unable to read packet number.";
1203 } else { 1118 } else {
1204 expected_error = "Unable to read private flags."; 1119 expected_error = "Unable to read private flags.";
1205 } 1120 }
1206 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 1121 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
1207 } 1122 }
1208 } 1123 }
1209 1124
1210 TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) { 1125 TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) {
1211 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2); 1126 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2);
1212 1127
1213 // clang-format off 1128 // clang-format off
1214 unsigned char packet[] = { 1129 unsigned char packet[] = {
1215 // public flags (8 byte connection_id and 1 byte packet number) 1130 // public flags (8 byte connection_id and 1 byte packet number)
1216 0x0C, 1131 0x08,
1217 // connection_id 1132 // connection_id
1218 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 1133 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1219 // packet number 1134 // packet number
1220 0xBC, 1135 0xBC,
1221 // private flags 1136 // private flags
1222 0x00, 1137 0x00,
1223 }; 1138 };
1224 // clang-format on 1139 // clang-format on
1225 1140
1226 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1141 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1227 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); 1142 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
1228 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); 1143 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
1229 ASSERT_TRUE(visitor_.header_.get()); 1144 ASSERT_TRUE(visitor_.header_.get());
1230 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); 1145 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
1231 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag); 1146 EXPECT_FALSE(visitor_.header_->public_header.multipath_flag);
1232 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); 1147 EXPECT_FALSE(visitor_.header_->public_header.reset_flag);
1233 EXPECT_FALSE(visitor_.header_->public_header.version_flag); 1148 EXPECT_FALSE(visitor_.header_->public_header.version_flag);
1234 EXPECT_FALSE(visitor_.header_->fec_flag); 1149 EXPECT_FALSE(visitor_.header_->fec_flag);
1235 EXPECT_FALSE(visitor_.header_->entropy_flag); 1150 EXPECT_FALSE(visitor_.header_->entropy_flag);
1236 EXPECT_EQ(0, visitor_.header_->entropy_hash); 1151 EXPECT_EQ(0, visitor_.header_->entropy_hash);
1237 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 1152 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1238 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 1153 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
1239 EXPECT_EQ(0u, visitor_.header_->fec_group); 1154 EXPECT_EQ(0u, visitor_.header_->fec_group);
1240 1155
1241 // Now test framing boundaries. 1156 // Now test framing boundaries.
1242 for (size_t i = 0; 1157 for (size_t i = 0;
1243 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 1158 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
1244 !kIncludePathId, PACKET_1BYTE_PACKET_NUMBER); 1159 !kIncludePathId, !kIncludeDiversificationNonce,
1160 PACKET_1BYTE_PACKET_NUMBER);
1245 ++i) { 1161 ++i) {
1246 string expected_error; 1162 string expected_error;
1247 if (i < kConnectionIdOffset) { 1163 if (i < kConnectionIdOffset) {
1248 expected_error = "Unable to read public flags."; 1164 expected_error = "Unable to read public flags.";
1249 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { 1165 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) {
1250 expected_error = "Unable to read ConnectionId."; 1166 expected_error = "Unable to read ConnectionId.";
1251 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId, 1167 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId,
1252 PACKET_1BYTE_PACKET_NUMBER)) { 1168 PACKET_1BYTE_PACKET_NUMBER)) {
1253 expected_error = "Unable to read packet number."; 1169 expected_error = "Unable to read packet number.";
1254 } else { 1170 } else {
1255 expected_error = "Unable to read private flags."; 1171 expected_error = "Unable to read private flags.";
1256 } 1172 }
1257 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 1173 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
1258 } 1174 }
1259 } 1175 }
1260 1176
1261 TEST_P(QuicFramerTest, InvalidPublicFlag) { 1177 TEST_P(QuicFramerTest, InvalidPublicFlag) {
1262 // clang-format off 1178 // clang-format off
1263 unsigned char packet[] = { 1179 unsigned char packet[] = {
1264 // public flags: all flags set but the public reset flag and version flag. 1180 // public flags: all flags set but the public reset flag and version flag.
1265 0xFC, 1181 0xF8,
1266 // connection_id 1182 // connection_id
1267 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 1183 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1268 // packet number 1184 // packet number
1269 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 1185 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
1270 // private flags 1186 // private flags
1271 0x00, 1187 0x00,
1272 1188
1273 // frame type (padding) 1189 // frame type (padding)
1274 0x00, 1190 0x00,
1275 0x00, 0x00, 0x00, 0x00 1191 0x00, 0x00, 0x00, 0x00
1276 }; 1192 };
1277 // clang-format on 1193 // clang-format on
1278 1194
1279 CheckProcessingFails(packet, arraysize(packet), "Illegal public flags value.", 1195 CheckProcessingFails(packet, arraysize(packet), "Illegal public flags value.",
1280 QUIC_INVALID_PACKET_HEADER); 1196 QUIC_INVALID_PACKET_HEADER);
1281 1197
1282 // Now turn off validation. 1198 // Now turn off validation.
1283 framer_.set_validate_flags(false); 1199 framer_.set_validate_flags(false);
1284 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1200 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1285 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1201 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1286 }; 1202 };
1287 1203
1204 TEST_P(QuicFramerTest, PacketWithDiversificationNonce) {
1205 // clang-format off
1206 unsigned char packet[] = {
1207 // public flags: includes nonce flag
1208 0x7C,
1209 // connection_id
1210 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1211 // nonce
1212 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1213 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1214 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1215 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1216 // packet number
1217 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
1218 // private flags
1219 0x00,
1220
1221 // frame type (padding)
1222 0x00,
1223 0x00, 0x00, 0x00, 0x00
1224 };
1225 // clang-format on
1226
1227 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1228 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
1229 if (framer_.version() > QUIC_VERSION_32) {
1230 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1231 ASSERT_TRUE(visitor_.public_header_->nonce != nullptr);
1232 for (char i = 0; i < 32; ++i) {
1233 EXPECT_EQ(i, (*visitor_.public_header_->nonce)[static_cast<int>(i)]);
1234 }
1235 } else if (framer_.version() < QUIC_VERSION_32) {
1236 // Packet is successfully parsed by accident.
1237 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1238 ASSERT_TRUE(visitor_.public_header_ != nullptr);
1239 } else {
1240 EXPECT_FALSE(framer_.ProcessPacket(encrypted));
1241 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error());
1242 EXPECT_EQ("Illegal private flags value.", framer_.detailed_error());
1243 }
1244 };
1245
1288 TEST_P(QuicFramerTest, InvalidPublicFlagWithMatchingVersions) { 1246 TEST_P(QuicFramerTest, InvalidPublicFlagWithMatchingVersions) {
1289 // clang-format off 1247 // clang-format off
1290 unsigned char packet[] = { 1248 unsigned char packet[] = {
1291 // public flags (8 byte connection_id and version flag and an unknown flag) 1249 // public flags (8 byte connection_id and version flag and an unknown flag)
1292 0x8D, 1250 0x8D,
1293 // connection_id 1251 // connection_id
1294 0x10, 0x32, 0x54, 0x76, 1252 0x10, 0x32, 0x54, 0x76,
1295 0x98, 0xBA, 0xDC, 0xFE, 1253 0x98, 0xBA, 0xDC, 0xFE,
1296 // version tag 1254 // version tag
1297 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), 1255 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
1298 // packet number 1256 // packet number
1299 0xBC, 0x9A, 0x78, 0x56, 1257 0xBC, 0x9A, 0x78, 0x56,
1300 0x34, 0x12, 1258 0x34, 0x12,
1301 // private flags 1259 // private flags
1302 0x00, 1260 0x00,
1303 1261
1304 // frame type (padding) 1262 // frame type (padding)
1305 0x00, 1263 0x00,
1306 0x00, 0x00, 0x00, 0x00 1264 0x00, 0x00, 0x00, 0x00
1307 }; 1265 };
1308 // clang-format on 1266 // clang-format on
1309 CheckProcessingFails(packet, arraysize(packet), "Illegal public flags value.", 1267 CheckProcessingFails(packet, arraysize(packet), "Illegal public flags value.",
1310 QUIC_INVALID_PACKET_HEADER); 1268 QUIC_INVALID_PACKET_HEADER);
1311 }; 1269 };
1312 1270
1313 TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) { 1271 TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) {
1314 // clang-format off 1272 // clang-format off
1315 unsigned char packet[] = { 1273 unsigned char packet[] = {
1316 // public flags (8 byte connection_id, version flag and an unknown flag) 1274 // public flags (8 byte connection_id, version flag and an unknown flag)
1317 0x7D, 1275 0x79,
1318 // connection_id 1276 // connection_id
1319 0x10, 0x32, 0x54, 0x76, 1277 0x10, 0x32, 0x54, 0x76,
1320 0x98, 0xBA, 0xDC, 0xFE, 1278 0x98, 0xBA, 0xDC, 0xFE,
1321 // version tag 1279 // version tag
1322 'Q', '0', '0', '0', 1280 'Q', '0', '0', '0',
1323 // packet number 1281 // packet number
1324 0xBC, 0x9A, 0x78, 0x56, 1282 0xBC, 0x9A, 0x78, 0x56,
1325 0x34, 0x12, 1283 0x34, 0x12,
1326 // private flags 1284 // private flags
1327 0x00, 1285 0x00,
1328 1286
1329 // frame type (padding frame) 1287 // frame type (padding frame)
1330 0x00, 1288 0x00,
1331 0x00, 0x00, 0x00, 0x00 1289 0x00, 0x00, 0x00, 0x00
1332 }; 1290 };
1333 // clang-format on 1291 // clang-format on
1334 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1292 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1335 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1293 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1336 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1294 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1337 ASSERT_TRUE(visitor_.header_.get()); 1295 ASSERT_TRUE(visitor_.header_.get());
1338 EXPECT_EQ(0, visitor_.frame_count_); 1296 EXPECT_EQ(0, visitor_.frame_count_);
1339 EXPECT_EQ(1, visitor_.version_mismatch_); 1297 EXPECT_EQ(1, visitor_.version_mismatch_);
1340 }; 1298 };
1341 1299
1342 TEST_P(QuicFramerTest, InvalidPrivateFlag) { 1300 TEST_P(QuicFramerTest, InvalidPrivateFlag) {
1343 // clang-format off 1301 // clang-format off
1344 unsigned char packet[] = { 1302 unsigned char packet[] = {
1345 // public flags (8 byte connection_id) 1303 // public flags (8 byte connection_id)
1346 0x3C, 1304 0x38,
1347 // connection_id 1305 // connection_id
1348 0x10, 0x32, 0x54, 0x76, 1306 0x10, 0x32, 0x54, 0x76,
1349 0x98, 0xBA, 0xDC, 0xFE, 1307 0x98, 0xBA, 0xDC, 0xFE,
1350 // packet number 1308 // packet number
1351 0xBC, 0x9A, 0x78, 0x56, 1309 0xBC, 0x9A, 0x78, 0x56,
1352 0x34, 0x12, 1310 0x34, 0x12,
1353 // private flags 1311 // private flags
1354 0x10, 1312 0x10,
1355 1313
1356 // frame type (padding) 1314 // frame type (padding)
1357 0x00, 1315 0x00,
1358 0x00, 0x00, 0x00, 0x00 1316 0x00, 0x00, 0x00, 0x00
1359 }; 1317 };
1360 // clang-format on 1318 // clang-format on
1361 CheckProcessingFails(packet, arraysize(packet), 1319 CheckProcessingFails(packet, arraysize(packet),
1362 "Illegal private flags value.", 1320 "Illegal private flags value.",
1363 QUIC_INVALID_PACKET_HEADER); 1321 QUIC_INVALID_PACKET_HEADER);
1364 }; 1322 };
1365 1323
1366 TEST_P(QuicFramerTest, InvalidFECGroupOffset) { 1324 TEST_P(QuicFramerTest, InvalidFECGroupOffset) {
1367 // clang-format off 1325 // clang-format off
1368 unsigned char packet[] = { 1326 unsigned char packet[] = {
1369 // public flags (8 byte connection_id) 1327 // public flags (8 byte connection_id)
1370 0x3C, 1328 0x38,
1371 // connection_id 1329 // connection_id
1372 0x10, 0x32, 0x54, 0x76, 1330 0x10, 0x32, 0x54, 0x76,
1373 0x98, 0xBA, 0xDC, 0xFE, 1331 0x98, 0xBA, 0xDC, 0xFE,
1374 // packet number 1332 // packet number
1375 0x01, 0x00, 0x00, 0x00, 1333 0x01, 0x00, 0x00, 0x00,
1376 0x00, 0x00, 1334 0x00, 0x00,
1377 // private flags (fec group) 1335 // private flags (fec group)
1378 0x02, 1336 0x02,
1379 // first fec protected packet offset 1337 // first fec protected packet offset
1380 0x10 1338 0x10
1381 }; 1339 };
1382 // clang-format on 1340 // clang-format on
1383 if (framer_.version() > QUIC_VERSION_31) { 1341 if (framer_.version() > QUIC_VERSION_31) {
1384 CheckProcessingFails(packet, arraysize(packet), 1342 CheckProcessingFails(packet, arraysize(packet),
1385 "Illegal private flags value.", 1343 "Illegal private flags value.",
1386 QUIC_INVALID_PACKET_HEADER); 1344 QUIC_INVALID_PACKET_HEADER);
1387 } else { 1345 } else {
1388 CheckProcessingFails(packet, arraysize(packet), 1346 CheckProcessingFails(packet, arraysize(packet),
1389 "First fec protected packet offset must be less " 1347 "First fec protected packet offset must be less "
1390 "than the packet number.", 1348 "than the packet number.",
1391 QUIC_INVALID_PACKET_HEADER); 1349 QUIC_INVALID_PACKET_HEADER);
1392 } 1350 }
1393 }; 1351 };
1394 1352
1395 TEST_P(QuicFramerTest, PaddingFrame) { 1353 TEST_P(QuicFramerTest, PaddingFrame) {
1396 // clang-format off 1354 // clang-format off
1397 unsigned char packet[] = { 1355 unsigned char packet[] = {
1398 // public flags (8 byte connection_id) 1356 // public flags (8 byte connection_id)
1399 0x3C, 1357 0x38,
1400 // connection_id 1358 // connection_id
1401 0x10, 0x32, 0x54, 0x76, 1359 0x10, 0x32, 0x54, 0x76,
1402 0x98, 0xBA, 0xDC, 0xFE, 1360 0x98, 0xBA, 0xDC, 0xFE,
1403 // packet number 1361 // packet number
1404 0xBC, 0x9A, 0x78, 0x56, 1362 0xBC, 0x9A, 0x78, 0x56,
1405 0x34, 0x12, 1363 0x34, 0x12,
1406 // private flags 1364 // private flags
1407 0x00, 1365 0x00,
1408 1366
1409 // frame type (padding frame) 1367 // frame type (padding frame)
(...skipping 12 matching lines...) Expand all
1422 'h', 'e', 'l', 'l', 1380 'h', 'e', 'l', 'l',
1423 'o', ' ', 'w', 'o', 1381 'o', ' ', 'w', 'o',
1424 'r', 'l', 'd', '!', 1382 'r', 'l', 'd', '!',
1425 }; 1383 };
1426 // clang-format on 1384 // clang-format on
1427 1385
1428 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1386 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1429 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1387 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1430 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1388 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1431 ASSERT_TRUE(visitor_.header_.get()); 1389 ASSERT_TRUE(visitor_.header_.get());
1432 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 1390 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
1391 !kIncludeDiversificationNonce));
1433 1392
1434 ASSERT_EQ(0u, visitor_.stream_frames_.size()); 1393 ASSERT_EQ(0u, visitor_.stream_frames_.size());
1435 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1394 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1436 // A packet with no frames is not acceptable. 1395 // A packet with no frames is not acceptable.
1437 CheckProcessingFails( 1396 CheckProcessingFails(
1438 packet, GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 1397 packet, GetPacketHeaderSize(
1439 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 1398 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId,
1399 !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER),
1440 "Packet has no frames.", QUIC_MISSING_PAYLOAD); 1400 "Packet has no frames.", QUIC_MISSING_PAYLOAD);
1441 } 1401 }
1442 1402
1443 TEST_P(QuicFramerTest, StreamFrame) { 1403 TEST_P(QuicFramerTest, StreamFrame) {
1444 // clang-format off 1404 // clang-format off
1445 unsigned char packet[] = { 1405 unsigned char packet[] = {
1446 // public flags (8 byte connection_id) 1406 // public flags (8 byte connection_id)
1447 0x3C, 1407 0x38,
1448 // connection_id 1408 // connection_id
1449 0x10, 0x32, 0x54, 0x76, 1409 0x10, 0x32, 0x54, 0x76,
1450 0x98, 0xBA, 0xDC, 0xFE, 1410 0x98, 0xBA, 0xDC, 0xFE,
1451 // packet number 1411 // packet number
1452 0xBC, 0x9A, 0x78, 0x56, 1412 0xBC, 0x9A, 0x78, 0x56,
1453 0x34, 0x12, 1413 0x34, 0x12,
1454 // private flags 1414 // private flags
1455 0x00, 1415 0x00,
1456 1416
1457 // frame type (stream frame with fin) 1417 // frame type (stream frame with fin)
(...skipping 10 matching lines...) Expand all
1468 'o', ' ', 'w', 'o', 1428 'o', ' ', 'w', 'o',
1469 'r', 'l', 'd', '!', 1429 'r', 'l', 'd', '!',
1470 }; 1430 };
1471 // clang-format on 1431 // clang-format on
1472 1432
1473 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1433 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1474 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1434 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1475 1435
1476 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1436 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1477 ASSERT_TRUE(visitor_.header_.get()); 1437 ASSERT_TRUE(visitor_.header_.get());
1478 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 1438 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
1439 !kIncludeDiversificationNonce));
1479 1440
1480 ASSERT_EQ(1u, visitor_.stream_frames_.size()); 1441 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1481 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1442 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1482 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id); 1443 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
1483 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); 1444 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1484 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); 1445 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
1485 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); 1446 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]);
1486 1447
1487 // Now test framing boundaries. 1448 // Now test framing boundaries.
1488 CheckStreamFrameBoundaries(packet, kQuicMaxStreamIdSize, !kIncludeVersion); 1449 CheckStreamFrameBoundaries(packet, kQuicMaxStreamIdSize, !kIncludeVersion);
1489 } 1450 }
1490 1451
1491 TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) { 1452 TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) {
1492 // clang-format off 1453 // clang-format off
1493 unsigned char packet[] = { 1454 unsigned char packet[] = {
1494 // public flags (8 byte connection_id) 1455 // public flags (8 byte connection_id)
1495 0x3C, 1456 0x38,
1496 // connection_id 1457 // connection_id
1497 0x10, 0x32, 0x54, 0x76, 1458 0x10, 0x32, 0x54, 0x76,
1498 0x98, 0xBA, 0xDC, 0xFE, 1459 0x98, 0xBA, 0xDC, 0xFE,
1499 // packet number 1460 // packet number
1500 0xBC, 0x9A, 0x78, 0x56, 1461 0xBC, 0x9A, 0x78, 0x56,
1501 0x34, 0x12, 1462 0x34, 0x12,
1502 // private flags 1463 // private flags
1503 0x00, 1464 0x00,
1504 1465
1505 // frame type (stream frame with fin) 1466 // frame type (stream frame with fin)
(...skipping 10 matching lines...) Expand all
1516 'o', ' ', 'w', 'o', 1477 'o', ' ', 'w', 'o',
1517 'r', 'l', 'd', '!', 1478 'r', 'l', 'd', '!',
1518 }; 1479 };
1519 // clang-format on 1480 // clang-format on
1520 1481
1521 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1482 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1522 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1483 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1523 1484
1524 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1485 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1525 ASSERT_TRUE(visitor_.header_.get()); 1486 ASSERT_TRUE(visitor_.header_.get());
1526 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 1487 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
1488 !kIncludeDiversificationNonce));
1527 1489
1528 ASSERT_EQ(1u, visitor_.stream_frames_.size()); 1490 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1529 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1491 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1530 // Stream ID should be the last 3 bytes of kStreamId. 1492 // Stream ID should be the last 3 bytes of kStreamId.
1531 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id); 1493 EXPECT_EQ(0x00FFFFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
1532 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); 1494 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1533 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); 1495 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
1534 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); 1496 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]);
1535 1497
1536 // Now test framing boundaries. 1498 // Now test framing boundaries.
1537 const size_t stream_id_size = 3; 1499 const size_t stream_id_size = 3;
1538 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); 1500 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion);
1539 } 1501 }
1540 1502
1541 TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) { 1503 TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) {
1542 // clang-format off 1504 // clang-format off
1543 unsigned char packet[] = { 1505 unsigned char packet[] = {
1544 // public flags (8 byte connection_id) 1506 // public flags (8 byte connection_id)
1545 0x3C, 1507 0x38,
1546 // connection_id 1508 // connection_id
1547 0x10, 0x32, 0x54, 0x76, 1509 0x10, 0x32, 0x54, 0x76,
1548 0x98, 0xBA, 0xDC, 0xFE, 1510 0x98, 0xBA, 0xDC, 0xFE,
1549 // packet number 1511 // packet number
1550 0xBC, 0x9A, 0x78, 0x56, 1512 0xBC, 0x9A, 0x78, 0x56,
1551 0x34, 0x12, 1513 0x34, 0x12,
1552 // private flags 1514 // private flags
1553 0x00, 1515 0x00,
1554 1516
1555 // frame type (stream frame with fin) 1517 // frame type (stream frame with fin)
(...skipping 10 matching lines...) Expand all
1566 'o', ' ', 'w', 'o', 1528 'o', ' ', 'w', 'o',
1567 'r', 'l', 'd', '!', 1529 'r', 'l', 'd', '!',
1568 }; 1530 };
1569 // clang-format on 1531 // clang-format on
1570 1532
1571 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1533 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1572 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1534 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1573 1535
1574 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1536 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1575 ASSERT_TRUE(visitor_.header_.get()); 1537 ASSERT_TRUE(visitor_.header_.get());
1576 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 1538 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
1539 !kIncludeDiversificationNonce));
1577 1540
1578 ASSERT_EQ(1u, visitor_.stream_frames_.size()); 1541 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1579 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1542 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1580 // Stream ID should be the last 2 bytes of kStreamId. 1543 // Stream ID should be the last 2 bytes of kStreamId.
1581 EXPECT_EQ(0x0000FFFF & kStreamId, visitor_.stream_frames_[0]->stream_id); 1544 EXPECT_EQ(0x0000FFFF & kStreamId, visitor_.stream_frames_[0]->stream_id);
1582 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); 1545 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1583 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); 1546 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
1584 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); 1547 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]);
1585 1548
1586 // Now test framing boundaries. 1549 // Now test framing boundaries.
1587 const size_t stream_id_size = 2; 1550 const size_t stream_id_size = 2;
1588 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); 1551 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion);
1589 } 1552 }
1590 1553
1591 TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) { 1554 TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) {
1592 // clang-format off 1555 // clang-format off
1593 unsigned char packet[] = { 1556 unsigned char packet[] = {
1594 // public flags (8 byte connection_id) 1557 // public flags (8 byte connection_id)
1595 0x3C, 1558 0x38,
1596 // connection_id 1559 // connection_id
1597 0x10, 0x32, 0x54, 0x76, 1560 0x10, 0x32, 0x54, 0x76,
1598 0x98, 0xBA, 0xDC, 0xFE, 1561 0x98, 0xBA, 0xDC, 0xFE,
1599 // packet number 1562 // packet number
1600 0xBC, 0x9A, 0x78, 0x56, 1563 0xBC, 0x9A, 0x78, 0x56,
1601 0x34, 0x12, 1564 0x34, 0x12,
1602 // private flags 1565 // private flags
1603 0x00, 1566 0x00,
1604 1567
1605 // frame type (stream frame with fin) 1568 // frame type (stream frame with fin)
(...skipping 10 matching lines...) Expand all
1616 'o', ' ', 'w', 'o', 1579 'o', ' ', 'w', 'o',
1617 'r', 'l', 'd', '!', 1580 'r', 'l', 'd', '!',
1618 }; 1581 };
1619 // clang-format on 1582 // clang-format on
1620 1583
1621 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1584 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1622 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1585 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1623 1586
1624 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1587 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1625 ASSERT_TRUE(visitor_.header_.get()); 1588 ASSERT_TRUE(visitor_.header_.get());
1626 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 1589 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
1590 !kIncludeDiversificationNonce));
1627 1591
1628 ASSERT_EQ(1u, visitor_.stream_frames_.size()); 1592 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1629 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1593 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1630 // Stream ID should be the last byte of kStreamId. 1594 // Stream ID should be the last byte of kStreamId.
1631 EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id); 1595 EXPECT_EQ(0x000000FF & kStreamId, visitor_.stream_frames_[0]->stream_id);
1632 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); 1596 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1633 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); 1597 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
1634 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); 1598 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]);
1635 1599
1636 // Now test framing boundaries. 1600 // Now test framing boundaries.
1637 const size_t stream_id_size = 1; 1601 const size_t stream_id_size = 1;
1638 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); 1602 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion);
1639 } 1603 }
1640 1604
1641 TEST_P(QuicFramerTest, StreamFrameWithVersion) { 1605 TEST_P(QuicFramerTest, StreamFrameWithVersion) {
1642 // clang-format off 1606 // clang-format off
1643 unsigned char packet[] = { 1607 unsigned char packet[] = {
1644 // public flags (version, 8 byte connection_id) 1608 // public flags (version, 8 byte connection_id)
1645 0x3D, 1609 0x39,
1646 // connection_id 1610 // connection_id
1647 0x10, 0x32, 0x54, 0x76, 1611 0x10, 0x32, 0x54, 0x76,
1648 0x98, 0xBA, 0xDC, 0xFE, 1612 0x98, 0xBA, 0xDC, 0xFE,
1649 // version tag 1613 // version tag
1650 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), 1614 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
1651 // packet number 1615 // packet number
1652 0xBC, 0x9A, 0x78, 0x56, 1616 0xBC, 0x9A, 0x78, 0x56,
1653 0x34, 0x12, 1617 0x34, 0x12,
1654 // private flags 1618 // private flags
1655 0x00, 1619 0x00,
(...skipping 14 matching lines...) Expand all
1670 }; 1634 };
1671 // clang-format on 1635 // clang-format on
1672 1636
1673 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1637 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1674 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1638 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1675 1639
1676 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1640 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1677 ASSERT_TRUE(visitor_.header_.get()); 1641 ASSERT_TRUE(visitor_.header_.get());
1678 EXPECT_TRUE(visitor_.header_->public_header.version_flag); 1642 EXPECT_TRUE(visitor_.header_->public_header.version_flag);
1679 EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]); 1643 EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]);
1680 EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion, !kIncludePathId)); 1644 EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion, !kIncludePathId,
1645 !kIncludeDiversificationNonce));
1681 1646
1682 ASSERT_EQ(1u, visitor_.stream_frames_.size()); 1647 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1683 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1648 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1684 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id); 1649 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
1685 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); 1650 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1686 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset); 1651 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
1687 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); 1652 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]);
1688 1653
1689 // Now test framing boundaries. 1654 // Now test framing boundaries.
1690 CheckStreamFrameBoundaries(packet, kQuicMaxStreamIdSize, kIncludeVersion); 1655 CheckStreamFrameBoundaries(packet, kQuicMaxStreamIdSize, kIncludeVersion);
1691 } 1656 }
1692 1657
1693 TEST_P(QuicFramerTest, RejectPacket) { 1658 TEST_P(QuicFramerTest, RejectPacket) {
1694 visitor_.accept_packet_ = false; 1659 visitor_.accept_packet_ = false;
1695 1660
1696 // clang-format off 1661 // clang-format off
1697 unsigned char packet[] = { 1662 unsigned char packet[] = {
1698 // public flags (8 byte connection_id) 1663 // public flags (8 byte connection_id)
1699 0x3C, 1664 0x38,
1700 // connection_id 1665 // connection_id
1701 0x10, 0x32, 0x54, 0x76, 1666 0x10, 0x32, 0x54, 0x76,
1702 0x98, 0xBA, 0xDC, 0xFE, 1667 0x98, 0xBA, 0xDC, 0xFE,
1703 // packet number 1668 // packet number
1704 0xBC, 0x9A, 0x78, 0x56, 1669 0xBC, 0x9A, 0x78, 0x56,
1705 0x34, 0x12, 1670 0x34, 0x12,
1706 // private flags 1671 // private flags
1707 0x00, 1672 0x00,
1708 1673
1709 // frame type (stream frame with fin) 1674 // frame type (stream frame with fin)
(...skipping 10 matching lines...) Expand all
1720 'o', ' ', 'w', 'o', 1685 'o', ' ', 'w', 'o',
1721 'r', 'l', 'd', '!', 1686 'r', 'l', 'd', '!',
1722 }; 1687 };
1723 // clang-format on 1688 // clang-format on
1724 1689
1725 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1690 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1726 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1691 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1727 1692
1728 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1693 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1729 ASSERT_TRUE(visitor_.header_.get()); 1694 ASSERT_TRUE(visitor_.header_.get());
1730 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 1695 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
1696 !kIncludeDiversificationNonce));
1731 1697
1732 ASSERT_EQ(0u, visitor_.stream_frames_.size()); 1698 ASSERT_EQ(0u, visitor_.stream_frames_.size());
1733 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1699 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1734 } 1700 }
1735 1701
1736 TEST_P(QuicFramerTest, RejectPublicHeader) { 1702 TEST_P(QuicFramerTest, RejectPublicHeader) {
1737 visitor_.accept_public_header_ = false; 1703 visitor_.accept_public_header_ = false;
1738 1704
1739 // clang-format off 1705 // clang-format off
1740 unsigned char packet[] = { 1706 unsigned char packet[] = {
1741 // public flags (8 byte connection_id) 1707 // public flags (8 byte connection_id)
1742 0x3C, 1708 0x38,
1743 // connection_id 1709 // connection_id
1744 0x10, 0x32, 0x54, 0x76, 1710 0x10, 0x32, 0x54, 0x76,
1745 0x98, 0xBA, 0xDC, 0xFE, 1711 0x98, 0xBA, 0xDC, 0xFE,
1746 }; 1712 };
1747 // clang-format on 1713 // clang-format on
1748 1714
1749 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1715 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1750 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1716 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1751 1717
1752 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1718 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1753 ASSERT_TRUE(visitor_.public_header_.get()); 1719 ASSERT_TRUE(visitor_.public_header_.get());
1754 ASSERT_FALSE(visitor_.header_.get()); 1720 ASSERT_FALSE(visitor_.header_.get());
1755 } 1721 }
1756 1722
1757 TEST_P(QuicFramerTest, AckFrameTwoTimestamp) { 1723 TEST_P(QuicFramerTest, AckFrameTwoTimestamp) {
1758 // clang-format off 1724 // clang-format off
1759 unsigned char packet[] = { 1725 unsigned char packet[] = {
1760 // public flags (8 byte connection_id) 1726 // public flags (8 byte connection_id)
1761 0x3C, 1727 0x38,
1762 // connection_id 1728 // connection_id
1763 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 1729 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1764 // packet number 1730 // packet number
1765 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, 1731 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12,
1766 // private flags (entropy) 1732 // private flags (entropy)
1767 0x01, 1733 0x01,
1768 1734
1769 // frame type (ack frame) 1735 // frame type (ack frame)
1770 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) 1736 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta)
1771 0x6C, 1737 0x6C,
(...skipping 26 matching lines...) Expand all
1798 1764
1799 if (framer_.version() > QUIC_VERSION_31) { 1765 if (framer_.version() > QUIC_VERSION_31) {
1800 return; 1766 return;
1801 } 1767 }
1802 1768
1803 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1769 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1804 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1770 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1805 1771
1806 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1772 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1807 ASSERT_TRUE(visitor_.header_.get()); 1773 ASSERT_TRUE(visitor_.header_.get());
1808 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 1774 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
1775 !kIncludeDiversificationNonce));
1809 1776
1810 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 1777 EXPECT_EQ(0u, visitor_.stream_frames_.size());
1811 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 1778 ASSERT_EQ(1u, visitor_.ack_frames_.size());
1812 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; 1779 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
1813 EXPECT_EQ(0xBA, frame.entropy_hash); 1780 EXPECT_EQ(0xBA, frame.entropy_hash);
1814 EXPECT_EQ(kLargestObserved, frame.largest_observed); 1781 EXPECT_EQ(kLargestObserved, frame.largest_observed);
1815 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow()); 1782 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
1816 ASSERT_EQ(2u, frame.received_packet_times.size()); 1783 ASSERT_EQ(2u, frame.received_packet_times.size());
1817 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min()); 1784 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
1818 1785
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1866 } else if (i < kMissingPacketsRange) { 1833 } else if (i < kMissingPacketsRange) {
1867 expected_error = "Unable to read missing packet number delta."; 1834 expected_error = "Unable to read missing packet number delta.";
1868 } else if (i < kRevivedPacketsLength) { 1835 } else if (i < kRevivedPacketsLength) {
1869 expected_error = "Unable to read missing packet number range."; 1836 expected_error = "Unable to read missing packet number range.";
1870 } else { 1837 } else {
1871 expected_error = "Unable to read num revived packets."; 1838 expected_error = "Unable to read num revived packets.";
1872 } 1839 }
1873 CheckProcessingFails( 1840 CheckProcessingFails(
1874 packet, 1841 packet,
1875 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 1842 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
1876 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 1843 !kIncludePathId, !kIncludeDiversificationNonce,
1844 PACKET_6BYTE_PACKET_NUMBER),
1877 expected_error, QUIC_INVALID_ACK_DATA); 1845 expected_error, QUIC_INVALID_ACK_DATA);
1878 } 1846 }
1879 } 1847 }
1880 1848
1881 TEST_P(QuicFramerTest, AckFrameTwoTimestampVersion32) { 1849 TEST_P(QuicFramerTest, AckFrameTwoTimestampVersion32) {
1882 // clang-format off 1850 // clang-format off
1883 unsigned char packet[] = { 1851 unsigned char packet[] = {
1884 // public flags (8 byte connection_id) 1852 // public flags (8 byte connection_id)
1885 0x3C, 1853 0x3C,
1886 // connection_id 1854 // connection_id
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1920 1888
1921 if (framer_.version() <= QUIC_VERSION_31) { 1889 if (framer_.version() <= QUIC_VERSION_31) {
1922 return; 1890 return;
1923 } 1891 }
1924 1892
1925 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1893 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1926 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1894 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1927 1895
1928 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1896 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1929 ASSERT_TRUE(visitor_.header_.get()); 1897 ASSERT_TRUE(visitor_.header_.get());
1930 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 1898 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
1899 !kIncludeDiversificationNonce));
1931 1900
1932 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 1901 EXPECT_EQ(0u, visitor_.stream_frames_.size());
1933 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 1902 ASSERT_EQ(1u, visitor_.ack_frames_.size());
1934 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; 1903 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
1935 EXPECT_EQ(0xBA, frame.entropy_hash); 1904 EXPECT_EQ(0xBA, frame.entropy_hash);
1936 EXPECT_EQ(kLargestObserved, frame.largest_observed); 1905 EXPECT_EQ(kLargestObserved, frame.largest_observed);
1937 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow()); 1906 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
1938 ASSERT_EQ(2u, frame.received_packet_times.size()); 1907 ASSERT_EQ(2u, frame.received_packet_times.size());
1939 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min()); 1908 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
1940 1909
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1979 expected_error = 1948 expected_error =
1980 "Unable to read incremental time delta in received packets."; 1949 "Unable to read incremental time delta in received packets.";
1981 } else if (i < kMissingPacketsOffset) { 1950 } else if (i < kMissingPacketsOffset) {
1982 expected_error = "Unable to read num missing packet ranges."; 1951 expected_error = "Unable to read num missing packet ranges.";
1983 } else { 1952 } else {
1984 expected_error = "Unable to read missing packet number delta."; 1953 expected_error = "Unable to read missing packet number delta.";
1985 } 1954 }
1986 CheckProcessingFails( 1955 CheckProcessingFails(
1987 packet, 1956 packet,
1988 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 1957 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
1989 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 1958 !kIncludePathId, !kIncludeDiversificationNonce,
1959 PACKET_6BYTE_PACKET_NUMBER),
1990 expected_error, QUIC_INVALID_ACK_DATA); 1960 expected_error, QUIC_INVALID_ACK_DATA);
1991 } 1961 }
1992 } 1962 }
1993 1963
1994 TEST_P(QuicFramerTest, AckFrameOneTimestamp) { 1964 TEST_P(QuicFramerTest, AckFrameOneTimestamp) {
1995 // clang-format off 1965 // clang-format off
1996 unsigned char packet[] = { 1966 unsigned char packet[] = {
1997 // public flags (8 byte connection_id) 1967 // public flags (8 byte connection_id)
1998 0x3C, 1968 0x38,
1999 // connection_id 1969 // connection_id
2000 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 1970 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2001 // packet number 1971 // packet number
2002 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, 1972 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12,
2003 // private flags (entropy) 1973 // private flags (entropy)
2004 0x01, 1974 0x01,
2005 1975
2006 // frame type (ack frame) 1976 // frame type (ack frame)
2007 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) 1977 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta)
2008 0x6C, 1978 0x6C,
(...skipping 22 matching lines...) Expand all
2031 2001
2032 if (framer_.version() > QUIC_VERSION_31) { 2002 if (framer_.version() > QUIC_VERSION_31) {
2033 return; 2003 return;
2034 } 2004 }
2035 2005
2036 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2006 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2037 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2007 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2038 2008
2039 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2009 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2040 ASSERT_TRUE(visitor_.header_.get()); 2010 ASSERT_TRUE(visitor_.header_.get());
2041 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 2011 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
2012 !kIncludeDiversificationNonce));
2042 2013
2043 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 2014 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2044 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 2015 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2045 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; 2016 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
2046 EXPECT_EQ(0xBA, frame.entropy_hash); 2017 EXPECT_EQ(0xBA, frame.entropy_hash);
2047 EXPECT_EQ(kLargestObserved, frame.largest_observed); 2018 EXPECT_EQ(kLargestObserved, frame.largest_observed);
2048 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow()); 2019 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
2049 ASSERT_EQ(1u, frame.received_packet_times.size()); 2020 ASSERT_EQ(1u, frame.received_packet_times.size());
2050 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min()); 2021 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
2051 2022
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2089 } else if (i < kMissingPacketsRange) { 2060 } else if (i < kMissingPacketsRange) {
2090 expected_error = "Unable to read missing packet number delta."; 2061 expected_error = "Unable to read missing packet number delta.";
2091 } else if (i < kRevivedPacketsLength) { 2062 } else if (i < kRevivedPacketsLength) {
2092 expected_error = "Unable to read missing packet number range."; 2063 expected_error = "Unable to read missing packet number range.";
2093 } else { 2064 } else {
2094 expected_error = "Unable to read num revived packets."; 2065 expected_error = "Unable to read num revived packets.";
2095 } 2066 }
2096 CheckProcessingFails( 2067 CheckProcessingFails(
2097 packet, 2068 packet,
2098 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2069 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2099 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 2070 !kIncludePathId, !kIncludeDiversificationNonce,
2071 PACKET_6BYTE_PACKET_NUMBER),
2100 expected_error, QUIC_INVALID_ACK_DATA); 2072 expected_error, QUIC_INVALID_ACK_DATA);
2101 } 2073 }
2102 } 2074 }
2103 2075
2104 TEST_P(QuicFramerTest, AckFrameOneTimestampVersion32) { 2076 TEST_P(QuicFramerTest, AckFrameOneTimestampVersion32) {
2105 // clang-format off 2077 // clang-format off
2106 unsigned char packet[] = { 2078 unsigned char packet[] = {
2107 // public flags (8 byte connection_id) 2079 // public flags (8 byte connection_id)
2108 0x3C, 2080 0x3C,
2109 // connection_id 2081 // connection_id
(...skipping 29 matching lines...) Expand all
2139 2111
2140 if (framer_.version() <= QUIC_VERSION_31) { 2112 if (framer_.version() <= QUIC_VERSION_31) {
2141 return; 2113 return;
2142 } 2114 }
2143 2115
2144 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2116 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2145 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2117 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2146 2118
2147 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2119 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2148 ASSERT_TRUE(visitor_.header_.get()); 2120 ASSERT_TRUE(visitor_.header_.get());
2149 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 2121 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
2122 !kIncludeDiversificationNonce));
2150 2123
2151 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 2124 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2152 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 2125 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2153 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; 2126 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
2154 EXPECT_EQ(0xBA, frame.entropy_hash); 2127 EXPECT_EQ(0xBA, frame.entropy_hash);
2155 EXPECT_EQ(kLargestObserved, frame.largest_observed); 2128 EXPECT_EQ(kLargestObserved, frame.largest_observed);
2156 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow()); 2129 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
2157 ASSERT_EQ(1u, frame.received_packet_times.size()); 2130 ASSERT_EQ(1u, frame.received_packet_times.size());
2158 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min()); 2131 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
2159 2132
(...skipping 28 matching lines...) Expand all
2188 } else if (i < kNumMissingPacketOffset) { 2161 } else if (i < kNumMissingPacketOffset) {
2189 expected_error = "Unable to read time delta in received packets."; 2162 expected_error = "Unable to read time delta in received packets.";
2190 } else if (i < kMissingPacketsOffset) { 2163 } else if (i < kMissingPacketsOffset) {
2191 expected_error = "Unable to read num missing packet ranges."; 2164 expected_error = "Unable to read num missing packet ranges.";
2192 } else { 2165 } else {
2193 expected_error = "Unable to read missing packet number delta."; 2166 expected_error = "Unable to read missing packet number delta.";
2194 } 2167 }
2195 CheckProcessingFails( 2168 CheckProcessingFails(
2196 packet, 2169 packet,
2197 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2170 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2198 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 2171 !kIncludePathId, !kIncludeDiversificationNonce,
2172 PACKET_6BYTE_PACKET_NUMBER),
2199 expected_error, QUIC_INVALID_ACK_DATA); 2173 expected_error, QUIC_INVALID_ACK_DATA);
2200 } 2174 }
2201 } 2175 }
2202 2176
2203 TEST_P(QuicFramerTest, AckFrame) { 2177 TEST_P(QuicFramerTest, AckFrame) {
2204 // clang-format off 2178 // clang-format off
2205 unsigned char packet[] = { 2179 unsigned char packet[] = {
2206 // public flags (8 byte connection_id) 2180 // public flags (8 byte connection_id)
2207 0x3C, 2181 0x3C,
2208 // connection_id 2182 // connection_id
(...skipping 27 matching lines...) Expand all
2236 2210
2237 if (framer_.version() > QUIC_VERSION_31) { 2211 if (framer_.version() > QUIC_VERSION_31) {
2238 return; 2212 return;
2239 } 2213 }
2240 2214
2241 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2215 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2242 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2216 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2243 2217
2244 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2218 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2245 ASSERT_TRUE(visitor_.header_.get()); 2219 ASSERT_TRUE(visitor_.header_.get());
2246 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 2220 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
2221 !kIncludeDiversificationNonce));
2247 2222
2248 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 2223 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2249 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 2224 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2250 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; 2225 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
2251 EXPECT_EQ(0xBA, frame.entropy_hash); 2226 EXPECT_EQ(0xBA, frame.entropy_hash);
2252 EXPECT_EQ(kLargestObserved, frame.largest_observed); 2227 EXPECT_EQ(kLargestObserved, frame.largest_observed);
2253 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow()); 2228 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
2254 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min()); 2229 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
2255 2230
2256 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; 2231 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize;
(...skipping 29 matching lines...) Expand all
2286 } else if (i < kMissingPacketsRange) { 2261 } else if (i < kMissingPacketsRange) {
2287 expected_error = "Unable to read missing packet number delta."; 2262 expected_error = "Unable to read missing packet number delta.";
2288 } else if (i < kRevivedPacketsLength) { 2263 } else if (i < kRevivedPacketsLength) {
2289 expected_error = "Unable to read missing packet number range."; 2264 expected_error = "Unable to read missing packet number range.";
2290 } else { 2265 } else {
2291 expected_error = "Unable to read num revived packets."; 2266 expected_error = "Unable to read num revived packets.";
2292 } 2267 }
2293 CheckProcessingFails( 2268 CheckProcessingFails(
2294 packet, 2269 packet,
2295 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2270 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2296 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 2271 !kIncludePathId, !kIncludeDiversificationNonce,
2272 PACKET_6BYTE_PACKET_NUMBER),
2297 expected_error, QUIC_INVALID_ACK_DATA); 2273 expected_error, QUIC_INVALID_ACK_DATA);
2298 } 2274 }
2299 } 2275 }
2300 2276
2301 TEST_P(QuicFramerTest, AckFrameVersion32) { 2277 TEST_P(QuicFramerTest, AckFrameVersion32) {
2302 // clang-format off 2278 // clang-format off
2303 unsigned char packet[] = { 2279 unsigned char packet[] = {
2304 // public flags (8 byte connection_id) 2280 // public flags (8 byte connection_id)
2305 0x3C, 2281 0x38,
2306 // connection_id 2282 // connection_id
2307 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 2283 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2308 // packet number 2284 // packet number
2309 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, 2285 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12,
2310 // private flags (entropy) 2286 // private flags (entropy)
2311 0x01, 2287 0x01,
2312 2288
2313 // frame type (ack frame) 2289 // frame type (ack frame)
2314 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) 2290 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta)
2315 0x6C, 2291 0x6C,
(...skipping 16 matching lines...) Expand all
2332 2308
2333 if (framer_.version() <= QUIC_VERSION_31) { 2309 if (framer_.version() <= QUIC_VERSION_31) {
2334 return; 2310 return;
2335 } 2311 }
2336 2312
2337 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2313 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2338 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2314 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2339 2315
2340 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2316 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2341 ASSERT_TRUE(visitor_.header_.get()); 2317 ASSERT_TRUE(visitor_.header_.get());
2342 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 2318 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
2319 !kIncludeDiversificationNonce));
2343 2320
2344 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 2321 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2345 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 2322 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2346 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; 2323 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
2347 EXPECT_EQ(0xBA, frame.entropy_hash); 2324 EXPECT_EQ(0xBA, frame.entropy_hash);
2348 EXPECT_EQ(kLargestObserved, frame.largest_observed); 2325 EXPECT_EQ(kLargestObserved, frame.largest_observed);
2349 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow()); 2326 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
2350 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min()); 2327 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
2351 2328
2352 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; 2329 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize;
(...skipping 20 matching lines...) Expand all
2373 } else if (i < kNumMissingPacketOffset) { 2350 } else if (i < kNumMissingPacketOffset) {
2374 expected_error = "Unable to read num received packets."; 2351 expected_error = "Unable to read num received packets.";
2375 } else if (i < kMissingPacketsOffset) { 2352 } else if (i < kMissingPacketsOffset) {
2376 expected_error = "Unable to read num missing packet ranges."; 2353 expected_error = "Unable to read num missing packet ranges.";
2377 } else { 2354 } else {
2378 expected_error = "Unable to read missing packet number delta."; 2355 expected_error = "Unable to read missing packet number delta.";
2379 } 2356 }
2380 CheckProcessingFails( 2357 CheckProcessingFails(
2381 packet, 2358 packet,
2382 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2359 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2383 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 2360 !kIncludePathId, !kIncludeDiversificationNonce,
2361 PACKET_6BYTE_PACKET_NUMBER),
2384 expected_error, QUIC_INVALID_ACK_DATA); 2362 expected_error, QUIC_INVALID_ACK_DATA);
2385 } 2363 }
2386 } 2364 }
2387 2365
2388 TEST_P(QuicFramerTest, AckFrameRevivedPackets) { 2366 TEST_P(QuicFramerTest, AckFrameRevivedPackets) {
2389 // clang-format off 2367 // clang-format off
2390 unsigned char packet[] = { 2368 unsigned char packet[] = {
2391 // public flags (8 byte connection_id) 2369 // public flags (8 byte connection_id)
2392 0x3C, 2370 0x38,
2393 // connection_id 2371 // connection_id
2394 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 2372 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2395 // packet number 2373 // packet number
2396 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, 2374 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12,
2397 // private flags (entropy) 2375 // private flags (entropy)
2398 0x01, 2376 0x01,
2399 2377
2400 // frame type (ack frame) 2378 // frame type (ack frame)
2401 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) 2379 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta)
2402 0x6C, 2380 0x6C,
(...skipping 22 matching lines...) Expand all
2425 2403
2426 if (framer_.version() > QUIC_VERSION_31) { 2404 if (framer_.version() > QUIC_VERSION_31) {
2427 return; 2405 return;
2428 } 2406 }
2429 2407
2430 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2408 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2431 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2409 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2432 2410
2433 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2411 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2434 ASSERT_TRUE(visitor_.header_.get()); 2412 ASSERT_TRUE(visitor_.header_.get());
2435 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 2413 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
2414 !kIncludeDiversificationNonce));
2436 2415
2437 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 2416 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2438 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 2417 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2439 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; 2418 const QuicAckFrame& frame = *visitor_.ack_frames_[0];
2440 EXPECT_EQ(0xBA, frame.entropy_hash); 2419 EXPECT_EQ(0xBA, frame.entropy_hash);
2441 EXPECT_EQ(kLargestObserved, frame.largest_observed); 2420 EXPECT_EQ(kLargestObserved, frame.largest_observed);
2442 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow()); 2421 ASSERT_EQ(1u, frame.missing_packets.NumPacketsSlow());
2443 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min()); 2422 EXPECT_EQ(kMissingPacket, frame.missing_packets.Min());
2444 2423
2445 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; 2424 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2481 } else if (i < kRevivedPacketsLength) { 2460 } else if (i < kRevivedPacketsLength) {
2482 expected_error = "Unable to read missing packet number range."; 2461 expected_error = "Unable to read missing packet number range.";
2483 } else if (i < kRevivedPacketSequenceNumberLength) { 2462 } else if (i < kRevivedPacketSequenceNumberLength) {
2484 expected_error = "Unable to read num revived packets."; 2463 expected_error = "Unable to read num revived packets.";
2485 } else { 2464 } else {
2486 expected_error = "Unable to read revived packet."; 2465 expected_error = "Unable to read revived packet.";
2487 } 2466 }
2488 CheckProcessingFails( 2467 CheckProcessingFails(
2489 packet, 2468 packet,
2490 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2469 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2491 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 2470 !kIncludePathId, !kIncludeDiversificationNonce,
2471 PACKET_6BYTE_PACKET_NUMBER),
2492 expected_error, QUIC_INVALID_ACK_DATA); 2472 expected_error, QUIC_INVALID_ACK_DATA);
2493 } 2473 }
2494 } 2474 }
2495 2475
2496 TEST_P(QuicFramerTest, AckFrameNoNacks) { 2476 TEST_P(QuicFramerTest, AckFrameNoNacks) {
2497 // clang-format off 2477 // clang-format off
2498 unsigned char packet[] = { 2478 unsigned char packet[] = {
2499 // public flags (8 byte connection_id) 2479 // public flags (8 byte connection_id)
2500 0x3C, 2480 static_cast<unsigned char>(
2481 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
2501 // connection_id 2482 // connection_id
2502 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 2483 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2503 // packet number 2484 // packet number
2504 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, 2485 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12,
2505 // private flags (entropy) 2486 // private flags (entropy)
2506 0x01, 2487 0x01,
2507 2488
2508 // frame type (ack frame) 2489 // frame type (ack frame)
2509 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) 2490 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta)
2510 0x4C, 2491 0x4C,
2511 // entropy hash of all received packets. 2492 // entropy hash of all received packets.
2512 0xBA, 2493 0xBA,
2513 // largest observed packet number 2494 // largest observed packet number
2514 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, 2495 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12,
2515 // Zero delta time. 2496 // Zero delta time.
2516 0x00, 0x00, 2497 0x00, 0x00,
2517 // Number of received packets. 2498 // Number of received packets.
2518 0x00, 2499 0x00,
2519 }; 2500 };
2520 // clang-format on 2501 // clang-format on
2521 2502
2522 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2503 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2523 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2504 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2524 2505
2525 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2506 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2526 ASSERT_TRUE(visitor_.header_.get()); 2507 ASSERT_TRUE(visitor_.header_.get());
2527 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 2508 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
2509 !kIncludeDiversificationNonce));
2528 2510
2529 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 2511 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2530 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 2512 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2531 QuicAckFrame* frame = visitor_.ack_frames_[0]; 2513 QuicAckFrame* frame = visitor_.ack_frames_[0];
2532 EXPECT_EQ(0xBA, frame->entropy_hash); 2514 EXPECT_EQ(0xBA, frame->entropy_hash);
2533 EXPECT_EQ(kLargestObserved, frame->largest_observed); 2515 EXPECT_EQ(kLargestObserved, frame->largest_observed);
2534 ASSERT_TRUE(frame->missing_packets.Empty()); 2516 ASSERT_TRUE(frame->missing_packets.Empty());
2535 2517
2536 // Verify that the packet re-serializes identically. 2518 // Verify that the packet re-serializes identically.
2537 QuicFrames frames; 2519 QuicFrames frames;
2538 frames.push_back(QuicFrame(frame)); 2520 frames.push_back(QuicFrame(frame));
2539 std::unique_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); 2521 std::unique_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames));
2540 ASSERT_TRUE(data != nullptr); 2522 ASSERT_TRUE(data != nullptr);
2541 2523
2542 test::CompareCharArraysWithHexError("constructed packet", data->data(), 2524 test::CompareCharArraysWithHexError("constructed packet", data->data(),
2543 data->length(), AsChars(packet), 2525 data->length(), AsChars(packet),
2544 arraysize(packet)); 2526 arraysize(packet));
2545 } 2527 }
2546 2528
2547 TEST_P(QuicFramerTest, AckFrame500Nacks) { 2529 TEST_P(QuicFramerTest, AckFrame500Nacks) {
2548 // clang-format off 2530 // clang-format off
2549 unsigned char packet[] = { 2531 unsigned char packet[] = {
2550 // public flags (8 byte connection_id) 2532 // public flags (8 byte connection_id)
2551 0x3C, 2533 static_cast<unsigned char>(
2534 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
2552 // connection_id 2535 // connection_id
2553 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 2536 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2554 // packet number 2537 // packet number
2555 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, 2538 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12,
2556 // private flags (entropy) 2539 // private flags (entropy)
2557 0x01, 2540 0x01,
2558 2541
2559 // frame type (ack frame) 2542 // frame type (ack frame)
2560 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) 2543 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta)
2561 0x6C, 2544 0x6C,
(...skipping 24 matching lines...) Expand all
2586 2569
2587 if (framer_.version() > QUIC_VERSION_31) { 2570 if (framer_.version() > QUIC_VERSION_31) {
2588 return; 2571 return;
2589 } 2572 }
2590 2573
2591 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2574 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2592 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2575 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2593 2576
2594 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2577 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2595 ASSERT_TRUE(visitor_.header_.get()); 2578 ASSERT_TRUE(visitor_.header_.get());
2596 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 2579 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
2580 !kIncludeDiversificationNonce));
2597 2581
2598 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 2582 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2599 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 2583 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2600 QuicAckFrame* frame = visitor_.ack_frames_[0]; 2584 QuicAckFrame* frame = visitor_.ack_frames_[0];
2601 EXPECT_EQ(0xBA, frame->entropy_hash); 2585 EXPECT_EQ(0xBA, frame->entropy_hash);
2602 EXPECT_EQ(kLargestObserved, frame->largest_observed); 2586 EXPECT_EQ(kLargestObserved, frame->largest_observed);
2603 ASSERT_EQ(500u, frame->missing_packets.NumPacketsSlow()); 2587 ASSERT_EQ(500u, frame->missing_packets.NumPacketsSlow());
2604 EXPECT_EQ(kMissingPacket - 499, frame->missing_packets.Min()); 2588 EXPECT_EQ(kMissingPacket - 499, frame->missing_packets.Min());
2605 EXPECT_EQ(kMissingPacket, frame->missing_packets.Max()); 2589 EXPECT_EQ(kMissingPacket, frame->missing_packets.Max());
2606 2590
2607 // Verify that the packet re-serializes identically. 2591 // Verify that the packet re-serializes identically.
2608 QuicFrames frames; 2592 QuicFrames frames;
2609 frames.push_back(QuicFrame(frame)); 2593 frames.push_back(QuicFrame(frame));
2610 std::unique_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); 2594 std::unique_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames));
2611 ASSERT_TRUE(data != nullptr); 2595 ASSERT_TRUE(data != nullptr);
2612 2596
2613 test::CompareCharArraysWithHexError("constructed packet", data->data(), 2597 test::CompareCharArraysWithHexError("constructed packet", data->data(),
2614 data->length(), AsChars(packet), 2598 data->length(), AsChars(packet),
2615 arraysize(packet)); 2599 arraysize(packet));
2616 } 2600 }
2617 2601
2618 TEST_P(QuicFramerTest, AckFrame500NacksVersion32) { 2602 TEST_P(QuicFramerTest, AckFrame500NacksVersion32) {
2619 // clang-format off 2603 // clang-format off
2620 unsigned char packet[] = { 2604 unsigned char packet[] = {
2621 // public flags (8 byte connection_id) 2605 // public flags (8 byte connection_id)
2622 0x3C, 2606 static_cast<unsigned char>(
2607 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
2623 // connection_id 2608 // connection_id
2624 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 2609 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
2625 // packet number 2610 // packet number
2626 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, 2611 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12,
2627 // private flags (entropy) 2612 // private flags (entropy)
2628 0x01, 2613 0x01,
2629 2614
2630 // frame type (ack frame) 2615 // frame type (ack frame)
2631 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) 2616 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta)
2632 0x6C, 2617 0x6C,
(...skipping 22 matching lines...) Expand all
2655 2640
2656 if (framer_.version() <= QUIC_VERSION_31) { 2641 if (framer_.version() <= QUIC_VERSION_31) {
2657 return; 2642 return;
2658 } 2643 }
2659 2644
2660 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2645 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2661 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2646 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2662 2647
2663 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2648 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2664 ASSERT_TRUE(visitor_.header_.get()); 2649 ASSERT_TRUE(visitor_.header_.get());
2665 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 2650 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
2651 !kIncludeDiversificationNonce));
2666 2652
2667 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 2653 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2668 ASSERT_EQ(1u, visitor_.ack_frames_.size()); 2654 ASSERT_EQ(1u, visitor_.ack_frames_.size());
2669 QuicAckFrame* frame = visitor_.ack_frames_[0]; 2655 QuicAckFrame* frame = visitor_.ack_frames_[0];
2670 EXPECT_EQ(0xBA, frame->entropy_hash); 2656 EXPECT_EQ(0xBA, frame->entropy_hash);
2671 EXPECT_EQ(kLargestObserved, frame->largest_observed); 2657 EXPECT_EQ(kLargestObserved, frame->largest_observed);
2672 ASSERT_EQ(500u, frame->missing_packets.NumPacketsSlow()); 2658 ASSERT_EQ(500u, frame->missing_packets.NumPacketsSlow());
2673 EXPECT_EQ(kMissingPacket - 499, frame->missing_packets.Min()); 2659 EXPECT_EQ(kMissingPacket - 499, frame->missing_packets.Min());
2674 EXPECT_EQ(kMissingPacket, frame->missing_packets.Max()); 2660 EXPECT_EQ(kMissingPacket, frame->missing_packets.Max());
2675 2661
2676 // Verify that the packet re-serializes identically. 2662 // Verify that the packet re-serializes identically.
2677 QuicFrames frames; 2663 QuicFrames frames;
2678 frames.push_back(QuicFrame(frame)); 2664 frames.push_back(QuicFrame(frame));
2679 std::unique_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); 2665 std::unique_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames));
2680 ASSERT_TRUE(data != nullptr); 2666 ASSERT_TRUE(data != nullptr);
2681 2667
2682 test::CompareCharArraysWithHexError("constructed packet", data->data(), 2668 test::CompareCharArraysWithHexError("constructed packet", data->data(),
2683 data->length(), AsChars(packet), 2669 data->length(), AsChars(packet),
2684 arraysize(packet)); 2670 arraysize(packet));
2685 } 2671 }
2686 2672
2687 TEST_P(QuicFramerTest, StopWaitingFrame) { 2673 TEST_P(QuicFramerTest, StopWaitingFrame) {
2688 // clang-format off 2674 // clang-format off
2689 unsigned char packet[] = { 2675 unsigned char packet[] = {
2690 // public flags (8 byte connection_id) 2676 // public flags (8 byte connection_id)
2691 0x3C, 2677 0x38,
2692 // connection_id 2678 // connection_id
2693 0x10, 0x32, 0x54, 0x76, 2679 0x10, 0x32, 0x54, 0x76,
2694 0x98, 0xBA, 0xDC, 0xFE, 2680 0x98, 0xBA, 0xDC, 0xFE,
2695 // packet number 2681 // packet number
2696 0xA8, 0x9A, 0x78, 0x56, 2682 0xA8, 0x9A, 0x78, 0x56,
2697 0x34, 0x12, 2683 0x34, 0x12,
2698 // private flags (entropy) 2684 // private flags (entropy)
2699 0x01, 2685 0x01,
2700 2686
2701 // frame type (ack frame) 2687 // frame type (ack frame)
2702 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) 2688 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta)
2703 0x06, 2689 0x06,
2704 // entropy hash of sent packets till least awaiting - 1. 2690 // entropy hash of sent packets till least awaiting - 1.
2705 0xAB, 2691 0xAB,
2706 // least packet number awaiting an ack, delta from packet number. 2692 // least packet number awaiting an ack, delta from packet number.
2707 0x08, 0x00, 0x00, 0x00, 2693 0x08, 0x00, 0x00, 0x00,
2708 0x00, 0x00, 2694 0x00, 0x00,
2709 }; 2695 };
2710 // clang-format on 2696 // clang-format on
2711 2697
2712 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2698 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2713 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2699 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2714 2700
2715 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2701 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2716 ASSERT_TRUE(visitor_.header_.get()); 2702 ASSERT_TRUE(visitor_.header_.get());
2717 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 2703 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
2704 !kIncludeDiversificationNonce));
2718 2705
2719 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 2706 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2720 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size()); 2707 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size());
2721 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0]; 2708 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0];
2722 EXPECT_EQ(0xAB, frame.entropy_hash); 2709 EXPECT_EQ(0xAB, frame.entropy_hash);
2723 EXPECT_EQ(kLeastUnacked, frame.least_unacked); 2710 EXPECT_EQ(kLeastUnacked, frame.least_unacked);
2724 2711
2725 const size_t kSentEntropyOffset = kQuicFrameTypeSize; 2712 const size_t kSentEntropyOffset = kQuicFrameTypeSize;
2726 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; 2713 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize;
2727 const size_t frame_size = 7; 2714 const size_t frame_size = 7;
2728 for (size_t i = kQuicFrameTypeSize; i < frame_size; ++i) { 2715 for (size_t i = kQuicFrameTypeSize; i < frame_size; ++i) {
2729 string expected_error; 2716 string expected_error;
2730 if (i < kLeastUnackedOffset) { 2717 if (i < kLeastUnackedOffset) {
2731 expected_error = "Unable to read entropy hash for sent packets."; 2718 expected_error = "Unable to read entropy hash for sent packets.";
2732 } else { 2719 } else {
2733 expected_error = "Unable to read least unacked delta."; 2720 expected_error = "Unable to read least unacked delta.";
2734 } 2721 }
2735 CheckProcessingFails( 2722 CheckProcessingFails(
2736 packet, 2723 packet,
2737 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2724 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2738 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 2725 !kIncludePathId, !kIncludeDiversificationNonce,
2726 PACKET_6BYTE_PACKET_NUMBER),
2739 expected_error, QUIC_INVALID_STOP_WAITING_DATA); 2727 expected_error, QUIC_INVALID_STOP_WAITING_DATA);
2740 } 2728 }
2741 } 2729 }
2742 2730
2743 TEST_P(QuicFramerTest, RstStreamFrameQuic) { 2731 TEST_P(QuicFramerTest, RstStreamFrameQuic) {
2744 // clang-format off 2732 // clang-format off
2745 unsigned char packet[] = { 2733 unsigned char packet[] = {
2746 // public flags (8 byte connection_id) 2734 // public flags (8 byte connection_id)
2747 0x3C, 2735 0x38,
2748 // connection_id 2736 // connection_id
2749 0x10, 0x32, 0x54, 0x76, 2737 0x10, 0x32, 0x54, 0x76,
2750 0x98, 0xBA, 0xDC, 0xFE, 2738 0x98, 0xBA, 0xDC, 0xFE,
2751 // packet number 2739 // packet number
2752 0xBC, 0x9A, 0x78, 0x56, 2740 0xBC, 0x9A, 0x78, 0x56,
2753 0x34, 0x12, 2741 0x34, 0x12,
2754 // private flags 2742 // private flags
2755 0x00, 2743 0x00,
2756 2744
2757 // frame type (rst stream frame) 2745 // frame type (rst stream frame)
2758 0x01, 2746 0x01,
2759 // stream id 2747 // stream id
2760 0x04, 0x03, 0x02, 0x01, 2748 0x04, 0x03, 0x02, 0x01,
2761 2749
2762 // sent byte offset 2750 // sent byte offset
2763 0x54, 0x76, 0x10, 0x32, 2751 0x54, 0x76, 0x10, 0x32,
2764 0xDC, 0xFE, 0x98, 0xBA, 2752 0xDC, 0xFE, 0x98, 0xBA,
2765 2753
2766 // error code 2754 // error code
2767 0x01, 0x00, 0x00, 0x00, 2755 0x01, 0x00, 0x00, 0x00,
2768 }; 2756 };
2769 // clang-format on 2757 // clang-format on
2770 2758
2771 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2759 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2772 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2760 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2773 2761
2774 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2762 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2775 ASSERT_TRUE(visitor_.header_.get()); 2763 ASSERT_TRUE(visitor_.header_.get());
2776 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 2764 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
2765 !kIncludeDiversificationNonce));
2777 2766
2778 EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id); 2767 EXPECT_EQ(kStreamId, visitor_.rst_stream_frame_.stream_id);
2779 EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code); 2768 EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code);
2780 EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset); 2769 EXPECT_EQ(kStreamOffset, visitor_.rst_stream_frame_.byte_offset);
2781 2770
2782 // Now test framing boundaries. 2771 // Now test framing boundaries.
2783 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetRstStreamFrameSize(); 2772 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetRstStreamFrameSize();
2784 ++i) { 2773 ++i) {
2785 string expected_error; 2774 string expected_error;
2786 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { 2775 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) {
2787 expected_error = "Unable to read stream_id."; 2776 expected_error = "Unable to read stream_id.";
2788 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + 2777 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize +
2789 kQuicMaxStreamOffsetSize) { 2778 kQuicMaxStreamOffsetSize) {
2790 expected_error = "Unable to read rst stream sent byte offset."; 2779 expected_error = "Unable to read rst stream sent byte offset.";
2791 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + 2780 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize +
2792 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize) { 2781 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize) {
2793 expected_error = "Unable to read rst stream error code."; 2782 expected_error = "Unable to read rst stream error code.";
2794 } 2783 }
2795 CheckProcessingFails( 2784 CheckProcessingFails(
2796 packet, 2785 packet,
2797 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2786 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2798 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 2787 !kIncludePathId, !kIncludeDiversificationNonce,
2788 PACKET_6BYTE_PACKET_NUMBER),
2799 expected_error, QUIC_INVALID_RST_STREAM_DATA); 2789 expected_error, QUIC_INVALID_RST_STREAM_DATA);
2800 } 2790 }
2801 } 2791 }
2802 2792
2803 TEST_P(QuicFramerTest, ConnectionCloseFrame) { 2793 TEST_P(QuicFramerTest, ConnectionCloseFrame) {
2804 // clang-format off 2794 // clang-format off
2805 unsigned char packet[] = { 2795 unsigned char packet[] = {
2806 // public flags (8 byte connection_id) 2796 // public flags (8 byte connection_id)
2807 0x3C, 2797 0x38,
2808 // connection_id 2798 // connection_id
2809 0x10, 0x32, 0x54, 0x76, 2799 0x10, 0x32, 0x54, 0x76,
2810 0x98, 0xBA, 0xDC, 0xFE, 2800 0x98, 0xBA, 0xDC, 0xFE,
2811 // packet number 2801 // packet number
2812 0xBC, 0x9A, 0x78, 0x56, 2802 0xBC, 0x9A, 0x78, 0x56,
2813 0x34, 0x12, 2803 0x34, 0x12,
2814 // private flags 2804 // private flags
2815 0x00, 2805 0x00,
2816 2806
2817 // frame type (connection close frame) 2807 // frame type (connection close frame)
2818 0x02, 2808 0x02,
2819 // error code 2809 // error code
2820 0x11, 0x00, 0x00, 0x00, 2810 0x11, 0x00, 0x00, 0x00,
2821 2811
2822 // error details length 2812 // error details length
2823 0x0d, 0x00, 2813 0x0d, 0x00,
2824 // error details 2814 // error details
2825 'b', 'e', 'c', 'a', 2815 'b', 'e', 'c', 'a',
2826 'u', 's', 'e', ' ', 2816 'u', 's', 'e', ' ',
2827 'I', ' ', 'c', 'a', 2817 'I', ' ', 'c', 'a',
2828 'n', 2818 'n',
2829 }; 2819 };
2830 // clang-format on 2820 // clang-format on
2831 2821
2832 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2822 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2833 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2823 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2834 2824
2835 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2825 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2836 ASSERT_TRUE(visitor_.header_.get()); 2826 ASSERT_TRUE(visitor_.header_.get());
2837 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 2827 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
2828 !kIncludeDiversificationNonce));
2838 2829
2839 EXPECT_EQ(0u, visitor_.stream_frames_.size()); 2830 EXPECT_EQ(0u, visitor_.stream_frames_.size());
2840 2831
2841 EXPECT_EQ(0x11, visitor_.connection_close_frame_.error_code); 2832 EXPECT_EQ(0x11, visitor_.connection_close_frame_.error_code);
2842 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details); 2833 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details);
2843 2834
2844 ASSERT_EQ(0u, visitor_.ack_frames_.size()); 2835 ASSERT_EQ(0u, visitor_.ack_frames_.size());
2845 2836
2846 // Now test framing boundaries. 2837 // Now test framing boundaries.
2847 for (size_t i = kQuicFrameTypeSize; 2838 for (size_t i = kQuicFrameTypeSize;
2848 i < QuicFramer::GetMinConnectionCloseFrameSize(); ++i) { 2839 i < QuicFramer::GetMinConnectionCloseFrameSize(); ++i) {
2849 string expected_error; 2840 string expected_error;
2850 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { 2841 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) {
2851 expected_error = "Unable to read connection close error code."; 2842 expected_error = "Unable to read connection close error code.";
2852 } else { 2843 } else {
2853 expected_error = "Unable to read connection close error details."; 2844 expected_error = "Unable to read connection close error details.";
2854 } 2845 }
2855 CheckProcessingFails( 2846 CheckProcessingFails(
2856 packet, 2847 packet,
2857 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2848 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2858 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 2849 !kIncludePathId, !kIncludeDiversificationNonce,
2850 PACKET_6BYTE_PACKET_NUMBER),
2859 expected_error, QUIC_INVALID_CONNECTION_CLOSE_DATA); 2851 expected_error, QUIC_INVALID_CONNECTION_CLOSE_DATA);
2860 } 2852 }
2861 } 2853 }
2862 2854
2863 TEST_P(QuicFramerTest, GoAwayFrame) { 2855 TEST_P(QuicFramerTest, GoAwayFrame) {
2864 // clang-format off 2856 // clang-format off
2865 unsigned char packet[] = { 2857 unsigned char packet[] = {
2866 // public flags (8 byte connection_id) 2858 // public flags (8 byte connection_id)
2867 0x3C, 2859 0x38,
2868 // connection_id 2860 // connection_id
2869 0x10, 0x32, 0x54, 0x76, 2861 0x10, 0x32, 0x54, 0x76,
2870 0x98, 0xBA, 0xDC, 0xFE, 2862 0x98, 0xBA, 0xDC, 0xFE,
2871 // packet number 2863 // packet number
2872 0xBC, 0x9A, 0x78, 0x56, 2864 0xBC, 0x9A, 0x78, 0x56,
2873 0x34, 0x12, 2865 0x34, 0x12,
2874 // private flags 2866 // private flags
2875 0x00, 2867 0x00,
2876 2868
2877 // frame type (go away frame) 2869 // frame type (go away frame)
(...skipping 10 matching lines...) Expand all
2888 'I', ' ', 'c', 'a', 2880 'I', ' ', 'c', 'a',
2889 'n', 2881 'n',
2890 }; 2882 };
2891 // clang-format on 2883 // clang-format on
2892 2884
2893 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2885 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2894 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2886 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2895 2887
2896 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2888 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2897 ASSERT_TRUE(visitor_.header_.get()); 2889 ASSERT_TRUE(visitor_.header_.get());
2898 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 2890 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
2891 !kIncludeDiversificationNonce));
2899 2892
2900 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id); 2893 EXPECT_EQ(kStreamId, visitor_.goaway_frame_.last_good_stream_id);
2901 EXPECT_EQ(0x9, visitor_.goaway_frame_.error_code); 2894 EXPECT_EQ(0x9, visitor_.goaway_frame_.error_code);
2902 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase); 2895 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase);
2903 2896
2904 const size_t reason_size = arraysize("because I can") - 1; 2897 const size_t reason_size = arraysize("because I can") - 1;
2905 // Now test framing boundaries. 2898 // Now test framing boundaries.
2906 for (size_t i = kQuicFrameTypeSize; 2899 for (size_t i = kQuicFrameTypeSize;
2907 i < QuicFramer::GetMinGoAwayFrameSize() + reason_size; ++i) { 2900 i < QuicFramer::GetMinGoAwayFrameSize() + reason_size; ++i) {
2908 string expected_error; 2901 string expected_error;
2909 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { 2902 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) {
2910 expected_error = "Unable to read go away error code."; 2903 expected_error = "Unable to read go away error code.";
2911 } else if (i < 2904 } else if (i <
2912 kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicMaxStreamIdSize) { 2905 kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicMaxStreamIdSize) {
2913 expected_error = "Unable to read last good stream id."; 2906 expected_error = "Unable to read last good stream id.";
2914 } else { 2907 } else {
2915 expected_error = "Unable to read goaway reason."; 2908 expected_error = "Unable to read goaway reason.";
2916 } 2909 }
2917 CheckProcessingFails( 2910 CheckProcessingFails(
2918 packet, 2911 packet,
2919 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2912 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2920 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 2913 !kIncludePathId, !kIncludeDiversificationNonce,
2914 PACKET_6BYTE_PACKET_NUMBER),
2921 expected_error, QUIC_INVALID_GOAWAY_DATA); 2915 expected_error, QUIC_INVALID_GOAWAY_DATA);
2922 } 2916 }
2923 } 2917 }
2924 2918
2925 TEST_P(QuicFramerTest, WindowUpdateFrame) { 2919 TEST_P(QuicFramerTest, WindowUpdateFrame) {
2926 // clang-format off 2920 // clang-format off
2927 unsigned char packet[] = { 2921 unsigned char packet[] = {
2928 // public flags (8 byte connection_id) 2922 // public flags (8 byte connection_id)
2929 0x3C, 2923 0x38,
2930 // connection_id 2924 // connection_id
2931 0x10, 0x32, 0x54, 0x76, 2925 0x10, 0x32, 0x54, 0x76,
2932 0x98, 0xBA, 0xDC, 0xFE, 2926 0x98, 0xBA, 0xDC, 0xFE,
2933 // packet number 2927 // packet number
2934 0xBC, 0x9A, 0x78, 0x56, 2928 0xBC, 0x9A, 0x78, 0x56,
2935 0x34, 0x12, 2929 0x34, 0x12,
2936 // private flags 2930 // private flags
2937 0x00, 2931 0x00,
2938 2932
2939 // frame type (window update frame) 2933 // frame type (window update frame)
2940 0x04, 2934 0x04,
2941 // stream id 2935 // stream id
2942 0x04, 0x03, 0x02, 0x01, 2936 0x04, 0x03, 0x02, 0x01,
2943 // byte offset 2937 // byte offset
2944 0x54, 0x76, 0x10, 0x32, 2938 0x54, 0x76, 0x10, 0x32,
2945 0xDC, 0xFE, 0x98, 0xBA, 2939 0xDC, 0xFE, 0x98, 0xBA,
2946 }; 2940 };
2947 // clang-format on 2941 // clang-format on
2948 2942
2949 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2943 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2950 2944
2951 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2945 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
2952 2946
2953 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2947 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
2954 ASSERT_TRUE(visitor_.header_.get()); 2948 ASSERT_TRUE(visitor_.header_.get());
2955 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 2949 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
2950 !kIncludeDiversificationNonce));
2956 2951
2957 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id); 2952 EXPECT_EQ(kStreamId, visitor_.window_update_frame_.stream_id);
2958 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset); 2953 EXPECT_EQ(kStreamOffset, visitor_.window_update_frame_.byte_offset);
2959 2954
2960 // Now test framing boundaries. 2955 // Now test framing boundaries.
2961 for (size_t i = kQuicFrameTypeSize; 2956 for (size_t i = kQuicFrameTypeSize;
2962 i < QuicFramer::GetWindowUpdateFrameSize(); ++i) { 2957 i < QuicFramer::GetWindowUpdateFrameSize(); ++i) {
2963 string expected_error; 2958 string expected_error;
2964 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { 2959 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) {
2965 expected_error = "Unable to read stream_id."; 2960 expected_error = "Unable to read stream_id.";
2966 } else { 2961 } else {
2967 expected_error = "Unable to read window byte_offset."; 2962 expected_error = "Unable to read window byte_offset.";
2968 } 2963 }
2969 CheckProcessingFails( 2964 CheckProcessingFails(
2970 packet, 2965 packet,
2971 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2966 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2972 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 2967 !kIncludePathId, !kIncludeDiversificationNonce,
2968 PACKET_6BYTE_PACKET_NUMBER),
2973 expected_error, QUIC_INVALID_WINDOW_UPDATE_DATA); 2969 expected_error, QUIC_INVALID_WINDOW_UPDATE_DATA);
2974 } 2970 }
2975 } 2971 }
2976 2972
2977 TEST_P(QuicFramerTest, BlockedFrame) { 2973 TEST_P(QuicFramerTest, BlockedFrame) {
2978 // clang-format off 2974 // clang-format off
2979 unsigned char packet[] = { 2975 unsigned char packet[] = {
2980 // public flags (8 byte connection_id) 2976 // public flags (8 byte connection_id)
2981 0x3C, 2977 0x38,
2982 // connection_id 2978 // connection_id
2983 0x10, 0x32, 0x54, 0x76, 2979 0x10, 0x32, 0x54, 0x76,
2984 0x98, 0xBA, 0xDC, 0xFE, 2980 0x98, 0xBA, 0xDC, 0xFE,
2985 // packet number 2981 // packet number
2986 0xBC, 0x9A, 0x78, 0x56, 2982 0xBC, 0x9A, 0x78, 0x56,
2987 0x34, 0x12, 2983 0x34, 0x12,
2988 // private flags 2984 // private flags
2989 0x00, 2985 0x00,
2990 2986
2991 // frame type (blocked frame) 2987 // frame type (blocked frame)
2992 0x05, 2988 0x05,
2993 // stream id 2989 // stream id
2994 0x04, 0x03, 0x02, 0x01, 2990 0x04, 0x03, 0x02, 0x01,
2995 }; 2991 };
2996 // clang-format on 2992 // clang-format on
2997 2993
2998 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2994 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
2999 2995
3000 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2996 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
3001 2997
3002 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2998 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
3003 ASSERT_TRUE(visitor_.header_.get()); 2999 ASSERT_TRUE(visitor_.header_.get());
3004 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 3000 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
3001 !kIncludeDiversificationNonce));
3005 3002
3006 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id); 3003 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
3007 3004
3008 // Now test framing boundaries. 3005 // Now test framing boundaries.
3009 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetBlockedFrameSize(); 3006 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetBlockedFrameSize();
3010 ++i) { 3007 ++i) {
3011 string expected_error = "Unable to read stream_id."; 3008 string expected_error = "Unable to read stream_id.";
3012 CheckProcessingFails( 3009 CheckProcessingFails(
3013 packet, 3010 packet,
3014 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 3011 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
3015 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 3012 !kIncludePathId, !kIncludeDiversificationNonce,
3013 PACKET_6BYTE_PACKET_NUMBER),
3016 expected_error, QUIC_INVALID_BLOCKED_DATA); 3014 expected_error, QUIC_INVALID_BLOCKED_DATA);
3017 } 3015 }
3018 } 3016 }
3019 3017
3020 TEST_P(QuicFramerTest, PingFrame) { 3018 TEST_P(QuicFramerTest, PingFrame) {
3021 // clang-format off 3019 // clang-format off
3022 unsigned char packet[] = { 3020 unsigned char packet[] = {
3023 // public flags (8 byte connection_id) 3021 // public flags (8 byte connection_id)
3024 0x3C, 3022 0x38,
3025 // connection_id 3023 // connection_id
3026 0x10, 0x32, 0x54, 0x76, 3024 0x10, 0x32, 0x54, 0x76,
3027 0x98, 0xBA, 0xDC, 0xFE, 3025 0x98, 0xBA, 0xDC, 0xFE,
3028 // packet number 3026 // packet number
3029 0xBC, 0x9A, 0x78, 0x56, 3027 0xBC, 0x9A, 0x78, 0x56,
3030 0x34, 0x12, 3028 0x34, 0x12,
3031 // private flags 3029 // private flags
3032 0x00, 3030 0x00,
3033 3031
3034 // frame type (ping frame) 3032 // frame type (ping frame)
3035 0x07, 3033 0x07,
3036 }; 3034 };
3037 // clang-format on 3035 // clang-format on
3038 3036
3039 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 3037 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
3040 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 3038 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
3041 3039
3042 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 3040 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
3043 ASSERT_TRUE(visitor_.header_.get()); 3041 ASSERT_TRUE(visitor_.header_.get());
3044 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 3042 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId,
3043 !kIncludeDiversificationNonce));
3045 3044
3046 EXPECT_EQ(1u, visitor_.ping_frames_.size()); 3045 EXPECT_EQ(1u, visitor_.ping_frames_.size());
3047 3046
3048 // No need to check the PING frame boundaries because it has no payload. 3047 // No need to check the PING frame boundaries because it has no payload.
3049 } 3048 }
3050 3049
3051 TEST_P(QuicFramerTest, PathCloseFrame) { 3050 TEST_P(QuicFramerTest, PathCloseFrame) {
3052 // clang-format off 3051 // clang-format off
3053 unsigned char packet[] = { 3052 unsigned char packet[] = {
3054 // public flags (version) 3053 // public flags (version)
3055 0x7C, 3054 0x78,
3056 // connection_id 3055 // connection_id
3057 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 3056 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
3058 // path_id 3057 // path_id
3059 0x00, 3058 0x00,
3060 // packet number 3059 // packet number
3061 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 3060 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
3062 // private flags 3061 // private flags
3063 0x00, 3062 0x00,
3064 3063
3065 // frame type (path_close_frame) 3064 // frame type (path_close_frame)
(...skipping 14 matching lines...) Expand all
3080 // Now test framing boundaries. 3079 // Now test framing boundaries.
3081 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetPathCloseFrameSize(); 3080 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetPathCloseFrameSize();
3082 ++i) { 3081 ++i) {
3083 string expected_error; 3082 string expected_error;
3084 if (i < kQuicFrameTypeSize + kQuicPathIdSize) { 3083 if (i < kQuicFrameTypeSize + kQuicPathIdSize) {
3085 expected_error = "Unable to read path_id."; 3084 expected_error = "Unable to read path_id.";
3086 } 3085 }
3087 CheckProcessingFails( 3086 CheckProcessingFails(
3088 packet, 3087 packet,
3089 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 3088 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
3090 kIncludePathId, PACKET_6BYTE_PACKET_NUMBER), 3089 kIncludePathId, !kIncludeDiversificationNonce,
3090 PACKET_6BYTE_PACKET_NUMBER),
3091 expected_error, QUIC_INVALID_PATH_CLOSE_DATA); 3091 expected_error, QUIC_INVALID_PATH_CLOSE_DATA);
3092 } 3092 }
3093 } 3093 }
3094 3094
3095 TEST_P(QuicFramerTest, PublicResetPacket) { 3095 TEST_P(QuicFramerTest, PublicResetPacket) {
3096 // clang-format off 3096 // clang-format off
3097 unsigned char packet[] = { 3097 unsigned char packet[] = {
3098 // public flags (public reset, 8 byte connection_id) 3098 // public flags (public reset, 8 byte connection_id)
3099 0x0E, 3099 0x0A,
3100 // connection_id 3100 // connection_id
3101 0x10, 0x32, 0x54, 0x76, 3101 0x10, 0x32, 0x54, 0x76,
3102 0x98, 0xBA, 0xDC, 0xFE, 3102 0x98, 0xBA, 0xDC, 0xFE,
3103 // message tag (kPRST) 3103 // message tag (kPRST)
3104 'P', 'R', 'S', 'T', 3104 'P', 'R', 'S', 'T',
3105 // num_entries (2) + padding 3105 // num_entries (2) + padding
3106 0x02, 0x00, 0x00, 0x00, 3106 0x02, 0x00, 0x00, 0x00,
3107 // tag kRNON 3107 // tag kRNON
3108 'R', 'N', 'O', 'N', 3108 'R', 'N', 'O', 'N',
3109 // end offset 8 3109 // end offset 8
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3151 CheckProcessingFails(packet, i, expected_error, 3151 CheckProcessingFails(packet, i, expected_error,
3152 QUIC_INVALID_PUBLIC_RST_PACKET); 3152 QUIC_INVALID_PUBLIC_RST_PACKET);
3153 } 3153 }
3154 } 3154 }
3155 } 3155 }
3156 3156
3157 TEST_P(QuicFramerTest, PublicResetPacketWithTrailingJunk) { 3157 TEST_P(QuicFramerTest, PublicResetPacketWithTrailingJunk) {
3158 // clang-format off 3158 // clang-format off
3159 unsigned char packet[] = { 3159 unsigned char packet[] = {
3160 // public flags (public reset, 8 byte connection_id) 3160 // public flags (public reset, 8 byte connection_id)
3161 0x0E, 3161 0x0A,
3162 // connection_id 3162 // connection_id
3163 0x10, 0x32, 0x54, 0x76, 3163 0x10, 0x32, 0x54, 0x76,
3164 0x98, 0xBA, 0xDC, 0xFE, 3164 0x98, 0xBA, 0xDC, 0xFE,
3165 // message tag (kPRST) 3165 // message tag (kPRST)
3166 'P', 'R', 'S', 'T', 3166 'P', 'R', 'S', 'T',
3167 // num_entries (2) + padding 3167 // num_entries (2) + padding
3168 0x02, 0x00, 0x00, 0x00, 3168 0x02, 0x00, 0x00, 0x00,
3169 // tag kRNON 3169 // tag kRNON
3170 'R', 'N', 'O', 'N', 3170 'R', 'N', 'O', 'N',
3171 // end offset 8 3171 // end offset 8
(...skipping 15 matching lines...) Expand all
3187 3187
3188 string expected_error = "Unable to read reset message."; 3188 string expected_error = "Unable to read reset message.";
3189 CheckProcessingFails(packet, arraysize(packet), expected_error, 3189 CheckProcessingFails(packet, arraysize(packet), expected_error,
3190 QUIC_INVALID_PUBLIC_RST_PACKET); 3190 QUIC_INVALID_PUBLIC_RST_PACKET);
3191 } 3191 }
3192 3192
3193 TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) { 3193 TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) {
3194 // clang-format off 3194 // clang-format off
3195 unsigned char packet[] = { 3195 unsigned char packet[] = {
3196 // public flags (public reset, 8 byte connection_id) 3196 // public flags (public reset, 8 byte connection_id)
3197 0x0E, 3197 0x0A,
3198 // connection_id 3198 // connection_id
3199 0x10, 0x32, 0x54, 0x76, 3199 0x10, 0x32, 0x54, 0x76,
3200 0x98, 0xBA, 0xDC, 0xFE, 3200 0x98, 0xBA, 0xDC, 0xFE,
3201 // message tag (kPRST) 3201 // message tag (kPRST)
3202 'P', 'R', 'S', 'T', 3202 'P', 'R', 'S', 'T',
3203 // num_entries (3) + padding 3203 // num_entries (3) + padding
3204 0x03, 0x00, 0x00, 0x00, 3204 0x03, 0x00, 0x00, 0x00,
3205 // tag kRNON 3205 // tag kRNON
3206 'R', 'N', 'O', 'N', 3206 'R', 'N', 'O', 'N',
3207 // end offset 8 3207 // end offset 8
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
3258 CheckProcessingFails(packet, i, expected_error, 3258 CheckProcessingFails(packet, i, expected_error,
3259 QUIC_INVALID_PUBLIC_RST_PACKET); 3259 QUIC_INVALID_PUBLIC_RST_PACKET);
3260 } 3260 }
3261 } 3261 }
3262 } 3262 }
3263 3263
3264 TEST_P(QuicFramerTest, VersionNegotiationPacket) { 3264 TEST_P(QuicFramerTest, VersionNegotiationPacket) {
3265 // clang-format off 3265 // clang-format off
3266 unsigned char packet[] = { 3266 unsigned char packet[] = {
3267 // public flags (version, 8 byte connection_id) 3267 // public flags (version, 8 byte connection_id)
3268 0x3D, 3268 0x39,
3269 // connection_id 3269 // connection_id
3270 0x10, 0x32, 0x54, 0x76, 3270 0x10, 0x32, 0x54, 0x76,
3271 0x98, 0xBA, 0xDC, 0xFE, 3271 0x98, 0xBA, 0xDC, 0xFE,
3272 // version tag 3272 // version tag
3273 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), 3273 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
3274 'Q', '2', '.', '0', 3274 'Q', '2', '.', '0',
3275 }; 3275 };
3276 // clang-format on 3276 // clang-format on
3277 3277
3278 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT); 3278 QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
(...skipping 17 matching lines...) Expand all
3296 error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET; 3296 error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET;
3297 } 3297 }
3298 CheckProcessingFails(packet, i, expected_error, error_code); 3298 CheckProcessingFails(packet, i, expected_error, error_code);
3299 } 3299 }
3300 } 3300 }
3301 3301
3302 TEST_P(QuicFramerTest, DropFecPacket) { 3302 TEST_P(QuicFramerTest, DropFecPacket) {
3303 // clang-format off 3303 // clang-format off
3304 unsigned char packet[] = { 3304 unsigned char packet[] = {
3305 // public flags (8 byte connection_id) 3305 // public flags (8 byte connection_id)
3306 0x3C, 3306 0x38,
3307 // connection_id 3307 // connection_id
3308 0x10, 0x32, 0x54, 0x76, 3308 0x10, 0x32, 0x54, 0x76,
3309 0x98, 0xBA, 0xDC, 0xFE, 3309 0x98, 0xBA, 0xDC, 0xFE,
3310 // packet number 3310 // packet number
3311 0xBC, 0x9A, 0x78, 0x56, 3311 0xBC, 0x9A, 0x78, 0x56,
3312 0x34, 0x12, 3312 0x34, 0x12,
3313 // private flags (fec group & FEC) 3313 // private flags (fec group & FEC)
3314 0x06, 3314 0x06,
3315 // first fec protected packet offset 3315 // first fec protected packet offset
3316 0x01, 3316 0x01,
(...skipping 28 matching lines...) Expand all
3345 header.fec_group = 0; 3345 header.fec_group = 0;
3346 3346
3347 QuicPaddingFrame padding_frame; 3347 QuicPaddingFrame padding_frame;
3348 3348
3349 QuicFrames frames; 3349 QuicFrames frames;
3350 frames.push_back(QuicFrame(padding_frame)); 3350 frames.push_back(QuicFrame(padding_frame));
3351 3351
3352 // clang-format off 3352 // clang-format off
3353 unsigned char packet[kMaxPacketSize] = { 3353 unsigned char packet[kMaxPacketSize] = {
3354 // public flags (8 byte connection_id) 3354 // public flags (8 byte connection_id)
3355 0x3C, 3355 static_cast<unsigned char>(
3356 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
3356 // connection_id 3357 // connection_id
3357 0x10, 0x32, 0x54, 0x76, 3358 0x10, 0x32, 0x54, 0x76,
3358 0x98, 0xBA, 0xDC, 0xFE, 3359 0x98, 0xBA, 0xDC, 0xFE,
3359 // packet number 3360 // packet number
3360 0xBC, 0x9A, 0x78, 0x56, 3361 0xBC, 0x9A, 0x78, 0x56,
3361 0x34, 0x12, 3362 0x34, 0x12,
3362 // private flags 3363 // private flags
3363 0x00, 3364 0x00,
3364 3365
3365 // frame type (padding frame) 3366 // frame type (padding frame)
3366 0x00, 3367 0x00,
3367 0x00, 0x00, 0x00, 0x00 3368 0x00, 0x00, 0x00, 0x00
3368 }; 3369 };
3369 // clang-format on 3370 // clang-format on
3370 3371
3371 uint64_t header_size = 3372 uint64_t header_size = GetPacketHeaderSize(
3372 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 3373 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId,
3373 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER); 3374 !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER);
3374 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); 3375 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
3375 3376
3376 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); 3377 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
3377 ASSERT_TRUE(data != nullptr); 3378 ASSERT_TRUE(data != nullptr);
3378 3379
3379 test::CompareCharArraysWithHexError("constructed packet", data->data(), 3380 test::CompareCharArraysWithHexError("constructed packet", data->data(),
3380 data->length(), AsChars(packet), 3381 data->length(), AsChars(packet),
3381 arraysize(packet)); 3382 arraysize(packet));
3382 } 3383 }
3383 3384
3384 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) { 3385 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) {
3385 QuicPacketHeader header; 3386 QuicPacketHeader header;
3386 header.public_header.connection_id = kConnectionId; 3387 header.public_header.connection_id = kConnectionId;
3387 header.public_header.reset_flag = false; 3388 header.public_header.reset_flag = false;
3388 header.public_header.version_flag = false; 3389 header.public_header.version_flag = false;
3389 header.fec_flag = false; 3390 header.fec_flag = false;
3390 header.entropy_flag = false; 3391 header.entropy_flag = false;
3391 header.public_header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER; 3392 header.public_header.packet_number_length = PACKET_4BYTE_PACKET_NUMBER;
3392 header.packet_number = kPacketNumber; 3393 header.packet_number = kPacketNumber;
3393 header.fec_group = 0; 3394 header.fec_group = 0;
3394 3395
3395 QuicPaddingFrame padding_frame; 3396 QuicPaddingFrame padding_frame;
3396 3397
3397 QuicFrames frames; 3398 QuicFrames frames;
3398 frames.push_back(QuicFrame(padding_frame)); 3399 frames.push_back(QuicFrame(padding_frame));
3399 3400
3400 // clang-format off 3401 // clang-format off
3401 unsigned char packet[kMaxPacketSize] = { 3402 unsigned char packet[kMaxPacketSize] = {
3402 // public flags (8 byte connection_id and 4 byte packet number) 3403 // public flags (8 byte connection_id and 4 byte packet number)
3403 0x2C, 3404 static_cast<unsigned char>(
3405 framer_.version() > QUIC_VERSION_32 ? 0x28 : 0x2C),
3404 // connection_id 3406 // connection_id
3405 0x10, 0x32, 0x54, 0x76, 3407 0x10, 0x32, 0x54, 0x76,
3406 0x98, 0xBA, 0xDC, 0xFE, 3408 0x98, 0xBA, 0xDC, 0xFE,
3407 // packet number 3409 // packet number
3408 0xBC, 0x9A, 0x78, 0x56, 3410 0xBC, 0x9A, 0x78, 0x56,
3409 // private flags 3411 // private flags
3410 0x00, 3412 0x00,
3411 3413
3412 // frame type (padding frame) 3414 // frame type (padding frame)
3413 0x00, 3415 0x00,
3414 0x00, 0x00, 0x00, 0x00 3416 0x00, 0x00, 0x00, 0x00
3415 }; 3417 };
3416 // clang-format on 3418 // clang-format on
3417 3419
3418 uint64_t header_size = 3420 uint64_t header_size = GetPacketHeaderSize(
3419 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 3421 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId,
3420 !kIncludePathId, PACKET_4BYTE_PACKET_NUMBER); 3422 !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER);
3421 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); 3423 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
3422 3424
3423 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); 3425 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
3424 ASSERT_TRUE(data != nullptr); 3426 ASSERT_TRUE(data != nullptr);
3425 3427
3426 test::CompareCharArraysWithHexError("constructed packet", data->data(), 3428 test::CompareCharArraysWithHexError("constructed packet", data->data(),
3427 data->length(), AsChars(packet), 3429 data->length(), AsChars(packet),
3428 arraysize(packet)); 3430 arraysize(packet));
3429 } 3431 }
3430 3432
3431 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) { 3433 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) {
3432 QuicPacketHeader header; 3434 QuicPacketHeader header;
3433 header.public_header.connection_id = kConnectionId; 3435 header.public_header.connection_id = kConnectionId;
3434 header.public_header.reset_flag = false; 3436 header.public_header.reset_flag = false;
3435 header.public_header.version_flag = false; 3437 header.public_header.version_flag = false;
3436 header.fec_flag = false; 3438 header.fec_flag = false;
3437 header.entropy_flag = false; 3439 header.entropy_flag = false;
3438 header.public_header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER; 3440 header.public_header.packet_number_length = PACKET_2BYTE_PACKET_NUMBER;
3439 header.packet_number = kPacketNumber; 3441 header.packet_number = kPacketNumber;
3440 header.fec_group = 0; 3442 header.fec_group = 0;
3441 3443
3442 QuicPaddingFrame padding_frame; 3444 QuicPaddingFrame padding_frame;
3443 3445
3444 QuicFrames frames; 3446 QuicFrames frames;
3445 frames.push_back(QuicFrame(padding_frame)); 3447 frames.push_back(QuicFrame(padding_frame));
3446 3448
3447 // clang-format off 3449 // clang-format off
3448 unsigned char packet[kMaxPacketSize] = { 3450 unsigned char packet[kMaxPacketSize] = {
3449 // public flags (8 byte connection_id and 2 byte packet number) 3451 // public flags (8 byte connection_id and 2 byte packet number)
3450 0x1C, 3452 static_cast<unsigned char>(
3453 framer_.version() > QUIC_VERSION_32 ? 0x18 : 0x1C),
3451 // connection_id 3454 // connection_id
3452 0x10, 0x32, 0x54, 0x76, 3455 0x10, 0x32, 0x54, 0x76,
3453 0x98, 0xBA, 0xDC, 0xFE, 3456 0x98, 0xBA, 0xDC, 0xFE,
3454 // packet number 3457 // packet number
3455 0xBC, 0x9A, 3458 0xBC, 0x9A,
3456 // private flags 3459 // private flags
3457 0x00, 3460 0x00,
3458 3461
3459 // frame type (padding frame) 3462 // frame type (padding frame)
3460 0x00, 3463 0x00,
3461 0x00, 0x00, 0x00, 0x00 3464 0x00, 0x00, 0x00, 0x00
3462 }; 3465 };
3463 // clang-format on 3466 // clang-format on
3464 3467
3465 uint64_t header_size = 3468 uint64_t header_size = GetPacketHeaderSize(
3466 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 3469 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId,
3467 !kIncludePathId, PACKET_2BYTE_PACKET_NUMBER); 3470 !kIncludeDiversificationNonce, PACKET_2BYTE_PACKET_NUMBER);
3468 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); 3471 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
3469 3472
3470 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); 3473 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
3471 ASSERT_TRUE(data != nullptr); 3474 ASSERT_TRUE(data != nullptr);
3472 3475
3473 test::CompareCharArraysWithHexError("constructed packet", data->data(), 3476 test::CompareCharArraysWithHexError("constructed packet", data->data(),
3474 data->length(), AsChars(packet), 3477 data->length(), AsChars(packet),
3475 arraysize(packet)); 3478 arraysize(packet));
3476 } 3479 }
3477 3480
3478 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) { 3481 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) {
3479 QuicPacketHeader header; 3482 QuicPacketHeader header;
3480 header.public_header.connection_id = kConnectionId; 3483 header.public_header.connection_id = kConnectionId;
3481 header.public_header.reset_flag = false; 3484 header.public_header.reset_flag = false;
3482 header.public_header.version_flag = false; 3485 header.public_header.version_flag = false;
3483 header.fec_flag = false; 3486 header.fec_flag = false;
3484 header.entropy_flag = false; 3487 header.entropy_flag = false;
3485 header.public_header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER; 3488 header.public_header.packet_number_length = PACKET_1BYTE_PACKET_NUMBER;
3486 header.packet_number = kPacketNumber; 3489 header.packet_number = kPacketNumber;
3487 header.fec_group = 0; 3490 header.fec_group = 0;
3488 3491
3489 QuicPaddingFrame padding_frame; 3492 QuicPaddingFrame padding_frame;
3490 3493
3491 QuicFrames frames; 3494 QuicFrames frames;
3492 frames.push_back(QuicFrame(padding_frame)); 3495 frames.push_back(QuicFrame(padding_frame));
3493 3496
3494 // clang-format off 3497 // clang-format off
3495 unsigned char packet[kMaxPacketSize] = { 3498 unsigned char packet[kMaxPacketSize] = {
3496 // public flags (8 byte connection_id and 1 byte packet number) 3499 // public flags (8 byte connection_id and 1 byte packet number)
3497 0x0C, 3500 static_cast<unsigned char>(
3501 framer_.version() > QUIC_VERSION_32 ? 0x08 : 0x0C),
3498 // connection_id 3502 // connection_id
3499 0x10, 0x32, 0x54, 0x76, 3503 0x10, 0x32, 0x54, 0x76,
3500 0x98, 0xBA, 0xDC, 0xFE, 3504 0x98, 0xBA, 0xDC, 0xFE,
3501 // packet number 3505 // packet number
3502 0xBC, 3506 0xBC,
3503 // private flags 3507 // private flags
3504 0x00, 3508 0x00,
3505 3509
3506 // frame type (padding frame) 3510 // frame type (padding frame)
3507 0x00, 3511 0x00,
3508 0x00, 0x00, 0x00, 0x00 3512 0x00, 0x00, 0x00, 0x00
3509 }; 3513 };
3510 // clang-format on 3514 // clang-format on
3511 3515
3512 uint64_t header_size = 3516 uint64_t header_size = GetPacketHeaderSize(
3513 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 3517 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId,
3514 !kIncludePathId, PACKET_1BYTE_PACKET_NUMBER); 3518 !kIncludeDiversificationNonce, PACKET_1BYTE_PACKET_NUMBER);
3515 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); 3519 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
3516 3520
3517 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); 3521 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
3518 ASSERT_TRUE(data != nullptr); 3522 ASSERT_TRUE(data != nullptr);
3519 3523
3520 test::CompareCharArraysWithHexError("constructed packet", data->data(), 3524 test::CompareCharArraysWithHexError("constructed packet", data->data(),
3521 data->length(), AsChars(packet), 3525 data->length(), AsChars(packet),
3522 arraysize(packet)); 3526 arraysize(packet));
3523 } 3527 }
3524 3528
3525 TEST_P(QuicFramerTest, BuildStreamFramePacket) { 3529 TEST_P(QuicFramerTest, BuildStreamFramePacket) {
3526 QuicPacketHeader header; 3530 QuicPacketHeader header;
3527 header.public_header.connection_id = kConnectionId; 3531 header.public_header.connection_id = kConnectionId;
3528 header.public_header.reset_flag = false; 3532 header.public_header.reset_flag = false;
3529 header.public_header.version_flag = false; 3533 header.public_header.version_flag = false;
3530 header.fec_flag = false; 3534 header.fec_flag = false;
3531 header.entropy_flag = true; 3535 header.entropy_flag = true;
3532 header.packet_number = kPacketNumber; 3536 header.packet_number = kPacketNumber;
3533 header.fec_group = 0; 3537 header.fec_group = 0;
3534 3538
3535 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, 3539 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
3536 StringPiece("hello world!")); 3540 StringPiece("hello world!"));
3537 3541
3538 QuicFrames frames; 3542 QuicFrames frames;
3539 frames.push_back(QuicFrame(&stream_frame)); 3543 frames.push_back(QuicFrame(&stream_frame));
3540 3544
3541 // clang-format off 3545 // clang-format off
3542 unsigned char packet[] = { 3546 unsigned char packet[] = {
3543 // public flags (8 byte connection_id) 3547 // public flags (8 byte connection_id)
3544 0x3C, 3548 static_cast<unsigned char>(
3549 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
3545 // connection_id 3550 // connection_id
3546 0x10, 0x32, 0x54, 0x76, 3551 0x10, 0x32, 0x54, 0x76,
3547 0x98, 0xBA, 0xDC, 0xFE, 3552 0x98, 0xBA, 0xDC, 0xFE,
3548 // packet number 3553 // packet number
3549 0xBC, 0x9A, 0x78, 0x56, 3554 0xBC, 0x9A, 0x78, 0x56,
3550 0x34, 0x12, 3555 0x34, 0x12,
3551 // private flags (entropy) 3556 // private flags (entropy)
3552 0x01, 3557 0x01,
3553 3558
3554 // frame type (stream frame with fin and no length) 3559 // frame type (stream frame with fin and no length)
(...skipping 30 matching lines...) Expand all
3585 3590
3586 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, 3591 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
3587 StringPiece("hello world!")); 3592 StringPiece("hello world!"));
3588 3593
3589 QuicFrames frames; 3594 QuicFrames frames;
3590 frames.push_back(QuicFrame(&stream_frame)); 3595 frames.push_back(QuicFrame(&stream_frame));
3591 3596
3592 // clang-format off 3597 // clang-format off
3593 unsigned char packet[] = { 3598 unsigned char packet[] = {
3594 // public flags (version, 8 byte connection_id) 3599 // public flags (version, 8 byte connection_id)
3595 0x3D, 3600 static_cast<unsigned char>(
3601 framer_.version() > QUIC_VERSION_32 ? 0x39 : 0x3D),
3596 // connection_id 3602 // connection_id
3597 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 3603 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
3598 // version tag 3604 // version tag
3599 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), 3605 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
3600 // packet number 3606 // packet number
3601 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 3607 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
3602 // private flags (entropy) 3608 // private flags (entropy)
3603 0x01, 3609 0x01,
3604 3610
3605 // frame type (stream frame with fin and no length) 3611 // frame type (stream frame with fin and no length)
(...skipping 30 matching lines...) Expand all
3636 3642
3637 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, 3643 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
3638 StringPiece("hello world!")); 3644 StringPiece("hello world!"));
3639 3645
3640 QuicFrames frames; 3646 QuicFrames frames;
3641 frames.push_back(QuicFrame(&stream_frame)); 3647 frames.push_back(QuicFrame(&stream_frame));
3642 3648
3643 // clang-format off 3649 // clang-format off
3644 unsigned char packet[] = { 3650 unsigned char packet[] = {
3645 // public flags (8 byte connection_id) 3651 // public flags (8 byte connection_id)
3646 0x7C, 3652 static_cast<unsigned char>(
3653 framer_.version() > QUIC_VERSION_32 ? 0x78 : 0x7C),
3647 // connection_id 3654 // connection_id
3648 0x10, 0x32, 0x54, 0x76, 3655 0x10, 0x32, 0x54, 0x76,
3649 0x98, 0xBA, 0xDC, 0xFE, 3656 0x98, 0xBA, 0xDC, 0xFE,
3650 // path_id 3657 // path_id
3651 0x42, 3658 0x42,
3652 // packet number 3659 // packet number
3653 0xBC, 0x9A, 0x78, 0x56, 3660 0xBC, 0x9A, 0x78, 0x56,
3654 0x34, 0x12, 3661 0x34, 0x12,
3655 // private flags (entropy) 3662 // private flags (entropy)
3656 0x01, 3663 0x01,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
3691 3698
3692 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset, 3699 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
3693 StringPiece("hello world!")); 3700 StringPiece("hello world!"));
3694 3701
3695 QuicFrames frames; 3702 QuicFrames frames;
3696 frames.push_back(QuicFrame(&stream_frame)); 3703 frames.push_back(QuicFrame(&stream_frame));
3697 3704
3698 // clang-format off 3705 // clang-format off
3699 unsigned char packet[] = { 3706 unsigned char packet[] = {
3700 // public flags (8 byte connection_id) 3707 // public flags (8 byte connection_id)
3701 0x7D, 3708 static_cast<unsigned char>(
3709 framer_.version() > QUIC_VERSION_32 ? 0x79 : 0x7D),
3702 // connection_id 3710 // connection_id
3703 0x10, 0x32, 0x54, 0x76, 3711 0x10, 0x32, 0x54, 0x76,
3704 0x98, 0xBA, 0xDC, 0xFE, 3712 0x98, 0xBA, 0xDC, 0xFE,
3705 // version tag 3713 // version tag
3706 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), 3714 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
3707 // path_id 3715 // path_id
3708 0x42, 3716 0x42,
3709 // packet number 3717 // packet number
3710 0xBC, 0x9A, 0x78, 0x56, 3718 0xBC, 0x9A, 0x78, 0x56,
3711 0x34, 0x12, 3719 0x34, 0x12,
(...skipping 20 matching lines...) Expand all
3732 3740
3733 test::CompareCharArraysWithHexError("constructed packet", data->data(), 3741 test::CompareCharArraysWithHexError("constructed packet", data->data(),
3734 data->length(), AsChars(packet), 3742 data->length(), AsChars(packet),
3735 arraysize(packet)); 3743 arraysize(packet));
3736 } 3744 }
3737 3745
3738 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) { 3746 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) {
3739 // clang-format off 3747 // clang-format off
3740 unsigned char packet[] = { 3748 unsigned char packet[] = {
3741 // public flags (version, 8 byte connection_id) 3749 // public flags (version, 8 byte connection_id)
3742 0x0D, 3750 0x09,
3743 // connection_id 3751 // connection_id
3744 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 3752 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
3745 // version tag 3753 // version tag
3746 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), 3754 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
3747 }; 3755 };
3748 // clang-format on 3756 // clang-format on
3749 3757
3750 QuicConnectionId connection_id = kConnectionId; 3758 QuicConnectionId connection_id = kConnectionId;
3751 std::unique_ptr<QuicEncryptedPacket> data( 3759 std::unique_ptr<QuicEncryptedPacket> data(
3752 framer_.BuildVersionNegotiationPacket(connection_id, 3760 framer_.BuildVersionNegotiationPacket(connection_id,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
3804 // 0 more missing packets in range. 3812 // 0 more missing packets in range.
3805 0x00, 3813 0x00,
3806 // 0 revived packets. 3814 // 0 revived packets.
3807 0x00, 3815 0x00,
3808 }; 3816 };
3809 // clang-format on 3817 // clang-format on
3810 3818
3811 // clang-format off 3819 // clang-format off
3812 unsigned char packet_version32[] = { 3820 unsigned char packet_version32[] = {
3813 // public flags (8 byte connection_id) 3821 // public flags (8 byte connection_id)
3814 0x3C, 3822 static_cast<unsigned char>(
3823 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
3815 // connection_id 3824 // connection_id
3816 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 3825 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
3817 // packet number 3826 // packet number
3818 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 3827 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
3819 // private flags (entropy) 3828 // private flags (entropy)
3820 0x01, 3829 0x01,
3821 3830
3822 // frame type (ack frame) 3831 // frame type (ack frame)
3823 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) 3832 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta)
3824 0x6C, 3833 0x6C,
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
3955 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 3964 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
3956 3965
3957 // 0 revived packets. 3966 // 0 revived packets.
3958 0x00, 3967 0x00,
3959 }; 3968 };
3960 // clang-format on 3969 // clang-format on
3961 3970
3962 // clang-format off 3971 // clang-format off
3963 unsigned char packet_version32[] = { 3972 unsigned char packet_version32[] = {
3964 // public flags (8 byte connection_id) 3973 // public flags (8 byte connection_id)
3965 0x3C, 3974 static_cast<unsigned char>(
3975 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
3966 // connection_id 3976 // connection_id
3967 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 3977 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
3968 // packet number 3978 // packet number
3969 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 3979 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
3970 // private flags (entropy) 3980 // private flags (entropy)
3971 0x01, 3981 0x01,
3972 3982
3973 // frame type (ack frame) 3983 // frame type (ack frame)
3974 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) 3984 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta)
3975 0x74, 3985 0x74,
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
4069 for (size_t i = 1; i < 2 * 300; i += 2) { 4079 for (size_t i = 1; i < 2 * 300; i += 2) {
4070 ack_frame.missing_packets.Add(i); 4080 ack_frame.missing_packets.Add(i);
4071 } 4081 }
4072 4082
4073 QuicFrames frames; 4083 QuicFrames frames;
4074 frames.push_back(QuicFrame(&ack_frame)); 4084 frames.push_back(QuicFrame(&ack_frame));
4075 4085
4076 // clang-format off 4086 // clang-format off
4077 unsigned char packet[] = { 4087 unsigned char packet[] = {
4078 // public flags (8 byte connection_id) 4088 // public flags (8 byte connection_id)
4079 0x3C, 4089 0x3C,
4080 // connection_id 4090 // connection_id
4081 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 4091 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
4082 // packet number 4092 // packet number
4083 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 4093 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
4084 // private flags (entropy) 4094 // private flags (entropy)
4085 0x01, 4095 0x01,
4086 4096
4087 // frame type (ack frame) 4097 // frame type (ack frame)
4088 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) 4098 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta)
4089 0x74, 4099 0x74,
(...skipping 11 matching lines...) Expand all
4101 // 6 nack ranges 4111 // 6 nack ranges
4102 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 4112 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
4103 // 0 revived packets. 4113 // 0 revived packets.
4104 0x00, 4114 0x00,
4105 }; 4115 };
4106 // clang-format on 4116 // clang-format on
4107 4117
4108 // clang-format off 4118 // clang-format off
4109 unsigned char packet_version32[] = { 4119 unsigned char packet_version32[] = {
4110 // public flags (8 byte connection_id) 4120 // public flags (8 byte connection_id)
4111 0x3C, 4121 static_cast<unsigned char>(
4122 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
4112 // connection_id 4123 // connection_id
4113 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 4124 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
4114 // packet number 4125 // packet number
4115 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 4126 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
4116 // private flags (entropy) 4127 // private flags (entropy)
4117 0x01, 4128 0x01,
4118 4129
4119 // frame type (ack frame) 4130 // frame type (ack frame)
4120 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) 4131 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta)
4121 0x74, 4132 0x74,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
4167 QuicStopWaitingFrame stop_waiting_frame; 4178 QuicStopWaitingFrame stop_waiting_frame;
4168 stop_waiting_frame.entropy_hash = 0x14; 4179 stop_waiting_frame.entropy_hash = 0x14;
4169 stop_waiting_frame.least_unacked = kLeastUnacked; 4180 stop_waiting_frame.least_unacked = kLeastUnacked;
4170 4181
4171 QuicFrames frames; 4182 QuicFrames frames;
4172 frames.push_back(QuicFrame(&stop_waiting_frame)); 4183 frames.push_back(QuicFrame(&stop_waiting_frame));
4173 4184
4174 // clang-format off 4185 // clang-format off
4175 unsigned char packet[] = { 4186 unsigned char packet[] = {
4176 // public flags (8 byte connection_id) 4187 // public flags (8 byte connection_id)
4177 0x3C, 4188 static_cast<unsigned char>(
4189 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
4178 // connection_id 4190 // connection_id
4179 0x10, 0x32, 0x54, 0x76, 4191 0x10, 0x32, 0x54, 0x76,
4180 0x98, 0xBA, 0xDC, 0xFE, 4192 0x98, 0xBA, 0xDC, 0xFE,
4181 // packet number 4193 // packet number
4182 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 4194 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
4183 // private flags (entropy) 4195 // private flags (entropy)
4184 0x01, 4196 0x01,
4185 4197
4186 // frame type (stop waiting frame) 4198 // frame type (stop waiting frame)
4187 0x06, 4199 0x06,
(...skipping 24 matching lines...) Expand all
4212 header.fec_group = 0; 4224 header.fec_group = 0;
4213 4225
4214 QuicRstStreamFrame rst_frame; 4226 QuicRstStreamFrame rst_frame;
4215 rst_frame.stream_id = kStreamId; 4227 rst_frame.stream_id = kStreamId;
4216 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708); 4228 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708);
4217 rst_frame.byte_offset = 0x0807060504030201; 4229 rst_frame.byte_offset = 0x0807060504030201;
4218 4230
4219 // clang-format off 4231 // clang-format off
4220 unsigned char packet[] = { 4232 unsigned char packet[] = {
4221 // public flags (8 byte connection_id) 4233 // public flags (8 byte connection_id)
4222 0x3C, 4234 static_cast<unsigned char>(
4235 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
4223 // connection_id 4236 // connection_id
4224 0x10, 0x32, 0x54, 0x76, 4237 0x10, 0x32, 0x54, 0x76,
4225 0x98, 0xBA, 0xDC, 0xFE, 4238 0x98, 0xBA, 0xDC, 0xFE,
4226 // packet number 4239 // packet number
4227 0xBC, 0x9A, 0x78, 0x56, 4240 0xBC, 0x9A, 0x78, 0x56,
4228 0x34, 0x12, 4241 0x34, 0x12,
4229 // private flags 4242 // private flags
4230 0x00, 4243 0x00,
4231 4244
4232 // frame type (rst stream frame) 4245 // frame type (rst stream frame)
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4265 QuicConnectionCloseFrame close_frame; 4278 QuicConnectionCloseFrame close_frame;
4266 close_frame.error_code = static_cast<QuicErrorCode>(0x05060708); 4279 close_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
4267 close_frame.error_details = "because I can"; 4280 close_frame.error_details = "because I can";
4268 4281
4269 QuicFrames frames; 4282 QuicFrames frames;
4270 frames.push_back(QuicFrame(&close_frame)); 4283 frames.push_back(QuicFrame(&close_frame));
4271 4284
4272 // clang-format off 4285 // clang-format off
4273 unsigned char packet[] = { 4286 unsigned char packet[] = {
4274 // public flags (8 byte connection_id) 4287 // public flags (8 byte connection_id)
4275 0x3C, 4288 static_cast<unsigned char>(
4289 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
4276 // connection_id 4290 // connection_id
4277 0x10, 0x32, 0x54, 0x76, 4291 0x10, 0x32, 0x54, 0x76,
4278 0x98, 0xBA, 0xDC, 0xFE, 4292 0x98, 0xBA, 0xDC, 0xFE,
4279 // packet number 4293 // packet number
4280 0xBC, 0x9A, 0x78, 0x56, 4294 0xBC, 0x9A, 0x78, 0x56,
4281 0x34, 0x12, 4295 0x34, 0x12,
4282 // private flags (entropy) 4296 // private flags (entropy)
4283 0x01, 4297 0x01,
4284 4298
4285 // frame type (connection close frame) 4299 // frame type (connection close frame)
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4318 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708); 4332 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
4319 goaway_frame.last_good_stream_id = kStreamId; 4333 goaway_frame.last_good_stream_id = kStreamId;
4320 goaway_frame.reason_phrase = "because I can"; 4334 goaway_frame.reason_phrase = "because I can";
4321 4335
4322 QuicFrames frames; 4336 QuicFrames frames;
4323 frames.push_back(QuicFrame(&goaway_frame)); 4337 frames.push_back(QuicFrame(&goaway_frame));
4324 4338
4325 // clang-format off 4339 // clang-format off
4326 unsigned char packet[] = { 4340 unsigned char packet[] = {
4327 // public flags (8 byte connection_id) 4341 // public flags (8 byte connection_id)
4328 0x3C, 4342 static_cast<unsigned char>(
4343 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
4329 // connection_id 4344 // connection_id
4330 0x10, 0x32, 0x54, 0x76, 4345 0x10, 0x32, 0x54, 0x76,
4331 0x98, 0xBA, 0xDC, 0xFE, 4346 0x98, 0xBA, 0xDC, 0xFE,
4332 // packet number 4347 // packet number
4333 0xBC, 0x9A, 0x78, 0x56, 4348 0xBC, 0x9A, 0x78, 0x56,
4334 0x34, 0x12, 4349 0x34, 0x12,
4335 // private flags(entropy) 4350 // private flags(entropy)
4336 0x01, 4351 0x01,
4337 4352
4338 // frame type (go away frame) 4353 // frame type (go away frame)
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
4372 QuicWindowUpdateFrame window_update_frame; 4387 QuicWindowUpdateFrame window_update_frame;
4373 window_update_frame.stream_id = kStreamId; 4388 window_update_frame.stream_id = kStreamId;
4374 window_update_frame.byte_offset = 0x1122334455667788; 4389 window_update_frame.byte_offset = 0x1122334455667788;
4375 4390
4376 QuicFrames frames; 4391 QuicFrames frames;
4377 frames.push_back(QuicFrame(&window_update_frame)); 4392 frames.push_back(QuicFrame(&window_update_frame));
4378 4393
4379 // clang-format off 4394 // clang-format off
4380 unsigned char packet[] = { 4395 unsigned char packet[] = {
4381 // public flags (8 byte connection_id) 4396 // public flags (8 byte connection_id)
4382 0x3C, 4397 static_cast<unsigned char>(
4398 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
4383 // connection_id 4399 // connection_id
4384 0x10, 0x32, 0x54, 0x76, 4400 0x10, 0x32, 0x54, 0x76,
4385 0x98, 0xBA, 0xDC, 0xFE, 4401 0x98, 0xBA, 0xDC, 0xFE,
4386 // packet number 4402 // packet number
4387 0xBC, 0x9A, 0x78, 0x56, 4403 0xBC, 0x9A, 0x78, 0x56,
4388 0x34, 0x12, 4404 0x34, 0x12,
4389 // private flags(entropy) 4405 // private flags(entropy)
4390 0x01, 4406 0x01,
4391 4407
4392 // frame type (window update frame) 4408 // frame type (window update frame)
(...skipping 26 matching lines...) Expand all
4419 4435
4420 QuicBlockedFrame blocked_frame; 4436 QuicBlockedFrame blocked_frame;
4421 blocked_frame.stream_id = kStreamId; 4437 blocked_frame.stream_id = kStreamId;
4422 4438
4423 QuicFrames frames; 4439 QuicFrames frames;
4424 frames.push_back(QuicFrame(&blocked_frame)); 4440 frames.push_back(QuicFrame(&blocked_frame));
4425 4441
4426 // clang-format off 4442 // clang-format off
4427 unsigned char packet[] = { 4443 unsigned char packet[] = {
4428 // public flags (8 byte connection_id) 4444 // public flags (8 byte connection_id)
4429 0x3C, 4445 static_cast<unsigned char>(
4446 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
4430 // connection_id 4447 // connection_id
4431 0x10, 0x32, 0x54, 0x76, 4448 0x10, 0x32, 0x54, 0x76,
4432 0x98, 0xBA, 0xDC, 0xFE, 4449 0x98, 0xBA, 0xDC, 0xFE,
4433 // packet number 4450 // packet number
4434 0xBC, 0x9A, 0x78, 0x56, 4451 0xBC, 0x9A, 0x78, 0x56,
4435 0x34, 0x12, 4452 0x34, 0x12,
4436 // private flags(entropy) 4453 // private flags(entropy)
4437 0x01, 4454 0x01,
4438 4455
4439 // frame type (blocked frame) 4456 // frame type (blocked frame)
(...skipping 22 matching lines...) Expand all
4462 header.fec_group = 0; 4479 header.fec_group = 0;
4463 4480
4464 QuicPingFrame ping_frame; 4481 QuicPingFrame ping_frame;
4465 4482
4466 QuicFrames frames; 4483 QuicFrames frames;
4467 frames.push_back(QuicFrame(ping_frame)); 4484 frames.push_back(QuicFrame(ping_frame));
4468 4485
4469 // clang-format off 4486 // clang-format off
4470 unsigned char packet[] = { 4487 unsigned char packet[] = {
4471 // public flags (8 byte connection_id) 4488 // public flags (8 byte connection_id)
4472 0x3C, 4489 static_cast<unsigned char>(
4490 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
4473 // connection_id 4491 // connection_id
4474 0x10, 0x32, 0x54, 0x76, 4492 0x10, 0x32, 0x54, 0x76,
4475 0x98, 0xBA, 0xDC, 0xFE, 4493 0x98, 0xBA, 0xDC, 0xFE,
4476 // packet number 4494 // packet number
4477 0xBC, 0x9A, 0x78, 0x56, 4495 0xBC, 0x9A, 0x78, 0x56,
4478 0x34, 0x12, 4496 0x34, 0x12,
4479 // private flags(entropy) 4497 // private flags(entropy)
4480 0x01, 4498 0x01,
4481 4499
4482 // frame type (ping frame) 4500 // frame type (ping frame)
(...skipping 22 matching lines...) Expand all
4505 header.fec_group = 0; 4523 header.fec_group = 0;
4506 4524
4507 QuicPathCloseFrame path_close; 4525 QuicPathCloseFrame path_close;
4508 path_close.path_id = kPathId; 4526 path_close.path_id = kPathId;
4509 QuicFrames frames; 4527 QuicFrames frames;
4510 frames.push_back(QuicFrame(&path_close)); 4528 frames.push_back(QuicFrame(&path_close));
4511 4529
4512 // clang-format off 4530 // clang-format off
4513 unsigned char packet[] = { 4531 unsigned char packet[] = {
4514 // public flags (version) 4532 // public flags (version)
4515 0x7C, 4533 static_cast<unsigned char>(
4534 framer_.version() > QUIC_VERSION_32 ? 0x78 : 0X7C),
4516 // connection_id 4535 // connection_id
4517 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 4536 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
4518 // path_id 4537 // path_id
4519 0x00, 4538 0x00,
4520 // packet number 4539 // packet number
4521 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 4540 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
4522 // private flags (entropy) 4541 // private flags (entropy)
4523 0x01, 4542 0x01,
4524 4543
4525 // frame type (path_close_frame) 4544 // frame type (path_close_frame)
(...skipping 23 matching lines...) Expand all
4549 header.fec_group = 0; 4568 header.fec_group = 0;
4550 4569
4551 QuicMtuDiscoveryFrame mtu_discovery_frame; 4570 QuicMtuDiscoveryFrame mtu_discovery_frame;
4552 4571
4553 QuicFrames frames; 4572 QuicFrames frames;
4554 frames.push_back(QuicFrame(mtu_discovery_frame)); 4573 frames.push_back(QuicFrame(mtu_discovery_frame));
4555 4574
4556 // clang-format off 4575 // clang-format off
4557 unsigned char packet[] = { 4576 unsigned char packet[] = {
4558 // public flags (8 byte connection_id) 4577 // public flags (8 byte connection_id)
4559 0x3C, 4578 static_cast<unsigned char>(
4579 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
4560 // connection_id 4580 // connection_id
4561 0x10, 0x32, 0x54, 0x76, 4581 0x10, 0x32, 0x54, 0x76,
4562 0x98, 0xBA, 0xDC, 0xFE, 4582 0x98, 0xBA, 0xDC, 0xFE,
4563 // packet number 4583 // packet number
4564 0xBC, 0x9A, 0x78, 0x56, 4584 0xBC, 0x9A, 0x78, 0x56,
4565 0x34, 0x12, 4585 0x34, 0x12,
4566 // private flags(entropy) 4586 // private flags(entropy)
4567 0x01, 4587 0x01,
4568 4588
4569 // frame type (ping frame) 4589 // frame type (ping frame)
(...skipping 13 matching lines...) Expand all
4583 QuicPublicResetPacket reset_packet; 4603 QuicPublicResetPacket reset_packet;
4584 reset_packet.public_header.connection_id = kConnectionId; 4604 reset_packet.public_header.connection_id = kConnectionId;
4585 reset_packet.public_header.reset_flag = true; 4605 reset_packet.public_header.reset_flag = true;
4586 reset_packet.public_header.version_flag = false; 4606 reset_packet.public_header.version_flag = false;
4587 reset_packet.rejected_packet_number = kPacketNumber; 4607 reset_packet.rejected_packet_number = kPacketNumber;
4588 reset_packet.nonce_proof = kNonceProof; 4608 reset_packet.nonce_proof = kNonceProof;
4589 4609
4590 // clang-format off 4610 // clang-format off
4591 unsigned char packet[] = { 4611 unsigned char packet[] = {
4592 // public flags (public reset, 8 byte ConnectionId) 4612 // public flags (public reset, 8 byte ConnectionId)
4593 0x0E, 4613 0x0A,
4594 // connection_id 4614 // connection_id
4595 0x10, 0x32, 0x54, 0x76, 4615 0x10, 0x32, 0x54, 0x76,
4596 0x98, 0xBA, 0xDC, 0xFE, 4616 0x98, 0xBA, 0xDC, 0xFE,
4597 // message tag (kPRST) 4617 // message tag (kPRST)
4598 'P', 'R', 'S', 'T', 4618 'P', 'R', 'S', 'T',
4599 // num_entries (2) + padding 4619 // num_entries (2) + padding
4600 0x02, 0x00, 0x00, 0x00, 4620 0x02, 0x00, 0x00, 0x00,
4601 // tag kRNON 4621 // tag kRNON
4602 'R', 'N', 'O', 'N', 4622 'R', 'N', 'O', 'N',
4603 // end offset 8 4623 // end offset 8
(...skipping 25 matching lines...) Expand all
4629 reset_packet.public_header.connection_id = kConnectionId; 4649 reset_packet.public_header.connection_id = kConnectionId;
4630 reset_packet.public_header.reset_flag = true; 4650 reset_packet.public_header.reset_flag = true;
4631 reset_packet.public_header.version_flag = false; 4651 reset_packet.public_header.version_flag = false;
4632 reset_packet.rejected_packet_number = kPacketNumber; 4652 reset_packet.rejected_packet_number = kPacketNumber;
4633 reset_packet.nonce_proof = kNonceProof; 4653 reset_packet.nonce_proof = kNonceProof;
4634 reset_packet.client_address = IPEndPoint(Loopback4(), 0x1234); 4654 reset_packet.client_address = IPEndPoint(Loopback4(), 0x1234);
4635 4655
4636 // clang-format off 4656 // clang-format off
4637 unsigned char packet[] = { 4657 unsigned char packet[] = {
4638 // public flags (public reset, 8 byte ConnectionId) 4658 // public flags (public reset, 8 byte ConnectionId)
4639 0x0E, 4659 0x0A,
4640 // connection_id 4660 // connection_id
4641 0x10, 0x32, 0x54, 0x76, 4661 0x10, 0x32, 0x54, 0x76,
4642 0x98, 0xBA, 0xDC, 0xFE, 4662 0x98, 0xBA, 0xDC, 0xFE,
4643 // message tag (kPRST) 4663 // message tag (kPRST)
4644 'P', 'R', 'S', 'T', 4664 'P', 'R', 'S', 'T',
4645 // num_entries (3) + padding 4665 // num_entries (3) + padding
4646 0x03, 0x00, 0x00, 0x00, 4666 0x03, 0x00, 0x00, 0x00,
4647 // tag kRNON 4667 // tag kRNON
4648 'R', 'N', 'O', 'N', 4668 'R', 'N', 'O', 'N',
4649 // end offset 8 4669 // end offset 8
(...skipping 26 matching lines...) Expand all
4676 test::CompareCharArraysWithHexError("constructed packet", data->data(), 4696 test::CompareCharArraysWithHexError("constructed packet", data->data(),
4677 data->length(), AsChars(packet), 4697 data->length(), AsChars(packet),
4678 arraysize(packet)); 4698 arraysize(packet));
4679 } 4699 }
4680 4700
4681 TEST_P(QuicFramerTest, EncryptPacket) { 4701 TEST_P(QuicFramerTest, EncryptPacket) {
4682 QuicPacketNumber packet_number = kPacketNumber; 4702 QuicPacketNumber packet_number = kPacketNumber;
4683 // clang-format off 4703 // clang-format off
4684 unsigned char packet[] = { 4704 unsigned char packet[] = {
4685 // public flags (8 byte connection_id) 4705 // public flags (8 byte connection_id)
4686 0x3C, 4706 static_cast<unsigned char>(
4707 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
4687 // connection_id 4708 // connection_id
4688 0x10, 0x32, 0x54, 0x76, 4709 0x10, 0x32, 0x54, 0x76,
4689 0x98, 0xBA, 0xDC, 0xFE, 4710 0x98, 0xBA, 0xDC, 0xFE,
4690 // packet number 4711 // packet number
4691 0xBC, 0x9A, 0x78, 0x56, 4712 0xBC, 0x9A, 0x78, 0x56,
4692 0x34, 0x12, 4713 0x34, 0x12,
4693 // private flags 4714 // private flags
4694 0x00, 4715 0x00,
4695 4716
4696 // redundancy 4717 // redundancy
4697 'a', 'b', 'c', 'd', 4718 'a', 'b', 'c', 'd',
4698 'e', 'f', 'g', 'h', 4719 'e', 'f', 'g', 'h',
4699 'i', 'j', 'k', 'l', 4720 'i', 'j', 'k', 'l',
4700 'm', 'n', 'o', 'p', 4721 'm', 'n', 'o', 'p',
4701 }; 4722 };
4702 // clang-format on 4723 // clang-format on
4703 4724
4704 std::unique_ptr<QuicPacket> raw(new QuicPacket( 4725 std::unique_ptr<QuicPacket> raw(new QuicPacket(
4705 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, 4726 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID,
4706 !kIncludeVersion, !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER)); 4727 !kIncludeVersion, !kIncludePathId, !kIncludeDiversificationNonce,
4728 PACKET_6BYTE_PACKET_NUMBER));
4707 char buffer[kMaxPacketSize]; 4729 char buffer[kMaxPacketSize];
4708 size_t encrypted_length = 4730 size_t encrypted_length =
4709 framer_.EncryptPayload(ENCRYPTION_NONE, kDefaultPathId, packet_number, 4731 framer_.EncryptPayload(ENCRYPTION_NONE, kDefaultPathId, packet_number,
4710 *raw, buffer, kMaxPacketSize); 4732 *raw, buffer, kMaxPacketSize);
4711 4733
4712 ASSERT_NE(0u, encrypted_length); 4734 ASSERT_NE(0u, encrypted_length);
4713 EXPECT_TRUE(CheckEncryption(kDefaultPathId, packet_number, raw.get())); 4735 EXPECT_TRUE(CheckEncryption(kDefaultPathId, packet_number, raw.get()));
4714 } 4736 }
4715 4737
4716 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { 4738 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) {
4717 QuicPacketNumber packet_number = kPacketNumber; 4739 QuicPacketNumber packet_number = kPacketNumber;
4718 // clang-format off 4740 // clang-format off
4719 unsigned char packet[] = { 4741 unsigned char packet[] = {
4720 // public flags (version, 8 byte connection_id) 4742 // public flags (version, 8 byte connection_id)
4721 0x3D, 4743 0x39,
4722 // connection_id 4744 // connection_id
4723 0x10, 0x32, 0x54, 0x76, 4745 0x10, 0x32, 0x54, 0x76,
4724 0x98, 0xBA, 0xDC, 0xFE, 4746 0x98, 0xBA, 0xDC, 0xFE,
4725 // version tag 4747 // version tag
4726 'Q', '.', '1', '0', 4748 'Q', '.', '1', '0',
4727 // packet number 4749 // packet number
4728 0xBC, 0x9A, 0x78, 0x56, 4750 0xBC, 0x9A, 0x78, 0x56,
4729 0x34, 0x12, 4751 0x34, 0x12,
4730 // private flags 4752 // private flags
4731 0x00, 4753 0x00,
4732 4754
4733 // redundancy 4755 // redundancy
4734 'a', 'b', 'c', 'd', 4756 'a', 'b', 'c', 'd',
4735 'e', 'f', 'g', 'h', 4757 'e', 'f', 'g', 'h',
4736 'i', 'j', 'k', 'l', 4758 'i', 'j', 'k', 'l',
4737 'm', 'n', 'o', 'p', 4759 'm', 'n', 'o', 'p',
4738 }; 4760 };
4739 // clang-format on 4761 // clang-format on
4740 4762
4741 std::unique_ptr<QuicPacket> raw(new QuicPacket( 4763 std::unique_ptr<QuicPacket> raw(new QuicPacket(
4742 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, 4764 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID,
4743 kIncludeVersion, !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER)); 4765 kIncludeVersion, !kIncludePathId, !kIncludeDiversificationNonce,
4766 PACKET_6BYTE_PACKET_NUMBER));
4744 char buffer[kMaxPacketSize]; 4767 char buffer[kMaxPacketSize];
4745 size_t encrypted_length = 4768 size_t encrypted_length =
4746 framer_.EncryptPayload(ENCRYPTION_NONE, kDefaultPathId, packet_number, 4769 framer_.EncryptPayload(ENCRYPTION_NONE, kDefaultPathId, packet_number,
4747 *raw, buffer, kMaxPacketSize); 4770 *raw, buffer, kMaxPacketSize);
4748 4771
4749 ASSERT_NE(0u, encrypted_length); 4772 ASSERT_NE(0u, encrypted_length);
4750 EXPECT_TRUE(CheckEncryption(kDefaultPathId, packet_number, raw.get())); 4773 EXPECT_TRUE(CheckEncryption(kDefaultPathId, packet_number, raw.get()));
4751 } 4774 }
4752 4775
4753 TEST_P(QuicFramerTest, EncryptPacketWithMultipathFlag) { 4776 TEST_P(QuicFramerTest, EncryptPacketWithMultipathFlag) {
4754 QuicPacketNumber packet_number = kPacketNumber; 4777 QuicPacketNumber packet_number = kPacketNumber;
4755 // clang-format off 4778 // clang-format off
4756 unsigned char packet[] = { 4779 unsigned char packet[] = {
4757 // public flags (version, 8 byte connection_id) 4780 // public flags (version, 8 byte connection_id)
4758 0x7C, 4781 0x78,
4759 // connection_id 4782 // connection_id
4760 0x10, 0x32, 0x54, 0x76, 4783 0x10, 0x32, 0x54, 0x76,
4761 0x98, 0xBA, 0xDC, 0xFE, 4784 0x98, 0xBA, 0xDC, 0xFE,
4762 // path_id 4785 // path_id
4763 0x42, 4786 0x42,
4764 // packet number 4787 // packet number
4765 0xBC, 0x9A, 0x78, 0x56, 4788 0xBC, 0x9A, 0x78, 0x56,
4766 0x34, 0x12, 4789 0x34, 0x12,
4767 // private flags 4790 // private flags
4768 0x00, 4791 0x00,
4769 4792
4770 // redundancy 4793 // redundancy
4771 'a', 'b', 'c', 'd', 4794 'a', 'b', 'c', 'd',
4772 'e', 'f', 'g', 'h', 4795 'e', 'f', 'g', 'h',
4773 'i', 'j', 'k', 'l', 4796 'i', 'j', 'k', 'l',
4774 'm', 'n', 'o', 'p', 4797 'm', 'n', 'o', 'p',
4775 }; 4798 };
4776 // clang-format on 4799 // clang-format on
4777 4800
4778 std::unique_ptr<QuicPacket> raw(new QuicPacket( 4801 std::unique_ptr<QuicPacket> raw(new QuicPacket(
4779 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, 4802 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID,
4780 !kIncludeVersion, kIncludePathId, PACKET_6BYTE_PACKET_NUMBER)); 4803 !kIncludeVersion, kIncludePathId, !kIncludeDiversificationNonce,
4804 PACKET_6BYTE_PACKET_NUMBER));
4781 char buffer[kMaxPacketSize]; 4805 char buffer[kMaxPacketSize];
4782 size_t encrypted_length = framer_.EncryptPayload( 4806 size_t encrypted_length = framer_.EncryptPayload(
4783 ENCRYPTION_NONE, kPathId, packet_number, *raw, buffer, kMaxPacketSize); 4807 ENCRYPTION_NONE, kPathId, packet_number, *raw, buffer, kMaxPacketSize);
4784 4808
4785 ASSERT_NE(0u, encrypted_length); 4809 ASSERT_NE(0u, encrypted_length);
4786 EXPECT_TRUE(CheckEncryption(kPathId, packet_number, raw.get())); 4810 EXPECT_TRUE(CheckEncryption(kPathId, packet_number, raw.get()));
4787 } 4811 }
4788 4812
4789 TEST_P(QuicFramerTest, EncryptPacketWithBothVersionFlagAndMultipathFlag) { 4813 TEST_P(QuicFramerTest, EncryptPacketWithBothVersionFlagAndMultipathFlag) {
4790 QuicPacketNumber packet_number = kPacketNumber; 4814 QuicPacketNumber packet_number = kPacketNumber;
4791 // clang-format off 4815 // clang-format off
4792 unsigned char packet[] = { 4816 unsigned char packet[] = {
4793 // public flags (version, 8 byte connection_id) 4817 // public flags (version, 8 byte connection_id)
4794 0x7D, 4818 0x79,
4795 // connection_id 4819 // connection_id
4796 0x10, 0x32, 0x54, 0x76, 4820 0x10, 0x32, 0x54, 0x76,
4797 0x98, 0xBA, 0xDC, 0xFE, 4821 0x98, 0xBA, 0xDC, 0xFE,
4798 // version tag 4822 // version tag
4799 'Q', '.', '1', '0', 4823 'Q', '.', '1', '0',
4800 // path_id 4824 // path_id
4801 0x42, 4825 0x42,
4802 // packet number 4826 // packet number
4803 0xBC, 0x9A, 0x78, 0x56, 4827 0xBC, 0x9A, 0x78, 0x56,
4804 0x34, 0x12, 4828 0x34, 0x12,
4805 // private flags 4829 // private flags
4806 0x00, 4830 0x00,
4807 4831
4808 // redundancy 4832 // redundancy
4809 'a', 'b', 'c', 'd', 4833 'a', 'b', 'c', 'd',
4810 'e', 'f', 'g', 'h', 4834 'e', 'f', 'g', 'h',
4811 'i', 'j', 'k', 'l', 4835 'i', 'j', 'k', 'l',
4812 'm', 'n', 'o', 'p', 4836 'm', 'n', 'o', 'p',
4813 }; 4837 };
4814 // clang-format on 4838 // clang-format on
4815 4839
4816 std::unique_ptr<QuicPacket> raw(new QuicPacket( 4840 std::unique_ptr<QuicPacket> raw(new QuicPacket(
4817 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, 4841 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID,
4818 kIncludeVersion, kIncludePathId, PACKET_6BYTE_PACKET_NUMBER)); 4842 kIncludeVersion, kIncludePathId, !kIncludeDiversificationNonce,
4843 PACKET_6BYTE_PACKET_NUMBER));
4819 char buffer[kMaxPacketSize]; 4844 char buffer[kMaxPacketSize];
4820 size_t encrypted_length = framer_.EncryptPayload( 4845 size_t encrypted_length = framer_.EncryptPayload(
4821 ENCRYPTION_NONE, kPathId, packet_number, *raw, buffer, kMaxPacketSize); 4846 ENCRYPTION_NONE, kPathId, packet_number, *raw, buffer, kMaxPacketSize);
4822 4847
4823 ASSERT_NE(0u, encrypted_length); 4848 ASSERT_NE(0u, encrypted_length);
4824 EXPECT_TRUE(CheckEncryption(kPathId, packet_number, raw.get())); 4849 EXPECT_TRUE(CheckEncryption(kPathId, packet_number, raw.get()));
4825 } 4850 }
4826 4851
4827 TEST_P(QuicFramerTest, AckTruncationLargePacket) { 4852 TEST_P(QuicFramerTest, AckTruncationLargePacket) {
4828 QuicPacketHeader header; 4853 QuicPacketHeader header;
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
4946 raw_ack_packet.reset(BuildDataPacket(header, frames)); 4971 raw_ack_packet.reset(BuildDataPacket(header, frames));
4947 ASSERT_TRUE(raw_ack_packet != nullptr); 4972 ASSERT_TRUE(raw_ack_packet != nullptr);
4948 EXPECT_EQ(original_raw_length, raw_ack_packet->length()); 4973 EXPECT_EQ(original_raw_length, raw_ack_packet->length());
4949 ASSERT_TRUE(raw_ack_packet != nullptr); 4974 ASSERT_TRUE(raw_ack_packet != nullptr);
4950 } 4975 }
4951 4976
4952 TEST_P(QuicFramerTest, EntropyFlagTest) { 4977 TEST_P(QuicFramerTest, EntropyFlagTest) {
4953 // clang-format off 4978 // clang-format off
4954 unsigned char packet[] = { 4979 unsigned char packet[] = {
4955 // public flags (8 byte connection_id) 4980 // public flags (8 byte connection_id)
4956 0x3C, 4981 static_cast<unsigned char>(
4982 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
4957 // connection_id 4983 // connection_id
4958 0x10, 0x32, 0x54, 0x76, 4984 0x10, 0x32, 0x54, 0x76,
4959 0x98, 0xBA, 0xDC, 0xFE, 4985 0x98, 0xBA, 0xDC, 0xFE,
4960 // packet number 4986 // packet number
4961 0xBC, 0x9A, 0x78, 0x56, 4987 0xBC, 0x9A, 0x78, 0x56,
4962 0x34, 0x12, 4988 0x34, 0x12,
4963 // private flags (Entropy) 4989 // private flags (Entropy)
4964 0x01, 4990 0x01,
4965 4991
4966 // frame type (stream frame with fin and no length) 4992 // frame type (stream frame with fin and no length)
(...skipping 16 matching lines...) Expand all
4983 ASSERT_TRUE(visitor_.header_.get()); 5009 ASSERT_TRUE(visitor_.header_.get());
4984 EXPECT_TRUE(visitor_.header_->entropy_flag); 5010 EXPECT_TRUE(visitor_.header_->entropy_flag);
4985 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); 5011 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash);
4986 EXPECT_FALSE(visitor_.header_->fec_flag); 5012 EXPECT_FALSE(visitor_.header_->fec_flag);
4987 }; 5013 };
4988 5014
4989 TEST_P(QuicFramerTest, StopPacketProcessing) { 5015 TEST_P(QuicFramerTest, StopPacketProcessing) {
4990 // clang-format off 5016 // clang-format off
4991 unsigned char packet[] = { 5017 unsigned char packet[] = {
4992 // public flags (8 byte connection_id) 5018 // public flags (8 byte connection_id)
4993 0x3C, 5019 static_cast<unsigned char>(
5020 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C),
4994 // connection_id 5021 // connection_id
4995 0x10, 0x32, 0x54, 0x76, 5022 0x10, 0x32, 0x54, 0x76,
4996 0x98, 0xBA, 0xDC, 0xFE, 5023 0x98, 0xBA, 0xDC, 0xFE,
4997 // packet number 5024 // packet number
4998 0xBC, 0x9A, 0x78, 0x56, 5025 0xBC, 0x9A, 0x78, 0x56,
4999 0x34, 0x12, 5026 0x34, 0x12,
5000 // Entropy 5027 // Entropy
5001 0x01, 5028 0x01,
5002 5029
5003 // frame type (stream frame with fin) 5030 // frame type (stream frame with fin)
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
5181 'o', ' ', 'w', 'o', 5208 'o', ' ', 'w', 'o',
5182 'r', 'l', 'd', '!', 5209 'r', 'l', 'd', '!',
5183 }; 5210 };
5184 // clang-format on 5211 // clang-format on
5185 5212
5186 QuicFramerFuzzFunc(packet, arraysize(packet)); 5213 QuicFramerFuzzFunc(packet, arraysize(packet));
5187 } 5214 }
5188 5215
5189 } // namespace test 5216 } // namespace test
5190 } // namespace net 5217 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_framer.cc ('k') | net/quic/quic_packet_creator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698