| Index: net/quic/quic_connection_test.cc
|
| diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc
|
| index 1c47f32ccfe8e369146450f9eb8bfe08f6c4d3e8..4dbbe13a578da3b0612750abc6ca28f6f1200e61 100644
|
| --- a/net/quic/quic_connection_test.cc
|
| +++ b/net/quic/quic_connection_test.cc
|
| @@ -19,6 +19,7 @@
|
| #include "net/quic/quic_utils.h"
|
| #include "net/quic/test_tools/mock_clock.h"
|
| #include "net/quic/test_tools/mock_random.h"
|
| +#include "net/quic/test_tools/quic_config_peer.h"
|
| #include "net/quic/test_tools/quic_connection_peer.h"
|
| #include "net/quic/test_tools/quic_framer_peer.h"
|
| #include "net/quic/test_tools/quic_packet_creator_peer.h"
|
| @@ -1313,6 +1314,49 @@ TEST_P(QuicConnectionTest, LeastUnackedLower) {
|
| ProcessStopWaitingPacket(&frame3);
|
| }
|
|
|
| +TEST_P(QuicConnectionTest, TooManySentPackets) {
|
| + EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| +
|
| + for (int i = 0; i < 1100; ++i) {
|
| + SendStreamDataToPeer(1, "foo", 3 * i, !kFin, nullptr);
|
| + }
|
| +
|
| + // Ack packet 1, which leaves more than the limit outstanding.
|
| + EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
|
| + if (FLAGS_quic_too_many_outstanding_packets) {
|
| + EXPECT_CALL(visitor_,
|
| + OnConnectionClosed(QUIC_TOO_MANY_OUTSTANDING_SENT_PACKETS,
|
| + false));
|
| + }
|
| + // We're receive buffer limited, so the connection won't try to write more.
|
| + EXPECT_CALL(visitor_, OnCanWrite()).Times(0);
|
| +
|
| + // Nack every packet except the last one, leaving a huge gap.
|
| + QuicAckFrame frame1 = InitAckFrame(1100);
|
| + for (QuicPacketSequenceNumber i = 1; i < 1100; ++i) {
|
| + NackPacket(i, &frame1);
|
| + }
|
| + ProcessAckPacket(&frame1);
|
| +}
|
| +
|
| +TEST_P(QuicConnectionTest, TooManyReceivedPackets) {
|
| + EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| +
|
| + if (FLAGS_quic_too_many_outstanding_packets) {
|
| + EXPECT_CALL(visitor_,
|
| + OnConnectionClosed(QUIC_TOO_MANY_OUTSTANDING_RECEIVED_PACKETS,
|
| + false));
|
| + }
|
| +
|
| + // Miss every other packet for 1000 packets.
|
| + for (QuicPacketSequenceNumber i = 1; i < 1000; ++i) {
|
| + ProcessPacket(i * 2);
|
| + if (!connection_.connected()) {
|
| + break;
|
| + }
|
| + }
|
| +}
|
| +
|
| TEST_P(QuicConnectionTest, LargestObservedLower) {
|
| EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
|
|
| @@ -1514,7 +1558,8 @@ TEST_P(QuicConnectionTest, FECSending) {
|
| // max_packet_length by 2 so that subsequent packets containing subsequent
|
| // stream frames with non-zero offets will fit within the packet length.
|
| size_t length = 2 + GetPacketLengthForOneStream(
|
| - connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
|
| + connection_.version(), kIncludeVersion,
|
| + PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_SEQUENCE_NUMBER,
|
| IN_FEC_GROUP, &payload_length);
|
| creator->set_max_packet_length(length);
|
|
|
| @@ -1534,7 +1579,8 @@ TEST_P(QuicConnectionTest, FECQueueing) {
|
| QuicPacketCreator* creator =
|
| QuicConnectionPeer::GetPacketCreator(&connection_);
|
| size_t length = GetPacketLengthForOneStream(
|
| - connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
|
| + connection_.version(), kIncludeVersion,
|
| + PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_SEQUENCE_NUMBER,
|
| IN_FEC_GROUP, &payload_length);
|
| creator->set_max_packet_length(length);
|
| EXPECT_TRUE(creator->IsFecEnabled());
|
| @@ -2906,7 +2952,8 @@ TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) {
|
| // All packets carry version info till version is negotiated.
|
| size_t payload_length;
|
| size_t length = GetPacketLengthForOneStream(
|
| - connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
|
| + connection_.version(), kIncludeVersion,
|
| + PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_SEQUENCE_NUMBER,
|
| NOT_IN_FEC_GROUP, &payload_length);
|
| QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length(
|
| length);
|
| @@ -2930,7 +2977,8 @@ TEST_P(QuicConnectionTest, LoopThroughSendingPackets) {
|
| // max_packet_length by 2 so that subsequent packets containing subsequent
|
| // stream frames with non-zero offets will fit within the packet length.
|
| size_t length = 2 + GetPacketLengthForOneStream(
|
| - connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
|
| + connection_.version(), kIncludeVersion,
|
| + PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_SEQUENCE_NUMBER,
|
| NOT_IN_FEC_GROUP, &payload_length);
|
| QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length(
|
| length);
|
| @@ -2944,6 +2992,58 @@ TEST_P(QuicConnectionTest, LoopThroughSendingPackets) {
|
| .bytes_consumed);
|
| }
|
|
|
| +TEST_P(QuicConnectionTest, LoopThroughSendingPacketsWithTruncation) {
|
| + ValueRestore<bool> old_flag(&FLAGS_allow_truncated_connection_ids_for_quic,
|
| + true);
|
| +
|
| + // Set up a larger payload than will fit in one packet.
|
| + const string payload(connection_.max_packet_length(), 'a');
|
| + EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)).Times(AnyNumber());
|
| +
|
| + // Now send some packets with no truncation.
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
|
| + EXPECT_EQ(payload.size(),
|
| + connection_.SendStreamDataWithString(
|
| + 3, payload, 0, !kFin, nullptr).bytes_consumed);
|
| + // Track the size of the second packet here. The overhead will be the largest
|
| + // we see in this test, due to the non-truncated CID.
|
| + size_t non_truncated_packet_size = writer_->last_packet_size();
|
| +
|
| + // Change to a 4 byte CID.
|
| + QuicConfig config;
|
| + QuicConfigPeer::SetReceivedBytesForConnectionId(&config, 4);
|
| + connection_.SetFromConfig(config);
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
|
| + EXPECT_EQ(payload.size(),
|
| + connection_.SendStreamDataWithString(
|
| + 3, payload, 0, !kFin, nullptr).bytes_consumed);
|
| + // Verify that we have 8 fewer bytes than in the non-truncated case. The
|
| + // first packet got 4 bytes of extra payload due to the truncation, and the
|
| + // headers here are also 4 byte smaller.
|
| + EXPECT_EQ(non_truncated_packet_size, writer_->last_packet_size() + 8);
|
| +
|
| +
|
| + // Change to a 1 byte CID.
|
| + QuicConfigPeer::SetReceivedBytesForConnectionId(&config, 1);
|
| + connection_.SetFromConfig(config);
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
|
| + EXPECT_EQ(payload.size(),
|
| + connection_.SendStreamDataWithString(
|
| + 3, payload, 0, !kFin, nullptr).bytes_consumed);
|
| + // Just like above, we save 7 bytes on payload, and 7 on truncation.
|
| + EXPECT_EQ(non_truncated_packet_size, writer_->last_packet_size() + 7 * 2);
|
| +
|
| + // Change to a 0 byte CID.
|
| + QuicConfigPeer::SetReceivedBytesForConnectionId(&config, 0);
|
| + connection_.SetFromConfig(config);
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
|
| + EXPECT_EQ(payload.size(),
|
| + connection_.SendStreamDataWithString(
|
| + 3, payload, 0, !kFin, nullptr).bytes_consumed);
|
| + // Just like above, we save 8 bytes on payload, and 8 on truncation.
|
| + EXPECT_EQ(non_truncated_packet_size, writer_->last_packet_size() + 8 * 2);
|
| +}
|
| +
|
| TEST_P(QuicConnectionTest, SendDelayedAck) {
|
| QuicTime ack_time = clock_.ApproximateNow().Add(DefaultDelayedAckTime());
|
| EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
|
|