| 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 #include <memory> | 8 #include <memory> |
| 9 #include <ostream> | 9 #include <ostream> |
| 10 | 10 |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 QuicTimeWaitListManager time_wait_list_manager_; | 137 QuicTimeWaitListManager time_wait_list_manager_; |
| 138 QuicConnectionId connection_id_; | 138 QuicConnectionId connection_id_; |
| 139 QuicSocketAddress server_address_; | 139 QuicSocketAddress server_address_; |
| 140 QuicSocketAddress client_address_; | 140 QuicSocketAddress client_address_; |
| 141 bool writer_is_blocked_; | 141 bool writer_is_blocked_; |
| 142 }; | 142 }; |
| 143 | 143 |
| 144 class ValidatePublicResetPacketPredicate | 144 class ValidatePublicResetPacketPredicate |
| 145 : public MatcherInterface<const std::tr1::tuple<const char*, int>> { | 145 : public MatcherInterface<const std::tr1::tuple<const char*, int>> { |
| 146 public: | 146 public: |
| 147 explicit ValidatePublicResetPacketPredicate(QuicConnectionId connection_id, | 147 explicit ValidatePublicResetPacketPredicate(QuicConnectionId connection_id) |
| 148 QuicPacketNumber number) | 148 : connection_id_(connection_id) {} |
| 149 : connection_id_(connection_id), packet_number_(number) {} | |
| 150 | 149 |
| 151 bool MatchAndExplain( | 150 bool MatchAndExplain( |
| 152 const std::tr1::tuple<const char*, int> packet_buffer, | 151 const std::tr1::tuple<const char*, int> packet_buffer, |
| 153 testing::MatchResultListener* /* listener */) const override { | 152 testing::MatchResultListener* /* listener */) const override { |
| 154 FramerVisitorCapturingPublicReset visitor; | 153 FramerVisitorCapturingPublicReset visitor; |
| 155 QuicFramer framer(AllSupportedVersions(), QuicTime::Zero(), | 154 QuicFramer framer(AllSupportedVersions(), QuicTime::Zero(), |
| 156 Perspective::IS_CLIENT); | 155 Perspective::IS_CLIENT); |
| 157 framer.set_visitor(&visitor); | 156 framer.set_visitor(&visitor); |
| 158 QuicEncryptedPacket encrypted(std::tr1::get<0>(packet_buffer), | 157 QuicEncryptedPacket encrypted(std::tr1::get<0>(packet_buffer), |
| 159 std::tr1::get<1>(packet_buffer)); | 158 std::tr1::get<1>(packet_buffer)); |
| 160 framer.ProcessPacket(encrypted); | 159 framer.ProcessPacket(encrypted); |
| 161 QuicPublicResetPacket packet = visitor.public_reset_packet(); | 160 QuicPublicResetPacket packet = visitor.public_reset_packet(); |
| 162 return connection_id_ == GetPeerInMemoryConnectionId( | 161 return connection_id_ == GetPeerInMemoryConnectionId( |
| 163 packet.public_header.connection_id) && | 162 packet.public_header.connection_id) && |
| 164 packet.public_header.reset_flag && | 163 packet.public_header.reset_flag && |
| 165 !packet.public_header.version_flag && | 164 !packet.public_header.version_flag && |
| 166 packet_number_ == packet.rejected_packet_number && | |
| 167 net::test::TestPeerIPAddress() == packet.client_address.host() && | 165 net::test::TestPeerIPAddress() == packet.client_address.host() && |
| 168 kTestPort == packet.client_address.port(); | 166 kTestPort == packet.client_address.port(); |
| 169 } | 167 } |
| 170 | 168 |
| 171 void DescribeTo(::std::ostream* os) const override {} | 169 void DescribeTo(::std::ostream* os) const override {} |
| 172 | 170 |
| 173 void DescribeNegationTo(::std::ostream* os) const override {} | 171 void DescribeNegationTo(::std::ostream* os) const override {} |
| 174 | 172 |
| 175 private: | 173 private: |
| 176 QuicConnectionId connection_id_; | 174 QuicConnectionId connection_id_; |
| 177 QuicPacketNumber packet_number_; | |
| 178 }; | 175 }; |
| 179 | 176 |
| 180 Matcher<const std::tr1::tuple<const char*, int>> PublicResetPacketEq( | 177 Matcher<const std::tr1::tuple<const char*, int>> PublicResetPacketEq( |
| 181 QuicConnectionId connection_id, | 178 QuicConnectionId connection_id) { |
| 182 QuicPacketNumber packet_number) { | 179 return MakeMatcher(new ValidatePublicResetPacketPredicate(connection_id)); |
| 183 return MakeMatcher( | |
| 184 new ValidatePublicResetPacketPredicate(connection_id, packet_number)); | |
| 185 } | 180 } |
| 186 | 181 |
| 187 TEST_F(QuicTimeWaitListManagerTest, CheckConnectionIdInTimeWait) { | 182 TEST_F(QuicTimeWaitListManagerTest, CheckConnectionIdInTimeWait) { |
| 188 EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_)); | 183 EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_)); |
| 189 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); | 184 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
| 190 AddConnectionId(connection_id_); | 185 AddConnectionId(connection_id_); |
| 191 EXPECT_EQ(1u, time_wait_list_manager_.num_connections()); | 186 EXPECT_EQ(1u, time_wait_list_manager_.num_connections()); |
| 192 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); | 187 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
| 193 } | 188 } |
| 194 | 189 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 | 247 |
| 253 ProcessPacket(connection_id_, kRandomSequenceNumber); | 248 ProcessPacket(connection_id_, kRandomSequenceNumber); |
| 254 } | 249 } |
| 255 | 250 |
| 256 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { | 251 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { |
| 257 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); | 252 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
| 258 AddConnectionId(connection_id_); | 253 AddConnectionId(connection_id_); |
| 259 const int kRandomSequenceNumber = 1; | 254 const int kRandomSequenceNumber = 1; |
| 260 EXPECT_CALL(writer_, | 255 EXPECT_CALL(writer_, |
| 261 WritePacket(_, _, server_address_.host(), client_address_, _)) | 256 WritePacket(_, _, server_address_.host(), client_address_, _)) |
| 262 .With(Args<0, 1>(PublicResetPacketEq(connection_id_, 0))) | 257 .With(Args<0, 1>(PublicResetPacketEq(connection_id_))) |
| 263 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); | 258 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); |
| 264 | 259 |
| 265 ProcessPacket(connection_id_, kRandomSequenceNumber); | 260 ProcessPacket(connection_id_, kRandomSequenceNumber); |
| 266 } | 261 } |
| 267 | 262 |
| 268 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { | 263 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { |
| 269 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); | 264 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
| 270 AddConnectionId(connection_id_); | 265 AddConnectionId(connection_id_); |
| 271 EXPECT_EQ(1u, time_wait_list_manager_.num_connections()); | 266 EXPECT_EQ(1u, time_wait_list_manager_.num_connections()); |
| 272 for (int packet_number = 1; packet_number < 101; ++packet_number) { | 267 for (int packet_number = 1; packet_number < 101; ++packet_number) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 347 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { | 342 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { |
| 348 QuicConnectionId connection_id = 1; | 343 QuicConnectionId connection_id = 1; |
| 349 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id)); | 344 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id)); |
| 350 AddConnectionId(connection_id); | 345 AddConnectionId(connection_id); |
| 351 QuicPacketNumber packet_number = 234; | 346 QuicPacketNumber packet_number = 234; |
| 352 std::unique_ptr<QuicEncryptedPacket> packet( | 347 std::unique_ptr<QuicEncryptedPacket> packet( |
| 353 ConstructEncryptedPacket(connection_id, packet_number)); | 348 ConstructEncryptedPacket(connection_id, packet_number)); |
| 354 // Let first write through. | 349 // Let first write through. |
| 355 EXPECT_CALL(writer_, | 350 EXPECT_CALL(writer_, |
| 356 WritePacket(_, _, server_address_.host(), client_address_, _)) | 351 WritePacket(_, _, server_address_.host(), client_address_, _)) |
| 357 .With(Args<0, 1>(PublicResetPacketEq(connection_id, 0))) | 352 .With(Args<0, 1>(PublicResetPacketEq(connection_id))) |
| 358 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 353 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
| 359 ProcessPacket(connection_id, packet_number); | 354 ProcessPacket(connection_id, packet_number); |
| 360 | 355 |
| 361 // write block for the next packet. | 356 // write block for the next packet. |
| 362 EXPECT_CALL(writer_, | 357 EXPECT_CALL(writer_, |
| 363 WritePacket(_, _, server_address_.host(), client_address_, _)) | 358 WritePacket(_, _, server_address_.host(), client_address_, _)) |
| 364 .With(Args<0, 1>(PublicResetPacketEq(connection_id, 0))) | 359 .With(Args<0, 1>(PublicResetPacketEq(connection_id))) |
| 365 .WillOnce(DoAll(Assign(&writer_is_blocked_, true), | 360 .WillOnce(DoAll(Assign(&writer_is_blocked_, true), |
| 366 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); | 361 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); |
| 367 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 362 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
| 368 ProcessPacket(connection_id, packet_number); | 363 ProcessPacket(connection_id, packet_number); |
| 369 // 3rd packet. No public reset should be sent; | 364 // 3rd packet. No public reset should be sent; |
| 370 ProcessPacket(connection_id, packet_number); | 365 ProcessPacket(connection_id, packet_number); |
| 371 | 366 |
| 372 // write packet should not be called since we are write blocked but the | 367 // write packet should not be called since we are write blocked but the |
| 373 // should be queued. | 368 // should be queued. |
| 374 QuicConnectionId other_connection_id = 2; | 369 QuicConnectionId other_connection_id = 2; |
| 375 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(other_connection_id)); | 370 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(other_connection_id)); |
| 376 AddConnectionId(other_connection_id); | 371 AddConnectionId(other_connection_id); |
| 377 QuicPacketNumber other_packet_number = 23423; | 372 QuicPacketNumber other_packet_number = 23423; |
| 378 std::unique_ptr<QuicEncryptedPacket> other_packet( | 373 std::unique_ptr<QuicEncryptedPacket> other_packet( |
| 379 ConstructEncryptedPacket(other_connection_id, other_packet_number)); | 374 ConstructEncryptedPacket(other_connection_id, other_packet_number)); |
| 380 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)).Times(0); | 375 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)).Times(0); |
| 381 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 376 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
| 382 ProcessPacket(other_connection_id, other_packet_number); | 377 ProcessPacket(other_connection_id, other_packet_number); |
| 383 EXPECT_EQ(2u, time_wait_list_manager_.num_connections()); | 378 EXPECT_EQ(2u, time_wait_list_manager_.num_connections()); |
| 384 | 379 |
| 385 // Now expect all the write blocked public reset packets to be sent again. | 380 // Now expect all the write blocked public reset packets to be sent again. |
| 386 writer_is_blocked_ = false; | 381 writer_is_blocked_ = false; |
| 387 EXPECT_CALL(writer_, | 382 EXPECT_CALL(writer_, |
| 388 WritePacket(_, _, server_address_.host(), client_address_, _)) | 383 WritePacket(_, _, server_address_.host(), client_address_, _)) |
| 389 .With(Args<0, 1>(PublicResetPacketEq(connection_id, 0))) | 384 .With(Args<0, 1>(PublicResetPacketEq(connection_id))) |
| 390 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 385 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
| 391 EXPECT_CALL(writer_, | 386 EXPECT_CALL(writer_, |
| 392 WritePacket(_, _, server_address_.host(), client_address_, _)) | 387 WritePacket(_, _, server_address_.host(), client_address_, _)) |
| 393 .With(Args<0, 1>(PublicResetPacketEq(other_connection_id, 0))) | 388 .With(Args<0, 1>(PublicResetPacketEq(other_connection_id))) |
| 394 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, other_packet->length()))); | 389 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, other_packet->length()))); |
| 395 time_wait_list_manager_.OnCanWrite(); | 390 time_wait_list_manager_.OnCanWrite(); |
| 396 } | 391 } |
| 397 | 392 |
| 398 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { | 393 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { |
| 399 const int kConnectionId1 = 123; | 394 const int kConnectionId1 = 123; |
| 400 const int kConnectionId2 = 456; | 395 const int kConnectionId2 = 456; |
| 401 const int kConnectionId3 = 789; | 396 const int kConnectionId3 = 789; |
| 402 | 397 |
| 403 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId1)); | 398 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId1)); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 EXPECT_EQ(static_cast<size_t>(FLAGS_quic_time_wait_list_max_connections), | 518 EXPECT_EQ(static_cast<size_t>(FLAGS_quic_time_wait_list_max_connections), |
| 524 time_wait_list_manager_.num_connections()); | 519 time_wait_list_manager_.num_connections()); |
| 525 EXPECT_FALSE(IsConnectionIdInTimeWait(id_to_evict)); | 520 EXPECT_FALSE(IsConnectionIdInTimeWait(id_to_evict)); |
| 526 EXPECT_TRUE(IsConnectionIdInTimeWait(current_connection_id)); | 521 EXPECT_TRUE(IsConnectionIdInTimeWait(current_connection_id)); |
| 527 } | 522 } |
| 528 } | 523 } |
| 529 | 524 |
| 530 } // namespace | 525 } // namespace |
| 531 } // namespace test | 526 } // namespace test |
| 532 } // namespace net | 527 } // namespace net |
| OLD | NEW |