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 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { | 222 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { |
223 const size_t kConnectionCloseLength = 100; | 223 const size_t kConnectionCloseLength = 100; |
224 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); | 224 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
225 std::vector<QuicEncryptedPacket*> termination_packets; | 225 std::vector<QuicEncryptedPacket*> termination_packets; |
226 termination_packets.push_back(new QuicEncryptedPacket( | 226 termination_packets.push_back(new QuicEncryptedPacket( |
227 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 227 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
228 AddConnectionId(connection_id_, QuicVersionMax(), | 228 AddConnectionId(connection_id_, QuicVersionMax(), |
229 /*connection_rejected_statelessly=*/false, | 229 /*connection_rejected_statelessly=*/false, |
230 &termination_packets); | 230 &termination_packets); |
231 const int kRandomSequenceNumber = 1; | 231 const int kRandomSequenceNumber = 1; |
232 EXPECT_CALL(writer_, | 232 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, |
233 WritePacket(_, kConnectionCloseLength, | 233 server_address_.address().bytes(), |
234 server_address_.address().bytes(), client_address_)) | 234 client_address_, _)) |
235 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 235 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
236 | 236 |
237 ProcessPacket(connection_id_, kRandomSequenceNumber); | 237 ProcessPacket(connection_id_, kRandomSequenceNumber); |
238 } | 238 } |
239 | 239 |
240 TEST_F(QuicTimeWaitListManagerTest, SendTwoConnectionCloses) { | 240 TEST_F(QuicTimeWaitListManagerTest, SendTwoConnectionCloses) { |
241 const size_t kConnectionCloseLength = 100; | 241 const size_t kConnectionCloseLength = 100; |
242 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); | 242 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
243 std::vector<QuicEncryptedPacket*> termination_packets; | 243 std::vector<QuicEncryptedPacket*> termination_packets; |
244 termination_packets.push_back(new QuicEncryptedPacket( | 244 termination_packets.push_back(new QuicEncryptedPacket( |
245 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 245 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
246 termination_packets.push_back(new QuicEncryptedPacket( | 246 termination_packets.push_back(new QuicEncryptedPacket( |
247 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 247 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
248 AddConnectionId(connection_id_, QuicVersionMax(), | 248 AddConnectionId(connection_id_, QuicVersionMax(), |
249 /*connection_rejected_statelessly=*/false, | 249 /*connection_rejected_statelessly=*/false, |
250 &termination_packets); | 250 &termination_packets); |
251 const int kRandomSequenceNumber = 1; | 251 const int kRandomSequenceNumber = 1; |
252 EXPECT_CALL(writer_, | 252 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, |
253 WritePacket(_, kConnectionCloseLength, | 253 server_address_.address().bytes(), |
254 server_address_.address().bytes(), client_address_)) | 254 client_address_, _)) |
255 .Times(2) | 255 .Times(2) |
256 .WillRepeatedly(Return(WriteResult(WRITE_STATUS_OK, 1))); | 256 .WillRepeatedly(Return(WriteResult(WRITE_STATUS_OK, 1))); |
257 | 257 |
258 ProcessPacket(connection_id_, kRandomSequenceNumber); | 258 ProcessPacket(connection_id_, kRandomSequenceNumber); |
259 } | 259 } |
260 | 260 |
261 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { | 261 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { |
262 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); | 262 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
263 AddConnectionId(connection_id_); | 263 AddConnectionId(connection_id_); |
264 const int kRandomSequenceNumber = 1; | 264 const int kRandomSequenceNumber = 1; |
265 EXPECT_CALL(writer_, WritePacket(_, _, server_address_.address().bytes(), | 265 EXPECT_CALL(writer_, WritePacket(_, _, server_address_.address().bytes(), |
266 client_address_)) | 266 client_address_, _)) |
267 .With(Args<0, 1>( | 267 .With(Args<0, 1>( |
268 PublicResetPacketEq(connection_id_, kRandomSequenceNumber))) | 268 PublicResetPacketEq(connection_id_, kRandomSequenceNumber))) |
269 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); | 269 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); |
270 | 270 |
271 ProcessPacket(connection_id_, kRandomSequenceNumber); | 271 ProcessPacket(connection_id_, kRandomSequenceNumber); |
272 } | 272 } |
273 | 273 |
274 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { | 274 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { |
275 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); | 275 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
276 AddConnectionId(connection_id_); | 276 AddConnectionId(connection_id_); |
277 EXPECT_EQ(1u, time_wait_list_manager_.num_connections()); | 277 EXPECT_EQ(1u, time_wait_list_manager_.num_connections()); |
278 for (int packet_number = 1; packet_number < 101; ++packet_number) { | 278 for (int packet_number = 1; packet_number < 101; ++packet_number) { |
279 if ((packet_number & (packet_number - 1)) == 0) { | 279 if ((packet_number & (packet_number - 1)) == 0) { |
280 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) | 280 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)) |
281 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 281 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
282 } | 282 } |
283 ProcessPacket(connection_id_, packet_number); | 283 ProcessPacket(connection_id_, packet_number); |
284 // Send public reset with exponential back off. | 284 // Send public reset with exponential back off. |
285 if ((packet_number & (packet_number - 1)) == 0) { | 285 if ((packet_number & (packet_number - 1)) == 0) { |
286 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 286 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
287 &time_wait_list_manager_, packet_number)); | 287 &time_wait_list_manager_, packet_number)); |
288 } else { | 288 } else { |
289 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 289 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
290 &time_wait_list_manager_, packet_number)); | 290 &time_wait_list_manager_, packet_number)); |
291 } | 291 } |
292 } | 292 } |
293 } | 293 } |
294 | 294 |
295 TEST_F(QuicTimeWaitListManagerTest, NoPublicResetForStatelessConnections) { | 295 TEST_F(QuicTimeWaitListManagerTest, NoPublicResetForStatelessConnections) { |
296 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); | 296 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_)); |
297 AddStatelessConnectionId(connection_id_); | 297 AddStatelessConnectionId(connection_id_); |
298 const int kRandomSequenceNumber = 1; | 298 const int kRandomSequenceNumber = 1; |
299 | 299 |
300 EXPECT_CALL(writer_, WritePacket(_, _, server_address_.address().bytes(), | 300 EXPECT_CALL(writer_, WritePacket(_, _, server_address_.address().bytes(), |
301 client_address_)) | 301 client_address_, _)) |
302 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 302 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
303 | 303 |
304 ProcessPacket(connection_id_, kRandomSequenceNumber); | 304 ProcessPacket(connection_id_, kRandomSequenceNumber); |
305 } | 305 } |
306 | 306 |
307 TEST_F(QuicTimeWaitListManagerTest, CleanUpOldConnectionIds) { | 307 TEST_F(QuicTimeWaitListManagerTest, CleanUpOldConnectionIds) { |
308 const size_t kConnectionIdCount = 100; | 308 const size_t kConnectionIdCount = 100; |
309 const size_t kOldConnectionIdCount = 31; | 309 const size_t kOldConnectionIdCount = 31; |
310 | 310 |
311 // Add connection_ids such that their expiry time is time_wait_period_. | 311 // Add connection_ids such that their expiry time is time_wait_period_. |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 | 358 |
359 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { | 359 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { |
360 QuicConnectionId connection_id = 1; | 360 QuicConnectionId connection_id = 1; |
361 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id)); | 361 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id)); |
362 AddConnectionId(connection_id); | 362 AddConnectionId(connection_id); |
363 QuicPacketNumber packet_number = 234; | 363 QuicPacketNumber packet_number = 234; |
364 scoped_ptr<QuicEncryptedPacket> packet( | 364 scoped_ptr<QuicEncryptedPacket> packet( |
365 ConstructEncryptedPacket(connection_id, packet_number)); | 365 ConstructEncryptedPacket(connection_id, packet_number)); |
366 // Let first write through. | 366 // Let first write through. |
367 EXPECT_CALL(writer_, WritePacket(_, _, server_address_.address().bytes(), | 367 EXPECT_CALL(writer_, WritePacket(_, _, server_address_.address().bytes(), |
368 client_address_)) | 368 client_address_, _)) |
369 .With(Args<0, 1>(PublicResetPacketEq(connection_id, packet_number))) | 369 .With(Args<0, 1>(PublicResetPacketEq(connection_id, packet_number))) |
370 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 370 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
371 ProcessPacket(connection_id, packet_number); | 371 ProcessPacket(connection_id, packet_number); |
372 | 372 |
373 // write block for the next packet. | 373 // write block for the next packet. |
374 EXPECT_CALL(writer_, WritePacket(_, _, server_address_.address().bytes(), | 374 EXPECT_CALL(writer_, WritePacket(_, _, server_address_.address().bytes(), |
375 client_address_)) | 375 client_address_, _)) |
376 .With(Args<0, 1>(PublicResetPacketEq(connection_id, packet_number))) | 376 .With(Args<0, 1>(PublicResetPacketEq(connection_id, packet_number))) |
377 .WillOnce(DoAll(Assign(&writer_is_blocked_, true), | 377 .WillOnce(DoAll(Assign(&writer_is_blocked_, true), |
378 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); | 378 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); |
379 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 379 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
380 ProcessPacket(connection_id, packet_number); | 380 ProcessPacket(connection_id, packet_number); |
381 // 3rd packet. No public reset should be sent; | 381 // 3rd packet. No public reset should be sent; |
382 ProcessPacket(connection_id, packet_number); | 382 ProcessPacket(connection_id, packet_number); |
383 | 383 |
384 // write packet should not be called since we are write blocked but the | 384 // write packet should not be called since we are write blocked but the |
385 // should be queued. | 385 // should be queued. |
386 QuicConnectionId other_connection_id = 2; | 386 QuicConnectionId other_connection_id = 2; |
387 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(other_connection_id)); | 387 EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(other_connection_id)); |
388 AddConnectionId(other_connection_id); | 388 AddConnectionId(other_connection_id); |
389 QuicPacketNumber other_packet_number = 23423; | 389 QuicPacketNumber other_packet_number = 23423; |
390 scoped_ptr<QuicEncryptedPacket> other_packet( | 390 scoped_ptr<QuicEncryptedPacket> other_packet( |
391 ConstructEncryptedPacket(other_connection_id, other_packet_number)); | 391 ConstructEncryptedPacket(other_connection_id, other_packet_number)); |
392 EXPECT_CALL(writer_, WritePacket(_, _, _, _)).Times(0); | 392 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)).Times(0); |
393 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 393 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
394 ProcessPacket(other_connection_id, other_packet_number); | 394 ProcessPacket(other_connection_id, other_packet_number); |
395 EXPECT_EQ(2u, time_wait_list_manager_.num_connections()); | 395 EXPECT_EQ(2u, time_wait_list_manager_.num_connections()); |
396 | 396 |
397 // Now expect all the write blocked public reset packets to be sent again. | 397 // Now expect all the write blocked public reset packets to be sent again. |
398 writer_is_blocked_ = false; | 398 writer_is_blocked_ = false; |
399 EXPECT_CALL(writer_, WritePacket(_, _, server_address_.address().bytes(), | 399 EXPECT_CALL(writer_, WritePacket(_, _, server_address_.address().bytes(), |
400 client_address_)) | 400 client_address_, _)) |
401 .With(Args<0, 1>(PublicResetPacketEq(connection_id, packet_number))) | 401 .With(Args<0, 1>(PublicResetPacketEq(connection_id, packet_number))) |
402 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 402 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
403 EXPECT_CALL(writer_, WritePacket(_, _, server_address_.address().bytes(), | 403 EXPECT_CALL(writer_, WritePacket(_, _, server_address_.address().bytes(), |
404 client_address_)) | 404 client_address_, _)) |
405 .With(Args<0, 1>( | 405 .With(Args<0, 1>( |
406 PublicResetPacketEq(other_connection_id, other_packet_number))) | 406 PublicResetPacketEq(other_connection_id, other_packet_number))) |
407 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, other_packet->length()))); | 407 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, other_packet->length()))); |
408 time_wait_list_manager_.OnCanWrite(); | 408 time_wait_list_manager_.OnCanWrite(); |
409 } | 409 } |
410 | 410 |
411 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { | 411 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { |
412 const int kConnectionId1 = 123; | 412 const int kConnectionId1 = 123; |
413 const int kConnectionId2 = 456; | 413 const int kConnectionId2 = 456; |
414 const int kConnectionId3 = 789; | 414 const int kConnectionId3 = 789; |
(...skipping 28 matching lines...) Expand all Loading... |
443 const size_t kConnectionCloseLength = 100; | 443 const size_t kConnectionCloseLength = 100; |
444 std::vector<QuicEncryptedPacket*> termination_packets; | 444 std::vector<QuicEncryptedPacket*> termination_packets; |
445 termination_packets.push_back(new QuicEncryptedPacket( | 445 termination_packets.push_back(new QuicEncryptedPacket( |
446 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 446 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
447 AddConnectionId(connection_id_, QuicVersionMax(), | 447 AddConnectionId(connection_id_, QuicVersionMax(), |
448 /*connection_rejected_statelessly=*/false, | 448 /*connection_rejected_statelessly=*/false, |
449 &termination_packets); | 449 &termination_packets); |
450 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); | 450 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
451 EXPECT_EQ(1u, time_wait_list_manager_.num_connections()); | 451 EXPECT_EQ(1u, time_wait_list_manager_.num_connections()); |
452 | 452 |
453 EXPECT_CALL(writer_, | 453 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, |
454 WritePacket(_, kConnectionCloseLength, | 454 server_address_.address().bytes(), |
455 server_address_.address().bytes(), client_address_)) | 455 client_address_, _)) |
456 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 456 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
457 | 457 |
458 const int kRandomSequenceNumber = 1; | 458 const int kRandomSequenceNumber = 1; |
459 ProcessPacket(connection_id_, kRandomSequenceNumber); | 459 ProcessPacket(connection_id_, kRandomSequenceNumber); |
460 | 460 |
461 const QuicTime::Delta time_wait_period = | 461 const QuicTime::Delta time_wait_period = |
462 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); | 462 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); |
463 | 463 |
464 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); | 464 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); |
465 // Now set the current time as time_wait_period + offset usecs. | 465 // Now set the current time as time_wait_period + offset usecs. |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 EXPECT_EQ(static_cast<size_t>(FLAGS_quic_time_wait_list_max_connections), | 539 EXPECT_EQ(static_cast<size_t>(FLAGS_quic_time_wait_list_max_connections), |
540 time_wait_list_manager_.num_connections()); | 540 time_wait_list_manager_.num_connections()); |
541 EXPECT_FALSE(IsConnectionIdInTimeWait(id_to_evict)); | 541 EXPECT_FALSE(IsConnectionIdInTimeWait(id_to_evict)); |
542 EXPECT_TRUE(IsConnectionIdInTimeWait(current_connection_id)); | 542 EXPECT_TRUE(IsConnectionIdInTimeWait(current_connection_id)); |
543 } | 543 } |
544 } | 544 } |
545 | 545 |
546 } // namespace | 546 } // namespace |
547 } // namespace test | 547 } // namespace test |
548 } // namespace net | 548 } // namespace net |
OLD | NEW |