15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socks_client_socket_pool.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_timing_info.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/load_timing_info_test_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_factory.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_handle.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/client_socket_pool_histograms.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/socket_test_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMaxSockets = 32; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMaxSocketsPerGroup = 6; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure |handle|'s load times are set correctly. Only connect times should 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// be set. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TestLoadTimingInfo(const ClientSocketHandle& handle) { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadTimingInfo load_timing_info; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(handle.GetLoadTimingInfo(false, &load_timing_info)); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // None of these tests use a NetLog. 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(load_timing_info.socket_reused); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectConnectTimingHasTimes(load_timing_info.connect_timing, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONNECT_TIMING_HAS_CONNECT_TIMES_ONLY); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_refptr<TransportSocketParams> CreateProxyHostParams() { 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return new TransportSocketParams( 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HostPortPair("proxy", 80), false, false, OnHostResolutionCallback(), 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT); 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_refptr<SOCKSSocketParams> CreateSOCKSv4Params() { 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return new SOCKSSocketParams( 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CreateProxyHostParams(), false /* socks_v5 */, 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) HostPortPair("host", 80)); 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_refptr<SOCKSSocketParams> CreateSOCKSv5Params() { 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return new SOCKSSocketParams( 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CreateProxyHostParams(), true /* socks_v5 */, 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) HostPortPair("host", 80)); 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SOCKSClientSocketPoolTest : public testing::Test { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class SOCKS5MockData { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit SOCKS5MockData(IoMode mode) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writes_.reset(new MockWrite[3]); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writes_[0] = MockWrite(mode, kSOCKS5GreetRequest, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSOCKS5GreetRequestLength); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writes_[1] = MockWrite(mode, kSOCKS5OkRequest, kSOCKS5OkRequestLength); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writes_[2] = MockWrite(mode, 0); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reads_.reset(new MockRead[3]); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reads_[0] = MockRead(mode, kSOCKS5GreetResponse, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kSOCKS5GreetResponseLength); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reads_[1] = MockRead(mode, kSOCKS5OkResponse, kSOCKS5OkResponseLength); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reads_[2] = MockRead(mode, 0); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_.reset(new StaticSocketDataProvider(reads_.get(), 3, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writes_.get(), 3)); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SocketDataProvider* data_provider() { return data_.get(); } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<StaticSocketDataProvider> data_; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<MockWrite[]> writes_; 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<MockRead[]> reads_; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOCKSClientSocketPoolTest() 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) : transport_histograms_("MockTCP"), 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_socket_pool_( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMaxSockets, kMaxSocketsPerGroup, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &transport_histograms_, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &transport_client_socket_factory_), 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socks_histograms_("SOCKSUnitTest"), 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool_(kMaxSockets, kMaxSocketsPerGroup, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &socks_histograms_, 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &host_resolver_, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &transport_socket_pool_, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SOCKSClientSocketPoolTest() {} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int StartRequestV5(const std::string& group_name, RequestPriority priority) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_base_.StartRequestUsingPool( 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &pool_, group_name, priority, CreateSOCKSv5Params()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetOrderOfRequest(size_t index) const { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_base_.GetOrderOfRequest(index); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<TestSocketRequest>* requests() { return test_base_.requests(); } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSocketPoolHistograms transport_histograms_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockClientSocketFactory transport_client_socket_factory_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockTransportClientSocketPool transport_socket_pool_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSocketPoolHistograms socks_histograms_; 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MockHostResolver host_resolver_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOCKSClientSocketPool pool_; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSocketPoolTest test_base_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SOCKSClientSocketPoolTest, Simple) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOCKS5MockData data(SYNCHRONOUS); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSocketHandle handle; 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, CompletionCallback(), 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pool_, BoundNetLog()); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, rv); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(handle.is_initialized()); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(handle.socket()); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestLoadTimingInfo(handle); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Make sure that SOCKSConnectJob passes on its priority to its 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// socket request on Init. 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(SOCKSClientSocketPoolTest, SetSocketRequestPriorityOnInit) { 1468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) RequestPriority priority = static_cast<RequestPriority>(i); 1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SOCKS5MockData data(SYNCHRONOUS); 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); 1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) transport_client_socket_factory_.AddSocketDataProvider( 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) data.data_provider()); 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ClientSocketHandle handle; 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(OK, 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) handle.Init("a", CreateSOCKSv5Params(), priority, 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CompletionCallback(), &pool_, BoundNetLog())); 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); 1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) handle.socket()->Disconnect(); 1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Make sure that SOCKSConnectJob passes on its priority to its 1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// HostResolver request (for non-SOCKS5) on Init. 1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(SOCKSClientSocketPoolTest, SetResolvePriorityOnInit) { 1658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { 1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) RequestPriority priority = static_cast<RequestPriority>(i); 1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SOCKS5MockData data(SYNCHRONOUS); 1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); 1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) transport_client_socket_factory_.AddSocketDataProvider( 1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) data.data_provider()); 1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ClientSocketHandle handle; 1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) handle.Init("a", CreateSOCKSv4Params(), priority, 1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CompletionCallback(), &pool_, BoundNetLog())); 1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); 1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(priority, host_resolver_.last_request_priority()); 1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(handle.socket() == NULL); 1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SOCKSClientSocketPoolTest, Async) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOCKS5MockData data(ASYNC); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSocketHandle handle; 1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, callback.callback(), 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pool_, BoundNetLog()); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.is_initialized()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.socket()); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(handle.is_initialized()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(handle.socket()); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestLoadTimingInfo(handle); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SOCKSClientSocketPoolTest, TransportConnectError) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StaticSocketDataProvider socket_data; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_data.set_connect_data(MockConnect(SYNCHRONOUS, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ERR_CONNECTION_REFUSED)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_client_socket_factory_.AddSocketDataProvider(&socket_data); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSocketHandle handle; 2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, CompletionCallback(), 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pool_, BoundNetLog()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.is_initialized()); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.socket()); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SOCKSClientSocketPoolTest, AsyncTransportConnectError) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StaticSocketDataProvider socket_data; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_data.set_connect_data(MockConnect(ASYNC, ERR_CONNECTION_REFUSED)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_client_socket_factory_.AddSocketDataProvider(&socket_data); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSocketHandle handle; 2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, callback.callback(), 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pool_, BoundNetLog()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.is_initialized()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.socket()); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback.WaitForResult()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.is_initialized()); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.socket()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SOCKSClientSocketPoolTest, SOCKSConnectError) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead failed_read[] = { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead(SYNCHRONOUS, 0), 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StaticSocketDataProvider socket_data( 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) failed_read, arraysize(failed_read), NULL, 0); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_client_socket_factory_.AddSocketDataProvider(&socket_data); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSocketHandle handle; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, transport_socket_pool_.release_count()); 2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, CompletionCallback(), 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pool_, BoundNetLog()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.is_initialized()); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.socket()); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, transport_socket_pool_.release_count()); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SOCKSClientSocketPoolTest, AsyncSOCKSConnectError) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead failed_read[] = { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockRead(ASYNC, 0), 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StaticSocketDataProvider socket_data( 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) failed_read, arraysize(failed_read), NULL, 0); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_data.set_connect_data(MockConnect(SYNCHRONOUS, OK)); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_client_socket_factory_.AddSocketDataProvider(&socket_data); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClientSocketHandle handle; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, transport_socket_pool_.release_count()); 2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, callback.callback(), 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pool_, BoundNetLog()); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.is_initialized()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.socket()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, callback.WaitForResult()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.is_initialized()); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(handle.socket()); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, transport_socket_pool_.release_count()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SOCKSClientSocketPoolTest, CancelDuringTransportConnect) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOCKS5MockData data(SYNCHRONOUS); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need two connections because the pool base lets one cancelled 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // connect job proceed for potential future use. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOCKS5MockData data2(SYNCHRONOUS); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_client_socket_factory_.AddSocketDataProvider(data2.data_provider()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, transport_socket_pool_.cancel_count()); 2843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int rv = StartRequestV5("a", LOW); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) rv = StartRequestV5("a", LOW); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool_.CancelRequest("a", (*requests())[0]->handle()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool_.CancelRequest("a", (*requests())[1]->handle()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests in the connect phase don't actually get cancelled. 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, transport_socket_pool_.cancel_count()); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now wait for the TCP sockets to connect. 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(1)); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(2)); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, transport_socket_pool_.cancel_count()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, pool_.IdleSocketCount()); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*requests())[0]->handle()->Reset(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*requests())[1]->handle()->Reset(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SOCKSClientSocketPoolTest, CancelDuringSOCKSConnect) { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOCKS5MockData data(ASYNC); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need two connections because the pool base lets one cancelled 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // connect job proceed for potential future use. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOCKS5MockData data2(ASYNC); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data2.data_provider()->set_connect_data(MockConnect(SYNCHRONOUS, OK)); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transport_client_socket_factory_.AddSocketDataProvider(data2.data_provider()); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, transport_socket_pool_.cancel_count()); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, transport_socket_pool_.release_count()); 3193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int rv = StartRequestV5("a", LOW); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) rv = StartRequestV5("a", LOW); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool_.CancelRequest("a", (*requests())[0]->handle()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pool_.CancelRequest("a", (*requests())[1]->handle()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, transport_socket_pool_.cancel_count()); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests in the connect phase don't actually get cancelled. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, transport_socket_pool_.release_count()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now wait for the async data to reach the SOCKS connect jobs. 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(1)); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(2)); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, transport_socket_pool_.cancel_count()); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, transport_socket_pool_.release_count()); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, pool_.IdleSocketCount()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*requests())[0]->handle()->Reset(); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*requests())[1]->handle()->Reset(); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It would be nice to also test the timeouts in SOCKSClientSocketPool. 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 349