| Index: net/tools/quic/quic_time_wait_list_manager_test.cc
|
| diff --git a/net/tools/quic/quic_time_wait_list_manager_test.cc b/net/tools/quic/quic_time_wait_list_manager_test.cc
|
| index 17c26d83074d1252e952004cebefcbfd078b0cfd..0bb9f82de5c69bc8f05579e15ee230773867be1a 100644
|
| --- a/net/tools/quic/quic_time_wait_list_manager_test.cc
|
| +++ b/net/tools/quic/quic_time_wait_list_manager_test.cc
|
| @@ -11,6 +11,7 @@
|
| #include "net/quic/crypto/quic_decrypter.h"
|
| #include "net/quic/crypto/quic_encrypter.h"
|
| #include "net/quic/quic_data_reader.h"
|
| +#include "net/quic/quic_flags.h"
|
| #include "net/quic/quic_framer.h"
|
| #include "net/quic/quic_packet_writer.h"
|
| #include "net/quic/quic_protocol.h"
|
| @@ -25,6 +26,7 @@ using net::test::BuildUnsizedDataPacket;
|
| using net::test::NoOpFramerVisitor;
|
| using net::test::QuicVersionMax;
|
| using net::test::QuicVersionMin;
|
| +using net::test::ValueRestore;
|
| using testing::Args;
|
| using testing::Assign;
|
| using testing::DoAll;
|
| @@ -218,6 +220,7 @@ TEST_F(QuicTimeWaitListManagerTest, CheckConnectionIdInTimeWait) {
|
| EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_));
|
| EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_));
|
| AddConnectionId(connection_id_);
|
| + EXPECT_EQ(1u, time_wait_list_manager_.num_connections());
|
| EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_));
|
| }
|
|
|
| @@ -255,6 +258,7 @@ TEST_F(QuicTimeWaitListManagerTest, SendPublicReset) {
|
| TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) {
|
| EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id_));
|
| AddConnectionId(connection_id_);
|
| + EXPECT_EQ(1u, time_wait_list_manager_.num_connections());
|
| for (int sequence_number = 1; sequence_number < 101; ++sequence_number) {
|
| if ((sequence_number & (sequence_number - 1)) == 0) {
|
| EXPECT_CALL(writer_, WritePacket(_, _, _, _))
|
| @@ -273,29 +277,29 @@ TEST_F(QuicTimeWaitListManagerTest, SendPublicResetWithExponentialBackOff) {
|
| }
|
|
|
| TEST_F(QuicTimeWaitListManagerTest, CleanUpOldConnectionIds) {
|
| - const int kConnectionIdCount = 100;
|
| - const int kOldConnectionIdCount = 31;
|
| + const size_t kConnectionIdCount = 100;
|
| + const size_t kOldConnectionIdCount = 31;
|
|
|
| // Add connection_ids such that their expiry time is kTimeWaitPeriod_.
|
| epoll_server_.set_now_in_usec(0);
|
| - for (int connection_id = 1;
|
| - connection_id <= kOldConnectionIdCount;
|
| + for (size_t connection_id = 1; connection_id <= kOldConnectionIdCount;
|
| ++connection_id) {
|
| EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id));
|
| AddConnectionId(connection_id);
|
| }
|
| + EXPECT_EQ(kOldConnectionIdCount, time_wait_list_manager_.num_connections());
|
|
|
| // Add remaining connection_ids such that their add time is
|
| // 2 * kTimeWaitPeriod.
|
| const QuicTime::Delta time_wait_period =
|
| QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_);
|
| epoll_server_.set_now_in_usec(time_wait_period.ToMicroseconds());
|
| - for (int connection_id = kOldConnectionIdCount + 1;
|
| - connection_id <= kConnectionIdCount;
|
| - ++connection_id) {
|
| + for (size_t connection_id = kOldConnectionIdCount + 1;
|
| + connection_id <= kConnectionIdCount; ++connection_id) {
|
| EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(connection_id));
|
| AddConnectionId(connection_id);
|
| }
|
| + EXPECT_EQ(kConnectionIdCount, time_wait_list_manager_.num_connections());
|
|
|
| QuicTime::Delta offset = QuicTime::Delta::FromMicroseconds(39);
|
| // Now set the current time as time_wait_period + offset usecs.
|
| @@ -306,21 +310,22 @@ TEST_F(QuicTimeWaitListManagerTest, CleanUpOldConnectionIds) {
|
| time_wait_period.Subtract(offset).ToMicroseconds();
|
| EXPECT_CALL(epoll_server_, RegisterAlarm(next_alarm_time, _));
|
|
|
| - for (int connection_id = 1; connection_id <= kConnectionIdCount;
|
| + for (size_t connection_id = 1; connection_id <= kConnectionIdCount;
|
| ++connection_id) {
|
| if (connection_id <= kOldConnectionIdCount) {
|
| EXPECT_CALL(visitor_, OnConnectionRemovedFromTimeWaitList(connection_id));
|
| }
|
| }
|
| time_wait_list_manager_.CleanUpOldConnectionIds();
|
| - for (int connection_id = 1;
|
| - connection_id <= kConnectionIdCount;
|
| + for (size_t connection_id = 1; connection_id <= kConnectionIdCount;
|
| ++connection_id) {
|
| EXPECT_EQ(connection_id > kOldConnectionIdCount,
|
| IsConnectionIdInTimeWait(connection_id))
|
| << "kOldConnectionIdCount: " << kOldConnectionIdCount
|
| << " connection_id: " << connection_id;
|
| }
|
| + EXPECT_EQ(kConnectionIdCount - kOldConnectionIdCount,
|
| + time_wait_list_manager_.num_connections());
|
| }
|
|
|
| TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) {
|
| @@ -366,6 +371,7 @@ TEST_F(QuicTimeWaitListManagerTest, SendQueuedPackets) {
|
| .Times(0);
|
| EXPECT_CALL(visitor_, OnWriteBlocked(&time_wait_list_manager_));
|
| ProcessPacket(other_connection_id, other_sequence_number);
|
| + EXPECT_EQ(2u, time_wait_list_manager_.num_connections());
|
|
|
| // Now expect all the write blocked public reset packets to be sent again.
|
| writer_is_blocked_ = false;
|
| @@ -421,6 +427,7 @@ TEST_F(QuicTimeWaitListManagerTest, AddConnectionIdTwice) {
|
| new QuicEncryptedPacket(
|
| new char[kConnectionCloseLength], kConnectionCloseLength, true));
|
| EXPECT_TRUE(IsConnectionIdInTimeWait(connection_id_));
|
| + EXPECT_EQ(1u, time_wait_list_manager_.num_connections());
|
|
|
| EXPECT_CALL(writer_, WritePacket(_,
|
| kConnectionCloseLength,
|
| @@ -445,6 +452,7 @@ TEST_F(QuicTimeWaitListManagerTest, AddConnectionIdTwice) {
|
| EXPECT_CALL(visitor_, OnConnectionRemovedFromTimeWaitList(connection_id_));
|
| time_wait_list_manager_.CleanUpOldConnectionIds();
|
| EXPECT_FALSE(IsConnectionIdInTimeWait(connection_id_));
|
| + EXPECT_EQ(0u, time_wait_list_manager_.num_connections());
|
| }
|
|
|
| TEST_F(QuicTimeWaitListManagerTest, ConnectionIdsOrderedByTime) {
|
| @@ -464,6 +472,7 @@ TEST_F(QuicTimeWaitListManagerTest, ConnectionIdsOrderedByTime) {
|
| epoll_server_.set_now_in_usec(10);
|
| EXPECT_CALL(visitor_, OnConnectionAddedToTimeWaitList(kConnectionId2));
|
| AddConnectionId(kConnectionId2);
|
| + EXPECT_EQ(2u, time_wait_list_manager_.num_connections());
|
|
|
| const QuicTime::Delta time_wait_period =
|
| QuicTimeWaitListManagerPeer::time_wait_period(&time_wait_list_manager_);
|
| @@ -475,7 +484,46 @@ TEST_F(QuicTimeWaitListManagerTest, ConnectionIdsOrderedByTime) {
|
| time_wait_list_manager_.CleanUpOldConnectionIds();
|
| EXPECT_FALSE(IsConnectionIdInTimeWait(kConnectionId1));
|
| EXPECT_TRUE(IsConnectionIdInTimeWait(kConnectionId2));
|
| + EXPECT_EQ(1u, time_wait_list_manager_.num_connections());
|
| }
|
| +
|
| +TEST_F(QuicTimeWaitListManagerTest, MaxConnectionsTest) {
|
| + ValueRestore<bool> old_flag(&FLAGS_quic_limit_time_wait_list_size, true);
|
| + // Basically, shut off time-based eviction.
|
| + FLAGS_quic_time_wait_list_seconds = 10000000000;
|
| + FLAGS_quic_time_wait_list_max_connections = 5;
|
| +
|
| + QuicConnectionId current_connection_id = 0;
|
| + // Add exactly the maximum number of connections
|
| + for (int64 i = 0; i < FLAGS_quic_time_wait_list_max_connections; ++i) {
|
| + ++current_connection_id;
|
| + EXPECT_FALSE(IsConnectionIdInTimeWait(current_connection_id));
|
| + EXPECT_CALL(visitor_,
|
| + OnConnectionAddedToTimeWaitList(current_connection_id));
|
| + AddConnectionId(current_connection_id);
|
| + EXPECT_EQ(current_connection_id, time_wait_list_manager_.num_connections());
|
| + EXPECT_TRUE(IsConnectionIdInTimeWait(current_connection_id));
|
| + }
|
| +
|
| + // Now keep adding. Since we're already at the max, every new connection-id
|
| + // will evict the oldest one.
|
| + for (int64 i = 0; i < FLAGS_quic_time_wait_list_max_connections; ++i) {
|
| + ++current_connection_id;
|
| + const QuicConnectionId id_to_evict =
|
| + current_connection_id - FLAGS_quic_time_wait_list_max_connections;
|
| + EXPECT_TRUE(IsConnectionIdInTimeWait(id_to_evict));
|
| + EXPECT_FALSE(IsConnectionIdInTimeWait(current_connection_id));
|
| + EXPECT_CALL(visitor_, OnConnectionRemovedFromTimeWaitList(id_to_evict));
|
| + EXPECT_CALL(visitor_,
|
| + OnConnectionAddedToTimeWaitList(current_connection_id));
|
| + AddConnectionId(current_connection_id);
|
| + EXPECT_EQ(static_cast<size_t>(FLAGS_quic_time_wait_list_max_connections),
|
| + time_wait_list_manager_.num_connections());
|
| + EXPECT_FALSE(IsConnectionIdInTimeWait(id_to_evict));
|
| + EXPECT_TRUE(IsConnectionIdInTimeWait(current_connection_id));
|
| + }
|
| +}
|
| +
|
| } // namespace
|
| } // namespace test
|
| } // namespace tools
|
|
|