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 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { | 224 TEST_F(QuicTimeWaitListManagerTest, SendConnectionClose) { |
225 size_t kConnectionCloseLength = 100; | 225 size_t kConnectionCloseLength = 100; |
226 AddConnectionId( | 226 AddConnectionId( |
227 connection_id_, | 227 connection_id_, |
228 QuicVersionMax(), | 228 QuicVersionMax(), |
229 new QuicEncryptedPacket( | 229 new QuicEncryptedPacket( |
230 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 230 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
231 const int kRandomSequenceNumber = 1; | 231 const int kRandomSequenceNumber = 1; |
232 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, | 232 EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength, |
233 server_address_.address(), | 233 server_address_.address(), |
234 client_address_)) | 234 client_address_, |
| 235 _)) |
235 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 236 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
236 | 237 |
237 ProcessPacket(connection_id_, kRandomSequenceNumber); | 238 ProcessPacket(connection_id_, kRandomSequenceNumber); |
238 } | 239 } |
239 | 240 |
240 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { | 241 TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) { |
241 AddConnectionId(connection_id_); | 242 AddConnectionId(connection_id_); |
242 const int kRandomSequenceNumber = 1; | 243 const int kRandomSequenceNumber = 1; |
243 EXPECT_CALL(writer_, WritePacket(_, _, | 244 EXPECT_CALL(writer_, WritePacket(_, _, |
244 server_address_.address(), | 245 server_address_.address(), |
245 client_address_)) | 246 client_address_, |
| 247 _)) |
246 .With(Args<0, 1>(PublicResetPacketEq(connection_id_, | 248 .With(Args<0, 1>(PublicResetPacketEq(connection_id_, |
247 kRandomSequenceNumber))) | 249 kRandomSequenceNumber))) |
248 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); | 250 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0))); |
249 | 251 |
250 ProcessPacket(connection_id_, kRandomSequenceNumber); | 252 ProcessPacket(connection_id_, kRandomSequenceNumber); |
251 } | 253 } |
252 | 254 |
253 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { | 255 TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) { |
254 AddConnectionId(connection_id_); | 256 AddConnectionId(connection_id_); |
255 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) { | 257 for (int sequence_number = 1; sequence_number < 101; ++sequence_number) { |
256 if ((sequence_number & (sequence_number - 1)) == 0) { | 258 if ((sequence_number & (sequence_number - 1)) == 0) { |
257 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) | 259 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)) |
258 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 260 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
259 } | 261 } |
260 ProcessPacket(connection_id_, sequence_number); | 262 ProcessPacket(connection_id_, sequence_number); |
261 // Send public reset with exponential back off. | 263 // Send public reset with exponential back off. |
262 if ((sequence_number & (sequence_number - 1)) == 0) { | 264 if ((sequence_number & (sequence_number - 1)) == 0) { |
263 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 265 EXPECT_TRUE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
264 &time_wait_list_manager_, sequence_number)); | 266 &time_wait_list_manager_, sequence_number)); |
265 } else { | 267 } else { |
266 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( | 268 EXPECT_FALSE(QuicTimeWaitListManagerPeer::ShouldSendResponse( |
267 &time_wait_list_manager_, sequence_number)); | 269 &time_wait_list_manager_, sequence_number)); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 | 316 |
315 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { | 317 TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) { |
316 QuicConnectionId connection_id = 1; | 318 QuicConnectionId connection_id = 1; |
317 AddConnectionId(connection_id); | 319 AddConnectionId(connection_id); |
318 QuicPacketSequenceNumber sequence_number = 234; | 320 QuicPacketSequenceNumber sequence_number = 234; |
319 scoped_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket( | 321 scoped_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket( |
320 ENCRYPTION_NONE, connection_id, sequence_number)); | 322 ENCRYPTION_NONE, connection_id, sequence_number)); |
321 // Let first write through. | 323 // Let first write through. |
322 EXPECT_CALL(writer_, WritePacket(_, _, | 324 EXPECT_CALL(writer_, WritePacket(_, _, |
323 server_address_.address(), | 325 server_address_.address(), |
324 client_address_)) | 326 client_address_, |
| 327 _)) |
325 .With(Args<0, 1>(PublicResetPacketEq(connection_id, | 328 .With(Args<0, 1>(PublicResetPacketEq(connection_id, |
326 sequence_number))) | 329 sequence_number))) |
327 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 330 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
328 ProcessPacket(connection_id, sequence_number); | 331 ProcessPacket(connection_id, sequence_number); |
329 | 332 |
330 // write block for the next packet. | 333 // write block for the next packet. |
331 EXPECT_CALL(writer_, WritePacket(_, _, | 334 EXPECT_CALL(writer_, WritePacket(_, _, |
332 server_address_.address(), | 335 server_address_.address(), |
333 client_address_)) | 336 client_address_, |
| 337 _)) |
334 .With(Args<0, 1>(PublicResetPacketEq(connection_id, | 338 .With(Args<0, 1>(PublicResetPacketEq(connection_id, |
335 sequence_number))) | 339 sequence_number))) |
336 .WillOnce(DoAll( | 340 .WillOnce(DoAll( |
337 Assign(&writer_is_blocked_, true), | 341 Assign(&writer_is_blocked_, true), |
338 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); | 342 Return(WriteResult(WRITE_STATUS_BLOCKED, EAGAIN)))); |
339 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 343 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
340 ProcessPacket(connection_id, sequence_number); | 344 ProcessPacket(connection_id, sequence_number); |
341 // 3rd packet. No public reset should be sent; | 345 // 3rd packet. No public reset should be sent; |
342 ProcessPacket(connection_id, sequence_number); | 346 ProcessPacket(connection_id, sequence_number); |
343 | 347 |
344 // write packet should not be called since we are write blocked but the | 348 // write packet should not be called since we are write blocked but the |
345 // should be queued. | 349 // should be queued. |
346 QuicConnectionId other_connection_id = 2; | 350 QuicConnectionId other_connection_id = 2; |
347 AddConnectionId(other_connection_id); | 351 AddConnectionId(other_connection_id); |
348 QuicPacketSequenceNumber other_sequence_number = 23423; | 352 QuicPacketSequenceNumber other_sequence_number = 23423; |
349 scoped_ptr<QuicEncryptedPacket> other_packet( | 353 scoped_ptr<QuicEncryptedPacket> other_packet( |
350 ConstructEncryptedPacket( | 354 ConstructEncryptedPacket( |
351 ENCRYPTION_NONE, other_connection_id, other_sequence_number)); | 355 ENCRYPTION_NONE, other_connection_id, other_sequence_number)); |
352 EXPECT_CALL(writer_, WritePacket(_, _, _, _)) | 356 EXPECT_CALL(writer_, WritePacket(_, _, _, _, _)) |
353 .Times(0); | 357 .Times(0); |
354 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); | 358 EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_)); |
355 ProcessPacket(other_connection_id, other_sequence_number); | 359 ProcessPacket(other_connection_id, other_sequence_number); |
356 | 360 |
357 // Now expect all the write blocked public reset packets to be sent again. | 361 // Now expect all the write blocked public reset packets to be sent again. |
358 writer_is_blocked_ = false; | 362 writer_is_blocked_ = false; |
359 EXPECT_CALL(writer_, WritePacket(_, _, | 363 EXPECT_CALL(writer_, WritePacket(_, _, |
360 server_address_.address(), | 364 server_address_.address(), |
361 client_address_)) | 365 client_address_, |
| 366 _)) |
362 .With(Args<0, 1>(PublicResetPacketEq(connection_id, | 367 .With(Args<0, 1>(PublicResetPacketEq(connection_id, |
363 sequence_number))) | 368 sequence_number))) |
364 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); | 369 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, packet->length()))); |
365 EXPECT_CALL(writer_, WritePacket(_, _, | 370 EXPECT_CALL(writer_, WritePacket(_, _, |
366 server_address_.address(), | 371 server_address_.address(), |
367 client_address_)) | 372 client_address_, |
| 373 _)) |
368 .With(Args<0, 1>(PublicResetPacketEq(other_connection_id, | 374 .With(Args<0, 1>(PublicResetPacketEq(other_connection_id, |
369 other_sequence_number))) | 375 other_sequence_number))) |
370 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, | 376 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, |
371 other_packet->length()))); | 377 other_packet->length()))); |
372 time_wait_list_manager_.OnCanWrite(); | 378 time_wait_list_manager_.OnCanWrite(); |
373 } | 379 } |
374 | 380 |
375 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { | 381 TEST_F(QuicTimeWaitListManagerTest, GetQuicVersionFromMap) { |
376 const int kConnectionId1 = 123; | 382 const int kConnectionId1 = 123; |
377 const int kConnectionId2 = 456; | 383 const int kConnectionId2 = 456; |
(...skipping 23 matching lines...) Expand all Loading... |
401 AddConnectionId( | 407 AddConnectionId( |
402 connection_id_, | 408 connection_id_, |
403 QuicVersionMax(), | 409 QuicVersionMax(), |
404 new QuicEncryptedPacket( | 410 new QuicEncryptedPacket( |
405 new char[kConnectionCloseLength], kConnectionCloseLength, true)); | 411 new char[kConnectionCloseLength], kConnectionCloseLength, true)); |
406 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); | 412 EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_)); |
407 | 413 |
408 EXPECT_CALL(writer_, WritePacket(_, | 414 EXPECT_CALL(writer_, WritePacket(_, |
409 kConnectionCloseLength, | 415 kConnectionCloseLength, |
410 server_address_.address(), | 416 server_address_.address(), |
411 client_address_)) | 417 client_address_, |
| 418 _)) |
412 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); | 419 .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1))); |
413 | 420 |
414 const int kRandomSequenceNumber = 1; | 421 const int kRandomSequenceNumber = 1; |
415 ProcessPacket(connection_id_, kRandomSequenceNumber); | 422 ProcessPacket(connection_id_, kRandomSequenceNumber); |
416 | 423 |
417 const QuicTime::Delta time_wait_period = | 424 const QuicTime::Delta time_wait_period = |
418 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); | 425 QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_); |
419 | 426 |
420 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); | 427 QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39); |
421 // Now set the current time as time_wait_period + offset usecs. | 428 // Now set the current time as time_wait_period + offset usecs. |
(...skipping 30 matching lines...) Expand all Loading... |
452 EXPECT_CALL(epoll_server_, RegisterAlarm(_, _)); | 459 EXPECT_CALL(epoll_server_, RegisterAlarm(_, _)); |
453 | 460 |
454 time_wait_list_manager_.CleanUpOldConnectionIds(); | 461 time_wait_list_manager_.CleanUpOldConnectionIds(); |
455 EXPECT_FALSE(IsConnectionIdInTimeWait(kConnectionId1)); | 462 EXPECT_FALSE(IsConnectionIdInTimeWait(kConnectionId1)); |
456 EXPECT_TRUE(IsConnectionIdInTimeWait(kConnectionId2)); | 463 EXPECT_TRUE(IsConnectionIdInTimeWait(kConnectionId2)); |
457 } | 464 } |
458 } // namespace | 465 } // namespace |
459 } // namespace test | 466 } // namespace test |
460 } // namespace tools | 467 } // namespace tools |
461 } // namespace net | 468 } // namespace net |
OLD | NEW |