Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: net/socket/socks_client_socket_unittest.cc

Issue 525084: Cancel any outstanding host resolve when calling SOCKSClientSocket::Disconnec... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Address wtc's comments Created 10 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/socket/socks_client_socket.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/socket/socks_client_socket.h" 5 #include "net/socket/socks_client_socket.h"
6 6
7 #include "net/base/address_list.h" 7 #include "net/base/address_list.h"
8 #include "net/base/load_log.h" 8 #include "net/base/load_log.h"
9 #include "net/base/load_log_unittest.h" 9 #include "net/base/load_log_unittest.h"
10 #include "net/base/mock_host_resolver.h" 10 #include "net/base/mock_host_resolver.h"
(...skipping 12 matching lines...) Expand all
23 const char kSOCKSOkRequest[] = { 0x04, 0x01, 0x00, 0x50, 127, 0, 0, 1, 0 }; 23 const char kSOCKSOkRequest[] = { 0x04, 0x01, 0x00, 0x50, 127, 0, 0, 1, 0 };
24 const char kSOCKS4aInitialRequest[] = 24 const char kSOCKS4aInitialRequest[] =
25 { 0x04, 0x01, 0x00, 0x50, 0, 0, 0, 127, 0 }; 25 { 0x04, 0x01, 0x00, 0x50, 0, 0, 0, 127, 0 };
26 const char kSOCKSOkReply[] = { 0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; 26 const char kSOCKSOkReply[] = { 0x00, 0x5A, 0x00, 0x00, 0, 0, 0, 0 };
27 27
28 class SOCKSClientSocketTest : public PlatformTest { 28 class SOCKSClientSocketTest : public PlatformTest {
29 public: 29 public:
30 SOCKSClientSocketTest(); 30 SOCKSClientSocketTest();
31 // Create a SOCKSClientSocket on top of a MockSocket. 31 // Create a SOCKSClientSocket on top of a MockSocket.
32 SOCKSClientSocket* BuildMockSocket(MockRead reads[], MockWrite writes[], 32 SOCKSClientSocket* BuildMockSocket(MockRead reads[], MockWrite writes[],
33 HostResolver* host_resolver,
33 const std::string& hostname, int port); 34 const std::string& hostname, int port);
34 virtual void SetUp(); 35 virtual void SetUp();
35 36
36 protected: 37 protected:
37 scoped_ptr<SOCKSClientSocket> user_sock_; 38 scoped_ptr<SOCKSClientSocket> user_sock_;
38 AddressList address_list_; 39 AddressList address_list_;
39 ClientSocket* tcp_sock_; 40 ClientSocket* tcp_sock_;
40 TestCompletionCallback callback_; 41 TestCompletionCallback callback_;
41 scoped_refptr<MockHostResolver> host_resolver_; 42 scoped_refptr<MockHostResolver> host_resolver_;
42 scoped_ptr<SocketDataProvider> data_; 43 scoped_ptr<SocketDataProvider> data_;
43 44
44 private: 45 private:
45 DISALLOW_COPY_AND_ASSIGN(SOCKSClientSocketTest); 46 DISALLOW_COPY_AND_ASSIGN(SOCKSClientSocketTest);
46 }; 47 };
47 48
48 SOCKSClientSocketTest::SOCKSClientSocketTest() 49 SOCKSClientSocketTest::SOCKSClientSocketTest()
49 : host_resolver_(new MockHostResolver) { 50 : host_resolver_(new MockHostResolver) {
50 } 51 }
51 52
52 // Set up platform before every test case 53 // Set up platform before every test case
53 void SOCKSClientSocketTest::SetUp() { 54 void SOCKSClientSocketTest::SetUp() {
54 PlatformTest::SetUp(); 55 PlatformTest::SetUp();
55 } 56 }
56 57
57 SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket( 58 SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket(
58 MockRead reads[], 59 MockRead reads[],
59 MockWrite writes[], 60 MockWrite writes[],
61 HostResolver* host_resolver,
60 const std::string& hostname, 62 const std::string& hostname,
61 int port) { 63 int port) {
62 64
63 TestCompletionCallback callback; 65 TestCompletionCallback callback;
64 data_.reset(new StaticSocketDataProvider(reads, writes)); 66 data_.reset(new StaticSocketDataProvider(reads, writes));
65 tcp_sock_ = new MockTCPClientSocket(address_list_, data_.get()); 67 tcp_sock_ = new MockTCPClientSocket(address_list_, data_.get());
66 68
67 int rv = tcp_sock_->Connect(&callback, NULL); 69 int rv = tcp_sock_->Connect(&callback, NULL);
68 EXPECT_EQ(ERR_IO_PENDING, rv); 70 EXPECT_EQ(ERR_IO_PENDING, rv);
69 rv = callback.WaitForResult(); 71 rv = callback.WaitForResult();
70 EXPECT_EQ(OK, rv); 72 EXPECT_EQ(OK, rv);
71 EXPECT_TRUE(tcp_sock_->IsConnected()); 73 EXPECT_TRUE(tcp_sock_->IsConnected());
72 74
73 return new SOCKSClientSocket(tcp_sock_, 75 return new SOCKSClientSocket(tcp_sock_,
74 HostResolver::RequestInfo(hostname, port), 76 HostResolver::RequestInfo(hostname, port),
75 host_resolver_); 77 host_resolver);
76 } 78 }
77 79
80 // Implementation of HostResolver that never completes its resolve request.
81 // We use this in the test "DisconnectWhileHostResolveInProgress" to make
82 // sure that the outstanding resolve request gets cancelled.
83 class HangingHostResolver : public HostResolver {
84 public:
85 HangingHostResolver() : outstanding_request_(NULL) {}
86
87 virtual int Resolve(const RequestInfo& info,
88 AddressList* addresses,
89 CompletionCallback* callback,
90 RequestHandle* out_req,
91 LoadLog* load_log) {
92 EXPECT_FALSE(HasOutstandingRequest());
93 outstanding_request_ = reinterpret_cast<RequestHandle>(1);
94 *out_req = outstanding_request_;
95 return ERR_IO_PENDING;
96 }
97
98 virtual void CancelRequest(RequestHandle req) {
99 EXPECT_TRUE(HasOutstandingRequest());
100 EXPECT_EQ(outstanding_request_, req);
101 outstanding_request_ = NULL;
102 }
103
104 virtual void AddObserver(Observer* observer) {}
105 virtual void RemoveObserver(Observer* observer) {}
106 virtual HostCache* GetHostCache() { return NULL; }
107 virtual void Shutdown() {}
108
109 bool HasOutstandingRequest() {
110 return outstanding_request_ != NULL;
111 }
112
113 private:
114 RequestHandle outstanding_request_;
115
116 DISALLOW_COPY_AND_ASSIGN(HangingHostResolver);
117 };
118
78 // Tests a complete handshake and the disconnection. 119 // Tests a complete handshake and the disconnection.
79 TEST_F(SOCKSClientSocketTest, CompleteHandshake) { 120 TEST_F(SOCKSClientSocketTest, CompleteHandshake) {
80 const std::string payload_write = "random data"; 121 const std::string payload_write = "random data";
81 const std::string payload_read = "moar random data"; 122 const std::string payload_read = "moar random data";
82 123
83 MockWrite data_writes[] = { 124 MockWrite data_writes[] = {
84 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)), 125 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)),
85 MockWrite(true, payload_write.data(), payload_write.size()) }; 126 MockWrite(true, payload_write.data(), payload_write.size()) };
86 MockRead data_reads[] = { 127 MockRead data_reads[] = {
87 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)), 128 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)),
88 MockRead(true, payload_read.data(), payload_read.size()) }; 129 MockRead(true, payload_read.data(), payload_read.size()) };
89 130
90 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); 131 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_,
132 "localhost", 80));
91 133
92 // At this state the TCP connection is completed but not the SOCKS handshake. 134 // At this state the TCP connection is completed but not the SOCKS handshake.
93 EXPECT_TRUE(tcp_sock_->IsConnected()); 135 EXPECT_TRUE(tcp_sock_->IsConnected());
94 EXPECT_FALSE(user_sock_->IsConnected()); 136 EXPECT_FALSE(user_sock_->IsConnected());
95 137
96 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 138 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
97 int rv = user_sock_->Connect(&callback_, log); 139 int rv = user_sock_->Connect(&callback_, log);
98 EXPECT_EQ(ERR_IO_PENDING, rv); 140 EXPECT_EQ(ERR_IO_PENDING, rv);
99 EXPECT_TRUE( 141 EXPECT_TRUE(
100 LogContains(*log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); 142 LogContains(*log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 }; 188 };
147 189
148 //--------------------------------------- 190 //---------------------------------------
149 191
150 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 192 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
151 MockWrite data_writes[] = { 193 MockWrite data_writes[] = {
152 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; 194 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) };
153 MockRead data_reads[] = { 195 MockRead data_reads[] = {
154 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) }; 196 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) };
155 197
156 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); 198 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_,
199 "localhost", 80));
157 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 200 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
158 201
159 int rv = user_sock_->Connect(&callback_, log); 202 int rv = user_sock_->Connect(&callback_, log);
160 EXPECT_EQ(ERR_IO_PENDING, rv); 203 EXPECT_EQ(ERR_IO_PENDING, rv);
161 EXPECT_TRUE(LogContains( 204 EXPECT_TRUE(LogContains(
162 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); 205 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
163 rv = callback_.WaitForResult(); 206 rv = callback_.WaitForResult();
164 EXPECT_EQ(tests[i].fail_code, rv); 207 EXPECT_EQ(tests[i].fail_code, rv);
165 EXPECT_FALSE(user_sock_->IsConnected()); 208 EXPECT_FALSE(user_sock_->IsConnected());
166 EXPECT_TRUE(tcp_sock_->IsConnected()); 209 EXPECT_TRUE(tcp_sock_->IsConnected());
167 EXPECT_TRUE(LogContains( 210 EXPECT_TRUE(LogContains(
168 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); 211 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END));
169 } 212 }
170 } 213 }
171 214
172 // Tests scenario when the server sends the handshake response in 215 // Tests scenario when the server sends the handshake response in
173 // more than one packet. 216 // more than one packet.
174 TEST_F(SOCKSClientSocketTest, PartialServerReads) { 217 TEST_F(SOCKSClientSocketTest, PartialServerReads) {
175 const char kSOCKSPartialReply1[] = { 0x00 }; 218 const char kSOCKSPartialReply1[] = { 0x00 };
176 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; 219 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 };
177 220
178 MockWrite data_writes[] = { 221 MockWrite data_writes[] = {
179 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; 222 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) };
180 MockRead data_reads[] = { 223 MockRead data_reads[] = {
181 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)), 224 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)),
182 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) }; 225 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) };
183 226
184 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); 227 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_,
228 "localhost", 80));
185 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 229 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
186 230
187 int rv = user_sock_->Connect(&callback_, log); 231 int rv = user_sock_->Connect(&callback_, log);
188 EXPECT_EQ(ERR_IO_PENDING, rv); 232 EXPECT_EQ(ERR_IO_PENDING, rv);
189 EXPECT_TRUE(LogContains( 233 EXPECT_TRUE(LogContains(
190 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); 234 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
191 rv = callback_.WaitForResult(); 235 rv = callback_.WaitForResult();
192 EXPECT_EQ(OK, rv); 236 EXPECT_EQ(OK, rv);
193 EXPECT_TRUE(user_sock_->IsConnected()); 237 EXPECT_TRUE(user_sock_->IsConnected());
194 EXPECT_TRUE(LogContains( 238 EXPECT_TRUE(LogContains(
195 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); 239 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END));
196 } 240 }
197 241
198 // Tests scenario when the client sends the handshake request in 242 // Tests scenario when the client sends the handshake request in
199 // more than one packet. 243 // more than one packet.
200 TEST_F(SOCKSClientSocketTest, PartialClientWrites) { 244 TEST_F(SOCKSClientSocketTest, PartialClientWrites) {
201 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 }; 245 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 };
202 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 }; 246 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 };
203 247
204 MockWrite data_writes[] = { 248 MockWrite data_writes[] = {
205 MockWrite(true, arraysize(kSOCKSPartialRequest1)), 249 MockWrite(true, arraysize(kSOCKSPartialRequest1)),
206 // simulate some empty writes 250 // simulate some empty writes
207 MockWrite(true, 0), 251 MockWrite(true, 0),
208 MockWrite(true, 0), 252 MockWrite(true, 0),
209 MockWrite(true, kSOCKSPartialRequest2, 253 MockWrite(true, kSOCKSPartialRequest2,
210 arraysize(kSOCKSPartialRequest2)) }; 254 arraysize(kSOCKSPartialRequest2)) };
211 MockRead data_reads[] = { 255 MockRead data_reads[] = {
212 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; 256 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) };
213 257
214 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); 258 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_,
259 "localhost", 80));
215 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 260 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
216 261
217 int rv = user_sock_->Connect(&callback_, log); 262 int rv = user_sock_->Connect(&callback_, log);
218 EXPECT_EQ(ERR_IO_PENDING, rv); 263 EXPECT_EQ(ERR_IO_PENDING, rv);
219 EXPECT_TRUE(LogContains( 264 EXPECT_TRUE(LogContains(
220 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); 265 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
221 rv = callback_.WaitForResult(); 266 rv = callback_.WaitForResult();
222 EXPECT_EQ(OK, rv); 267 EXPECT_EQ(OK, rv);
223 EXPECT_TRUE(user_sock_->IsConnected()); 268 EXPECT_TRUE(user_sock_->IsConnected());
224 EXPECT_TRUE(LogContains( 269 EXPECT_TRUE(LogContains(
225 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); 270 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END));
226 } 271 }
227 272
228 // Tests the case when the server sends a smaller sized handshake data 273 // Tests the case when the server sends a smaller sized handshake data
229 // and closes the connection. 274 // and closes the connection.
230 TEST_F(SOCKSClientSocketTest, FailedSocketRead) { 275 TEST_F(SOCKSClientSocketTest, FailedSocketRead) {
231 MockWrite data_writes[] = { 276 MockWrite data_writes[] = {
232 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; 277 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) };
233 MockRead data_reads[] = { 278 MockRead data_reads[] = {
234 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2), 279 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2),
235 // close connection unexpectedly 280 // close connection unexpectedly
236 MockRead(false, 0) }; 281 MockRead(false, 0) };
237 282
238 user_sock_.reset(BuildMockSocket(data_reads, data_writes, "localhost", 80)); 283 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_,
284 "localhost", 80));
239 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 285 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
240 286
241 int rv = user_sock_->Connect(&callback_, log); 287 int rv = user_sock_->Connect(&callback_, log);
242 EXPECT_EQ(ERR_IO_PENDING, rv); 288 EXPECT_EQ(ERR_IO_PENDING, rv);
243 EXPECT_TRUE(LogContains( 289 EXPECT_TRUE(LogContains(
244 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); 290 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
245 rv = callback_.WaitForResult(); 291 rv = callback_.WaitForResult();
246 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); 292 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv);
247 EXPECT_FALSE(user_sock_->IsConnected()); 293 EXPECT_FALSE(user_sock_->IsConnected());
248 EXPECT_TRUE(LogContains( 294 EXPECT_TRUE(LogContains(
249 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); 295 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END));
250 } 296 }
251 297
252 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A. 298 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A.
253 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) { 299 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) {
254 const char hostname[] = "unresolved.ipv4.address"; 300 const char hostname[] = "unresolved.ipv4.address";
255 301
256 host_resolver_->rules()->AddSimulatedFailure(hostname); 302 host_resolver_->rules()->AddSimulatedFailure(hostname);
257 303
258 std::string request(kSOCKS4aInitialRequest, 304 std::string request(kSOCKS4aInitialRequest,
259 arraysize(kSOCKS4aInitialRequest)); 305 arraysize(kSOCKS4aInitialRequest));
260 request.append(hostname, arraysize(hostname)); 306 request.append(hostname, arraysize(hostname));
261 307
262 MockWrite data_writes[] = { 308 MockWrite data_writes[] = {
263 MockWrite(false, request.data(), request.size()) }; 309 MockWrite(false, request.data(), request.size()) };
264 MockRead data_reads[] = { 310 MockRead data_reads[] = {
265 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; 311 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) };
266 312
267 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); 313 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_,
314 hostname, 80));
268 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 315 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
269 316
270 int rv = user_sock_->Connect(&callback_, log); 317 int rv = user_sock_->Connect(&callback_, log);
271 EXPECT_EQ(ERR_IO_PENDING, rv); 318 EXPECT_EQ(ERR_IO_PENDING, rv);
272 EXPECT_TRUE(LogContains( 319 EXPECT_TRUE(LogContains(
273 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); 320 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
274 rv = callback_.WaitForResult(); 321 rv = callback_.WaitForResult();
275 EXPECT_EQ(OK, rv); 322 EXPECT_EQ(OK, rv);
276 EXPECT_TRUE(user_sock_->IsConnected()); 323 EXPECT_TRUE(user_sock_->IsConnected());
277 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); 324 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_);
(...skipping 10 matching lines...) Expand all
288 335
289 std::string request(kSOCKS4aInitialRequest, 336 std::string request(kSOCKS4aInitialRequest,
290 arraysize(kSOCKS4aInitialRequest)); 337 arraysize(kSOCKS4aInitialRequest));
291 request.append(hostname, arraysize(hostname)); 338 request.append(hostname, arraysize(hostname));
292 339
293 MockWrite data_writes[] = { 340 MockWrite data_writes[] = {
294 MockWrite(false, request.data(), request.size()) }; 341 MockWrite(false, request.data(), request.size()) };
295 MockRead data_reads[] = { 342 MockRead data_reads[] = {
296 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; 343 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) };
297 344
298 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hostname, 80)); 345 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_,
346 hostname, 80));
299 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 347 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
300 348
301 int rv = user_sock_->Connect(&callback_, log); 349 int rv = user_sock_->Connect(&callback_, log);
302 EXPECT_EQ(ERR_IO_PENDING, rv); 350 EXPECT_EQ(ERR_IO_PENDING, rv);
303 EXPECT_TRUE(LogContains( 351 EXPECT_TRUE(LogContains(
304 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); 352 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN));
305 rv = callback_.WaitForResult(); 353 rv = callback_.WaitForResult();
306 EXPECT_EQ(OK, rv); 354 EXPECT_EQ(OK, rv);
307 EXPECT_TRUE(user_sock_->IsConnected()); 355 EXPECT_TRUE(user_sock_->IsConnected());
308 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); 356 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_);
309 EXPECT_TRUE(LogContains( 357 EXPECT_TRUE(LogContains(
310 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); 358 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END));
311 } 359 }
312 360
361 // Calls Disconnect() while a host resolve is in progress. The outstanding host
362 // resolve should be cancelled.
363 TEST_F(SOCKSClientSocketTest, DisconnectWhileHostResolveInProgress) {
364 scoped_refptr<HangingHostResolver> hanging_resolver =
365 new HangingHostResolver();
366
367 // Doesn't matter what the socket data is, we will never use it -- garbage.
368 MockWrite data_writes[] = { MockWrite(false, "", 0) };
369 MockRead data_reads[] = { MockRead(false, "", 0) };
370
371 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hanging_resolver,
372 "foo", 80));
373
374 // Start connecting (will get stuck waiting for the host to resolve).
375 int rv = user_sock_->Connect(&callback_, NULL);
376 EXPECT_EQ(ERR_IO_PENDING, rv);
377
378 EXPECT_FALSE(user_sock_->IsConnected());
379 EXPECT_FALSE(user_sock_->IsConnectedAndIdle());
380
381 // The host resolver should have received the resolve request.
382 EXPECT_TRUE(hanging_resolver->HasOutstandingRequest());
383
384 // Disconnect the SOCKS socket -- this should cancel the outstanding resolve.
385 user_sock_->Disconnect();
386
387 EXPECT_FALSE(hanging_resolver->HasOutstandingRequest());
388
389 EXPECT_FALSE(user_sock_->IsConnected());
390 EXPECT_FALSE(user_sock_->IsConnectedAndIdle());
391 }
392
313 } // namespace net 393 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/socks_client_socket.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698