| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_sent_packet_manager.h" | 5 #include "net/quic/quic_sent_packet_manager.h" |
| 6 | 6 |
| 7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
| 8 #include "net/quic/test_tools/quic_config_peer.h" | 8 #include "net/quic/test_tools/quic_config_peer.h" |
| 9 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" | 9 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" |
| 10 #include "net/quic/test_tools/quic_test_utils.h" | 10 #include "net/quic/test_tools/quic_test_utils.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 | 62 |
| 63 EXPECT_TRUE(manager_.HasUnackedPackets()); | 63 EXPECT_TRUE(manager_.HasUnackedPackets()); |
| 64 EXPECT_EQ(packets[0], manager_.GetLeastUnackedSentPacket()); | 64 EXPECT_EQ(packets[0], manager_.GetLeastUnackedSentPacket()); |
| 65 for (size_t i = 0; i < num_packets; ++i) { | 65 for (size_t i = 0; i < num_packets; ++i) { |
| 66 EXPECT_TRUE(manager_.IsUnacked(packets[i])) << packets[i]; | 66 EXPECT_TRUE(manager_.IsUnacked(packets[i])) << packets[i]; |
| 67 } | 67 } |
| 68 } | 68 } |
| 69 | 69 |
| 70 void VerifyRetransmittablePackets(QuicPacketSequenceNumber* packets, | 70 void VerifyRetransmittablePackets(QuicPacketSequenceNumber* packets, |
| 71 size_t num_packets) { | 71 size_t num_packets) { |
| 72 SequenceNumberSet unacked = | |
| 73 QuicSentPacketManagerPeer::GetUnackedPackets(&manager_); | |
| 74 for (size_t i = 0; i < num_packets; ++i) { | |
| 75 EXPECT_TRUE(ContainsKey(unacked, packets[i])) << packets[i]; | |
| 76 } | |
| 77 size_t num_retransmittable = 0; | |
| 78 for (SequenceNumberSet::const_iterator it = unacked.begin(); | |
| 79 it != unacked.end(); ++it) { | |
| 80 if (manager_.HasRetransmittableFrames(*it)) { | |
| 81 ++num_retransmittable; | |
| 82 } | |
| 83 } | |
| 84 EXPECT_EQ(num_packets, | 72 EXPECT_EQ(num_packets, |
| 85 QuicSentPacketManagerPeer::GetNumRetransmittablePackets( | 73 QuicSentPacketManagerPeer::GetNumRetransmittablePackets( |
| 86 &manager_)); | 74 &manager_)); |
| 87 EXPECT_EQ(num_packets, num_retransmittable); | 75 for (size_t i = 0; i < num_packets; ++i) { |
| 76 EXPECT_TRUE(manager_.HasRetransmittableFrames(packets[i])) |
| 77 << " packets[" << i << "]:" << packets[i]; |
| 78 } |
| 88 } | 79 } |
| 89 | 80 |
| 90 void ExpectAck(QuicPacketSequenceNumber largest_observed) { | 81 void ExpectAck(QuicPacketSequenceNumber largest_observed) { |
| 91 EXPECT_CALL(*send_algorithm_, OnCongestionEvent( | 82 EXPECT_CALL(*send_algorithm_, OnCongestionEvent( |
| 92 true, _, ElementsAre(Pair(largest_observed, _)), _)); | 83 true, _, ElementsAre(Pair(largest_observed, _)), _)); |
| 93 } | 84 } |
| 94 | 85 |
| 95 void ExpectUpdatedRtt(QuicPacketSequenceNumber largest_observed) { | 86 void ExpectUpdatedRtt(QuicPacketSequenceNumber largest_observed) { |
| 96 EXPECT_CALL(*send_algorithm_, | 87 EXPECT_CALL(*send_algorithm_, |
| 97 OnCongestionEvent(true, _, _, _)); | 88 OnCongestionEvent(true, _, _, _)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 118 vector<QuicPacketSequenceNumber> lost_vector; | 109 vector<QuicPacketSequenceNumber> lost_vector; |
| 119 for (size_t i = 0; i < num_packets_lost; ++i) { | 110 for (size_t i = 0; i < num_packets_lost; ++i) { |
| 120 lost_vector.push_back(packets_lost[i]); | 111 lost_vector.push_back(packets_lost[i]); |
| 121 } | 112 } |
| 122 EXPECT_CALL(*send_algorithm_, | 113 EXPECT_CALL(*send_algorithm_, |
| 123 OnCongestionEvent(rtt_updated, _, | 114 OnCongestionEvent(rtt_updated, _, |
| 124 Pointwise(KeyEq(), ack_vector), | 115 Pointwise(KeyEq(), ack_vector), |
| 125 Pointwise(KeyEq(), lost_vector))); | 116 Pointwise(KeyEq(), lost_vector))); |
| 126 } | 117 } |
| 127 | 118 |
| 119 // Retransmits a packet as though it was a TLP retransmission, because TLP |
| 120 // leaves the |old_sequence_number| pending. |
| 121 // TODO(ianswett): Test with transmission types besides TLP. |
| 128 void RetransmitPacket(QuicPacketSequenceNumber old_sequence_number, | 122 void RetransmitPacket(QuicPacketSequenceNumber old_sequence_number, |
| 129 QuicPacketSequenceNumber new_sequence_number) { | 123 QuicPacketSequenceNumber new_sequence_number) { |
| 130 QuicSentPacketManagerPeer::MarkForRetransmission( | 124 QuicSentPacketManagerPeer::MarkForRetransmission( |
| 131 &manager_, old_sequence_number, LOSS_RETRANSMISSION); | 125 &manager_, old_sequence_number, TLP_RETRANSMISSION); |
| 132 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 126 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
| 133 QuicSentPacketManager::PendingRetransmission next_retransmission = | 127 QuicSentPacketManager::PendingRetransmission next_retransmission = |
| 134 manager_.NextPendingRetransmission(); | 128 manager_.NextPendingRetransmission(); |
| 135 EXPECT_EQ(old_sequence_number, next_retransmission.sequence_number); | 129 EXPECT_EQ(old_sequence_number, next_retransmission.sequence_number); |
| 136 EXPECT_EQ(LOSS_RETRANSMISSION, | 130 EXPECT_EQ(TLP_RETRANSMISSION, |
| 137 next_retransmission.transmission_type); | 131 next_retransmission.transmission_type); |
| 138 manager_.OnRetransmittedPacket(old_sequence_number, new_sequence_number); | 132 manager_.OnRetransmittedPacket(old_sequence_number, new_sequence_number); |
| 139 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission( | 133 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission( |
| 140 &manager_, new_sequence_number)); | 134 &manager_, new_sequence_number)); |
| 141 } | 135 } |
| 142 | 136 |
| 143 void RetransmitAndSendPacket(QuicPacketSequenceNumber old_sequence_number, | 137 void RetransmitAndSendPacket(QuicPacketSequenceNumber old_sequence_number, |
| 144 QuicPacketSequenceNumber new_sequence_number) { | 138 QuicPacketSequenceNumber new_sequence_number) { |
| 145 RetransmitPacket(old_sequence_number, new_sequence_number); | 139 RetransmitPacket(old_sequence_number, new_sequence_number); |
| 146 | 140 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 } | 184 } |
| 191 | 185 |
| 192 void SendCryptoPacket(QuicPacketSequenceNumber sequence_number) { | 186 void SendCryptoPacket(QuicPacketSequenceNumber sequence_number) { |
| 193 EXPECT_CALL(*send_algorithm_, | 187 EXPECT_CALL(*send_algorithm_, |
| 194 OnPacketSent(_, BytesInFlight(), sequence_number, | 188 OnPacketSent(_, BytesInFlight(), sequence_number, |
| 195 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) | 189 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) |
| 196 .Times(1).WillOnce(Return(true)); | 190 .Times(1).WillOnce(Return(true)); |
| 197 SerializedPacket packet(CreateDataPacket(sequence_number)); | 191 SerializedPacket packet(CreateDataPacket(sequence_number)); |
| 198 packet.retransmittable_frames->AddStreamFrame( | 192 packet.retransmittable_frames->AddStreamFrame( |
| 199 new QuicStreamFrame(1, false, 0, IOVector())); | 193 new QuicStreamFrame(1, false, 0, IOVector())); |
| 200 packet.retransmittable_frames->set_encryption_level(ENCRYPTION_NONE); | |
| 201 manager_.OnSerializedPacket(packet); | 194 manager_.OnSerializedPacket(packet); |
| 202 manager_.OnPacketSent(sequence_number, clock_.ApproximateNow(), | 195 manager_.OnPacketSent(sequence_number, clock_.ApproximateNow(), |
| 203 packet.packet->length(), NOT_RETRANSMISSION, | 196 packet.packet->length(), NOT_RETRANSMISSION, |
| 204 HAS_RETRANSMITTABLE_DATA); | 197 HAS_RETRANSMITTABLE_DATA); |
| 205 } | 198 } |
| 206 | 199 |
| 207 void SendFecPacket(QuicPacketSequenceNumber sequence_number) { | 200 void SendFecPacket(QuicPacketSequenceNumber sequence_number) { |
| 208 EXPECT_CALL(*send_algorithm_, | 201 EXPECT_CALL(*send_algorithm_, |
| 209 OnPacketSent(_, BytesInFlight(), sequence_number, | 202 OnPacketSent(_, BytesInFlight(), sequence_number, |
| 210 kDefaultLength, NO_RETRANSMITTABLE_DATA)) | 203 kDefaultLength, NO_RETRANSMITTABLE_DATA)) |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 // Packet 1 is unacked, pending, but not retransmittable. | 283 // Packet 1 is unacked, pending, but not retransmittable. |
| 291 QuicPacketSequenceNumber unacked[] = { 1 }; | 284 QuicPacketSequenceNumber unacked[] = { 1 }; |
| 292 VerifyUnackedPackets(unacked, arraysize(unacked)); | 285 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 293 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | 286 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); |
| 294 VerifyRetransmittablePackets(NULL, 0); | 287 VerifyRetransmittablePackets(NULL, 0); |
| 295 } | 288 } |
| 296 | 289 |
| 297 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) { | 290 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) { |
| 298 SendDataPacket(1); | 291 SendDataPacket(1); |
| 299 QuicSentPacketManagerPeer::MarkForRetransmission( | 292 QuicSentPacketManagerPeer::MarkForRetransmission( |
| 300 &manager_, 1, LOSS_RETRANSMISSION); | 293 &manager_, 1, TLP_RETRANSMISSION); |
| 301 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 294 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
| 302 | 295 |
| 303 // Ack 1. | 296 // Ack 1. |
| 304 ReceivedPacketInfo received_info; | 297 ReceivedPacketInfo received_info; |
| 305 received_info.largest_observed = 1; | 298 received_info.largest_observed = 1; |
| 306 ExpectAck(1); | 299 ExpectAck(1); |
| 307 manager_.OnIncomingAck(received_info, clock_.Now()); | 300 manager_.OnIncomingAck(received_info, clock_.Now()); |
| 308 | 301 |
| 309 // There should no longer be a pending retransmission. | 302 // There should no longer be a pending retransmission. |
| 310 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 303 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 received_info.missing_packets.insert(2); | 543 received_info.missing_packets.insert(2); |
| 551 received_info.missing_packets.insert(3); | 544 received_info.missing_packets.insert(3); |
| 552 received_info.missing_packets.insert(4); | 545 received_info.missing_packets.insert(4); |
| 553 received_info.is_truncated = true; | 546 received_info.is_truncated = true; |
| 554 | 547 |
| 555 QuicPacketSequenceNumber lost[] = { 1 }; | 548 QuicPacketSequenceNumber lost[] = { 1 }; |
| 556 ExpectAcksAndLosses(true, NULL, 0, lost, arraysize(lost)); | 549 ExpectAcksAndLosses(true, NULL, 0, lost, arraysize(lost)); |
| 557 manager_.OnIncomingAck(received_info, clock_.Now()); | 550 manager_.OnIncomingAck(received_info, clock_.Now()); |
| 558 | 551 |
| 559 // High water mark will be raised. | 552 // High water mark will be raised. |
| 560 QuicPacketSequenceNumber unacked[] = { 2, 3, 4 }; | 553 QuicPacketSequenceNumber unacked[] = { 2, 3, 4, 5 }; |
| 561 VerifyUnackedPackets(unacked, arraysize(unacked)); | 554 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 562 QuicPacketSequenceNumber retransmittable[] = { 4 }; | 555 QuicPacketSequenceNumber retransmittable[] = { 5 }; |
| 563 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | 556 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); |
| 564 } | 557 } |
| 565 | 558 |
| 566 TEST_F(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) { | 559 TEST_F(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) { |
| 567 SendDataPacket(1); | 560 SendDataPacket(1); |
| 568 RetransmitAndSendPacket(1, 2); | 561 RetransmitAndSendPacket(1, 2); |
| 569 RetransmitAndSendPacket(2, 3); | 562 RetransmitAndSendPacket(2, 3); |
| 570 RetransmitAndSendPacket(3, 4); | 563 RetransmitAndSendPacket(3, 4); |
| 571 manager_.OnSerializedPacket(CreateDataPacket(5)); | 564 manager_.OnSerializedPacket(CreateDataPacket(5)); |
| 572 manager_.OnSerializedPacket(CreateDataPacket(6)); | 565 manager_.OnSerializedPacket(CreateDataPacket(6)); |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 981 // Now retransmit all the unacked packets, which occurs when there is a | 974 // Now retransmit all the unacked packets, which occurs when there is a |
| 982 // version negotiation. | 975 // version negotiation. |
| 983 manager_.RetransmitUnackedPackets(ALL_PACKETS); | 976 manager_.RetransmitUnackedPackets(ALL_PACKETS); |
| 984 QuicPacketSequenceNumber unacked[] = { 1, 2 }; | 977 QuicPacketSequenceNumber unacked[] = { 1, 2 }; |
| 985 VerifyUnackedPackets(unacked, arraysize(unacked)); | 978 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 986 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 979 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
| 987 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | 980 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); |
| 988 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | 981 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); |
| 989 } | 982 } |
| 990 | 983 |
| 991 TEST_F(QuicSentPacketManagerTest, | |
| 992 CryptoHandshakeRetransmissionThenAbandonAll) { | |
| 993 // Send 1 crypto packet. | |
| 994 SendCryptoPacket(1); | |
| 995 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 996 | |
| 997 // Retransmit the crypto packet as 2. | |
| 998 manager_.OnRetransmissionTimeout(); | |
| 999 RetransmitNextPacket(2); | |
| 1000 | |
| 1001 // Now discard all unacked unencrypted packets, which occurs when the | |
| 1002 // connection goes forward secure. | |
| 1003 manager_.DiscardUnencryptedPackets(); | |
| 1004 VerifyUnackedPackets(NULL, 0); | |
| 1005 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
| 1006 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
| 1007 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
| 1008 } | |
| 1009 | |
| 1010 TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeoutUnsentDataPacket) { | 984 TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeoutUnsentDataPacket) { |
| 1011 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); | 985 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); |
| 1012 // Serialize two data packets and send the latter. | 986 // Serialize two data packets and send the latter. |
| 1013 SerializedPacket packet(CreateDataPacket(1)); | 987 SerializedPacket packet(CreateDataPacket(1)); |
| 1014 manager_.OnSerializedPacket(packet); | 988 manager_.OnSerializedPacket(packet); |
| 1015 SendDataPacket(2); | 989 SendDataPacket(2); |
| 1016 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | 990 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); |
| 1017 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | 991 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); |
| 1018 | 992 |
| 1019 // Retransmit 1 unacked packets, but not the first serialized packet. | 993 // Retransmit 1 unacked packets, but not the first serialized packet. |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1219 | 1193 |
| 1220 EXPECT_EQ(kTime, | 1194 EXPECT_EQ(kTime, |
| 1221 QuicSentPacketManagerPeer::GetLossAlgorithm( | 1195 QuicSentPacketManagerPeer::GetLossAlgorithm( |
| 1222 &manager_)->GetLossDetectionType()); | 1196 &manager_)->GetLossDetectionType()); |
| 1223 } | 1197 } |
| 1224 | 1198 |
| 1225 | 1199 |
| 1226 } // namespace | 1200 } // namespace |
| 1227 } // namespace test | 1201 } // namespace test |
| 1228 } // namespace net | 1202 } // namespace net |
| OLD | NEW |