| 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 11 matching lines...) Expand all Loading... |
| 22 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 23 #include "testing/platform_test.h" | 23 #include "testing/platform_test.h" |
| 24 | 24 |
| 25 namespace net { | 25 namespace net { |
| 26 | 26 |
| 27 namespace { | 27 namespace { |
| 28 const int kListenBacklog = 5; | 28 const int kListenBacklog = 5; |
| 29 | 29 |
| 30 class TCPSocketTest : public PlatformTest { | 30 class TCPSocketTest : public PlatformTest { |
| 31 protected: | 31 protected: |
| 32 TCPSocketTest() : socket_(NULL, NetLog::Source()) { | 32 TCPSocketTest() : socket_(NULL, NULL, NetLog::Source()) {} |
| 33 } | |
| 34 | 33 |
| 35 void SetUpListenIPv4() { | 34 void SetUpListenIPv4() { |
| 36 ASSERT_EQ(OK, socket_.Open(ADDRESS_FAMILY_IPV4)); | 35 ASSERT_EQ(OK, socket_.Open(ADDRESS_FAMILY_IPV4)); |
| 37 ASSERT_EQ(OK, socket_.Bind(IPEndPoint(IPAddress::IPv4Localhost(), 0))); | 36 ASSERT_EQ(OK, socket_.Bind(IPEndPoint(IPAddress::IPv4Localhost(), 0))); |
| 38 ASSERT_EQ(OK, socket_.Listen(kListenBacklog)); | 37 ASSERT_EQ(OK, socket_.Listen(kListenBacklog)); |
| 39 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); | 38 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); |
| 40 } | 39 } |
| 41 | 40 |
| 42 void SetUpListenIPv6(bool* success) { | 41 void SetUpListenIPv6(bool* success) { |
| 43 *success = false; | 42 *success = false; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 55 | 54 |
| 56 void TestAcceptAsync() { | 55 void TestAcceptAsync() { |
| 57 TestCompletionCallback accept_callback; | 56 TestCompletionCallback accept_callback; |
| 58 scoped_ptr<TCPSocket> accepted_socket; | 57 scoped_ptr<TCPSocket> accepted_socket; |
| 59 IPEndPoint accepted_address; | 58 IPEndPoint accepted_address; |
| 60 ASSERT_EQ(ERR_IO_PENDING, | 59 ASSERT_EQ(ERR_IO_PENDING, |
| 61 socket_.Accept(&accepted_socket, &accepted_address, | 60 socket_.Accept(&accepted_socket, &accepted_address, |
| 62 accept_callback.callback())); | 61 accept_callback.callback())); |
| 63 | 62 |
| 64 TestCompletionCallback connect_callback; | 63 TestCompletionCallback connect_callback; |
| 65 TCPClientSocket connecting_socket(local_address_list(), | 64 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 66 NULL, NetLog::Source()); | 65 NetLog::Source()); |
| 67 connecting_socket.Connect(connect_callback.callback()); | 66 connecting_socket.Connect(connect_callback.callback()); |
| 68 | 67 |
| 69 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 68 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
| 70 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 69 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
| 71 | 70 |
| 72 EXPECT_TRUE(accepted_socket.get()); | 71 EXPECT_TRUE(accepted_socket.get()); |
| 73 | 72 |
| 74 // Both sockets should be on the loopback network interface. | 73 // Both sockets should be on the loopback network interface. |
| 75 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 74 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
| 76 } | 75 } |
| 77 | 76 |
| 78 AddressList local_address_list() const { | 77 AddressList local_address_list() const { |
| 79 return AddressList(local_address_); | 78 return AddressList(local_address_); |
| 80 } | 79 } |
| 81 | 80 |
| 82 TCPSocket socket_; | 81 TCPSocket socket_; |
| 83 IPEndPoint local_address_; | 82 IPEndPoint local_address_; |
| 84 }; | 83 }; |
| 85 | 84 |
| 86 // Test listening and accepting with a socket bound to an IPv4 address. | 85 // Test listening and accepting with a socket bound to an IPv4 address. |
| 87 TEST_F(TCPSocketTest, Accept) { | 86 TEST_F(TCPSocketTest, Accept) { |
| 88 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 87 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
| 89 | 88 |
| 90 TestCompletionCallback connect_callback; | 89 TestCompletionCallback connect_callback; |
| 91 // TODO(yzshen): Switch to use TCPSocket when it supports client socket | 90 // TODO(yzshen): Switch to use TCPSocket when it supports client socket |
| 92 // operations. | 91 // operations. |
| 93 TCPClientSocket connecting_socket(local_address_list(), | 92 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 94 NULL, NetLog::Source()); | 93 NetLog::Source()); |
| 95 connecting_socket.Connect(connect_callback.callback()); | 94 connecting_socket.Connect(connect_callback.callback()); |
| 96 | 95 |
| 97 TestCompletionCallback accept_callback; | 96 TestCompletionCallback accept_callback; |
| 98 scoped_ptr<TCPSocket> accepted_socket; | 97 scoped_ptr<TCPSocket> accepted_socket; |
| 99 IPEndPoint accepted_address; | 98 IPEndPoint accepted_address; |
| 100 int result = socket_.Accept(&accepted_socket, &accepted_address, | 99 int result = socket_.Accept(&accepted_socket, &accepted_address, |
| 101 accept_callback.callback()); | 100 accept_callback.callback()); |
| 102 if (result == ERR_IO_PENDING) | 101 if (result == ERR_IO_PENDING) |
| 103 result = accept_callback.WaitForResult(); | 102 result = accept_callback.WaitForResult(); |
| 104 ASSERT_EQ(OK, result); | 103 ASSERT_EQ(OK, result); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 | 141 |
| 143 TestCompletionCallback accept_callback; | 142 TestCompletionCallback accept_callback; |
| 144 scoped_ptr<TCPSocket> accepted_socket; | 143 scoped_ptr<TCPSocket> accepted_socket; |
| 145 IPEndPoint accepted_address; | 144 IPEndPoint accepted_address; |
| 146 | 145 |
| 147 ASSERT_EQ(ERR_IO_PENDING, | 146 ASSERT_EQ(ERR_IO_PENDING, |
| 148 socket_.Accept(&accepted_socket, &accepted_address, | 147 socket_.Accept(&accepted_socket, &accepted_address, |
| 149 accept_callback.callback())); | 148 accept_callback.callback())); |
| 150 | 149 |
| 151 TestCompletionCallback connect_callback; | 150 TestCompletionCallback connect_callback; |
| 152 TCPClientSocket connecting_socket(local_address_list(), | 151 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 153 NULL, NetLog::Source()); | 152 NetLog::Source()); |
| 154 connecting_socket.Connect(connect_callback.callback()); | 153 connecting_socket.Connect(connect_callback.callback()); |
| 155 | 154 |
| 156 TestCompletionCallback connect_callback2; | 155 TestCompletionCallback connect_callback2; |
| 157 TCPClientSocket connecting_socket2(local_address_list(), | 156 TCPClientSocket connecting_socket2(local_address_list(), NULL, NULL, |
| 158 NULL, NetLog::Source()); | 157 NetLog::Source()); |
| 159 connecting_socket2.Connect(connect_callback2.callback()); | 158 connecting_socket2.Connect(connect_callback2.callback()); |
| 160 | 159 |
| 161 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 160 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
| 162 | 161 |
| 163 TestCompletionCallback accept_callback2; | 162 TestCompletionCallback accept_callback2; |
| 164 scoped_ptr<TCPSocket> accepted_socket2; | 163 scoped_ptr<TCPSocket> accepted_socket2; |
| 165 IPEndPoint accepted_address2; | 164 IPEndPoint accepted_address2; |
| 166 | 165 |
| 167 int result = socket_.Accept(&accepted_socket2, &accepted_address2, | 166 int result = socket_.Accept(&accepted_socket2, &accepted_address2, |
| 168 accept_callback2.callback()); | 167 accept_callback2.callback()); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 182 } | 181 } |
| 183 | 182 |
| 184 // Test listening and accepting with a socket bound to an IPv6 address. | 183 // Test listening and accepting with a socket bound to an IPv6 address. |
| 185 TEST_F(TCPSocketTest, AcceptIPv6) { | 184 TEST_F(TCPSocketTest, AcceptIPv6) { |
| 186 bool initialized = false; | 185 bool initialized = false; |
| 187 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv6(&initialized)); | 186 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv6(&initialized)); |
| 188 if (!initialized) | 187 if (!initialized) |
| 189 return; | 188 return; |
| 190 | 189 |
| 191 TestCompletionCallback connect_callback; | 190 TestCompletionCallback connect_callback; |
| 192 TCPClientSocket connecting_socket(local_address_list(), | 191 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
| 193 NULL, NetLog::Source()); | 192 NetLog::Source()); |
| 194 connecting_socket.Connect(connect_callback.callback()); | 193 connecting_socket.Connect(connect_callback.callback()); |
| 195 | 194 |
| 196 TestCompletionCallback accept_callback; | 195 TestCompletionCallback accept_callback; |
| 197 scoped_ptr<TCPSocket> accepted_socket; | 196 scoped_ptr<TCPSocket> accepted_socket; |
| 198 IPEndPoint accepted_address; | 197 IPEndPoint accepted_address; |
| 199 int result = socket_.Accept(&accepted_socket, &accepted_address, | 198 int result = socket_.Accept(&accepted_socket, &accepted_address, |
| 200 accept_callback.callback()); | 199 accept_callback.callback()); |
| 201 if (result == ERR_IO_PENDING) | 200 if (result == ERR_IO_PENDING) |
| 202 result = accept_callback.WaitForResult(); | 201 result = accept_callback.WaitForResult(); |
| 203 ASSERT_EQ(OK, result); | 202 ASSERT_EQ(OK, result); |
| 204 | 203 |
| 205 EXPECT_TRUE(accepted_socket.get()); | 204 EXPECT_TRUE(accepted_socket.get()); |
| 206 | 205 |
| 207 // Both sockets should be on the loopback network interface. | 206 // Both sockets should be on the loopback network interface. |
| 208 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 207 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
| 209 | 208 |
| 210 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 209 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
| 211 } | 210 } |
| 212 | 211 |
| 213 TEST_F(TCPSocketTest, ReadWrite) { | 212 TEST_F(TCPSocketTest, ReadWrite) { |
| 214 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 213 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
| 215 | 214 |
| 216 TestCompletionCallback connect_callback; | 215 TestCompletionCallback connect_callback; |
| 217 TCPSocket connecting_socket(NULL, NetLog::Source()); | 216 TCPSocket connecting_socket(NULL, NULL, NetLog::Source()); |
| 218 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); | 217 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); |
| 219 ASSERT_EQ(OK, result); | 218 ASSERT_EQ(OK, result); |
| 220 connecting_socket.Connect(local_address_, connect_callback.callback()); | 219 connecting_socket.Connect(local_address_, connect_callback.callback()); |
| 221 | 220 |
| 222 TestCompletionCallback accept_callback; | 221 TestCompletionCallback accept_callback; |
| 223 scoped_ptr<TCPSocket> accepted_socket; | 222 scoped_ptr<TCPSocket> accepted_socket; |
| 224 IPEndPoint accepted_address; | 223 IPEndPoint accepted_address; |
| 225 result = socket_.Accept(&accepted_socket, &accepted_address, | 224 result = socket_.Accept(&accepted_socket, &accepted_address, |
| 226 accept_callback.callback()); | 225 accept_callback.callback()); |
| 227 ASSERT_EQ(OK, accept_callback.GetResult(result)); | 226 ASSERT_EQ(OK, accept_callback.GetResult(result)); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 memmove(&buffer[bytes_read], read_buffer->data(), read_result); | 264 memmove(&buffer[bytes_read], read_buffer->data(), read_result); |
| 266 bytes_read += read_result; | 265 bytes_read += read_result; |
| 267 } | 266 } |
| 268 | 267 |
| 269 std::string received_message(buffer.begin(), buffer.end()); | 268 std::string received_message(buffer.begin(), buffer.end()); |
| 270 ASSERT_EQ(message, received_message); | 269 ASSERT_EQ(message, received_message); |
| 271 } | 270 } |
| 272 | 271 |
| 273 } // namespace | 272 } // namespace |
| 274 } // namespace net | 273 } // namespace net |
| OLD | NEW |