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

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

Issue 582020: Add bounds checking to StaticSocketDataProvider, to make tests more reliable (Closed)
Patch Set: Created 10 years, 10 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
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 11 matching lines...) Expand all
22 22
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[], size_t reads_count,
33 MockWrite writes[], size_t writes_count,
33 HostResolver* host_resolver, 34 HostResolver* host_resolver,
34 const std::string& hostname, int port); 35 const std::string& hostname, int port);
35 virtual void SetUp(); 36 virtual void SetUp();
36 37
37 protected: 38 protected:
38 scoped_ptr<SOCKSClientSocket> user_sock_; 39 scoped_ptr<SOCKSClientSocket> user_sock_;
39 AddressList address_list_; 40 AddressList address_list_;
40 ClientSocket* tcp_sock_; 41 ClientSocket* tcp_sock_;
41 TestCompletionCallback callback_; 42 TestCompletionCallback callback_;
42 scoped_refptr<MockHostResolver> host_resolver_; 43 scoped_refptr<MockHostResolver> host_resolver_;
43 scoped_ptr<SocketDataProvider> data_; 44 scoped_ptr<SocketDataProvider> data_;
44 45
45 private: 46 private:
46 DISALLOW_COPY_AND_ASSIGN(SOCKSClientSocketTest); 47 DISALLOW_COPY_AND_ASSIGN(SOCKSClientSocketTest);
47 }; 48 };
48 49
49 SOCKSClientSocketTest::SOCKSClientSocketTest() 50 SOCKSClientSocketTest::SOCKSClientSocketTest()
50 : host_resolver_(new MockHostResolver) { 51 : host_resolver_(new MockHostResolver) {
51 } 52 }
52 53
53 // Set up platform before every test case 54 // Set up platform before every test case
54 void SOCKSClientSocketTest::SetUp() { 55 void SOCKSClientSocketTest::SetUp() {
55 PlatformTest::SetUp(); 56 PlatformTest::SetUp();
56 } 57 }
57 58
58 SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket( 59 SOCKSClientSocket* SOCKSClientSocketTest::BuildMockSocket(
59 MockRead reads[], 60 MockRead reads[],
61 size_t reads_count,
60 MockWrite writes[], 62 MockWrite writes[],
63 size_t writes_count,
61 HostResolver* host_resolver, 64 HostResolver* host_resolver,
62 const std::string& hostname, 65 const std::string& hostname,
63 int port) { 66 int port) {
64 67
65 TestCompletionCallback callback; 68 TestCompletionCallback callback;
66 data_.reset(new StaticSocketDataProvider(reads, writes)); 69 data_.reset(new StaticSocketDataProvider(reads, reads_count,
70 writes, writes_count));
67 tcp_sock_ = new MockTCPClientSocket(address_list_, data_.get()); 71 tcp_sock_ = new MockTCPClientSocket(address_list_, data_.get());
68 72
69 int rv = tcp_sock_->Connect(&callback, NULL); 73 int rv = tcp_sock_->Connect(&callback, NULL);
70 EXPECT_EQ(ERR_IO_PENDING, rv); 74 EXPECT_EQ(ERR_IO_PENDING, rv);
71 rv = callback.WaitForResult(); 75 rv = callback.WaitForResult();
72 EXPECT_EQ(OK, rv); 76 EXPECT_EQ(OK, rv);
73 EXPECT_TRUE(tcp_sock_->IsConnected()); 77 EXPECT_TRUE(tcp_sock_->IsConnected());
74 78
75 return new SOCKSClientSocket(tcp_sock_, 79 return new SOCKSClientSocket(tcp_sock_,
76 HostResolver::RequestInfo(hostname, port), 80 HostResolver::RequestInfo(hostname, port),
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 const std::string payload_write = "random data"; 123 const std::string payload_write = "random data";
120 const std::string payload_read = "moar random data"; 124 const std::string payload_read = "moar random data";
121 125
122 MockWrite data_writes[] = { 126 MockWrite data_writes[] = {
123 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)), 127 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)),
124 MockWrite(true, payload_write.data(), payload_write.size()) }; 128 MockWrite(true, payload_write.data(), payload_write.size()) };
125 MockRead data_reads[] = { 129 MockRead data_reads[] = {
126 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)), 130 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)),
127 MockRead(true, payload_read.data(), payload_read.size()) }; 131 MockRead(true, payload_read.data(), payload_read.size()) };
128 132
129 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, 133 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
130 "localhost", 80)); 134 data_writes, arraysize(data_writes),
135 host_resolver_, "localhost", 80));
131 136
132 // At this state the TCP connection is completed but not the SOCKS handshake. 137 // At this state the TCP connection is completed but not the SOCKS handshake.
133 EXPECT_TRUE(tcp_sock_->IsConnected()); 138 EXPECT_TRUE(tcp_sock_->IsConnected());
134 EXPECT_FALSE(user_sock_->IsConnected()); 139 EXPECT_FALSE(user_sock_->IsConnected());
135 140
136 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 141 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
137 int rv = user_sock_->Connect(&callback_, log); 142 int rv = user_sock_->Connect(&callback_, log);
138 EXPECT_EQ(ERR_IO_PENDING, rv); 143 EXPECT_EQ(ERR_IO_PENDING, rv);
139 EXPECT_TRUE( 144 EXPECT_TRUE(
140 LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); 145 LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT));
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 }; 190 };
186 191
187 //--------------------------------------- 192 //---------------------------------------
188 193
189 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 194 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
190 MockWrite data_writes[] = { 195 MockWrite data_writes[] = {
191 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; 196 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) };
192 MockRead data_reads[] = { 197 MockRead data_reads[] = {
193 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) }; 198 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) };
194 199
195 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, 200 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
196 "localhost", 80)); 201 data_writes, arraysize(data_writes),
202 host_resolver_, "localhost", 80));
197 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 203 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
198 204
199 int rv = user_sock_->Connect(&callback_, log); 205 int rv = user_sock_->Connect(&callback_, log);
200 EXPECT_EQ(ERR_IO_PENDING, rv); 206 EXPECT_EQ(ERR_IO_PENDING, rv);
201 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); 207 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT));
202 rv = callback_.WaitForResult(); 208 rv = callback_.WaitForResult();
203 EXPECT_EQ(tests[i].fail_code, rv); 209 EXPECT_EQ(tests[i].fail_code, rv);
204 EXPECT_FALSE(user_sock_->IsConnected()); 210 EXPECT_FALSE(user_sock_->IsConnected());
205 EXPECT_TRUE(tcp_sock_->IsConnected()); 211 EXPECT_TRUE(tcp_sock_->IsConnected());
206 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); 212 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT));
207 } 213 }
208 } 214 }
209 215
210 // Tests scenario when the server sends the handshake response in 216 // Tests scenario when the server sends the handshake response in
211 // more than one packet. 217 // more than one packet.
212 TEST_F(SOCKSClientSocketTest, PartialServerReads) { 218 TEST_F(SOCKSClientSocketTest, PartialServerReads) {
213 const char kSOCKSPartialReply1[] = { 0x00 }; 219 const char kSOCKSPartialReply1[] = { 0x00 };
214 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; 220 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 };
215 221
216 MockWrite data_writes[] = { 222 MockWrite data_writes[] = {
217 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; 223 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) };
218 MockRead data_reads[] = { 224 MockRead data_reads[] = {
219 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)), 225 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)),
220 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) }; 226 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) };
221 227
222 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, 228 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
223 "localhost", 80)); 229 data_writes, arraysize(data_writes),
230 host_resolver_, "localhost", 80));
224 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 231 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
225 232
226 int rv = user_sock_->Connect(&callback_, log); 233 int rv = user_sock_->Connect(&callback_, log);
227 EXPECT_EQ(ERR_IO_PENDING, rv); 234 EXPECT_EQ(ERR_IO_PENDING, rv);
228 EXPECT_TRUE(LogContainsBeginEvent( 235 EXPECT_TRUE(LogContainsBeginEvent(
229 *log, 0, LoadLog::TYPE_SOCKS_CONNECT)); 236 *log, 0, LoadLog::TYPE_SOCKS_CONNECT));
230 rv = callback_.WaitForResult(); 237 rv = callback_.WaitForResult();
231 EXPECT_EQ(OK, rv); 238 EXPECT_EQ(OK, rv);
232 EXPECT_TRUE(user_sock_->IsConnected()); 239 EXPECT_TRUE(user_sock_->IsConnected());
233 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); 240 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT));
234 } 241 }
235 242
236 // Tests scenario when the client sends the handshake request in 243 // Tests scenario when the client sends the handshake request in
237 // more than one packet. 244 // more than one packet.
238 TEST_F(SOCKSClientSocketTest, PartialClientWrites) { 245 TEST_F(SOCKSClientSocketTest, PartialClientWrites) {
239 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 }; 246 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 };
240 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 }; 247 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 };
241 248
242 MockWrite data_writes[] = { 249 MockWrite data_writes[] = {
243 MockWrite(true, arraysize(kSOCKSPartialRequest1)), 250 MockWrite(true, arraysize(kSOCKSPartialRequest1)),
244 // simulate some empty writes 251 // simulate some empty writes
245 MockWrite(true, 0), 252 MockWrite(true, 0),
246 MockWrite(true, 0), 253 MockWrite(true, 0),
247 MockWrite(true, kSOCKSPartialRequest2, 254 MockWrite(true, kSOCKSPartialRequest2,
248 arraysize(kSOCKSPartialRequest2)) }; 255 arraysize(kSOCKSPartialRequest2)) };
249 MockRead data_reads[] = { 256 MockRead data_reads[] = {
250 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; 257 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) };
251 258
252 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, 259 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
253 "localhost", 80)); 260 data_writes, arraysize(data_writes),
261 host_resolver_, "localhost", 80));
254 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 262 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
255 263
256 int rv = user_sock_->Connect(&callback_, log); 264 int rv = user_sock_->Connect(&callback_, log);
257 EXPECT_EQ(ERR_IO_PENDING, rv); 265 EXPECT_EQ(ERR_IO_PENDING, rv);
258 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); 266 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT));
259 rv = callback_.WaitForResult(); 267 rv = callback_.WaitForResult();
260 EXPECT_EQ(OK, rv); 268 EXPECT_EQ(OK, rv);
261 EXPECT_TRUE(user_sock_->IsConnected()); 269 EXPECT_TRUE(user_sock_->IsConnected());
262 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); 270 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT));
263 } 271 }
264 272
265 // 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
266 // and closes the connection. 274 // and closes the connection.
267 TEST_F(SOCKSClientSocketTest, FailedSocketRead) { 275 TEST_F(SOCKSClientSocketTest, FailedSocketRead) {
268 MockWrite data_writes[] = { 276 MockWrite data_writes[] = {
269 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; 277 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) };
270 MockRead data_reads[] = { 278 MockRead data_reads[] = {
271 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2), 279 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2),
272 // close connection unexpectedly 280 // close connection unexpectedly
273 MockRead(false, 0) }; 281 MockRead(false, 0) };
274 282
275 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, 283 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
276 "localhost", 80)); 284 data_writes, arraysize(data_writes),
285 host_resolver_, "localhost", 80));
277 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 286 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
278 287
279 int rv = user_sock_->Connect(&callback_, log); 288 int rv = user_sock_->Connect(&callback_, log);
280 EXPECT_EQ(ERR_IO_PENDING, rv); 289 EXPECT_EQ(ERR_IO_PENDING, rv);
281 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); 290 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT));
282 rv = callback_.WaitForResult(); 291 rv = callback_.WaitForResult();
283 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); 292 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv);
284 EXPECT_FALSE(user_sock_->IsConnected()); 293 EXPECT_FALSE(user_sock_->IsConnected());
285 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); 294 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT));
286 } 295 }
287 296
288 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A. 297 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A.
289 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) { 298 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) {
290 const char hostname[] = "unresolved.ipv4.address"; 299 const char hostname[] = "unresolved.ipv4.address";
291 300
292 host_resolver_->rules()->AddSimulatedFailure(hostname); 301 host_resolver_->rules()->AddSimulatedFailure(hostname);
293 302
294 std::string request(kSOCKS4aInitialRequest, 303 std::string request(kSOCKS4aInitialRequest,
295 arraysize(kSOCKS4aInitialRequest)); 304 arraysize(kSOCKS4aInitialRequest));
296 request.append(hostname, arraysize(hostname)); 305 request.append(hostname, arraysize(hostname));
297 306
298 MockWrite data_writes[] = { 307 MockWrite data_writes[] = {
299 MockWrite(false, request.data(), request.size()) }; 308 MockWrite(false, request.data(), request.size()) };
300 MockRead data_reads[] = { 309 MockRead data_reads[] = {
301 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; 310 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) };
302 311
303 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, 312 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
304 hostname, 80)); 313 data_writes, arraysize(data_writes),
314 host_resolver_, hostname, 80));
305 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 315 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
306 316
307 int rv = user_sock_->Connect(&callback_, log); 317 int rv = user_sock_->Connect(&callback_, log);
308 EXPECT_EQ(ERR_IO_PENDING, rv); 318 EXPECT_EQ(ERR_IO_PENDING, rv);
309 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); 319 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT));
310 rv = callback_.WaitForResult(); 320 rv = callback_.WaitForResult();
311 EXPECT_EQ(OK, rv); 321 EXPECT_EQ(OK, rv);
312 EXPECT_TRUE(user_sock_->IsConnected()); 322 EXPECT_TRUE(user_sock_->IsConnected());
313 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); 323 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_);
314 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); 324 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT));
315 } 325 }
316 326
317 // Tries to connect to a domain that resolves to IPv6. 327 // Tries to connect to a domain that resolves to IPv6.
318 // Should revert to SOCKS4a. 328 // Should revert to SOCKS4a.
319 TEST_F(SOCKSClientSocketTest, SOCKS4AIfDomainInIPv6) { 329 TEST_F(SOCKSClientSocketTest, SOCKS4AIfDomainInIPv6) {
320 const char hostname[] = "an.ipv6.address"; 330 const char hostname[] = "an.ipv6.address";
321 331
322 host_resolver_->rules()->AddIPv6Rule(hostname, "2001:db8:8714:3a90::12"); 332 host_resolver_->rules()->AddIPv6Rule(hostname, "2001:db8:8714:3a90::12");
323 333
324 std::string request(kSOCKS4aInitialRequest, 334 std::string request(kSOCKS4aInitialRequest,
325 arraysize(kSOCKS4aInitialRequest)); 335 arraysize(kSOCKS4aInitialRequest));
326 request.append(hostname, arraysize(hostname)); 336 request.append(hostname, arraysize(hostname));
327 337
328 MockWrite data_writes[] = { 338 MockWrite data_writes[] = {
329 MockWrite(false, request.data(), request.size()) }; 339 MockWrite(false, request.data(), request.size()) };
330 MockRead data_reads[] = { 340 MockRead data_reads[] = {
331 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; 341 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) };
332 342
333 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, 343 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
334 hostname, 80)); 344 data_writes, arraysize(data_writes),
345 host_resolver_, hostname, 80));
335 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); 346 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded));
336 347
337 int rv = user_sock_->Connect(&callback_, log); 348 int rv = user_sock_->Connect(&callback_, log);
338 EXPECT_EQ(ERR_IO_PENDING, rv); 349 EXPECT_EQ(ERR_IO_PENDING, rv);
339 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); 350 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT));
340 rv = callback_.WaitForResult(); 351 rv = callback_.WaitForResult();
341 EXPECT_EQ(OK, rv); 352 EXPECT_EQ(OK, rv);
342 EXPECT_TRUE(user_sock_->IsConnected()); 353 EXPECT_TRUE(user_sock_->IsConnected());
343 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); 354 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_);
344 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); 355 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT));
345 } 356 }
346 357
347 // Calls Disconnect() while a host resolve is in progress. The outstanding host 358 // Calls Disconnect() while a host resolve is in progress. The outstanding host
348 // resolve should be cancelled. 359 // resolve should be cancelled.
349 TEST_F(SOCKSClientSocketTest, DisconnectWhileHostResolveInProgress) { 360 TEST_F(SOCKSClientSocketTest, DisconnectWhileHostResolveInProgress) {
350 scoped_refptr<HangingHostResolver> hanging_resolver = 361 scoped_refptr<HangingHostResolver> hanging_resolver =
351 new HangingHostResolver(); 362 new HangingHostResolver();
352 363
353 // Doesn't matter what the socket data is, we will never use it -- garbage. 364 // Doesn't matter what the socket data is, we will never use it -- garbage.
354 MockWrite data_writes[] = { MockWrite(false, "", 0) }; 365 MockWrite data_writes[] = { MockWrite(false, "", 0) };
355 MockRead data_reads[] = { MockRead(false, "", 0) }; 366 MockRead data_reads[] = { MockRead(false, "", 0) };
356 367
357 user_sock_.reset(BuildMockSocket(data_reads, data_writes, hanging_resolver, 368 user_sock_.reset(BuildMockSocket(data_reads, arraysize(data_reads),
358 "foo", 80)); 369 data_writes, arraysize(data_writes),
370 hanging_resolver, "foo", 80));
359 371
360 // Start connecting (will get stuck waiting for the host to resolve). 372 // Start connecting (will get stuck waiting for the host to resolve).
361 int rv = user_sock_->Connect(&callback_, NULL); 373 int rv = user_sock_->Connect(&callback_, NULL);
362 EXPECT_EQ(ERR_IO_PENDING, rv); 374 EXPECT_EQ(ERR_IO_PENDING, rv);
363 375
364 EXPECT_FALSE(user_sock_->IsConnected()); 376 EXPECT_FALSE(user_sock_->IsConnected());
365 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); 377 EXPECT_FALSE(user_sock_->IsConnectedAndIdle());
366 378
367 // The host resolver should have received the resolve request. 379 // The host resolver should have received the resolve request.
368 EXPECT_TRUE(hanging_resolver->HasOutstandingRequest()); 380 EXPECT_TRUE(hanging_resolver->HasOutstandingRequest());
369 381
370 // Disconnect the SOCKS socket -- this should cancel the outstanding resolve. 382 // Disconnect the SOCKS socket -- this should cancel the outstanding resolve.
371 user_sock_->Disconnect(); 383 user_sock_->Disconnect();
372 384
373 EXPECT_FALSE(hanging_resolver->HasOutstandingRequest()); 385 EXPECT_FALSE(hanging_resolver->HasOutstandingRequest());
374 386
375 EXPECT_FALSE(user_sock_->IsConnected()); 387 EXPECT_FALSE(user_sock_->IsConnected());
376 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); 388 EXPECT_FALSE(user_sock_->IsConnectedAndIdle());
377 } 389 }
378 390
379 } // namespace net 391 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/socks5_client_socket_unittest.cc ('k') | net/socket_stream/socket_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698