Home | History | Annotate | Download | only in socket
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "net/socket/transport_client_socket_pool.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/bind_helpers.h"
      9 #include "base/callback.h"
     10 #include "base/compiler_specific.h"
     11 #include "base/logging.h"
     12 #include "base/message_loop/message_loop.h"
     13 #include "base/threading/platform_thread.h"
     14 #include "net/base/capturing_net_log.h"
     15 #include "net/base/ip_endpoint.h"
     16 #include "net/base/load_timing_info.h"
     17 #include "net/base/load_timing_info_test_util.h"
     18 #include "net/base/net_errors.h"
     19 #include "net/base/net_util.h"
     20 #include "net/base/test_completion_callback.h"
     21 #include "net/dns/mock_host_resolver.h"
     22 #include "net/socket/client_socket_factory.h"
     23 #include "net/socket/client_socket_handle.h"
     24 #include "net/socket/client_socket_pool_histograms.h"
     25 #include "net/socket/socket_test_util.h"
     26 #include "net/socket/stream_socket.h"
     27 #include "testing/gtest/include/gtest/gtest.h"
     28 
     29 namespace net {
     30 
     31 using internal::ClientSocketPoolBaseHelper;
     32 
     33 namespace {
     34 
     35 const int kMaxSockets = 32;
     36 const int kMaxSocketsPerGroup = 6;
     37 const net::RequestPriority kDefaultPriority = LOW;
     38 
     39 // Make sure |handle| sets load times correctly when it has been assigned a
     40 // reused socket.
     41 void TestLoadTimingInfoConnectedReused(const ClientSocketHandle& handle) {
     42   LoadTimingInfo load_timing_info;
     43   // Only pass true in as |is_reused|, as in general, HttpStream types should
     44   // have stricter concepts of reuse than socket pools.
     45   EXPECT_TRUE(handle.GetLoadTimingInfo(true, &load_timing_info));
     46 
     47   EXPECT_TRUE(load_timing_info.socket_reused);
     48   EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
     49 
     50   ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing);
     51   ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
     52 }
     53 
     54 // Make sure |handle| sets load times correctly when it has been assigned a
     55 // fresh socket.  Also runs TestLoadTimingInfoConnectedReused, since the owner
     56 // of a connection where |is_reused| is false may consider the connection
     57 // reused.
     58 void TestLoadTimingInfoConnectedNotReused(const ClientSocketHandle& handle) {
     59   EXPECT_FALSE(handle.is_reused());
     60 
     61   LoadTimingInfo load_timing_info;
     62   EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info));
     63 
     64   EXPECT_FALSE(load_timing_info.socket_reused);
     65   EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
     66 
     67   ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
     68                               CONNECT_TIMING_HAS_DNS_TIMES);
     69   ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
     70 
     71   TestLoadTimingInfoConnectedReused(handle);
     72 }
     73 
     74 void SetIPv4Address(IPEndPoint* address) {
     75   IPAddressNumber number;
     76   CHECK(ParseIPLiteralToNumber("1.1.1.1", &number));
     77   *address = IPEndPoint(number, 80);
     78 }
     79 
     80 void SetIPv6Address(IPEndPoint* address) {
     81   IPAddressNumber number;
     82   CHECK(ParseIPLiteralToNumber("1:abcd::3:4:ff", &number));
     83   *address = IPEndPoint(number, 80);
     84 }
     85 
     86 class MockClientSocket : public StreamSocket {
     87  public:
     88   MockClientSocket(const AddressList& addrlist, net::NetLog* net_log)
     89       : connected_(false),
     90         addrlist_(addrlist),
     91         net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)) {
     92   }
     93 
     94   // StreamSocket implementation.
     95   virtual int Connect(const CompletionCallback& callback) OVERRIDE {
     96     connected_ = true;
     97     return OK;
     98   }
     99   virtual void Disconnect() OVERRIDE {
    100     connected_ = false;
    101   }
    102   virtual bool IsConnected() const OVERRIDE {
    103     return connected_;
    104   }
    105   virtual bool IsConnectedAndIdle() const OVERRIDE {
    106     return connected_;
    107   }
    108   virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE {
    109     return ERR_UNEXPECTED;
    110   }
    111   virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE {
    112     if (!connected_)
    113       return ERR_SOCKET_NOT_CONNECTED;
    114     if (addrlist_.front().GetFamily() == ADDRESS_FAMILY_IPV4)
    115       SetIPv4Address(address);
    116     else
    117       SetIPv6Address(address);
    118     return OK;
    119   }
    120   virtual const BoundNetLog& NetLog() const OVERRIDE {
    121     return net_log_;
    122   }
    123 
    124   virtual void SetSubresourceSpeculation() OVERRIDE {}
    125   virtual void SetOmniboxSpeculation() OVERRIDE {}
    126   virtual bool WasEverUsed() const OVERRIDE { return false; }
    127   virtual bool UsingTCPFastOpen() const OVERRIDE { return false; }
    128   virtual bool WasNpnNegotiated() const OVERRIDE {
    129     return false;
    130   }
    131   virtual NextProto GetNegotiatedProtocol() const OVERRIDE {
    132     return kProtoUnknown;
    133   }
    134   virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE {
    135     return false;
    136   }
    137 
    138   // Socket implementation.
    139   virtual int Read(IOBuffer* buf, int buf_len,
    140                    const CompletionCallback& callback) OVERRIDE {
    141     return ERR_FAILED;
    142   }
    143   virtual int Write(IOBuffer* buf, int buf_len,
    144                     const CompletionCallback& callback) OVERRIDE {
    145     return ERR_FAILED;
    146   }
    147   virtual bool SetReceiveBufferSize(int32 size) OVERRIDE { return true; }
    148   virtual bool SetSendBufferSize(int32 size) OVERRIDE { return true; }
    149 
    150  private:
    151   bool connected_;
    152   const AddressList addrlist_;
    153   BoundNetLog net_log_;
    154 };
    155 
    156 class MockFailingClientSocket : public StreamSocket {
    157  public:
    158   MockFailingClientSocket(const AddressList& addrlist, net::NetLog* net_log)
    159       : addrlist_(addrlist),
    160         net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)) {
    161   }
    162 
    163   // StreamSocket implementation.
    164   virtual int Connect(const CompletionCallback& callback) OVERRIDE {
    165     return ERR_CONNECTION_FAILED;
    166   }
    167 
    168   virtual void Disconnect() OVERRIDE {}
    169 
    170   virtual bool IsConnected() const OVERRIDE {
    171     return false;
    172   }
    173   virtual bool IsConnectedAndIdle() const OVERRIDE {
    174     return false;
    175   }
    176   virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE {
    177     return ERR_UNEXPECTED;
    178   }
    179   virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE {
    180     return ERR_UNEXPECTED;
    181   }
    182   virtual const BoundNetLog& NetLog() const OVERRIDE {
    183     return net_log_;
    184   }
    185 
    186   virtual void SetSubresourceSpeculation() OVERRIDE {}
    187   virtual void SetOmniboxSpeculation() OVERRIDE {}
    188   virtual bool WasEverUsed() const OVERRIDE { return false; }
    189   virtual bool UsingTCPFastOpen() const OVERRIDE { return false; }
    190   virtual bool WasNpnNegotiated() const OVERRIDE {
    191     return false;
    192   }
    193   virtual NextProto GetNegotiatedProtocol() const OVERRIDE {
    194     return kProtoUnknown;
    195   }
    196   virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE {
    197     return false;
    198   }
    199 
    200   // Socket implementation.
    201   virtual int Read(IOBuffer* buf, int buf_len,
    202                    const CompletionCallback& callback) OVERRIDE {
    203     return ERR_FAILED;
    204   }
    205 
    206   virtual int Write(IOBuffer* buf, int buf_len,
    207                     const CompletionCallback& callback) OVERRIDE {
    208     return ERR_FAILED;
    209   }
    210   virtual bool SetReceiveBufferSize(int32 size) OVERRIDE { return true; }
    211   virtual bool SetSendBufferSize(int32 size) OVERRIDE { return true; }
    212 
    213  private:
    214   const AddressList addrlist_;
    215   BoundNetLog net_log_;
    216 };
    217 
    218 class MockPendingClientSocket : public StreamSocket {
    219  public:
    220   // |should_connect| indicates whether the socket should successfully complete
    221   // or fail.
    222   // |should_stall| indicates that this socket should never connect.
    223   // |delay_ms| is the delay, in milliseconds, before simulating a connect.
    224   MockPendingClientSocket(
    225       const AddressList& addrlist,
    226       bool should_connect,
    227       bool should_stall,
    228       base::TimeDelta delay,
    229       net::NetLog* net_log)
    230       : weak_factory_(this),
    231         should_connect_(should_connect),
    232         should_stall_(should_stall),
    233         delay_(delay),
    234         is_connected_(false),
    235         addrlist_(addrlist),
    236         net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_SOCKET)) {
    237   }
    238 
    239   // StreamSocket implementation.
    240   virtual int Connect(const CompletionCallback& callback) OVERRIDE {
    241     base::MessageLoop::current()->PostDelayedTask(
    242         FROM_HERE,
    243         base::Bind(&MockPendingClientSocket::DoCallback,
    244                    weak_factory_.GetWeakPtr(), callback),
    245         delay_);
    246     return ERR_IO_PENDING;
    247   }
    248 
    249   virtual void Disconnect() OVERRIDE {}
    250 
    251   virtual bool IsConnected() const OVERRIDE {
    252     return is_connected_;
    253   }
    254   virtual bool IsConnectedAndIdle() const OVERRIDE {
    255     return is_connected_;
    256   }
    257   virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE {
    258     return ERR_UNEXPECTED;
    259   }
    260   virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE {
    261     if (!is_connected_)
    262       return ERR_SOCKET_NOT_CONNECTED;
    263     if (addrlist_.front().GetFamily() == ADDRESS_FAMILY_IPV4)
    264       SetIPv4Address(address);
    265     else
    266       SetIPv6Address(address);
    267     return OK;
    268   }
    269   virtual const BoundNetLog& NetLog() const OVERRIDE {
    270     return net_log_;
    271   }
    272 
    273   virtual void SetSubresourceSpeculation() OVERRIDE {}
    274   virtual void SetOmniboxSpeculation() OVERRIDE {}
    275   virtual bool WasEverUsed() const OVERRIDE { return false; }
    276   virtual bool UsingTCPFastOpen() const OVERRIDE { return false; }
    277   virtual bool WasNpnNegotiated() const OVERRIDE {
    278     return false;
    279   }
    280   virtual NextProto GetNegotiatedProtocol() const OVERRIDE {
    281     return kProtoUnknown;
    282   }
    283   virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE {
    284     return false;
    285   }
    286 
    287   // Socket implementation.
    288   virtual int Read(IOBuffer* buf, int buf_len,
    289                    const CompletionCallback& callback) OVERRIDE {
    290     return ERR_FAILED;
    291   }
    292 
    293   virtual int Write(IOBuffer* buf, int buf_len,
    294                     const CompletionCallback& callback) OVERRIDE {
    295     return ERR_FAILED;
    296   }
    297   virtual bool SetReceiveBufferSize(int32 size) OVERRIDE { return true; }
    298   virtual bool SetSendBufferSize(int32 size) OVERRIDE { return true; }
    299 
    300  private:
    301   void DoCallback(const CompletionCallback& callback) {
    302     if (should_stall_)
    303       return;
    304 
    305     if (should_connect_) {
    306       is_connected_ = true;
    307       callback.Run(OK);
    308     } else {
    309       is_connected_ = false;
    310       callback.Run(ERR_CONNECTION_FAILED);
    311     }
    312   }
    313 
    314   base::WeakPtrFactory<MockPendingClientSocket> weak_factory_;
    315   bool should_connect_;
    316   bool should_stall_;
    317   base::TimeDelta delay_;
    318   bool is_connected_;
    319   const AddressList addrlist_;
    320   BoundNetLog net_log_;
    321 };
    322 
    323 class MockClientSocketFactory : public ClientSocketFactory {
    324  public:
    325   enum ClientSocketType {
    326     MOCK_CLIENT_SOCKET,
    327     MOCK_FAILING_CLIENT_SOCKET,
    328     MOCK_PENDING_CLIENT_SOCKET,
    329     MOCK_PENDING_FAILING_CLIENT_SOCKET,
    330     // A delayed socket will pause before connecting through the message loop.
    331     MOCK_DELAYED_CLIENT_SOCKET,
    332     // A stalled socket that never connects at all.
    333     MOCK_STALLED_CLIENT_SOCKET,
    334   };
    335 
    336   explicit MockClientSocketFactory(NetLog* net_log)
    337       : net_log_(net_log), allocation_count_(0),
    338         client_socket_type_(MOCK_CLIENT_SOCKET), client_socket_types_(NULL),
    339         client_socket_index_(0), client_socket_index_max_(0),
    340         delay_(base::TimeDelta::FromMilliseconds(
    341             ClientSocketPool::kMaxConnectRetryIntervalMs)) {}
    342 
    343   virtual DatagramClientSocket* CreateDatagramClientSocket(
    344       DatagramSocket::BindType bind_type,
    345       const RandIntCallback& rand_int_cb,
    346       NetLog* net_log,
    347       const NetLog::Source& source) OVERRIDE {
    348     NOTREACHED();
    349     return NULL;
    350   }
    351 
    352   virtual StreamSocket* CreateTransportClientSocket(
    353       const AddressList& addresses,
    354       NetLog* /* net_log */,
    355       const NetLog::Source& /* source */) OVERRIDE {
    356     allocation_count_++;
    357 
    358     ClientSocketType type = client_socket_type_;
    359     if (client_socket_types_ &&
    360         client_socket_index_ < client_socket_index_max_) {
    361       type = client_socket_types_[client_socket_index_++];
    362     }
    363 
    364     switch (type) {
    365       case MOCK_CLIENT_SOCKET:
    366         return new MockClientSocket(addresses, net_log_);
    367       case MOCK_FAILING_CLIENT_SOCKET:
    368         return new MockFailingClientSocket(addresses, net_log_);
    369       case MOCK_PENDING_CLIENT_SOCKET:
    370         return new MockPendingClientSocket(
    371             addresses, true, false, base::TimeDelta(), net_log_);
    372       case MOCK_PENDING_FAILING_CLIENT_SOCKET:
    373         return new MockPendingClientSocket(
    374             addresses, false, false, base::TimeDelta(), net_log_);
    375       case MOCK_DELAYED_CLIENT_SOCKET:
    376         return new MockPendingClientSocket(
    377             addresses, true, false, delay_, net_log_);
    378       case MOCK_STALLED_CLIENT_SOCKET:
    379         return new MockPendingClientSocket(
    380             addresses, true, true, base::TimeDelta(), net_log_);
    381       default:
    382         NOTREACHED();
    383         return new MockClientSocket(addresses, net_log_);
    384     }
    385   }
    386 
    387   virtual SSLClientSocket* CreateSSLClientSocket(
    388       ClientSocketHandle* transport_socket,
    389       const HostPortPair& host_and_port,
    390       const SSLConfig& ssl_config,
    391       const SSLClientSocketContext& context) OVERRIDE {
    392     NOTIMPLEMENTED();
    393     return NULL;
    394   }
    395 
    396   virtual void ClearSSLSessionCache() OVERRIDE {
    397     NOTIMPLEMENTED();
    398   }
    399 
    400   int allocation_count() const { return allocation_count_; }
    401 
    402   // Set the default ClientSocketType.
    403   void set_client_socket_type(ClientSocketType type) {
    404     client_socket_type_ = type;
    405   }
    406 
    407   // Set a list of ClientSocketTypes to be used.
    408   void set_client_socket_types(ClientSocketType* type_list, int num_types) {
    409     DCHECK_GT(num_types, 0);
    410     client_socket_types_ = type_list;
    411     client_socket_index_ = 0;
    412     client_socket_index_max_ = num_types;
    413   }
    414 
    415   void set_delay(base::TimeDelta delay) { delay_ = delay; }
    416 
    417  private:
    418   NetLog* net_log_;
    419   int allocation_count_;
    420   ClientSocketType client_socket_type_;
    421   ClientSocketType* client_socket_types_;
    422   int client_socket_index_;
    423   int client_socket_index_max_;
    424   base::TimeDelta delay_;
    425 };
    426 
    427 class TransportClientSocketPoolTest : public testing::Test {
    428  protected:
    429   TransportClientSocketPoolTest()
    430       : connect_backup_jobs_enabled_(
    431             ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true)),
    432         params_(
    433             new TransportSocketParams(HostPortPair("www.google.com", 80),
    434                                       kDefaultPriority, false, false,
    435                                       OnHostResolutionCallback())),
    436         low_params_(
    437             new TransportSocketParams(HostPortPair("www.google.com", 80),
    438                                       LOW, false, false,
    439                                       OnHostResolutionCallback())),
    440         histograms_(new ClientSocketPoolHistograms("TCPUnitTest")),
    441         host_resolver_(new MockHostResolver),
    442         client_socket_factory_(&net_log_),
    443         pool_(kMaxSockets,
    444               kMaxSocketsPerGroup,
    445               histograms_.get(),
    446               host_resolver_.get(),
    447               &client_socket_factory_,
    448               NULL) {
    449   }
    450 
    451   virtual ~TransportClientSocketPoolTest() {
    452     internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(
    453         connect_backup_jobs_enabled_);
    454   }
    455 
    456   int StartRequest(const std::string& group_name, RequestPriority priority) {
    457     scoped_refptr<TransportSocketParams> params(new TransportSocketParams(
    458         HostPortPair("www.google.com", 80), MEDIUM, false, false,
    459         OnHostResolutionCallback()));
    460     return test_base_.StartRequestUsingPool(
    461         &pool_, group_name, priority, params);
    462   }
    463 
    464   int GetOrderOfRequest(size_t index) {
    465     return test_base_.GetOrderOfRequest(index);
    466   }
    467 
    468   bool ReleaseOneConnection(ClientSocketPoolTest::KeepAlive keep_alive) {
    469     return test_base_.ReleaseOneConnection(keep_alive);
    470   }
    471 
    472   void ReleaseAllConnections(ClientSocketPoolTest::KeepAlive keep_alive) {
    473     test_base_.ReleaseAllConnections(keep_alive);
    474   }
    475 
    476   ScopedVector<TestSocketRequest>* requests() { return test_base_.requests(); }
    477   size_t completion_count() const { return test_base_.completion_count(); }
    478 
    479   bool connect_backup_jobs_enabled_;
    480   CapturingNetLog net_log_;
    481   scoped_refptr<TransportSocketParams> params_;
    482   scoped_refptr<TransportSocketParams> low_params_;
    483   scoped_ptr<ClientSocketPoolHistograms> histograms_;
    484   scoped_ptr<MockHostResolver> host_resolver_;
    485   MockClientSocketFactory client_socket_factory_;
    486   TransportClientSocketPool pool_;
    487   ClientSocketPoolTest test_base_;
    488 };
    489 
    490 TEST(TransportConnectJobTest, MakeAddrListStartWithIPv4) {
    491   IPAddressNumber ip_number;
    492   ASSERT_TRUE(ParseIPLiteralToNumber("192.168.1.1", &ip_number));
    493   IPEndPoint addrlist_v4_1(ip_number, 80);
    494   ASSERT_TRUE(ParseIPLiteralToNumber("192.168.1.2", &ip_number));
    495   IPEndPoint addrlist_v4_2(ip_number, 80);
    496   ASSERT_TRUE(ParseIPLiteralToNumber("2001:4860:b006::64", &ip_number));
    497   IPEndPoint addrlist_v6_1(ip_number, 80);
    498   ASSERT_TRUE(ParseIPLiteralToNumber("2001:4860:b006::66", &ip_number));
    499   IPEndPoint addrlist_v6_2(ip_number, 80);
    500 
    501   AddressList addrlist;
    502 
    503   // Test 1: IPv4 only.  Expect no change.
    504   addrlist.clear();
    505   addrlist.push_back(addrlist_v4_1);
    506   addrlist.push_back(addrlist_v4_2);
    507   TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist);
    508   ASSERT_EQ(2u, addrlist.size());
    509   EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[0].GetFamily());
    510   EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[1].GetFamily());
    511 
    512   // Test 2: IPv6 only.  Expect no change.
    513   addrlist.clear();
    514   addrlist.push_back(addrlist_v6_1);
    515   addrlist.push_back(addrlist_v6_2);
    516   TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist);
    517   ASSERT_EQ(2u, addrlist.size());
    518   EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[0].GetFamily());
    519   EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[1].GetFamily());
    520 
    521   // Test 3: IPv4 then IPv6.  Expect no change.
    522   addrlist.clear();
    523   addrlist.push_back(addrlist_v4_1);
    524   addrlist.push_back(addrlist_v4_2);
    525   addrlist.push_back(addrlist_v6_1);
    526   addrlist.push_back(addrlist_v6_2);
    527   TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist);
    528   ASSERT_EQ(4u, addrlist.size());
    529   EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[0].GetFamily());
    530   EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[1].GetFamily());
    531   EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[2].GetFamily());
    532   EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[3].GetFamily());
    533 
    534   // Test 4: IPv6, IPv4, IPv6, IPv4.  Expect first IPv6 moved to the end.
    535   addrlist.clear();
    536   addrlist.push_back(addrlist_v6_1);
    537   addrlist.push_back(addrlist_v4_1);
    538   addrlist.push_back(addrlist_v6_2);
    539   addrlist.push_back(addrlist_v4_2);
    540   TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist);
    541   ASSERT_EQ(4u, addrlist.size());
    542   EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[0].GetFamily());
    543   EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[1].GetFamily());
    544   EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[2].GetFamily());
    545   EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[3].GetFamily());
    546 
    547   // Test 5: IPv6, IPv6, IPv4, IPv4.  Expect first two IPv6's moved to the end.
    548   addrlist.clear();
    549   addrlist.push_back(addrlist_v6_1);
    550   addrlist.push_back(addrlist_v6_2);
    551   addrlist.push_back(addrlist_v4_1);
    552   addrlist.push_back(addrlist_v4_2);
    553   TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist);
    554   ASSERT_EQ(4u, addrlist.size());
    555   EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[0].GetFamily());
    556   EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[1].GetFamily());
    557   EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[2].GetFamily());
    558   EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[3].GetFamily());
    559 }
    560 
    561 TEST_F(TransportClientSocketPoolTest, Basic) {
    562   TestCompletionCallback callback;
    563   ClientSocketHandle handle;
    564   int rv = handle.Init("a", low_params_, LOW, callback.callback(), &pool_,
    565                        BoundNetLog());
    566   EXPECT_EQ(ERR_IO_PENDING, rv);
    567   EXPECT_FALSE(handle.is_initialized());
    568   EXPECT_FALSE(handle.socket());
    569 
    570   EXPECT_EQ(OK, callback.WaitForResult());
    571   EXPECT_TRUE(handle.is_initialized());
    572   EXPECT_TRUE(handle.socket());
    573   TestLoadTimingInfoConnectedNotReused(handle);
    574 }
    575 
    576 TEST_F(TransportClientSocketPoolTest, InitHostResolutionFailure) {
    577   host_resolver_->rules()->AddSimulatedFailure("unresolvable.host.name");
    578   TestCompletionCallback callback;
    579   ClientSocketHandle handle;
    580   HostPortPair host_port_pair("unresolvable.host.name", 80);
    581   scoped_refptr<TransportSocketParams> dest(new TransportSocketParams(
    582       host_port_pair, kDefaultPriority, false, false,
    583       OnHostResolutionCallback()));
    584   EXPECT_EQ(ERR_IO_PENDING,
    585             handle.Init("a", dest, kDefaultPriority, callback.callback(),
    586                         &pool_, BoundNetLog()));
    587   EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback.WaitForResult());
    588 }
    589 
    590 TEST_F(TransportClientSocketPoolTest, InitConnectionFailure) {
    591   client_socket_factory_.set_client_socket_type(
    592       MockClientSocketFactory::MOCK_FAILING_CLIENT_SOCKET);
    593   TestCompletionCallback callback;
    594   ClientSocketHandle handle;
    595   EXPECT_EQ(ERR_IO_PENDING,
    596             handle.Init("a", params_, kDefaultPriority, callback.callback(),
    597                         &pool_, BoundNetLog()));
    598   EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
    599 
    600   // Make the host resolutions complete synchronously this time.
    601   host_resolver_->set_synchronous_mode(true);
    602   EXPECT_EQ(ERR_CONNECTION_FAILED,
    603             handle.Init("a", params_, kDefaultPriority, callback.callback(),
    604                         &pool_, BoundNetLog()));
    605 }
    606 
    607 TEST_F(TransportClientSocketPoolTest, PendingRequests) {
    608   // First request finishes asynchronously.
    609   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    610   EXPECT_EQ(OK, (*requests())[0]->WaitForResult());
    611 
    612   // Make all subsequent host resolutions complete synchronously.
    613   host_resolver_->set_synchronous_mode(true);
    614 
    615   // Rest of them finish synchronously, until we reach the per-group limit.
    616   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    617   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    618   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    619   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    620   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    621 
    622   // The rest are pending since we've used all active sockets.
    623   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
    624   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
    625   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
    626   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
    627   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
    628   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
    629   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
    630   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
    631   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
    632   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
    633 
    634   ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
    635 
    636   EXPECT_EQ(kMaxSocketsPerGroup, client_socket_factory_.allocation_count());
    637 
    638   // One initial asynchronous request and then 10 pending requests.
    639   EXPECT_EQ(11U, completion_count());
    640 
    641   // First part of requests, all with the same priority, finishes in FIFO order.
    642   EXPECT_EQ(1, GetOrderOfRequest(1));
    643   EXPECT_EQ(2, GetOrderOfRequest(2));
    644   EXPECT_EQ(3, GetOrderOfRequest(3));
    645   EXPECT_EQ(4, GetOrderOfRequest(4));
    646   EXPECT_EQ(5, GetOrderOfRequest(5));
    647   EXPECT_EQ(6, GetOrderOfRequest(6));
    648 
    649   // Make sure that rest of the requests complete in the order of priority.
    650   EXPECT_EQ(7, GetOrderOfRequest(7));
    651   EXPECT_EQ(14, GetOrderOfRequest(8));
    652   EXPECT_EQ(15, GetOrderOfRequest(9));
    653   EXPECT_EQ(10, GetOrderOfRequest(10));
    654   EXPECT_EQ(13, GetOrderOfRequest(11));
    655   EXPECT_EQ(8, GetOrderOfRequest(12));
    656   EXPECT_EQ(16, GetOrderOfRequest(13));
    657   EXPECT_EQ(11, GetOrderOfRequest(14));
    658   EXPECT_EQ(12, GetOrderOfRequest(15));
    659   EXPECT_EQ(9, GetOrderOfRequest(16));
    660 
    661   // Make sure we test order of all requests made.
    662   EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(17));
    663 }
    664 
    665 TEST_F(TransportClientSocketPoolTest, PendingRequests_NoKeepAlive) {
    666   // First request finishes asynchronously.
    667   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    668   EXPECT_EQ(OK, (*requests())[0]->WaitForResult());
    669 
    670   // Make all subsequent host resolutions complete synchronously.
    671   host_resolver_->set_synchronous_mode(true);
    672 
    673   // Rest of them finish synchronously, until we reach the per-group limit.
    674   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    675   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    676   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    677   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    678   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    679 
    680   // The rest are pending since we've used all active sockets.
    681   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    682   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    683   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    684   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    685   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    686 
    687   ReleaseAllConnections(ClientSocketPoolTest::NO_KEEP_ALIVE);
    688 
    689   // The pending requests should finish successfully.
    690   EXPECT_EQ(OK, (*requests())[6]->WaitForResult());
    691   EXPECT_EQ(OK, (*requests())[7]->WaitForResult());
    692   EXPECT_EQ(OK, (*requests())[8]->WaitForResult());
    693   EXPECT_EQ(OK, (*requests())[9]->WaitForResult());
    694   EXPECT_EQ(OK, (*requests())[10]->WaitForResult());
    695 
    696   EXPECT_EQ(static_cast<int>(requests()->size()),
    697             client_socket_factory_.allocation_count());
    698 
    699   // First asynchronous request, and then last 5 pending requests.
    700   EXPECT_EQ(6U, completion_count());
    701 }
    702 
    703 // This test will start up a RequestSocket() and then immediately Cancel() it.
    704 // The pending host resolution will eventually complete, and destroy the
    705 // ClientSocketPool which will crash if the group was not cleared properly.
    706 TEST_F(TransportClientSocketPoolTest, CancelRequestClearGroup) {
    707   TestCompletionCallback callback;
    708   ClientSocketHandle handle;
    709   EXPECT_EQ(ERR_IO_PENDING,
    710             handle.Init("a", params_, kDefaultPriority, callback.callback(),
    711                         &pool_, BoundNetLog()));
    712   handle.Reset();
    713 }
    714 
    715 TEST_F(TransportClientSocketPoolTest, TwoRequestsCancelOne) {
    716   ClientSocketHandle handle;
    717   TestCompletionCallback callback;
    718   ClientSocketHandle handle2;
    719   TestCompletionCallback callback2;
    720 
    721   EXPECT_EQ(ERR_IO_PENDING,
    722             handle.Init("a", params_, kDefaultPriority, callback.callback(),
    723                         &pool_, BoundNetLog()));
    724   EXPECT_EQ(ERR_IO_PENDING,
    725             handle2.Init("a", params_, kDefaultPriority, callback2.callback(),
    726                          &pool_, BoundNetLog()));
    727 
    728   handle.Reset();
    729 
    730   EXPECT_EQ(OK, callback2.WaitForResult());
    731   handle2.Reset();
    732 }
    733 
    734 TEST_F(TransportClientSocketPoolTest, ConnectCancelConnect) {
    735   client_socket_factory_.set_client_socket_type(
    736       MockClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET);
    737   ClientSocketHandle handle;
    738   TestCompletionCallback callback;
    739   EXPECT_EQ(ERR_IO_PENDING,
    740             handle.Init("a", params_, kDefaultPriority, callback.callback(),
    741                         &pool_, BoundNetLog()));
    742 
    743   handle.Reset();
    744 
    745   TestCompletionCallback callback2;
    746   EXPECT_EQ(ERR_IO_PENDING,
    747             handle.Init("a", params_, kDefaultPriority, callback2.callback(),
    748                         &pool_, BoundNetLog()));
    749 
    750   host_resolver_->set_synchronous_mode(true);
    751   // At this point, handle has two ConnectingSockets out for it.  Due to the
    752   // setting the mock resolver into synchronous mode, the host resolution for
    753   // both will return in the same loop of the MessageLoop.  The client socket
    754   // is a pending socket, so the Connect() will asynchronously complete on the
    755   // next loop of the MessageLoop.  That means that the first
    756   // ConnectingSocket will enter OnIOComplete, and then the second one will.
    757   // If the first one is not cancelled, it will advance the load state, and
    758   // then the second one will crash.
    759 
    760   EXPECT_EQ(OK, callback2.WaitForResult());
    761   EXPECT_FALSE(callback.have_result());
    762 
    763   handle.Reset();
    764 }
    765 
    766 TEST_F(TransportClientSocketPoolTest, CancelRequest) {
    767   // First request finishes asynchronously.
    768   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    769   EXPECT_EQ(OK, (*requests())[0]->WaitForResult());
    770 
    771   // Make all subsequent host resolutions complete synchronously.
    772   host_resolver_->set_synchronous_mode(true);
    773 
    774   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    775   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    776   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    777   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    778   EXPECT_EQ(OK, StartRequest("a", kDefaultPriority));
    779 
    780   // Reached per-group limit, queue up requests.
    781   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
    782   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
    783   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
    784   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
    785   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", MEDIUM));
    786   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
    787   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", HIGHEST));
    788   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
    789   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOW));
    790   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", LOWEST));
    791 
    792   // Cancel a request.
    793   size_t index_to_cancel = kMaxSocketsPerGroup + 2;
    794   EXPECT_FALSE((*requests())[index_to_cancel]->handle()->is_initialized());
    795   (*requests())[index_to_cancel]->handle()->Reset();
    796 
    797   ReleaseAllConnections(ClientSocketPoolTest::KEEP_ALIVE);
    798 
    799   EXPECT_EQ(kMaxSocketsPerGroup,
    800             client_socket_factory_.allocation_count());
    801   EXPECT_EQ(requests()->size() - kMaxSocketsPerGroup, completion_count());
    802 
    803   EXPECT_EQ(1, GetOrderOfRequest(1));
    804   EXPECT_EQ(2, GetOrderOfRequest(2));
    805   EXPECT_EQ(3, GetOrderOfRequest(3));
    806   EXPECT_EQ(4, GetOrderOfRequest(4));
    807   EXPECT_EQ(5, GetOrderOfRequest(5));
    808   EXPECT_EQ(6, GetOrderOfRequest(6));
    809   EXPECT_EQ(14, GetOrderOfRequest(7));
    810   EXPECT_EQ(7, GetOrderOfRequest(8));
    811   EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound,
    812             GetOrderOfRequest(9));  // Canceled request.
    813   EXPECT_EQ(9, GetOrderOfRequest(10));
    814   EXPECT_EQ(10, GetOrderOfRequest(11));
    815   EXPECT_EQ(11, GetOrderOfRequest(12));
    816   EXPECT_EQ(8, GetOrderOfRequest(13));
    817   EXPECT_EQ(12, GetOrderOfRequest(14));
    818   EXPECT_EQ(13, GetOrderOfRequest(15));
    819   EXPECT_EQ(15, GetOrderOfRequest(16));
    820 
    821   // Make sure we test order of all requests made.
    822   EXPECT_EQ(ClientSocketPoolTest::kIndexOutOfBounds, GetOrderOfRequest(17));
    823 }
    824 
    825 class RequestSocketCallback : public TestCompletionCallbackBase {
    826  public:
    827   RequestSocketCallback(ClientSocketHandle* handle,
    828                         TransportClientSocketPool* pool)
    829       : handle_(handle),
    830         pool_(pool),
    831         within_callback_(false),
    832         callback_(base::Bind(&RequestSocketCallback::OnComplete,
    833                              base::Unretained(this))) {
    834   }
    835 
    836   virtual ~RequestSocketCallback() {}
    837 
    838   const CompletionCallback& callback() const { return callback_; }
    839 
    840  private:
    841   void OnComplete(int result) {
    842     SetResult(result);
    843     ASSERT_EQ(OK, result);
    844 
    845     if (!within_callback_) {
    846       // Don't allow reuse of the socket.  Disconnect it and then release it and
    847       // run through the MessageLoop once to get it completely released.
    848       handle_->socket()->Disconnect();
    849       handle_->Reset();
    850       {
    851         base::MessageLoop::ScopedNestableTaskAllower allow(
    852             base::MessageLoop::current());
    853         base::MessageLoop::current()->RunUntilIdle();
    854       }
    855       within_callback_ = true;
    856       scoped_refptr<TransportSocketParams> dest(new TransportSocketParams(
    857           HostPortPair("www.google.com", 80), LOWEST, false, false,
    858           OnHostResolutionCallback()));
    859       int rv = handle_->Init("a", dest, LOWEST, callback(), pool_,
    860                              BoundNetLog());
    861       EXPECT_EQ(OK, rv);
    862     }
    863   }
    864 
    865   ClientSocketHandle* const handle_;
    866   TransportClientSocketPool* const pool_;
    867   bool within_callback_;
    868   CompletionCallback callback_;
    869 
    870   DISALLOW_COPY_AND_ASSIGN(RequestSocketCallback);
    871 };
    872 
    873 TEST_F(TransportClientSocketPoolTest, RequestTwice) {
    874   ClientSocketHandle handle;
    875   RequestSocketCallback callback(&handle, &pool_);
    876   scoped_refptr<TransportSocketParams> dest(new TransportSocketParams(
    877       HostPortPair("www.google.com", 80), LOWEST, false, false,
    878       OnHostResolutionCallback()));
    879   int rv = handle.Init("a", dest, LOWEST, callback.callback(), &pool_,
    880                        BoundNetLog());
    881   ASSERT_EQ(ERR_IO_PENDING, rv);
    882 
    883   // The callback is going to request "www.google.com". We want it to complete
    884   // synchronously this time.
    885   host_resolver_->set_synchronous_mode(true);
    886 
    887   EXPECT_EQ(OK, callback.WaitForResult());
    888 
    889   handle.Reset();
    890 }
    891 
    892 // Make sure that pending requests get serviced after active requests get
    893 // cancelled.
    894 TEST_F(TransportClientSocketPoolTest, CancelActiveRequestWithPendingRequests) {
    895   client_socket_factory_.set_client_socket_type(
    896       MockClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET);
    897 
    898   // Queue up all the requests
    899   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    900   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    901   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    902   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    903   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    904   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    905   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    906   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    907   EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    908 
    909   // Now, kMaxSocketsPerGroup requests should be active.  Let's cancel them.
    910   ASSERT_LE(kMaxSocketsPerGroup, static_cast<int>(requests()->size()));
    911   for (int i = 0; i < kMaxSocketsPerGroup; i++)
    912     (*requests())[i]->handle()->Reset();
    913 
    914   // Let's wait for the rest to complete now.
    915   for (size_t i = kMaxSocketsPerGroup; i < requests()->size(); ++i) {
    916     EXPECT_EQ(OK, (*requests())[i]->WaitForResult());
    917     (*requests())[i]->handle()->Reset();
    918   }
    919 
    920   EXPECT_EQ(requests()->size() - kMaxSocketsPerGroup, completion_count());
    921 }
    922 
    923 // Make sure that pending requests get serviced after active requests fail.
    924 TEST_F(TransportClientSocketPoolTest, FailingActiveRequestWithPendingRequests) {
    925   client_socket_factory_.set_client_socket_type(
    926       MockClientSocketFactory::MOCK_PENDING_FAILING_CLIENT_SOCKET);
    927 
    928   const int kNumRequests = 2 * kMaxSocketsPerGroup + 1;
    929   ASSERT_LE(kNumRequests, kMaxSockets);  // Otherwise the test will hang.
    930 
    931   // Queue up all the requests
    932   for (int i = 0; i < kNumRequests; i++)
    933     EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority));
    934 
    935   for (int i = 0; i < kNumRequests; i++)
    936     EXPECT_EQ(ERR_CONNECTION_FAILED, (*requests())[i]->WaitForResult());
    937 }
    938 
    939 TEST_F(TransportClientSocketPoolTest, IdleSocketLoadTiming) {
    940   TestCompletionCallback callback;
    941   ClientSocketHandle handle;
    942   int rv = handle.Init("a", low_params_, LOW, callback.callback(), &pool_,
    943                        BoundNetLog());
    944   EXPECT_EQ(ERR_IO_PENDING, rv);
    945   EXPECT_FALSE(handle.is_initialized());
    946   EXPECT_FALSE(handle.socket());
    947 
    948   EXPECT_EQ(OK, callback.WaitForResult());
    949   EXPECT_TRUE(handle.is_initialized());
    950   EXPECT_TRUE(handle.socket());
    951   TestLoadTimingInfoConnectedNotReused(handle);
    952 
    953   handle.Reset();
    954   // Need to run all pending to release the socket back to the pool.
    955   base::MessageLoop::current()->RunUntilIdle();
    956 
    957   // Now we should have 1 idle socket.
    958   EXPECT_EQ(1, pool_.IdleSocketCount());
    959 
    960   rv = handle.Init("a", low_params_, LOW, callback.callback(), &pool_,
    961                    BoundNetLog());
    962   EXPECT_EQ(OK, rv);
    963   EXPECT_EQ(0, pool_.IdleSocketCount());
    964   TestLoadTimingInfoConnectedReused(handle);
    965 }
    966 
    967 TEST_F(TransportClientSocketPoolTest, ResetIdleSocketsOnIPAddressChange) {
    968   TestCompletionCallback callback;
    969   ClientSocketHandle handle;
    970   int rv = handle.Init("a", low_params_, LOW, callback.callback(), &pool_,
    971                        BoundNetLog());
    972   EXPECT_EQ(ERR_IO_PENDING, rv);
    973   EXPECT_FALSE(handle.is_initialized());
    974   EXPECT_FALSE(handle.socket());
    975 
    976   EXPECT_EQ(OK, callback.WaitForResult());
    977   EXPECT_TRUE(handle.is_initialized());
    978   EXPECT_TRUE(handle.socket());
    979 
    980   handle.Reset();
    981 
    982   // Need to run all pending to release the socket back to the pool.
    983   base::MessageLoop::current()->RunUntilIdle();
    984 
    985   // Now we should have 1 idle socket.
    986   EXPECT_EQ(1, pool_.IdleSocketCount());
    987 
    988   // After an IP address change, we should have 0 idle sockets.
    989   NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
    990   base::MessageLoop::current()->RunUntilIdle();  // Notification happens async.
    991 
    992   EXPECT_EQ(0, pool_.IdleSocketCount());
    993 }
    994 
    995 TEST_F(TransportClientSocketPoolTest, BackupSocketConnect) {
    996   // Case 1 tests the first socket stalling, and the backup connecting.
    997   MockClientSocketFactory::ClientSocketType case1_types[] = {
    998     // The first socket will not connect.
    999     MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET,
   1000     // The second socket will connect more quickly.
   1001     MockClientSocketFactory::MOCK_CLIENT_SOCKET
   1002   };
   1003 
   1004   // Case 2 tests the first socket being slow, so that we start the
   1005   // second connect, but the second connect stalls, and we still
   1006   // complete the first.
   1007   MockClientSocketFactory::ClientSocketType case2_types[] = {
   1008     // The first socket will connect, although delayed.
   1009     MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET,
   1010     // The second socket will not connect.
   1011     MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET
   1012   };
   1013 
   1014   MockClientSocketFactory::ClientSocketType* cases[2] = {
   1015     case1_types,
   1016     case2_types
   1017   };
   1018 
   1019   for (size_t index = 0; index < arraysize(cases); ++index) {
   1020     client_socket_factory_.set_client_socket_types(cases[index], 2);
   1021 
   1022     EXPECT_EQ(0, pool_.IdleSocketCount());
   1023 
   1024     TestCompletionCallback callback;
   1025     ClientSocketHandle handle;
   1026     int rv = handle.Init("b", low_params_, LOW, callback.callback(), &pool_,
   1027                          BoundNetLog());
   1028     EXPECT_EQ(ERR_IO_PENDING, rv);
   1029     EXPECT_FALSE(handle.is_initialized());
   1030     EXPECT_FALSE(handle.socket());
   1031 
   1032     // Create the first socket, set the timer.
   1033     base::MessageLoop::current()->RunUntilIdle();
   1034 
   1035     // Wait for the backup socket timer to fire.
   1036     base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
   1037         ClientSocketPool::kMaxConnectRetryIntervalMs + 50));
   1038 
   1039     // Let the appropriate socket connect.
   1040     base::MessageLoop::current()->RunUntilIdle();
   1041 
   1042     EXPECT_EQ(OK, callback.WaitForResult());
   1043     EXPECT_TRUE(handle.is_initialized());
   1044     EXPECT_TRUE(handle.socket());
   1045 
   1046     // One socket is stalled, the other is active.
   1047     EXPECT_EQ(0, pool_.IdleSocketCount());
   1048     handle.Reset();
   1049 
   1050     // Close all pending connect jobs and existing sockets.
   1051     pool_.FlushWithError(ERR_NETWORK_CHANGED);
   1052   }
   1053 }
   1054 
   1055 // Test the case where a socket took long enough to start the creation
   1056 // of the backup socket, but then we cancelled the request after that.
   1057 TEST_F(TransportClientSocketPoolTest, BackupSocketCancel) {
   1058   client_socket_factory_.set_client_socket_type(
   1059       MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET);
   1060 
   1061   enum { CANCEL_BEFORE_WAIT, CANCEL_AFTER_WAIT };
   1062 
   1063   for (int index = CANCEL_BEFORE_WAIT; index < CANCEL_AFTER_WAIT; ++index) {
   1064     EXPECT_EQ(0, pool_.IdleSocketCount());
   1065 
   1066     TestCompletionCallback callback;
   1067     ClientSocketHandle handle;
   1068     int rv = handle.Init("c", low_params_, LOW, callback.callback(), &pool_,
   1069                          BoundNetLog());
   1070     EXPECT_EQ(ERR_IO_PENDING, rv);
   1071     EXPECT_FALSE(handle.is_initialized());
   1072     EXPECT_FALSE(handle.socket());
   1073 
   1074     // Create the first socket, set the timer.
   1075     base::MessageLoop::current()->RunUntilIdle();
   1076 
   1077     if (index == CANCEL_AFTER_WAIT) {
   1078       // Wait for the backup socket timer to fire.
   1079       base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
   1080           ClientSocketPool::kMaxConnectRetryIntervalMs));
   1081     }
   1082 
   1083     // Let the appropriate socket connect.
   1084     base::MessageLoop::current()->RunUntilIdle();
   1085 
   1086     handle.Reset();
   1087 
   1088     EXPECT_FALSE(callback.have_result());
   1089     EXPECT_FALSE(handle.is_initialized());
   1090     EXPECT_FALSE(handle.socket());
   1091 
   1092     // One socket is stalled, the other is active.
   1093     EXPECT_EQ(0, pool_.IdleSocketCount());
   1094   }
   1095 }
   1096 
   1097 // Test the case where a socket took long enough to start the creation
   1098 // of the backup socket and never completes, and then the backup
   1099 // connection fails.
   1100 TEST_F(TransportClientSocketPoolTest, BackupSocketFailAfterStall) {
   1101   MockClientSocketFactory::ClientSocketType case_types[] = {
   1102     // The first socket will not connect.
   1103     MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET,
   1104     // The second socket will fail immediately.
   1105     MockClientSocketFactory::MOCK_FAILING_CLIENT_SOCKET
   1106   };
   1107 
   1108   client_socket_factory_.set_client_socket_types(case_types, 2);
   1109 
   1110   EXPECT_EQ(0, pool_.IdleSocketCount());
   1111 
   1112   TestCompletionCallback callback;
   1113   ClientSocketHandle handle;
   1114   int rv = handle.Init("b", low_params_, LOW, callback.callback(), &pool_,
   1115                        BoundNetLog());
   1116   EXPECT_EQ(ERR_IO_PENDING, rv);
   1117   EXPECT_FALSE(handle.is_initialized());
   1118   EXPECT_FALSE(handle.socket());
   1119 
   1120   // Create the first socket, set the timer.
   1121   base::MessageLoop::current()->RunUntilIdle();
   1122 
   1123   // Wait for the backup socket timer to fire.
   1124   base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
   1125       ClientSocketPool::kMaxConnectRetryIntervalMs));
   1126 
   1127   // Let the second connect be synchronous. Otherwise, the emulated
   1128   // host resolution takes an extra trip through the message loop.
   1129   host_resolver_->set_synchronous_mode(true);
   1130 
   1131   // Let the appropriate socket connect.
   1132   base::MessageLoop::current()->RunUntilIdle();
   1133 
   1134   EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
   1135   EXPECT_FALSE(handle.is_initialized());
   1136   EXPECT_FALSE(handle.socket());
   1137   EXPECT_EQ(0, pool_.IdleSocketCount());
   1138   handle.Reset();
   1139 
   1140   // Reset for the next case.
   1141   host_resolver_->set_synchronous_mode(false);
   1142 }
   1143 
   1144 // Test the case where a socket took long enough to start the creation
   1145 // of the backup socket and eventually completes, but the backup socket
   1146 // fails.
   1147 TEST_F(TransportClientSocketPoolTest, BackupSocketFailAfterDelay) {
   1148   MockClientSocketFactory::ClientSocketType case_types[] = {
   1149     // The first socket will connect, although delayed.
   1150     MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET,
   1151     // The second socket will not connect.
   1152     MockClientSocketFactory::MOCK_FAILING_CLIENT_SOCKET
   1153   };
   1154 
   1155   client_socket_factory_.set_client_socket_types(case_types, 2);
   1156   client_socket_factory_.set_delay(base::TimeDelta::FromSeconds(5));
   1157 
   1158   EXPECT_EQ(0, pool_.IdleSocketCount());
   1159 
   1160   TestCompletionCallback callback;
   1161   ClientSocketHandle handle;
   1162   int rv = handle.Init("b", low_params_, LOW, callback.callback(), &pool_,
   1163                        BoundNetLog());
   1164   EXPECT_EQ(ERR_IO_PENDING, rv);
   1165   EXPECT_FALSE(handle.is_initialized());
   1166   EXPECT_FALSE(handle.socket());
   1167 
   1168   // Create the first socket, set the timer.
   1169   base::MessageLoop::current()->RunUntilIdle();
   1170 
   1171   // Wait for the backup socket timer to fire.
   1172   base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(
   1173       ClientSocketPool::kMaxConnectRetryIntervalMs));
   1174 
   1175   // Let the second connect be synchronous. Otherwise, the emulated
   1176   // host resolution takes an extra trip through the message loop.
   1177   host_resolver_->set_synchronous_mode(true);
   1178 
   1179   // Let the appropriate socket connect.
   1180   base::MessageLoop::current()->RunUntilIdle();
   1181 
   1182   EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
   1183   EXPECT_FALSE(handle.is_initialized());
   1184   EXPECT_FALSE(handle.socket());
   1185   handle.Reset();
   1186 
   1187   // Reset for the next case.
   1188   host_resolver_->set_synchronous_mode(false);
   1189 }
   1190 
   1191 // Test the case of the IPv6 address stalling, and falling back to the IPv4
   1192 // socket which finishes first.
   1193 TEST_F(TransportClientSocketPoolTest, IPv6FallbackSocketIPv4FinishesFirst) {
   1194   // Create a pool without backup jobs.
   1195   ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false);
   1196   TransportClientSocketPool pool(kMaxSockets,
   1197                                  kMaxSocketsPerGroup,
   1198                                  histograms_.get(),
   1199                                  host_resolver_.get(),
   1200                                  &client_socket_factory_,
   1201                                  NULL);
   1202 
   1203   MockClientSocketFactory::ClientSocketType case_types[] = {
   1204     // This is the IPv6 socket.
   1205     MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET,
   1206     // This is the IPv4 socket.
   1207     MockClientSocketFactory::MOCK_PENDING_CLIENT_SOCKET
   1208   };
   1209 
   1210   client_socket_factory_.set_client_socket_types(case_types, 2);
   1211 
   1212   // Resolve an AddressList with a IPv6 address first and then a IPv4 address.
   1213   host_resolver_->rules()
   1214       ->AddIPLiteralRule("*", "2:abcd::3:4:ff,2.2.2.2", std::string());
   1215 
   1216   TestCompletionCallback callback;
   1217   ClientSocketHandle handle;
   1218   int rv = handle.Init("a", low_params_, LOW, callback.callback(), &pool,
   1219                        BoundNetLog());
   1220   EXPECT_EQ(ERR_IO_PENDING, rv);
   1221   EXPECT_FALSE(handle.is_initialized());
   1222   EXPECT_FALSE(handle.socket());
   1223 
   1224   EXPECT_EQ(OK, callback.WaitForResult());
   1225   EXPECT_TRUE(handle.is_initialized());
   1226   EXPECT_TRUE(handle.socket());
   1227   IPEndPoint endpoint;
   1228   handle.socket()->GetLocalAddress(&endpoint);
   1229   EXPECT_EQ(kIPv4AddressSize, endpoint.address().size());
   1230   EXPECT_EQ(2, client_socket_factory_.allocation_count());
   1231 }
   1232 
   1233 // Test the case of the IPv6 address being slow, thus falling back to trying to
   1234 // connect to the IPv4 address, but having the connect to the IPv6 address
   1235 // finish first.
   1236 TEST_F(TransportClientSocketPoolTest, IPv6FallbackSocketIPv6FinishesFirst) {
   1237   // Create a pool without backup jobs.
   1238   ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false);
   1239   TransportClientSocketPool pool(kMaxSockets,
   1240                                  kMaxSocketsPerGroup,
   1241                                  histograms_.get(),
   1242                                  host_resolver_.get(),
   1243                                  &client_socket_factory_,
   1244                                  NULL);
   1245 
   1246   MockClientSocketFactory::ClientSocketType case_types[] = {
   1247     // This is the IPv6 socket.
   1248     MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET,
   1249     // This is the IPv4 socket.
   1250     MockClientSocketFactory::MOCK_STALLED_CLIENT_SOCKET
   1251   };
   1252 
   1253   client_socket_factory_.set_client_socket_types(case_types, 2);
   1254   client_socket_factory_.set_delay(base::TimeDelta::FromMilliseconds(
   1255       TransportConnectJob::kIPv6FallbackTimerInMs + 50));
   1256 
   1257   // Resolve an AddressList with a IPv6 address first and then a IPv4 address.
   1258   host_resolver_->rules()
   1259       ->AddIPLiteralRule("*", "2:abcd::3:4:ff,2.2.2.2", std::string());
   1260 
   1261   TestCompletionCallback callback;
   1262   ClientSocketHandle handle;
   1263   int rv = handle.Init("a", low_params_, LOW, callback.callback(), &pool,
   1264                        BoundNetLog());
   1265   EXPECT_EQ(ERR_IO_PENDING, rv);
   1266   EXPECT_FALSE(handle.is_initialized());
   1267   EXPECT_FALSE(handle.socket());
   1268 
   1269   EXPECT_EQ(OK, callback.WaitForResult());
   1270   EXPECT_TRUE(handle.is_initialized());
   1271   EXPECT_TRUE(handle.socket());
   1272   IPEndPoint endpoint;
   1273   handle.socket()->GetLocalAddress(&endpoint);
   1274   EXPECT_EQ(kIPv6AddressSize, endpoint.address().size());
   1275   EXPECT_EQ(2, client_socket_factory_.allocation_count());
   1276 }
   1277 
   1278 TEST_F(TransportClientSocketPoolTest, IPv6NoIPv4AddressesToFallbackTo) {
   1279   // Create a pool without backup jobs.
   1280   ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false);
   1281   TransportClientSocketPool pool(kMaxSockets,
   1282                                  kMaxSocketsPerGroup,
   1283                                  histograms_.get(),
   1284                                  host_resolver_.get(),
   1285                                  &client_socket_factory_,
   1286                                  NULL);
   1287 
   1288   client_socket_factory_.set_client_socket_type(
   1289       MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET);
   1290 
   1291   // Resolve an AddressList with only IPv6 addresses.
   1292   host_resolver_->rules()
   1293       ->AddIPLiteralRule("*", "2:abcd::3:4:ff,3:abcd::3:4:ff", std::string());
   1294 
   1295   TestCompletionCallback callback;
   1296   ClientSocketHandle handle;
   1297   int rv = handle.Init("a", low_params_, LOW, callback.callback(), &pool,
   1298                        BoundNetLog());
   1299   EXPECT_EQ(ERR_IO_PENDING, rv);
   1300   EXPECT_FALSE(handle.is_initialized());
   1301   EXPECT_FALSE(handle.socket());
   1302 
   1303   EXPECT_EQ(OK, callback.WaitForResult());
   1304   EXPECT_TRUE(handle.is_initialized());
   1305   EXPECT_TRUE(handle.socket());
   1306   IPEndPoint endpoint;
   1307   handle.socket()->GetLocalAddress(&endpoint);
   1308   EXPECT_EQ(kIPv6AddressSize, endpoint.address().size());
   1309   EXPECT_EQ(1, client_socket_factory_.allocation_count());
   1310 }
   1311 
   1312 TEST_F(TransportClientSocketPoolTest, IPv4HasNoFallback) {
   1313   // Create a pool without backup jobs.
   1314   ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false);
   1315   TransportClientSocketPool pool(kMaxSockets,
   1316                                  kMaxSocketsPerGroup,
   1317                                  histograms_.get(),
   1318                                  host_resolver_.get(),
   1319                                  &client_socket_factory_,
   1320                                  NULL);
   1321 
   1322   client_socket_factory_.set_client_socket_type(
   1323       MockClientSocketFactory::MOCK_DELAYED_CLIENT_SOCKET);
   1324 
   1325   // Resolve an AddressList with only IPv4 addresses.
   1326   host_resolver_->rules()->AddIPLiteralRule("*", "1.1.1.1", std::string());
   1327 
   1328   TestCompletionCallback callback;
   1329   ClientSocketHandle handle;
   1330   int rv = handle.Init("a", low_params_, LOW, callback.callback(), &pool,
   1331                        BoundNetLog());
   1332   EXPECT_EQ(ERR_IO_PENDING, rv);
   1333   EXPECT_FALSE(handle.is_initialized());
   1334   EXPECT_FALSE(handle.socket());
   1335 
   1336   EXPECT_EQ(OK, callback.WaitForResult());
   1337   EXPECT_TRUE(handle.is_initialized());
   1338   EXPECT_TRUE(handle.socket());
   1339   IPEndPoint endpoint;
   1340   handle.socket()->GetLocalAddress(&endpoint);
   1341   EXPECT_EQ(kIPv4AddressSize, endpoint.address().size());
   1342   EXPECT_EQ(1, client_socket_factory_.allocation_count());
   1343 }
   1344 
   1345 }  // namespace
   1346 
   1347 }  // namespace net
   1348