| Index: net/quic/quic_connection_test.cc
|
| diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc
|
| index 986cf45ada1f5609321354cc1a5e4c1ca65ae181..5befba789063c8ffd551fe2a6115df1dea2f16ed 100644
|
| --- a/net/quic/quic_connection_test.cc
|
| +++ b/net/quic/quic_connection_test.cc
|
| @@ -733,13 +733,6 @@
|
| return encrypted->length();
|
| }
|
|
|
| - void ProcessPingPacket(QuicPacketSequenceNumber number) {
|
| - scoped_ptr<QuicPacket> packet(ConstructPingPacket(number));
|
| - scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
|
| - ENCRYPTION_NONE, number, *packet));
|
| - connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
|
| - }
|
| -
|
| void ProcessClosePacket(QuicPacketSequenceNumber number,
|
| QuicFecGroupNumber fec_group) {
|
| scoped_ptr<QuicPacket> packet(ConstructClosePacket(number, fec_group));
|
| @@ -872,27 +865,6 @@
|
|
|
| QuicFrames frames;
|
| QuicFrame frame(&frame1_);
|
| - frames.push_back(frame);
|
| - QuicPacket* packet =
|
| - BuildUnsizedDataPacket(&framer_, header_, frames).packet;
|
| - EXPECT_TRUE(packet != NULL);
|
| - return packet;
|
| - }
|
| -
|
| - QuicPacket* ConstructPingPacket(QuicPacketSequenceNumber number) {
|
| - header_.public_header.connection_id = connection_id_;
|
| - header_.packet_sequence_number = number;
|
| - header_.public_header.reset_flag = false;
|
| - header_.public_header.version_flag = false;
|
| - header_.entropy_flag = false;
|
| - header_.fec_flag = false;
|
| - header_.is_in_fec_group = NOT_IN_FEC_GROUP;
|
| - header_.fec_group = 0;
|
| -
|
| - QuicPingFrame ping;
|
| -
|
| - QuicFrames frames;
|
| - QuicFrame frame(&ping);
|
| frames.push_back(frame);
|
| QuicPacket* packet =
|
| BuildUnsizedDataPacket(&framer_, header_, frames).packet;
|
| @@ -1400,10 +1372,7 @@
|
| writer_->header().public_header.sequence_number_length);
|
| }
|
|
|
| -// TODO(ianswett): Re-enable this test by finding a good way to test different
|
| -// sequence number lengths without sending packets with giant gaps.
|
| -TEST_P(QuicConnectionTest,
|
| - DISABLED_SendingDifferentSequenceNumberLengthsUnackedDelta) {
|
| +TEST_P(QuicConnectionTest, SendingDifferentSequenceNumberLengthsUnackedDelta) {
|
| QuicPacketSequenceNumber last_packet;
|
| QuicPacketCreator* creator =
|
| QuicConnectionPeer::GetPacketCreator(&connection_);
|
| @@ -2742,19 +2711,160 @@
|
| TEST_P(QuicConnectionTest, SendScheduler) {
|
| // Test that if we send a packet without delay, it is not queued.
|
| QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
|
| + EXPECT_CALL(*send_algorithm_,
|
| + TimeUntilSend(_, _, _)).WillOnce(
|
| + testing::Return(QuicTime::Delta::Zero()));
|
| EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
|
| connection_.SendPacket(
|
| ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
|
| EXPECT_EQ(0u, connection_.NumQueuedPackets());
|
| }
|
|
|
| -TEST_P(QuicConnectionTest, SendSchedulerEAGAIN) {
|
| +TEST_P(QuicConnectionTest, SendSchedulerDelay) {
|
| + // Test that if we send a packet with a delay, it ends up queued.
|
| QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
|
| - BlockOnNextWrite();
|
| + EXPECT_CALL(*send_algorithm_,
|
| + TimeUntilSend(_, _, _)).WillOnce(
|
| + testing::Return(QuicTime::Delta::FromMicroseconds(1)));
|
| EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0);
|
| connection_.SendPacket(
|
| ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
|
| EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
| +}
|
| +
|
| +TEST_P(QuicConnectionTest, SendSchedulerEAGAIN) {
|
| + QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
|
| + BlockOnNextWrite();
|
| + EXPECT_CALL(*send_algorithm_,
|
| + TimeUntilSend(_, _, _)).WillOnce(
|
| + testing::Return(QuicTime::Delta::Zero()));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0);
|
| + connection_.SendPacket(
|
| + ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
|
| + EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
| +}
|
| +
|
| +TEST_P(QuicConnectionTest, SendSchedulerDelayThenSend) {
|
| + // Test that if we send a packet with a delay, it ends up queued.
|
| + QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
|
| + EXPECT_CALL(*send_algorithm_,
|
| + TimeUntilSend(_, _, _)).WillOnce(
|
| + testing::Return(QuicTime::Delta::FromMicroseconds(1)));
|
| + connection_.SendPacket(
|
| + ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
|
| + EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
| +
|
| + // Advance the clock to fire the alarm, and configure the scheduler
|
| + // to permit the packet to be sent.
|
| + EXPECT_CALL(*send_algorithm_,
|
| + TimeUntilSend(_, _, _)).WillRepeatedly(
|
| + testing::Return(QuicTime::Delta::Zero()));
|
| + clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
|
| + connection_.GetSendAlarm()->Fire();
|
| + EXPECT_EQ(0u, connection_.NumQueuedPackets());
|
| +}
|
| +
|
| +TEST_P(QuicConnectionTest, SendSchedulerDelayThenRetransmit) {
|
| + CongestionUnblockWrites();
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _));
|
| + connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
|
| + EXPECT_EQ(0u, connection_.NumQueuedPackets());
|
| + // Advance the time for retransmission of lost packet.
|
| + clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501));
|
| + // Test that if we send a retransmit with a delay, it ends up queued in the
|
| + // sent packet manager, but not yet serialized.
|
| + EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
|
| + CongestionBlockWrites();
|
| + connection_.GetRetransmissionAlarm()->Fire();
|
| + EXPECT_EQ(0u, connection_.NumQueuedPackets());
|
| +
|
| + // Advance the clock to fire the alarm, and configure the scheduler
|
| + // to permit the packet to be sent.
|
| + CongestionUnblockWrites();
|
| +
|
| + // Ensure the scheduler is notified this is a retransmit.
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
|
| + clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1));
|
| + connection_.GetSendAlarm()->Fire();
|
| + EXPECT_EQ(0u, connection_.NumQueuedPackets());
|
| +}
|
| +
|
| +TEST_P(QuicConnectionTest, SendSchedulerDelayAndQueue) {
|
| + QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
|
| + EXPECT_CALL(*send_algorithm_,
|
| + TimeUntilSend(_, _, _)).WillOnce(
|
| + testing::Return(QuicTime::Delta::FromMicroseconds(1)));
|
| + connection_.SendPacket(
|
| + ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
|
| + EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
| +
|
| + // Attempt to send another packet and make sure that it gets queued.
|
| + packet = ConstructDataPacket(2, 0, !kEntropyFlag);
|
| + connection_.SendPacket(
|
| + ENCRYPTION_NONE, 2, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
|
| + EXPECT_EQ(2u, connection_.NumQueuedPackets());
|
| +}
|
| +
|
| +TEST_P(QuicConnectionTest, SendSchedulerDelayThenAckAndSend) {
|
| + EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| + QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
|
| + EXPECT_CALL(*send_algorithm_,
|
| + TimeUntilSend(_, _, _)).WillOnce(
|
| + testing::Return(QuicTime::Delta::FromMicroseconds(10)));
|
| + connection_.SendPacket(
|
| + ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
|
| + EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
| +
|
| + // Now send non-retransmitting information, that we're not going to
|
| + // retransmit 3. The far end should stop waiting for it.
|
| + QuicAckFrame frame = InitAckFrame(0);
|
| + EXPECT_CALL(*send_algorithm_,
|
| + TimeUntilSend(_, _, _)).WillRepeatedly(
|
| + testing::Return(QuicTime::Delta::Zero()));
|
| + EXPECT_CALL(*send_algorithm_,
|
| + OnPacketSent(_, _, _, _, _));
|
| + ProcessAckPacket(&frame);
|
| +
|
| + EXPECT_EQ(0u, connection_.NumQueuedPackets());
|
| + // Ensure alarm is not set
|
| + EXPECT_FALSE(connection_.GetSendAlarm()->IsSet());
|
| +}
|
| +
|
| +TEST_P(QuicConnectionTest, SendSchedulerDelayThenAckAndHold) {
|
| + EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| + QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
|
| + EXPECT_CALL(*send_algorithm_,
|
| + TimeUntilSend(_, _, _)).WillOnce(
|
| + testing::Return(QuicTime::Delta::FromMicroseconds(10)));
|
| + connection_.SendPacket(
|
| + ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
|
| + EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
| +
|
| + // Now send non-retransmitting information, that we're not going to
|
| + // retransmit 3. The far end should stop waiting for it.
|
| + QuicAckFrame frame = InitAckFrame(0);
|
| + EXPECT_CALL(*send_algorithm_,
|
| + TimeUntilSend(_, _, _)).WillOnce(
|
| + testing::Return(QuicTime::Delta::FromMicroseconds(1)));
|
| + ProcessAckPacket(&frame);
|
| +
|
| + EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
| +}
|
| +
|
| +TEST_P(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) {
|
| + // TODO(ianswett): This test is unrealistic, because we would not serialize
|
| + // new data if the send algorithm said not to.
|
| + QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
|
| + CongestionBlockWrites();
|
| + connection_.SendPacket(
|
| + ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
|
| + EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
| +
|
| + // OnCanWrite should send the packet, because it won't consult the send
|
| + // algorithm for queued packets.
|
| + connection_.OnCanWrite();
|
| + EXPECT_EQ(0u, connection_.NumQueuedPackets());
|
| }
|
|
|
| TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) {
|
| @@ -2855,16 +2965,6 @@
|
| EXPECT_FALSE(writer_->stop_waiting_frames().empty());
|
| EXPECT_FALSE(writer_->ack_frames().empty());
|
| EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
|
| -}
|
| -
|
| -TEST_P(QuicConnectionTest, SendDelayedAckForPing) {
|
| - if (version() < QUIC_VERSION_18) {
|
| - return;
|
| - }
|
| - EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| - EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
|
| - ProcessPingPacket(1);
|
| - EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
|
| }
|
|
|
| TEST_P(QuicConnectionTest, NoAckOnOldNacks) {
|
|
|