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/tools/quic/quic_time_wait_list_manager.h" | 5 #include "net/tools/quic/quic_time_wait_list_manager.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 | 8 |
9 #include "net/quic/crypto/crypto_protocol.h" | 9 #include "net/quic/crypto/crypto_protocol.h" |
10 #include "net/quic/crypto/null_encrypter.h" | 10 #include "net/quic/crypto/null_encrypter.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 public: | 43 public: |
44 static bool ShouldSendResponse(QuicTimeWaitListManager* manager, | 44 static bool ShouldSendResponse(QuicTimeWaitListManager* manager, |
45 int received_packet_count) { | 45 int received_packet_count) { |
46 return manager->ShouldSendResponse(received_packet_count); | 46 return manager->ShouldSendResponse(received_packet_count); |
47 } | 47 } |
48 | 48 |
49 static QuicTime::Delta time_wait_period(QuicTimeWaitListManager* manager) { | 49 static QuicTime::Delta time_wait_period(QuicTimeWaitListManager* manager) { |
50 return manager->kTimeWaitPeriod_; | 50 return manager->kTimeWaitPeriod_; |
51 } | 51 } |
52 | 52 |
53 static QuicVersion GetQuicVersionFromGuid(QuicTimeWaitListManager* manager, | 53 static QuicVersion GetQuicVersionFromConnectionId( |
54 QuicGuid guid) { | 54 QuicTimeWaitListManager* manager, |
55 return manager->GetQuicVersionFromGuid(guid); | 55 QuicConnectionId connection_id) { |
| 56 return manager->GetQuicVersionFromConnectionId(connection_id); |
56 } | 57 } |
57 }; | 58 }; |
58 | 59 |
59 namespace { | 60 namespace { |
60 | 61 |
61 class MockFakeTimeEpollServer : public FakeTimeEpollServer { | 62 class MockFakeTimeEpollServer : public FakeTimeEpollServer { |
62 public: | 63 public: |
63 MOCK_METHOD2(RegisterAlarm, void(int64 timeout_in_us, | 64 MOCK_METHOD2(RegisterAlarm, void(int64 timeout_in_us, |
64 EpollAlarmCallbackInterface* alarm)); | 65 EpollAlarmCallbackInterface* alarm)); |
65 }; | 66 }; |
66 | 67 |
67 class QuicTimeWaitListManagerTest : public testing::Test { | 68 class QuicTimeWaitListManagerTest : public testing::Test { |
68 protected: | 69 protected: |
69 QuicTimeWaitListManagerTest() | 70 QuicTimeWaitListManagerTest() |
70 : time_wait_list_manager_(&writer_, &visitor_, | 71 : time_wait_list_manager_(&writer_, &visitor_, |
71 &epoll_server_, QuicSupportedVersions()), | 72 &epoll_server_, QuicSupportedVersions()), |
72 framer_(QuicSupportedVersions(), QuicTime::Zero(), true), | 73 framer_(QuicSupportedVersions(), QuicTime::Zero(), true), |
73 guid_(45), | 74 connection_id_(45), |
74 client_address_(net::test::TestPeerIPAddress(), kTestPort), | 75 client_address_(net::test::TestPeerIPAddress(), kTestPort), |
75 writer_is_blocked_(false) {} | 76 writer_is_blocked_(false) {} |
76 | 77 |
77 virtual ~QuicTimeWaitListManagerTest() {} | 78 virtual ~QuicTimeWaitListManagerTest() {} |
78 | 79 |
79 virtual void SetUp() { | 80 virtual void SetUp() { |
80 EXPECT_CALL(writer_, IsWriteBlocked()) | 81 EXPECT_CALL(writer_, IsWriteBlocked()) |
81 .WillRepeatedly(ReturnPointee(&writer_is_blocked_)); | 82 .WillRepeatedly(ReturnPointee(&writer_is_blocked_)); |
82 EXPECT_CALL(writer_, IsWriteBlockedDataBuffered()) | 83 EXPECT_CALL(writer_, IsWriteBlockedDataBuffered()) |
83 .WillRepeatedly(Return(false)); | 84 .WillRepeatedly(Return(false)); |
84 } | 85 } |
85 | 86 |
86 void AddGuid(QuicGuid guid) { | 87 void AddConnectionId(QuicConnectionId connection_id) { |
87 AddGuid(guid, net::test::QuicVersionMax(), NULL); | 88 AddConnectionId(connection_id, net::test::QuicVersionMax(), NULL); |
88 } | 89 } |
89 | 90 |
90 void AddGuid(QuicGuid guid, | 91 void AddConnectionId(QuicConnectionId connection_id, |
91 QuicVersion version, | 92 QuicVersion version, |
92 QuicEncryptedPacket* packet) { | 93 QuicEncryptedPacket* packet) { |
93 time_wait_list_manager_.AddGuidToTimeWait(guid, version, packet); | 94 time_wait_list_manager_.AddConnectionIdToTimeWait( |
| 95 connection_id, version, packet); |
94 } | 96 } |
95 | 97 |
96 bool IsGuidInTimeWait(QuicGuid guid) { | 98 bool IsConnectionIdInTimeWait(QuicConnectionId connection_id) { |
97 return time_wait_list_manager_.IsGuidInTimeWait(guid); | 99 return time_wait_list_manager_.IsConnectionIdInTimeWait(connection_id); |
98 } | 100 } |
99 | 101 |
100 void ProcessPacket(QuicGuid guid, QuicPacketSequenceNumber sequence_number) { | 102 void ProcessPacket(QuicConnectionId connection_id, |
| 103 QuicPacketSequenceNumber sequence_number) { |
101 time_wait_list_manager_.ProcessPacket(server_address_, | 104 time_wait_list_manager_.ProcessPacket(server_address_, |
102 client_address_, | 105 client_address_, |
103 guid, | 106 connection_id, |
104 sequence_number); | 107 sequence_number); |
105 } | 108 } |
106 | 109 |
107 QuicEncryptedPacket* ConstructEncryptedPacket( | 110 QuicEncryptedPacket* ConstructEncryptedPacket( |
108 EncryptionLevel level, | 111 EncryptionLevel level, |
109 QuicGuid guid, | 112 QuicConnectionId connection_id, |
110 QuicPacketSequenceNumber sequence_number) { | 113 QuicPacketSequenceNumber sequence_number) { |
111 QuicPacketHeader header; | 114 QuicPacketHeader header; |
112 header.public_header.guid = guid; | 115 header.public_header.connection_id = connection_id; |
113 header.public_header.guid_length = PACKET_8BYTE_GUID; | 116 header.public_header.connection_id_length = PACKET_8BYTE_CONNECTION_ID; |
114 header.public_header.version_flag = false; | 117 header.public_header.version_flag = false; |
115 header.public_header.reset_flag = false; | 118 header.public_header.reset_flag = false; |
116 header.public_header.sequence_number_length = PACKET_6BYTE_SEQUENCE_NUMBER; | 119 header.public_header.sequence_number_length = PACKET_6BYTE_SEQUENCE_NUMBER; |
117 header.packet_sequence_number = sequence_number; | 120 header.packet_sequence_number = sequence_number; |
118 header.entropy_flag = false; | 121 header.entropy_flag = false; |
119 header.entropy_hash = 0; | 122 header.entropy_hash = 0; |
120 header.fec_flag = false; | 123 header.fec_flag = false; |
121 header.is_in_fec_group = NOT_IN_FEC_GROUP; | 124 header.is_in_fec_group = NOT_IN_FEC_GROUP; |
122 header.fec_group = 0; | 125 header.fec_group = 0; |
123 QuicStreamFrame stream_frame(1, false, 0, MakeIOVector("data")); | 126 QuicStreamFrame stream_frame(1, false, 0, MakeIOVector("data")); |
124 QuicFrame frame(&stream_frame); | 127 QuicFrame frame(&stream_frame); |
125 QuicFrames frames; | 128 QuicFrames frames; |
126 frames.push_back(frame); | 129 frames.push_back(frame); |
127 scoped_ptr<QuicPacket> packet( | 130 scoped_ptr<QuicPacket> packet( |
128 framer_.BuildUnsizedDataPacket(header, frames).packet); | 131 framer_.BuildUnsizedDataPacket(header, frames).packet); |
129 EXPECT_TRUE(packet != NULL); | 132 EXPECT_TRUE(packet != NULL); |
130 QuicEncryptedPacket* encrypted = framer_.EncryptPacket(ENCRYPTION_NONE, | 133 QuicEncryptedPacket* encrypted = framer_.EncryptPacket(ENCRYPTION_NONE, |
131 sequence_number, | 134 sequence_number, |
132 *packet); | 135 *packet); |
133 EXPECT_TRUE(encrypted != NULL); | 136 EXPECT_TRUE(encrypted != NULL); |
134 return encrypted; | 137 return encrypted; |
135 } | 138 } |
136 | 139 |
137 NiceMock<MockFakeTimeEpollServer> epoll_server_; | 140 NiceMock<MockFakeTimeEpollServer> epoll_server_; |
138 StrictMock<MockPacketWriter> writer_; | 141 StrictMock<MockPacketWriter> writer_; |
139 StrictMock<MockQuicServerSessionVisitor> visitor_; | 142 StrictMock<MockQuicServerSessionVisitor> visitor_; |
140 QuicTimeWaitListManager time_wait_list_manager_; | 143 QuicTimeWaitListManager time_wait_list_manager_; |
141 QuicFramer framer_; | 144 QuicFramer framer_; |
142 QuicGuid guid_; | 145 QuicConnectionId connection_id_; |
143 IPEndPoint server_address_; | 146 IPEndPoint server_address_; |
144 IPEndPoint client_address_; | 147 IPEndPoint client_address_; |
145 bool writer_is_blocked_; | 148 bool writer_is_blocked_; |
146 }; | 149 }; |
147 | 150 |
148 class ValidatePublicResetPacketPredicate | 151 class ValidatePublicResetPacketPredicate |
149 : public MatcherInterface<const std::tr1::tuple<const char*, int> > { | 152 : public MatcherInterface<const std::tr1::tuple<const char*, int> > { |
150 public: | 153 public: |
151 explicit ValidatePublicResetPacketPredicate(QuicGuid guid, | 154 explicit ValidatePublicResetPacketPredicate(QuicConnectionId connection_id, |
152 QuicPacketSequenceNumber number) | 155 QuicPacketSequenceNumber number) |
153 : guid_(guid), sequence_number_(number) { | 156 : connection_id_(connection_id), sequence_number_(number) { |
154 } | 157 } |
155 | 158 |
156 virtual bool MatchAndExplain( | 159 virtual bool MatchAndExplain( |
157 const std::tr1::tuple<const char*, int> packet_buffer, | 160 const std::tr1::tuple<const char*, int> packet_buffer, |
158 testing::MatchResultListener* /* listener */) const { | 161 testing::MatchResultListener* /* listener */) const { |
159 FramerVisitorCapturingPublicReset visitor; | 162 FramerVisitorCapturingPublicReset visitor; |
160 QuicFramer framer(QuicSupportedVersions(), | 163 QuicFramer framer(QuicSupportedVersions(), |
161 QuicTime::Zero(), | 164 QuicTime::Zero(), |
162 false); | 165 false); |
163 framer.set_visitor(&visitor); | 166 framer.set_visitor(&visitor); |
164 QuicEncryptedPacket encrypted(std::tr1::get<0>(packet_buffer), | 167 QuicEncryptedPacket encrypted(std::tr1::get<0>(packet_buffer), |
165 std::tr1::get<1>(packet_buffer)); | 168 std::tr1::get<1>(packet_buffer)); |
166 framer.ProcessPacket(encrypted); | 169 framer.ProcessPacket(encrypted); |
167 QuicPublicResetPacket packet = visitor.public_reset_packet(); | 170 QuicPublicResetPacket packet = visitor.public_reset_packet(); |
168 return guid_ == packet.public_header.guid && | 171 return connection_id_ == packet.public_header.connection_id && |
169 packet.public_header.reset_flag && !packet.public_header.version_flag && | 172 packet.public_header.reset_flag && !packet.public_header.version_flag && |
170 sequence_number_ == packet.rejected_sequence_number && | 173 sequence_number_ == packet.rejected_sequence_number && |
171 net::test::TestPeerIPAddress() == packet.client_address.address() && | 174 net::test::TestPeerIPAddress() == packet.client_address.address() && |
172 kTestPort == packet.client_address.port(); | 175 kTestPort == packet.client_address.port(); |
173 } | 176 } |
174 | 177 |
175 virtual void DescribeTo(::std::ostream* os) const { } | 178 virtual void DescribeTo(::std::ostream* os) const { } |
176 | 179 |
177 virtual void DescribeNegationTo(::std::ostream* os) const { } | 180 virtual void DescribeNegationTo(::std::ostream* os) const { } |
178 | 181 |
179 private: | 182 private: |
180 QuicGuid guid_; | 183 QuicConnectionId connection_id_; |
181 QuicPacketSequenceNumber sequence_number_; | 184 QuicPacketSequenceNumber sequence_number_; |
182 }; | 185 }; |
183 | 186 |
184 | 187 |
185 Matcher<const std::tr1::tuple<const char*, int> > PublicResetPacketEq( | 188 Matcher<const std::tr1::tuple<const char*, int> > PublicResetPacketEq( |
186 QuicGuid guid, | 189 QuicConnectionId connection_id, |
187 QuicPacketSequenceNumber sequence_number) { | 190 QuicPacketSequenceNumber sequence_number) { |
188 return MakeMatcher(new ValidatePublicResetPacketPredicate(guid, | 191 return MakeMatcher(new ValidatePublicResetPacketPredicate(connection_id, |
189 sequence_number)); | 192 sequence_number)); |
190 } | 193 } |
191 | 194 |
192 TEST_F(QuicTimeWaitListManagerTest, CheckGuidInTimeWait) { | 195 TEST_F(QuicTimeWaitListManagerTest, CheckConnectionIdInTimeWait) { |
193 EXPECT_FALSE(IsGuidInTimeWait(guid_)); | 196 EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_)); |
194 AddGuid(guid_); | 197 AddConnectionId(connection_id_); |
195 EXPECT_TRUE(IsGuidInTimeWait(guid_)); | 198 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
196 } | 199 } |
197 | 200 |
198 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { | 201 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { |
199 size_t kConnectionCloseLength = 100; | 202 size_t kConnectionCloseLength = 100; |
200 AddGuid(guid_, | 203 AddConnectionId( |
201 net::test::QuicVersionMax(), | 204 connection_id_, |
202 new QuicEncryptedPacket( | 205 net::test::QuicVersionMax(), |
203 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 206 new QuicEncryptedPacket( |
| 207 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
204 const int kRandomSequenceNumber = 1; | 208 const int kRandomSequenceNumber = 1; |
205 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, | 209 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, |
206 server_address_.address(), | 210 server_address_.address(), |
207 client_address_)) | 211 client_address_)) |
208 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 212 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
209 | 213 |
210 ProcessPacket(guid_, kRandomSequenceNumber); | 214 ProcessPacket(connection_id_, kRandomSequenceNumber); |
211 } | 215 } |
212 | 216 |
213 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { | 217 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { |
214 AddGuid(guid_); | 218 AddConnectionId(connection_id_); |
215 const int kRandomSequenceNumber = 1; | 219 const int kRandomSequenceNumber = 1; |
216 EXPECT_CALL(writer_, WritePacket(_, _, | 220 EXPECT_CALL(writer_, WritePacket(_, _, |
217 server_address_.address(), | 221 server_address_.address(), |
218 client_address_)) | 222 client_address_)) |
219 .With(Args<0, 1>(PublicResetPacketEq(guid_, | 223 .With(Args<0, 1>(PublicResetPacketEq(connection_id_, |
220 kRandomSequenceNumber))) | 224 kRandomSequenceNumber))) |
221 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); | 225 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); |
222 | 226 |
223 ProcessPacket(guid_, kRandomSequenceNumber); | 227 ProcessPacket(connection_id_, kRandomSequenceNumber); |
224 } | 228 } |
225 | 229 |
226 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { | 230 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { |
227 AddGuid(guid_); | 231 AddConnectionId(connection_id_); |
228 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) { | 232 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) { |
229 if ((sequence_number & (sequence_number - 1)) == 0) { | 233 if ((sequence_number & (sequence_number - 1)) == 0) { |
230 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) | 234 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) |
231 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 235 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
232 } | 236 } |
233 ProcessPacket(guid_, sequence_number); | 237 ProcessPacket(connection_id_, sequence_number); |
234 // Send public reset with exponential back off. | 238 // Send public reset with exponential back off. |
235 if ((sequence_number & (sequence_number - 1)) == 0) { | 239 if ((sequence_number & (sequence_number - 1)) == 0) { |
236 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 240 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
237 &time_wait_list_manager_, sequence_number)); | 241 &time_wait_list_manager_, sequence_number)); |
238 } else { | 242 } else { |
239 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 243 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
240 &time_wait_list_manager_, sequence_number)); | 244 &time_wait_list_manager_, sequence_number)); |
241 } | 245 } |
242 } | 246 } |
243 } | 247 } |
244 | 248 |
245 TEST_F(QuicTimeWaitListManagerTest, CleanUpOldGuids) { | 249 TEST_F(QuicTimeWaitListManagerTest, CleanUpOldConnectionIds) { |
246 const int kGuidCount = 100; | 250 const int kConnectionIdCount = 100; |
247 const int kOldGuidCount = 31; | 251 const int kOldConnectionIdCount = 31; |
248 | 252 |
249 // Add guids such that their expiry time is kTimeWaitPeriod_. | 253 // Add connection_ids such that their expiry time is kTimeWaitPeriod_. |
250 epoll_server_.set_now_in_usec(0); | 254 epoll_server_.set_now_in_usec(0); |
251 for (int guid = 1; guid <= kOldGuidCount; ++guid) { | 255 for (int connection_id = 1; |
252 AddGuid(guid); | 256 connection_id <= kOldConnectionIdCount; |
| 257 ++connection_id) { |
| 258 AddConnectionId(connection_id); |
253 } | 259 } |
254 | 260 |
255 // Add remaining guids such that their add time is 2 * kTimeWaitPeriod. | 261 // Add remaining connection_ids such that their add time is |
| 262 // 2 * kTimeWaitPeriod. |
256 const QuicTime::Delta time_wait_period = | 263 const QuicTime::Delta time_wait_period = |
257 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); | 264 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); |
258 epoll_server_.set_now_in_usec(time_wait_period.ToMicroseconds()); | 265 epoll_server_.set_now_in_usec(time_wait_period.ToMicroseconds()); |
259 for (int guid = kOldGuidCount + 1; guid <= kGuidCount; ++guid) { | 266 for (int connection_id = kOldConnectionIdCount + 1; |
260 AddGuid(guid); | 267 connection_id <= kConnectionIdCount; |
| 268 ++connection_id) { |
| 269 AddConnectionId(connection_id); |
261 } | 270 } |
262 | 271 |
263 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); | 272 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); |
264 // Now set the current time as time_wait_period + offset usecs. | 273 // Now set the current time as time_wait_period + offset usecs. |
265 epoll_server_.set_now_in_usec(time_wait_period.Add(offset).ToMicroseconds()); | 274 epoll_server_.set_now_in_usec(time_wait_period.Add(offset).ToMicroseconds()); |
266 // After all the old guids are cleaned up, check the next alarm interval. | 275 // After all the old connection_ids are cleaned up, check the next alarm |
| 276 // interval. |
267 int64 next_alarm_time = epoll_server_.ApproximateNowInUsec() + | 277 int64 next_alarm_time = epoll_server_.ApproximateNowInUsec() + |
268 time_wait_period.Subtract(offset).ToMicroseconds(); | 278 time_wait_period.Subtract(offset).ToMicroseconds(); |
269 EXPECT_CALL(epoll_server_, RegisterAlarm(next_alarm_time, _)); | 279 EXPECT_CALL(epoll_server_, RegisterAlarm(next_alarm_time, _)); |
270 | 280 |
271 time_wait_list_manager_.CleanUpOldGuids(); | 281 time_wait_list_manager_.CleanUpOldConnectionIds(); |
272 for (int guid = 1; guid <= kGuidCount; ++guid) { | 282 for (int connection_id = 1; |
273 EXPECT_EQ(guid > kOldGuidCount, IsGuidInTimeWait(guid)) | 283 connection_id <= kConnectionIdCount; |
274 << "kOldGuidCount: " << kOldGuidCount | 284 ++connection_id) { |
275 << " guid: " << guid; | 285 EXPECT_EQ(connection_id > kOldConnectionIdCount, |
| 286 IsConnectionIdInTimeWait(connection_id)) |
| 287 << "kOldConnectionIdCount: " << kOldConnectionIdCount |
| 288 << " connection_id: " << connection_id; |
276 } | 289 } |
277 } | 290 } |
278 | 291 |
279 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { | 292 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { |
280 QuicGuid guid = 1; | 293 QuicConnectionId connection_id = 1; |
281 AddGuid(guid); | 294 AddConnectionId(connection_id); |
282 QuicPacketSequenceNumber sequence_number = 234; | 295 QuicPacketSequenceNumber sequence_number = 234; |
283 scoped_ptr<QuicEncryptedPacket> packet( | 296 scoped_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket( |
284 ConstructEncryptedPacket(ENCRYPTION_NONE, guid, sequence_number)); | 297 ENCRYPTION_NONE, connection_id, sequence_number)); |
285 // Let first write through. | 298 // Let first write through. |
286 EXPECT_CALL(writer_, WritePacket(_, _, | 299 EXPECT_CALL(writer_, WritePacket(_, _, |
287 server_address_.address(), | 300 server_address_.address(), |
288 client_address_)) | 301 client_address_)) |
289 .With(Args<0, 1>(PublicResetPacketEq(guid, | 302 .With(Args<0, 1>(PublicResetPacketEq(connection_id, |
290 sequence_number))) | 303 sequence_number))) |
291 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 304 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
292 ProcessPacket(guid, sequence_number); | 305 ProcessPacket(connection_id, sequence_number); |
293 | 306 |
294 // write block for the next packet. | 307 // write block for the next packet. |
295 EXPECT_CALL(writer_, WritePacket(_, _, | 308 EXPECT_CALL(writer_, WritePacket(_, _, |
296 server_address_.address(), | 309 server_address_.address(), |
297 client_address_)) | 310 client_address_)) |
298 .With(Args<0, 1>(PublicResetPacketEq(guid, | 311 .With(Args<0, 1>(PublicResetPacketEq(connection_id, |
299 sequence_number))) | 312 sequence_number))) |
300 .WillOnce(DoAll( | 313 .WillOnce(DoAll( |
301 Assign(&writer_is_blocked_, true), | 314 Assign(&writer_is_blocked_, true), |
302 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); | 315 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); |
303 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 316 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
304 ProcessPacket(guid, sequence_number); | 317 ProcessPacket(connection_id, sequence_number); |
305 // 3rd packet. No public reset should be sent; | 318 // 3rd packet. No public reset should be sent; |
306 ProcessPacket(guid, sequence_number); | 319 ProcessPacket(connection_id, sequence_number); |
307 | 320 |
308 // write packet should not be called since we are write blocked but the | 321 // write packet should not be called since we are write blocked but the |
309 // should be queued. | 322 // should be queued. |
310 QuicGuid other_guid = 2; | 323 QuicConnectionId other_connection_id = 2; |
311 AddGuid(other_guid); | 324 AddConnectionId(other_connection_id); |
312 QuicPacketSequenceNumber other_sequence_number = 23423; | 325 QuicPacketSequenceNumber other_sequence_number = 23423; |
313 scoped_ptr<QuicEncryptedPacket> other_packet( | 326 scoped_ptr<QuicEncryptedPacket> other_packet( |
314 ConstructEncryptedPacket( | 327 ConstructEncryptedPacket( |
315 ENCRYPTION_NONE, other_guid, other_sequence_number)); | 328 ENCRYPTION_NONE, other_connection_id, other_sequence_number)); |
316 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) | 329 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) |
317 .Times(0); | 330 .Times(0); |
318 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 331 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
319 ProcessPacket(other_guid, other_sequence_number); | 332 ProcessPacket(other_connection_id, other_sequence_number); |
320 | 333 |
321 // Now expect all the write blocked public reset packets to be sent again. | 334 // Now expect all the write blocked public reset packets to be sent again. |
322 writer_is_blocked_ = false; | 335 writer_is_blocked_ = false; |
323 EXPECT_CALL(writer_, WritePacket(_, _, | 336 EXPECT_CALL(writer_, WritePacket(_, _, |
324 server_address_.address(), | 337 server_address_.address(), |
325 client_address_)) | 338 client_address_)) |
326 .With(Args<0, 1>(PublicResetPacketEq(guid, | 339 .With(Args<0, 1>(PublicResetPacketEq(connection_id, |
327 sequence_number))) | 340 sequence_number))) |
328 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 341 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
329 EXPECT_CALL(writer_, WritePacket(_, _, | 342 EXPECT_CALL(writer_, WritePacket(_, _, |
330 server_address_.address(), | 343 server_address_.address(), |
331 client_address_)) | 344 client_address_)) |
332 .With(Args<0, 1>(PublicResetPacketEq(other_guid, | 345 .With(Args<0, 1>(PublicResetPacketEq(other_connection_id, |
333 other_sequence_number))) | 346 other_sequence_number))) |
334 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, | 347 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, |
335 other_packet->length()))); | 348 other_packet->length()))); |
336 time_wait_list_manager_.OnCanWrite(); | 349 time_wait_list_manager_.OnCanWrite(); |
337 } | 350 } |
338 | 351 |
339 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { | 352 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { |
340 const int kGuid1 = 123; | 353 const int kConnectionId1 = 123; |
341 const int kGuid2 = 456; | 354 const int kConnectionId2 = 456; |
342 const int kGuid3 = 789; | 355 const int kConnectionId3 = 789; |
343 | 356 |
344 AddGuid(kGuid1, net::test::QuicVersionMin(), NULL); | 357 AddConnectionId(kConnectionId1, net::test::QuicVersionMin(), NULL); |
345 AddGuid(kGuid2, net::test::QuicVersionMax(), NULL); | 358 AddConnectionId(kConnectionId2, net::test::QuicVersionMax(), NULL); |
346 AddGuid(kGuid3, net::test::QuicVersionMax(), NULL); | 359 AddConnectionId(kConnectionId3, net::test::QuicVersionMax(), NULL); |
347 | 360 |
348 EXPECT_EQ(net::test::QuicVersionMin(), | 361 EXPECT_EQ(net::test::QuicVersionMin(), |
349 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid( | 362 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( |
350 &time_wait_list_manager_, kGuid1)); | 363 &time_wait_list_manager_, kConnectionId1)); |
351 EXPECT_EQ(net::test::QuicVersionMax(), | 364 EXPECT_EQ(net::test::QuicVersionMax(), |
352 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid( | 365 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( |
353 &time_wait_list_manager_, kGuid2)); | 366 &time_wait_list_manager_, kConnectionId2)); |
354 EXPECT_EQ(net::test::QuicVersionMax(), | 367 EXPECT_EQ(net::test::QuicVersionMax(), |
355 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid( | 368 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( |
356 &time_wait_list_manager_, kGuid3)); | 369 &time_wait_list_manager_, kConnectionId3)); |
357 } | 370 } |
358 | 371 |
359 TEST_F(QuicTimeWaitListManagerTest, AddGuidTwice) { | 372 TEST_F(QuicTimeWaitListManagerTest, AddConnectionIdTwice) { |
360 // Add guids such that their expiry time is kTimeWaitPeriod_. | 373 // Add connection_ids such that their expiry time is kTimeWaitPeriod_. |
361 epoll_server_.set_now_in_usec(0); | 374 epoll_server_.set_now_in_usec(0); |
362 AddGuid(guid_); | 375 AddConnectionId(connection_id_); |
363 EXPECT_TRUE(IsGuidInTimeWait(guid_)); | 376 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
364 size_t kConnectionCloseLength = 100; | 377 size_t kConnectionCloseLength = 100; |
365 AddGuid(guid_, | 378 AddConnectionId( |
366 net::test::QuicVersionMax(), | 379 connection_id_, |
367 new QuicEncryptedPacket( | 380 net::test::QuicVersionMax(), |
368 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 381 new QuicEncryptedPacket( |
369 EXPECT_TRUE(IsGuidInTimeWait(guid_)); | 382 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
| 383 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
370 | 384 |
371 EXPECT_CALL(writer_, WritePacket(_, | 385 EXPECT_CALL(writer_, WritePacket(_, |
372 kConnectionCloseLength, | 386 kConnectionCloseLength, |
373 server_address_.address(), | 387 server_address_.address(), |
374 client_address_)) | 388 client_address_)) |
375 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 389 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
376 | 390 |
377 const int kRandomSequenceNumber = 1; | 391 const int kRandomSequenceNumber = 1; |
378 ProcessPacket(guid_, kRandomSequenceNumber); | 392 ProcessPacket(connection_id_, kRandomSequenceNumber); |
379 | 393 |
380 const QuicTime::Delta time_wait_period = | 394 const QuicTime::Delta time_wait_period = |
381 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); | 395 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); |
382 | 396 |
383 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); | 397 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); |
384 // Now set the current time as time_wait_period + offset usecs. | 398 // Now set the current time as time_wait_period + offset usecs. |
385 epoll_server_.set_now_in_usec(time_wait_period.Add(offset).ToMicroseconds()); | 399 epoll_server_.set_now_in_usec(time_wait_period.Add(offset).ToMicroseconds()); |
386 // After the guids are cleaned up, check the next alarm interval. | 400 // After the connection_ids are cleaned up, check the next alarm interval. |
387 int64 next_alarm_time = epoll_server_.ApproximateNowInUsec() + | 401 int64 next_alarm_time = epoll_server_.ApproximateNowInUsec() + |
388 time_wait_period.ToMicroseconds(); | 402 time_wait_period.ToMicroseconds(); |
389 | 403 |
390 EXPECT_CALL(epoll_server_, RegisterAlarm(next_alarm_time, _)); | 404 EXPECT_CALL(epoll_server_, RegisterAlarm(next_alarm_time, _)); |
391 time_wait_list_manager_.CleanUpOldGuids(); | 405 time_wait_list_manager_.CleanUpOldConnectionIds(); |
392 EXPECT_FALSE(IsGuidInTimeWait(guid_)); | 406 EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_)); |
393 } | 407 } |
394 | 408 |
395 TEST_F(QuicTimeWaitListManagerTest, GuidsOrderedByTime) { | 409 TEST_F(QuicTimeWaitListManagerTest, ConnectionIdsOrderedByTime) { |
396 // Simple randomization: the values of guids are swapped based on the current | 410 // Simple randomization: the values of connection_ids are swapped based on the |
397 // seconds on the clock. If the container is broken, the test will be 50% | 411 // current seconds on the clock. If the container is broken, the test will be |
398 // flaky. | 412 // 50% flaky. |
399 int odd_second = static_cast<int>(epoll_server_.ApproximateNowInUsec()) % 2; | 413 int odd_second = static_cast<int>(epoll_server_.ApproximateNowInUsec()) % 2; |
400 EXPECT_TRUE(odd_second == 0 || odd_second == 1); | 414 EXPECT_TRUE(odd_second == 0 || odd_second == 1); |
401 const QuicGuid kGuid1 = odd_second; | 415 const QuicConnectionId kConnectionId1 = odd_second; |
402 const QuicGuid kGuid2 = 1 - odd_second; | 416 const QuicConnectionId kConnectionId2 = 1 - odd_second; |
403 | 417 |
404 // 1 will hash lower than 2, but we add it later. They should come out in the | 418 // 1 will hash lower than 2, but we add it later. They should come out in the |
405 // add order, not hash order. | 419 // add order, not hash order. |
406 epoll_server_.set_now_in_usec(0); | 420 epoll_server_.set_now_in_usec(0); |
407 AddGuid(kGuid1); | 421 AddConnectionId(kConnectionId1); |
408 epoll_server_.set_now_in_usec(10); | 422 epoll_server_.set_now_in_usec(10); |
409 AddGuid(kGuid2); | 423 AddConnectionId(kConnectionId2); |
410 | 424 |
411 const QuicTime::Delta time_wait_period = | 425 const QuicTime::Delta time_wait_period = |
412 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); | 426 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); |
413 epoll_server_.set_now_in_usec(time_wait_period.ToMicroseconds() + 1); | 427 epoll_server_.set_now_in_usec(time_wait_period.ToMicroseconds() + 1); |
414 | 428 |
415 EXPECT_CALL(epoll_server_, RegisterAlarm(_, _)); | 429 EXPECT_CALL(epoll_server_, RegisterAlarm(_, _)); |
416 | 430 |
417 time_wait_list_manager_.CleanUpOldGuids(); | 431 time_wait_list_manager_.CleanUpOldConnectionIds(); |
418 EXPECT_FALSE(IsGuidInTimeWait(kGuid1)); | 432 EXPECT_FALSE(IsConnectionIdInTimeWait(kConnectionId1)); |
419 EXPECT_TRUE(IsGuidInTimeWait(kGuid2)); | 433 EXPECT_TRUE(IsConnectionIdInTimeWait(kConnectionId2)); |
420 } | 434 } |
421 } // namespace | 435 } // namespace |
422 } // namespace test | 436 } // namespace test |
423 } // namespace tools | 437 } // namespace tools |
424 } // namespace net | 438 } // namespace net |
OLD | NEW |