| OLD | NEW |
| 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 #include "net/socket/tcp_server_socket.h" | 5 #include "net/socket/tcp_server_socket.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/compiler_specific.h" | 11 #include "base/compiler_specific.h" |
| 12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
| 13 #include "net/base/address_list.h" | 13 #include "net/base/address_list.h" |
| 14 #include "net/base/io_buffer.h" | 14 #include "net/base/io_buffer.h" |
| 15 #include "net/base/ip_address.h" | 15 #include "net/base/ip_address.h" |
| 16 #include "net/base/ip_endpoint.h" | 16 #include "net/base/ip_endpoint.h" |
| 17 #include "net/base/net_errors.h" | 17 #include "net/base/net_errors.h" |
| 18 #include "net/base/test_completion_callback.h" | 18 #include "net/base/test_completion_callback.h" |
| 19 #include "net/log/net_log_source.h" |
| 19 #include "net/socket/tcp_client_socket.h" | 20 #include "net/socket/tcp_client_socket.h" |
| 20 #include "net/test/gtest_util.h" | 21 #include "net/test/gtest_util.h" |
| 21 #include "testing/gmock/include/gmock/gmock.h" | 22 #include "testing/gmock/include/gmock/gmock.h" |
| 22 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 23 #include "testing/platform_test.h" | 24 #include "testing/platform_test.h" |
| 24 | 25 |
| 25 using net::test::IsOk; | 26 using net::test::IsOk; |
| 26 | 27 |
| 27 namespace net { | 28 namespace net { |
| 28 | 29 |
| 29 namespace { | 30 namespace { |
| 30 const int kListenBacklog = 5; | 31 const int kListenBacklog = 5; |
| 31 | 32 |
| 32 class TCPServerSocketTest : public PlatformTest { | 33 class TCPServerSocketTest : public PlatformTest { |
| 33 protected: | 34 protected: |
| 34 TCPServerSocketTest() | 35 TCPServerSocketTest() : socket_(NULL, NetLogSource()) {} |
| 35 : socket_(NULL, NetLog::Source()) { | |
| 36 } | |
| 37 | 36 |
| 38 void SetUpIPv4() { | 37 void SetUpIPv4() { |
| 39 IPEndPoint address(IPAddress::IPv4Localhost(), 0); | 38 IPEndPoint address(IPAddress::IPv4Localhost(), 0); |
| 40 ASSERT_THAT(socket_.Listen(address, kListenBacklog), IsOk()); | 39 ASSERT_THAT(socket_.Listen(address, kListenBacklog), IsOk()); |
| 41 ASSERT_THAT(socket_.GetLocalAddress(&local_address_), IsOk()); | 40 ASSERT_THAT(socket_.GetLocalAddress(&local_address_), IsOk()); |
| 42 } | 41 } |
| 43 | 42 |
| 44 void SetUpIPv6(bool* success) { | 43 void SetUpIPv6(bool* success) { |
| 45 *success = false; | 44 *success = false; |
| 46 IPEndPoint address(IPAddress::IPv6Localhost(), 0); | 45 IPEndPoint address(IPAddress::IPv6Localhost(), 0); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 65 | 64 |
| 66 TCPServerSocket socket_; | 65 TCPServerSocket socket_; |
| 67 IPEndPoint local_address_; | 66 IPEndPoint local_address_; |
| 68 }; | 67 }; |
| 69 | 68 |
| 70 TEST_F(TCPServerSocketTest, Accept) { | 69 TEST_F(TCPServerSocketTest, Accept) { |
| 71 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); | 70 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); |
| 72 | 71 |
| 73 TestCompletionCallback connect_callback; | 72 TestCompletionCallback connect_callback; |
| 74 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 73 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 75 NetLog::Source()); | 74 NetLogSource()); |
| 76 connecting_socket.Connect(connect_callback.callback()); | 75 connecting_socket.Connect(connect_callback.callback()); |
| 77 | 76 |
| 78 TestCompletionCallback accept_callback; | 77 TestCompletionCallback accept_callback; |
| 79 std::unique_ptr<StreamSocket> accepted_socket; | 78 std::unique_ptr<StreamSocket> accepted_socket; |
| 80 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); | 79 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); |
| 81 if (result == ERR_IO_PENDING) | 80 if (result == ERR_IO_PENDING) |
| 82 result = accept_callback.WaitForResult(); | 81 result = accept_callback.WaitForResult(); |
| 83 ASSERT_THAT(result, IsOk()); | 82 ASSERT_THAT(result, IsOk()); |
| 84 | 83 |
| 85 ASSERT_TRUE(accepted_socket.get() != NULL); | 84 ASSERT_TRUE(accepted_socket.get() != NULL); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 96 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); | 95 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); |
| 97 | 96 |
| 98 TestCompletionCallback accept_callback; | 97 TestCompletionCallback accept_callback; |
| 99 std::unique_ptr<StreamSocket> accepted_socket; | 98 std::unique_ptr<StreamSocket> accepted_socket; |
| 100 | 99 |
| 101 ASSERT_EQ(ERR_IO_PENDING, | 100 ASSERT_EQ(ERR_IO_PENDING, |
| 102 socket_.Accept(&accepted_socket, accept_callback.callback())); | 101 socket_.Accept(&accepted_socket, accept_callback.callback())); |
| 103 | 102 |
| 104 TestCompletionCallback connect_callback; | 103 TestCompletionCallback connect_callback; |
| 105 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 104 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 106 NetLog::Source()); | 105 NetLogSource()); |
| 107 connecting_socket.Connect(connect_callback.callback()); | 106 connecting_socket.Connect(connect_callback.callback()); |
| 108 | 107 |
| 109 EXPECT_THAT(connect_callback.WaitForResult(), IsOk()); | 108 EXPECT_THAT(connect_callback.WaitForResult(), IsOk()); |
| 110 EXPECT_THAT(accept_callback.WaitForResult(), IsOk()); | 109 EXPECT_THAT(accept_callback.WaitForResult(), IsOk()); |
| 111 | 110 |
| 112 EXPECT_TRUE(accepted_socket != NULL); | 111 EXPECT_TRUE(accepted_socket != NULL); |
| 113 | 112 |
| 114 // Both sockets should be on the loopback network interface. | 113 // Both sockets should be on the loopback network interface. |
| 115 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), | 114 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), |
| 116 local_address_.address()); | 115 local_address_.address()); |
| 117 } | 116 } |
| 118 | 117 |
| 119 // Accept two connections simultaneously. | 118 // Accept two connections simultaneously. |
| 120 TEST_F(TCPServerSocketTest, Accept2Connections) { | 119 TEST_F(TCPServerSocketTest, Accept2Connections) { |
| 121 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); | 120 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); |
| 122 | 121 |
| 123 TestCompletionCallback accept_callback; | 122 TestCompletionCallback accept_callback; |
| 124 std::unique_ptr<StreamSocket> accepted_socket; | 123 std::unique_ptr<StreamSocket> accepted_socket; |
| 125 | 124 |
| 126 ASSERT_EQ(ERR_IO_PENDING, | 125 ASSERT_EQ(ERR_IO_PENDING, |
| 127 socket_.Accept(&accepted_socket, accept_callback.callback())); | 126 socket_.Accept(&accepted_socket, accept_callback.callback())); |
| 128 | 127 |
| 129 TestCompletionCallback connect_callback; | 128 TestCompletionCallback connect_callback; |
| 130 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 129 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 131 NetLog::Source()); | 130 NetLogSource()); |
| 132 connecting_socket.Connect(connect_callback.callback()); | 131 connecting_socket.Connect(connect_callback.callback()); |
| 133 | 132 |
| 134 TestCompletionCallback connect_callback2; | 133 TestCompletionCallback connect_callback2; |
| 135 TCPClientSocket connecting_socket2(local_address_list(), NULL, NULL, | 134 TCPClientSocket connecting_socket2(local_address_list(), NULL, NULL, |
| 136 NetLog::Source()); | 135 NetLogSource()); |
| 137 connecting_socket2.Connect(connect_callback2.callback()); | 136 connecting_socket2.Connect(connect_callback2.callback()); |
| 138 | 137 |
| 139 EXPECT_THAT(accept_callback.WaitForResult(), IsOk()); | 138 EXPECT_THAT(accept_callback.WaitForResult(), IsOk()); |
| 140 | 139 |
| 141 TestCompletionCallback accept_callback2; | 140 TestCompletionCallback accept_callback2; |
| 142 std::unique_ptr<StreamSocket> accepted_socket2; | 141 std::unique_ptr<StreamSocket> accepted_socket2; |
| 143 int result = socket_.Accept(&accepted_socket2, accept_callback2.callback()); | 142 int result = socket_.Accept(&accepted_socket2, accept_callback2.callback()); |
| 144 if (result == ERR_IO_PENDING) | 143 if (result == ERR_IO_PENDING) |
| 145 result = accept_callback2.WaitForResult(); | 144 result = accept_callback2.WaitForResult(); |
| 146 ASSERT_THAT(result, IsOk()); | 145 ASSERT_THAT(result, IsOk()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 158 } | 157 } |
| 159 | 158 |
| 160 TEST_F(TCPServerSocketTest, AcceptIPv6) { | 159 TEST_F(TCPServerSocketTest, AcceptIPv6) { |
| 161 bool initialized = false; | 160 bool initialized = false; |
| 162 ASSERT_NO_FATAL_FAILURE(SetUpIPv6(&initialized)); | 161 ASSERT_NO_FATAL_FAILURE(SetUpIPv6(&initialized)); |
| 163 if (!initialized) | 162 if (!initialized) |
| 164 return; | 163 return; |
| 165 | 164 |
| 166 TestCompletionCallback connect_callback; | 165 TestCompletionCallback connect_callback; |
| 167 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 166 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 168 NetLog::Source()); | 167 NetLogSource()); |
| 169 connecting_socket.Connect(connect_callback.callback()); | 168 connecting_socket.Connect(connect_callback.callback()); |
| 170 | 169 |
| 171 TestCompletionCallback accept_callback; | 170 TestCompletionCallback accept_callback; |
| 172 std::unique_ptr<StreamSocket> accepted_socket; | 171 std::unique_ptr<StreamSocket> accepted_socket; |
| 173 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); | 172 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); |
| 174 if (result == ERR_IO_PENDING) | 173 if (result == ERR_IO_PENDING) |
| 175 result = accept_callback.WaitForResult(); | 174 result = accept_callback.WaitForResult(); |
| 176 ASSERT_THAT(result, IsOk()); | 175 ASSERT_THAT(result, IsOk()); |
| 177 | 176 |
| 178 ASSERT_TRUE(accepted_socket.get() != NULL); | 177 ASSERT_TRUE(accepted_socket.get() != NULL); |
| 179 | 178 |
| 180 // Both sockets should be on the loopback network interface. | 179 // Both sockets should be on the loopback network interface. |
| 181 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), | 180 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), |
| 182 local_address_.address()); | 181 local_address_.address()); |
| 183 | 182 |
| 184 EXPECT_THAT(connect_callback.WaitForResult(), IsOk()); | 183 EXPECT_THAT(connect_callback.WaitForResult(), IsOk()); |
| 185 } | 184 } |
| 186 | 185 |
| 187 TEST_F(TCPServerSocketTest, AcceptIO) { | 186 TEST_F(TCPServerSocketTest, AcceptIO) { |
| 188 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); | 187 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); |
| 189 | 188 |
| 190 TestCompletionCallback connect_callback; | 189 TestCompletionCallback connect_callback; |
| 191 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 190 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 192 NetLog::Source()); | 191 NetLogSource()); |
| 193 connecting_socket.Connect(connect_callback.callback()); | 192 connecting_socket.Connect(connect_callback.callback()); |
| 194 | 193 |
| 195 TestCompletionCallback accept_callback; | 194 TestCompletionCallback accept_callback; |
| 196 std::unique_ptr<StreamSocket> accepted_socket; | 195 std::unique_ptr<StreamSocket> accepted_socket; |
| 197 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); | 196 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); |
| 198 ASSERT_THAT(accept_callback.GetResult(result), IsOk()); | 197 ASSERT_THAT(accept_callback.GetResult(result), IsOk()); |
| 199 | 198 |
| 200 ASSERT_TRUE(accepted_socket.get() != NULL); | 199 ASSERT_TRUE(accepted_socket.get() != NULL); |
| 201 | 200 |
| 202 // Both sockets should be on the loopback network interface. | 201 // Both sockets should be on the loopback network interface. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 bytes_read += read_result; | 236 bytes_read += read_result; |
| 238 } | 237 } |
| 239 | 238 |
| 240 std::string received_message(buffer.begin(), buffer.end()); | 239 std::string received_message(buffer.begin(), buffer.end()); |
| 241 ASSERT_EQ(message, received_message); | 240 ASSERT_EQ(message, received_message); |
| 242 } | 241 } |
| 243 | 242 |
| 244 } // namespace | 243 } // namespace |
| 245 | 244 |
| 246 } // namespace net | 245 } // namespace net |
| OLD | NEW |