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 |