| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_unacked_packet_map.h" | 5 #include "net/quic/quic_unacked_packet_map.h" |
| 6 | 6 |
| 7 #include "net/quic/test_tools/quic_test_utils.h" | 7 #include "net/quic/test_tools/quic_test_utils.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 9 |
| 10 using std::min; | 10 using std::min; |
| 11 | 11 |
| 12 namespace net { | 12 namespace net { |
| 13 namespace test { | 13 namespace test { |
| 14 namespace { | 14 namespace { |
| 15 | 15 |
| 16 // Default packet length. | 16 // Default packet length. |
| 17 const uint32 kDefaultAckLength = 50; | 17 const uint32 kDefaultAckLength = 50; |
| 18 const uint32 kDefaultLength = 1000; | 18 const uint32 kDefaultLength = 1000; |
| 19 | 19 |
| 20 class QuicUnackedPacketMapTest : public ::testing::Test { | 20 class QuicUnackedPacketMapTest : public ::testing::Test { |
| 21 protected: | 21 protected: |
| 22 QuicUnackedPacketMapTest() | 22 QuicUnackedPacketMapTest() |
| 23 : now_(QuicTime::Zero().Add(QuicTime::Delta::FromMilliseconds(1000))) { | 23 : now_(QuicTime::Zero().Add(QuicTime::Delta::FromMilliseconds(1000))) { |
| 24 } | 24 } |
| 25 | 25 |
| 26 SerializedPacket CreateRetransmittablePacket( | 26 SerializedPacket CreateRetransmittablePacket( |
| 27 QuicPacketSequenceNumber sequence_number) { | 27 QuicPacketSequenceNumber sequence_number) { |
| 28 return SerializedPacket(sequence_number, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, | 28 return SerializedPacket(sequence_number, PACKET_1BYTE_SEQUENCE_NUMBER, |
| 29 0, new RetransmittableFrames()); | 29 nullptr, 0, new RetransmittableFrames()); |
| 30 } | 30 } |
| 31 | 31 |
| 32 SerializedPacket CreateNonRetransmittablePacket( | 32 SerializedPacket CreateNonRetransmittablePacket( |
| 33 QuicPacketSequenceNumber sequence_number) { | 33 QuicPacketSequenceNumber sequence_number) { |
| 34 return SerializedPacket( | 34 return SerializedPacket(sequence_number, PACKET_1BYTE_SEQUENCE_NUMBER, |
| 35 sequence_number, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); | 35 nullptr, 0, nullptr); |
| 36 } | 36 } |
| 37 | 37 |
| 38 void VerifyInFlightPackets(QuicPacketSequenceNumber* packets, | 38 void VerifyInFlightPackets(QuicPacketSequenceNumber* packets, |
| 39 size_t num_packets) { | 39 size_t num_packets) { |
| 40 unacked_packets_.RemoveObsoletePackets(); | 40 unacked_packets_.RemoveObsoletePackets(); |
| 41 if (num_packets == 0) { | 41 if (num_packets == 0) { |
| 42 EXPECT_FALSE(unacked_packets_.HasInFlightPackets()); | 42 EXPECT_FALSE(unacked_packets_.HasInFlightPackets()); |
| 43 EXPECT_FALSE(unacked_packets_.HasMultipleInFlightPackets()); | 43 EXPECT_FALSE(unacked_packets_.HasMultipleInFlightPackets()); |
| 44 return; | 44 return; |
| 45 } | 45 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 } | 77 } |
| 78 EXPECT_EQ(num_packets, unacked_packets_.GetNumUnackedPacketsDebugOnly()); | 78 EXPECT_EQ(num_packets, unacked_packets_.GetNumUnackedPacketsDebugOnly()); |
| 79 } | 79 } |
| 80 | 80 |
| 81 void VerifyRetransmittablePackets(QuicPacketSequenceNumber* packets, | 81 void VerifyRetransmittablePackets(QuicPacketSequenceNumber* packets, |
| 82 size_t num_packets) { | 82 size_t num_packets) { |
| 83 unacked_packets_.RemoveObsoletePackets(); | 83 unacked_packets_.RemoveObsoletePackets(); |
| 84 size_t num_retransmittable_packets = 0; | 84 size_t num_retransmittable_packets = 0; |
| 85 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 85 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
| 86 it != unacked_packets_.end(); ++it) { | 86 it != unacked_packets_.end(); ++it) { |
| 87 if (it->retransmittable_frames != NULL) { | 87 if (it->retransmittable_frames != nullptr) { |
| 88 ++num_retransmittable_packets; | 88 ++num_retransmittable_packets; |
| 89 } | 89 } |
| 90 } | 90 } |
| 91 EXPECT_EQ(num_packets, num_retransmittable_packets); | 91 EXPECT_EQ(num_packets, num_retransmittable_packets); |
| 92 for (size_t i = 0; i < num_packets; ++i) { | 92 for (size_t i = 0; i < num_packets; ++i) { |
| 93 EXPECT_TRUE(unacked_packets_.HasRetransmittableFrames(packets[i])) | 93 EXPECT_TRUE(unacked_packets_.HasRetransmittableFrames(packets[i])) |
| 94 << " packets[" << i << "]:" << packets[i]; | 94 << " packets[" << i << "]:" << packets[i]; |
| 95 } | 95 } |
| 96 } | 96 } |
| 97 | 97 |
| 98 QuicUnackedPacketMap unacked_packets_; | 98 QuicUnackedPacketMap unacked_packets_; |
| 99 QuicTime now_; | 99 QuicTime now_; |
| 100 }; | 100 }; |
| 101 | 101 |
| 102 TEST_F(QuicUnackedPacketMapTest, RttOnly) { | 102 TEST_F(QuicUnackedPacketMapTest, RttOnly) { |
| 103 // Acks are only tracked for RTT measurement purposes. | 103 // Acks are only tracked for RTT measurement purposes. |
| 104 unacked_packets_.AddPacket(CreateNonRetransmittablePacket(1)); | 104 unacked_packets_.AddPacket(CreateNonRetransmittablePacket(1)); |
| 105 unacked_packets_.SetSent(1, now_, kDefaultAckLength, false); | 105 unacked_packets_.SetSent(1, now_, kDefaultAckLength, false); |
| 106 | 106 |
| 107 QuicPacketSequenceNumber unacked[] = { 1 }; | 107 QuicPacketSequenceNumber unacked[] = { 1 }; |
| 108 VerifyUnackedPackets(unacked, arraysize(unacked)); | 108 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 109 VerifyInFlightPackets(NULL, 0); | 109 VerifyInFlightPackets(nullptr, 0); |
| 110 VerifyRetransmittablePackets(NULL, 0); | 110 VerifyRetransmittablePackets(nullptr, 0); |
| 111 | 111 |
| 112 unacked_packets_.IncreaseLargestObserved(1); | 112 unacked_packets_.IncreaseLargestObserved(1); |
| 113 VerifyUnackedPackets(NULL, 0); | 113 VerifyUnackedPackets(nullptr, 0); |
| 114 VerifyInFlightPackets(NULL, 0); | 114 VerifyInFlightPackets(nullptr, 0); |
| 115 VerifyRetransmittablePackets(NULL, 0); | 115 VerifyRetransmittablePackets(nullptr, 0); |
| 116 } | 116 } |
| 117 | 117 |
| 118 TEST_F(QuicUnackedPacketMapTest, DiscardOldRttOnly) { | 118 TEST_F(QuicUnackedPacketMapTest, DiscardOldRttOnly) { |
| 119 // Acks are only tracked for RTT measurement purposes, and are discarded | 119 // Acks are only tracked for RTT measurement purposes, and are discarded |
| 120 // when more than 200 accumulate. | 120 // when more than 200 accumulate. |
| 121 const size_t kNumUnackedPackets = 200; | 121 const size_t kNumUnackedPackets = 200; |
| 122 for (size_t i = 1; i < 400; ++i) { | 122 for (size_t i = 1; i < 400; ++i) { |
| 123 unacked_packets_.AddPacket(CreateNonRetransmittablePacket(i)); | 123 unacked_packets_.AddPacket(CreateNonRetransmittablePacket(i)); |
| 124 unacked_packets_.SetSent(i, now_, kDefaultAckLength, false); | 124 unacked_packets_.SetSent(i, now_, kDefaultAckLength, false); |
| 125 unacked_packets_.RemoveObsoletePackets(); | 125 unacked_packets_.RemoveObsoletePackets(); |
| 126 EXPECT_EQ(min(i, kNumUnackedPackets), | 126 EXPECT_EQ(min(i, kNumUnackedPackets), |
| 127 unacked_packets_.GetNumUnackedPacketsDebugOnly()); | 127 unacked_packets_.GetNumUnackedPacketsDebugOnly()); |
| 128 } | 128 } |
| 129 } | 129 } |
| 130 | 130 |
| 131 TEST_F(QuicUnackedPacketMapTest, RetransmittableInflightAndRtt) { | 131 TEST_F(QuicUnackedPacketMapTest, RetransmittableInflightAndRtt) { |
| 132 // Simulate a retransmittable packet being sent and acked. | 132 // Simulate a retransmittable packet being sent and acked. |
| 133 unacked_packets_.AddPacket(CreateRetransmittablePacket(1)); | 133 unacked_packets_.AddPacket(CreateRetransmittablePacket(1)); |
| 134 unacked_packets_.SetSent(1, now_, kDefaultLength, true); | 134 unacked_packets_.SetSent(1, now_, kDefaultLength, true); |
| 135 | 135 |
| 136 QuicPacketSequenceNumber unacked[] = { 1 }; | 136 QuicPacketSequenceNumber unacked[] = { 1 }; |
| 137 VerifyUnackedPackets(unacked, arraysize(unacked)); | 137 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 138 VerifyInFlightPackets(unacked, arraysize(unacked)); | 138 VerifyInFlightPackets(unacked, arraysize(unacked)); |
| 139 VerifyRetransmittablePackets(unacked, arraysize(unacked)); | 139 VerifyRetransmittablePackets(unacked, arraysize(unacked)); |
| 140 | 140 |
| 141 unacked_packets_.RemoveRetransmittability(1); | 141 unacked_packets_.RemoveRetransmittability(1); |
| 142 VerifyUnackedPackets(unacked, arraysize(unacked)); | 142 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 143 VerifyInFlightPackets(unacked, arraysize(unacked)); | 143 VerifyInFlightPackets(unacked, arraysize(unacked)); |
| 144 VerifyRetransmittablePackets(NULL, 0); | 144 VerifyRetransmittablePackets(nullptr, 0); |
| 145 | 145 |
| 146 unacked_packets_.IncreaseLargestObserved(1); | 146 unacked_packets_.IncreaseLargestObserved(1); |
| 147 VerifyUnackedPackets(unacked, arraysize(unacked)); | 147 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 148 VerifyInFlightPackets(unacked, arraysize(unacked)); | 148 VerifyInFlightPackets(unacked, arraysize(unacked)); |
| 149 VerifyRetransmittablePackets(NULL, 0); | 149 VerifyRetransmittablePackets(nullptr, 0); |
| 150 | 150 |
| 151 unacked_packets_.RemoveFromInFlight(1); | 151 unacked_packets_.RemoveFromInFlight(1); |
| 152 VerifyUnackedPackets(NULL, 0); | 152 VerifyUnackedPackets(nullptr, 0); |
| 153 VerifyInFlightPackets(NULL, 0); | 153 VerifyInFlightPackets(nullptr, 0); |
| 154 VerifyRetransmittablePackets(NULL, 0); | 154 VerifyRetransmittablePackets(nullptr, 0); |
| 155 } | 155 } |
| 156 | 156 |
| 157 TEST_F(QuicUnackedPacketMapTest, RetransmittedPacket) { | 157 TEST_F(QuicUnackedPacketMapTest, RetransmittedPacket) { |
| 158 // Simulate a retransmittable packet being sent, retransmitted, and the first | 158 // Simulate a retransmittable packet being sent, retransmitted, and the first |
| 159 // transmission being acked. | 159 // transmission being acked. |
| 160 unacked_packets_.AddPacket(CreateRetransmittablePacket(1)); | 160 unacked_packets_.AddPacket(CreateRetransmittablePacket(1)); |
| 161 unacked_packets_.SetSent(1, now_, kDefaultLength, true); | 161 unacked_packets_.SetSent(1, now_, kDefaultLength, true); |
| 162 unacked_packets_.OnRetransmittedPacket(1, 2, LOSS_RETRANSMISSION); | 162 unacked_packets_.OnRetransmittedPacket(1, 2, LOSS_RETRANSMISSION); |
| 163 unacked_packets_.SetSent(2, now_, kDefaultLength, true); | 163 unacked_packets_.SetSent(2, now_, kDefaultLength, true); |
| 164 | 164 |
| 165 QuicPacketSequenceNumber unacked[] = { 1, 2 }; | 165 QuicPacketSequenceNumber unacked[] = { 1, 2 }; |
| 166 VerifyUnackedPackets(unacked, arraysize(unacked)); | 166 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 167 VerifyInFlightPackets(unacked, arraysize(unacked)); | 167 VerifyInFlightPackets(unacked, arraysize(unacked)); |
| 168 QuicPacketSequenceNumber retransmittable[] = { 2 }; | 168 QuicPacketSequenceNumber retransmittable[] = { 2 }; |
| 169 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | 169 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); |
| 170 | 170 |
| 171 unacked_packets_.RemoveRetransmittability(1); | 171 unacked_packets_.RemoveRetransmittability(1); |
| 172 VerifyUnackedPackets(unacked, arraysize(unacked)); | 172 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 173 VerifyInFlightPackets(unacked, arraysize(unacked)); | 173 VerifyInFlightPackets(unacked, arraysize(unacked)); |
| 174 VerifyRetransmittablePackets(NULL, 0); | 174 VerifyRetransmittablePackets(nullptr, 0); |
| 175 | 175 |
| 176 unacked_packets_.IncreaseLargestObserved(2); | 176 unacked_packets_.IncreaseLargestObserved(2); |
| 177 VerifyUnackedPackets(unacked, arraysize(unacked)); | 177 VerifyUnackedPackets(unacked, arraysize(unacked)); |
| 178 VerifyInFlightPackets(unacked, arraysize(unacked)); | 178 VerifyInFlightPackets(unacked, arraysize(unacked)); |
| 179 VerifyRetransmittablePackets(NULL, 0); | 179 VerifyRetransmittablePackets(nullptr, 0); |
| 180 | 180 |
| 181 unacked_packets_.RemoveFromInFlight(2); | 181 unacked_packets_.RemoveFromInFlight(2); |
| 182 QuicPacketSequenceNumber unacked2[] = { 1 }; | 182 QuicPacketSequenceNumber unacked2[] = { 1 }; |
| 183 VerifyUnackedPackets(unacked, arraysize(unacked2)); | 183 VerifyUnackedPackets(unacked, arraysize(unacked2)); |
| 184 VerifyInFlightPackets(unacked, arraysize(unacked2)); | 184 VerifyInFlightPackets(unacked, arraysize(unacked2)); |
| 185 VerifyRetransmittablePackets(NULL, 0); | 185 VerifyRetransmittablePackets(nullptr, 0); |
| 186 | 186 |
| 187 unacked_packets_.RemoveFromInFlight(1); | 187 unacked_packets_.RemoveFromInFlight(1); |
| 188 VerifyUnackedPackets(NULL, 0); | 188 VerifyUnackedPackets(nullptr, 0); |
| 189 VerifyInFlightPackets(NULL, 0); | 189 VerifyInFlightPackets(nullptr, 0); |
| 190 VerifyRetransmittablePackets(NULL, 0); | 190 VerifyRetransmittablePackets(nullptr, 0); |
| 191 } | 191 } |
| 192 | 192 |
| 193 TEST_F(QuicUnackedPacketMapTest, RetransmitThreeTimes) { | 193 TEST_F(QuicUnackedPacketMapTest, RetransmitThreeTimes) { |
| 194 // Simulate a retransmittable packet being sent and retransmitted twice. | 194 // Simulate a retransmittable packet being sent and retransmitted twice. |
| 195 unacked_packets_.AddPacket(CreateRetransmittablePacket(1)); | 195 unacked_packets_.AddPacket(CreateRetransmittablePacket(1)); |
| 196 unacked_packets_.SetSent(1, now_, kDefaultLength, true); | 196 unacked_packets_.SetSent(1, now_, kDefaultLength, true); |
| 197 unacked_packets_.AddPacket(CreateRetransmittablePacket(2)); | 197 unacked_packets_.AddPacket(CreateRetransmittablePacket(2)); |
| 198 unacked_packets_.SetSent(2, now_, kDefaultLength, true); | 198 unacked_packets_.SetSent(2, now_, kDefaultLength, true); |
| 199 | 199 |
| 200 QuicPacketSequenceNumber unacked[] = { 1, 2 }; | 200 QuicPacketSequenceNumber unacked[] = { 1, 2 }; |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 EXPECT_TRUE(unacked_packets_.IsUnacked(3)); | 362 EXPECT_TRUE(unacked_packets_.IsUnacked(3)); |
| 363 EXPECT_FALSE(unacked_packets_.IsUnacked(4)); | 363 EXPECT_FALSE(unacked_packets_.IsUnacked(4)); |
| 364 EXPECT_TRUE(unacked_packets_.IsUnacked(5)); | 364 EXPECT_TRUE(unacked_packets_.IsUnacked(5)); |
| 365 EXPECT_EQ(5u, unacked_packets_.largest_sent_packet()); | 365 EXPECT_EQ(5u, unacked_packets_.largest_sent_packet()); |
| 366 } | 366 } |
| 367 | 367 |
| 368 | 368 |
| 369 } // namespace | 369 } // namespace |
| 370 } // namespace test | 370 } // namespace test |
| 371 } // namespace net | 371 } // namespace net |
| OLD | NEW |