| Index: net/quic/core/quic_connection_test.cc
|
| diff --git a/net/quic/core/quic_connection_test.cc b/net/quic/core/quic_connection_test.cc
|
| index 789b8132abcca2e64e99e2e28b5713fea8918487..bc15352343f67bd6a725178a435dbbc0dc1c9a92 100644
|
| --- a/net/quic/core/quic_connection_test.cc
|
| +++ b/net/quic/core/quic_connection_test.cc
|
| @@ -36,6 +36,7 @@
|
| #include "net/quic/test_tools/simple_quic_framer.h"
|
| #include "net/test/gtest_util.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| +#include "testing/gmock_mutant.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| using std::string;
|
| @@ -43,6 +44,7 @@ using testing::AnyNumber;
|
| using testing::AtLeast;
|
| using testing::DoAll;
|
| using testing::InSequence;
|
| +using testing::Invoke;
|
| using testing::InvokeWithoutArgs;
|
| using testing::NiceMock;
|
| using testing::Ref;
|
| @@ -389,6 +391,10 @@ class TestPacketWriter : public QuicPacketWriter {
|
| return framer_.ping_frames();
|
| }
|
|
|
| + const std::vector<QuicWindowUpdateFrame>& window_update_frames() const {
|
| + return framer_.window_update_frames();
|
| + }
|
| +
|
| const std::vector<QuicPaddingFrame>& padding_frames() const {
|
| return framer_.padding_frames();
|
| }
|
| @@ -1499,6 +1505,9 @@ TEST_P(QuicConnectionTest, AckReceiptCausesAckSend) {
|
| }
|
|
|
| TEST_P(QuicConnectionTest, 20AcksCausesAckSend) {
|
| + if (connection_.version() > QUIC_VERSION_38) {
|
| + return;
|
| + }
|
| EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
|
|
| SendStreamDataToPeer(1, "foo", 0, NO_FIN, nullptr);
|
| @@ -1517,6 +1526,54 @@ TEST_P(QuicConnectionTest, 20AcksCausesAckSend) {
|
| EXPECT_EQ(2u, writer_->packets_write_attempts());
|
| }
|
|
|
| +TEST_P(QuicConnectionTest, AckNeedsRetransmittableFrames) {
|
| + if (connection_.version() <= QUIC_VERSION_38) {
|
| + return;
|
| + }
|
| +
|
| + EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| + EXPECT_CALL(visitor_, OnStreamFrame(_)).Times(99);
|
| +
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(19);
|
| + // Receives packets 1 - 39.
|
| + for (size_t i = 1; i <= 39; ++i) {
|
| + ProcessDataPacket(i);
|
| + }
|
| + // Receiving Packet 40 causes 20th ack to send. Session is informed and adds
|
| + // WINDOW_UPDATE.
|
| + EXPECT_CALL(visitor_, OnAckNeedsRetransmittableFrame())
|
| + .WillOnce(
|
| + Invoke(testing::CreateFunctor(&QuicConnection::SendWindowUpdate,
|
| + base::Unretained(&connection_), 0, 0)));
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
|
| + EXPECT_EQ(0u, writer_->window_update_frames().size());
|
| + ProcessDataPacket(40);
|
| + EXPECT_EQ(1u, writer_->window_update_frames().size());
|
| +
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(9);
|
| + // Receives packets 41 - 59.
|
| + for (size_t i = 41; i <= 59; ++i) {
|
| + ProcessDataPacket(i);
|
| + }
|
| + // Send a packet containing stream frame.
|
| + SendStreamDataToPeer(1, "bar", 3, NO_FIN, nullptr);
|
| +
|
| + // Session will not be informed until receiving another 20 packets.
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(19);
|
| + for (size_t i = 60; i <= 98; ++i) {
|
| + ProcessDataPacket(i);
|
| + EXPECT_EQ(0u, writer_->window_update_frames().size());
|
| + }
|
| + // Session does not add a retransmittable frame.
|
| + EXPECT_CALL(visitor_, OnAckNeedsRetransmittableFrame()).Times(1);
|
| + EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
|
| + EXPECT_EQ(0u, writer_->ping_frames().size());
|
| + ProcessDataPacket(99);
|
| + EXPECT_EQ(0u, writer_->window_update_frames().size());
|
| + // A ping frame will be added.
|
| + EXPECT_EQ(1u, writer_->ping_frames().size());
|
| +}
|
| +
|
| TEST_P(QuicConnectionTest, LeastUnackedLower) {
|
| EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
|
|
| @@ -1571,6 +1628,7 @@ TEST_P(QuicConnectionTest, TooManySentPackets) {
|
|
|
| TEST_P(QuicConnectionTest, TooManyReceivedPackets) {
|
| EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
|
| + EXPECT_CALL(visitor_, OnAckNeedsRetransmittableFrame()).Times(AnyNumber());
|
| // Miss 99 of every 100 packets for 5500 packets.
|
| for (QuicPacketNumber i = 1; i < kMaxTrackedPackets + 500; i += 100) {
|
| ProcessPacket(i);
|
| @@ -3687,6 +3745,7 @@ TEST_P(QuicConnectionTest, SendDelayedAck) {
|
| }
|
|
|
| TEST_P(QuicConnectionTest, SendDelayedAckDecimation) {
|
| + EXPECT_CALL(visitor_, OnAckNeedsRetransmittableFrame()).Times(AnyNumber());
|
| QuicConnectionPeer::SetAckMode(&connection_, QuicConnection::ACK_DECIMATION);
|
|
|
| const size_t kMinRttMs = 40;
|
| @@ -3742,6 +3801,7 @@ TEST_P(QuicConnectionTest, SendDelayedAckDecimation) {
|
| }
|
|
|
| TEST_P(QuicConnectionTest, SendDelayedAckDecimationEighthRtt) {
|
| + EXPECT_CALL(visitor_, OnAckNeedsRetransmittableFrame()).Times(AnyNumber());
|
| QuicConnectionPeer::SetAckMode(&connection_, QuicConnection::ACK_DECIMATION);
|
| QuicConnectionPeer::SetAckDecimationDelay(&connection_, 0.125);
|
|
|
| @@ -3798,6 +3858,7 @@ TEST_P(QuicConnectionTest, SendDelayedAckDecimationEighthRtt) {
|
| }
|
|
|
| TEST_P(QuicConnectionTest, SendDelayedAckDecimationWithReordering) {
|
| + EXPECT_CALL(visitor_, OnAckNeedsRetransmittableFrame()).Times(AnyNumber());
|
| QuicConnectionPeer::SetAckMode(
|
| &connection_, QuicConnection::ACK_DECIMATION_WITH_REORDERING);
|
|
|
| @@ -3862,6 +3923,7 @@ TEST_P(QuicConnectionTest, SendDelayedAckDecimationWithReordering) {
|
| }
|
|
|
| TEST_P(QuicConnectionTest, SendDelayedAckDecimationWithLargeReordering) {
|
| + EXPECT_CALL(visitor_, OnAckNeedsRetransmittableFrame()).Times(AnyNumber());
|
| QuicConnectionPeer::SetAckMode(
|
| &connection_, QuicConnection::ACK_DECIMATION_WITH_REORDERING);
|
|
|
| @@ -3943,6 +4005,7 @@ TEST_P(QuicConnectionTest, SendDelayedAckDecimationWithLargeReordering) {
|
| }
|
|
|
| TEST_P(QuicConnectionTest, SendDelayedAckDecimationWithReorderingEighthRtt) {
|
| + EXPECT_CALL(visitor_, OnAckNeedsRetransmittableFrame()).Times(AnyNumber());
|
| QuicConnectionPeer::SetAckMode(
|
| &connection_, QuicConnection::ACK_DECIMATION_WITH_REORDERING);
|
| QuicConnectionPeer::SetAckDecimationDelay(&connection_, 0.125);
|
| @@ -4009,6 +4072,7 @@ TEST_P(QuicConnectionTest, SendDelayedAckDecimationWithReorderingEighthRtt) {
|
|
|
| TEST_P(QuicConnectionTest,
|
| SendDelayedAckDecimationWithLargeReorderingEighthRtt) {
|
| + EXPECT_CALL(visitor_, OnAckNeedsRetransmittableFrame()).Times(AnyNumber());
|
| QuicConnectionPeer::SetAckMode(
|
| &connection_, QuicConnection::ACK_DECIMATION_WITH_REORDERING);
|
| QuicConnectionPeer::SetAckDecimationDelay(&connection_, 0.125);
|
|
|