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