| 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 |