| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/tcp_socket.h" | 5 #include "net/socket/tcp_socket.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 | 9 |
| 10 #include <memory> |
| 10 #include <string> | 11 #include <string> |
| 11 #include <vector> | 12 #include <vector> |
| 12 | 13 |
| 13 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
| 14 #include "base/memory/scoped_ptr.h" | |
| 15 #include "base/test/simple_test_tick_clock.h" | 15 #include "base/test/simple_test_tick_clock.h" |
| 16 #include "base/time/time.h" | 16 #include "base/time/time.h" |
| 17 #include "net/base/address_list.h" | 17 #include "net/base/address_list.h" |
| 18 #include "net/base/io_buffer.h" | 18 #include "net/base/io_buffer.h" |
| 19 #include "net/base/ip_endpoint.h" | 19 #include "net/base/ip_endpoint.h" |
| 20 #include "net/base/ip_endpoint.h" | 20 #include "net/base/ip_endpoint.h" |
| 21 #include "net/base/net_errors.h" | 21 #include "net/base/net_errors.h" |
| 22 #include "net/base/sockaddr_storage.h" | 22 #include "net/base/sockaddr_storage.h" |
| 23 #include "net/base/socket_performance_watcher.h" | 23 #include "net/base/socket_performance_watcher.h" |
| 24 #include "net/base/test_completion_callback.h" | 24 #include "net/base/test_completion_callback.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 LOG(ERROR) << "Failed to listen on ::1 - probably because IPv6 is " | 82 LOG(ERROR) << "Failed to listen on ::1 - probably because IPv6 is " |
| 83 "disabled. Skipping the test"; | 83 "disabled. Skipping the test"; |
| 84 return; | 84 return; |
| 85 } | 85 } |
| 86 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); | 86 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); |
| 87 *success = true; | 87 *success = true; |
| 88 } | 88 } |
| 89 | 89 |
| 90 void TestAcceptAsync() { | 90 void TestAcceptAsync() { |
| 91 TestCompletionCallback accept_callback; | 91 TestCompletionCallback accept_callback; |
| 92 scoped_ptr<TCPSocket> accepted_socket; | 92 std::unique_ptr<TCPSocket> accepted_socket; |
| 93 IPEndPoint accepted_address; | 93 IPEndPoint accepted_address; |
| 94 ASSERT_EQ(ERR_IO_PENDING, | 94 ASSERT_EQ(ERR_IO_PENDING, |
| 95 socket_.Accept(&accepted_socket, &accepted_address, | 95 socket_.Accept(&accepted_socket, &accepted_address, |
| 96 accept_callback.callback())); | 96 accept_callback.callback())); |
| 97 | 97 |
| 98 TestCompletionCallback connect_callback; | 98 TestCompletionCallback connect_callback; |
| 99 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 99 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 100 NetLog::Source()); | 100 NetLog::Source()); |
| 101 connecting_socket.Connect(connect_callback.callback()); | 101 connecting_socket.Connect(connect_callback.callback()); |
| 102 | 102 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 120 // is the expected number of RTT notifications received by the SPW. | 120 // is the expected number of RTT notifications received by the SPW. |
| 121 // This test works by writing |num_messages| to the socket. A different | 121 // This test works by writing |num_messages| to the socket. A different |
| 122 // socket (with a SPW attached to it) reads the messages. | 122 // socket (with a SPW attached to it) reads the messages. |
| 123 void TestSPWNotifications(const base::TimeDelta& advance_ticks, | 123 void TestSPWNotifications(const base::TimeDelta& advance_ticks, |
| 124 bool should_notify_updated_rtt, | 124 bool should_notify_updated_rtt, |
| 125 size_t num_messages, | 125 size_t num_messages, |
| 126 size_t expect_connection_changed_count, | 126 size_t expect_connection_changed_count, |
| 127 size_t expect_rtt_notification_count) { | 127 size_t expect_rtt_notification_count) { |
| 128 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 128 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
| 129 | 129 |
| 130 scoped_ptr<base::SimpleTestTickClock> tick_clock( | 130 std::unique_ptr<base::SimpleTestTickClock> tick_clock( |
| 131 new base::SimpleTestTickClock()); | 131 new base::SimpleTestTickClock()); |
| 132 base::SimpleTestTickClock* tick_clock_ptr = tick_clock.get(); | 132 base::SimpleTestTickClock* tick_clock_ptr = tick_clock.get(); |
| 133 tick_clock_ptr->SetNowTicks(base::TimeTicks::Now()); | 133 tick_clock_ptr->SetNowTicks(base::TimeTicks::Now()); |
| 134 | 134 |
| 135 TestCompletionCallback connect_callback; | 135 TestCompletionCallback connect_callback; |
| 136 | 136 |
| 137 scoped_ptr<TestSocketPerformanceWatcher> watcher( | 137 std::unique_ptr<TestSocketPerformanceWatcher> watcher( |
| 138 new TestSocketPerformanceWatcher(should_notify_updated_rtt)); | 138 new TestSocketPerformanceWatcher(should_notify_updated_rtt)); |
| 139 TestSocketPerformanceWatcher* watcher_ptr = watcher.get(); | 139 TestSocketPerformanceWatcher* watcher_ptr = watcher.get(); |
| 140 | 140 |
| 141 TCPSocket connecting_socket(std::move(watcher), NULL, NetLog::Source()); | 141 TCPSocket connecting_socket(std::move(watcher), NULL, NetLog::Source()); |
| 142 connecting_socket.SetTickClockForTesting(std::move(tick_clock)); | 142 connecting_socket.SetTickClockForTesting(std::move(tick_clock)); |
| 143 | 143 |
| 144 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); | 144 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); |
| 145 ASSERT_EQ(OK, result); | 145 ASSERT_EQ(OK, result); |
| 146 connecting_socket.Connect(local_address_, connect_callback.callback()); | 146 connecting_socket.Connect(local_address_, connect_callback.callback()); |
| 147 | 147 |
| 148 TestCompletionCallback accept_callback; | 148 TestCompletionCallback accept_callback; |
| 149 scoped_ptr<TCPSocket> accepted_socket; | 149 std::unique_ptr<TCPSocket> accepted_socket; |
| 150 IPEndPoint accepted_address; | 150 IPEndPoint accepted_address; |
| 151 result = socket_.Accept(&accepted_socket, &accepted_address, | 151 result = socket_.Accept(&accepted_socket, &accepted_address, |
| 152 accept_callback.callback()); | 152 accept_callback.callback()); |
| 153 ASSERT_EQ(OK, accept_callback.GetResult(result)); | 153 ASSERT_EQ(OK, accept_callback.GetResult(result)); |
| 154 | 154 |
| 155 ASSERT_TRUE(accepted_socket.get()); | 155 ASSERT_TRUE(accepted_socket.get()); |
| 156 | 156 |
| 157 // Both sockets should be on the loopback network interface. | 157 // Both sockets should be on the loopback network interface. |
| 158 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 158 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
| 159 | 159 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 203 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
| 204 | 204 |
| 205 TestCompletionCallback connect_callback; | 205 TestCompletionCallback connect_callback; |
| 206 // TODO(yzshen): Switch to use TCPSocket when it supports client socket | 206 // TODO(yzshen): Switch to use TCPSocket when it supports client socket |
| 207 // operations. | 207 // operations. |
| 208 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 208 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 209 NetLog::Source()); | 209 NetLog::Source()); |
| 210 connecting_socket.Connect(connect_callback.callback()); | 210 connecting_socket.Connect(connect_callback.callback()); |
| 211 | 211 |
| 212 TestCompletionCallback accept_callback; | 212 TestCompletionCallback accept_callback; |
| 213 scoped_ptr<TCPSocket> accepted_socket; | 213 std::unique_ptr<TCPSocket> accepted_socket; |
| 214 IPEndPoint accepted_address; | 214 IPEndPoint accepted_address; |
| 215 int result = socket_.Accept(&accepted_socket, &accepted_address, | 215 int result = socket_.Accept(&accepted_socket, &accepted_address, |
| 216 accept_callback.callback()); | 216 accept_callback.callback()); |
| 217 if (result == ERR_IO_PENDING) | 217 if (result == ERR_IO_PENDING) |
| 218 result = accept_callback.WaitForResult(); | 218 result = accept_callback.WaitForResult(); |
| 219 ASSERT_EQ(OK, result); | 219 ASSERT_EQ(OK, result); |
| 220 | 220 |
| 221 EXPECT_TRUE(accepted_socket.get()); | 221 EXPECT_TRUE(accepted_socket.get()); |
| 222 | 222 |
| 223 // Both sockets should be on the loopback network interface. | 223 // Both sockets should be on the loopback network interface. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 249 | 249 |
| 250 TestAcceptAsync(); | 250 TestAcceptAsync(); |
| 251 } | 251 } |
| 252 #endif | 252 #endif |
| 253 | 253 |
| 254 // Accept two connections simultaneously. | 254 // Accept two connections simultaneously. |
| 255 TEST_F(TCPSocketTest, Accept2Connections) { | 255 TEST_F(TCPSocketTest, Accept2Connections) { |
| 256 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 256 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
| 257 | 257 |
| 258 TestCompletionCallback accept_callback; | 258 TestCompletionCallback accept_callback; |
| 259 scoped_ptr<TCPSocket> accepted_socket; | 259 std::unique_ptr<TCPSocket> accepted_socket; |
| 260 IPEndPoint accepted_address; | 260 IPEndPoint accepted_address; |
| 261 | 261 |
| 262 ASSERT_EQ(ERR_IO_PENDING, | 262 ASSERT_EQ(ERR_IO_PENDING, |
| 263 socket_.Accept(&accepted_socket, &accepted_address, | 263 socket_.Accept(&accepted_socket, &accepted_address, |
| 264 accept_callback.callback())); | 264 accept_callback.callback())); |
| 265 | 265 |
| 266 TestCompletionCallback connect_callback; | 266 TestCompletionCallback connect_callback; |
| 267 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 267 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 268 NetLog::Source()); | 268 NetLog::Source()); |
| 269 connecting_socket.Connect(connect_callback.callback()); | 269 connecting_socket.Connect(connect_callback.callback()); |
| 270 | 270 |
| 271 TestCompletionCallback connect_callback2; | 271 TestCompletionCallback connect_callback2; |
| 272 TCPClientSocket connecting_socket2(local_address_list(), NULL, NULL, | 272 TCPClientSocket connecting_socket2(local_address_list(), NULL, NULL, |
| 273 NetLog::Source()); | 273 NetLog::Source()); |
| 274 connecting_socket2.Connect(connect_callback2.callback()); | 274 connecting_socket2.Connect(connect_callback2.callback()); |
| 275 | 275 |
| 276 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 276 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
| 277 | 277 |
| 278 TestCompletionCallback accept_callback2; | 278 TestCompletionCallback accept_callback2; |
| 279 scoped_ptr<TCPSocket> accepted_socket2; | 279 std::unique_ptr<TCPSocket> accepted_socket2; |
| 280 IPEndPoint accepted_address2; | 280 IPEndPoint accepted_address2; |
| 281 | 281 |
| 282 int result = socket_.Accept(&accepted_socket2, &accepted_address2, | 282 int result = socket_.Accept(&accepted_socket2, &accepted_address2, |
| 283 accept_callback2.callback()); | 283 accept_callback2.callback()); |
| 284 if (result == ERR_IO_PENDING) | 284 if (result == ERR_IO_PENDING) |
| 285 result = accept_callback2.WaitForResult(); | 285 result = accept_callback2.WaitForResult(); |
| 286 ASSERT_EQ(OK, result); | 286 ASSERT_EQ(OK, result); |
| 287 | 287 |
| 288 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 288 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
| 289 EXPECT_EQ(OK, connect_callback2.WaitForResult()); | 289 EXPECT_EQ(OK, connect_callback2.WaitForResult()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 302 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv6(&initialized)); | 302 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv6(&initialized)); |
| 303 if (!initialized) | 303 if (!initialized) |
| 304 return; | 304 return; |
| 305 | 305 |
| 306 TestCompletionCallback connect_callback; | 306 TestCompletionCallback connect_callback; |
| 307 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 307 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 308 NetLog::Source()); | 308 NetLog::Source()); |
| 309 connecting_socket.Connect(connect_callback.callback()); | 309 connecting_socket.Connect(connect_callback.callback()); |
| 310 | 310 |
| 311 TestCompletionCallback accept_callback; | 311 TestCompletionCallback accept_callback; |
| 312 scoped_ptr<TCPSocket> accepted_socket; | 312 std::unique_ptr<TCPSocket> accepted_socket; |
| 313 IPEndPoint accepted_address; | 313 IPEndPoint accepted_address; |
| 314 int result = socket_.Accept(&accepted_socket, &accepted_address, | 314 int result = socket_.Accept(&accepted_socket, &accepted_address, |
| 315 accept_callback.callback()); | 315 accept_callback.callback()); |
| 316 if (result == ERR_IO_PENDING) | 316 if (result == ERR_IO_PENDING) |
| 317 result = accept_callback.WaitForResult(); | 317 result = accept_callback.WaitForResult(); |
| 318 ASSERT_EQ(OK, result); | 318 ASSERT_EQ(OK, result); |
| 319 | 319 |
| 320 EXPECT_TRUE(accepted_socket.get()); | 320 EXPECT_TRUE(accepted_socket.get()); |
| 321 | 321 |
| 322 // Both sockets should be on the loopback network interface. | 322 // Both sockets should be on the loopback network interface. |
| 323 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 323 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
| 324 | 324 |
| 325 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 325 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
| 326 } | 326 } |
| 327 | 327 |
| 328 TEST_F(TCPSocketTest, ReadWrite) { | 328 TEST_F(TCPSocketTest, ReadWrite) { |
| 329 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 329 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
| 330 | 330 |
| 331 TestCompletionCallback connect_callback; | 331 TestCompletionCallback connect_callback; |
| 332 TCPSocket connecting_socket(NULL, NULL, NetLog::Source()); | 332 TCPSocket connecting_socket(NULL, NULL, NetLog::Source()); |
| 333 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); | 333 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); |
| 334 ASSERT_EQ(OK, result); | 334 ASSERT_EQ(OK, result); |
| 335 connecting_socket.Connect(local_address_, connect_callback.callback()); | 335 connecting_socket.Connect(local_address_, connect_callback.callback()); |
| 336 | 336 |
| 337 TestCompletionCallback accept_callback; | 337 TestCompletionCallback accept_callback; |
| 338 scoped_ptr<TCPSocket> accepted_socket; | 338 std::unique_ptr<TCPSocket> accepted_socket; |
| 339 IPEndPoint accepted_address; | 339 IPEndPoint accepted_address; |
| 340 result = socket_.Accept(&accepted_socket, &accepted_address, | 340 result = socket_.Accept(&accepted_socket, &accepted_address, |
| 341 accept_callback.callback()); | 341 accept_callback.callback()); |
| 342 ASSERT_EQ(OK, accept_callback.GetResult(result)); | 342 ASSERT_EQ(OK, accept_callback.GetResult(result)); |
| 343 | 343 |
| 344 ASSERT_TRUE(accepted_socket.get()); | 344 ASSERT_TRUE(accepted_socket.get()); |
| 345 | 345 |
| 346 // Both sockets should be on the loopback network interface. | 346 // Both sockets should be on the loopback network interface. |
| 347 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 347 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
| 348 | 348 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 // additional notification should be received for each message read since this | 405 // additional notification should be received for each message read since this |
| 406 // test advances clock by 2 seconds (which is longer than the minimum interval | 406 // test advances clock by 2 seconds (which is longer than the minimum interval |
| 407 // between consecutive notifications) before every read. | 407 // between consecutive notifications) before every read. |
| 408 TEST_F(TCPSocketTest, SPWAdvance) { | 408 TEST_F(TCPSocketTest, SPWAdvance) { |
| 409 TestSPWNotifications(base::TimeDelta::FromSeconds(2), true, 2u, 0u, 3u); | 409 TestSPWNotifications(base::TimeDelta::FromSeconds(2), true, 2u, 0u, 3u); |
| 410 } | 410 } |
| 411 #endif // defined(TCP_INFO) || defined(OS_LINUX) | 411 #endif // defined(TCP_INFO) || defined(OS_LINUX) |
| 412 | 412 |
| 413 } // namespace | 413 } // namespace |
| 414 } // namespace net | 414 } // namespace net |
| OLD | NEW |