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

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

Issue 1053343002: Use TCPServerSocket instead of TCPListenSocket in transport_client_socket_unittest.cc (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Moved tests to tcp_client_socket_unittests.cc Created 5 years, 8 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
« no previous file with comments | « net/net.gypi ('k') | net/socket/transport_client_socket_unittest.cc » ('j') | 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 // This file contains some tests for TCPClientSocket. 5 // This file contains some tests for TCPClientSocket.
6 // transport_client_socket_unittest.cc contans some other tests that 6 // transport_client_socket_unittest.cc contans some other tests that
7 // are common for TCP and other types of sockets. 7 // are common for TCP and other types of sockets.
8 8
9 #include "net/socket/tcp_client_socket.h" 9 #include "net/socket/tcp_client_socket.h"
10 10
11 #include <string>
12
13 #include "base/basictypes.h"
14 #include "base/bind.h"
15 #include "base/memory/ref_counted.h"
16 #include "base/memory/scoped_ptr.h"
17 #include "base/run_loop.h"
18 #include "net/base/address_list.h"
19 #include "net/base/io_buffer.h"
11 #include "net/base/ip_endpoint.h" 20 #include "net/base/ip_endpoint.h"
12 #include "net/base/net_errors.h" 21 #include "net/base/net_errors.h"
13 #include "net/base/net_util.h" 22 #include "net/base/net_util.h"
14 #include "net/base/test_completion_callback.h" 23 #include "net/base/test_completion_callback.h"
24 #include "net/dns/mock_host_resolver.h"
25 #include "net/log/net_log.h"
26 #include "net/log/net_log_unittest.h"
27 #include "net/socket/client_socket_factory.h"
15 #include "net/socket/tcp_server_socket.h" 28 #include "net/socket/tcp_server_socket.h"
16 #include "testing/gtest/include/gtest/gtest.h" 29 #include "testing/gtest/include/gtest/gtest.h"
30 #include "testing/platform_test.h"
17 31
18 namespace net { 32 namespace net {
19 33
20 namespace { 34 namespace {
21 35
36 const char kServerReply[] = "HTTP/1.1 404 Not Found";
37
38 enum ClientSocketTestTypes { TCP, SCTP };
39
40 } // namespace net
41
42 class TCPClientSocketTest
43 : public ::testing::TestWithParam<ClientSocketTestTypes> {
44 public:
45 TCPClientSocketTest()
46 : listen_port_(0),
47 socket_factory_(ClientSocketFactory::GetDefaultFactory()),
48 close_server_socket_on_next_send_(false) {}
49
50 virtual ~TCPClientSocketTest() {}
51
52 // Testcase hooks
53 void SetUp() override;
54
55 void CloseServerSocket() {
56 // delete the connected_sock_, which will close it.
57 connected_sock_.reset();
58 }
59
60 void AcceptCallback(int res) {
61 ASSERT_EQ(OK, res);
62 connect_loop_.Quit();
63 }
64
65 int DrainClientSocket(IOBuffer* buf,
66 uint32 buf_len,
67 uint32 bytes_to_read,
68 TestCompletionCallback* callback);
69
70 // Establishes a connection to the server.
71 void EstablishConnection(TestCompletionCallback* callback);
72
73 // Sends a request from the client to the server socket. Makes the server read
74 // the request and send a response.
75 void SendRequestAndResponse();
76
77 // Makes |connected_sock_| to read |expected_bytes_read| bytes. Returns the
78 // the data read as a string.
79 std::string ReadServerData(int expected_bytes_read);
80
81 // Sends server response.
82 void SendServerResponse();
83
84 void set_close_server_socket_on_next_send(bool close) {
85 close_server_socket_on_next_send_ = close;
86 }
87
88 protected:
89 base::RunLoop connect_loop_;
90 uint16 listen_port_;
91 TestNetLog net_log_;
92 ClientSocketFactory* const socket_factory_;
93 scoped_ptr<StreamSocket> sock_;
94 scoped_ptr<StreamSocket> connected_sock_;
95
96 private:
97 scoped_ptr<TCPServerSocket> listen_sock_;
98 bool close_server_socket_on_next_send_;
99 };
100
101 void TCPClientSocketTest::SetUp() {
102 ::testing::TestWithParam<ClientSocketTestTypes>::SetUp();
103
104 // Open a server socket on an ephemeral port.
105 listen_sock_.reset(new TCPServerSocket(NULL, NetLog::Source()));
106 IPAddressNumber address;
107 ParseIPLiteralToNumber("127.0.0.1", &address);
108 IPEndPoint local_address(address, 0);
109 ASSERT_EQ(OK, listen_sock_->Listen(local_address, 1));
110 // Get the server's address (including the actual port number).
111 ASSERT_EQ(OK, listen_sock_->GetLocalAddress(&local_address));
112 listen_port_ = local_address.port();
113 listen_sock_->Accept(
114 &connected_sock_,
115 base::Bind(&TCPClientSocketTest::AcceptCallback, base::Unretained(this)));
116
117 AddressList addr;
118 // MockHostResolver resolves everything to 127.0.0.1.
119 scoped_ptr<HostResolver> resolver(new MockHostResolver());
120 HostResolver::RequestInfo info(HostPortPair("localhost", listen_port_));
121 TestCompletionCallback callback;
122 int rv = resolver->Resolve(info, DEFAULT_PRIORITY, &addr, callback.callback(),
123 NULL, BoundNetLog());
124 CHECK_EQ(ERR_IO_PENDING, rv);
125 rv = callback.WaitForResult();
126 CHECK_EQ(rv, OK);
127 sock_ = socket_factory_->CreateTransportClientSocket(addr, &net_log_,
128 NetLog::Source());
129 }
130
131 int TCPClientSocketTest::DrainClientSocket(IOBuffer* buf,
132 uint32 buf_len,
133 uint32 bytes_to_read,
134 TestCompletionCallback* callback) {
135 int rv = OK;
136 uint32 bytes_read = 0;
137
138 while (bytes_read < bytes_to_read) {
139 rv = sock_->Read(buf, buf_len, callback->callback());
140 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
141 rv = callback->GetResult(rv);
142 EXPECT_GT(rv, 0);
143 bytes_read += rv;
144 }
145
146 return static_cast<int>(bytes_read);
147 }
148
149 void TCPClientSocketTest::EstablishConnection(
150 TestCompletionCallback* callback) {
151 int rv = sock_->Connect(callback->callback());
152 // Wait for |listen_sock_| to accept a connection.
153 connect_loop_.Run();
154 // Now wait for the client socket to accept the connection.
155 EXPECT_EQ(OK, callback->GetResult(rv));
156 }
157
158 void TCPClientSocketTest::SendRequestAndResponse() {
159 // Send client request.
160 const char request_text[] = "GET / HTTP/1.0\r\n\r\n";
161 int request_len = strlen(request_text);
162 scoped_refptr<DrainableIOBuffer> request_buffer(
163 new DrainableIOBuffer(new IOBuffer(request_len), request_len));
164 memcpy(request_buffer->data(), request_text, request_len);
165
166 int bytes_written = 0;
167 while (request_buffer->BytesRemaining() > 0) {
168 TestCompletionCallback write_callback;
169 int write_result =
170 sock_->Write(request_buffer.get(), request_buffer->BytesRemaining(),
171 write_callback.callback());
172 write_result = write_callback.GetResult(write_result);
173 ASSERT_GT(write_result, 0);
174 ASSERT_LE(bytes_written + write_result, request_len);
175 request_buffer->DidConsume(write_result);
176 bytes_written += write_result;
177 }
178 ASSERT_EQ(request_len, bytes_written);
179
180 // Confirm that the server receives what client sent.
181 std::string data_received = ReadServerData(bytes_written);
182 ASSERT_TRUE(connected_sock_->IsConnectedAndIdle());
183 ASSERT_EQ(request_text, data_received);
184
185 // Write server response.
186 SendServerResponse();
187 }
188
189 void TCPClientSocketTest::SendServerResponse() {
190 // TODO(dkegel): this might not be long enough to tickle some bugs.
191 int reply_len = strlen(kServerReply);
192 scoped_refptr<DrainableIOBuffer> write_buffer(
193 new DrainableIOBuffer(new IOBuffer(reply_len), reply_len));
194 memcpy(write_buffer->data(), kServerReply, reply_len);
195 int bytes_written = 0;
196 while (write_buffer->BytesRemaining() > 0) {
197 TestCompletionCallback write_callback;
198 int write_result = connected_sock_->Write(write_buffer.get(),
199 write_buffer->BytesRemaining(),
200 write_callback.callback());
201 write_result = write_callback.GetResult(write_result);
202 ASSERT_GE(write_result, 0);
203 ASSERT_LE(bytes_written + write_result, reply_len);
204 write_buffer->DidConsume(write_result);
205 bytes_written += write_result;
206 }
207 if (close_server_socket_on_next_send_)
208 CloseServerSocket();
209 }
210
211 std::string TCPClientSocketTest::ReadServerData(int expected_bytes_read) {
212 int bytes_read = 0;
213 scoped_refptr<IOBufferWithSize> read_buffer(
214 new IOBufferWithSize(expected_bytes_read));
215 while (bytes_read < expected_bytes_read) {
216 TestCompletionCallback read_callback;
217 int rv = connected_sock_->Read(read_buffer.get(),
218 expected_bytes_read - bytes_read,
219 read_callback.callback());
220 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
221 rv = read_callback.GetResult(rv);
222 EXPECT_GE(rv, 0);
223 bytes_read += rv;
224 }
225 EXPECT_EQ(expected_bytes_read, bytes_read);
226 return std::string(read_buffer->data(), bytes_read);
227 }
228
229 // TODO(leighton): Add SCTP to this list when it is ready.
230 INSTANTIATE_TEST_CASE_P(StreamSocket,
231 TCPClientSocketTest,
232 ::testing::Values(TCP));
mmenke 2015/04/24 20:45:49 This TODO seems to indicate this is intended to te
xunjieli 2015/04/24 20:50:15 Sounds good! will do.
233
234 TEST_P(TCPClientSocketTest, Connect) {
235 TestCompletionCallback callback;
236 EXPECT_FALSE(sock_->IsConnected());
237
238 int rv = sock_->Connect(callback.callback());
239 // Wait for |listen_sock_| to accept a connection.
240 connect_loop_.Run();
241
242 TestNetLog::CapturedEntryList net_log_entries;
243 net_log_.GetEntries(&net_log_entries);
244 EXPECT_TRUE(
245 LogContainsBeginEvent(net_log_entries, 0, NetLog::TYPE_SOCKET_ALIVE));
246 EXPECT_TRUE(
247 LogContainsBeginEvent(net_log_entries, 1, NetLog::TYPE_TCP_CONNECT));
248 // Now wait for the client socket to accept the connection.
249 if (rv != OK) {
250 ASSERT_EQ(rv, ERR_IO_PENDING);
251 rv = callback.WaitForResult();
252 EXPECT_EQ(rv, OK);
253 }
254
255 EXPECT_TRUE(sock_->IsConnected());
256 net_log_.GetEntries(&net_log_entries);
257 EXPECT_TRUE(
258 LogContainsEndEvent(net_log_entries, -1, NetLog::TYPE_TCP_CONNECT));
259
260 sock_->Disconnect();
261 EXPECT_FALSE(sock_->IsConnected());
262 }
263
264 TEST_P(TCPClientSocketTest, IsConnected) {
265 scoped_refptr<IOBuffer> buf(new IOBuffer(4096));
266 TestCompletionCallback callback;
267 uint32 bytes_read;
268
269 EXPECT_FALSE(sock_->IsConnected());
270 EXPECT_FALSE(sock_->IsConnectedAndIdle());
271
272 EstablishConnection(&callback);
273
274 EXPECT_TRUE(sock_->IsConnected());
275 EXPECT_TRUE(sock_->IsConnectedAndIdle());
276
277 // Send the request and wait for the server to respond.
278 SendRequestAndResponse();
279
280 // Drain a single byte so we know we've received some data.
281 bytes_read = DrainClientSocket(buf.get(), 1, 1, &callback);
282 ASSERT_EQ(bytes_read, 1u);
283
284 // Socket should be considered connected, but not idle, due to
285 // pending data.
286 EXPECT_TRUE(sock_->IsConnected());
287 EXPECT_FALSE(sock_->IsConnectedAndIdle());
288
289 bytes_read =
290 DrainClientSocket(buf.get(), 4096, strlen(kServerReply) - 1, &callback);
291 ASSERT_EQ(bytes_read, strlen(kServerReply) - 1);
292
293 // After draining the data, the socket should be back to connected
294 // and idle.
295 EXPECT_TRUE(sock_->IsConnected());
296 EXPECT_TRUE(sock_->IsConnectedAndIdle());
297
298 // This time close the server socket immediately after the server response.
299 set_close_server_socket_on_next_send(true);
300 SendRequestAndResponse();
301
302 bytes_read = DrainClientSocket(buf.get(), 1, 1, &callback);
303 ASSERT_EQ(bytes_read, 1u);
304
305 // As above because of data.
306 EXPECT_TRUE(sock_->IsConnected());
307 EXPECT_FALSE(sock_->IsConnectedAndIdle());
308
309 bytes_read =
310 DrainClientSocket(buf.get(), 4096, strlen(kServerReply) - 1, &callback);
311 ASSERT_EQ(bytes_read, strlen(kServerReply) - 1);
312
313 // Once the data is drained, the socket should now be seen as not
314 // connected.
315 if (sock_->IsConnected()) {
316 // In the unlikely event that the server's connection closure is not
317 // processed in time, wait for the connection to be closed.
318 int rv = sock_->Read(buf.get(), 4096, callback.callback());
319 EXPECT_EQ(0, callback.GetResult(rv));
320 EXPECT_FALSE(sock_->IsConnected());
321 }
322 EXPECT_FALSE(sock_->IsConnectedAndIdle());
323 }
324
325 TEST_P(TCPClientSocketTest, Read) {
326 TestCompletionCallback callback;
327 EstablishConnection(&callback);
328
329 SendRequestAndResponse();
330
331 scoped_refptr<IOBuffer> buf(new IOBuffer(4096));
332 uint32 bytes_read =
333 DrainClientSocket(buf.get(), 4096, strlen(kServerReply), &callback);
334 ASSERT_EQ(bytes_read, strlen(kServerReply));
335 ASSERT_EQ(std::string(kServerReply), std::string(buf->data(), bytes_read));
336
337 // All data has been read now. Read once more to force an ERR_IO_PENDING, and
338 // then close the server socket, and note the close.
339
340 int rv = sock_->Read(buf.get(), 4096, callback.callback());
341 ASSERT_EQ(ERR_IO_PENDING, rv);
342 CloseServerSocket();
343 EXPECT_EQ(0, callback.WaitForResult());
344 }
345
346 TEST_P(TCPClientSocketTest, Read_SmallChunks) {
347 TestCompletionCallback callback;
348 EstablishConnection(&callback);
349
350 SendRequestAndResponse();
351
352 scoped_refptr<IOBuffer> buf(new IOBuffer(1));
353 uint32 bytes_read = 0;
354 while (bytes_read < strlen(kServerReply)) {
355 int rv = sock_->Read(buf.get(), 1, callback.callback());
356 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
357
358 rv = callback.GetResult(rv);
359
360 ASSERT_EQ(1, rv);
361 bytes_read += rv;
362 }
363
364 // All data has been read now. Read once more to force an ERR_IO_PENDING, and
365 // then close the server socket, and note the close.
366
367 int rv = sock_->Read(buf.get(), 1, callback.callback());
368 ASSERT_EQ(ERR_IO_PENDING, rv);
369 CloseServerSocket();
370 EXPECT_EQ(0, callback.WaitForResult());
371 }
372
373 TEST_P(TCPClientSocketTest, Read_Interrupted) {
374 TestCompletionCallback callback;
375 EstablishConnection(&callback);
376
377 SendRequestAndResponse();
378
379 // Do a partial read and then exit. This test should not crash!
380 scoped_refptr<IOBuffer> buf(new IOBuffer(16));
381 int rv = sock_->Read(buf.get(), 16, callback.callback());
382 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
383
384 rv = callback.GetResult(rv);
385
386 EXPECT_NE(0, rv);
387 }
388
389 TEST_P(TCPClientSocketTest, FullDuplex_ReadFirst) {
390 TestCompletionCallback callback;
391 EstablishConnection(&callback);
392
393 // Read first. There's no data, so it should return ERR_IO_PENDING.
394 const int kBufLen = 4096;
395 scoped_refptr<IOBuffer> buf(new IOBuffer(kBufLen));
396 int rv = sock_->Read(buf.get(), kBufLen, callback.callback());
397 EXPECT_EQ(ERR_IO_PENDING, rv);
398
399 const int kWriteBufLen = 64 * 1024;
400 scoped_refptr<IOBuffer> request_buffer(new IOBuffer(kWriteBufLen));
401 char* request_data = request_buffer->data();
402 memset(request_data, 'A', kWriteBufLen);
403 TestCompletionCallback write_callback;
404
405 int bytes_written = 0;
406 while (true) {
407 rv = sock_->Write(request_buffer.get(), kWriteBufLen,
408 write_callback.callback());
409 ASSERT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
410 if (rv == ERR_IO_PENDING) {
411 ReadServerData(bytes_written);
412 ASSERT_TRUE(connected_sock_->IsConnectedAndIdle());
413 SendServerResponse();
414 rv = write_callback.WaitForResult();
415 break;
416 }
417 bytes_written += rv;
418 }
419
420 // At this point, both read and write have returned ERR_IO_PENDING, and the
421 // write callback has executed. We wait for the read callback to run now to
422 // make sure that the socket can handle full duplex communications.
423
424 rv = callback.WaitForResult();
425 EXPECT_GE(rv, 0);
426 }
427
428 TEST_P(TCPClientSocketTest, FullDuplex_WriteFirst) {
429 TestCompletionCallback callback;
430 EstablishConnection(&callback);
431
432 const int kWriteBufLen = 64 * 1024;
433 scoped_refptr<IOBuffer> request_buffer(new IOBuffer(kWriteBufLen));
434 char* request_data = request_buffer->data();
435 memset(request_data, 'A', kWriteBufLen);
436 TestCompletionCallback write_callback;
437
438 int bytes_written = 0;
439 while (true) {
440 int rv = sock_->Write(request_buffer.get(), kWriteBufLen,
441 write_callback.callback());
442 ASSERT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
443
444 if (rv == ERR_IO_PENDING)
445 break;
446 bytes_written += rv;
447 }
448
449 // Now we have the Write() blocked on ERR_IO_PENDING. It's time to force the
450 // Read() to block on ERR_IO_PENDING too.
451
452 const int kBufLen = 4096;
453 scoped_refptr<IOBuffer> buf(new IOBuffer(kBufLen));
454 while (true) {
455 int rv = sock_->Read(buf.get(), kBufLen, callback.callback());
456 ASSERT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
457 if (rv == ERR_IO_PENDING)
458 break;
459 }
460
461 // At this point, both read and write have returned ERR_IO_PENDING. Now we
462 // run the write and read callbacks to make sure they can handle full duplex
463 // communications.
464
465 ReadServerData(bytes_written);
466 ASSERT_TRUE(connected_sock_->IsConnectedAndIdle());
xunjieli 2015/04/24 20:50:15 Matt, I should remove line 466 and 412's ASSERT_TR
mmenke 2015/04/24 20:55:40 Yes, you should remove just remove them. They may
467 SendServerResponse();
468 int rv = write_callback.WaitForResult();
469 EXPECT_GE(rv, 0);
470
471 // It's possible the read is blocked because it's already read all the data.
472 // Close the server socket, so there will at least be a 0-byte read.
473 CloseServerSocket();
474
475 rv = callback.WaitForResult();
476 EXPECT_GE(rv, 0);
477 }
478
22 // Try binding a socket to loopback interface and verify that we can 479 // Try binding a socket to loopback interface and verify that we can
23 // still connect to a server on the same interface. 480 // still connect to a server on the same interface.
24 TEST(TCPClientSocketTest, BindLoopbackToLoopback) { 481 TEST(TCPClientSocketLoopbackTest, BindLoopbackToLoopback) {
25 IPAddressNumber lo_address; 482 IPAddressNumber lo_address;
26 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &lo_address)); 483 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &lo_address));
27 484
28 TCPServerSocket server(NULL, NetLog::Source()); 485 TCPServerSocket server(NULL, NetLog::Source());
29 ASSERT_EQ(OK, server.Listen(IPEndPoint(lo_address, 0), 1)); 486 ASSERT_EQ(OK, server.Listen(IPEndPoint(lo_address, 0), 1));
30 IPEndPoint server_address; 487 IPEndPoint server_address;
31 ASSERT_EQ(OK, server.GetLocalAddress(&server_address)); 488 ASSERT_EQ(OK, server.GetLocalAddress(&server_address));
32 489
33 TCPClientSocket socket(AddressList(server_address), NULL, NetLog::Source()); 490 TCPClientSocket socket(AddressList(server_address), NULL, NetLog::Source());
34 491
(...skipping 17 matching lines...) Expand all
52 509
53 EXPECT_TRUE(socket.IsConnected()); 510 EXPECT_TRUE(socket.IsConnected());
54 socket.Disconnect(); 511 socket.Disconnect();
55 EXPECT_FALSE(socket.IsConnected()); 512 EXPECT_FALSE(socket.IsConnected());
56 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED, 513 EXPECT_EQ(ERR_SOCKET_NOT_CONNECTED,
57 socket.GetLocalAddress(&local_address_result)); 514 socket.GetLocalAddress(&local_address_result));
58 } 515 }
59 516
60 // Try to bind socket to the loopback interface and connect to an 517 // Try to bind socket to the loopback interface and connect to an
61 // external address, verify that connection fails. 518 // external address, verify that connection fails.
62 TEST(TCPClientSocketTest, BindLoopbackToExternal) { 519 TEST(TCPClientSocketLoopbackTest, BindLoopbackToExternal) {
63 IPAddressNumber external_ip; 520 IPAddressNumber external_ip;
64 ASSERT_TRUE(ParseIPLiteralToNumber("72.14.213.105", &external_ip)); 521 ASSERT_TRUE(ParseIPLiteralToNumber("72.14.213.105", &external_ip));
65 TCPClientSocket socket(AddressList::CreateFromIPAddress(external_ip, 80), 522 TCPClientSocket socket(AddressList::CreateFromIPAddress(external_ip, 80),
66 NULL, NetLog::Source()); 523 NULL, NetLog::Source());
67 524
68 IPAddressNumber lo_address; 525 IPAddressNumber lo_address;
69 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &lo_address)); 526 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &lo_address));
70 EXPECT_EQ(OK, socket.Bind(IPEndPoint(lo_address, 0))); 527 EXPECT_EQ(OK, socket.Bind(IPEndPoint(lo_address, 0)));
71 528
72 TestCompletionCallback connect_callback; 529 TestCompletionCallback connect_callback;
73 int result = socket.Connect(connect_callback.callback()); 530 int result = socket.Connect(connect_callback.callback());
74 if (result == ERR_IO_PENDING) 531 if (result == ERR_IO_PENDING)
75 result = connect_callback.WaitForResult(); 532 result = connect_callback.WaitForResult();
76 533
77 // We may get different errors here on different system, but 534 // We may get different errors here on different system, but
78 // connect() is not expected to succeed. 535 // connect() is not expected to succeed.
79 EXPECT_NE(OK, result); 536 EXPECT_NE(OK, result);
80 } 537 }
81 538
82 // Bind a socket to the IPv4 loopback interface and try to connect to 539 // Bind a socket to the IPv4 loopback interface and try to connect to
83 // the IPv6 loopback interface, verify that connection fails. 540 // the IPv6 loopback interface, verify that connection fails.
84 TEST(TCPClientSocketTest, BindLoopbackToIPv6) { 541 TEST(TCPClientSocketLoopbackTest, BindLoopbackToIPv6) {
85 IPAddressNumber ipv6_lo_ip; 542 IPAddressNumber ipv6_lo_ip;
86 ASSERT_TRUE(ParseIPLiteralToNumber("::1", &ipv6_lo_ip)); 543 ASSERT_TRUE(ParseIPLiteralToNumber("::1", &ipv6_lo_ip));
87 TCPServerSocket server(NULL, NetLog::Source()); 544 TCPServerSocket server(NULL, NetLog::Source());
88 int listen_result = server.Listen(IPEndPoint(ipv6_lo_ip, 0), 1); 545 int listen_result = server.Listen(IPEndPoint(ipv6_lo_ip, 0), 1);
89 if (listen_result != OK) { 546 if (listen_result != OK) {
90 LOG(ERROR) << "Failed to listen on ::1 - probably because IPv6 is disabled." 547 LOG(ERROR) << "Failed to listen on ::1 - probably because IPv6 is disabled."
91 " Skipping the test"; 548 " Skipping the test";
92 return; 549 return;
93 } 550 }
94 551
95 IPEndPoint server_address; 552 IPEndPoint server_address;
96 ASSERT_EQ(OK, server.GetLocalAddress(&server_address)); 553 ASSERT_EQ(OK, server.GetLocalAddress(&server_address));
97 TCPClientSocket socket(AddressList(server_address), NULL, NetLog::Source()); 554 TCPClientSocket socket(AddressList(server_address), NULL, NetLog::Source());
98 555
99 IPAddressNumber ipv4_lo_ip; 556 IPAddressNumber ipv4_lo_ip;
100 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &ipv4_lo_ip)); 557 ASSERT_TRUE(ParseIPLiteralToNumber("127.0.0.1", &ipv4_lo_ip));
101 EXPECT_EQ(OK, socket.Bind(IPEndPoint(ipv4_lo_ip, 0))); 558 EXPECT_EQ(OK, socket.Bind(IPEndPoint(ipv4_lo_ip, 0)));
102 559
103 TestCompletionCallback connect_callback; 560 TestCompletionCallback connect_callback;
104 int result = socket.Connect(connect_callback.callback()); 561 int result = socket.Connect(connect_callback.callback());
105 if (result == ERR_IO_PENDING) 562 if (result == ERR_IO_PENDING)
106 result = connect_callback.WaitForResult(); 563 result = connect_callback.WaitForResult();
107 564
108 EXPECT_NE(OK, result); 565 EXPECT_NE(OK, result);
109 } 566 }
110 567
111 } // namespace
112
113 } // namespace net 568 } // namespace net
OLDNEW
« no previous file with comments | « net/net.gypi ('k') | net/socket/transport_client_socket_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698