| 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 <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| 11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.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_endpoint.h" | 15 #include "net/base/ip_endpoint.h" |
| 16 #include "net/base/net_errors.h" | 16 #include "net/base/net_errors.h" |
| 17 #include "net/base/test_completion_callback.h" | 17 #include "net/base/test_completion_callback.h" |
| 18 #include "net/socket/tcp_client_socket.h" | 18 #include "net/socket/tcp_client_socket.h" |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 20 #include "testing/platform_test.h" | 20 #include "testing/platform_test.h" |
| 21 | 21 |
| 22 namespace net { | 22 namespace net { |
| 23 | 23 |
| 24 namespace { | 24 namespace { |
| 25 const int kListenBacklog = 5; | 25 const int kListenBacklog = 5; |
| 26 | 26 |
| 27 class TCPServerSocketTest : public PlatformTest { | 27 class TCPServerSocketTest : public PlatformTest { |
| 28 protected: | 28 protected: |
| 29 TCPServerSocketTest() | 29 TCPServerSocketTest() : socket_(NULL, NetLog::Source()) {} |
| 30 : socket_(NULL, NetLog::Source()) { | |
| 31 } | |
| 32 | 30 |
| 33 void SetUpIPv4() { | 31 void SetUpIPv4() { |
| 34 IPEndPoint address; | 32 IPEndPoint address; |
| 35 ParseAddress("127.0.0.1", 0, &address); | 33 ParseAddress("127.0.0.1", 0, &address); |
| 36 ASSERT_EQ(OK, socket_.Listen(address, kListenBacklog)); | 34 ASSERT_EQ(OK, socket_.Listen(address, kListenBacklog)); |
| 37 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); | 35 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); |
| 38 } | 36 } |
| 39 | 37 |
| 40 void SetUpIPv6(bool* success) { | 38 void SetUpIPv6(bool* success) { |
| 41 *success = false; | 39 *success = false; |
| 42 IPEndPoint address; | 40 IPEndPoint address; |
| 43 ParseAddress("::1", 0, &address); | 41 ParseAddress("::1", 0, &address); |
| 44 if (socket_.Listen(address, kListenBacklog) != 0) { | 42 if (socket_.Listen(address, kListenBacklog) != 0) { |
| 45 LOG(ERROR) << "Failed to listen on ::1 - probably because IPv6 is " | 43 LOG(ERROR) << "Failed to listen on ::1 - probably because IPv6 is " |
| 46 "disabled. Skipping the test"; | 44 "disabled. Skipping the test"; |
| 47 return; | 45 return; |
| 48 } | 46 } |
| 49 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); | 47 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); |
| 50 *success = true; | 48 *success = true; |
| 51 } | 49 } |
| 52 | 50 |
| 53 void ParseAddress(std::string ip_str, int port, IPEndPoint* address) { | 51 void ParseAddress(std::string ip_str, int port, IPEndPoint* address) { |
| 54 IPAddressNumber ip_number; | 52 IPAddressNumber ip_number; |
| 55 bool rv = ParseIPLiteralToNumber(ip_str, &ip_number); | 53 bool rv = ParseIPLiteralToNumber(ip_str, &ip_number); |
| 56 if (!rv) | 54 if (!rv) |
| 57 return; | 55 return; |
| 58 *address = IPEndPoint(ip_number, port); | 56 *address = IPEndPoint(ip_number, port); |
| 59 } | 57 } |
| 60 | 58 |
| 61 static IPEndPoint GetPeerAddress(StreamSocket* socket) { | 59 static IPEndPoint GetPeerAddress(StreamSocket* socket) { |
| 62 IPEndPoint address; | 60 IPEndPoint address; |
| 63 EXPECT_EQ(OK, socket->GetPeerAddress(&address)); | 61 EXPECT_EQ(OK, socket->GetPeerAddress(&address)); |
| 64 return address; | 62 return address; |
| 65 } | 63 } |
| 66 | 64 |
| 67 AddressList local_address_list() const { | 65 AddressList local_address_list() const { return AddressList(local_address_); } |
| 68 return AddressList(local_address_); | |
| 69 } | |
| 70 | 66 |
| 71 TCPServerSocket socket_; | 67 TCPServerSocket socket_; |
| 72 IPEndPoint local_address_; | 68 IPEndPoint local_address_; |
| 73 }; | 69 }; |
| 74 | 70 |
| 75 TEST_F(TCPServerSocketTest, Accept) { | 71 TEST_F(TCPServerSocketTest, Accept) { |
| 76 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); | 72 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); |
| 77 | 73 |
| 78 TestCompletionCallback connect_callback; | 74 TestCompletionCallback connect_callback; |
| 79 TCPClientSocket connecting_socket(local_address_list(), | 75 TCPClientSocket connecting_socket( |
| 80 NULL, NetLog::Source()); | 76 local_address_list(), NULL, NetLog::Source()); |
| 81 connecting_socket.Connect(connect_callback.callback()); | 77 connecting_socket.Connect(connect_callback.callback()); |
| 82 | 78 |
| 83 TestCompletionCallback accept_callback; | 79 TestCompletionCallback accept_callback; |
| 84 scoped_ptr<StreamSocket> accepted_socket; | 80 scoped_ptr<StreamSocket> accepted_socket; |
| 85 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); | 81 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); |
| 86 if (result == ERR_IO_PENDING) | 82 if (result == ERR_IO_PENDING) |
| 87 result = accept_callback.WaitForResult(); | 83 result = accept_callback.WaitForResult(); |
| 88 ASSERT_EQ(OK, result); | 84 ASSERT_EQ(OK, result); |
| 89 | 85 |
| 90 ASSERT_TRUE(accepted_socket.get() != NULL); | 86 ASSERT_TRUE(accepted_socket.get() != NULL); |
| 91 | 87 |
| 92 // Both sockets should be on the loopback network interface. | 88 // Both sockets should be on the loopback network interface. |
| 93 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), | 89 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), |
| 94 local_address_.address()); | 90 local_address_.address()); |
| 95 | 91 |
| 96 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 92 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
| 97 } | 93 } |
| 98 | 94 |
| 99 // Test Accept() callback. | 95 // Test Accept() callback. |
| 100 TEST_F(TCPServerSocketTest, AcceptAsync) { | 96 TEST_F(TCPServerSocketTest, AcceptAsync) { |
| 101 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); | 97 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); |
| 102 | 98 |
| 103 TestCompletionCallback accept_callback; | 99 TestCompletionCallback accept_callback; |
| 104 scoped_ptr<StreamSocket> accepted_socket; | 100 scoped_ptr<StreamSocket> accepted_socket; |
| 105 | 101 |
| 106 ASSERT_EQ(ERR_IO_PENDING, | 102 ASSERT_EQ(ERR_IO_PENDING, |
| 107 socket_.Accept(&accepted_socket, accept_callback.callback())); | 103 socket_.Accept(&accepted_socket, accept_callback.callback())); |
| 108 | 104 |
| 109 TestCompletionCallback connect_callback; | 105 TestCompletionCallback connect_callback; |
| 110 TCPClientSocket connecting_socket(local_address_list(), | 106 TCPClientSocket connecting_socket( |
| 111 NULL, NetLog::Source()); | 107 local_address_list(), NULL, NetLog::Source()); |
| 112 connecting_socket.Connect(connect_callback.callback()); | 108 connecting_socket.Connect(connect_callback.callback()); |
| 113 | 109 |
| 114 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 110 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
| 115 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 111 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
| 116 | 112 |
| 117 EXPECT_TRUE(accepted_socket != NULL); | 113 EXPECT_TRUE(accepted_socket != NULL); |
| 118 | 114 |
| 119 // Both sockets should be on the loopback network interface. | 115 // Both sockets should be on the loopback network interface. |
| 120 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), | 116 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), |
| 121 local_address_.address()); | 117 local_address_.address()); |
| 122 } | 118 } |
| 123 | 119 |
| 124 // Accept two connections simultaneously. | 120 // Accept two connections simultaneously. |
| 125 TEST_F(TCPServerSocketTest, Accept2Connections) { | 121 TEST_F(TCPServerSocketTest, Accept2Connections) { |
| 126 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); | 122 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); |
| 127 | 123 |
| 128 TestCompletionCallback accept_callback; | 124 TestCompletionCallback accept_callback; |
| 129 scoped_ptr<StreamSocket> accepted_socket; | 125 scoped_ptr<StreamSocket> accepted_socket; |
| 130 | 126 |
| 131 ASSERT_EQ(ERR_IO_PENDING, | 127 ASSERT_EQ(ERR_IO_PENDING, |
| 132 socket_.Accept(&accepted_socket, accept_callback.callback())); | 128 socket_.Accept(&accepted_socket, accept_callback.callback())); |
| 133 | 129 |
| 134 TestCompletionCallback connect_callback; | 130 TestCompletionCallback connect_callback; |
| 135 TCPClientSocket connecting_socket(local_address_list(), | 131 TCPClientSocket connecting_socket( |
| 136 NULL, NetLog::Source()); | 132 local_address_list(), NULL, NetLog::Source()); |
| 137 connecting_socket.Connect(connect_callback.callback()); | 133 connecting_socket.Connect(connect_callback.callback()); |
| 138 | 134 |
| 139 TestCompletionCallback connect_callback2; | 135 TestCompletionCallback connect_callback2; |
| 140 TCPClientSocket connecting_socket2(local_address_list(), | 136 TCPClientSocket connecting_socket2( |
| 141 NULL, NetLog::Source()); | 137 local_address_list(), NULL, NetLog::Source()); |
| 142 connecting_socket2.Connect(connect_callback2.callback()); | 138 connecting_socket2.Connect(connect_callback2.callback()); |
| 143 | 139 |
| 144 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 140 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
| 145 | 141 |
| 146 TestCompletionCallback accept_callback2; | 142 TestCompletionCallback accept_callback2; |
| 147 scoped_ptr<StreamSocket> accepted_socket2; | 143 scoped_ptr<StreamSocket> accepted_socket2; |
| 148 int result = socket_.Accept(&accepted_socket2, accept_callback2.callback()); | 144 int result = socket_.Accept(&accepted_socket2, accept_callback2.callback()); |
| 149 if (result == ERR_IO_PENDING) | 145 if (result == ERR_IO_PENDING) |
| 150 result = accept_callback2.WaitForResult(); | 146 result = accept_callback2.WaitForResult(); |
| 151 ASSERT_EQ(OK, result); | 147 ASSERT_EQ(OK, result); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 162 local_address_.address()); | 158 local_address_.address()); |
| 163 } | 159 } |
| 164 | 160 |
| 165 TEST_F(TCPServerSocketTest, AcceptIPv6) { | 161 TEST_F(TCPServerSocketTest, AcceptIPv6) { |
| 166 bool initialized = false; | 162 bool initialized = false; |
| 167 ASSERT_NO_FATAL_FAILURE(SetUpIPv6(&initialized)); | 163 ASSERT_NO_FATAL_FAILURE(SetUpIPv6(&initialized)); |
| 168 if (!initialized) | 164 if (!initialized) |
| 169 return; | 165 return; |
| 170 | 166 |
| 171 TestCompletionCallback connect_callback; | 167 TestCompletionCallback connect_callback; |
| 172 TCPClientSocket connecting_socket(local_address_list(), | 168 TCPClientSocket connecting_socket( |
| 173 NULL, NetLog::Source()); | 169 local_address_list(), NULL, NetLog::Source()); |
| 174 connecting_socket.Connect(connect_callback.callback()); | 170 connecting_socket.Connect(connect_callback.callback()); |
| 175 | 171 |
| 176 TestCompletionCallback accept_callback; | 172 TestCompletionCallback accept_callback; |
| 177 scoped_ptr<StreamSocket> accepted_socket; | 173 scoped_ptr<StreamSocket> accepted_socket; |
| 178 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); | 174 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); |
| 179 if (result == ERR_IO_PENDING) | 175 if (result == ERR_IO_PENDING) |
| 180 result = accept_callback.WaitForResult(); | 176 result = accept_callback.WaitForResult(); |
| 181 ASSERT_EQ(OK, result); | 177 ASSERT_EQ(OK, result); |
| 182 | 178 |
| 183 ASSERT_TRUE(accepted_socket.get() != NULL); | 179 ASSERT_TRUE(accepted_socket.get() != NULL); |
| 184 | 180 |
| 185 // Both sockets should be on the loopback network interface. | 181 // Both sockets should be on the loopback network interface. |
| 186 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), | 182 EXPECT_EQ(GetPeerAddress(accepted_socket.get()).address(), |
| 187 local_address_.address()); | 183 local_address_.address()); |
| 188 | 184 |
| 189 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 185 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
| 190 } | 186 } |
| 191 | 187 |
| 192 TEST_F(TCPServerSocketTest, AcceptIO) { | 188 TEST_F(TCPServerSocketTest, AcceptIO) { |
| 193 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); | 189 ASSERT_NO_FATAL_FAILURE(SetUpIPv4()); |
| 194 | 190 |
| 195 TestCompletionCallback connect_callback; | 191 TestCompletionCallback connect_callback; |
| 196 TCPClientSocket connecting_socket(local_address_list(), | 192 TCPClientSocket connecting_socket( |
| 197 NULL, NetLog::Source()); | 193 local_address_list(), NULL, NetLog::Source()); |
| 198 connecting_socket.Connect(connect_callback.callback()); | 194 connecting_socket.Connect(connect_callback.callback()); |
| 199 | 195 |
| 200 TestCompletionCallback accept_callback; | 196 TestCompletionCallback accept_callback; |
| 201 scoped_ptr<StreamSocket> accepted_socket; | 197 scoped_ptr<StreamSocket> accepted_socket; |
| 202 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); | 198 int result = socket_.Accept(&accepted_socket, accept_callback.callback()); |
| 203 ASSERT_EQ(OK, accept_callback.GetResult(result)); | 199 ASSERT_EQ(OK, accept_callback.GetResult(result)); |
| 204 | 200 |
| 205 ASSERT_TRUE(accepted_socket.get() != NULL); | 201 ASSERT_TRUE(accepted_socket.get() != NULL); |
| 206 | 202 |
| 207 // Both sockets should be on the loopback network interface. | 203 // Both sockets should be on the loopback network interface. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 bytes_read += read_result; | 238 bytes_read += read_result; |
| 243 } | 239 } |
| 244 | 240 |
| 245 std::string received_message(buffer.begin(), buffer.end()); | 241 std::string received_message(buffer.begin(), buffer.end()); |
| 246 ASSERT_EQ(message, received_message); | 242 ASSERT_EQ(message, received_message); |
| 247 } | 243 } |
| 248 | 244 |
| 249 } // namespace | 245 } // namespace |
| 250 | 246 |
| 251 } // namespace net | 247 } // namespace net |
| OLD | NEW |