| Index: net/tools/quic/quic_client_test.cc
|
| diff --git a/net/tools/quic/quic_client_test.cc b/net/tools/quic/quic_client_test.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..793518be17246462f49eadbe8c0a76af0e1eb276
|
| --- /dev/null
|
| +++ b/net/tools/quic/quic_client_test.cc
|
| @@ -0,0 +1,75 @@
|
| +// Copyright (c) 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <dirent.h>
|
| +#include <stdio.h>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/strings/string_util.h"
|
| +#include "net/quic/test_tools/quic_test_utils.h"
|
| +#include "net/tools/epoll_server/epoll_server.h"
|
| +#include "net/tools/quic/quic_client.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using net::EpollServer;
|
| +
|
| +namespace net {
|
| +namespace tools {
|
| +namespace test {
|
| +namespace {
|
| +
|
| +int NumOpenFDs() {
|
| + int number_of_open_fds = 0;
|
| + char buf[256];
|
| + struct dirent* dp;
|
| +
|
| + base::snprintf(buf, arraysize(buf), "/proc/%i/fd/", getpid());
|
| + DIR* dir = opendir(buf);
|
| + while ((dp = readdir(dir)) != NULL)
|
| + number_of_open_fds++;
|
| + closedir(dir);
|
| +
|
| + return number_of_open_fds;
|
| +}
|
| +
|
| +// Creates a new QuicClient and Initializes it. Caller is responsible for
|
| +// deletion.
|
| +QuicClient* CreateAndInitializeQuicClient(EpollServer* eps, uint16 port) {
|
| + IPEndPoint server_address(IPEndPoint(net::test::Loopback4(), port));
|
| + QuicServerId server_id("hostname", server_address.port(), false,
|
| + PRIVACY_MODE_DISABLED);
|
| + QuicVersionVector versions = QuicSupportedVersions();
|
| + QuicClient* client =
|
| + new QuicClient(server_address, server_id, versions, false, eps);
|
| + EXPECT_TRUE(client->Initialize());
|
| + return client;
|
| +}
|
| +
|
| +TEST(QuicClientTest, DoNotLeakFDs) {
|
| + // Make sure that the QuicClient doesn't leak FDs. Doing so could cause port
|
| + // exhaustion in long running processes which repeatedly create clients.
|
| +
|
| + // Record initial number of FDs, after creation of EpollServer.
|
| + EpollServer eps;
|
| + int number_of_open_fds = NumOpenFDs();
|
| +
|
| + // Create a number of clients, initialize them, and verify this has resulted
|
| + // in additional FDs being opened.
|
| + const int kNumClients = 5;
|
| + for (int i = 0; i < kNumClients; ++i) {
|
| + std::unique_ptr<QuicClient> client(
|
| + CreateAndInitializeQuicClient(&eps, net::test::kTestPort + i));
|
| +
|
| + // Initializing the client will create a new FD.
|
| + EXPECT_LT(number_of_open_fds, NumOpenFDs());
|
| + }
|
| +
|
| + // The FDs created by the QuicClients should now be closed.
|
| + EXPECT_EQ(number_of_open_fds, NumOpenFDs());
|
| +}
|
| +
|
| +} // namespace
|
| +} // namespace test
|
| +} // namespace tools
|
| +} // namespace net
|
|
|