| 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 <memory> |
| 11 #include <string> | 11 #include <string> |
| 12 #include <vector> | 12 #include <vector> |
| 13 | 13 |
| 14 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.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/net_errors.h" | 20 #include "net/base/net_errors.h" |
| 21 #include "net/base/sockaddr_storage.h" | 21 #include "net/base/sockaddr_storage.h" |
| 22 #include "net/base/test_completion_callback.h" | 22 #include "net/base/test_completion_callback.h" |
| 23 #include "net/log/net_log_source.h" |
| 23 #include "net/socket/socket_performance_watcher.h" | 24 #include "net/socket/socket_performance_watcher.h" |
| 24 #include "net/socket/tcp_client_socket.h" | 25 #include "net/socket/tcp_client_socket.h" |
| 25 #include "net/test/gtest_util.h" | 26 #include "net/test/gtest_util.h" |
| 26 #include "testing/gmock/include/gmock/gmock.h" | 27 #include "testing/gmock/include/gmock/gmock.h" |
| 27 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 28 #include "testing/platform_test.h" | 29 #include "testing/platform_test.h" |
| 29 | 30 |
| 30 using net::test::IsOk; | 31 using net::test::IsOk; |
| 31 | 32 |
| 32 namespace net { | 33 namespace net { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 60 size_t connection_changed_count_; | 61 size_t connection_changed_count_; |
| 61 size_t rtt_notification_count_; | 62 size_t rtt_notification_count_; |
| 62 | 63 |
| 63 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher); | 64 DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher); |
| 64 }; | 65 }; |
| 65 | 66 |
| 66 const int kListenBacklog = 5; | 67 const int kListenBacklog = 5; |
| 67 | 68 |
| 68 class TCPSocketTest : public PlatformTest { | 69 class TCPSocketTest : public PlatformTest { |
| 69 protected: | 70 protected: |
| 70 TCPSocketTest() : socket_(NULL, NULL, NetLog::Source()) {} | 71 TCPSocketTest() : socket_(NULL, NULL, NetLogSource()) {} |
| 71 | 72 |
| 72 void SetUpListenIPv4() { | 73 void SetUpListenIPv4() { |
| 73 ASSERT_THAT(socket_.Open(ADDRESS_FAMILY_IPV4), IsOk()); | 74 ASSERT_THAT(socket_.Open(ADDRESS_FAMILY_IPV4), IsOk()); |
| 74 ASSERT_THAT(socket_.Bind(IPEndPoint(IPAddress::IPv4Localhost(), 0)), | 75 ASSERT_THAT(socket_.Bind(IPEndPoint(IPAddress::IPv4Localhost(), 0)), |
| 75 IsOk()); | 76 IsOk()); |
| 76 ASSERT_THAT(socket_.Listen(kListenBacklog), IsOk()); | 77 ASSERT_THAT(socket_.Listen(kListenBacklog), IsOk()); |
| 77 ASSERT_THAT(socket_.GetLocalAddress(&local_address_), IsOk()); | 78 ASSERT_THAT(socket_.GetLocalAddress(&local_address_), IsOk()); |
| 78 } | 79 } |
| 79 | 80 |
| 80 void SetUpListenIPv6(bool* success) { | 81 void SetUpListenIPv6(bool* success) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 94 void TestAcceptAsync() { | 95 void TestAcceptAsync() { |
| 95 TestCompletionCallback accept_callback; | 96 TestCompletionCallback accept_callback; |
| 96 std::unique_ptr<TCPSocket> accepted_socket; | 97 std::unique_ptr<TCPSocket> accepted_socket; |
| 97 IPEndPoint accepted_address; | 98 IPEndPoint accepted_address; |
| 98 ASSERT_EQ(ERR_IO_PENDING, | 99 ASSERT_EQ(ERR_IO_PENDING, |
| 99 socket_.Accept(&accepted_socket, &accepted_address, | 100 socket_.Accept(&accepted_socket, &accepted_address, |
| 100 accept_callback.callback())); | 101 accept_callback.callback())); |
| 101 | 102 |
| 102 TestCompletionCallback connect_callback; | 103 TestCompletionCallback connect_callback; |
| 103 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 104 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 104 NetLog::Source()); | 105 NetLogSource()); |
| 105 connecting_socket.Connect(connect_callback.callback()); | 106 connecting_socket.Connect(connect_callback.callback()); |
| 106 | 107 |
| 107 EXPECT_THAT(connect_callback.WaitForResult(), IsOk()); | 108 EXPECT_THAT(connect_callback.WaitForResult(), IsOk()); |
| 108 EXPECT_THAT(accept_callback.WaitForResult(), IsOk()); | 109 EXPECT_THAT(accept_callback.WaitForResult(), IsOk()); |
| 109 | 110 |
| 110 EXPECT_TRUE(accepted_socket.get()); | 111 EXPECT_TRUE(accepted_socket.get()); |
| 111 | 112 |
| 112 // Both sockets should be on the loopback network interface. | 113 // Both sockets should be on the loopback network interface. |
| 113 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 114 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
| 114 } | 115 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 135 new base::SimpleTestTickClock()); | 136 new base::SimpleTestTickClock()); |
| 136 base::SimpleTestTickClock* tick_clock_ptr = tick_clock.get(); | 137 base::SimpleTestTickClock* tick_clock_ptr = tick_clock.get(); |
| 137 tick_clock_ptr->SetNowTicks(base::TimeTicks::Now()); | 138 tick_clock_ptr->SetNowTicks(base::TimeTicks::Now()); |
| 138 | 139 |
| 139 TestCompletionCallback connect_callback; | 140 TestCompletionCallback connect_callback; |
| 140 | 141 |
| 141 std::unique_ptr<TestSocketPerformanceWatcher> watcher( | 142 std::unique_ptr<TestSocketPerformanceWatcher> watcher( |
| 142 new TestSocketPerformanceWatcher(should_notify_updated_rtt)); | 143 new TestSocketPerformanceWatcher(should_notify_updated_rtt)); |
| 143 TestSocketPerformanceWatcher* watcher_ptr = watcher.get(); | 144 TestSocketPerformanceWatcher* watcher_ptr = watcher.get(); |
| 144 | 145 |
| 145 TCPSocket connecting_socket(std::move(watcher), NULL, NetLog::Source()); | 146 TCPSocket connecting_socket(std::move(watcher), NULL, NetLogSource()); |
| 146 connecting_socket.SetTickClockForTesting(std::move(tick_clock)); | 147 connecting_socket.SetTickClockForTesting(std::move(tick_clock)); |
| 147 | 148 |
| 148 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); | 149 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); |
| 149 ASSERT_THAT(result, IsOk()); | 150 ASSERT_THAT(result, IsOk()); |
| 150 connecting_socket.Connect(local_address_, connect_callback.callback()); | 151 connecting_socket.Connect(local_address_, connect_callback.callback()); |
| 151 | 152 |
| 152 TestCompletionCallback accept_callback; | 153 TestCompletionCallback accept_callback; |
| 153 std::unique_ptr<TCPSocket> accepted_socket; | 154 std::unique_ptr<TCPSocket> accepted_socket; |
| 154 IPEndPoint accepted_address; | 155 IPEndPoint accepted_address; |
| 155 result = socket_.Accept(&accepted_socket, &accepted_address, | 156 result = socket_.Accept(&accepted_socket, &accepted_address, |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 }; | 204 }; |
| 204 | 205 |
| 205 // Test listening and accepting with a socket bound to an IPv4 address. | 206 // Test listening and accepting with a socket bound to an IPv4 address. |
| 206 TEST_F(TCPSocketTest, Accept) { | 207 TEST_F(TCPSocketTest, Accept) { |
| 207 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 208 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
| 208 | 209 |
| 209 TestCompletionCallback connect_callback; | 210 TestCompletionCallback connect_callback; |
| 210 // TODO(yzshen): Switch to use TCPSocket when it supports client socket | 211 // TODO(yzshen): Switch to use TCPSocket when it supports client socket |
| 211 // operations. | 212 // operations. |
| 212 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 213 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 213 NetLog::Source()); | 214 NetLogSource()); |
| 214 connecting_socket.Connect(connect_callback.callback()); | 215 connecting_socket.Connect(connect_callback.callback()); |
| 215 | 216 |
| 216 TestCompletionCallback accept_callback; | 217 TestCompletionCallback accept_callback; |
| 217 std::unique_ptr<TCPSocket> accepted_socket; | 218 std::unique_ptr<TCPSocket> accepted_socket; |
| 218 IPEndPoint accepted_address; | 219 IPEndPoint accepted_address; |
| 219 int result = socket_.Accept(&accepted_socket, &accepted_address, | 220 int result = socket_.Accept(&accepted_socket, &accepted_address, |
| 220 accept_callback.callback()); | 221 accept_callback.callback()); |
| 221 if (result == ERR_IO_PENDING) | 222 if (result == ERR_IO_PENDING) |
| 222 result = accept_callback.WaitForResult(); | 223 result = accept_callback.WaitForResult(); |
| 223 ASSERT_THAT(result, IsOk()); | 224 ASSERT_THAT(result, IsOk()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 TestCompletionCallback accept_callback; | 263 TestCompletionCallback accept_callback; |
| 263 std::unique_ptr<TCPSocket> accepted_socket; | 264 std::unique_ptr<TCPSocket> accepted_socket; |
| 264 IPEndPoint accepted_address; | 265 IPEndPoint accepted_address; |
| 265 | 266 |
| 266 ASSERT_EQ(ERR_IO_PENDING, | 267 ASSERT_EQ(ERR_IO_PENDING, |
| 267 socket_.Accept(&accepted_socket, &accepted_address, | 268 socket_.Accept(&accepted_socket, &accepted_address, |
| 268 accept_callback.callback())); | 269 accept_callback.callback())); |
| 269 | 270 |
| 270 TestCompletionCallback connect_callback; | 271 TestCompletionCallback connect_callback; |
| 271 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 272 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 272 NetLog::Source()); | 273 NetLogSource()); |
| 273 connecting_socket.Connect(connect_callback.callback()); | 274 connecting_socket.Connect(connect_callback.callback()); |
| 274 | 275 |
| 275 TestCompletionCallback connect_callback2; | 276 TestCompletionCallback connect_callback2; |
| 276 TCPClientSocket connecting_socket2(local_address_list(), NULL, NULL, | 277 TCPClientSocket connecting_socket2(local_address_list(), NULL, NULL, |
| 277 NetLog::Source()); | 278 NetLogSource()); |
| 278 connecting_socket2.Connect(connect_callback2.callback()); | 279 connecting_socket2.Connect(connect_callback2.callback()); |
| 279 | 280 |
| 280 EXPECT_THAT(accept_callback.WaitForResult(), IsOk()); | 281 EXPECT_THAT(accept_callback.WaitForResult(), IsOk()); |
| 281 | 282 |
| 282 TestCompletionCallback accept_callback2; | 283 TestCompletionCallback accept_callback2; |
| 283 std::unique_ptr<TCPSocket> accepted_socket2; | 284 std::unique_ptr<TCPSocket> accepted_socket2; |
| 284 IPEndPoint accepted_address2; | 285 IPEndPoint accepted_address2; |
| 285 | 286 |
| 286 int result = socket_.Accept(&accepted_socket2, &accepted_address2, | 287 int result = socket_.Accept(&accepted_socket2, &accepted_address2, |
| 287 accept_callback2.callback()); | 288 accept_callback2.callback()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 302 | 303 |
| 303 // Test listening and accepting with a socket bound to an IPv6 address. | 304 // Test listening and accepting with a socket bound to an IPv6 address. |
| 304 TEST_F(TCPSocketTest, AcceptIPv6) { | 305 TEST_F(TCPSocketTest, AcceptIPv6) { |
| 305 bool initialized = false; | 306 bool initialized = false; |
| 306 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv6(&initialized)); | 307 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv6(&initialized)); |
| 307 if (!initialized) | 308 if (!initialized) |
| 308 return; | 309 return; |
| 309 | 310 |
| 310 TestCompletionCallback connect_callback; | 311 TestCompletionCallback connect_callback; |
| 311 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 312 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 312 NetLog::Source()); | 313 NetLogSource()); |
| 313 connecting_socket.Connect(connect_callback.callback()); | 314 connecting_socket.Connect(connect_callback.callback()); |
| 314 | 315 |
| 315 TestCompletionCallback accept_callback; | 316 TestCompletionCallback accept_callback; |
| 316 std::unique_ptr<TCPSocket> accepted_socket; | 317 std::unique_ptr<TCPSocket> accepted_socket; |
| 317 IPEndPoint accepted_address; | 318 IPEndPoint accepted_address; |
| 318 int result = socket_.Accept(&accepted_socket, &accepted_address, | 319 int result = socket_.Accept(&accepted_socket, &accepted_address, |
| 319 accept_callback.callback()); | 320 accept_callback.callback()); |
| 320 if (result == ERR_IO_PENDING) | 321 if (result == ERR_IO_PENDING) |
| 321 result = accept_callback.WaitForResult(); | 322 result = accept_callback.WaitForResult(); |
| 322 ASSERT_THAT(result, IsOk()); | 323 ASSERT_THAT(result, IsOk()); |
| 323 | 324 |
| 324 EXPECT_TRUE(accepted_socket.get()); | 325 EXPECT_TRUE(accepted_socket.get()); |
| 325 | 326 |
| 326 // Both sockets should be on the loopback network interface. | 327 // Both sockets should be on the loopback network interface. |
| 327 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 328 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
| 328 | 329 |
| 329 EXPECT_THAT(connect_callback.WaitForResult(), IsOk()); | 330 EXPECT_THAT(connect_callback.WaitForResult(), IsOk()); |
| 330 } | 331 } |
| 331 | 332 |
| 332 TEST_F(TCPSocketTest, ReadWrite) { | 333 TEST_F(TCPSocketTest, ReadWrite) { |
| 333 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 334 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
| 334 | 335 |
| 335 TestCompletionCallback connect_callback; | 336 TestCompletionCallback connect_callback; |
| 336 TCPSocket connecting_socket(NULL, NULL, NetLog::Source()); | 337 TCPSocket connecting_socket(NULL, NULL, NetLogSource()); |
| 337 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); | 338 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); |
| 338 ASSERT_THAT(result, IsOk()); | 339 ASSERT_THAT(result, IsOk()); |
| 339 connecting_socket.Connect(local_address_, connect_callback.callback()); | 340 connecting_socket.Connect(local_address_, connect_callback.callback()); |
| 340 | 341 |
| 341 TestCompletionCallback accept_callback; | 342 TestCompletionCallback accept_callback; |
| 342 std::unique_ptr<TCPSocket> accepted_socket; | 343 std::unique_ptr<TCPSocket> accepted_socket; |
| 343 IPEndPoint accepted_address; | 344 IPEndPoint accepted_address; |
| 344 result = socket_.Accept(&accepted_socket, &accepted_address, | 345 result = socket_.Accept(&accepted_socket, &accepted_address, |
| 345 accept_callback.callback()); | 346 accept_callback.callback()); |
| 346 ASSERT_THAT(accept_callback.GetResult(result), IsOk()); | 347 ASSERT_THAT(accept_callback.GetResult(result), IsOk()); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 // additional notification should be received for each message read since this | 410 // additional notification should be received for each message read since this |
| 410 // test advances clock by 2 seconds (which is longer than the minimum interval | 411 // test advances clock by 2 seconds (which is longer than the minimum interval |
| 411 // between consecutive notifications) before every read. | 412 // between consecutive notifications) before every read. |
| 412 TEST_F(TCPSocketTest, SPWAdvance) { | 413 TEST_F(TCPSocketTest, SPWAdvance) { |
| 413 TestSPWNotifications(base::TimeDelta::FromSeconds(2), true, 2u, 0u, 3u); | 414 TestSPWNotifications(base::TimeDelta::FromSeconds(2), true, 2u, 0u, 3u); |
| 414 } | 415 } |
| 415 #endif // defined(TCP_INFO) || defined(OS_LINUX) | 416 #endif // defined(TCP_INFO) || defined(OS_LINUX) |
| 416 | 417 |
| 417 } // namespace | 418 } // namespace |
| 418 } // namespace net | 419 } // namespace net |
| OLD | NEW |