OLD | NEW |
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 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 "localhost", 80)); | 132 "localhost", 80)); |
133 | 133 |
134 // 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. |
135 EXPECT_TRUE(tcp_sock_->IsConnected()); | 135 EXPECT_TRUE(tcp_sock_->IsConnected()); |
136 EXPECT_FALSE(user_sock_->IsConnected()); | 136 EXPECT_FALSE(user_sock_->IsConnected()); |
137 | 137 |
138 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 138 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
139 int rv = user_sock_->Connect(&callback_, log); | 139 int rv = user_sock_->Connect(&callback_, log); |
140 EXPECT_EQ(ERR_IO_PENDING, rv); | 140 EXPECT_EQ(ERR_IO_PENDING, rv); |
141 EXPECT_TRUE( | 141 EXPECT_TRUE( |
142 LogContains(*log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); | 142 LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
143 EXPECT_FALSE(user_sock_->IsConnected()); | 143 EXPECT_FALSE(user_sock_->IsConnected()); |
144 rv = callback_.WaitForResult(); | 144 rv = callback_.WaitForResult(); |
145 | 145 |
146 EXPECT_EQ(OK, rv); | 146 EXPECT_EQ(OK, rv); |
147 EXPECT_TRUE(user_sock_->IsConnected()); | 147 EXPECT_TRUE(user_sock_->IsConnected()); |
148 EXPECT_EQ(SOCKSClientSocket::kSOCKS4, user_sock_->socks_version_); | 148 EXPECT_EQ(SOCKSClientSocket::kSOCKS4, user_sock_->socks_version_); |
149 EXPECT_TRUE(LogContains( | 149 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); |
150 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); | |
151 | 150 |
152 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size()); | 151 scoped_refptr<IOBuffer> buffer = new IOBuffer(payload_write.size()); |
153 memcpy(buffer->data(), payload_write.data(), payload_write.size()); | 152 memcpy(buffer->data(), payload_write.data(), payload_write.size()); |
154 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); | 153 rv = user_sock_->Write(buffer, payload_write.size(), &callback_); |
155 EXPECT_EQ(ERR_IO_PENDING, rv); | 154 EXPECT_EQ(ERR_IO_PENDING, rv); |
156 rv = callback_.WaitForResult(); | 155 rv = callback_.WaitForResult(); |
157 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); | 156 EXPECT_EQ(static_cast<int>(payload_write.size()), rv); |
158 | 157 |
159 buffer = new IOBuffer(payload_read.size()); | 158 buffer = new IOBuffer(payload_read.size()); |
160 rv = user_sock_->Read(buffer, payload_read.size(), &callback_); | 159 rv = user_sock_->Read(buffer, payload_read.size(), &callback_); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 193 MockWrite(false, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
195 MockRead data_reads[] = { | 194 MockRead data_reads[] = { |
196 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) }; | 195 MockRead(false, tests[i].fail_reply, arraysize(tests[i].fail_reply)) }; |
197 | 196 |
198 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, | 197 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, |
199 "localhost", 80)); | 198 "localhost", 80)); |
200 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 199 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
201 | 200 |
202 int rv = user_sock_->Connect(&callback_, log); | 201 int rv = user_sock_->Connect(&callback_, log); |
203 EXPECT_EQ(ERR_IO_PENDING, rv); | 202 EXPECT_EQ(ERR_IO_PENDING, rv); |
204 EXPECT_TRUE(LogContains( | 203 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
205 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); | |
206 rv = callback_.WaitForResult(); | 204 rv = callback_.WaitForResult(); |
207 EXPECT_EQ(tests[i].fail_code, rv); | 205 EXPECT_EQ(tests[i].fail_code, rv); |
208 EXPECT_FALSE(user_sock_->IsConnected()); | 206 EXPECT_FALSE(user_sock_->IsConnected()); |
209 EXPECT_TRUE(tcp_sock_->IsConnected()); | 207 EXPECT_TRUE(tcp_sock_->IsConnected()); |
210 EXPECT_TRUE(LogContains( | 208 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); |
211 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); | |
212 } | 209 } |
213 } | 210 } |
214 | 211 |
215 // Tests scenario when the server sends the handshake response in | 212 // Tests scenario when the server sends the handshake response in |
216 // more than one packet. | 213 // more than one packet. |
217 TEST_F(SOCKSClientSocketTest, PartialServerReads) { | 214 TEST_F(SOCKSClientSocketTest, PartialServerReads) { |
218 const char kSOCKSPartialReply1[] = { 0x00 }; | 215 const char kSOCKSPartialReply1[] = { 0x00 }; |
219 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; | 216 const char kSOCKSPartialReply2[] = { 0x5A, 0x00, 0x00, 0, 0, 0, 0 }; |
220 | 217 |
221 MockWrite data_writes[] = { | 218 MockWrite data_writes[] = { |
222 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 219 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
223 MockRead data_reads[] = { | 220 MockRead data_reads[] = { |
224 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)), | 221 MockRead(true, kSOCKSPartialReply1, arraysize(kSOCKSPartialReply1)), |
225 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) }; | 222 MockRead(true, kSOCKSPartialReply2, arraysize(kSOCKSPartialReply2)) }; |
226 | 223 |
227 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, | 224 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, |
228 "localhost", 80)); | 225 "localhost", 80)); |
229 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 226 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
230 | 227 |
231 int rv = user_sock_->Connect(&callback_, log); | 228 int rv = user_sock_->Connect(&callback_, log); |
232 EXPECT_EQ(ERR_IO_PENDING, rv); | 229 EXPECT_EQ(ERR_IO_PENDING, rv); |
233 EXPECT_TRUE(LogContains( | 230 EXPECT_TRUE(LogContainsBeginEvent( |
234 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); | 231 *log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
235 rv = callback_.WaitForResult(); | 232 rv = callback_.WaitForResult(); |
236 EXPECT_EQ(OK, rv); | 233 EXPECT_EQ(OK, rv); |
237 EXPECT_TRUE(user_sock_->IsConnected()); | 234 EXPECT_TRUE(user_sock_->IsConnected()); |
238 EXPECT_TRUE(LogContains( | 235 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); |
239 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); | |
240 } | 236 } |
241 | 237 |
242 // Tests scenario when the client sends the handshake request in | 238 // Tests scenario when the client sends the handshake request in |
243 // more than one packet. | 239 // more than one packet. |
244 TEST_F(SOCKSClientSocketTest, PartialClientWrites) { | 240 TEST_F(SOCKSClientSocketTest, PartialClientWrites) { |
245 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 }; | 241 const char kSOCKSPartialRequest1[] = { 0x04, 0x01 }; |
246 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 }; | 242 const char kSOCKSPartialRequest2[] = { 0x00, 0x50, 127, 0, 0, 1, 0 }; |
247 | 243 |
248 MockWrite data_writes[] = { | 244 MockWrite data_writes[] = { |
249 MockWrite(true, arraysize(kSOCKSPartialRequest1)), | 245 MockWrite(true, arraysize(kSOCKSPartialRequest1)), |
250 // simulate some empty writes | 246 // simulate some empty writes |
251 MockWrite(true, 0), | 247 MockWrite(true, 0), |
252 MockWrite(true, 0), | 248 MockWrite(true, 0), |
253 MockWrite(true, kSOCKSPartialRequest2, | 249 MockWrite(true, kSOCKSPartialRequest2, |
254 arraysize(kSOCKSPartialRequest2)) }; | 250 arraysize(kSOCKSPartialRequest2)) }; |
255 MockRead data_reads[] = { | 251 MockRead data_reads[] = { |
256 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; | 252 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; |
257 | 253 |
258 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, | 254 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, |
259 "localhost", 80)); | 255 "localhost", 80)); |
260 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 256 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
261 | 257 |
262 int rv = user_sock_->Connect(&callback_, log); | 258 int rv = user_sock_->Connect(&callback_, log); |
263 EXPECT_EQ(ERR_IO_PENDING, rv); | 259 EXPECT_EQ(ERR_IO_PENDING, rv); |
264 EXPECT_TRUE(LogContains( | 260 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
265 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); | |
266 rv = callback_.WaitForResult(); | 261 rv = callback_.WaitForResult(); |
267 EXPECT_EQ(OK, rv); | 262 EXPECT_EQ(OK, rv); |
268 EXPECT_TRUE(user_sock_->IsConnected()); | 263 EXPECT_TRUE(user_sock_->IsConnected()); |
269 EXPECT_TRUE(LogContains( | 264 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); |
270 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); | |
271 } | 265 } |
272 | 266 |
273 // Tests the case when the server sends a smaller sized handshake data | 267 // Tests the case when the server sends a smaller sized handshake data |
274 // and closes the connection. | 268 // and closes the connection. |
275 TEST_F(SOCKSClientSocketTest, FailedSocketRead) { | 269 TEST_F(SOCKSClientSocketTest, FailedSocketRead) { |
276 MockWrite data_writes[] = { | 270 MockWrite data_writes[] = { |
277 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; | 271 MockWrite(true, kSOCKSOkRequest, arraysize(kSOCKSOkRequest)) }; |
278 MockRead data_reads[] = { | 272 MockRead data_reads[] = { |
279 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2), | 273 MockRead(true, kSOCKSOkReply, arraysize(kSOCKSOkReply) - 2), |
280 // close connection unexpectedly | 274 // close connection unexpectedly |
281 MockRead(false, 0) }; | 275 MockRead(false, 0) }; |
282 | 276 |
283 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, | 277 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, |
284 "localhost", 80)); | 278 "localhost", 80)); |
285 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 279 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
286 | 280 |
287 int rv = user_sock_->Connect(&callback_, log); | 281 int rv = user_sock_->Connect(&callback_, log); |
288 EXPECT_EQ(ERR_IO_PENDING, rv); | 282 EXPECT_EQ(ERR_IO_PENDING, rv); |
289 EXPECT_TRUE(LogContains( | 283 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
290 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); | |
291 rv = callback_.WaitForResult(); | 284 rv = callback_.WaitForResult(); |
292 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); | 285 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); |
293 EXPECT_FALSE(user_sock_->IsConnected()); | 286 EXPECT_FALSE(user_sock_->IsConnected()); |
294 EXPECT_TRUE(LogContains( | 287 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); |
295 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); | |
296 } | 288 } |
297 | 289 |
298 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A. | 290 // Tries to connect to an unknown DNS and on failure should revert to SOCKS4A. |
299 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) { | 291 TEST_F(SOCKSClientSocketTest, SOCKS4AFailedDNS) { |
300 const char hostname[] = "unresolved.ipv4.address"; | 292 const char hostname[] = "unresolved.ipv4.address"; |
301 | 293 |
302 host_resolver_->rules()->AddSimulatedFailure(hostname); | 294 host_resolver_->rules()->AddSimulatedFailure(hostname); |
303 | 295 |
304 std::string request(kSOCKS4aInitialRequest, | 296 std::string request(kSOCKS4aInitialRequest, |
305 arraysize(kSOCKS4aInitialRequest)); | 297 arraysize(kSOCKS4aInitialRequest)); |
306 request.append(hostname, arraysize(hostname)); | 298 request.append(hostname, arraysize(hostname)); |
307 | 299 |
308 MockWrite data_writes[] = { | 300 MockWrite data_writes[] = { |
309 MockWrite(false, request.data(), request.size()) }; | 301 MockWrite(false, request.data(), request.size()) }; |
310 MockRead data_reads[] = { | 302 MockRead data_reads[] = { |
311 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; | 303 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; |
312 | 304 |
313 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, | 305 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, |
314 hostname, 80)); | 306 hostname, 80)); |
315 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 307 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
316 | 308 |
317 int rv = user_sock_->Connect(&callback_, log); | 309 int rv = user_sock_->Connect(&callback_, log); |
318 EXPECT_EQ(ERR_IO_PENDING, rv); | 310 EXPECT_EQ(ERR_IO_PENDING, rv); |
319 EXPECT_TRUE(LogContains( | 311 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
320 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); | |
321 rv = callback_.WaitForResult(); | 312 rv = callback_.WaitForResult(); |
322 EXPECT_EQ(OK, rv); | 313 EXPECT_EQ(OK, rv); |
323 EXPECT_TRUE(user_sock_->IsConnected()); | 314 EXPECT_TRUE(user_sock_->IsConnected()); |
324 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); | 315 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); |
325 EXPECT_TRUE(LogContains( | 316 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); |
326 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); | |
327 } | 317 } |
328 | 318 |
329 // Tries to connect to a domain that resolves to IPv6. | 319 // Tries to connect to a domain that resolves to IPv6. |
330 // Should revert to SOCKS4a. | 320 // Should revert to SOCKS4a. |
331 TEST_F(SOCKSClientSocketTest, SOCKS4AIfDomainInIPv6) { | 321 TEST_F(SOCKSClientSocketTest, SOCKS4AIfDomainInIPv6) { |
332 const char hostname[] = "an.ipv6.address"; | 322 const char hostname[] = "an.ipv6.address"; |
333 | 323 |
334 host_resolver_->rules()->AddIPv6Rule(hostname, "2001:db8:8714:3a90::12"); | 324 host_resolver_->rules()->AddIPv6Rule(hostname, "2001:db8:8714:3a90::12"); |
335 | 325 |
336 std::string request(kSOCKS4aInitialRequest, | 326 std::string request(kSOCKS4aInitialRequest, |
337 arraysize(kSOCKS4aInitialRequest)); | 327 arraysize(kSOCKS4aInitialRequest)); |
338 request.append(hostname, arraysize(hostname)); | 328 request.append(hostname, arraysize(hostname)); |
339 | 329 |
340 MockWrite data_writes[] = { | 330 MockWrite data_writes[] = { |
341 MockWrite(false, request.data(), request.size()) }; | 331 MockWrite(false, request.data(), request.size()) }; |
342 MockRead data_reads[] = { | 332 MockRead data_reads[] = { |
343 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; | 333 MockRead(false, kSOCKSOkReply, arraysize(kSOCKSOkReply)) }; |
344 | 334 |
345 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, | 335 user_sock_.reset(BuildMockSocket(data_reads, data_writes, host_resolver_, |
346 hostname, 80)); | 336 hostname, 80)); |
347 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); | 337 scoped_refptr<LoadLog> log(new LoadLog(LoadLog::kUnbounded)); |
348 | 338 |
349 int rv = user_sock_->Connect(&callback_, log); | 339 int rv = user_sock_->Connect(&callback_, log); |
350 EXPECT_EQ(ERR_IO_PENDING, rv); | 340 EXPECT_EQ(ERR_IO_PENDING, rv); |
351 EXPECT_TRUE(LogContains( | 341 EXPECT_TRUE(LogContainsBeginEvent(*log, 0, LoadLog::TYPE_SOCKS_CONNECT)); |
352 *log, 0, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_BEGIN)); | |
353 rv = callback_.WaitForResult(); | 342 rv = callback_.WaitForResult(); |
354 EXPECT_EQ(OK, rv); | 343 EXPECT_EQ(OK, rv); |
355 EXPECT_TRUE(user_sock_->IsConnected()); | 344 EXPECT_TRUE(user_sock_->IsConnected()); |
356 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); | 345 EXPECT_EQ(SOCKSClientSocket::kSOCKS4a, user_sock_->socks_version_); |
357 EXPECT_TRUE(LogContains( | 346 EXPECT_TRUE(LogContainsEndEvent(*log, -1, LoadLog::TYPE_SOCKS_CONNECT)); |
358 *log, -1, LoadLog::TYPE_SOCKS_CONNECT, LoadLog::PHASE_END)); | |
359 } | 347 } |
360 | 348 |
361 // Calls Disconnect() while a host resolve is in progress. The outstanding host | 349 // Calls Disconnect() while a host resolve is in progress. The outstanding host |
362 // resolve should be cancelled. | 350 // resolve should be cancelled. |
363 TEST_F(SOCKSClientSocketTest, DisconnectWhileHostResolveInProgress) { | 351 TEST_F(SOCKSClientSocketTest, DisconnectWhileHostResolveInProgress) { |
364 scoped_refptr<HangingHostResolver> hanging_resolver = | 352 scoped_refptr<HangingHostResolver> hanging_resolver = |
365 new HangingHostResolver(); | 353 new HangingHostResolver(); |
366 | 354 |
367 // Doesn't matter what the socket data is, we will never use it -- garbage. | 355 // Doesn't matter what the socket data is, we will never use it -- garbage. |
368 MockWrite data_writes[] = { MockWrite(false, "", 0) }; | 356 MockWrite data_writes[] = { MockWrite(false, "", 0) }; |
(...skipping 15 matching lines...) Expand all Loading... |
384 // Disconnect the SOCKS socket -- this should cancel the outstanding resolve. | 372 // Disconnect the SOCKS socket -- this should cancel the outstanding resolve. |
385 user_sock_->Disconnect(); | 373 user_sock_->Disconnect(); |
386 | 374 |
387 EXPECT_FALSE(hanging_resolver->HasOutstandingRequest()); | 375 EXPECT_FALSE(hanging_resolver->HasOutstandingRequest()); |
388 | 376 |
389 EXPECT_FALSE(user_sock_->IsConnected()); | 377 EXPECT_FALSE(user_sock_->IsConnected()); |
390 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); | 378 EXPECT_FALSE(user_sock_->IsConnectedAndIdle()); |
391 } | 379 } |
392 | 380 |
393 } // namespace net | 381 } // namespace net |
OLD | NEW |