| Index: net/quic/quic_framer_test.cc
|
| diff --git a/net/quic/quic_framer_test.cc b/net/quic/quic_framer_test.cc
|
| index eeecd0890bcb4e6e10027b6a118db2f753fa078a..8af9baf49216b6b443ea88f948dadaf405f9be61 100644
|
| --- a/net/quic/quic_framer_test.cc
|
| +++ b/net/quic/quic_framer_test.cc
|
| @@ -17,6 +17,7 @@
|
| #include "net/quic/quic_framer.h"
|
| #include "net/quic/quic_protocol.h"
|
| #include "net/quic/quic_utils.h"
|
| +#include "net/quic/test_tools/quic_framer_peer.h"
|
| #include "net/quic/test_tools/quic_test_utils.h"
|
|
|
| using base::hash_set;
|
| @@ -64,21 +65,6 @@ const size_t kPublicResetPacketNonceProofOffset =
|
| const size_t kPublicResetPacketRejectedSequenceNumberOffset =
|
| kPublicResetPacketNonceProofOffset + kPublicResetNonceSize;
|
|
|
| -class QuicFramerPeer {
|
| - public:
|
| - static QuicPacketSequenceNumber CalculatePacketSequenceNumberFromWire(
|
| - QuicFramer* framer,
|
| - QuicPacketSequenceNumber packet_sequence_number) {
|
| - return framer->CalculatePacketSequenceNumberFromWire(
|
| - packet_sequence_number);
|
| - }
|
| - static void SetLastSequenceNumber(
|
| - QuicFramer* framer,
|
| - QuicPacketSequenceNumber packet_sequence_number) {
|
| - framer->last_sequence_number_ = packet_sequence_number;
|
| - }
|
| -};
|
| -
|
| class TestEncrypter : public QuicEncrypter {
|
| public:
|
| virtual ~TestEncrypter() {}
|
| @@ -108,6 +94,12 @@ class TestEncrypter : public QuicEncrypter {
|
| virtual size_t GetCiphertextSize(size_t plaintext_size) const OVERRIDE {
|
| return plaintext_size;
|
| }
|
| + virtual StringPiece GetKey() const {
|
| + return StringPiece();
|
| + }
|
| + virtual StringPiece GetNoncePrefix() const {
|
| + return StringPiece();
|
| + }
|
| QuicPacketSequenceNumber sequence_number_;
|
| string associated_data_;
|
| string plaintext_;
|
| @@ -130,6 +122,12 @@ class TestDecrypter : public QuicDecrypter {
|
| ciphertext_ = ciphertext.as_string();
|
| return new QuicData(ciphertext.data(), ciphertext.length());
|
| }
|
| + virtual StringPiece GetKey() const {
|
| + return StringPiece();
|
| + }
|
| + virtual StringPiece GetNoncePrefix() const {
|
| + return StringPiece();
|
| + }
|
| QuicPacketSequenceNumber sequence_number_;
|
| string associated_data_;
|
| string ciphertext_;
|
| @@ -167,10 +165,21 @@ class TestQuicVisitor : public ::net::QuicFramerVisitorInterface {
|
| public_reset_packet_.reset(new QuicPublicResetPacket(packet));
|
| }
|
|
|
| + virtual void OnVersionNegotiationPacket(
|
| + const QuicVersionNegotiationPacket& packet) OVERRIDE {
|
| + version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet));
|
| + }
|
| +
|
| virtual void OnRevivedPacket() OVERRIDE {
|
| revived_packets_++;
|
| }
|
|
|
| + virtual bool OnProtocolVersionMismatch(
|
| + QuicVersionTag version) OVERRIDE {
|
| + DCHECK(false);
|
| + return true;
|
| + }
|
| +
|
| virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE {
|
| packet_count_++;
|
| header_.reset(new QuicPacketHeader(header));
|
| @@ -231,6 +240,7 @@ class TestQuicVisitor : public ::net::QuicFramerVisitorInterface {
|
|
|
| scoped_ptr<QuicPacketHeader> header_;
|
| scoped_ptr<QuicPublicResetPacket> public_reset_packet_;
|
| + scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
|
| vector<QuicStreamFrame*> stream_frames_;
|
| vector<QuicAckFrame*> ack_frames_;
|
| vector<QuicCongestionFeedbackFrame*> congestion_feedback_frames_;
|
| @@ -246,7 +256,7 @@ class QuicFramerTest : public ::testing::Test {
|
| QuicFramerTest()
|
| : encrypter_(new test::TestEncrypter()),
|
| decrypter_(new test::TestDecrypter()),
|
| - framer_(kQuicVersion1, decrypter_, encrypter_) {
|
| + framer_(kQuicVersion1, decrypter_, encrypter_, true) {
|
| framer_.set_visitor(&visitor_);
|
| framer_.set_entropy_calculator(&entropy_calculator_);
|
| }
|
| @@ -555,7 +565,7 @@ TEST_F(QuicFramerTest, PacketHeaderWithVersionFlag) {
|
| visitor_.header_->public_header.guid);
|
| EXPECT_FALSE(visitor_.header_->public_header.reset_flag);
|
| EXPECT_TRUE(visitor_.header_->public_header.version_flag);
|
| - EXPECT_EQ(kQuicVersion1, visitor_.header_->public_header.version);
|
| + EXPECT_EQ(kQuicVersion1, visitor_.header_->public_header.versions[0]);
|
| EXPECT_FALSE(visitor_.header_->fec_flag);
|
| EXPECT_FALSE(visitor_.header_->entropy_flag);
|
| EXPECT_FALSE(visitor_.header_->fec_entropy_flag);
|
| @@ -814,7 +824,7 @@ TEST_F(QuicFramerTest, StreamFrameWithVersion) {
|
| EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
|
| ASSERT_TRUE(visitor_.header_.get());
|
| EXPECT_TRUE(visitor_.header_.get()->public_header.version_flag);
|
| - EXPECT_EQ(kQuicVersion1, visitor_.header_.get()->public_header.version);
|
| + EXPECT_EQ(kQuicVersion1, visitor_.header_.get()->public_header.versions[0]);
|
| EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion));
|
|
|
| ASSERT_EQ(1u, visitor_.stream_frames_.size());
|
| @@ -1562,6 +1572,7 @@ TEST_F(QuicFramerTest, PublicResetPacket) {
|
| // Now test framing boundaries
|
| for (size_t i = 0; i < GetPublicResetPacketSize(); ++i) {
|
| string expected_error;
|
| + DLOG(INFO) << "iteration: " << i;
|
| if (i < kPublicFlagsOffset) {
|
| expected_error = "Unable to read GUID.";
|
| } else if (i < kPublicResetPacketNonceProofOffset) {
|
| @@ -1575,6 +1586,42 @@ TEST_F(QuicFramerTest, PublicResetPacket) {
|
| }
|
| }
|
|
|
| +TEST_F(QuicFramerTest, VersionNegotiationPacket) {
|
| + unsigned char packet[] = {
|
| + 0x10, 0x32, 0x54, 0x76,
|
| + 0x98, 0xBA, 0xDC, 0xFE,
|
| + // public flags (version)
|
| + 0x01,
|
| + // version tag
|
| + 'Q', '1', '.', '0',
|
| + 'Q', '2', '.', '0',
|
| + };
|
| +
|
| + QuicFramerPeer::SetIsServer(&framer_, false);
|
| +
|
| + QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
|
| + EXPECT_TRUE(framer_.ProcessPacket(encrypted));
|
| + ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
|
| + ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
|
| + EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size());
|
| + EXPECT_EQ(kQuicVersion1,
|
| + visitor_.version_negotiation_packet_->versions[0]);
|
| +
|
| + for (size_t i = 0; i <= kQuicGuidSize + kPublicFlagsSize; ++i) {
|
| + string expected_error;
|
| + QuicErrorCode error_code = QUIC_INVALID_PACKET_HEADER;
|
| + if (i < kPublicFlagsOffset) {
|
| + expected_error = "Unable to read GUID.";
|
| + } else if (i < kVersionOffset) {
|
| + expected_error = "Unable to read public flags.";
|
| + } else {
|
| + expected_error = "Unable to read supported version in negotiation.";
|
| + error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET;
|
| + }
|
| + CheckProcessingFails(packet, i, expected_error, error_code);
|
| + }
|
| +}
|
| +
|
| TEST_F(QuicFramerTest, FecPacket) {
|
| unsigned char packet[] = {
|
| // guid
|
| @@ -1771,6 +1818,7 @@ TEST_F(QuicFramerTest, ConstructStreamFramePacketWithVersionFlag) {
|
| 'r', 'l', 'd', '!',
|
| };
|
|
|
| + QuicFramerPeer::SetIsServer(&framer_, false);
|
| scoped_ptr<QuicPacket> data(
|
| framer_.ConstructFrameDataPacket(header, frames).packet);
|
| ASSERT_TRUE(data != NULL);
|
| @@ -1780,6 +1828,33 @@ TEST_F(QuicFramerTest, ConstructStreamFramePacketWithVersionFlag) {
|
| AsChars(packet), arraysize(packet));
|
| }
|
|
|
| +TEST_F(QuicFramerTest, ConstructVersionNegotiationPacket) {
|
| + QuicPacketPublicHeader header;
|
| + header.guid = GG_UINT64_C(0xFEDCBA9876543210);
|
| + header.reset_flag = false;
|
| + header.version_flag = true;
|
| +
|
| + unsigned char packet[] = {
|
| + 0x10, 0x32, 0x54, 0x76,
|
| + 0x98, 0xBA, 0xDC, 0xFE,
|
| + // public flags (version)
|
| + 0x01,
|
| + // version tag
|
| + 'Q', '1', '.', '0',
|
| + 'Q', '2', '.', '0',
|
| + };
|
| +
|
| + const int kQuicVersion2 = MAKE_TAG('Q', '2', '.', '0');
|
| + QuicVersionTagList versions;
|
| + versions.push_back(kQuicVersion1);
|
| + versions.push_back(kQuicVersion2);
|
| + scoped_ptr<QuicEncryptedPacket> data(
|
| + framer_.ConstructVersionNegotiationPacket(header, versions));
|
| +
|
| + test::CompareCharArraysWithHexError("constructed packet",
|
| + data->data(), data->length(),
|
| + AsChars(packet), arraysize(packet));
|
| +}
|
|
|
| TEST_F(QuicFramerTest, ConstructAckFramePacket) {
|
| QuicPacketHeader header;
|
|
|