| 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
 | 
| 
 |