Index: net/quic/quic_connection_test.cc |
diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc |
index 085c528bd588b97cb401ce93a232c8acf3b115a0..05aeeeb74e5572b547dd670655de531c83e28ee4 100644 |
--- a/net/quic/quic_connection_test.cc |
+++ b/net/quic/quic_connection_test.cc |
@@ -13,7 +13,6 @@ |
#include "net/quic/crypto/null_encrypter.h" |
#include "net/quic/crypto/quic_decrypter.h" |
#include "net/quic/crypto/quic_encrypter.h" |
-#include "net/quic/crypto/quic_random.h" |
#include "net/quic/quic_protocol.h" |
#include "net/quic/quic_sent_packet_manager.h" |
#include "net/quic/quic_utils.h" |
@@ -473,11 +472,6 @@ class TestConnection : public QuicConnection { |
QuicConnectionPeer::GetRetransmissionAlarm(this)); |
} |
- TestConnectionHelper::TestAlarm* GetAbandonFecAlarm() { |
- return reinterpret_cast<TestConnectionHelper::TestAlarm*>( |
- QuicConnectionPeer::GetAbandonFecAlarm(this)); |
- } |
- |
TestConnectionHelper::TestAlarm* GetSendAlarm() { |
return reinterpret_cast<TestConnectionHelper::TestAlarm*>( |
QuicConnectionPeer::GetSendAlarm(this)); |
@@ -507,7 +501,7 @@ class QuicConnectionTest : public ::testing::TestWithParam<bool> { |
QuicConnectionTest() |
: guid_(42), |
framer_(QuicSupportedVersions(), QuicTime::Zero(), false), |
- creator_(guid_, &framer_, QuicRandom::GetInstance(), false), |
+ creator_(guid_, &framer_, &random_generator_, false), |
send_algorithm_(new StrictMock<MockSendAlgorithm>), |
helper_(new TestConnectionHelper(&clock_, &random_generator_)), |
writer_(new TestPacketWriter()), |
@@ -920,6 +914,7 @@ TEST_F(QuicConnectionTest, TruncatedAck) { |
for (QuicPacketSequenceNumber i = 1; i <= 256; ++i) { |
frame.received_info.missing_packets.insert(i * 2); |
} |
+ frame.received_info.entropy_hash = 0; |
EXPECT_CALL(entropy_calculator_, |
EntropyHash(511)).WillOnce(testing::Return(0)); |
EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(256); |
@@ -934,6 +929,7 @@ TEST_F(QuicConnectionTest, TruncatedAck) { |
received_packet_manager->peer_largest_observed_packet()); |
frame.received_info.missing_packets.erase(192); |
+ frame.received_info.entropy_hash = 2; |
// Removing one missing packet allows us to ack 192 and one more range. |
EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2); |
@@ -1024,6 +1020,8 @@ TEST_F(QuicConnectionTest, AckReceiptCausesAckSend) { |
// But an ack with no missing packets will not send an ack. |
frame2.received_info.missing_packets.clear(); |
+ frame2.received_info.entropy_hash = |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, retransmission); |
ProcessAckPacket(&frame2); |
ProcessAckPacket(&frame2); |
} |
@@ -1296,10 +1294,12 @@ TEST_F(QuicConnectionTest, AbandonFECFromCongestionWindow) { |
QuicTime::Delta::FromMilliseconds(5000); |
clock_.AdvanceTime(retransmission_time); |
- // Abandon FEC packet. |
- EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(1); |
+ // Abandon FEC packet and data packet. |
+ EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(2); |
+ EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); |
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
EXPECT_CALL(visitor_, OnCanWrite()); |
- connection_.OnAbandonFecTimeout(); |
+ connection_.OnRetransmissionTimeout(); |
} |
TEST_F(QuicConnectionTest, DontAbandonAckedFEC) { |
@@ -1330,8 +1330,53 @@ TEST_F(QuicConnectionTest, DontAbandonAckedFEC) { |
// Don't abandon the acked FEC packet, but it will abandon 2 the subsequent |
// FEC packets. |
- EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(2); |
- connection_.GetAbandonFecAlarm()->Fire(); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(5); |
+ EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); |
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3); |
+ connection_.GetRetransmissionAlarm()->Fire(); |
+} |
+ |
+TEST_F(QuicConnectionTest, DontAbandonAllFEC) { |
+ EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
+ connection_.options()->max_packets_per_fec_group = 1; |
+ |
+ // 1 Data and 1 FEC packet. |
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); |
+ connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); |
+ // Send some more data afterwards to ensure early retransmit doesn't trigger. |
+ connection_.SendStreamDataWithString(1, "foo", 3, !kFin, NULL); |
+ // Advance the time so not all the FEC packets are abandoned. |
+ clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
+ connection_.SendStreamDataWithString(1, "foo", 6, !kFin, NULL); |
+ |
+ QuicAckFrame ack_fec(5, QuicTime::Zero(), 1); |
+ // Ack all data packets, but no fec packets. |
+ ack_fec.received_info.missing_packets.insert(2); |
+ ack_fec.received_info.missing_packets.insert(4); |
+ ack_fec.received_info.entropy_hash = |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 5) ^ |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 4) ^ |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^ |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^ |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 1); |
+ |
+ // Lose the first FEC packet and ack the three data packets. |
+ EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(3); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _)); |
+ ProcessAckPacket(&ack_fec); |
+ |
+ clock_.AdvanceTime(DefaultRetransmissionTime().Subtract( |
+ QuicTime::Delta::FromMilliseconds(1))); |
+ |
+ // Don't abandon the acked FEC packet, but it will abandon 1 of the subsequent |
+ // FEC packets. |
+ EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(4, _)); |
+ connection_.GetRetransmissionAlarm()->Fire(); |
+ |
+ // Ensure the connection's alarm is still set, in order to abandon the third |
+ // FEC packet. |
+ EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
} |
TEST_F(QuicConnectionTest, FramePacking) { |
@@ -1653,7 +1698,7 @@ TEST_F(QuicConnectionTest, DiscardRetransmit) { |
// Now, ack the previous transmission. |
QuicAckFrame ack_all(3, QuicTime::Zero(), 0); |
- nack_two.received_info.entropy_hash = |
+ ack_all.received_info.entropy_hash = |
QuicConnectionPeer::GetSentEntropyHash(&connection_, 3); |
ProcessAckPacket(&ack_all); |
@@ -1795,7 +1840,7 @@ TEST_F(QuicConnectionTest, MultipleAcks) { |
frame1.received_info.entropy_hash = |
QuicConnectionPeer::GetSentEntropyHash(&connection_, 5) ^ |
QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^ |
- QuicConnectionPeer::GetSentEntropyHash(&connection_, 1); |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 2); |
EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
@@ -1932,9 +1977,9 @@ TEST_F(QuicConnectionTest, RTOWithSameEncryptionLevel) { |
connection_.GetRetransmissionAlarm()->deadline()); |
{ |
InSequence s; |
- EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); |
EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)); |
EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)); |
+ EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); |
EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 3, _, RTO_RETRANSMISSION, _)); |
EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 4, _, RTO_RETRANSMISSION, _)); |
} |
@@ -2130,8 +2175,11 @@ TEST_F(QuicConnectionTest, RetransmissionCountCalculation) { |
// Ack the retransmitted packet. |
ack.received_info.missing_packets.insert(original_sequence_number); |
ack.received_info.missing_packets.insert(rto_sequence_number); |
- ack.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash( |
- &connection_, rto_sequence_number - 1); |
+ ack.received_info.entropy_hash = |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, |
+ rto_sequence_number - 1) ^ |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, |
+ original_sequence_number); |
for (int i = 0; i < 3; i++) { |
ProcessAckPacket(&ack); |
} |
@@ -2170,6 +2218,8 @@ TEST_F(QuicConnectionTest, DelayRTOWithAckReceipt) { |
clock_.AdvanceTime(DefaultRetransmissionTime()); |
EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1); |
QuicAckFrame ack(1, QuicTime::Zero(), 0); |
+ ack.received_info.entropy_hash = |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 1); |
ProcessAckPacket(&ack); |
EXPECT_TRUE(retransmission_alarm->IsSet()); |
@@ -3144,6 +3194,8 @@ TEST_F(QuicConnectionTest, AckNotifierTriggerCallback) { |
// Process an ACK from the server which should trigger the callback. |
EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1); |
QuicAckFrame frame(1, QuicTime::Zero(), 0); |
+ frame.received_info.entropy_hash = |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 1); |
ProcessAckPacket(&frame); |
} |
@@ -3168,6 +3220,9 @@ TEST_F(QuicConnectionTest, AckNotifierFailToTriggerCallback) { |
// which we registered to be notified about. |
QuicAckFrame frame(3, QuicTime::Zero(), 0); |
frame.received_info.missing_packets.insert(1); |
+ frame.received_info.entropy_hash = |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^ |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 1); |
EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)); |
EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)); |
ProcessAckPacket(&frame); |
@@ -3192,6 +3247,10 @@ TEST_F(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) { |
// Now we receive ACK for packets 1, 3, and 4, which invokes fast retransmit. |
QuicAckFrame frame(4, QuicTime::Zero(), 0); |
frame.received_info.missing_packets.insert(2); |
+ frame.received_info.entropy_hash = |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 4) ^ |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^ |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 1); |
EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _)); |
EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)); |
EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
@@ -3200,6 +3259,8 @@ TEST_F(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) { |
// Now we get an ACK for packet 5 (retransmitted packet 2), which should |
// trigger the callback. |
QuicAckFrame second_ack_frame(5, QuicTime::Zero(), 0); |
+ second_ack_frame.received_info.entropy_hash = |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 5); |
ProcessAckPacket(&second_ack_frame); |
} |
@@ -3224,6 +3285,8 @@ TEST_F(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) { |
QuicFrames frames; |
QuicAckFrame ack_frame(1, QuicTime::Zero(), 0); |
+ ack_frame.received_info.entropy_hash = |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 1); |
frames.push_back(QuicFrame(&ack_frame)); |
// Dummy stream frame to satisfy expectations set elsewhere. |