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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 ~QuicTimeWaitListManagerTest() override {} | 107 ~QuicTimeWaitListManagerTest() override {} |
108 | 108 |
109 void SetUp() override { | 109 void SetUp() override { |
110 EXPECT_CALL(writer_, IsWriteBlocked()) | 110 EXPECT_CALL(writer_, IsWriteBlocked()) |
111 .WillRepeatedly(ReturnPointee(&writer_is_blocked_)); | 111 .WillRepeatedly(ReturnPointee(&writer_is_blocked_)); |
112 EXPECT_CALL(writer_, IsWriteBlockedDataBuffered()) | 112 EXPECT_CALL(writer_, IsWriteBlockedDataBuffered()) |
113 .WillRepeatedly(Return(false)); | 113 .WillRepeatedly(Return(false)); |
114 } | 114 } |
115 | 115 |
116 void AddConnectionId(QuicConnectionId connection_id) { | 116 void AddConnectionId(QuicConnectionId connection_id) { |
117 AddConnectionId(connection_id, QuicVersionMax(), nullptr); | 117 AddConnectionId(connection_id, QuicVersionMax(), |
| 118 /*connection_rejected_statelessly=*/false, nullptr); |
| 119 } |
| 120 |
| 121 void AddStatelessConnectionId(QuicConnectionId connection_id) { |
| 122 time_wait_list_manager_.AddConnectionIdToTimeWait( |
| 123 connection_id, QuicVersionMax(), |
| 124 /*connection_rejected_statelessly=*/true, nullptr); |
118 } | 125 } |
119 | 126 |
120 void AddConnectionId(QuicConnectionId connection_id, | 127 void AddConnectionId(QuicConnectionId connection_id, |
121 QuicVersion version, | 128 QuicVersion version, |
| 129 bool connection_rejected_statelessly, |
122 QuicEncryptedPacket* packet) { | 130 QuicEncryptedPacket* packet) { |
123 time_wait_list_manager_.AddConnectionIdToTimeWait( | 131 time_wait_list_manager_.AddConnectionIdToTimeWait( |
124 connection_id, version, packet); | 132 connection_id, version, connection_rejected_statelessly, packet); |
125 } | 133 } |
126 | 134 |
127 bool IsConnectionIdInTimeWait(QuicConnectionId connection_id) { | 135 bool IsConnectionIdInTimeWait(QuicConnectionId connection_id) { |
128 return time_wait_list_manager_.IsConnectionIdInTimeWait(connection_id); | 136 return time_wait_list_manager_.IsConnectionIdInTimeWait(connection_id); |
129 } | 137 } |
130 | 138 |
131 void ProcessPacket(QuicConnectionId connection_id, | 139 void ProcessPacket(QuicConnectionId connection_id, |
132 QuicPacketSequenceNumber sequence_number) { | 140 QuicPacketSequenceNumber sequence_number) { |
133 QuicEncryptedPacket packet(nullptr, 0); | 141 QuicEncryptedPacket packet(nullptr, 0); |
134 time_wait_list_manager_.ProcessPacket(server_address_, | 142 time_wait_list_manager_.ProcessPacket(server_address_, |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 } | 232 } |
225 | 233 |
226 TEST_F(QuicTimeWaitListManagerTest, CheckConnectionIdInTimeWait) { | 234 TEST_F(QuicTimeWaitListManagerTest, CheckConnectionIdInTimeWait) { |
227 EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_)); | 235 EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_)); |
228 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); | 236 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
229 AddConnectionId(connection_id_); | 237 AddConnectionId(connection_id_); |
230 EXPECT_EQ(1u, time_wait_list_manager_.num_connections()); | 238 EXPECT_EQ(1u, time_wait_list_manager_.num_connections()); |
231 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); | 239 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
232 } | 240 } |
233 | 241 |
| 242 TEST_F(QuicTimeWaitListManagerTest, CheckStatelessConnectionIdInTimeWait) { |
| 243 EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_)); |
| 244 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
| 245 AddStatelessConnectionId(connection_id_); |
| 246 EXPECT_EQ(1u, time_wait_list_manager_.num_connections()); |
| 247 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
| 248 } |
| 249 |
234 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { | 250 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { |
235 const size_t kConnectionCloseLength = 100; | 251 const size_t kConnectionCloseLength = 100; |
236 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); | 252 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
237 AddConnectionId( | 253 AddConnectionId(connection_id_, QuicVersionMax(), |
238 connection_id_, | 254 /*connection_rejected_statelessly=*/false, |
239 QuicVersionMax(), | 255 new QuicEncryptedPacket(new char[kConnectionCloseLength], |
240 new QuicEncryptedPacket( | 256 kConnectionCloseLength, true)); |
241 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | |
242 const int kRandomSequenceNumber = 1; | 257 const int kRandomSequenceNumber = 1; |
243 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, | 258 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, |
244 server_address_.address(), | 259 server_address_.address(), |
245 client_address_)) | 260 client_address_)) |
246 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 261 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
247 | 262 |
248 ProcessPacket(connection_id_, kRandomSequenceNumber); | 263 ProcessPacket(connection_id_, kRandomSequenceNumber); |
249 } | 264 } |
250 | 265 |
251 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { | 266 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { |
(...skipping 24 matching lines...) Expand all Loading... |
276 if ((sequence_number & (sequence_number - 1)) == 0) { | 291 if ((sequence_number & (sequence_number - 1)) == 0) { |
277 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 292 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
278 &time_wait_list_manager_, sequence_number)); | 293 &time_wait_list_manager_, sequence_number)); |
279 } else { | 294 } else { |
280 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 295 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
281 &time_wait_list_manager_, sequence_number)); | 296 &time_wait_list_manager_, sequence_number)); |
282 } | 297 } |
283 } | 298 } |
284 } | 299 } |
285 | 300 |
| 301 TEST_F(QuicTimeWaitListManagerTest, NoPublicResetForStatelessConnections) { |
| 302 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
| 303 AddStatelessConnectionId(connection_id_); |
| 304 const int kRandomSequenceNumber = 1; |
| 305 ProcessPacket(connection_id_, kRandomSequenceNumber); |
| 306 } |
| 307 |
286 TEST_F(QuicTimeWaitListManagerTest, CleanUpOldConnectionIds) { | 308 TEST_F(QuicTimeWaitListManagerTest, CleanUpOldConnectionIds) { |
287 const size_t kConnectionIdCount = 100; | 309 const size_t kConnectionIdCount = 100; |
288 const size_t kOldConnectionIdCount = 31; | 310 const size_t kOldConnectionIdCount = 31; |
289 | 311 |
290 // Add connection_ids such that their expiry time is time_wait_period_. | 312 // Add connection_ids such that their expiry time is time_wait_period_. |
291 epoll_server_.set_now_in_usec(0); | 313 epoll_server_.set_now_in_usec(0); |
292 for (size_t connection_id = 1; connection_id <= kOldConnectionIdCount; | 314 for (size_t connection_id = 1; connection_id <= kOldConnectionIdCount; |
293 ++connection_id) { | 315 ++connection_id) { |
294 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id)); | 316 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id)); |
295 AddConnectionId(connection_id); | 317 AddConnectionId(connection_id); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 } | 421 } |
400 | 422 |
401 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { | 423 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { |
402 const int kConnectionId1 = 123; | 424 const int kConnectionId1 = 123; |
403 const int kConnectionId2 = 456; | 425 const int kConnectionId2 = 456; |
404 const int kConnectionId3 = 789; | 426 const int kConnectionId3 = 789; |
405 | 427 |
406 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId1)); | 428 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId1)); |
407 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId2)); | 429 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId2)); |
408 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId3)); | 430 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId3)); |
409 AddConnectionId(kConnectionId1, QuicVersionMin(), nullptr); | 431 AddConnectionId(kConnectionId1, QuicVersionMin(), |
410 AddConnectionId(kConnectionId2, QuicVersionMax(), nullptr); | 432 /*connection_rejected_statelessly=*/false, nullptr); |
411 AddConnectionId(kConnectionId3, QuicVersionMax(), nullptr); | 433 AddConnectionId(kConnectionId2, QuicVersionMax(), |
| 434 /*connection_rejected_statelessly=*/false, nullptr); |
| 435 AddConnectionId(kConnectionId3, QuicVersionMax(), |
| 436 /*connection_rejected_statelessly=*/false, nullptr); |
412 | 437 |
413 EXPECT_EQ(QuicVersionMin(), | 438 EXPECT_EQ(QuicVersionMin(), |
414 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( | 439 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( |
415 &time_wait_list_manager_, kConnectionId1)); | 440 &time_wait_list_manager_, kConnectionId1)); |
416 EXPECT_EQ(QuicVersionMax(), | 441 EXPECT_EQ(QuicVersionMax(), |
417 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( | 442 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( |
418 &time_wait_list_manager_, kConnectionId2)); | 443 &time_wait_list_manager_, kConnectionId2)); |
419 EXPECT_EQ(QuicVersionMax(), | 444 EXPECT_EQ(QuicVersionMax(), |
420 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( | 445 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( |
421 &time_wait_list_manager_, kConnectionId3)); | 446 &time_wait_list_manager_, kConnectionId3)); |
422 } | 447 } |
423 | 448 |
424 TEST_F(QuicTimeWaitListManagerTest, AddConnectionIdTwice) { | 449 TEST_F(QuicTimeWaitListManagerTest, AddConnectionIdTwice) { |
425 // Add connection_ids such that their expiry time is time_wait_period_. | 450 // Add connection_ids such that their expiry time is time_wait_period_. |
426 epoll_server_.set_now_in_usec(0); | 451 epoll_server_.set_now_in_usec(0); |
427 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); | 452 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
428 AddConnectionId(connection_id_); | 453 AddConnectionId(connection_id_); |
429 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); | 454 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
430 const size_t kConnectionCloseLength = 100; | 455 const size_t kConnectionCloseLength = 100; |
431 AddConnectionId( | 456 AddConnectionId(connection_id_, QuicVersionMax(), |
432 connection_id_, | 457 /*connection_rejected_statelessly=*/false, |
433 QuicVersionMax(), | 458 new QuicEncryptedPacket(new char[kConnectionCloseLength], |
434 new QuicEncryptedPacket( | 459 kConnectionCloseLength, true)); |
435 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | |
436 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); | 460 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
437 EXPECT_EQ(1u, time_wait_list_manager_.num_connections()); | 461 EXPECT_EQ(1u, time_wait_list_manager_.num_connections()); |
438 | 462 |
439 EXPECT_CALL(writer_, WritePacket(_, | 463 EXPECT_CALL(writer_, WritePacket(_, |
440 kConnectionCloseLength, | 464 kConnectionCloseLength, |
441 server_address_.address(), | 465 server_address_.address(), |
442 client_address_)) | 466 client_address_)) |
443 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 467 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
444 | 468 |
445 const int kRandomSequenceNumber = 1; | 469 const int kRandomSequenceNumber = 1; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 time_wait_list_manager_.num_connections()); | 551 time_wait_list_manager_.num_connections()); |
528 EXPECT_FALSE(IsConnectionIdInTimeWait(id_to_evict)); | 552 EXPECT_FALSE(IsConnectionIdInTimeWait(id_to_evict)); |
529 EXPECT_TRUE(IsConnectionIdInTimeWait(current_connection_id)); | 553 EXPECT_TRUE(IsConnectionIdInTimeWait(current_connection_id)); |
530 } | 554 } |
531 } | 555 } |
532 | 556 |
533 } // namespace | 557 } // namespace |
534 } // namespace test | 558 } // namespace test |
535 } // namespace tools | 559 } // namespace tools |
536 } // namespace net | 560 } // namespace net |
OLD | NEW |