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 <stddef.h> | 7 #include <stddef.h> |
8 #include <string.h> | 8 #include <string.h> |
9 | 9 |
| 10 #include <memory> |
10 #include <string> | 11 #include <string> |
11 #include <vector> | 12 #include <vector> |
12 | 13 |
13 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
14 #include "base/memory/scoped_ptr.h" | |
15 #include "base/test/simple_test_tick_clock.h" | 15 #include "base/test/simple_test_tick_clock.h" |
16 #include "base/time/time.h" | 16 #include "base/time/time.h" |
17 #include "net/base/address_list.h" | 17 #include "net/base/address_list.h" |
18 #include "net/base/io_buffer.h" | 18 #include "net/base/io_buffer.h" |
19 #include "net/base/ip_endpoint.h" | 19 #include "net/base/ip_endpoint.h" |
20 #include "net/base/ip_endpoint.h" | 20 #include "net/base/ip_endpoint.h" |
21 #include "net/base/net_errors.h" | 21 #include "net/base/net_errors.h" |
22 #include "net/base/sockaddr_storage.h" | 22 #include "net/base/sockaddr_storage.h" |
23 #include "net/base/socket_performance_watcher.h" | 23 #include "net/base/socket_performance_watcher.h" |
24 #include "net/base/test_completion_callback.h" | 24 #include "net/base/test_completion_callback.h" |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 LOG(ERROR) << "Failed to listen on ::1 - probably because IPv6 is " | 82 LOG(ERROR) << "Failed to listen on ::1 - probably because IPv6 is " |
83 "disabled. Skipping the test"; | 83 "disabled. Skipping the test"; |
84 return; | 84 return; |
85 } | 85 } |
86 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); | 86 ASSERT_EQ(OK, socket_.GetLocalAddress(&local_address_)); |
87 *success = true; | 87 *success = true; |
88 } | 88 } |
89 | 89 |
90 void TestAcceptAsync() { | 90 void TestAcceptAsync() { |
91 TestCompletionCallback accept_callback; | 91 TestCompletionCallback accept_callback; |
92 scoped_ptr<TCPSocket> accepted_socket; | 92 std::unique_ptr<TCPSocket> accepted_socket; |
93 IPEndPoint accepted_address; | 93 IPEndPoint accepted_address; |
94 ASSERT_EQ(ERR_IO_PENDING, | 94 ASSERT_EQ(ERR_IO_PENDING, |
95 socket_.Accept(&accepted_socket, &accepted_address, | 95 socket_.Accept(&accepted_socket, &accepted_address, |
96 accept_callback.callback())); | 96 accept_callback.callback())); |
97 | 97 |
98 TestCompletionCallback connect_callback; | 98 TestCompletionCallback connect_callback; |
99 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 99 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
100 NetLog::Source()); | 100 NetLog::Source()); |
101 connecting_socket.Connect(connect_callback.callback()); | 101 connecting_socket.Connect(connect_callback.callback()); |
102 | 102 |
(...skipping 17 matching lines...) Expand all Loading... |
120 // is the expected number of RTT notifications received by the SPW. | 120 // is the expected number of RTT notifications received by the SPW. |
121 // This test works by writing |num_messages| to the socket. A different | 121 // This test works by writing |num_messages| to the socket. A different |
122 // socket (with a SPW attached to it) reads the messages. | 122 // socket (with a SPW attached to it) reads the messages. |
123 void TestSPWNotifications(const base::TimeDelta& advance_ticks, | 123 void TestSPWNotifications(const base::TimeDelta& advance_ticks, |
124 bool should_notify_updated_rtt, | 124 bool should_notify_updated_rtt, |
125 size_t num_messages, | 125 size_t num_messages, |
126 size_t expect_connection_changed_count, | 126 size_t expect_connection_changed_count, |
127 size_t expect_rtt_notification_count) { | 127 size_t expect_rtt_notification_count) { |
128 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 128 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
129 | 129 |
130 scoped_ptr<base::SimpleTestTickClock> tick_clock( | 130 std::unique_ptr<base::SimpleTestTickClock> tick_clock( |
131 new base::SimpleTestTickClock()); | 131 new base::SimpleTestTickClock()); |
132 base::SimpleTestTickClock* tick_clock_ptr = tick_clock.get(); | 132 base::SimpleTestTickClock* tick_clock_ptr = tick_clock.get(); |
133 tick_clock_ptr->SetNowTicks(base::TimeTicks::Now()); | 133 tick_clock_ptr->SetNowTicks(base::TimeTicks::Now()); |
134 | 134 |
135 TestCompletionCallback connect_callback; | 135 TestCompletionCallback connect_callback; |
136 | 136 |
137 scoped_ptr<TestSocketPerformanceWatcher> watcher( | 137 std::unique_ptr<TestSocketPerformanceWatcher> watcher( |
138 new TestSocketPerformanceWatcher(should_notify_updated_rtt)); | 138 new TestSocketPerformanceWatcher(should_notify_updated_rtt)); |
139 TestSocketPerformanceWatcher* watcher_ptr = watcher.get(); | 139 TestSocketPerformanceWatcher* watcher_ptr = watcher.get(); |
140 | 140 |
141 TCPSocket connecting_socket(std::move(watcher), NULL, NetLog::Source()); | 141 TCPSocket connecting_socket(std::move(watcher), NULL, NetLog::Source()); |
142 connecting_socket.SetTickClockForTesting(std::move(tick_clock)); | 142 connecting_socket.SetTickClockForTesting(std::move(tick_clock)); |
143 | 143 |
144 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); | 144 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); |
145 ASSERT_EQ(OK, result); | 145 ASSERT_EQ(OK, result); |
146 connecting_socket.Connect(local_address_, connect_callback.callback()); | 146 connecting_socket.Connect(local_address_, connect_callback.callback()); |
147 | 147 |
148 TestCompletionCallback accept_callback; | 148 TestCompletionCallback accept_callback; |
149 scoped_ptr<TCPSocket> accepted_socket; | 149 std::unique_ptr<TCPSocket> accepted_socket; |
150 IPEndPoint accepted_address; | 150 IPEndPoint accepted_address; |
151 result = socket_.Accept(&accepted_socket, &accepted_address, | 151 result = socket_.Accept(&accepted_socket, &accepted_address, |
152 accept_callback.callback()); | 152 accept_callback.callback()); |
153 ASSERT_EQ(OK, accept_callback.GetResult(result)); | 153 ASSERT_EQ(OK, accept_callback.GetResult(result)); |
154 | 154 |
155 ASSERT_TRUE(accepted_socket.get()); | 155 ASSERT_TRUE(accepted_socket.get()); |
156 | 156 |
157 // Both sockets should be on the loopback network interface. | 157 // Both sockets should be on the loopback network interface. |
158 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 158 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
159 | 159 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 203 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
204 | 204 |
205 TestCompletionCallback connect_callback; | 205 TestCompletionCallback connect_callback; |
206 // TODO(yzshen): Switch to use TCPSocket when it supports client socket | 206 // TODO(yzshen): Switch to use TCPSocket when it supports client socket |
207 // operations. | 207 // operations. |
208 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 208 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
209 NetLog::Source()); | 209 NetLog::Source()); |
210 connecting_socket.Connect(connect_callback.callback()); | 210 connecting_socket.Connect(connect_callback.callback()); |
211 | 211 |
212 TestCompletionCallback accept_callback; | 212 TestCompletionCallback accept_callback; |
213 scoped_ptr<TCPSocket> accepted_socket; | 213 std::unique_ptr<TCPSocket> accepted_socket; |
214 IPEndPoint accepted_address; | 214 IPEndPoint accepted_address; |
215 int result = socket_.Accept(&accepted_socket, &accepted_address, | 215 int result = socket_.Accept(&accepted_socket, &accepted_address, |
216 accept_callback.callback()); | 216 accept_callback.callback()); |
217 if (result == ERR_IO_PENDING) | 217 if (result == ERR_IO_PENDING) |
218 result = accept_callback.WaitForResult(); | 218 result = accept_callback.WaitForResult(); |
219 ASSERT_EQ(OK, result); | 219 ASSERT_EQ(OK, result); |
220 | 220 |
221 EXPECT_TRUE(accepted_socket.get()); | 221 EXPECT_TRUE(accepted_socket.get()); |
222 | 222 |
223 // Both sockets should be on the loopback network interface. | 223 // Both sockets should be on the loopback network interface. |
(...skipping 25 matching lines...) Expand all Loading... |
249 | 249 |
250 TestAcceptAsync(); | 250 TestAcceptAsync(); |
251 } | 251 } |
252 #endif | 252 #endif |
253 | 253 |
254 // Accept two connections simultaneously. | 254 // Accept two connections simultaneously. |
255 TEST_F(TCPSocketTest, Accept2Connections) { | 255 TEST_F(TCPSocketTest, Accept2Connections) { |
256 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 256 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
257 | 257 |
258 TestCompletionCallback accept_callback; | 258 TestCompletionCallback accept_callback; |
259 scoped_ptr<TCPSocket> accepted_socket; | 259 std::unique_ptr<TCPSocket> accepted_socket; |
260 IPEndPoint accepted_address; | 260 IPEndPoint accepted_address; |
261 | 261 |
262 ASSERT_EQ(ERR_IO_PENDING, | 262 ASSERT_EQ(ERR_IO_PENDING, |
263 socket_.Accept(&accepted_socket, &accepted_address, | 263 socket_.Accept(&accepted_socket, &accepted_address, |
264 accept_callback.callback())); | 264 accept_callback.callback())); |
265 | 265 |
266 TestCompletionCallback connect_callback; | 266 TestCompletionCallback connect_callback; |
267 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 267 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
268 NetLog::Source()); | 268 NetLog::Source()); |
269 connecting_socket.Connect(connect_callback.callback()); | 269 connecting_socket.Connect(connect_callback.callback()); |
270 | 270 |
271 TestCompletionCallback connect_callback2; | 271 TestCompletionCallback connect_callback2; |
272 TCPClientSocket connecting_socket2(local_address_list(), NULL, NULL, | 272 TCPClientSocket connecting_socket2(local_address_list(), NULL, NULL, |
273 NetLog::Source()); | 273 NetLog::Source()); |
274 connecting_socket2.Connect(connect_callback2.callback()); | 274 connecting_socket2.Connect(connect_callback2.callback()); |
275 | 275 |
276 EXPECT_EQ(OK, accept_callback.WaitForResult()); | 276 EXPECT_EQ(OK, accept_callback.WaitForResult()); |
277 | 277 |
278 TestCompletionCallback accept_callback2; | 278 TestCompletionCallback accept_callback2; |
279 scoped_ptr<TCPSocket> accepted_socket2; | 279 std::unique_ptr<TCPSocket> accepted_socket2; |
280 IPEndPoint accepted_address2; | 280 IPEndPoint accepted_address2; |
281 | 281 |
282 int result = socket_.Accept(&accepted_socket2, &accepted_address2, | 282 int result = socket_.Accept(&accepted_socket2, &accepted_address2, |
283 accept_callback2.callback()); | 283 accept_callback2.callback()); |
284 if (result == ERR_IO_PENDING) | 284 if (result == ERR_IO_PENDING) |
285 result = accept_callback2.WaitForResult(); | 285 result = accept_callback2.WaitForResult(); |
286 ASSERT_EQ(OK, result); | 286 ASSERT_EQ(OK, result); |
287 | 287 |
288 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 288 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
289 EXPECT_EQ(OK, connect_callback2.WaitForResult()); | 289 EXPECT_EQ(OK, connect_callback2.WaitForResult()); |
(...skipping 12 matching lines...) Expand all Loading... |
302 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv6(&initialized)); | 302 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv6(&initialized)); |
303 if (!initialized) | 303 if (!initialized) |
304 return; | 304 return; |
305 | 305 |
306 TestCompletionCallback connect_callback; | 306 TestCompletionCallback connect_callback; |
307 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, | 307 TCPClientSocket connecting_socket(local_address_list(), NULL, NULL, |
308 NetLog::Source()); | 308 NetLog::Source()); |
309 connecting_socket.Connect(connect_callback.callback()); | 309 connecting_socket.Connect(connect_callback.callback()); |
310 | 310 |
311 TestCompletionCallback accept_callback; | 311 TestCompletionCallback accept_callback; |
312 scoped_ptr<TCPSocket> accepted_socket; | 312 std::unique_ptr<TCPSocket> accepted_socket; |
313 IPEndPoint accepted_address; | 313 IPEndPoint accepted_address; |
314 int result = socket_.Accept(&accepted_socket, &accepted_address, | 314 int result = socket_.Accept(&accepted_socket, &accepted_address, |
315 accept_callback.callback()); | 315 accept_callback.callback()); |
316 if (result == ERR_IO_PENDING) | 316 if (result == ERR_IO_PENDING) |
317 result = accept_callback.WaitForResult(); | 317 result = accept_callback.WaitForResult(); |
318 ASSERT_EQ(OK, result); | 318 ASSERT_EQ(OK, result); |
319 | 319 |
320 EXPECT_TRUE(accepted_socket.get()); | 320 EXPECT_TRUE(accepted_socket.get()); |
321 | 321 |
322 // Both sockets should be on the loopback network interface. | 322 // Both sockets should be on the loopback network interface. |
323 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 323 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
324 | 324 |
325 EXPECT_EQ(OK, connect_callback.WaitForResult()); | 325 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
326 } | 326 } |
327 | 327 |
328 TEST_F(TCPSocketTest, ReadWrite) { | 328 TEST_F(TCPSocketTest, ReadWrite) { |
329 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); | 329 ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4()); |
330 | 330 |
331 TestCompletionCallback connect_callback; | 331 TestCompletionCallback connect_callback; |
332 TCPSocket connecting_socket(NULL, NULL, NetLog::Source()); | 332 TCPSocket connecting_socket(NULL, NULL, NetLog::Source()); |
333 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); | 333 int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4); |
334 ASSERT_EQ(OK, result); | 334 ASSERT_EQ(OK, result); |
335 connecting_socket.Connect(local_address_, connect_callback.callback()); | 335 connecting_socket.Connect(local_address_, connect_callback.callback()); |
336 | 336 |
337 TestCompletionCallback accept_callback; | 337 TestCompletionCallback accept_callback; |
338 scoped_ptr<TCPSocket> accepted_socket; | 338 std::unique_ptr<TCPSocket> accepted_socket; |
339 IPEndPoint accepted_address; | 339 IPEndPoint accepted_address; |
340 result = socket_.Accept(&accepted_socket, &accepted_address, | 340 result = socket_.Accept(&accepted_socket, &accepted_address, |
341 accept_callback.callback()); | 341 accept_callback.callback()); |
342 ASSERT_EQ(OK, accept_callback.GetResult(result)); | 342 ASSERT_EQ(OK, accept_callback.GetResult(result)); |
343 | 343 |
344 ASSERT_TRUE(accepted_socket.get()); | 344 ASSERT_TRUE(accepted_socket.get()); |
345 | 345 |
346 // Both sockets should be on the loopback network interface. | 346 // Both sockets should be on the loopback network interface. |
347 EXPECT_EQ(accepted_address.address(), local_address_.address()); | 347 EXPECT_EQ(accepted_address.address(), local_address_.address()); |
348 | 348 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 // additional notification should be received for each message read since this | 405 // additional notification should be received for each message read since this |
406 // test advances clock by 2 seconds (which is longer than the minimum interval | 406 // test advances clock by 2 seconds (which is longer than the minimum interval |
407 // between consecutive notifications) before every read. | 407 // between consecutive notifications) before every read. |
408 TEST_F(TCPSocketTest, SPWAdvance) { | 408 TEST_F(TCPSocketTest, SPWAdvance) { |
409 TestSPWNotifications(base::TimeDelta::FromSeconds(2), true, 2u, 0u, 3u); | 409 TestSPWNotifications(base::TimeDelta::FromSeconds(2), true, 2u, 0u, 3u); |
410 } | 410 } |
411 #endif // defined(TCP_INFO) || defined(OS_LINUX) | 411 #endif // defined(TCP_INFO) || defined(OS_LINUX) |
412 | 412 |
413 } // namespace | 413 } // namespace |
414 } // namespace net | 414 } // namespace net |
OLD | NEW |