| 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 public: | 43 public: |
| 44 static bool ShouldSendResponse(QuicTimeWaitListManager* manager, | 44 static bool ShouldSendResponse(QuicTimeWaitListManager* manager, |
| 45 int received_packet_count) { | 45 int received_packet_count) { |
| 46 return manager->ShouldSendResponse(received_packet_count); | 46 return manager->ShouldSendResponse(received_packet_count); |
| 47 } | 47 } |
| 48 | 48 |
| 49 static QuicTime::Delta time_wait_period(QuicTimeWaitListManager* manager) { | 49 static QuicTime::Delta time_wait_period(QuicTimeWaitListManager* manager) { |
| 50 return manager->kTimeWaitPeriod_; | 50 return manager->kTimeWaitPeriod_; |
| 51 } | 51 } |
| 52 | 52 |
| 53 static QuicVersion GetQuicVersionFromGuid(QuicTimeWaitListManager* manager, | 53 static QuicVersion GetQuicVersionFromConnectionId( |
| 54 QuicGuid guid) { | 54 QuicTimeWaitListManager* manager, |
| 55 return manager->GetQuicVersionFromGuid(guid); | 55 QuicConnectionId connection_id) { |
| 56 return manager->GetQuicVersionFromConnectionId(connection_id); |
| 56 } | 57 } |
| 57 }; | 58 }; |
| 58 | 59 |
| 59 namespace { | 60 namespace { |
| 60 | 61 |
| 61 class MockFakeTimeEpollServer : public FakeTimeEpollServer { | 62 class MockFakeTimeEpollServer : public FakeTimeEpollServer { |
| 62 public: | 63 public: |
| 63 MOCK_METHOD2(RegisterAlarm, void(int64 timeout_in_us, | 64 MOCK_METHOD2(RegisterAlarm, void(int64 timeout_in_us, |
| 64 EpollAlarmCallbackInterface* alarm)); | 65 EpollAlarmCallbackInterface* alarm)); |
| 65 }; | 66 }; |
| 66 | 67 |
| 67 class QuicTimeWaitListManagerTest : public testing::Test { | 68 class QuicTimeWaitListManagerTest : public testing::Test { |
| 68 protected: | 69 protected: |
| 69 QuicTimeWaitListManagerTest() | 70 QuicTimeWaitListManagerTest() |
| 70 : time_wait_list_manager_(&writer_, &visitor_, | 71 : time_wait_list_manager_(&writer_, &visitor_, |
| 71 &epoll_server_, QuicSupportedVersions()), | 72 &epoll_server_, QuicSupportedVersions()), |
| 72 framer_(QuicSupportedVersions(), QuicTime::Zero(), true), | 73 framer_(QuicSupportedVersions(), QuicTime::Zero(), true), |
| 73 guid_(45), | 74 connection_id_(45), |
| 74 client_address_(net::test::TestPeerIPAddress(), kTestPort), | 75 client_address_(net::test::TestPeerIPAddress(), kTestPort), |
| 75 writer_is_blocked_(false) {} | 76 writer_is_blocked_(false) {} |
| 76 | 77 |
| 77 virtual ~QuicTimeWaitListManagerTest() {} | 78 virtual ~QuicTimeWaitListManagerTest() {} |
| 78 | 79 |
| 79 virtual void SetUp() { | 80 virtual void SetUp() { |
| 80 EXPECT_CALL(writer_, IsWriteBlocked()) | 81 EXPECT_CALL(writer_, IsWriteBlocked()) |
| 81 .WillRepeatedly(ReturnPointee(&writer_is_blocked_)); | 82 .WillRepeatedly(ReturnPointee(&writer_is_blocked_)); |
| 82 EXPECT_CALL(writer_, IsWriteBlockedDataBuffered()) | 83 EXPECT_CALL(writer_, IsWriteBlockedDataBuffered()) |
| 83 .WillRepeatedly(Return(false)); | 84 .WillRepeatedly(Return(false)); |
| 84 } | 85 } |
| 85 | 86 |
| 86 void AddGuid(QuicGuid guid) { | 87 void AddConnectionId(QuicConnectionId connection_id) { |
| 87 AddGuid(guid, net::test::QuicVersionMax(), NULL); | 88 AddConnectionId(connection_id, net::test::QuicVersionMax(), NULL); |
| 88 } | 89 } |
| 89 | 90 |
| 90 void AddGuid(QuicGuid guid, | 91 void AddConnectionId(QuicConnectionId connection_id, |
| 91 QuicVersion version, | 92 QuicVersion version, |
| 92 QuicEncryptedPacket* packet) { | 93 QuicEncryptedPacket* packet) { |
| 93 time_wait_list_manager_.AddGuidToTimeWait(guid, version, packet); | 94 time_wait_list_manager_.AddConnectionIdToTimeWait( |
| 95 connection_id, version, packet); |
| 94 } | 96 } |
| 95 | 97 |
| 96 bool IsGuidInTimeWait(QuicGuid guid) { | 98 bool IsConnectionIdInTimeWait(QuicConnectionId connection_id) { |
| 97 return time_wait_list_manager_.IsGuidInTimeWait(guid); | 99 return time_wait_list_manager_.IsConnectionIdInTimeWait(connection_id); |
| 98 } | 100 } |
| 99 | 101 |
| 100 void ProcessPacket(QuicGuid guid, QuicPacketSequenceNumber sequence_number) { | 102 void ProcessPacket(QuicConnectionId connection_id, |
| 103 QuicPacketSequenceNumber sequence_number) { |
| 101 time_wait_list_manager_.ProcessPacket(server_address_, | 104 time_wait_list_manager_.ProcessPacket(server_address_, |
| 102 client_address_, | 105 client_address_, |
| 103 guid, | 106 connection_id, |
| 104 sequence_number); | 107 sequence_number); |
| 105 } | 108 } |
| 106 | 109 |
| 107 QuicEncryptedPacket* ConstructEncryptedPacket( | 110 QuicEncryptedPacket* ConstructEncryptedPacket( |
| 108 EncryptionLevel level, | 111 EncryptionLevel level, |
| 109 QuicGuid guid, | 112 QuicConnectionId connection_id, |
| 110 QuicPacketSequenceNumber sequence_number) { | 113 QuicPacketSequenceNumber sequence_number) { |
| 111 QuicPacketHeader header; | 114 QuicPacketHeader header; |
| 112 header.public_header.guid = guid; | 115 header.public_header.connection_id = connection_id; |
| 113 header.public_header.guid_length = PACKET_8BYTE_GUID; | 116 header.public_header.connection_id_length = PACKET_8BYTE_CONNECTION_ID; |
| 114 header.public_header.version_flag = false; | 117 header.public_header.version_flag = false; |
| 115 header.public_header.reset_flag = false; | 118 header.public_header.reset_flag = false; |
| 116 header.public_header.sequence_number_length = PACKET_6BYTE_SEQUENCE_NUMBER; | 119 header.public_header.sequence_number_length = PACKET_6BYTE_SEQUENCE_NUMBER; |
| 117 header.packet_sequence_number = sequence_number; | 120 header.packet_sequence_number = sequence_number; |
| 118 header.entropy_flag = false; | 121 header.entropy_flag = false; |
| 119 header.entropy_hash = 0; | 122 header.entropy_hash = 0; |
| 120 header.fec_flag = false; | 123 header.fec_flag = false; |
| 121 header.is_in_fec_group = NOT_IN_FEC_GROUP; | 124 header.is_in_fec_group = NOT_IN_FEC_GROUP; |
| 122 header.fec_group = 0; | 125 header.fec_group = 0; |
| 123 QuicStreamFrame stream_frame(1, false, 0, MakeIOVector("data")); | 126 QuicStreamFrame stream_frame(1, false, 0, MakeIOVector("data")); |
| 124 QuicFrame frame(&stream_frame); | 127 QuicFrame frame(&stream_frame); |
| 125 QuicFrames frames; | 128 QuicFrames frames; |
| 126 frames.push_back(frame); | 129 frames.push_back(frame); |
| 127 scoped_ptr<QuicPacket> packet( | 130 scoped_ptr<QuicPacket> packet( |
| 128 framer_.BuildUnsizedDataPacket(header, frames).packet); | 131 framer_.BuildUnsizedDataPacket(header, frames).packet); |
| 129 EXPECT_TRUE(packet != NULL); | 132 EXPECT_TRUE(packet != NULL); |
| 130 QuicEncryptedPacket* encrypted = framer_.EncryptPacket(ENCRYPTION_NONE, | 133 QuicEncryptedPacket* encrypted = framer_.EncryptPacket(ENCRYPTION_NONE, |
| 131 sequence_number, | 134 sequence_number, |
| 132 *packet); | 135 *packet); |
| 133 EXPECT_TRUE(encrypted != NULL); | 136 EXPECT_TRUE(encrypted != NULL); |
| 134 return encrypted; | 137 return encrypted; |
| 135 } | 138 } |
| 136 | 139 |
| 137 NiceMock<MockFakeTimeEpollServer> epoll_server_; | 140 NiceMock<MockFakeTimeEpollServer> epoll_server_; |
| 138 StrictMock<MockPacketWriter> writer_; | 141 StrictMock<MockPacketWriter> writer_; |
| 139 StrictMock<MockQuicServerSessionVisitor> visitor_; | 142 StrictMock<MockQuicServerSessionVisitor> visitor_; |
| 140 QuicTimeWaitListManager time_wait_list_manager_; | 143 QuicTimeWaitListManager time_wait_list_manager_; |
| 141 QuicFramer framer_; | 144 QuicFramer framer_; |
| 142 QuicGuid guid_; | 145 QuicConnectionId connection_id_; |
| 143 IPEndPoint server_address_; | 146 IPEndPoint server_address_; |
| 144 IPEndPoint client_address_; | 147 IPEndPoint client_address_; |
| 145 bool writer_is_blocked_; | 148 bool writer_is_blocked_; |
| 146 }; | 149 }; |
| 147 | 150 |
| 148 class ValidatePublicResetPacketPredicate | 151 class ValidatePublicResetPacketPredicate |
| 149 : public MatcherInterface<const std::tr1::tuple<const char*, int> > { | 152 : public MatcherInterface<const std::tr1::tuple<const char*, int> > { |
| 150 public: | 153 public: |
| 151 explicit ValidatePublicResetPacketPredicate(QuicGuid guid, | 154 explicit ValidatePublicResetPacketPredicate(QuicConnectionId connection_id, |
| 152 QuicPacketSequenceNumber number) | 155 QuicPacketSequenceNumber number) |
| 153 : guid_(guid), sequence_number_(number) { | 156 : connection_id_(connection_id), sequence_number_(number) { |
| 154 } | 157 } |
| 155 | 158 |
| 156 virtual bool MatchAndExplain( | 159 virtual bool MatchAndExplain( |
| 157 const std::tr1::tuple<const char*, int> packet_buffer, | 160 const std::tr1::tuple<const char*, int> packet_buffer, |
| 158 testing::MatchResultListener* /* listener */) const { | 161 testing::MatchResultListener* /* listener */) const { |
| 159 FramerVisitorCapturingPublicReset visitor; | 162 FramerVisitorCapturingPublicReset visitor; |
| 160 QuicFramer framer(QuicSupportedVersions(), | 163 QuicFramer framer(QuicSupportedVersions(), |
| 161 QuicTime::Zero(), | 164 QuicTime::Zero(), |
| 162 false); | 165 false); |
| 163 framer.set_visitor(&visitor); | 166 framer.set_visitor(&visitor); |
| 164 QuicEncryptedPacket encrypted(std::tr1::get<0>(packet_buffer), | 167 QuicEncryptedPacket encrypted(std::tr1::get<0>(packet_buffer), |
| 165 std::tr1::get<1>(packet_buffer)); | 168 std::tr1::get<1>(packet_buffer)); |
| 166 framer.ProcessPacket(encrypted); | 169 framer.ProcessPacket(encrypted); |
| 167 QuicPublicResetPacket packet = visitor.public_reset_packet(); | 170 QuicPublicResetPacket packet = visitor.public_reset_packet(); |
| 168 return guid_ == packet.public_header.guid && | 171 return connection_id_ == packet.public_header.connection_id && |
| 169 packet.public_header.reset_flag && !packet.public_header.version_flag && | 172 packet.public_header.reset_flag && !packet.public_header.version_flag && |
| 170 sequence_number_ == packet.rejected_sequence_number && | 173 sequence_number_ == packet.rejected_sequence_number && |
| 171 net::test::TestPeerIPAddress() == packet.client_address.address() && | 174 net::test::TestPeerIPAddress() == packet.client_address.address() && |
| 172 kTestPort == packet.client_address.port(); | 175 kTestPort == packet.client_address.port(); |
| 173 } | 176 } |
| 174 | 177 |
| 175 virtual void DescribeTo(::std::ostream* os) const { } | 178 virtual void DescribeTo(::std::ostream* os) const { } |
| 176 | 179 |
| 177 virtual void DescribeNegationTo(::std::ostream* os) const { } | 180 virtual void DescribeNegationTo(::std::ostream* os) const { } |
| 178 | 181 |
| 179 private: | 182 private: |
| 180 QuicGuid guid_; | 183 QuicConnectionId connection_id_; |
| 181 QuicPacketSequenceNumber sequence_number_; | 184 QuicPacketSequenceNumber sequence_number_; |
| 182 }; | 185 }; |
| 183 | 186 |
| 184 | 187 |
| 185 Matcher<const std::tr1::tuple<const char*, int> > PublicResetPacketEq( | 188 Matcher<const std::tr1::tuple<const char*, int> > PublicResetPacketEq( |
| 186 QuicGuid guid, | 189 QuicConnectionId connection_id, |
| 187 QuicPacketSequenceNumber sequence_number) { | 190 QuicPacketSequenceNumber sequence_number) { |
| 188 return MakeMatcher(new ValidatePublicResetPacketPredicate(guid, | 191 return MakeMatcher(new ValidatePublicResetPacketPredicate(connection_id, |
| 189 sequence_number)); | 192 sequence_number)); |
| 190 } | 193 } |
| 191 | 194 |
| 192 TEST_F(QuicTimeWaitListManagerTest, CheckGuidInTimeWait) { | 195 TEST_F(QuicTimeWaitListManagerTest, CheckConnectionIdInTimeWait) { |
| 193 EXPECT_FALSE(IsGuidInTimeWait(guid_)); | 196 EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_)); |
| 194 AddGuid(guid_); | 197 AddConnectionId(connection_id_); |
| 195 EXPECT_TRUE(IsGuidInTimeWait(guid_)); | 198 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
| 196 } | 199 } |
| 197 | 200 |
| 198 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { | 201 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { |
| 199 size_t kConnectionCloseLength = 100; | 202 size_t kConnectionCloseLength = 100; |
| 200 AddGuid(guid_, | 203 AddConnectionId( |
| 201 net::test::QuicVersionMax(), | 204 connection_id_, |
| 202 new QuicEncryptedPacket( | 205 net::test::QuicVersionMax(), |
| 203 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 206 new QuicEncryptedPacket( |
| 207 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
| 204 const int kRandomSequenceNumber = 1; | 208 const int kRandomSequenceNumber = 1; |
| 205 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, | 209 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, |
| 206 server_address_.address(), | 210 server_address_.address(), |
| 207 client_address_)) | 211 client_address_)) |
| 208 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 212 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
| 209 | 213 |
| 210 ProcessPacket(guid_, kRandomSequenceNumber); | 214 ProcessPacket(connection_id_, kRandomSequenceNumber); |
| 211 } | 215 } |
| 212 | 216 |
| 213 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { | 217 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { |
| 214 AddGuid(guid_); | 218 AddConnectionId(connection_id_); |
| 215 const int kRandomSequenceNumber = 1; | 219 const int kRandomSequenceNumber = 1; |
| 216 EXPECT_CALL(writer_, WritePacket(_, _, | 220 EXPECT_CALL(writer_, WritePacket(_, _, |
| 217 server_address_.address(), | 221 server_address_.address(), |
| 218 client_address_)) | 222 client_address_)) |
| 219 .With(Args<0, 1>(PublicResetPacketEq(guid_, | 223 .With(Args<0, 1>(PublicResetPacketEq(connection_id_, |
| 220 kRandomSequenceNumber))) | 224 kRandomSequenceNumber))) |
| 221 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); | 225 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); |
| 222 | 226 |
| 223 ProcessPacket(guid_, kRandomSequenceNumber); | 227 ProcessPacket(connection_id_, kRandomSequenceNumber); |
| 224 } | 228 } |
| 225 | 229 |
| 226 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { | 230 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { |
| 227 AddGuid(guid_); | 231 AddConnectionId(connection_id_); |
| 228 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) { | 232 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) { |
| 229 if ((sequence_number & (sequence_number - 1)) == 0) { | 233 if ((sequence_number & (sequence_number - 1)) == 0) { |
| 230 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) | 234 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) |
| 231 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 235 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
| 232 } | 236 } |
| 233 ProcessPacket(guid_, sequence_number); | 237 ProcessPacket(connection_id_, sequence_number); |
| 234 // Send public reset with exponential back off. | 238 // Send public reset with exponential back off. |
| 235 if ((sequence_number & (sequence_number - 1)) == 0) { | 239 if ((sequence_number & (sequence_number - 1)) == 0) { |
| 236 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 240 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
| 237 &time_wait_list_manager_, sequence_number)); | 241 &time_wait_list_manager_, sequence_number)); |
| 238 } else { | 242 } else { |
| 239 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 243 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
| 240 &time_wait_list_manager_, sequence_number)); | 244 &time_wait_list_manager_, sequence_number)); |
| 241 } | 245 } |
| 242 } | 246 } |
| 243 } | 247 } |
| 244 | 248 |
| 245 TEST_F(QuicTimeWaitListManagerTest, CleanUpOldGuids) { | 249 TEST_F(QuicTimeWaitListManagerTest, CleanUpOldConnectionIds) { |
| 246 const int kGuidCount = 100; | 250 const int kConnectionIdCount = 100; |
| 247 const int kOldGuidCount = 31; | 251 const int kOldConnectionIdCount = 31; |
| 248 | 252 |
| 249 // Add guids such that their expiry time is kTimeWaitPeriod_. | 253 // Add connection_ids such that their expiry time is kTimeWaitPeriod_. |
| 250 epoll_server_.set_now_in_usec(0); | 254 epoll_server_.set_now_in_usec(0); |
| 251 for (int guid = 1; guid <= kOldGuidCount; ++guid) { | 255 for (int connection_id = 1; |
| 252 AddGuid(guid); | 256 connection_id <= kOldConnectionIdCount; |
| 257 ++connection_id) { |
| 258 AddConnectionId(connection_id); |
| 253 } | 259 } |
| 254 | 260 |
| 255 // Add remaining guids such that their add time is 2 * kTimeWaitPeriod. | 261 // Add remaining connection_ids such that their add time is |
| 262 // 2 * kTimeWaitPeriod. |
| 256 const QuicTime::Delta time_wait_period = | 263 const QuicTime::Delta time_wait_period = |
| 257 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); | 264 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); |
| 258 epoll_server_.set_now_in_usec(time_wait_period.ToMicroseconds()); | 265 epoll_server_.set_now_in_usec(time_wait_period.ToMicroseconds()); |
| 259 for (int guid = kOldGuidCount + 1; guid <= kGuidCount; ++guid) { | 266 for (int connection_id = kOldConnectionIdCount + 1; |
| 260 AddGuid(guid); | 267 connection_id <= kConnectionIdCount; |
| 268 ++connection_id) { |
| 269 AddConnectionId(connection_id); |
| 261 } | 270 } |
| 262 | 271 |
| 263 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); | 272 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); |
| 264 // Now set the current time as time_wait_period + offset usecs. | 273 // Now set the current time as time_wait_period + offset usecs. |
| 265 epoll_server_.set_now_in_usec(time_wait_period.Add(offset).ToMicroseconds()); | 274 epoll_server_.set_now_in_usec(time_wait_period.Add(offset).ToMicroseconds()); |
| 266 // After all the old guids are cleaned up, check the next alarm interval. | 275 // After all the old connection_ids are cleaned up, check the next alarm |
| 276 // interval. |
| 267 int64 next_alarm_time = epoll_server_.ApproximateNowInUsec() + | 277 int64 next_alarm_time = epoll_server_.ApproximateNowInUsec() + |
| 268 time_wait_period.Subtract(offset).ToMicroseconds(); | 278 time_wait_period.Subtract(offset).ToMicroseconds(); |
| 269 EXPECT_CALL(epoll_server_, RegisterAlarm(next_alarm_time, _)); | 279 EXPECT_CALL(epoll_server_, RegisterAlarm(next_alarm_time, _)); |
| 270 | 280 |
| 271 time_wait_list_manager_.CleanUpOldGuids(); | 281 time_wait_list_manager_.CleanUpOldConnectionIds(); |
| 272 for (int guid = 1; guid <= kGuidCount; ++guid) { | 282 for (int connection_id = 1; |
| 273 EXPECT_EQ(guid > kOldGuidCount, IsGuidInTimeWait(guid)) | 283 connection_id <= kConnectionIdCount; |
| 274 << "kOldGuidCount: " << kOldGuidCount | 284 ++connection_id) { |
| 275 << " guid: " << guid; | 285 EXPECT_EQ(connection_id > kOldConnectionIdCount, |
| 286 IsConnectionIdInTimeWait(connection_id)) |
| 287 << "kOldConnectionIdCount: " << kOldConnectionIdCount |
| 288 << " connection_id: " << connection_id; |
| 276 } | 289 } |
| 277 } | 290 } |
| 278 | 291 |
| 279 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { | 292 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { |
| 280 QuicGuid guid = 1; | 293 QuicConnectionId connection_id = 1; |
| 281 AddGuid(guid); | 294 AddConnectionId(connection_id); |
| 282 QuicPacketSequenceNumber sequence_number = 234; | 295 QuicPacketSequenceNumber sequence_number = 234; |
| 283 scoped_ptr<QuicEncryptedPacket> packet( | 296 scoped_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket( |
| 284 ConstructEncryptedPacket(ENCRYPTION_NONE, guid, sequence_number)); | 297 ENCRYPTION_NONE, connection_id, sequence_number)); |
| 285 // Let first write through. | 298 // Let first write through. |
| 286 EXPECT_CALL(writer_, WritePacket(_, _, | 299 EXPECT_CALL(writer_, WritePacket(_, _, |
| 287 server_address_.address(), | 300 server_address_.address(), |
| 288 client_address_)) | 301 client_address_)) |
| 289 .With(Args<0, 1>(PublicResetPacketEq(guid, | 302 .With(Args<0, 1>(PublicResetPacketEq(connection_id, |
| 290 sequence_number))) | 303 sequence_number))) |
| 291 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 304 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
| 292 ProcessPacket(guid, sequence_number); | 305 ProcessPacket(connection_id, sequence_number); |
| 293 | 306 |
| 294 // write block for the next packet. | 307 // write block for the next packet. |
| 295 EXPECT_CALL(writer_, WritePacket(_, _, | 308 EXPECT_CALL(writer_, WritePacket(_, _, |
| 296 server_address_.address(), | 309 server_address_.address(), |
| 297 client_address_)) | 310 client_address_)) |
| 298 .With(Args<0, 1>(PublicResetPacketEq(guid, | 311 .With(Args<0, 1>(PublicResetPacketEq(connection_id, |
| 299 sequence_number))) | 312 sequence_number))) |
| 300 .WillOnce(DoAll( | 313 .WillOnce(DoAll( |
| 301 Assign(&writer_is_blocked_, true), | 314 Assign(&writer_is_blocked_, true), |
| 302 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); | 315 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); |
| 303 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 316 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
| 304 ProcessPacket(guid, sequence_number); | 317 ProcessPacket(connection_id, sequence_number); |
| 305 // 3rd packet. No public reset should be sent; | 318 // 3rd packet. No public reset should be sent; |
| 306 ProcessPacket(guid, sequence_number); | 319 ProcessPacket(connection_id, sequence_number); |
| 307 | 320 |
| 308 // write packet should not be called since we are write blocked but the | 321 // write packet should not be called since we are write blocked but the |
| 309 // should be queued. | 322 // should be queued. |
| 310 QuicGuid other_guid = 2; | 323 QuicConnectionId other_connection_id = 2; |
| 311 AddGuid(other_guid); | 324 AddConnectionId(other_connection_id); |
| 312 QuicPacketSequenceNumber other_sequence_number = 23423; | 325 QuicPacketSequenceNumber other_sequence_number = 23423; |
| 313 scoped_ptr<QuicEncryptedPacket> other_packet( | 326 scoped_ptr<QuicEncryptedPacket> other_packet( |
| 314 ConstructEncryptedPacket( | 327 ConstructEncryptedPacket( |
| 315 ENCRYPTION_NONE, other_guid, other_sequence_number)); | 328 ENCRYPTION_NONE, other_connection_id, other_sequence_number)); |
| 316 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) | 329 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) |
| 317 .Times(0); | 330 .Times(0); |
| 318 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 331 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
| 319 ProcessPacket(other_guid, other_sequence_number); | 332 ProcessPacket(other_connection_id, other_sequence_number); |
| 320 | 333 |
| 321 // Now expect all the write blocked public reset packets to be sent again. | 334 // Now expect all the write blocked public reset packets to be sent again. |
| 322 writer_is_blocked_ = false; | 335 writer_is_blocked_ = false; |
| 323 EXPECT_CALL(writer_, WritePacket(_, _, | 336 EXPECT_CALL(writer_, WritePacket(_, _, |
| 324 server_address_.address(), | 337 server_address_.address(), |
| 325 client_address_)) | 338 client_address_)) |
| 326 .With(Args<0, 1>(PublicResetPacketEq(guid, | 339 .With(Args<0, 1>(PublicResetPacketEq(connection_id, |
| 327 sequence_number))) | 340 sequence_number))) |
| 328 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 341 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
| 329 EXPECT_CALL(writer_, WritePacket(_, _, | 342 EXPECT_CALL(writer_, WritePacket(_, _, |
| 330 server_address_.address(), | 343 server_address_.address(), |
| 331 client_address_)) | 344 client_address_)) |
| 332 .With(Args<0, 1>(PublicResetPacketEq(other_guid, | 345 .With(Args<0, 1>(PublicResetPacketEq(other_connection_id, |
| 333 other_sequence_number))) | 346 other_sequence_number))) |
| 334 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, | 347 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, |
| 335 other_packet->length()))); | 348 other_packet->length()))); |
| 336 time_wait_list_manager_.OnCanWrite(); | 349 time_wait_list_manager_.OnCanWrite(); |
| 337 } | 350 } |
| 338 | 351 |
| 339 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { | 352 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { |
| 340 const int kGuid1 = 123; | 353 const int kConnectionId1 = 123; |
| 341 const int kGuid2 = 456; | 354 const int kConnectionId2 = 456; |
| 342 const int kGuid3 = 789; | 355 const int kConnectionId3 = 789; |
| 343 | 356 |
| 344 AddGuid(kGuid1, net::test::QuicVersionMin(), NULL); | 357 AddConnectionId(kConnectionId1, net::test::QuicVersionMin(), NULL); |
| 345 AddGuid(kGuid2, net::test::QuicVersionMax(), NULL); | 358 AddConnectionId(kConnectionId2, net::test::QuicVersionMax(), NULL); |
| 346 AddGuid(kGuid3, net::test::QuicVersionMax(), NULL); | 359 AddConnectionId(kConnectionId3, net::test::QuicVersionMax(), NULL); |
| 347 | 360 |
| 348 EXPECT_EQ(net::test::QuicVersionMin(), | 361 EXPECT_EQ(net::test::QuicVersionMin(), |
| 349 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid( | 362 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( |
| 350 &time_wait_list_manager_, kGuid1)); | 363 &time_wait_list_manager_, kConnectionId1)); |
| 351 EXPECT_EQ(net::test::QuicVersionMax(), | 364 EXPECT_EQ(net::test::QuicVersionMax(), |
| 352 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid( | 365 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( |
| 353 &time_wait_list_manager_, kGuid2)); | 366 &time_wait_list_manager_, kConnectionId2)); |
| 354 EXPECT_EQ(net::test::QuicVersionMax(), | 367 EXPECT_EQ(net::test::QuicVersionMax(), |
| 355 QuicTimeWaitListManagerPeer::GetQuicVersionFromGuid( | 368 QuicTimeWaitListManagerPeer::GetQuicVersionFromConnectionId( |
| 356 &time_wait_list_manager_, kGuid3)); | 369 &time_wait_list_manager_, kConnectionId3)); |
| 357 } | 370 } |
| 358 | 371 |
| 359 TEST_F(QuicTimeWaitListManagerTest, AddGuidTwice) { | 372 TEST_F(QuicTimeWaitListManagerTest, AddConnectionIdTwice) { |
| 360 // Add guids such that their expiry time is kTimeWaitPeriod_. | 373 // Add connection_ids such that their expiry time is kTimeWaitPeriod_. |
| 361 epoll_server_.set_now_in_usec(0); | 374 epoll_server_.set_now_in_usec(0); |
| 362 AddGuid(guid_); | 375 AddConnectionId(connection_id_); |
| 363 EXPECT_TRUE(IsGuidInTimeWait(guid_)); | 376 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
| 364 size_t kConnectionCloseLength = 100; | 377 size_t kConnectionCloseLength = 100; |
| 365 AddGuid(guid_, | 378 AddConnectionId( |
| 366 net::test::QuicVersionMax(), | 379 connection_id_, |
| 367 new QuicEncryptedPacket( | 380 net::test::QuicVersionMax(), |
| 368 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 381 new QuicEncryptedPacket( |
| 369 EXPECT_TRUE(IsGuidInTimeWait(guid_)); | 382 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
| 383 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
| 370 | 384 |
| 371 EXPECT_CALL(writer_, WritePacket(_, | 385 EXPECT_CALL(writer_, WritePacket(_, |
| 372 kConnectionCloseLength, | 386 kConnectionCloseLength, |
| 373 server_address_.address(), | 387 server_address_.address(), |
| 374 client_address_)) | 388 client_address_)) |
| 375 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 389 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
| 376 | 390 |
| 377 const int kRandomSequenceNumber = 1; | 391 const int kRandomSequenceNumber = 1; |
| 378 ProcessPacket(guid_, kRandomSequenceNumber); | 392 ProcessPacket(connection_id_, kRandomSequenceNumber); |
| 379 | 393 |
| 380 const QuicTime::Delta time_wait_period = | 394 const QuicTime::Delta time_wait_period = |
| 381 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); | 395 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); |
| 382 | 396 |
| 383 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); | 397 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); |
| 384 // Now set the current time as time_wait_period + offset usecs. | 398 // Now set the current time as time_wait_period + offset usecs. |
| 385 epoll_server_.set_now_in_usec(time_wait_period.Add(offset).ToMicroseconds()); | 399 epoll_server_.set_now_in_usec(time_wait_period.Add(offset).ToMicroseconds()); |
| 386 // After the guids are cleaned up, check the next alarm interval. | 400 // After the connection_ids are cleaned up, check the next alarm interval. |
| 387 int64 next_alarm_time = epoll_server_.ApproximateNowInUsec() + | 401 int64 next_alarm_time = epoll_server_.ApproximateNowInUsec() + |
| 388 time_wait_period.ToMicroseconds(); | 402 time_wait_period.ToMicroseconds(); |
| 389 | 403 |
| 390 EXPECT_CALL(epoll_server_, RegisterAlarm(next_alarm_time, _)); | 404 EXPECT_CALL(epoll_server_, RegisterAlarm(next_alarm_time, _)); |
| 391 time_wait_list_manager_.CleanUpOldGuids(); | 405 time_wait_list_manager_.CleanUpOldConnectionIds(); |
| 392 EXPECT_FALSE(IsGuidInTimeWait(guid_)); | 406 EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_)); |
| 393 } | 407 } |
| 394 | 408 |
| 395 TEST_F(QuicTimeWaitListManagerTest, GuidsOrderedByTime) { | 409 TEST_F(QuicTimeWaitListManagerTest, ConnectionIdsOrderedByTime) { |
| 396 // Simple randomization: the values of guids are swapped based on the current | 410 // Simple randomization: the values of connection_ids are swapped based on the |
| 397 // seconds on the clock. If the container is broken, the test will be 50% | 411 // current seconds on the clock. If the container is broken, the test will be |
| 398 // flaky. | 412 // 50% flaky. |
| 399 int odd_second = static_cast<int>(epoll_server_.ApproximateNowInUsec()) % 2; | 413 int odd_second = static_cast<int>(epoll_server_.ApproximateNowInUsec()) % 2; |
| 400 EXPECT_TRUE(odd_second == 0 || odd_second == 1); | 414 EXPECT_TRUE(odd_second == 0 || odd_second == 1); |
| 401 const QuicGuid kGuid1 = odd_second; | 415 const QuicConnectionId kConnectionId1 = odd_second; |
| 402 const QuicGuid kGuid2 = 1 - odd_second; | 416 const QuicConnectionId kConnectionId2 = 1 - odd_second; |
| 403 | 417 |
| 404 // 1 will hash lower than 2, but we add it later. They should come out in the | 418 // 1 will hash lower than 2, but we add it later. They should come out in the |
| 405 // add order, not hash order. | 419 // add order, not hash order. |
| 406 epoll_server_.set_now_in_usec(0); | 420 epoll_server_.set_now_in_usec(0); |
| 407 AddGuid(kGuid1); | 421 AddConnectionId(kConnectionId1); |
| 408 epoll_server_.set_now_in_usec(10); | 422 epoll_server_.set_now_in_usec(10); |
| 409 AddGuid(kGuid2); | 423 AddConnectionId(kConnectionId2); |
| 410 | 424 |
| 411 const QuicTime::Delta time_wait_period = | 425 const QuicTime::Delta time_wait_period = |
| 412 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); | 426 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); |
| 413 epoll_server_.set_now_in_usec(time_wait_period.ToMicroseconds() + 1); | 427 epoll_server_.set_now_in_usec(time_wait_period.ToMicroseconds() + 1); |
| 414 | 428 |
| 415 EXPECT_CALL(epoll_server_, RegisterAlarm(_, _)); | 429 EXPECT_CALL(epoll_server_, RegisterAlarm(_, _)); |
| 416 | 430 |
| 417 time_wait_list_manager_.CleanUpOldGuids(); | 431 time_wait_list_manager_.CleanUpOldConnectionIds(); |
| 418 EXPECT_FALSE(IsGuidInTimeWait(kGuid1)); | 432 EXPECT_FALSE(IsConnectionIdInTimeWait(kConnectionId1)); |
| 419 EXPECT_TRUE(IsGuidInTimeWait(kGuid2)); | 433 EXPECT_TRUE(IsConnectionIdInTimeWait(kConnectionId2)); |
| 420 } | 434 } |
| 421 } // namespace | 435 } // namespace |
| 422 } // namespace test | 436 } // namespace test |
| 423 } // namespace tools | 437 } // namespace tools |
| 424 } // namespace net | 438 } // namespace net |
| OLD | NEW |