Index: net/quic/quic_connection_test.cc |
diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc |
index 7feb87a0b28c648c6555ab39d00a889c4a662658..0eaad974cedf36c00523d814dc0af19fe2f49ec5 100644 |
--- a/net/quic/quic_connection_test.cc |
+++ b/net/quic/quic_connection_test.cc |
@@ -8,6 +8,7 @@ |
#include "base/bind.h" |
#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" |
@@ -398,13 +399,13 @@ class TestPacketWriter : public QuicPacketWriter { |
class TestConnection : public QuicConnection { |
public: |
- TestConnection(QuicGuid guid, |
+ TestConnection(QuicConnectionId connection_id, |
IPEndPoint address, |
TestConnectionHelper* helper, |
TestPacketWriter* writer, |
bool is_server, |
QuicVersion version) |
- : QuicConnection(guid, address, helper, writer, is_server, |
+ : QuicConnection(connection_id, address, helper, writer, is_server, |
SupportedVersions(version)), |
helper_(helper), |
writer_(writer) { |
@@ -426,6 +427,11 @@ class TestConnection : public QuicConnection { |
QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); |
} |
+ void SetLossAlgorithm(LossDetectionInterface* loss_algorithm) { |
+ QuicSentPacketManagerPeer::SetLossAlgorithm( |
+ QuicConnectionPeer::GetSentPacketManager(this), loss_algorithm); |
+ } |
+ |
void SendPacket(EncryptionLevel level, |
QuicPacketSequenceNumber sequence_number, |
QuicPacket* packet, |
@@ -535,19 +541,21 @@ class TestConnection : public QuicConnection { |
class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { |
protected: |
QuicConnectionTest() |
- : guid_(42), |
+ : connection_id_(42), |
framer_(SupportedVersions(version()), QuicTime::Zero(), false), |
- creator_(guid_, &framer_, &random_generator_, false), |
+ creator_(connection_id_, &framer_, &random_generator_, false), |
send_algorithm_(new StrictMock<MockSendAlgorithm>), |
+ loss_algorithm_(new MockLossAlgorithm()), |
helper_(new TestConnectionHelper(&clock_, &random_generator_)), |
writer_(new TestPacketWriter(version())), |
- connection_(guid_, IPEndPoint(), helper_.get(), writer_.get(), |
- false, version()), |
+ connection_(connection_id_, IPEndPoint(), helper_.get(), |
+ writer_.get(), false, version()), |
frame1_(1, false, 0, MakeIOVector(data1)), |
frame2_(1, false, 3, MakeIOVector(data2)), |
accept_packet_(true) { |
connection_.set_visitor(&visitor_); |
connection_.SetSendAlgorithm(send_algorithm_); |
+ connection_.SetLossAlgorithm(loss_algorithm_); |
framer_.set_received_entropy_calculator(&entropy_calculator_); |
// Simplify tests by not sending feedback unless specifically configured. |
SetFeedback(NULL); |
@@ -569,6 +577,11 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { |
EXPECT_CALL(visitor_, HasPendingWrites()).Times(AnyNumber()); |
EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber()); |
EXPECT_CALL(visitor_, OnCanWrite()).Times(AnyNumber()); |
+ |
+ EXPECT_CALL(*loss_algorithm_, GetLossTimeout()) |
+ .WillRepeatedly(Return(QuicTime::Zero())); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillRepeatedly(Return(SequenceNumberSet())); |
} |
QuicVersion version() { |
@@ -708,7 +721,7 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { |
data_packet.reset(ConstructDataPacket(number, 1, !kEntropyFlag)); |
} |
- header_.public_header.guid = guid_; |
+ header_.public_header.connection_id = connection_id_; |
header_.public_header.reset_flag = false; |
header_.public_header.version_flag = false; |
header_.entropy_flag = entropy_flag; |
@@ -724,7 +737,7 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { |
// with itself, depending on the number of packets. |
if (((number - min_protected_packet) % 2) == 0) { |
for (size_t i = GetStartOfFecProtectedData( |
- header_.public_header.guid_length, |
+ header_.public_header.connection_id_length, |
header_.public_header.version_flag, |
header_.public_header.sequence_number_length); |
i < data_packet->length(); ++i) { |
@@ -786,7 +799,7 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { |
QuicPacket* ConstructDataPacket(QuicPacketSequenceNumber number, |
QuicFecGroupNumber fec_group, |
bool entropy_flag) { |
- header_.public_header.guid = guid_; |
+ header_.public_header.connection_id = connection_id_; |
header_.public_header.reset_flag = false; |
header_.public_header.version_flag = false; |
header_.entropy_flag = entropy_flag; |
@@ -806,7 +819,7 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { |
QuicPacket* ConstructClosePacket(QuicPacketSequenceNumber number, |
QuicFecGroupNumber fec_group) { |
- header_.public_header.guid = guid_; |
+ header_.public_header.connection_id = connection_id_; |
header_.packet_sequence_number = number; |
header_.public_header.reset_flag = false; |
header_.public_header.version_flag = false; |
@@ -896,12 +909,13 @@ class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> { |
EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1)); |
} |
- QuicGuid guid_; |
+ QuicConnectionId connection_id_; |
QuicFramer framer_; |
QuicPacketCreator creator_; |
MockEntropyCalculator entropy_calculator_; |
MockSendAlgorithm* send_algorithm_; |
+ MockLossAlgorithm* loss_algorithm_; |
TestReceiveAlgorithm* receive_algorithm_; |
MockClock clock_; |
MockRandom random_generator_; |
@@ -1038,10 +1052,16 @@ TEST_P(QuicConnectionTest, TruncatedAck) { |
} |
QuicAckFrame frame = InitAckFrame(num_packets, 1); |
+ SequenceNumberSet lost_packets; |
// Create an ack with 256 nacks, none adjacent to one another. |
for (QuicPacketSequenceNumber i = 1; i <= 256; ++i) { |
NackPacket(i * 2, &frame); |
+ if (i < 256) { // Last packet is nacked, but not lost. |
+ lost_packets.insert(i * 2); |
+ } |
} |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(lost_packets)); |
EXPECT_CALL(entropy_calculator_, |
EntropyHash(511)).WillOnce(testing::Return(0)); |
EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
@@ -1060,6 +1080,8 @@ TEST_P(QuicConnectionTest, TruncatedAck) { |
// Removing one missing packet allows us to ack 192 and one more range, but |
// 192 has already been declared lost, so it doesn't register as an ack. |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(SequenceNumberSet())); |
EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(1); |
ProcessAckPacket(&frame); |
@@ -1110,18 +1132,23 @@ TEST_P(QuicConnectionTest, OutOfOrderReceiptCausesAckSend) { |
TEST_P(QuicConnectionTest, AckReceiptCausesAckSend) { |
EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
- EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1); |
+ |
QuicPacketSequenceNumber original; |
QuicByteCount packet_size; |
EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _)) |
.WillOnce(DoAll(SaveArg<1>(&original), SaveArg<2>(&packet_size), |
Return(true))); |
- EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); |
connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); |
QuicAckFrame frame = InitAckFrame(original, 1); |
NackPacket(original, &frame); |
// First nack triggers early retransmit. |
+ SequenceNumberSet lost_packets; |
+ lost_packets.insert(1); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(lost_packets)); |
EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); |
QuicPacketSequenceNumber retransmission; |
EXPECT_CALL(*send_algorithm_, |
OnPacketSent(_, _, packet_size - kQuicVersionSize, |
@@ -1134,6 +1161,8 @@ TEST_P(QuicConnectionTest, AckReceiptCausesAckSend) { |
NackPacket(original, &frame2); |
EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(SequenceNumberSet())); |
ProcessAckPacket(&frame2); |
// Now if the peer sends an ack which still reports the retransmitted packet |
@@ -1147,6 +1176,9 @@ TEST_P(QuicConnectionTest, AckReceiptCausesAckSend) { |
EXPECT_EQ(1u, writer_->stream_frames()->size()); |
writer_->Reset(); |
+ // No more packet loss for the rest of the test. |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillRepeatedly(Return(SequenceNumberSet())); |
ProcessAckPacket(&frame2); |
EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, |
HAS_RETRANSMITTABLE_DATA)); |
@@ -1523,6 +1555,10 @@ TEST_P(QuicConnectionTest, AbandonAllFEC) { |
NackPacket(4, &ack_fec); |
// Lose the first FEC packet and ack the three data packets. |
+ SequenceNumberSet lost_packets; |
+ lost_packets.insert(2); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(lost_packets)); |
EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(3); |
EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)); |
@@ -1788,10 +1824,6 @@ TEST_P(QuicConnectionTest, OnCanWrite) { |
} |
TEST_P(QuicConnectionTest, RetransmitOnNack) { |
- 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; |
QuicByteCount second_packet_size; |
SendStreamDataToPeer(3, "foo", 0, !kFin, &last_packet); // Packet 1 |
@@ -1801,20 +1833,23 @@ TEST_P(QuicConnectionTest, RetransmitOnNack) { |
EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
- // Peer acks one but not two or three. Right now we only retransmit on |
- // explicit nack, so it should not trigger a retransmission. |
+ // Don't lose a packet on an ack, and nothing is retransmitted. |
+ EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAcked(1, _)); |
QuicAckFrame ack_one = InitAckFrame(1, 0); |
ProcessAckPacket(&ack_one); |
- ProcessAckPacket(&ack_one); |
- ProcessAckPacket(&ack_one); |
- // Peer acks up to 3 with two explicitly missing. |
- // Early retransmit causes 2 to be retransmitted on the first ack. |
+ // Lose a packet and ensure it triggers retransmission. |
QuicAckFrame nack_two = InitAckFrame(3, 0); |
NackPacket(2, &nack_two); |
- // The third nack should trigger a retransmission. |
+ SequenceNumberSet lost_packets; |
+ lost_packets.insert(2); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(lost_packets)); |
EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
- EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAcked(3, _)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _)).Times(1); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)).Times(1); |
EXPECT_CALL(*send_algorithm_, |
OnPacketSent(_, _, second_packet_size - kQuicVersionSize, |
NACK_RETRANSMISSION, _)).Times(1); |
@@ -1822,10 +1857,6 @@ TEST_P(QuicConnectionTest, RetransmitOnNack) { |
} |
TEST_P(QuicConnectionTest, DiscardRetransmit) { |
- 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; |
SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 |
SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet); // Packet 2 |
@@ -1833,26 +1864,26 @@ TEST_P(QuicConnectionTest, DiscardRetransmit) { |
EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
- // Peer acks one but not two or three. Right now we only retransmit on |
- // explicit nack, so it should not trigger a retransmission. |
- QuicAckFrame ack_one = InitAckFrame(1, 0); |
- ProcessAckPacket(&ack_one); |
- ProcessAckPacket(&ack_one); |
- ProcessAckPacket(&ack_one); |
- |
- // Peer acks up to 3 with two explicitly missing. Two nacks should cause no |
- // change. |
+ // Instigate a loss with an ack. |
QuicAckFrame nack_two = InitAckFrame(3, 0); |
NackPacket(2, &nack_two); |
// The first nack should trigger a fast retransmission, but we'll be |
// write blocked, so the packet will be queued. |
BlockOnNextWrite(); |
+ SequenceNumberSet lost_packets; |
+ lost_packets.insert(2); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(lost_packets)); |
EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
- EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(2); |
+ EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)); |
ProcessAckPacket(&nack_two); |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
// Now, ack the previous transmission. |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(SequenceNumberSet())); |
QuicAckFrame ack_all = InitAckFrame(3, 0); |
ProcessAckPacket(&ack_all); |
@@ -1870,18 +1901,23 @@ TEST_P(QuicConnectionTest, DiscardRetransmit) { |
TEST_P(QuicConnectionTest, RetransmitNackedLargestObserved) { |
EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
- EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(1); |
QuicPacketSequenceNumber largest_observed; |
QuicByteCount packet_size; |
EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _)) |
.WillOnce(DoAll(SaveArg<1>(&largest_observed), SaveArg<2>(&packet_size), |
Return(true))); |
- EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); |
connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); |
+ |
QuicAckFrame frame = InitAckFrame(1, largest_observed); |
NackPacket(largest_observed, &frame); |
// The first nack should retransmit the largest observed packet. |
+ SequenceNumberSet lost_packets; |
+ lost_packets.insert(1); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(lost_packets)); |
EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)).Times(1); |
EXPECT_CALL(*send_algorithm_, |
OnPacketSent(_, _, packet_size - kQuicVersionSize, |
NACK_RETRANSMISSION, _)); |
@@ -1992,13 +2028,17 @@ TEST_P(QuicConnectionTest, NoLimitPacketsPerNack) { |
} |
// Ack 15, nack 1-14. |
+ SequenceNumberSet lost_packets; |
QuicAckFrame nack = InitAckFrame(15, 0); |
for (int i = 1; i < 15; ++i) { |
NackPacket(i, &nack); |
+ lost_packets.insert(i); |
} |
// 14 packets have been NACK'd and lost. In TCP cubic, PRR limits |
// the retransmission rate in the case of burst losses. |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(lost_packets)); |
EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
EXPECT_CALL(*send_algorithm_, OnPacketAcked(15, _)).Times(1); |
EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(14); |
@@ -2359,8 +2399,12 @@ TEST_P(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); |
+ SequenceNumberSet lost_packets; |
+ lost_packets.insert(rto_sequence_number); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(lost_packets)); |
+ EXPECT_CALL(*send_algorithm_, UpdateRtt(_)).Times(1); |
+ EXPECT_CALL(*send_algorithm_, OnPacketLost(rto_sequence_number, _)).Times(1); |
EXPECT_CALL(*send_algorithm_, |
OnPacketAbandoned(rto_sequence_number, _)).Times(1); |
QuicPacketSequenceNumber nack_sequence_number = 0; |
@@ -2371,12 +2415,11 @@ TEST_P(QuicConnectionTest, RetransmissionCountCalculation) { |
EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NACK_RETRANSMISSION, _)) |
.WillOnce(DoAll(SaveArg<1>(&nack_sequence_number), Return(true))); |
QuicAckFrame ack = InitAckFrame(rto_sequence_number, 0); |
- // Ack the retransmitted packet. |
+ // Nack the retransmitted packet. |
NackPacket(original_sequence_number, &ack); |
NackPacket(rto_sequence_number, &ack); |
- for (int i = 0; i < 3; i++) { |
- ProcessAckPacket(&ack); |
- } |
+ ProcessAckPacket(&ack); |
+ |
ASSERT_NE(0u, nack_sequence_number); |
EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission( |
&connection_, rto_sequence_number)); |
@@ -2873,6 +2916,10 @@ TEST_P(QuicConnectionTest, BundleAckWithDataOnIncomingAck) { |
// Ack the second packet, which will retransmit the first packet. |
QuicAckFrame ack = InitAckFrame(2, 0); |
NackPacket(1, &ack); |
+ SequenceNumberSet lost_packets; |
+ lost_packets.insert(1); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(lost_packets)); |
EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
EXPECT_CALL(*send_algorithm_, OnPacketAcked(2, _)).Times(1); |
EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)).Times(1); |
@@ -2886,6 +2933,8 @@ TEST_P(QuicConnectionTest, BundleAckWithDataOnIncomingAck) { |
// and see if there is more data to send. |
ack = InitAckFrame(3, 0); |
NackPacket(1, &ack); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(SequenceNumberSet())); |
EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
EXPECT_CALL(*send_algorithm_, OnPacketAcked(3, _)).Times(1); |
ProcessAckPacket(&ack); |
@@ -2898,6 +2947,8 @@ TEST_P(QuicConnectionTest, BundleAckWithDataOnIncomingAck) { |
// Send the same ack, but send both data and an ack together. |
ack = InitAckFrame(3, 0); |
NackPacket(1, &ack); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(SequenceNumberSet())); |
EXPECT_CALL(visitor_, OnCanWrite()).WillOnce( |
IgnoreResult(InvokeWithoutArgs( |
&connection_, |
@@ -2939,7 +2990,7 @@ TEST_P(QuicConnectionTest, SendWhenDisconnected) { |
TEST_P(QuicConnectionTest, PublicReset) { |
QuicPublicResetPacket header; |
- header.public_header.guid = guid_; |
+ header.public_header.connection_id = connection_id_; |
header.public_header.reset_flag = true; |
header.public_header.version_flag = false; |
header.rejected_sequence_number = 10101; |
@@ -3149,7 +3200,7 @@ TEST_P(QuicConnectionTest, ServerSendsVersionNegotiationPacket) { |
framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED); |
QuicPacketHeader header; |
- header.public_header.guid = guid_; |
+ header.public_header.connection_id = connection_id_; |
header.public_header.reset_flag = false; |
header.public_header.version_flag = true; |
header.entropy_flag = false; |
@@ -3187,7 +3238,7 @@ TEST_P(QuicConnectionTest, ServerSendsVersionNegotiationPacketSocketBlocked) { |
framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED); |
QuicPacketHeader header; |
- header.public_header.guid = guid_; |
+ header.public_header.connection_id = connection_id_; |
header.public_header.reset_flag = false; |
header.public_header.version_flag = true; |
header.entropy_flag = false; |
@@ -3232,7 +3283,7 @@ TEST_P(QuicConnectionTest, |
framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED); |
QuicPacketHeader header; |
- header.public_header.guid = guid_; |
+ header.public_header.connection_id = connection_id_; |
header.public_header.reset_flag = false; |
header.public_header.version_flag = true; |
header.entropy_flag = false; |
@@ -3263,7 +3314,7 @@ TEST_P(QuicConnectionTest, ClientHandlesVersionNegotiation) { |
QUIC_VERSION_UNSUPPORTED); |
QuicPacketHeader header; |
- header.public_header.guid = guid_; |
+ header.public_header.connection_id = connection_id_; |
header.public_header.reset_flag = false; |
header.public_header.version_flag = true; |
header.entropy_flag = false; |
@@ -3301,7 +3352,7 @@ TEST_P(QuicConnectionTest, ClientHandlesVersionNegotiation) { |
TEST_P(QuicConnectionTest, BadVersionNegotiation) { |
QuicPacketHeader header; |
- header.public_header.guid = guid_; |
+ header.public_header.connection_id = connection_id_; |
header.public_header.reset_flag = false; |
header.public_header.version_flag = true; |
header.entropy_flag = false; |
@@ -3352,16 +3403,17 @@ TEST_P(QuicConnectionTest, CheckSendStats) { |
QuicAckFrame nack_three = InitAckFrame(4, 0); |
NackPacket(3, &nack_three); |
NackPacket(1, &nack_three); |
- QuicFrame frame(&nack_three); |
+ SequenceNumberSet lost_packets; |
+ lost_packets.insert(1); |
+ lost_packets.insert(3); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(lost_packets)); |
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); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAcked(4, _)).Times(1); |
+ EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(2); |
+ EXPECT_CALL(visitor_, OnCanWrite()).Times(2); |
EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
- |
- ProcessFramePacket(frame); |
- ProcessFramePacket(frame); |
- ProcessFramePacket(frame); |
+ ProcessAckPacket(&nack_three); |
EXPECT_CALL(*send_algorithm_, SmoothedRtt()).WillOnce( |
Return(QuicTime::Delta::Zero())); |
@@ -3428,7 +3480,7 @@ TEST_P(QuicConnectionTest, TestFecGroupLimits) { |
TEST_P(QuicConnectionTest, ProcessFramesIfPacketClosedConnection) { |
// Construct a packet with stream frame and connection close frame. |
- header_.public_header.guid = guid_; |
+ header_.public_header.connection_id = connection_id_; |
header_.packet_sequence_number = 1; |
header_.public_header.reset_flag = false; |
header_.public_header.version_flag = false; |
@@ -3460,7 +3512,7 @@ TEST_P(QuicConnectionTest, ProcessFramesIfPacketClosedConnection) { |
TEST_P(QuicConnectionTest, DontProcessStreamFrameAndIgnoreCloseFrame) { |
// Construct a packet with stream frame, ack frame, |
// and connection close frame. |
- header_.public_header.guid = guid_; |
+ header_.public_header.connection_id = connection_id_; |
header_.packet_sequence_number = 1; |
header_.public_header.reset_flag = false; |
header_.public_header.version_flag = false; |
@@ -3586,8 +3638,12 @@ TEST_P(QuicConnectionTest, AckNotifierFailToTriggerCallback) { |
// which we registered to be notified about. |
QuicAckFrame frame = InitAckFrame(3, 0); |
NackPacket(1, &frame); |
- EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)); |
- EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)); |
+ SequenceNumberSet lost_packets; |
+ lost_packets.insert(1); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(lost_packets)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketLost(1, _)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)); |
ProcessAckPacket(&frame); |
} |
@@ -3598,19 +3654,21 @@ TEST_P(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) { |
scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); |
EXPECT_CALL(*delegate, OnAckNotification()).Times(1); |
- // In total expect ACKs for all 4 packets. |
- 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(3, "foo", 0, !kFin, NULL); |
connection_.SendStreamDataWithString(3, "bar", 0, !kFin, delegate.get()); |
connection_.SendStreamDataWithString(3, "baz", 0, !kFin, NULL); |
connection_.SendStreamDataWithString(3, "qux", 0, !kFin, NULL); |
- // Now we receive ACK for packets 1, 3, and 4, which invokes fast retransmit. |
+ // Now we receive ACK for packets 1, 3, and 4 and lose 2. |
QuicAckFrame frame = InitAckFrame(4, 0); |
NackPacket(2, &frame); |
+ SequenceNumberSet lost_packets; |
+ lost_packets.insert(2); |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillOnce(Return(lost_packets)); |
+ EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(3); |
EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _)); |
EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)); |
EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
@@ -3618,6 +3676,10 @@ TEST_P(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) { |
// Now we get an ACK for packet 5 (retransmitted packet 2), which should |
// trigger the callback. |
+ EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _, _)) |
+ .WillRepeatedly(Return(SequenceNumberSet())); |
+ EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAcked(5, _)); |
QuicAckFrame second_ack_frame = InitAckFrame(5, 0); |
ProcessAckPacket(&second_ack_frame); |
} |
@@ -3653,7 +3715,7 @@ TEST_P(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) { |
frames.push_back(QuicFrame(&frame1_)); |
QuicPacketHeader ack_header; |
- ack_header.public_header.guid = guid_; |
+ ack_header.public_header.connection_id = connection_id_; |
ack_header.public_header.reset_flag = false; |
ack_header.public_header.version_flag = false; |
ack_header.entropy_flag = !kEntropyFlag; |
@@ -3738,10 +3800,10 @@ TEST_P(QuicConnectionTest, OnPacketHeaderDebugVisitor) { |
TEST_P(QuicConnectionTest, Pacing) { |
ValueRestore<bool> old_flag(&FLAGS_enable_quic_pacing, true); |
- TestConnection server(guid_, IPEndPoint(), helper_.get(), writer_.get(), |
- true, version()); |
- TestConnection client(guid_, IPEndPoint(), helper_.get(), writer_.get(), |
- false, version()); |
+ TestConnection server(connection_id_, IPEndPoint(), helper_.get(), |
+ writer_.get(), true, version()); |
+ TestConnection client(connection_id_, IPEndPoint(), helper_.get(), |
+ writer_.get(), false, version()); |
EXPECT_TRUE(client.sent_packet_manager().using_pacing()); |
EXPECT_FALSE(server.sent_packet_manager().using_pacing()); |
} |