| Index: net/quic/quic_connection_test.cc
|
| diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc
|
| index 3487cd0c9a117d54c529d2c46483885656db7348..6ad02c7fa35b4bbb3972459c0c9b95ae6778b6f2 100644
|
| --- a/net/quic/quic_connection_test.cc
|
| +++ b/net/quic/quic_connection_test.cc
|
| @@ -274,6 +274,7 @@ class TestPacketWriter : public QuicPacketWriter {
|
| TestPacketWriter()
|
| : last_packet_size_(0),
|
| write_blocked_(false),
|
| + block_next_write_(false),
|
| is_write_blocked_data_buffered_(false),
|
| is_server_(true),
|
| final_bytes_of_last_packet_(0),
|
| @@ -282,7 +283,7 @@ class TestPacketWriter : public QuicPacketWriter {
|
| packets_write_attempts_(0) {
|
| }
|
|
|
| - // QuicPacketWriter
|
| + // QuicPacketWriter interface
|
| virtual WriteResult WritePacket(
|
| const char* buffer, size_t buf_len,
|
| const IPAddressNumber& self_address,
|
| @@ -304,6 +305,10 @@ class TestPacketWriter : public QuicPacketWriter {
|
| visitor_.Reset();
|
| framer.set_visitor(&visitor_);
|
| EXPECT_TRUE(framer.ProcessPacket(packet));
|
| + if (block_next_write_) {
|
| + write_blocked_ = true;
|
| + block_next_write_ = false;
|
| + }
|
| if (IsWriteBlocked()) {
|
| return WriteResult(WRITE_STATUS_BLOCKED, -1);
|
| }
|
| @@ -319,7 +324,7 @@ class TestPacketWriter : public QuicPacketWriter {
|
|
|
| virtual void SetWritable() OVERRIDE { write_blocked_ = false; }
|
|
|
| - void SetWriteBlocked() { write_blocked_ = true; }
|
| + void BlockNextWrite() { block_next_write_ = true; }
|
|
|
| // Resets the visitor's state by clearing out the headers and frames.
|
| void Reset() {
|
| @@ -375,6 +380,7 @@ class TestPacketWriter : public QuicPacketWriter {
|
| FramerVisitorCapturingFrames visitor_;
|
| size_t last_packet_size_;
|
| bool write_blocked_;
|
| + bool block_next_write_;
|
| bool is_write_blocked_data_buffered_;
|
| bool is_server_;
|
| uint32 final_bytes_of_last_packet_;
|
| @@ -824,6 +830,17 @@ class QuicConnectionTest : public ::testing::TestWithParam<bool> {
|
| }
|
| }
|
|
|
| + void TriggerConnectionClose() {
|
| + // Send an erroneous packet to close the connection.
|
| + EXPECT_CALL(visitor_,
|
| + OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
|
| + // Call ProcessDataPacket rather than ProcessPacket, as we should not get a
|
| + // packet call to the visitor.
|
| + ProcessDataPacket(6000, 0, !kEntropyFlag);
|
| + EXPECT_FALSE(
|
| + QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL);
|
| + }
|
| +
|
| QuicGuid guid_;
|
| QuicFramer framer_;
|
| QuicPacketCreator creator_;
|
| @@ -944,10 +961,13 @@ TEST_F(QuicConnectionTest, PacketsOutOfOrderWithAdditionsAndLeastAwaiting) {
|
| }
|
|
|
| TEST_F(QuicConnectionTest, RejectPacketTooFarOut) {
|
| + EXPECT_CALL(visitor_,
|
| + OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
|
| // Call ProcessDataPacket rather than ProcessPacket, as we should not get a
|
| // packet call to the visitor.
|
| - EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
|
| ProcessDataPacket(6000, 0, !kEntropyFlag);
|
| + EXPECT_FALSE(
|
| + QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL);
|
| }
|
|
|
| TEST_F(QuicConnectionTest, TruncatedAck) {
|
| @@ -964,7 +984,8 @@ TEST_F(QuicConnectionTest, TruncatedAck) {
|
| }
|
| EXPECT_CALL(entropy_calculator_,
|
| EntropyHash(511)).WillOnce(testing::Return(0));
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(256);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(256);
|
| EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(2);
|
| EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(2);
|
| ProcessAckPacket(&frame);
|
| @@ -978,7 +999,8 @@ TEST_F(QuicConnectionTest, TruncatedAck) {
|
| AckPacket(192, &frame);
|
|
|
| // Removing one missing packet allows us to ack 192 and one more range.
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(2);
|
| EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(2);
|
| EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(2);
|
| ProcessAckPacket(&frame);
|
| @@ -1040,6 +1062,7 @@ TEST_F(QuicConnectionTest, AckReceiptCausesAckSend) {
|
| QuicAckFrame frame = InitAckFrame(original, 1);
|
| NackPacket(original, &frame);
|
| // First nack triggers early retransmit.
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| QuicPacketSequenceNumber retransmission;
|
| EXPECT_CALL(*send_algorithm_,
|
| OnPacketSent(_, _, packet_size - kQuicVersionSize,
|
| @@ -1050,7 +1073,8 @@ TEST_F(QuicConnectionTest, AckReceiptCausesAckSend) {
|
|
|
| QuicAckFrame frame2 = InitAckFrame(retransmission, 1);
|
| NackPacket(original, &frame2);
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _));
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _));
|
|
|
| ProcessAckPacket(&frame2);
|
| // Now if the peer sends an ack which still reports the retransmitted packet
|
| @@ -1099,7 +1123,8 @@ TEST_F(QuicConnectionTest, LargestObservedLower) {
|
| SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
|
| SendStreamDataToPeer(1, "bar", 3, !kFin, NULL);
|
| SendStreamDataToPeer(1, "eep", 6, !kFin, NULL);
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(2);
|
|
|
| // Start out saying the largest observed is 2.
|
| QuicAckFrame frame1 = InitAckFrame(1, 0);
|
| @@ -1233,7 +1258,8 @@ TEST_F(QuicConnectionTest, SendingDifferentSequenceNumberLengthsUnackedDelta) {
|
|
|
| TEST_F(QuicConnectionTest, BasicSending) {
|
| EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(6);
|
| +// EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| +// EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(6);
|
| QuicPacketSequenceNumber last_packet;
|
| SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1
|
| EXPECT_EQ(1u, last_packet);
|
| @@ -1249,6 +1275,9 @@ TEST_F(QuicConnectionTest, BasicSending) {
|
| SendAckPacketToPeer(); // Packet 5
|
| EXPECT_EQ(1u, last_ack()->sent_info.least_unacked);
|
|
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(3);
|
| +
|
| // Peer acks up to packet 3.
|
| QuicAckFrame frame = InitAckFrame(3, 0);
|
| ProcessAckPacket(&frame);
|
| @@ -1258,6 +1287,9 @@ TEST_F(QuicConnectionTest, BasicSending) {
|
| // ack for 4.
|
| EXPECT_EQ(4u, last_ack()->sent_info.least_unacked);
|
|
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(3);
|
| +
|
| // Peer acks up to packet 4, the last packet.
|
| QuicAckFrame frame2 = InitAckFrame(6, 0);
|
| ProcessAckPacket(&frame2); // Acks don't instigate acks.
|
| @@ -1309,7 +1341,7 @@ TEST_F(QuicConnectionTest, FECQueueing) {
|
| connection_.options()->max_packets_per_fec_group = 2;
|
|
|
| EXPECT_EQ(0u, connection_.NumQueuedPackets());
|
| - writer_->SetWriteBlocked();
|
| + writer_->BlockNextWrite();
|
| const string payload(payload_length, 'a');
|
| connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL);
|
| EXPECT_FALSE(creator_.ShouldSendFec(true));
|
| @@ -1351,7 +1383,8 @@ TEST_F(QuicConnectionTest, DontAbandonAckedFEC) {
|
| // received, it would cause the covered packet to be acked as well.
|
| NackPacket(1, &ack_fec);
|
|
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(1);
|
| ProcessAckPacket(&ack_fec);
|
| clock_.AdvanceTime(DefaultRetransmissionTime());
|
|
|
| @@ -1381,7 +1414,8 @@ TEST_F(QuicConnectionTest, AbandonAllFEC) {
|
| NackPacket(4, &ack_fec);
|
|
|
| // Lose the first FEC packet and ack the three data packets.
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(3);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(3);
|
| EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _));
|
| EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _));
|
| ProcessAckPacket(&ack_fec);
|
| @@ -1577,7 +1611,7 @@ TEST_F(QuicConnectionTest, FramePackingSendvQueued) {
|
| // Try to send two stream frames in 1 packet by using writev.
|
| EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _));
|
|
|
| - writer_->SetWriteBlocked();
|
| + writer_->BlockNextWrite();
|
| char data[] = "ABCD";
|
| IOVector data_iov;
|
| data_iov.AppendNoCoalesce(data, 2);
|
| @@ -1587,11 +1621,6 @@ TEST_F(QuicConnectionTest, FramePackingSendvQueued) {
|
| EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
| EXPECT_TRUE(connection_.HasQueuedData());
|
|
|
| - // Attempt to send all packets, but since we're actually still
|
| - // blocked, they should all remain queued.
|
| - EXPECT_FALSE(connection_.OnCanWrite());
|
| - EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
| -
|
| // Unblock the writes and actually send.
|
| writer_->SetWritable();
|
| EXPECT_TRUE(connection_.OnCanWrite());
|
| @@ -1643,7 +1672,8 @@ TEST_F(QuicConnectionTest, OnCanWrite) {
|
| }
|
|
|
| TEST_F(QuicConnectionTest, RetransmitOnNack) {
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _));
|
| EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1);
|
| EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)).Times(1);
|
| QuicPacketSequenceNumber last_packet;
|
| @@ -1667,6 +1697,8 @@ TEST_F(QuicConnectionTest, RetransmitOnNack) {
|
| QuicAckFrame nack_two = InitAckFrame(3, 0);
|
| NackPacket(2, &nack_two);
|
| // The third nack should trigger a retransmission.
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _));
|
| EXPECT_CALL(*send_algorithm_,
|
| OnPacketSent(_, _, second_packet_size - kQuicVersionSize,
|
| NACK_RETRANSMISSION, _)).Times(1);
|
| @@ -1674,7 +1706,8 @@ TEST_F(QuicConnectionTest, RetransmitOnNack) {
|
| }
|
|
|
| TEST_F(QuicConnectionTest, DiscardRetransmit) {
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _));
|
| EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1);
|
| EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)).Times(1);
|
| QuicPacketSequenceNumber last_packet;
|
| @@ -1697,7 +1730,9 @@ TEST_F(QuicConnectionTest, DiscardRetransmit) {
|
| NackPacket(2, &nack_two);
|
| // The first nack should trigger a fast retransmission, but we'll be
|
| // write blocked, so the packet will be queued.
|
| - writer_->SetWriteBlocked();
|
| + writer_->BlockNextWrite();
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _));
|
|
|
| ProcessAckPacket(&nack_two);
|
| EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
| @@ -1731,6 +1766,7 @@ TEST_F(QuicConnectionTest, RetransmitNackedLargestObserved) {
|
| QuicAckFrame frame = InitAckFrame(1, largest_observed);
|
| NackPacket(largest_observed, &frame);
|
| // The first nack should retransmit the largest observed packet.
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| EXPECT_CALL(*send_algorithm_,
|
| OnPacketSent(_, _, packet_size - kQuicVersionSize,
|
| NACK_RETRANSMISSION, _));
|
| @@ -1744,7 +1780,7 @@ TEST_F(QuicConnectionTest, QueueAfterTwoRTOs) {
|
| }
|
|
|
| // Block the congestion window and ensure they're queued.
|
| - writer_->SetWriteBlocked();
|
| + writer_->BlockNextWrite();
|
| clock_.AdvanceTime(DefaultRetransmissionTime());
|
| // Only one packet should be retransmitted.
|
| EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
|
| @@ -1763,9 +1799,9 @@ TEST_F(QuicConnectionTest, QueueAfterTwoRTOs) {
|
| }
|
|
|
| TEST_F(QuicConnectionTest, WriteBlockedThenSent) {
|
| - writer_->SetWriteBlocked();
|
| -
|
| + writer_->BlockNextWrite();
|
| writer_->set_is_write_blocked_data_buffered(true);
|
| +
|
| connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
|
| EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
|
|
|
| @@ -1774,21 +1810,68 @@ TEST_F(QuicConnectionTest, WriteBlockedThenSent) {
|
| EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
|
| }
|
|
|
| -TEST_F(QuicConnectionTest, ResumptionAlarmThenWriteBlocked) {
|
| - // Set the send and resumption alarm, then block the connection.
|
| +TEST_F(QuicConnectionTest, WriteBlockedAckedThenSent) {
|
| + EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| + writer_->BlockNextWrite();
|
| +
|
| + writer_->set_is_write_blocked_data_buffered(true);
|
| + connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
|
| + EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
|
| +
|
| + // Ack the sent packet before the callback returns, which happens in
|
| + // rare circumstances with write blocked sockets.
|
| + QuicAckFrame ack = InitAckFrame(1, 0);
|
| + ProcessAckPacket(&ack);
|
| +
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
|
| + connection_.OnPacketSent(WriteResult(WRITE_STATUS_OK, 0));
|
| + EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
|
| +}
|
| +
|
| +TEST_F(QuicConnectionTest, RetransmitWriteBlockedAckedOriginalThenSent) {
|
| + EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| + connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
|
| + EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
|
| +
|
| + writer_->BlockNextWrite();
|
| + writer_->set_is_write_blocked_data_buffered(true);
|
| +
|
| + // Simulate the retransmission alarm firing.
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _));
|
| + clock_.AdvanceTime(DefaultRetransmissionTime());
|
| + connection_.GetRetransmissionAlarm()->Fire();
|
| +
|
| + // Ack the sent packet before the callback returns, which happens in
|
| + // rare circumstances with write blocked sockets.
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + QuicAckFrame ack = InitAckFrame(1, 0);
|
| + ProcessAckPacket(&ack);
|
| +
|
| + connection_.OnPacketSent(WriteResult(WRITE_STATUS_OK, 0));
|
| + EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
|
| +}
|
| +
|
| +TEST_F(QuicConnectionTest, ResumptionAlarmWhenWriteBlocked) {
|
| + // Block the connection.
|
| + writer_->BlockNextWrite();
|
| + connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
|
| + EXPECT_EQ(1u, writer_->packets_write_attempts());
|
| + EXPECT_TRUE(writer_->IsWriteBlocked());
|
| +
|
| + // Set the send and resumption alarms. Fire the alarms and ensure they don't
|
| + // attempt to write.
|
| connection_.GetResumeWritesAlarm()->Set(clock_.ApproximateNow());
|
| connection_.GetSendAlarm()->Set(clock_.ApproximateNow());
|
| - QuicConnectionPeer::SetIsWriteBlocked(&connection_, true);
|
| -
|
| - // Fire the alarms and ensure the connection is still write blocked.
|
| connection_.GetResumeWritesAlarm()->Fire();
|
| connection_.GetSendAlarm()->Fire();
|
| - EXPECT_TRUE(QuicConnectionPeer::IsWriteBlocked(&connection_));
|
| + EXPECT_TRUE(writer_->IsWriteBlocked());
|
| + EXPECT_EQ(1u, writer_->packets_write_attempts());
|
| }
|
|
|
| TEST_F(QuicConnectionTest, LimitPacketsPerNack) {
|
| EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(15, _, _)).Times(1);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(15, _)).Times(1);
|
| EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(4);
|
| int offset = 0;
|
| // Send packets 1 to 15.
|
| @@ -1816,7 +1899,6 @@ TEST_F(QuicConnectionTest, LimitPacketsPerNack) {
|
|
|
| // Test sending multiple acks from the connection to the session.
|
| TEST_F(QuicConnectionTest, MultipleAcks) {
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(6);
|
| QuicPacketSequenceNumber last_packet;
|
| SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1
|
| EXPECT_EQ(1u, last_packet);
|
| @@ -1831,18 +1913,23 @@ TEST_F(QuicConnectionTest, MultipleAcks) {
|
| EXPECT_EQ(6u, last_packet);
|
|
|
| // Client will ack packets 1, 2, [!3], 4, 5.
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(4);
|
| QuicAckFrame frame1 = InitAckFrame(5, 0);
|
| NackPacket(3, &frame1);
|
| EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| ProcessAckPacket(&frame1);
|
|
|
| // Now the client implicitly acks 3, and explicitly acks 6.
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(2);
|
| QuicAckFrame frame2 = InitAckFrame(6, 0);
|
| ProcessAckPacket(&frame2);
|
| }
|
|
|
| TEST_F(QuicConnectionTest, DontLatchUnackedPacket) {
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(1);
|
| SendStreamDataToPeer(1, "foo", 0, !kFin, NULL); // Packet 1;
|
| // From now on, we send acks, so the send algorithm won't save them.
|
| ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
|
| @@ -2145,6 +2232,7 @@ TEST_F(QuicConnectionTest, RetransmissionCountCalculation) {
|
| EXPECT_TRUE(QuicConnectionPeer::IsRetransmission(
|
| &connection_, rto_sequence_number));
|
| // Once by explicit nack.
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_)).Times(3);
|
| EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1);
|
| EXPECT_CALL(*send_algorithm_,
|
| OnPacketAbandoned(rto_sequence_number, _)).Times(1);
|
| @@ -2172,7 +2260,7 @@ TEST_F(QuicConnectionTest, RetransmissionCountCalculation) {
|
| }
|
|
|
| TEST_F(QuicConnectionTest, SetRTOAfterWritingToSocket) {
|
| - writer_->SetWriteBlocked();
|
| + writer_->BlockNextWrite();
|
| connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
|
| // Make sure that RTO is not started when the packet is queued.
|
| EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
|
| @@ -2195,7 +2283,8 @@ TEST_F(QuicConnectionTest, DelayRTOWithAckReceipt) {
|
| // Advance the time right before the RTO, then receive an ack for the first
|
| // packet to delay the RTO.
|
| clock_.AdvanceTime(DefaultRetransmissionTime());
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(1);
|
| QuicAckFrame ack = InitAckFrame(1, 0);
|
| ProcessAckPacket(&ack);
|
| EXPECT_TRUE(retransmission_alarm->IsSet());
|
| @@ -2222,15 +2311,10 @@ TEST_F(QuicConnectionTest, DelayRTOWithAckReceipt) {
|
|
|
| TEST_F(QuicConnectionTest, TestQueued) {
|
| EXPECT_EQ(0u, connection_.NumQueuedPackets());
|
| - writer_->SetWriteBlocked();
|
| + writer_->BlockNextWrite();
|
| connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
|
| EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
|
|
| - // Attempt to send all packets, but since we're actually still
|
| - // blocked, they should all remain queued.
|
| - EXPECT_FALSE(connection_.OnCanWrite());
|
| - EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
| -
|
| // Unblock the writes and actually send.
|
| writer_->SetWritable();
|
| EXPECT_TRUE(connection_.OnCanWrite());
|
| @@ -2382,7 +2466,7 @@ TEST_F(QuicConnectionTest, SendSchedulerForce) {
|
|
|
| TEST_F(QuicConnectionTest, SendSchedulerEAGAIN) {
|
| QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
|
| - writer_->SetWriteBlocked();
|
| + writer_->BlockNextWrite();
|
| EXPECT_CALL(*send_algorithm_,
|
| TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
|
| testing::Return(QuicTime::Delta::Zero()));
|
| @@ -2633,7 +2717,7 @@ TEST_F(QuicConnectionTest, DontSendDelayedAckOnOutgoingCryptoPacket) {
|
| TEST_F(QuicConnectionTest, NoAckForClose) {
|
| EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| ProcessPacket(1);
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(0);
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(0);
|
| EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, true));
|
| EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
|
| ProcessClosePacket(2, 0);
|
| @@ -2857,11 +2941,10 @@ TEST_F(QuicConnectionTest, ServerSendsVersionNegotiationPacketSocketBlocked) {
|
|
|
| framer_.set_version(QuicVersionMax());
|
| connection_.set_is_server(true);
|
| - writer_->SetWriteBlocked();
|
| + writer_->BlockNextWrite();
|
| connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
|
| EXPECT_EQ(0u, writer_->last_packet_size());
|
| EXPECT_TRUE(connection_.HasQueuedData());
|
| - EXPECT_TRUE(QuicConnectionPeer::IsWriteBlocked(&connection_));
|
|
|
| writer_->SetWritable();
|
| connection_.OnCanWrite();
|
| @@ -2902,12 +2985,11 @@ TEST_F(QuicConnectionTest,
|
|
|
| framer_.set_version(QuicVersionMax());
|
| connection_.set_is_server(true);
|
| - writer_->SetWriteBlocked();
|
| + writer_->BlockNextWrite();
|
| writer_->set_is_write_blocked_data_buffered(true);
|
| connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
|
| EXPECT_EQ(0u, writer_->last_packet_size());
|
| EXPECT_FALSE(connection_.HasQueuedData());
|
| - EXPECT_TRUE(QuicConnectionPeer::IsWriteBlocked(&connection_));
|
| }
|
|
|
| TEST_F(QuicConnectionTest, ClientHandlesVersionNegotiation) {
|
| @@ -3007,7 +3089,8 @@ TEST_F(QuicConnectionTest, CheckSendStats) {
|
| NackPacket(3, &nack_three);
|
| NackPacket(1, &nack_three);
|
| QuicFrame frame(&nack_three);
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(1);
|
| EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1);
|
| EXPECT_CALL(visitor_, OnCanWrite()).Times(4).WillRepeatedly(Return(true));
|
| EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| @@ -3136,41 +3219,32 @@ TEST_F(QuicConnectionTest, SelectMutualVersion) {
|
| EXPECT_FALSE(connection_.SelectMutualVersion(unsupported_version));
|
| }
|
|
|
| -TEST_F(QuicConnectionTest, ConnectionCloseWhenNotWriteBlocked) {
|
| - writer_->SetWritable(); // Already default.
|
| +TEST_F(QuicConnectionTest, ConnectionCloseWhenWritable) {
|
| + EXPECT_FALSE(writer_->IsWriteBlocked());
|
|
|
| - // Send a packet (but write will not block).
|
| + // Send a packet.
|
| connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
|
| EXPECT_EQ(0u, connection_.NumQueuedPackets());
|
| EXPECT_EQ(1u, writer_->packets_write_attempts());
|
|
|
| - // Send an erroneous packet to close the connection.
|
| - EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
|
| - ProcessDataPacket(6000, 0, !kEntropyFlag);
|
| + TriggerConnectionClose();
|
| EXPECT_EQ(2u, writer_->packets_write_attempts());
|
| }
|
|
|
| -TEST_F(QuicConnectionTest, ConnectionCloseWhenWriteBlocked) {
|
| - EXPECT_EQ(0u, connection_.NumQueuedPackets());
|
| - writer_->SetWriteBlocked();
|
| +TEST_F(QuicConnectionTest, ConnectionCloseGettingWriteBlocked) {
|
| + writer_->BlockNextWrite();
|
| + TriggerConnectionClose();
|
| + EXPECT_EQ(1u, writer_->packets_write_attempts());
|
| + EXPECT_TRUE(writer_->IsWriteBlocked());
|
| +}
|
|
|
| - // Send a packet to so that write will really block.
|
| +TEST_F(QuicConnectionTest, ConnectionCloseWhenWriteBlocked) {
|
| + writer_->BlockNextWrite();
|
| connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
|
| EXPECT_EQ(1u, connection_.NumQueuedPackets());
|
| EXPECT_EQ(1u, writer_->packets_write_attempts());
|
| -
|
| - // Send an erroneous packet to close the connection.
|
| - EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
|
| - ProcessDataPacket(6000, 0, !kEntropyFlag);
|
| - EXPECT_EQ(1u, writer_->packets_write_attempts());
|
| -}
|
| -
|
| -TEST_F(QuicConnectionTest, ConnectionCloseWhenNothingPending) {
|
| - writer_->SetWriteBlocked();
|
| -
|
| - // Send an erroneous packet to close the connection.
|
| - EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
|
| - ProcessDataPacket(6000, 0, !kEntropyFlag);
|
| + EXPECT_TRUE(writer_->IsWriteBlocked());
|
| + TriggerConnectionClose();
|
| EXPECT_EQ(1u, writer_->packets_write_attempts());
|
| }
|
|
|
| @@ -3179,13 +3253,14 @@ TEST_F(QuicConnectionTest, AckNotifierTriggerCallback) {
|
|
|
| // Create a delegate which we expect to be called.
|
| scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
|
| - EXPECT_CALL(*delegate, OnAckNotification()).Times(1);;
|
| + EXPECT_CALL(*delegate, OnAckNotification()).Times(1);
|
|
|
| // Send some data, which will register the delegate to be notified.
|
| connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get());
|
|
|
| // Process an ACK from the server which should trigger the callback.
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(1);
|
| QuicAckFrame frame = InitAckFrame(1, 0);
|
| ProcessAckPacket(&frame);
|
| }
|
| @@ -3195,9 +3270,10 @@ TEST_F(QuicConnectionTest, AckNotifierFailToTriggerCallback) {
|
|
|
| // Create a delegate which we don't expect to be called.
|
| scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
|
| - EXPECT_CALL(*delegate, OnAckNotification()).Times(0);;
|
| + EXPECT_CALL(*delegate, OnAckNotification()).Times(0);
|
|
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(2);
|
|
|
| // Send some data, which will register the delegate to be notified. This will
|
| // not be ACKed and so the delegate should never be called.
|
| @@ -3221,10 +3297,11 @@ TEST_F(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) {
|
|
|
| // Create a delegate which we expect to be called.
|
| scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
|
| - EXPECT_CALL(*delegate, OnAckNotification()).Times(1);;
|
| + EXPECT_CALL(*delegate, OnAckNotification()).Times(1);
|
|
|
| // In total expect ACKs for all 4 packets.
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(4);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_)).Times(2);
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(4);
|
|
|
| // Send four packets, and register to be notified on ACK of packet 2.
|
| connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
|
| @@ -3254,10 +3331,11 @@ TEST_F(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) {
|
|
|
| // Create a delegate which we expect to be called.
|
| scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
|
| - EXPECT_CALL(*delegate, OnAckNotification()).Times(1);;
|
| + EXPECT_CALL(*delegate, OnAckNotification()).Times(1);
|
|
|
| // Expect ACKs for 1 packet.
|
| - EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
|
| + EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(1);
|
|
|
| // Send one packet, and register to be notified on ACK.
|
| connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get());
|
|
|