| 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 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { | 224 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { |
| 225 size_t kConnectionCloseLength = 100; | 225 size_t kConnectionCloseLength = 100; |
| 226 AddConnectionId( | 226 AddConnectionId( |
| 227 connection_id_, | 227 connection_id_, |
| 228 QuicVersionMax(), | 228 QuicVersionMax(), |
| 229 new QuicEncryptedPacket( | 229 new QuicEncryptedPacket( |
| 230 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 230 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
| 231 const int kRandomSequenceNumber = 1; | 231 const int kRandomSequenceNumber = 1; |
| 232 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, | 232 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, |
| 233 server_address_.address(), | 233 server_address_.address(), |
| 234 client_address_)) | 234 client_address_, |
| 235 _)) |
| 235 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 236 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
| 236 | 237 |
| 237 ProcessPacket(connection_id_, kRandomSequenceNumber); | 238 ProcessPacket(connection_id_, kRandomSequenceNumber); |
| 238 } | 239 } |
| 239 | 240 |
| 240 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { | 241 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { |
| 241 AddConnectionId(connection_id_); | 242 AddConnectionId(connection_id_); |
| 242 const int kRandomSequenceNumber = 1; | 243 const int kRandomSequenceNumber = 1; |
| 243 EXPECT_CALL(writer_, WritePacket(_, _, | 244 EXPECT_CALL(writer_, WritePacket(_, _, |
| 244 server_address_.address(), | 245 server_address_.address(), |
| 245 client_address_)) | 246 client_address_, |
| 247 _)) |
| 246 .With(Args<0, 1>(PublicResetPacketEq(connection_id_, | 248 .With(Args<0, 1>(PublicResetPacketEq(connection_id_, |
| 247 kRandomSequenceNumber))) | 249 kRandomSequenceNumber))) |
| 248 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); | 250 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); |
| 249 | 251 |
| 250 ProcessPacket(connection_id_, kRandomSequenceNumber); | 252 ProcessPacket(connection_id_, kRandomSequenceNumber); |
| 251 } | 253 } |
| 252 | 254 |
| 253 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { | 255 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { |
| 254 AddConnectionId(connection_id_); | 256 AddConnectionId(connection_id_); |
| 255 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) { | 257 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) { |
| 256 if ((sequence_number & (sequence_number - 1)) == 0) { | 258 if ((sequence_number & (sequence_number - 1)) == 0) { |
| 257 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) | 259 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)) |
| 258 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 260 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
| 259 } | 261 } |
| 260 ProcessPacket(connection_id_, sequence_number); | 262 ProcessPacket(connection_id_, sequence_number); |
| 261 // Send public reset with exponential back off. | 263 // Send public reset with exponential back off. |
| 262 if ((sequence_number & (sequence_number - 1)) == 0) { | 264 if ((sequence_number & (sequence_number - 1)) == 0) { |
| 263 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 265 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
| 264 &time_wait_list_manager_, sequence_number)); | 266 &time_wait_list_manager_, sequence_number)); |
| 265 } else { | 267 } else { |
| 266 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 268 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
| 267 &time_wait_list_manager_, sequence_number)); | 269 &time_wait_list_manager_, sequence_number)); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 | 316 |
| 315 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { | 317 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { |
| 316 QuicConnectionId connection_id = 1; | 318 QuicConnectionId connection_id = 1; |
| 317 AddConnectionId(connection_id); | 319 AddConnectionId(connection_id); |
| 318 QuicPacketSequenceNumber sequence_number = 234; | 320 QuicPacketSequenceNumber sequence_number = 234; |
| 319 scoped_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket( | 321 scoped_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket( |
| 320 ENCRYPTION_NONE, connection_id, sequence_number)); | 322 ENCRYPTION_NONE, connection_id, sequence_number)); |
| 321 // Let first write through. | 323 // Let first write through. |
| 322 EXPECT_CALL(writer_, WritePacket(_, _, | 324 EXPECT_CALL(writer_, WritePacket(_, _, |
| 323 server_address_.address(), | 325 server_address_.address(), |
| 324 client_address_)) | 326 client_address_, |
| 327 _)) |
| 325 .With(Args<0, 1>(PublicResetPacketEq(connection_id, | 328 .With(Args<0, 1>(PublicResetPacketEq(connection_id, |
| 326 sequence_number))) | 329 sequence_number))) |
| 327 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 330 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
| 328 ProcessPacket(connection_id, sequence_number); | 331 ProcessPacket(connection_id, sequence_number); |
| 329 | 332 |
| 330 // write block for the next packet. | 333 // write block for the next packet. |
| 331 EXPECT_CALL(writer_, WritePacket(_, _, | 334 EXPECT_CALL(writer_, WritePacket(_, _, |
| 332 server_address_.address(), | 335 server_address_.address(), |
| 333 client_address_)) | 336 client_address_, |
| 337 _)) |
| 334 .With(Args<0, 1>(PublicResetPacketEq(connection_id, | 338 .With(Args<0, 1>(PublicResetPacketEq(connection_id, |
| 335 sequence_number))) | 339 sequence_number))) |
| 336 .WillOnce(DoAll( | 340 .WillOnce(DoAll( |
| 337 Assign(&writer_is_blocked_, true), | 341 Assign(&writer_is_blocked_, true), |
| 338 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); | 342 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); |
| 339 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 343 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
| 340 ProcessPacket(connection_id, sequence_number); | 344 ProcessPacket(connection_id, sequence_number); |
| 341 // 3rd packet. No public reset should be sent; | 345 // 3rd packet. No public reset should be sent; |
| 342 ProcessPacket(connection_id, sequence_number); | 346 ProcessPacket(connection_id, sequence_number); |
| 343 | 347 |
| 344 // write packet should not be called since we are write blocked but the | 348 // write packet should not be called since we are write blocked but the |
| 345 // should be queued. | 349 // should be queued. |
| 346 QuicConnectionId other_connection_id = 2; | 350 QuicConnectionId other_connection_id = 2; |
| 347 AddConnectionId(other_connection_id); | 351 AddConnectionId(other_connection_id); |
| 348 QuicPacketSequenceNumber other_sequence_number = 23423; | 352 QuicPacketSequenceNumber other_sequence_number = 23423; |
| 349 scoped_ptr<QuicEncryptedPacket> other_packet( | 353 scoped_ptr<QuicEncryptedPacket> other_packet( |
| 350 ConstructEncryptedPacket( | 354 ConstructEncryptedPacket( |
| 351 ENCRYPTION_NONE, other_connection_id, other_sequence_number)); | 355 ENCRYPTION_NONE, other_connection_id, other_sequence_number)); |
| 352 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) | 356 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)) |
| 353 .Times(0); | 357 .Times(0); |
| 354 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 358 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
| 355 ProcessPacket(other_connection_id, other_sequence_number); | 359 ProcessPacket(other_connection_id, other_sequence_number); |
| 356 | 360 |
| 357 // Now expect all the write blocked public reset packets to be sent again. | 361 // Now expect all the write blocked public reset packets to be sent again. |
| 358 writer_is_blocked_ = false; | 362 writer_is_blocked_ = false; |
| 359 EXPECT_CALL(writer_, WritePacket(_, _, | 363 EXPECT_CALL(writer_, WritePacket(_, _, |
| 360 server_address_.address(), | 364 server_address_.address(), |
| 361 client_address_)) | 365 client_address_, |
| 366 _)) |
| 362 .With(Args<0, 1>(PublicResetPacketEq(connection_id, | 367 .With(Args<0, 1>(PublicResetPacketEq(connection_id, |
| 363 sequence_number))) | 368 sequence_number))) |
| 364 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 369 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
| 365 EXPECT_CALL(writer_, WritePacket(_, _, | 370 EXPECT_CALL(writer_, WritePacket(_, _, |
| 366 server_address_.address(), | 371 server_address_.address(), |
| 367 client_address_)) | 372 client_address_, |
| 373 _)) |
| 368 .With(Args<0, 1>(PublicResetPacketEq(other_connection_id, | 374 .With(Args<0, 1>(PublicResetPacketEq(other_connection_id, |
| 369 other_sequence_number))) | 375 other_sequence_number))) |
| 370 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, | 376 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, |
| 371 other_packet->length()))); | 377 other_packet->length()))); |
| 372 time_wait_list_manager_.OnCanWrite(); | 378 time_wait_list_manager_.OnCanWrite(); |
| 373 } | 379 } |
| 374 | 380 |
| 375 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { | 381 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { |
| 376 const int kConnectionId1 = 123; | 382 const int kConnectionId1 = 123; |
| 377 const int kConnectionId2 = 456; | 383 const int kConnectionId2 = 456; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 401 AddConnectionId( | 407 AddConnectionId( |
| 402 connection_id_, | 408 connection_id_, |
| 403 QuicVersionMax(), | 409 QuicVersionMax(), |
| 404 new QuicEncryptedPacket( | 410 new QuicEncryptedPacket( |
| 405 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 411 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
| 406 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); | 412 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
| 407 | 413 |
| 408 EXPECT_CALL(writer_, WritePacket(_, | 414 EXPECT_CALL(writer_, WritePacket(_, |
| 409 kConnectionCloseLength, | 415 kConnectionCloseLength, |
| 410 server_address_.address(), | 416 server_address_.address(), |
| 411 client_address_)) | 417 client_address_, |
| 418 _)) |
| 412 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 419 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
| 413 | 420 |
| 414 const int kRandomSequenceNumber = 1; | 421 const int kRandomSequenceNumber = 1; |
| 415 ProcessPacket(connection_id_, kRandomSequenceNumber); | 422 ProcessPacket(connection_id_, kRandomSequenceNumber); |
| 416 | 423 |
| 417 const QuicTime::Delta time_wait_period = | 424 const QuicTime::Delta time_wait_period = |
| 418 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); | 425 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); |
| 419 | 426 |
| 420 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); | 427 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); |
| 421 // Now set the current time as time_wait_period + offset usecs. | 428 // Now set the current time as time_wait_period + offset usecs. |
| (...skipping 30 matching lines...) Expand all Loading... |
| 452 EXPECT_CALL(epoll_server_, RegisterAlarm(_, _)); | 459 EXPECT_CALL(epoll_server_, RegisterAlarm(_, _)); |
| 453 | 460 |
| 454 time_wait_list_manager_.CleanUpOldConnectionIds(); | 461 time_wait_list_manager_.CleanUpOldConnectionIds(); |
| 455 EXPECT_FALSE(IsConnectionIdInTimeWait(kConnectionId1)); | 462 EXPECT_FALSE(IsConnectionIdInTimeWait(kConnectionId1)); |
| 456 EXPECT_TRUE(IsConnectionIdInTimeWait(kConnectionId2)); | 463 EXPECT_TRUE(IsConnectionIdInTimeWait(kConnectionId2)); |
| 457 } | 464 } |
| 458 } // namespace | 465 } // namespace |
| 459 } // namespace test | 466 } // namespace test |
| 460 } // namespace tools | 467 } // namespace tools |
| 461 } // namespace net | 468 } // namespace net |
| OLD | NEW |