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 |