blob: 1a6db28a838c1bdd0cbe55b134d81a4abbb2e0bf [file] [log] [blame]
[email protected]034d3892011-03-29 04:07:211// Copyright (c) 2011 The Chromium Authors. All rights reserved.
[email protected]76a51ac82009-06-28 07:58:582// 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/socks_client_socket.h"
6
7#include "net/base/address_list.h"
[email protected]9e743cd2010-03-16 07:03:538#include "net/base/net_log.h"
9#include "net/base/net_log_unittest.h"
[email protected]b59ff372009-07-15 22:04:3210#include "net/base/mock_host_resolver.h"
[email protected]76a51ac82009-06-28 07:58:5811#include "net/base/test_completion_callback.h"
12#include "net/base/winsock_init.h"
13#include "net/socket/client_socket_factory.h"
14#include "net/socket/tcp_client_socket.h"
15#include "net/socket/socket_test_util.h"
16#include "testing/gtest/include/gtest/gtest.h"
17#include "testing/platform_test.h"
18
19//-----------------------------------------------------------------------------
20
21namespace net {
22
23const char kSOCKSOkRequest[] = { 0x04, 0x01, 0x00, 0x50, 127, 0, 0, 1, 0 };
[email protected]76a51ac82009-06-28 07:58:5824const char kSOCKSOkReply[] = { 0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0 };
25
26class SOCKSClientSocketTest : public PlatformTest {
27 public:
28 SOCKSClientSocketTest();
29 // Create a SOCKSClientSocket on top of a MockSocket.
[email protected]31a2bfe2010-02-09 08:03:3930 SOCKSClientSocket* BuildMockSocket(MockRead reads[], size_t reads_count,
31 MockWrite writes[], size_t writes_count,
[email protected]16a02742010-01-07 22:50:1032 HostResolver* host_resolver,
[email protected]a2006ece2010-04-23 16:44:0233 const std::string& hostname, int port,
34 NetLog* net_log);
[email protected]76a51ac82009-06-28 07:58:5835 virtual void SetUp();
36
37 protected:
38 scoped_ptr<SOCKSClientSocket> user_sock_;
39 AddressList address_list_;
[email protected]3268023f2011-05-05 00:08:1040 StreamSocket* tcp_sock_;
[email protected]83039bb2011-12-09 18:43:5541 TestCompletionCallback callback_;
[email protected]73c45322010-10-01 23:57:5442 scoped_ptr<MockHostResolver> host_resolver_;
[email protected]5ecc992a42009-11-11 01:41:5943 scoped_ptr<SocketDataProvider> data_;
[email protected]76a51ac82009-06-28 07:58:5844};
45
46SOCKSClientSocketTest::SOCKSClientSocketTest()
[email protected]b59ff372009-07-15 22:04:3247 : host_resolver_(new MockHostResolver) {
[email protected]76a51ac82009-06-28 07:58:5848}
49
50// Set up platform before every test case
51void SOCKSClientSocketTest::SetUp() {
52 PlatformTest::SetUp();
[email protected]76a51ac82009-06-28 07:58:5853}
54
55SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket(
56 MockRead reads[],
[email protected]31a2bfe2010-02-09 08:03:3957 size_t reads_count,
[email protected]76a51ac82009-06-28 07:58:5858 MockWrite writes[],
[email protected]31a2bfe2010-02-09 08:03:3959 size_t writes_count,
[email protected]16a02742010-01-07 22:50:1060 HostResolver* host_resolver,
[email protected]76a51ac82009-06-28 07:58:5861 const std::string& hostname,
[email protected]a2006ece2010-04-23 16:44:0262 int port,
63 NetLog* net_log) {
[email protected]76a51ac82009-06-28 07:58:5864
[email protected]83039bb2011-12-09 18:43:5565 TestCompletionCallback callback;
[email protected]31a2bfe2010-02-09 08:03:3966 data_.reset(new StaticSocketDataProvider(reads, reads_count,
67 writes, writes_count));
[email protected]a2006ece2010-04-23 16:44:0268 tcp_sock_ = new MockTCPClientSocket(address_list_, net_log, data_.get());
[email protected]76a51ac82009-06-28 07:58:5869
[email protected]83039bb2011-12-09 18:43:5570 int rv = tcp_sock_->Connect(callback.callback());
[email protected]76a51ac82009-06-28 07:58:5871 EXPECT_EQ(ERR_IO_PENDING, rv);
72 rv = callback.WaitForResult();
73 EXPECT_EQ(OK, rv);
74 EXPECT_TRUE(tcp_sock_->IsConnected());
75
76 return new SOCKSClientSocket(tcp_sock_,
[email protected]930cc742010-09-15 22:54:1077 HostResolver::RequestInfo(HostPortPair(hostname, port)),
[email protected]16a02742010-01-07 22:50:1078 host_resolver);
[email protected]76a51ac82009-06-28 07:58:5879}
80
[email protected]16a02742010-01-07 22:50:1081// Implementation of HostResolver that never completes its resolve request.
82// We use this in the test "DisconnectWhileHostResolveInProgress" to make
83// sure that the outstanding resolve request gets cancelled.
[email protected]98e1cd012011-11-08 15:33:0984class HangingHostResolverWithCancel : public HostResolver {
[email protected]16a02742010-01-07 22:50:1085 public:
[email protected]98e1cd012011-11-08 15:33:0986 HangingHostResolverWithCancel() : outstanding_request_(NULL) {}
[email protected]16a02742010-01-07 22:50:1087
88 virtual int Resolve(const RequestInfo& info,
89 AddressList* addresses,
[email protected]aa22b242011-11-16 18:58:2990 const CompletionCallback& callback,
[email protected]16a02742010-01-07 22:50:1091 RequestHandle* out_req,
[email protected]95a214c2011-08-04 21:50:4092 const BoundNetLog& net_log) OVERRIDE {
93 DCHECK(addresses);
[email protected]aa22b242011-11-16 18:58:2994 DCHECK_EQ(false, callback.is_null());
[email protected]16a02742010-01-07 22:50:1095 EXPECT_FALSE(HasOutstandingRequest());
96 outstanding_request_ = reinterpret_cast<RequestHandle>(1);
97 *out_req = outstanding_request_;
98 return ERR_IO_PENDING;
99 }
100
[email protected]95a214c2011-08-04 21:50:40101 virtual int ResolveFromCache(const RequestInfo& info,
102 AddressList* addresses,
103 const BoundNetLog& net_log) OVERRIDE {
104 NOTIMPLEMENTED();
105 return ERR_UNEXPECTED;
106 }
107
108 virtual void CancelRequest(RequestHandle req) OVERRIDE {
[email protected]16a02742010-01-07 22:50:10109 EXPECT_TRUE(HasOutstandingRequest());
110 EXPECT_EQ(outstanding_request_, req);
111 outstanding_request_ = NULL;
112 }
113
[email protected]16a02742010-01-07 22:50:10114 bool HasOutstandingRequest() {
115 return outstanding_request_ != NULL;
116 }
117
118 private:
119 RequestHandle outstanding_request_;
120
[email protected]98e1cd012011-11-08 15:33:09121 DISALLOW_COPY_AND_ASSIGN(HangingHostResolverWithCancel);
[email protected]16a02742010-01-07 22:50:10122};
123
[email protected]76a51ac82009-06-28 07:58:58124// Tests a complete handshake and the disconnection.
125TEST_F(SOCKSClientSocketTest, CompleteHandshake) {
126 const std::string payload_write = "random data";
127 const std::string payload_read = "moar random data";
128
129 MockWrite data_writes[] = {
130 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)),
131 MockWrite(true, payload_write.data(), payload_write.size()) };
132 MockRead data_reads[] = {
133 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)),
134 MockRead(true, payload_read.data(), payload_read.size()) };
[email protected]a2006ece2010-04-23 16:44:02135 CapturingNetLog log(CapturingNetLog::kUnbounded);
[email protected]76a51ac82009-06-28 07:58:58136
[email protected]31a2bfe2010-02-09 08:03:39137 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
138 data_writes, arraysize(data_writes),
[email protected]73c45322010-10-01 23:57:54139 host_resolver_.get(),
140 "localhost", 80,
141 &log));
[email protected]76a51ac82009-06-28 07:58:58142
143 // At this state the TCP connection is completed but not the SOCKS handshake.
144 EXPECT_TRUE(tcp_sock_->IsConnected());
145 EXPECT_FALSE(user_sock_->IsConnected());
146
[email protected]83039bb2011-12-09 18:43:55147 int rv = user_sock_->Connect(callback_.callback());
[email protected]76a51ac82009-06-28 07:58:58148 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]76a51ac82009-06-28 07:58:58149
[email protected]b2fcd0e2010-12-01 15:19:40150 net::CapturingNetLog::EntryList entries;
151 log.GetEntries(&entries);
152 EXPECT_TRUE(
153 LogContainsBeginEvent(entries, 0, NetLog::TYPE_SOCKS_CONNECT));
154 EXPECT_FALSE(user_sock_->IsConnected());
155
156 rv = callback_.WaitForResult();
[email protected]76a51ac82009-06-28 07:58:58157 EXPECT_EQ(OK, rv);
158 EXPECT_TRUE(user_sock_->IsConnected());
[email protected]b2fcd0e2010-12-01 15:19:40159 log.GetEntries(&entries);
[email protected]9e743cd2010-03-16 07:03:53160 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40161 entries, -1, NetLog::TYPE_SOCKS_CONNECT));
[email protected]76a51ac82009-06-28 07:58:58162
[email protected]ad8e04a2010-11-01 04:16:27163 scoped_refptr<IOBuffer> buffer(new IOBuffer(payload_write.size()));
[email protected]76a51ac82009-06-28 07:58:58164 memcpy(buffer->data(), payload_write.data(), payload_write.size());
[email protected]83039bb2011-12-09 18:43:55165 rv = user_sock_->Write(buffer, payload_write.size(), callback_.callback());
[email protected]76a51ac82009-06-28 07:58:58166 EXPECT_EQ(ERR_IO_PENDING, rv);
167 rv = callback_.WaitForResult();
168 EXPECT_EQ(static_cast<int>(payload_write.size()), rv);
169
170 buffer = new IOBuffer(payload_read.size());
[email protected]83039bb2011-12-09 18:43:55171 rv = user_sock_->Read(buffer, payload_read.size(), callback_.callback());
[email protected]76a51ac82009-06-28 07:58:58172 EXPECT_EQ(ERR_IO_PENDING, rv);
173 rv = callback_.WaitForResult();
174 EXPECT_EQ(static_cast<int>(payload_read.size()), rv);
175 EXPECT_EQ(payload_read, std::string(buffer->data(), payload_read.size()));
176
177 user_sock_->Disconnect();
178 EXPECT_FALSE(tcp_sock_->IsConnected());
179 EXPECT_FALSE(user_sock_->IsConnected());
180}
181
182// List of responses from the socks server and the errors they should
183// throw up are tested here.
184TEST_F(SOCKSClientSocketTest, HandshakeFailures) {
185 const struct {
186 const char fail_reply[8];
187 Error fail_code;
188 } tests[] = {
189 // Failure of the server response code
190 {
191 { 0x01, 0x5A, 0x00, 0x00, 0, 0, 0, 0 },
[email protected]d5a309592010-02-05 02:22:52192 ERR_SOCKS_CONNECTION_FAILED,
[email protected]76a51ac82009-06-28 07:58:58193 },
194 // Failure of the null byte
195 {
196 { 0x00, 0x5B, 0x00, 0x00, 0, 0, 0, 0 },
[email protected]d5a309592010-02-05 02:22:52197 ERR_SOCKS_CONNECTION_FAILED,
[email protected]76a51ac82009-06-28 07:58:58198 },
199 };
200
201 //---------------------------------------
202
203 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
204 MockWrite data_writes[] = {
205 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) };
206 MockRead data_reads[] = {
207 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) };
[email protected]a2006ece2010-04-23 16:44:02208 CapturingNetLog log(CapturingNetLog::kUnbounded);
[email protected]76a51ac82009-06-28 07:58:58209
[email protected]31a2bfe2010-02-09 08:03:39210 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
211 data_writes, arraysize(data_writes),
[email protected]73c45322010-10-01 23:57:54212 host_resolver_.get(),
213 "localhost", 80,
214 &log));
[email protected]76a51ac82009-06-28 07:58:58215
[email protected]83039bb2011-12-09 18:43:55216 int rv = user_sock_->Connect(callback_.callback());
[email protected]76a51ac82009-06-28 07:58:58217 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]b2fcd0e2010-12-01 15:19:40218
219 net::CapturingNetLog::EntryList entries;
220 log.GetEntries(&entries);
[email protected]9e743cd2010-03-16 07:03:53221 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:40222 entries, 0, NetLog::TYPE_SOCKS_CONNECT));
223
[email protected]76a51ac82009-06-28 07:58:58224 rv = callback_.WaitForResult();
225 EXPECT_EQ(tests[i].fail_code, rv);
226 EXPECT_FALSE(user_sock_->IsConnected());
227 EXPECT_TRUE(tcp_sock_->IsConnected());
[email protected]b2fcd0e2010-12-01 15:19:40228 log.GetEntries(&entries);
[email protected]9e743cd2010-03-16 07:03:53229 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40230 entries, -1, NetLog::TYPE_SOCKS_CONNECT));
[email protected]76a51ac82009-06-28 07:58:58231 }
232}
233
234// Tests scenario when the server sends the handshake response in
235// more than one packet.
236TEST_F(SOCKSClientSocketTest, PartialServerReads) {
237 const char kSOCKSPartialReply1[] = { 0x00 };
238 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 };
239
240 MockWrite data_writes[] = {
241 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) };
242 MockRead data_reads[] = {
243 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)),
244 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) };
[email protected]a2006ece2010-04-23 16:44:02245 CapturingNetLog log(CapturingNetLog::kUnbounded);
[email protected]76a51ac82009-06-28 07:58:58246
[email protected]31a2bfe2010-02-09 08:03:39247 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
248 data_writes, arraysize(data_writes),
[email protected]73c45322010-10-01 23:57:54249 host_resolver_.get(),
250 "localhost", 80,
251 &log));
[email protected]76a51ac82009-06-28 07:58:58252
[email protected]83039bb2011-12-09 18:43:55253 int rv = user_sock_->Connect(callback_.callback());
[email protected]76a51ac82009-06-28 07:58:58254 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]b2fcd0e2010-12-01 15:19:40255 net::CapturingNetLog::EntryList entries;
256 log.GetEntries(&entries);
[email protected]e9002a92010-01-29 07:10:46257 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:40258 entries, 0, NetLog::TYPE_SOCKS_CONNECT));
259
[email protected]76a51ac82009-06-28 07:58:58260 rv = callback_.WaitForResult();
261 EXPECT_EQ(OK, rv);
262 EXPECT_TRUE(user_sock_->IsConnected());
[email protected]b2fcd0e2010-12-01 15:19:40263 log.GetEntries(&entries);
[email protected]9e743cd2010-03-16 07:03:53264 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40265 entries, -1, NetLog::TYPE_SOCKS_CONNECT));
[email protected]76a51ac82009-06-28 07:58:58266}
267
268// Tests scenario when the client sends the handshake request in
269// more than one packet.
270TEST_F(SOCKSClientSocketTest, PartialClientWrites) {
271 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 };
272 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 };
273
274 MockWrite data_writes[] = {
275 MockWrite(true, arraysize(kSOCKSPartialRequest1)),
276 // simulate some empty writes
277 MockWrite(true, 0),
278 MockWrite(true, 0),
279 MockWrite(true, kSOCKSPartialRequest2,
280 arraysize(kSOCKSPartialRequest2)) };
281 MockRead data_reads[] = {
282 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) };
[email protected]a2006ece2010-04-23 16:44:02283 CapturingNetLog log(CapturingNetLog::kUnbounded);
[email protected]76a51ac82009-06-28 07:58:58284
[email protected]31a2bfe2010-02-09 08:03:39285 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
286 data_writes, arraysize(data_writes),
[email protected]73c45322010-10-01 23:57:54287 host_resolver_.get(),
288 "localhost", 80,
289 &log));
[email protected]76a51ac82009-06-28 07:58:58290
[email protected]83039bb2011-12-09 18:43:55291 int rv = user_sock_->Connect(callback_.callback());
[email protected]76a51ac82009-06-28 07:58:58292 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]b2fcd0e2010-12-01 15:19:40293 net::CapturingNetLog::EntryList entries;
294 log.GetEntries(&entries);
[email protected]9e743cd2010-03-16 07:03:53295 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:40296 entries, 0, NetLog::TYPE_SOCKS_CONNECT));
297
[email protected]76a51ac82009-06-28 07:58:58298 rv = callback_.WaitForResult();
299 EXPECT_EQ(OK, rv);
300 EXPECT_TRUE(user_sock_->IsConnected());
[email protected]b2fcd0e2010-12-01 15:19:40301 log.GetEntries(&entries);
[email protected]9e743cd2010-03-16 07:03:53302 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40303 entries, -1, NetLog::TYPE_SOCKS_CONNECT));
[email protected]76a51ac82009-06-28 07:58:58304}
305
306// Tests the case when the server sends a smaller sized handshake data
307// and closes the connection.
308TEST_F(SOCKSClientSocketTest, FailedSocketRead) {
309 MockWrite data_writes[] = {
310 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) };
311 MockRead data_reads[] = {
312 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2),
313 // close connection unexpectedly
314 MockRead(false, 0) };
[email protected]a2006ece2010-04-23 16:44:02315 CapturingNetLog log(CapturingNetLog::kUnbounded);
[email protected]76a51ac82009-06-28 07:58:58316
[email protected]31a2bfe2010-02-09 08:03:39317 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
318 data_writes, arraysize(data_writes),
[email protected]73c45322010-10-01 23:57:54319 host_resolver_.get(),
320 "localhost", 80,
321 &log));
[email protected]76a51ac82009-06-28 07:58:58322
[email protected]83039bb2011-12-09 18:43:55323 int rv = user_sock_->Connect(callback_.callback());
[email protected]76a51ac82009-06-28 07:58:58324 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]b2fcd0e2010-12-01 15:19:40325 net::CapturingNetLog::EntryList entries;
326 log.GetEntries(&entries);
[email protected]9e743cd2010-03-16 07:03:53327 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:40328 entries, 0, NetLog::TYPE_SOCKS_CONNECT));
329
[email protected]76a51ac82009-06-28 07:58:58330 rv = callback_.WaitForResult();
331 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv);
332 EXPECT_FALSE(user_sock_->IsConnected());
[email protected]b2fcd0e2010-12-01 15:19:40333 log.GetEntries(&entries);
[email protected]9e743cd2010-03-16 07:03:53334 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40335 entries, -1, NetLog::TYPE_SOCKS_CONNECT));
[email protected]76a51ac82009-06-28 07:58:58336}
337
[email protected]034d3892011-03-29 04:07:21338// Tries to connect to an unknown hostname. Should fail rather than
339// falling back to SOCKS4a.
340TEST_F(SOCKSClientSocketTest, FailedDNS) {
[email protected]76a51ac82009-06-28 07:58:58341 const char hostname[] = "unresolved.ipv4.address";
342
[email protected]b59ff372009-07-15 22:04:32343 host_resolver_->rules()->AddSimulatedFailure(hostname);
[email protected]76a51ac82009-06-28 07:58:58344
[email protected]a2006ece2010-04-23 16:44:02345 CapturingNetLog log(CapturingNetLog::kUnbounded);
[email protected]76a51ac82009-06-28 07:58:58346
[email protected]034d3892011-03-29 04:07:21347 user_sock_.reset(BuildMockSocket(NULL, 0,
348 NULL, 0,
[email protected]73c45322010-10-01 23:57:54349 host_resolver_.get(),
350 hostname, 80,
351 &log));
[email protected]76a51ac82009-06-28 07:58:58352
[email protected]83039bb2011-12-09 18:43:55353 int rv = user_sock_->Connect(callback_.callback());
[email protected]76a51ac82009-06-28 07:58:58354 EXPECT_EQ(ERR_IO_PENDING, rv);
[email protected]b2fcd0e2010-12-01 15:19:40355 net::CapturingNetLog::EntryList entries;
356 log.GetEntries(&entries);
[email protected]9e743cd2010-03-16 07:03:53357 EXPECT_TRUE(LogContainsBeginEvent(
[email protected]b2fcd0e2010-12-01 15:19:40358 entries, 0, NetLog::TYPE_SOCKS_CONNECT));
359
[email protected]76a51ac82009-06-28 07:58:58360 rv = callback_.WaitForResult();
[email protected]034d3892011-03-29 04:07:21361 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv);
362 EXPECT_FALSE(user_sock_->IsConnected());
[email protected]b2fcd0e2010-12-01 15:19:40363 log.GetEntries(&entries);
[email protected]9e743cd2010-03-16 07:03:53364 EXPECT_TRUE(LogContainsEndEvent(
[email protected]b2fcd0e2010-12-01 15:19:40365 entries, -1, NetLog::TYPE_SOCKS_CONNECT));
[email protected]76a51ac82009-06-28 07:58:58366}
367
[email protected]16a02742010-01-07 22:50:10368// Calls Disconnect() while a host resolve is in progress. The outstanding host
369// resolve should be cancelled.
370TEST_F(SOCKSClientSocketTest, DisconnectWhileHostResolveInProgress) {
[email protected]98e1cd012011-11-08 15:33:09371 scoped_ptr<HangingHostResolverWithCancel> hanging_resolver(
372 new HangingHostResolverWithCancel());
[email protected]16a02742010-01-07 22:50:10373
374 // Doesn't matter what the socket data is, we will never use it -- garbage.
375 MockWrite data_writes[] = { MockWrite(false, "", 0) };
376 MockRead data_reads[] = { MockRead(false, "", 0) };
377
[email protected]31a2bfe2010-02-09 08:03:39378 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
379 data_writes, arraysize(data_writes),
[email protected]73c45322010-10-01 23:57:54380 hanging_resolver.get(),
381 "foo", 80,
382 NULL));
[email protected]16a02742010-01-07 22:50:10383
384 // Start connecting (will get stuck waiting for the host to resolve).
[email protected]83039bb2011-12-09 18:43:55385 int rv = user_sock_->Connect(callback_.callback());
[email protected]16a02742010-01-07 22:50:10386 EXPECT_EQ(ERR_IO_PENDING, rv);
387
388 EXPECT_FALSE(user_sock_->IsConnected());
389 EXPECT_FALSE(user_sock_->IsConnectedAndIdle());
390
391 // The host resolver should have received the resolve request.
392 EXPECT_TRUE(hanging_resolver->HasOutstandingRequest());
393
394 // Disconnect the SOCKS socket -- this should cancel the outstanding resolve.
395 user_sock_->Disconnect();
396
397 EXPECT_FALSE(hanging_resolver->HasOutstandingRequest());
398
399 EXPECT_FALSE(user_sock_->IsConnected());
400 EXPECT_FALSE(user_sock_->IsConnectedAndIdle());
401}
402
[email protected]76a51ac82009-06-28 07:58:58403} // namespace net