| 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 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 | 209 |
| 210 Matcher<const std::tr1::tuple<const char*, int> > PublicResetPacketEq( | 210 Matcher<const std::tr1::tuple<const char*, int> > PublicResetPacketEq( |
| 211 QuicConnectionId connection_id, | 211 QuicConnectionId connection_id, |
| 212 QuicPacketSequenceNumber sequence_number) { | 212 QuicPacketSequenceNumber sequence_number) { |
| 213 return MakeMatcher(new ValidatePublicResetPacketPredicate(connection_id, | 213 return MakeMatcher(new ValidatePublicResetPacketPredicate(connection_id, |
| 214 sequence_number)); | 214 sequence_number)); |
| 215 } | 215 } |
| 216 | 216 |
| 217 TEST_F(QuicTimeWaitListManagerTest, CheckConnectionIdInTimeWait) { | 217 TEST_F(QuicTimeWaitListManagerTest, CheckConnectionIdInTimeWait) { |
| 218 EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_)); | 218 EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_)); |
| 219 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
| 219 AddConnectionId(connection_id_); | 220 AddConnectionId(connection_id_); |
| 220 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); | 221 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
| 221 } | 222 } |
| 222 | 223 |
| 223 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { | 224 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { |
| 224 size_t kConnectionCloseLength = 100; | 225 size_t kConnectionCloseLength = 100; |
| 226 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
| 225 AddConnectionId( | 227 AddConnectionId( |
| 226 connection_id_, | 228 connection_id_, |
| 227 QuicVersionMax(), | 229 QuicVersionMax(), |
| 228 new QuicEncryptedPacket( | 230 new QuicEncryptedPacket( |
| 229 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 231 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
| 230 const int kRandomSequenceNumber = 1; | 232 const int kRandomSequenceNumber = 1; |
| 231 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, | 233 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, |
| 232 server_address_.address(), | 234 server_address_.address(), |
| 233 client_address_)) | 235 client_address_)) |
| 234 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 236 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
| 235 | 237 |
| 236 ProcessPacket(connection_id_, kRandomSequenceNumber); | 238 ProcessPacket(connection_id_, kRandomSequenceNumber); |
| 237 } | 239 } |
| 238 | 240 |
| 239 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { | 241 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { |
| 242 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
| 240 AddConnectionId(connection_id_); | 243 AddConnectionId(connection_id_); |
| 241 const int kRandomSequenceNumber = 1; | 244 const int kRandomSequenceNumber = 1; |
| 242 EXPECT_CALL(writer_, WritePacket(_, _, | 245 EXPECT_CALL(writer_, WritePacket(_, _, |
| 243 server_address_.address(), | 246 server_address_.address(), |
| 244 client_address_)) | 247 client_address_)) |
| 245 .With(Args<0, 1>(PublicResetPacketEq(connection_id_, | 248 .With(Args<0, 1>(PublicResetPacketEq(connection_id_, |
| 246 kRandomSequenceNumber))) | 249 kRandomSequenceNumber))) |
| 247 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); | 250 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); |
| 248 | 251 |
| 249 ProcessPacket(connection_id_, kRandomSequenceNumber); | 252 ProcessPacket(connection_id_, kRandomSequenceNumber); |
| 250 } | 253 } |
| 251 | 254 |
| 252 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { | 255 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { |
| 256 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
| 253 AddConnectionId(connection_id_); | 257 AddConnectionId(connection_id_); |
| 254 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) { | 258 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) { |
| 255 if ((sequence_number & (sequence_number - 1)) == 0) { | 259 if ((sequence_number & (sequence_number - 1)) == 0) { |
| 256 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) | 260 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) |
| 257 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 261 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
| 258 } | 262 } |
| 259 ProcessPacket(connection_id_, sequence_number); | 263 ProcessPacket(connection_id_, sequence_number); |
| 260 // Send public reset with exponential back off. | 264 // Send public reset with exponential back off. |
| 261 if ((sequence_number & (sequence_number - 1)) == 0) { | 265 if ((sequence_number & (sequence_number - 1)) == 0) { |
| 262 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 266 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
| 263 &time_wait_list_manager_, sequence_number)); | 267 &time_wait_list_manager_, sequence_number)); |
| 264 } else { | 268 } else { |
| 265 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 269 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
| 266 &time_wait_list_manager_, sequence_number)); | 270 &time_wait_list_manager_, sequence_number)); |
| 267 } | 271 } |
| 268 } | 272 } |
| 269 } | 273 } |
| 270 | 274 |
| 271 TEST_F(QuicTimeWaitListManagerTest, CleanUpOldConnectionIds) { | 275 TEST_F(QuicTimeWaitListManagerTest, CleanUpOldConnectionIds) { |
| 272 const int kConnectionIdCount = 100; | 276 const int kConnectionIdCount = 100; |
| 273 const int kOldConnectionIdCount = 31; | 277 const int kOldConnectionIdCount = 31; |
| 274 | 278 |
| 275 // Add connection_ids such that their expiry time is kTimeWaitPeriod_. | 279 // Add connection_ids such that their expiry time is kTimeWaitPeriod_. |
| 276 epoll_server_.set_now_in_usec(0); | 280 epoll_server_.set_now_in_usec(0); |
| 277 for (int connection_id = 1; | 281 for (int connection_id = 1; |
| 278 connection_id <= kOldConnectionIdCount; | 282 connection_id <= kOldConnectionIdCount; |
| 279 ++connection_id) { | 283 ++connection_id) { |
| 284 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id)); |
| 280 AddConnectionId(connection_id); | 285 AddConnectionId(connection_id); |
| 281 } | 286 } |
| 282 | 287 |
| 283 // Add remaining connection_ids such that their add time is | 288 // Add remaining connection_ids such that their add time is |
| 284 // 2 * kTimeWaitPeriod. | 289 // 2 * kTimeWaitPeriod. |
| 285 const QuicTime::Delta time_wait_period = | 290 const QuicTime::Delta time_wait_period = |
| 286 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); | 291 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); |
| 287 epoll_server_.set_now_in_usec(time_wait_period.ToMicroseconds()); | 292 epoll_server_.set_now_in_usec(time_wait_period.ToMicroseconds()); |
| 288 for (int connection_id = kOldConnectionIdCount + 1; | 293 for (int connection_id = kOldConnectionIdCount + 1; |
| 289 connection_id <= kConnectionIdCount; | 294 connection_id <= kConnectionIdCount; |
| 290 ++connection_id) { | 295 ++connection_id) { |
| 296 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id)); |
| 291 AddConnectionId(connection_id); | 297 AddConnectionId(connection_id); |
| 292 } | 298 } |
| 293 | 299 |
| 294 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); | 300 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); |
| 295 // Now set the current time as time_wait_period + offset usecs. | 301 // Now set the current time as time_wait_period + offset usecs. |
| 296 epoll_server_.set_now_in_usec(time_wait_period.Add(offset).ToMicroseconds()); | 302 epoll_server_.set_now_in_usec(time_wait_period.Add(offset).ToMicroseconds()); |
| 297 // After all the old connection_ids are cleaned up, check the next alarm | 303 // After all the old connection_ids are cleaned up, check the next alarm |
| 298 // interval. | 304 // interval. |
| 299 int64 next_alarm_time = epoll_server_.ApproximateNowInUsec() + | 305 int64 next_alarm_time = epoll_server_.ApproximateNowInUsec() + |
| 300 time_wait_period.Subtract(offset).ToMicroseconds(); | 306 time_wait_period.Subtract(offset).ToMicroseconds(); |
| 301 EXPECT_CALL(epoll_server_, RegisterAlarm(next_alarm_time, _)); | 307 EXPECT_CALL(epoll_server_, RegisterAlarm(next_alarm_time, _)); |
| 302 | 308 |
| 309 for (int connection_id = 1; connection_id <= kConnectionIdCount; |
| 310 ++connection_id) { |
| 311 if (connection_id <= kOldConnectionIdCount) { |
| 312 EXPECT_CALL(visitor_, OnConnectionRemovedFromTimeWaitList(connection_id)); |
| 313 } |
| 314 } |
| 303 time_wait_list_manager_.CleanUpOldConnectionIds(); | 315 time_wait_list_manager_.CleanUpOldConnectionIds(); |
| 304 for (int connection_id = 1; | 316 for (int connection_id = 1; |
| 305 connection_id <= kConnectionIdCount; | 317 connection_id <= kConnectionIdCount; |
| 306 ++connection_id) { | 318 ++connection_id) { |
| 307 EXPECT_EQ(connection_id > kOldConnectionIdCount, | 319 EXPECT_EQ(connection_id > kOldConnectionIdCount, |
| 308 IsConnectionIdInTimeWait(connection_id)) | 320 IsConnectionIdInTimeWait(connection_id)) |
| 309 << "kOldConnectionIdCount: " << kOldConnectionIdCount | 321 << "kOldConnectionIdCount: " << kOldConnectionIdCount |
| 310 << " connection_id: " << connection_id; | 322 << " connection_id: " << connection_id; |
| 311 } | 323 } |
| 312 } | 324 } |
| 313 | 325 |
| 314 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { | 326 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { |
| 315 QuicConnectionId connection_id = 1; | 327 QuicConnectionId connection_id = 1; |
| 328 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id)); |
| 316 AddConnectionId(connection_id); | 329 AddConnectionId(connection_id); |
| 317 QuicPacketSequenceNumber sequence_number = 234; | 330 QuicPacketSequenceNumber sequence_number = 234; |
| 318 scoped_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket( | 331 scoped_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket( |
| 319 ENCRYPTION_NONE, connection_id, sequence_number)); | 332 ENCRYPTION_NONE, connection_id, sequence_number)); |
| 320 // Let first write through. | 333 // Let first write through. |
| 321 EXPECT_CALL(writer_, WritePacket(_, _, | 334 EXPECT_CALL(writer_, WritePacket(_, _, |
| 322 server_address_.address(), | 335 server_address_.address(), |
| 323 client_address_)) | 336 client_address_)) |
| 324 .With(Args<0, 1>(PublicResetPacketEq(connection_id, | 337 .With(Args<0, 1>(PublicResetPacketEq(connection_id, |
| 325 sequence_number))) | 338 sequence_number))) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 336 Assign(&writer_is_blocked_, true), | 349 Assign(&writer_is_blocked_, true), |
| 337 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); | 350 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); |
| 338 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 351 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
| 339 ProcessPacket(connection_id, sequence_number); | 352 ProcessPacket(connection_id, sequence_number); |
| 340 // 3rd packet. No public reset should be sent; | 353 // 3rd packet. No public reset should be sent; |
| 341 ProcessPacket(connection_id, sequence_number); | 354 ProcessPacket(connection_id, sequence_number); |
| 342 | 355 |
| 343 // write packet should not be called since we are write blocked but the | 356 // write packet should not be called since we are write blocked but the |
| 344 // should be queued. | 357 // should be queued. |
| 345 QuicConnectionId other_connection_id = 2; | 358 QuicConnectionId other_connection_id = 2; |
| 359 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(other_connection_id)); |
| 346 AddConnectionId(other_connection_id); | 360 AddConnectionId(other_connection_id); |
| 347 QuicPacketSequenceNumber other_sequence_number = 23423; | 361 QuicPacketSequenceNumber other_sequence_number = 23423; |
| 348 scoped_ptr<QuicEncryptedPacket> other_packet( | 362 scoped_ptr<QuicEncryptedPacket> other_packet( |
| 349 ConstructEncryptedPacket( | 363 ConstructEncryptedPacket( |
| 350 ENCRYPTION_NONE, other_connection_id, other_sequence_number)); | 364 ENCRYPTION_NONE, other_connection_id, other_sequence_number)); |
| 351 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) | 365 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) |
| 352 .Times(0); | 366 .Times(0); |
| 353 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 367 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
| 354 ProcessPacket(other_connection_id, other_sequence_number); | 368 ProcessPacket(other_connection_id, other_sequence_number); |
| 355 | 369 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 369 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, | 383 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, |
| 370 other_packet->length()))); | 384 other_packet->length()))); |
| 371 time_wait_list_manager_.OnCanWrite(); | 385 time_wait_list_manager_.OnCanWrite(); |
| 372 } | 386 } |
| 373 | 387 |
| 374 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { | 388 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { |
| 375 const int kConnectionId1 = 123; | 389 const int kConnectionId1 = 123; |
| 376 const int kConnectionId2 = 456; | 390 const int kConnectionId2 = 456; |
| 377 const int kConnectionId3 = 789; | 391 const int kConnectionId3 = 789; |
| 378 | 392 |
| 393 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId1)); |
| 394 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId2)); |
| 395 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId3)); |
| 379 AddConnectionId(kConnectionId1, QuicVersionMin(), nullptr); | 396 AddConnectionId(kConnectionId1, QuicVersionMin(), nullptr); |
| 380 AddConnectionId(kConnectionId2, QuicVersionMax(), nullptr); | 397 AddConnectionId(kConnectionId2, QuicVersionMax(), nullptr); |
| 381 AddConnectionId(kConnectionId3, QuicVersionMax(), nullptr); | 398 AddConnectionId(kConnectionId3, QuicVersionMax(), nullptr); |
| 382 | 399 |
| 383 EXPECT_EQ(QuicVersionMin(), | 400 EXPECT_EQ(QuicVersionMin(), |
| 384 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( | 401 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( |
| 385 &time_wait_list_manager_, kConnectionId1)); | 402 &time_wait_list_manager_, kConnectionId1)); |
| 386 EXPECT_EQ(QuicVersionMax(), | 403 EXPECT_EQ(QuicVersionMax(), |
| 387 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( | 404 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( |
| 388 &time_wait_list_manager_, kConnectionId2)); | 405 &time_wait_list_manager_, kConnectionId2)); |
| 389 EXPECT_EQ(QuicVersionMax(), | 406 EXPECT_EQ(QuicVersionMax(), |
| 390 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( | 407 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( |
| 391 &time_wait_list_manager_, kConnectionId3)); | 408 &time_wait_list_manager_, kConnectionId3)); |
| 392 } | 409 } |
| 393 | 410 |
| 394 TEST_F(QuicTimeWaitListManagerTest, AddConnectionIdTwice) { | 411 TEST_F(QuicTimeWaitListManagerTest, AddConnectionIdTwice) { |
| 395 // Add connection_ids such that their expiry time is kTimeWaitPeriod_. | 412 // Add connection_ids such that their expiry time is kTimeWaitPeriod_. |
| 396 epoll_server_.set_now_in_usec(0); | 413 epoll_server_.set_now_in_usec(0); |
| 414 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
| 397 AddConnectionId(connection_id_); | 415 AddConnectionId(connection_id_); |
| 398 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); | 416 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
| 399 size_t kConnectionCloseLength = 100; | 417 size_t kConnectionCloseLength = 100; |
| 400 AddConnectionId( | 418 AddConnectionId( |
| 401 connection_id_, | 419 connection_id_, |
| 402 QuicVersionMax(), | 420 QuicVersionMax(), |
| 403 new QuicEncryptedPacket( | 421 new QuicEncryptedPacket( |
| 404 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 422 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
| 405 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); | 423 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
| 406 | 424 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 417 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); | 435 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); |
| 418 | 436 |
| 419 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); | 437 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); |
| 420 // Now set the current time as time_wait_period + offset usecs. | 438 // Now set the current time as time_wait_period + offset usecs. |
| 421 epoll_server_.set_now_in_usec(time_wait_period.Add(offset).ToMicroseconds()); | 439 epoll_server_.set_now_in_usec(time_wait_period.Add(offset).ToMicroseconds()); |
| 422 // After the connection_ids are cleaned up, check the next alarm interval. | 440 // After the connection_ids are cleaned up, check the next alarm interval. |
| 423 int64 next_alarm_time = epoll_server_.ApproximateNowInUsec() + | 441 int64 next_alarm_time = epoll_server_.ApproximateNowInUsec() + |
| 424 time_wait_period.ToMicroseconds(); | 442 time_wait_period.ToMicroseconds(); |
| 425 | 443 |
| 426 EXPECT_CALL(epoll_server_, RegisterAlarm(next_alarm_time, _)); | 444 EXPECT_CALL(epoll_server_, RegisterAlarm(next_alarm_time, _)); |
| 445 EXPECT_CALL(visitor_, OnConnectionRemovedFromTimeWaitList(connection_id_)); |
| 427 time_wait_list_manager_.CleanUpOldConnectionIds(); | 446 time_wait_list_manager_.CleanUpOldConnectionIds(); |
| 428 EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_)); | 447 EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_)); |
| 429 } | 448 } |
| 430 | 449 |
| 431 TEST_F(QuicTimeWaitListManagerTest, ConnectionIdsOrderedByTime) { | 450 TEST_F(QuicTimeWaitListManagerTest, ConnectionIdsOrderedByTime) { |
| 432 // Simple randomization: the values of connection_ids are swapped based on the | 451 // Simple randomization: the values of connection_ids are swapped based on the |
| 433 // current seconds on the clock. If the container is broken, the test will be | 452 // current seconds on the clock. If the container is broken, the test will be |
| 434 // 50% flaky. | 453 // 50% flaky. |
| 435 int odd_second = static_cast<int>(epoll_server_.ApproximateNowInUsec()) % 2; | 454 int odd_second = static_cast<int>(epoll_server_.ApproximateNowInUsec()) % 2; |
| 436 EXPECT_TRUE(odd_second == 0 || odd_second == 1); | 455 EXPECT_TRUE(odd_second == 0 || odd_second == 1); |
| 437 const QuicConnectionId kConnectionId1 = odd_second; | 456 const QuicConnectionId kConnectionId1 = odd_second; |
| 438 const QuicConnectionId kConnectionId2 = 1 - odd_second; | 457 const QuicConnectionId kConnectionId2 = 1 - odd_second; |
| 439 | 458 |
| 440 // 1 will hash lower than 2, but we add it later. They should come out in the | 459 // 1 will hash lower than 2, but we add it later. They should come out in the |
| 441 // add order, not hash order. | 460 // add order, not hash order. |
| 442 epoll_server_.set_now_in_usec(0); | 461 epoll_server_.set_now_in_usec(0); |
| 462 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId1)); |
| 443 AddConnectionId(kConnectionId1); | 463 AddConnectionId(kConnectionId1); |
| 444 epoll_server_.set_now_in_usec(10); | 464 epoll_server_.set_now_in_usec(10); |
| 465 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId2)); |
| 445 AddConnectionId(kConnectionId2); | 466 AddConnectionId(kConnectionId2); |
| 446 | 467 |
| 447 const QuicTime::Delta time_wait_period = | 468 const QuicTime::Delta time_wait_period = |
| 448 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); | 469 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); |
| 449 epoll_server_.set_now_in_usec(time_wait_period.ToMicroseconds() + 1); | 470 epoll_server_.set_now_in_usec(time_wait_period.ToMicroseconds() + 1); |
| 450 | 471 |
| 451 EXPECT_CALL(epoll_server_, RegisterAlarm(_, _)); | 472 EXPECT_CALL(epoll_server_, RegisterAlarm(_, _)); |
| 452 | 473 |
| 474 EXPECT_CALL(visitor_, OnConnectionRemovedFromTimeWaitList(kConnectionId1)); |
| 453 time_wait_list_manager_.CleanUpOldConnectionIds(); | 475 time_wait_list_manager_.CleanUpOldConnectionIds(); |
| 454 EXPECT_FALSE(IsConnectionIdInTimeWait(kConnectionId1)); | 476 EXPECT_FALSE(IsConnectionIdInTimeWait(kConnectionId1)); |
| 455 EXPECT_TRUE(IsConnectionIdInTimeWait(kConnectionId2)); | 477 EXPECT_TRUE(IsConnectionIdInTimeWait(kConnectionId2)); |
| 456 } | 478 } |
| 457 } // namespace | 479 } // namespace |
| 458 } // namespace test | 480 } // namespace test |
| 459 } // namespace tools | 481 } // namespace tools |
| 460 } // namespace net | 482 } // namespace net |
| OLD | NEW |