| 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 <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
| 22 #include "testing/platform_test.h" | 22 #include "testing/platform_test.h" |
| 23 | 23 |
| 24 namespace net { | 24 namespace net { |
| 25 | 25 |
| 26 namespace { | 26 namespace { |
| 27 const int kListenBacklog = 5; | 27 const int kListenBacklog = 5; |
| 28 | 28 |
| 29 class TCPSocketTest : public PlatformTest { | 29 class TCPSocketTest : public PlatformTest { |
| 30 protected: | 30 protected: |
| 31 TCPSocketTest() : socket_(NULL, NetLog::Source()) { | 31 TCPSocketTest() : socket_(NULL, NULL, NetLog::Source()) {} |
| 32 } | |
| 33 | 32 |
| 34 void SetUpListenIPv4() { | 33 void SetUpListenIPv4() { |
| 35 IPEndPoint address; | 34 IPEndPoint address; |
| 36 ParseAddress("127.0.0.1", 0, &address); | 35 ParseAddress("127.0.0.1", 0, &address); |
| 37 | 36 |
| 38 ASSERT_EQ(OK, socket_.Open(ADDRESS_FAMILY_IPV4)); | 37 ASSERT_EQ(OK, socket_.Open(ADDRESS_FAMILY_IPV4)); |
| 39 ASSERT_EQ(OK, socket_.Bind(address)); | 38 ASSERT_EQ(OK, socket_.Bind(address)); |
| 40 ASSERT_EQ(OK, socket_.Listen(kListenBacklog)); | 39 ASSERT_EQ(OK, socket_.Listen(kListenBacklog)); |
| 41 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); | 40 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); |
| 42 } | 41 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 69 | 68 |
| 70 void TestAcceptAsync() { | 69 void TestAcceptAsync() { |
| 71 TestCompletionCallback accept_callback; | 70 TestCompletionCallback accept_callback; |
| 72 scoped_ptr<TCPSocket> accepted_socket; | 71 scoped_ptr<TCPSocket> accepted_socket; |
| 73 IPEndPoint accepted_address; | 72 IPEndPoint accepted_address; |
| 74 ASSERT_EQ(ERR_IO_PENDING, | 73 ASSERT_EQ(ERR_IO_PENDING, |
| 75 socket_.Accept(&accepted_socket, &accepted_address, | 74 socket_.Accept(&accepted_socket, &accepted_address, |
| 76 accept_callback.callback())); | 75 accept_callback.callback())); |
| 77 | 76 |
| 78 TestCompletionCallback connect_callback; | 77 TestCompletionCallback connect_callback; |
| 79 TCPClientSocket connecting_socket(local_address_list(), | 78 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 80 NULL, NetLog::Source()); | 79 NetLog::Source()); |
| 81 connecting_socket.Connect(connect_callback.callback()); | 80 connecting_socket.Connect(connect_callback.callback()); |
| 82 | 81 |
| 83 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 82 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
| 84 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 83 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
| 85 | 84 |
| 86 EXPECT_TRUE(accepted_socket.get()); | 85 EXPECT_TRUE(accepted_socket.get()); |
| 87 | 86 |
| 88 // Both sockets should be on the loopback network interface. | 87 // Both sockets should be on the loopback network interface. |
| 89 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 88 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
| 90 } | 89 } |
| 91 | 90 |
| 92 AddressList local_address_list() const { | 91 AddressList local_address_list() const { |
| 93 return AddressList(local_address_); | 92 return AddressList(local_address_); |
| 94 } | 93 } |
| 95 | 94 |
| 96 TCPSocket socket_; | 95 TCPSocket socket_; |
| 97 IPEndPoint local_address_; | 96 IPEndPoint local_address_; |
| 98 }; | 97 }; |
| 99 | 98 |
| 100 // Test listening and accepting with a socket bound to an IPv4 address. | 99 // Test listening and accepting with a socket bound to an IPv4 address. |
| 101 TEST_F(TCPSocketTest, Accept) { | 100 TEST_F(TCPSocketTest, Accept) { |
| 102 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 101 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
| 103 | 102 |
| 104 TestCompletionCallback connect_callback; | 103 TestCompletionCallback connect_callback; |
| 105 // TODO(yzshen): Switch to use TCPSocket when it supports client socket | 104 // TODO(yzshen): Switch to use TCPSocket when it supports client socket |
| 106 // operations. | 105 // operations. |
| 107 TCPClientSocket connecting_socket(local_address_list(), | 106 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 108 NULL, NetLog::Source()); | 107 NetLog::Source()); |
| 109 connecting_socket.Connect(connect_callback.callback()); | 108 connecting_socket.Connect(connect_callback.callback()); |
| 110 | 109 |
| 111 TestCompletionCallback accept_callback; | 110 TestCompletionCallback accept_callback; |
| 112 scoped_ptr<TCPSocket> accepted_socket; | 111 scoped_ptr<TCPSocket> accepted_socket; |
| 113 IPEndPoint accepted_address; | 112 IPEndPoint accepted_address; |
| 114 int result = socket_.Accept(&accepted_socket, &accepted_address, | 113 int result = socket_.Accept(&accepted_socket, &accepted_address, |
| 115 accept_callback.callback()); | 114 accept_callback.callback()); |
| 116 if (result == ERR_IO_PENDING) | 115 if (result == ERR_IO_PENDING) |
| 117 result = accept_callback.WaitForResult(); | 116 result = accept_callback.WaitForResult(); |
| 118 ASSERT_EQ(OK, result); | 117 ASSERT_EQ(OK, result); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 | 156 |
| 158 TestCompletionCallback accept_callback; | 157 TestCompletionCallback accept_callback; |
| 159 scoped_ptr<TCPSocket> accepted_socket; | 158 scoped_ptr<TCPSocket> accepted_socket; |
| 160 IPEndPoint accepted_address; | 159 IPEndPoint accepted_address; |
| 161 | 160 |
| 162 ASSERT_EQ(ERR_IO_PENDING, | 161 ASSERT_EQ(ERR_IO_PENDING, |
| 163 socket_.Accept(&accepted_socket, &accepted_address, | 162 socket_.Accept(&accepted_socket, &accepted_address, |
| 164 accept_callback.callback())); | 163 accept_callback.callback())); |
| 165 | 164 |
| 166 TestCompletionCallback connect_callback; | 165 TestCompletionCallback connect_callback; |
| 167 TCPClientSocket connecting_socket(local_address_list(), | 166 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 168 NULL, NetLog::Source()); | 167 NetLog::Source()); |
| 169 connecting_socket.Connect(connect_callback.callback()); | 168 connecting_socket.Connect(connect_callback.callback()); |
| 170 | 169 |
| 171 TestCompletionCallback connect_callback2; | 170 TestCompletionCallback connect_callback2; |
| 172 TCPClientSocket connecting_socket2(local_address_list(), | 171 TCPClientSocket connecting_socket2(local_address_list(), NULL, NULL, |
| 173 NULL, NetLog::Source()); | 172 NetLog::Source()); |
| 174 connecting_socket2.Connect(connect_callback2.callback()); | 173 connecting_socket2.Connect(connect_callback2.callback()); |
| 175 | 174 |
| 176 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 175 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
| 177 | 176 |
| 178 TestCompletionCallback accept_callback2; | 177 TestCompletionCallback accept_callback2; |
| 179 scoped_ptr<TCPSocket> accepted_socket2; | 178 scoped_ptr<TCPSocket> accepted_socket2; |
| 180 IPEndPoint accepted_address2; | 179 IPEndPoint accepted_address2; |
| 181 | 180 |
| 182 int result = socket_.Accept(&accepted_socket2, &accepted_address2, | 181 int result = socket_.Accept(&accepted_socket2, &accepted_address2, |
| 183 accept_callback2.callback()); | 182 accept_callback2.callback()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 197 } | 196 } |
| 198 | 197 |
| 199 // Test listening and accepting with a socket bound to an IPv6 address. | 198 // Test listening and accepting with a socket bound to an IPv6 address. |
| 200 TEST_F(TCPSocketTest, AcceptIPv6) { | 199 TEST_F(TCPSocketTest, AcceptIPv6) { |
| 201 bool initialized = false; | 200 bool initialized = false; |
| 202 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv6(&initialized)); | 201 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv6(&initialized)); |
| 203 if (!initialized) | 202 if (!initialized) |
| 204 return; | 203 return; |
| 205 | 204 |
| 206 TestCompletionCallback connect_callback; | 205 TestCompletionCallback connect_callback; |
| 207 TCPClientSocket connecting_socket(local_address_list(), | 206 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 208 NULL, NetLog::Source()); | 207 NetLog::Source()); |
| 209 connecting_socket.Connect(connect_callback.callback()); | 208 connecting_socket.Connect(connect_callback.callback()); |
| 210 | 209 |
| 211 TestCompletionCallback accept_callback; | 210 TestCompletionCallback accept_callback; |
| 212 scoped_ptr<TCPSocket> accepted_socket; | 211 scoped_ptr<TCPSocket> accepted_socket; |
| 213 IPEndPoint accepted_address; | 212 IPEndPoint accepted_address; |
| 214 int result = socket_.Accept(&accepted_socket, &accepted_address, | 213 int result = socket_.Accept(&accepted_socket, &accepted_address, |
| 215 accept_callback.callback()); | 214 accept_callback.callback()); |
| 216 if (result == ERR_IO_PENDING) | 215 if (result == ERR_IO_PENDING) |
| 217 result = accept_callback.WaitForResult(); | 216 result = accept_callback.WaitForResult(); |
| 218 ASSERT_EQ(OK, result); | 217 ASSERT_EQ(OK, result); |
| 219 | 218 |
| 220 EXPECT_TRUE(accepted_socket.get()); | 219 EXPECT_TRUE(accepted_socket.get()); |
| 221 | 220 |
| 222 // Both sockets should be on the loopback network interface. | 221 // Both sockets should be on the loopback network interface. |
| 223 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 222 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
| 224 | 223 |
| 225 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 224 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
| 226 } | 225 } |
| 227 | 226 |
| 228 TEST_F(TCPSocketTest, ReadWrite) { | 227 TEST_F(TCPSocketTest, ReadWrite) { |
| 229 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 228 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
| 230 | 229 |
| 231 TestCompletionCallback connect_callback; | 230 TestCompletionCallback connect_callback; |
| 232 TCPSocket connecting_socket(NULL, NetLog::Source()); | 231 TCPSocket connecting_socket(NULL, NULL, NetLog::Source()); |
| 233 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); | 232 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); |
| 234 ASSERT_EQ(OK, result); | 233 ASSERT_EQ(OK, result); |
| 235 connecting_socket.Connect(local_address_, connect_callback.callback()); | 234 connecting_socket.Connect(local_address_, connect_callback.callback()); |
| 236 | 235 |
| 237 TestCompletionCallback accept_callback; | 236 TestCompletionCallback accept_callback; |
| 238 scoped_ptr<TCPSocket> accepted_socket; | 237 scoped_ptr<TCPSocket> accepted_socket; |
| 239 IPEndPoint accepted_address; | 238 IPEndPoint accepted_address; |
| 240 result = socket_.Accept(&accepted_socket, &accepted_address, | 239 result = socket_.Accept(&accepted_socket, &accepted_address, |
| 241 accept_callback.callback()); | 240 accept_callback.callback()); |
| 242 ASSERT_EQ(OK, accept_callback.GetResult(result)); | 241 ASSERT_EQ(OK, accept_callback.GetResult(result)); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 memmove(&buffer[bytes_read], read_buffer->data(), read_result); | 279 memmove(&buffer[bytes_read], read_buffer->data(), read_result); |
| 281 bytes_read += read_result; | 280 bytes_read += read_result; |
| 282 } | 281 } |
| 283 | 282 |
| 284 std::string received_message(buffer.begin(), buffer.end()); | 283 std::string received_message(buffer.begin(), buffer.end()); |
| 285 ASSERT_EQ(message, received_message); | 284 ASSERT_EQ(message, received_message); |
| 286 } | 285 } |
| 287 | 286 |
| 288 } // namespace | 287 } // namespace |
| 289 } // namespace net | 288 } // namespace net |
| OLD | NEW |