| Index: net/quic/quic_connection_test.cc
|
| diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc
|
| index 091dc9ec86df1633ed9a77efbb0ea3c93a1e5618..0dc817c762b80e59ee8beda1ac3f568e6a39a362 100644
|
| --- a/net/quic/quic_connection_test.cc
|
| +++ b/net/quic/quic_connection_test.cc
|
| @@ -9,7 +9,6 @@
|
| #include "base/stl_util.h"
|
| #include "net/base/net_errors.h"
|
| #include "net/quic/congestion_control/loss_detection_interface.h"
|
| -#include "net/quic/congestion_control/receive_algorithm_interface.h"
|
| #include "net/quic/congestion_control/send_algorithm_interface.h"
|
| #include "net/quic/crypto/null_encrypter.h"
|
| #include "net/quic/crypto/quic_decrypter.h"
|
| @@ -64,17 +63,6 @@ const QuicPacketEntropyHash kTestEntropyHash = 76;
|
|
|
| const int kDefaultRetransmissionTimeMs = 500;
|
|
|
| -class TestReceiveAlgorithm : public ReceiveAlgorithmInterface {
|
| - public:
|
| - TestReceiveAlgorithm() {}
|
| -
|
| - MOCK_METHOD3(RecordIncomingPacket,
|
| - void(QuicByteCount, QuicPacketSequenceNumber, QuicTime));
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(TestReceiveAlgorithm);
|
| -};
|
| -
|
| // TaggingEncrypter appends kTagSize bytes of |tag| to the end of each message.
|
| class TaggingEncrypter : public QuicEncrypter {
|
| public:
|
| @@ -99,13 +87,20 @@ class TaggingEncrypter : public QuicEncrypter {
|
| return true;
|
| }
|
|
|
| - QuicData* EncryptPacket(QuicPacketSequenceNumber sequence_number,
|
| - StringPiece associated_data,
|
| - StringPiece plaintext) override {
|
| + bool EncryptPacket(QuicPacketSequenceNumber sequence_number,
|
| + StringPiece associated_data,
|
| + StringPiece plaintext,
|
| + char* output,
|
| + size_t* output_length,
|
| + size_t max_output_length) override {
|
| const size_t len = plaintext.size() + kTagSize;
|
| - uint8* buffer = new uint8[len];
|
| - Encrypt(StringPiece(), associated_data, plaintext, buffer);
|
| - return new QuicData(reinterpret_cast<char*>(buffer), len, true);
|
| + if (max_output_length < len) {
|
| + return false;
|
| + }
|
| + Encrypt(StringPiece(), associated_data, plaintext,
|
| + reinterpret_cast<unsigned char*>(output));
|
| + *output_length = len;
|
| + return true;
|
| }
|
|
|
| size_t GetKeySize() const override { return 0; }
|
| @@ -144,20 +139,21 @@ class TaggingDecrypter : public QuicDecrypter {
|
|
|
| bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; }
|
|
|
| - QuicData* DecryptPacket(QuicPacketSequenceNumber sequence_number,
|
| - StringPiece associated_data,
|
| - StringPiece ciphertext) override {
|
| + bool DecryptPacket(QuicPacketSequenceNumber sequence_number,
|
| + const StringPiece& associated_data,
|
| + const StringPiece& ciphertext,
|
| + char* output,
|
| + size_t* output_length,
|
| + size_t max_output_length) override {
|
| if (ciphertext.size() < kTagSize) {
|
| - return nullptr;
|
| + return false;
|
| }
|
| if (!CheckTag(ciphertext, GetTag(ciphertext))) {
|
| - return nullptr;
|
| + return false;
|
| }
|
| - const size_t len = ciphertext.size() - kTagSize;
|
| - uint8* buf = new uint8[len];
|
| - memcpy(buf, ciphertext.data(), len);
|
| - return new QuicData(reinterpret_cast<char*>(buf), len,
|
| - true /* owns buffer */);
|
| + *output_length = ciphertext.size() - kTagSize;
|
| + memcpy(output, ciphertext.data(), *output_length);
|
| + return true;
|
| }
|
|
|
| StringPiece GetKey() const override { return StringPiece(); }
|
| @@ -408,10 +404,6 @@ class TestConnection : public QuicConnection {
|
| QuicConnectionPeer::SendAck(this);
|
| }
|
|
|
| - void SetReceiveAlgorithm(TestReceiveAlgorithm* receive_algorithm) {
|
| - QuicConnectionPeer::SetReceiveAlgorithm(this, receive_algorithm);
|
| - }
|
| -
|
| void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) {
|
| QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm);
|
| }
|
| @@ -430,9 +422,13 @@ class TestConnection : public QuicConnection {
|
| retransmittable == HAS_RETRANSMITTABLE_DATA
|
| ? new RetransmittableFrames()
|
| : nullptr;
|
| - OnSerializedPacket(
|
| - SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER,
|
| - packet, entropy_hash, retransmittable_frames));
|
| + QuicEncryptedPacket* encrypted =
|
| + QuicConnectionPeer::GetFramer(this)
|
| + ->EncryptPacket(ENCRYPTION_NONE, sequence_number, *packet);
|
| + delete packet;
|
| + OnSerializedPacket(SerializedPacket(sequence_number,
|
| + PACKET_6BYTE_SEQUENCE_NUMBER, encrypted,
|
| + entropy_hash, retransmittable_frames));
|
| }
|
|
|
| QuicConsumedData SendStreamDataWithString(
|
| @@ -603,7 +599,6 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> {
|
| peer_creator_(connection_id_, &framer_, &random_generator_),
|
| send_algorithm_(new StrictMock<MockSendAlgorithm>),
|
| loss_algorithm_(new MockLossAlgorithm()),
|
| - receive_algorithm_(new TestReceiveAlgorithm),
|
| helper_(new TestConnectionHelper(&clock_, &random_generator_)),
|
| writer_(new TestPacketWriter(version(), &clock_)),
|
| factory_(writer_.get()),
|
| @@ -624,12 +619,9 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> {
|
| connection_.SetSendAlgorithm(send_algorithm_);
|
| connection_.SetLossAlgorithm(loss_algorithm_);
|
| framer_.set_received_entropy_calculator(&entropy_calculator_);
|
| - connection_.SetReceiveAlgorithm(receive_algorithm_);
|
| EXPECT_CALL(
|
| *send_algorithm_, TimeUntilSend(_, _, _)).WillRepeatedly(Return(
|
| QuicTime::Delta::Zero()));
|
| - EXPECT_CALL(*receive_algorithm_,
|
| - RecordIncomingPacket(_, _, _)).Times(AnyNumber());
|
| EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
|
| .Times(AnyNumber());
|
| EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly(
|
| @@ -662,14 +654,13 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> {
|
| }
|
|
|
| QuicAckFrame* outgoing_ack() {
|
| - outgoing_ack_.reset(QuicConnectionPeer::CreateAckFrame(&connection_));
|
| - return outgoing_ack_.get();
|
| + QuicConnectionPeer::PopulateAckFrame(&connection_, &ack_);
|
| + return &ack_;
|
| }
|
|
|
| QuicStopWaitingFrame* stop_waiting() {
|
| - stop_waiting_.reset(
|
| - QuicConnectionPeer::CreateStopWaitingFrame(&connection_));
|
| - return stop_waiting_.get();
|
| + QuicConnectionPeer::PopulateStopWaitingFrame(&connection_, &stop_waiting_);
|
| + return &stop_waiting_;
|
| }
|
|
|
| QuicPacketSequenceNumber least_unacked() {
|
| @@ -695,10 +686,7 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> {
|
| connection_.is_server());
|
| SerializedPacket serialized_packet =
|
| peer_creator_.SerializeAllFrames(frames);
|
| - scoped_ptr<QuicPacket> packet(serialized_packet.packet);
|
| - scoped_ptr<QuicEncryptedPacket> encrypted(
|
| - framer_.EncryptPacket(ENCRYPTION_NONE,
|
| - serialized_packet.sequence_number, *packet));
|
| + scoped_ptr<QuicEncryptedPacket> encrypted(serialized_packet.packet);
|
| connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
|
| return serialized_packet.entropy_hash;
|
| }
|
| @@ -796,7 +784,7 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> {
|
| fec_data.redundancy = data_packet->FecProtectedData();
|
|
|
| scoped_ptr<QuicPacket> fec_packet(
|
| - framer_.BuildFecPacket(header_, fec_data).packet);
|
| + framer_.BuildFecPacket(header_, fec_data));
|
| scoped_ptr<QuicEncryptedPacket> encrypted(
|
| framer_.EncryptPacket(ENCRYPTION_NONE, number, *fec_packet));
|
|
|
| @@ -861,8 +849,7 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> {
|
| QuicFrames frames;
|
| QuicFrame frame(&frame1_);
|
| frames.push_back(frame);
|
| - QuicPacket* packet =
|
| - BuildUnsizedDataPacket(&framer_, header_, frames).packet;
|
| + QuicPacket* packet = BuildUnsizedDataPacket(&framer_, header_, frames);
|
| EXPECT_TRUE(packet != nullptr);
|
| return packet;
|
| }
|
| @@ -882,8 +869,7 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> {
|
| QuicFrames frames;
|
| QuicFrame frame(&ping);
|
| frames.push_back(frame);
|
| - QuicPacket* packet =
|
| - BuildUnsizedDataPacket(&framer_, header_, frames).packet;
|
| + QuicPacket* packet = BuildUnsizedDataPacket(&framer_, header_, frames);
|
| EXPECT_TRUE(packet != nullptr);
|
| return packet;
|
| }
|
| @@ -905,8 +891,7 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> {
|
| QuicFrames frames;
|
| QuicFrame frame(&qccf);
|
| frames.push_back(frame);
|
| - QuicPacket* packet =
|
| - BuildUnsizedDataPacket(&framer_, header_, frames).packet;
|
| + QuicPacket* packet = BuildUnsizedDataPacket(&framer_, header_, frames);
|
| EXPECT_TRUE(packet != nullptr);
|
| return packet;
|
| }
|
| @@ -991,7 +976,6 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> {
|
|
|
| MockSendAlgorithm* send_algorithm_;
|
| MockLossAlgorithm* loss_algorithm_;
|
| - TestReceiveAlgorithm* receive_algorithm_;
|
| MockClock clock_;
|
| MockRandom random_generator_;
|
| scoped_ptr<TestConnectionHelper> helper_;
|
| @@ -1006,8 +990,8 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> {
|
| QuicPacketHeader header_;
|
| QuicStreamFrame frame1_;
|
| QuicStreamFrame frame2_;
|
| - scoped_ptr<QuicAckFrame> outgoing_ack_;
|
| - scoped_ptr<QuicStopWaitingFrame> stop_waiting_;
|
| + QuicAckFrame ack_;
|
| + QuicStopWaitingFrame stop_waiting_;
|
| QuicSequenceNumberLength sequence_number_length_;
|
| QuicConnectionIdLength connection_id_length_;
|
|
|
| @@ -1020,6 +1004,64 @@ INSTANTIATE_TEST_CASE_P(SupportedVersion,
|
| QuicConnectionTest,
|
| ::testing::ValuesIn(QuicSupportedVersions()));
|
|
|
| +TEST_P(QuicConnectionTest, MaxPacketSize) {
|
| + EXPECT_FALSE(connection_.is_server());
|
| + EXPECT_EQ(1350u, connection_.max_packet_length());
|
| +}
|
| +
|
| +TEST_P(QuicConnectionTest, SmallerServerMaxPacketSize) {
|
| + ValueRestore<bool> old_flag(&FLAGS_quic_small_default_packet_size, true);
|
| + QuicConnectionId connection_id = 42;
|
| + bool kIsServer = true;
|
| + TestConnection connection(connection_id, IPEndPoint(), helper_.get(),
|
| + factory_, kIsServer, version());
|
| + EXPECT_TRUE(connection.is_server());
|
| + EXPECT_EQ(1000u, connection.max_packet_length());
|
| +}
|
| +
|
| +TEST_P(QuicConnectionTest, ServerMaxPacketSize) {
|
| + ValueRestore<bool> old_flag(&FLAGS_quic_small_default_packet_size, false);
|
| + QuicConnectionId connection_id = 42;
|
| + bool kIsServer = true;
|
| + TestConnection connection(connection_id, IPEndPoint(), helper_.get(),
|
| + factory_, kIsServer, version());
|
| + EXPECT_TRUE(connection.is_server());
|
| + EXPECT_EQ(1350u, connection.max_packet_length());
|
| +}
|
| +
|
| +TEST_P(QuicConnectionTest, IncreaseServerMaxPacketSize) {
|
| + EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| +
|
| + connection_.set_is_server(true);
|
| + connection_.set_max_packet_length(1000);
|
| +
|
| + QuicPacketHeader header;
|
| + header.public_header.connection_id = connection_id_;
|
| + header.public_header.reset_flag = false;
|
| + header.public_header.version_flag = true;
|
| + header.entropy_flag = false;
|
| + header.fec_flag = false;
|
| + header.packet_sequence_number = 1;
|
| + header.fec_group = 0;
|
| +
|
| + QuicFrames frames;
|
| + QuicPaddingFrame padding;
|
| + frames.push_back(QuicFrame(&frame1_));
|
| + frames.push_back(QuicFrame(&padding));
|
| +
|
| + scoped_ptr<QuicPacket> packet(
|
| + BuildUnsizedDataPacket(&framer_, header, frames));
|
| + scoped_ptr<QuicEncryptedPacket> encrypted(
|
| + framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
|
| + EXPECT_EQ(kMaxPacketSize, encrypted->length());
|
| +
|
| + framer_.set_version(version());
|
| + EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
|
| + connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
|
| +
|
| + EXPECT_EQ(kMaxPacketSize, connection_.max_packet_length());
|
| +}
|
| +
|
| TEST_P(QuicConnectionTest, PacketsInOrder) {
|
| EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
|
|
| @@ -3157,7 +3199,6 @@ TEST_P(QuicConnectionTest, TimeoutAfterSend) {
|
| TEST_P(QuicConnectionTest, TimeoutAfterSendSilentClose) {
|
| // Same test as above, but complete a handshake which enables silent close,
|
| // causing no connection close packet to be sent.
|
| - ValueRestore<bool> old_flag(&FLAGS_quic_allow_silent_close, true);
|
| EXPECT_TRUE(connection_.connected());
|
| EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _));
|
| QuicConfig config;
|
| @@ -3701,7 +3742,7 @@ TEST_P(QuicConnectionTest, ServerSendsVersionNegotiationPacket) {
|
| QuicFrame frame(&frame1_);
|
| frames.push_back(frame);
|
| scoped_ptr<QuicPacket> packet(
|
| - BuildUnsizedDataPacket(&framer_, header, frames).packet);
|
| + BuildUnsizedDataPacket(&framer_, header, frames));
|
| scoped_ptr<QuicEncryptedPacket> encrypted(
|
| framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
|
|
|
| @@ -3739,7 +3780,7 @@ TEST_P(QuicConnectionTest, ServerSendsVersionNegotiationPacketSocketBlocked) {
|
| QuicFrame frame(&frame1_);
|
| frames.push_back(frame);
|
| scoped_ptr<QuicPacket> packet(
|
| - BuildUnsizedDataPacket(&framer_, header, frames).packet);
|
| + BuildUnsizedDataPacket(&framer_, header, frames));
|
| scoped_ptr<QuicEncryptedPacket> encrypted(
|
| framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
|
|
|
| @@ -3784,7 +3825,7 @@ TEST_P(QuicConnectionTest,
|
| QuicFrame frame(&frame1_);
|
| frames.push_back(frame);
|
| scoped_ptr<QuicPacket> packet(
|
| - BuildUnsizedDataPacket(&framer_, header, frames).packet);
|
| + BuildUnsizedDataPacket(&framer_, header, frames));
|
| scoped_ptr<QuicEncryptedPacket> encrypted(
|
| framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
|
|
|
| @@ -3829,7 +3870,7 @@ TEST_P(QuicConnectionTest, ClientHandlesVersionNegotiation) {
|
| QuicFrame frame(&frame1_);
|
| frames.push_back(frame);
|
| scoped_ptr<QuicPacket> packet(
|
| - BuildUnsizedDataPacket(&framer_, header, frames).packet);
|
| + BuildUnsizedDataPacket(&framer_, header, frames));
|
| encrypted.reset(framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
|
| EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
|
| EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| @@ -3974,7 +4015,7 @@ TEST_P(QuicConnectionTest, ProcessFramesIfPacketClosedConnection) {
|
| frames.push_back(stream_frame);
|
| frames.push_back(close_frame);
|
| scoped_ptr<QuicPacket> packet(
|
| - BuildUnsizedDataPacket(&framer_, header_, frames).packet);
|
| + BuildUnsizedDataPacket(&framer_, header_, frames));
|
| EXPECT_TRUE(nullptr != packet.get());
|
| scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
|
| ENCRYPTION_NONE, 1, *packet));
|
| @@ -4268,8 +4309,7 @@ TEST_P(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) {
|
| ack_header.is_in_fec_group = IN_FEC_GROUP;
|
| ack_header.fec_group = 1;
|
|
|
| - QuicPacket* packet =
|
| - BuildUnsizedDataPacket(&framer_, ack_header, frames).packet;
|
| + QuicPacket* packet = BuildUnsizedDataPacket(&framer_, ack_header, frames);
|
|
|
| // Take the packet which contains the ACK frame, and construct and deliver an
|
| // FEC packet which allows the ACK packet to be recovered.
|
|
|