1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/socks_client_socket_pool.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/compiler_specific.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/mock_host_resolver.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_errors.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/test_completion_callback.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/client_socket_factory.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/client_socket_handle.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/client_socket_pool_histograms.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/socket/socket_test_util.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net { 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kMaxSockets = 32; 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kMaxSocketsPerGroup = 6; 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass SOCKSClientSocketPoolTest : public testing::Test { 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class SOCKS5MockData { 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit SOCKS5MockData(bool async) { 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch writes_.reset(new MockWrite[3]); 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch writes_[0] = MockWrite(async, kSOCKS5GreetRequest, 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kSOCKS5GreetRequestLength); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch writes_[1] = MockWrite(async, kSOCKS5OkRequest, kSOCKS5OkRequestLength); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch writes_[2] = MockWrite(async, 0); 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch reads_.reset(new MockRead[3]); 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch reads_[0] = MockRead(async, kSOCKS5GreetResponse, 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kSOCKS5GreetResponseLength); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch reads_[1] = MockRead(async, kSOCKS5OkResponse, kSOCKS5OkResponseLength); 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch reads_[2] = MockRead(async, 0); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data_.reset(new StaticSocketDataProvider(reads_.get(), 3, 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch writes_.get(), 3)); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SocketDataProvider* data_provider() { return data_.get(); } 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<StaticSocketDataProvider> data_; 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_array<MockWrite> writes_; 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_array<MockWrite> reads_; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SOCKSClientSocketPoolTest() 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : ignored_transport_socket_params_(new TransportSocketParams( 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HostPortPair("proxy", 80), MEDIUM, GURL(), false, false)), 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_histograms_("MockTCP"), 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_socket_pool_( 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick kMaxSockets, kMaxSocketsPerGroup, 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &transport_histograms_, 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &transport_client_socket_factory_), 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ignored_socket_params_(new SOCKSSocketParams( 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ignored_transport_socket_params_, true, HostPortPair("host", 80), 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MEDIUM, GURL())), 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick socks_histograms_("SOCKSUnitTest"), 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick pool_(kMaxSockets, kMaxSocketsPerGroup, 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick &socks_histograms_, 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NULL, 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &transport_socket_pool_, 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NULL) { 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual ~SOCKSClientSocketPoolTest() {} 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int StartRequest(const std::string& group_name, RequestPriority priority) { 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return test_base_.StartRequestUsingPool( 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick &pool_, group_name, priority, ignored_socket_params_); 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int GetOrderOfRequest(size_t index) const { 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return test_base_.GetOrderOfRequest(index); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ScopedVector<TestSocketRequest>* requests() { return test_base_.requests(); } 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<TransportSocketParams> ignored_transport_socket_params_; 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ClientSocketPoolHistograms transport_histograms_; 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockClientSocketFactory transport_client_socket_factory_; 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MockTransportClientSocketPool transport_socket_pool_; 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<SOCKSSocketParams> ignored_socket_params_; 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ClientSocketPoolHistograms socks_histograms_; 943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SOCKSClientSocketPool pool_; 953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ClientSocketPoolTest test_base_; 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SOCKSClientSocketPoolTest, Simple) { 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SOCKS5MockData data(false); 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data.data_provider()->set_connect_data(MockConnect(false, 0)); 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init("a", ignored_socket_params_, LOW, NULL, &pool_, 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BoundNetLog()); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, rv); 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_initialized()); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.socket()); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SOCKSClientSocketPoolTest, Async) { 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SOCKS5MockData data(true); 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init("a", ignored_socket_params_, LOW, &callback, &pool_, 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BoundNetLog()); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(OK, callback.WaitForResult()); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.is_initialized()); 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(handle.socket()); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SOCKSClientSocketPoolTest, TransportConnectError) { 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<SocketDataProvider> socket_data(new StaticSocketDataProvider()); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_data->set_connect_data(MockConnect(false, ERR_CONNECTION_REFUSED)); 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_client_socket_factory_.AddSocketDataProvider(socket_data.get()); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init("a", ignored_socket_params_, LOW, NULL, &pool_, 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BoundNetLog()); 1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SOCKSClientSocketPoolTest, AsyncTransportConnectError) { 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<SocketDataProvider> socket_data(new StaticSocketDataProvider()); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_data->set_connect_data(MockConnect(true, ERR_CONNECTION_REFUSED)); 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_client_socket_factory_.AddSocketDataProvider(socket_data.get()); 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init("a", ignored_socket_params_, LOW, &callback, &pool_, 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BoundNetLog()); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, callback.WaitForResult()); 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SOCKSClientSocketPoolTest, SOCKSConnectError) { 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockRead failed_read[] = { 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockRead(false, 0), 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<SocketDataProvider> socket_data(new StaticSocketDataProvider( 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch failed_read, arraysize(failed_read), NULL, 0)); 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_data->set_connect_data(MockConnect(false, 0)); 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_client_socket_factory_.AddSocketDataProvider(socket_data.get()); 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0, transport_socket_pool_.release_count()); 1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init("a", ignored_socket_params_, LOW, NULL, &pool_, 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BoundNetLog()); 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(1, transport_socket_pool_.release_count()); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SOCKSClientSocketPoolTest, AsyncSOCKSConnectError) { 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockRead failed_read[] = { 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockRead(true, 0), 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<SocketDataProvider> socket_data(new StaticSocketDataProvider( 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch failed_read, arraysize(failed_read), NULL, 0)); 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch socket_data->set_connect_data(MockConnect(false, 0)); 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_client_socket_factory_.AddSocketDataProvider(socket_data.get()); 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestCompletionCallback callback; 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClientSocketHandle handle; 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0, transport_socket_pool_.release_count()); 1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int rv = handle.Init("a", ignored_socket_params_, LOW, &callback, &pool_, 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BoundNetLog()); 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, callback.WaitForResult()); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.is_initialized()); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(handle.socket()); 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(1, transport_socket_pool_.release_count()); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(SOCKSClientSocketPoolTest, CancelDuringTransportConnect) { 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SOCKS5MockData data(false); 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We need two connections because the pool base lets one cancelled 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // connect job proceed for potential future use. 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SOCKS5MockData data2(false); 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_client_socket_factory_.AddSocketDataProvider(data2.data_provider()); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0, transport_socket_pool_.cancel_count()); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv = StartRequest("a", LOW); 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = StartRequest("a", LOW); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick pool_.CancelRequest("a", (*requests())[0]->handle()); 2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick pool_.CancelRequest("a", (*requests())[1]->handle()); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Requests in the connect phase don't actually get cancelled. 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0, transport_socket_pool_.cancel_count()); 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now wait for the TCP sockets to connect. 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->RunAllPending(); 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(1)); 2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(2)); 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0, transport_socket_pool_.cancel_count()); 2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2, pool_.IdleSocketCount()); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick (*requests())[0]->handle()->Reset(); 2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick (*requests())[1]->handle()->Reset(); 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SOCKSClientSocketPoolTest, CancelDuringSOCKSConnect) { 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SOCKS5MockData data(true); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data.data_provider()->set_connect_data(MockConnect(false, 0)); 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We need two connections because the pool base lets one cancelled 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // connect job proceed for potential future use. 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SOCKS5MockData data2(true); 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data2.data_provider()->set_connect_data(MockConnect(false, 0)); 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen transport_client_socket_factory_.AddSocketDataProvider(data2.data_provider()); 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0, transport_socket_pool_.cancel_count()); 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0, transport_socket_pool_.release_count()); 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int rv = StartRequest("a", LOW); 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rv = StartRequest("a", LOW); 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(ERR_IO_PENDING, rv); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick pool_.CancelRequest("a", (*requests())[0]->handle()); 2533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick pool_.CancelRequest("a", (*requests())[1]->handle()); 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0, transport_socket_pool_.cancel_count()); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Requests in the connect phase don't actually get cancelled. 256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0, transport_socket_pool_.release_count()); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now wait for the async data to reach the SOCKS connect jobs. 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->RunAllPending(); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(1)); 2623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ClientSocketPoolTest::kRequestNotFound, GetOrderOfRequest(2)); 263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0, transport_socket_pool_.cancel_count()); 264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(0, transport_socket_pool_.release_count()); 2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(2, pool_.IdleSocketCount()); 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick (*requests())[0]->handle()->Reset(); 2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick (*requests())[1]->handle()->Reset(); 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// It would be nice to also test the timeouts in SOCKSClientSocketPool. 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace net 276