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. |