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 |