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 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 | 193 |
194 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { | 194 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { |
195 size_t kConnectionCloseLength = 100; | 195 size_t kConnectionCloseLength = 100; |
196 AddGuid(guid_, | 196 AddGuid(guid_, |
197 net::test::QuicVersionMax(), | 197 net::test::QuicVersionMax(), |
198 new QuicEncryptedPacket( | 198 new QuicEncryptedPacket( |
199 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 199 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
200 const int kRandomSequenceNumber = 1; | 200 const int kRandomSequenceNumber = 1; |
201 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, | 201 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, |
202 server_address_.address(), | 202 server_address_.address(), |
203 client_address_, | 203 client_address_)) |
204 &time_wait_list_manager_)) | |
205 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 204 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
206 | 205 |
207 ProcessPacket(guid_, kRandomSequenceNumber); | 206 ProcessPacket(guid_, kRandomSequenceNumber); |
208 } | 207 } |
209 | 208 |
210 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { | 209 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { |
211 AddGuid(guid_); | 210 AddGuid(guid_); |
212 const int kRandomSequenceNumber = 1; | 211 const int kRandomSequenceNumber = 1; |
213 EXPECT_CALL(writer_, WritePacket(_, _, | 212 EXPECT_CALL(writer_, WritePacket(_, _, |
214 server_address_.address(), | 213 server_address_.address(), |
215 client_address_, | 214 client_address_)) |
216 &time_wait_list_manager_)) | |
217 .With(Args<0, 1>(PublicResetPacketEq(guid_, | 215 .With(Args<0, 1>(PublicResetPacketEq(guid_, |
218 kRandomSequenceNumber))) | 216 kRandomSequenceNumber))) |
219 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); | 217 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); |
220 | 218 |
221 ProcessPacket(guid_, kRandomSequenceNumber); | 219 ProcessPacket(guid_, kRandomSequenceNumber); |
222 } | 220 } |
223 | 221 |
224 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { | 222 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { |
225 AddGuid(guid_); | 223 AddGuid(guid_); |
226 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) { | 224 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) { |
227 if ((sequence_number & (sequence_number - 1)) == 0) { | 225 if ((sequence_number & (sequence_number - 1)) == 0) { |
228 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)) | 226 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) |
229 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 227 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
230 } | 228 } |
231 ProcessPacket(guid_, sequence_number); | 229 ProcessPacket(guid_, sequence_number); |
232 // Send public reset with exponential back off. | 230 // Send public reset with exponential back off. |
233 if ((sequence_number & (sequence_number - 1)) == 0) { | 231 if ((sequence_number & (sequence_number - 1)) == 0) { |
234 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 232 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
235 &time_wait_list_manager_, sequence_number)); | 233 &time_wait_list_manager_, sequence_number)); |
236 } else { | 234 } else { |
237 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 235 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
238 &time_wait_list_manager_, sequence_number)); | 236 &time_wait_list_manager_, sequence_number)); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 | 274 |
277 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { | 275 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { |
278 QuicGuid guid = 1; | 276 QuicGuid guid = 1; |
279 AddGuid(guid); | 277 AddGuid(guid); |
280 QuicPacketSequenceNumber sequence_number = 234; | 278 QuicPacketSequenceNumber sequence_number = 234; |
281 scoped_ptr<QuicEncryptedPacket> packet( | 279 scoped_ptr<QuicEncryptedPacket> packet( |
282 ConstructEncryptedPacket(ENCRYPTION_NONE, guid, sequence_number)); | 280 ConstructEncryptedPacket(ENCRYPTION_NONE, guid, sequence_number)); |
283 // Let first write through. | 281 // Let first write through. |
284 EXPECT_CALL(writer_, WritePacket(_, _, | 282 EXPECT_CALL(writer_, WritePacket(_, _, |
285 server_address_.address(), | 283 server_address_.address(), |
286 client_address_, | 284 client_address_)) |
287 &time_wait_list_manager_)) | |
288 .With(Args<0, 1>(PublicResetPacketEq(guid, | 285 .With(Args<0, 1>(PublicResetPacketEq(guid, |
289 sequence_number))) | 286 sequence_number))) |
290 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 287 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
291 ProcessPacket(guid, sequence_number); | 288 ProcessPacket(guid, sequence_number); |
292 | 289 |
293 // write block for the next packet. | 290 // write block for the next packet. |
294 EXPECT_CALL(writer_, WritePacket(_, _, | 291 EXPECT_CALL(writer_, WritePacket(_, _, |
295 server_address_.address(), | 292 server_address_.address(), |
296 client_address_, | 293 client_address_)) |
297 &time_wait_list_manager_)) | |
298 .With(Args<0, 1>(PublicResetPacketEq(guid, | 294 .With(Args<0, 1>(PublicResetPacketEq(guid, |
299 sequence_number))) | 295 sequence_number))) |
300 .WillOnce(DoAll( | 296 .WillOnce(DoAll( |
301 Assign(&writer_is_blocked_, true), | 297 Assign(&writer_is_blocked_, true), |
302 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); | 298 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); |
303 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 299 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
304 ProcessPacket(guid, sequence_number); | 300 ProcessPacket(guid, sequence_number); |
305 // 3rd packet. No public reset should be sent; | 301 // 3rd packet. No public reset should be sent; |
306 ProcessPacket(guid, sequence_number); | 302 ProcessPacket(guid, sequence_number); |
307 | 303 |
308 // write packet should not be called since we are write blocked but the | 304 // write packet should not be called since we are write blocked but the |
309 // should be queued. | 305 // should be queued. |
310 QuicGuid other_guid = 2; | 306 QuicGuid other_guid = 2; |
311 AddGuid(other_guid); | 307 AddGuid(other_guid); |
312 QuicPacketSequenceNumber other_sequence_number = 23423; | 308 QuicPacketSequenceNumber other_sequence_number = 23423; |
313 scoped_ptr<QuicEncryptedPacket> other_packet( | 309 scoped_ptr<QuicEncryptedPacket> other_packet( |
314 ConstructEncryptedPacket( | 310 ConstructEncryptedPacket( |
315 ENCRYPTION_NONE, other_guid, other_sequence_number)); | 311 ENCRYPTION_NONE, other_guid, other_sequence_number)); |
316 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)) | 312 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) |
317 .Times(0); | 313 .Times(0); |
318 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 314 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
319 ProcessPacket(other_guid, other_sequence_number); | 315 ProcessPacket(other_guid, other_sequence_number); |
320 | 316 |
321 // Now expect all the write blocked public reset packets to be sent again. | 317 // Now expect all the write blocked public reset packets to be sent again. |
322 writer_is_blocked_ = false; | 318 writer_is_blocked_ = false; |
323 EXPECT_CALL(writer_, WritePacket(_, _, | 319 EXPECT_CALL(writer_, WritePacket(_, _, |
324 server_address_.address(), | 320 server_address_.address(), |
325 client_address_, | 321 client_address_)) |
326 &time_wait_list_manager_)) | |
327 .With(Args<0, 1>(PublicResetPacketEq(guid, | 322 .With(Args<0, 1>(PublicResetPacketEq(guid, |
328 sequence_number))) | 323 sequence_number))) |
329 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 324 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
330 EXPECT_CALL(writer_, WritePacket(_, _, | 325 EXPECT_CALL(writer_, WritePacket(_, _, |
331 server_address_.address(), | 326 server_address_.address(), |
332 client_address_, | 327 client_address_)) |
333 &time_wait_list_manager_)) | |
334 .With(Args<0, 1>(PublicResetPacketEq(other_guid, | 328 .With(Args<0, 1>(PublicResetPacketEq(other_guid, |
335 other_sequence_number))) | 329 other_sequence_number))) |
336 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, | 330 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, |
337 other_packet->length()))); | 331 other_packet->length()))); |
338 time_wait_list_manager_.OnCanWrite(); | 332 time_wait_list_manager_.OnCanWrite(); |
339 } | 333 } |
340 | 334 |
341 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { | 335 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { |
342 const int kGuid1 = 123; | 336 const int kGuid1 = 123; |
343 const int kGuid2 = 456; | 337 const int kGuid2 = 456; |
(...skipping 22 matching lines...) Expand all Loading... |
366 size_t kConnectionCloseLength = 100; | 360 size_t kConnectionCloseLength = 100; |
367 AddGuid(guid_, | 361 AddGuid(guid_, |
368 net::test::QuicVersionMax(), | 362 net::test::QuicVersionMax(), |
369 new QuicEncryptedPacket( | 363 new QuicEncryptedPacket( |
370 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 364 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
371 EXPECT_TRUE(IsGuidInTimeWait(guid_)); | 365 EXPECT_TRUE(IsGuidInTimeWait(guid_)); |
372 | 366 |
373 EXPECT_CALL(writer_, WritePacket(_, | 367 EXPECT_CALL(writer_, WritePacket(_, |
374 kConnectionCloseLength, | 368 kConnectionCloseLength, |
375 server_address_.address(), | 369 server_address_.address(), |
376 client_address_, | 370 client_address_)) |
377 &time_wait_list_manager_)) | |
378 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 371 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
379 | 372 |
380 const int kRandomSequenceNumber = 1; | 373 const int kRandomSequenceNumber = 1; |
381 ProcessPacket(guid_, kRandomSequenceNumber); | 374 ProcessPacket(guid_, kRandomSequenceNumber); |
382 | 375 |
383 const QuicTime::Delta time_wait_period = | 376 const QuicTime::Delta time_wait_period = |
384 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); | 377 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); |
385 | 378 |
386 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); | 379 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); |
387 // Now set the current time as time_wait_period + offset usecs. | 380 // Now set the current time as time_wait_period + offset usecs. |
(...skipping 30 matching lines...) Expand all Loading... |
418 EXPECT_CALL(epoll_server_, RegisterAlarm(_, _)); | 411 EXPECT_CALL(epoll_server_, RegisterAlarm(_, _)); |
419 | 412 |
420 time_wait_list_manager_.CleanUpOldGuids(); | 413 time_wait_list_manager_.CleanUpOldGuids(); |
421 EXPECT_FALSE(IsGuidInTimeWait(kGuid1)); | 414 EXPECT_FALSE(IsGuidInTimeWait(kGuid1)); |
422 EXPECT_TRUE(IsGuidInTimeWait(kGuid2)); | 415 EXPECT_TRUE(IsGuidInTimeWait(kGuid2)); |
423 } | 416 } |
424 } // namespace | 417 } // namespace |
425 } // namespace test | 418 } // namespace test |
426 } // namespace tools | 419 } // namespace tools |
427 } // namespace net | 420 } // namespace net |
OLD | NEW |