OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2007 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2007 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
| 11 #include <memory> |
| 12 |
11 #include "webrtc/base/socket_unittest.h" | 13 #include "webrtc/base/socket_unittest.h" |
12 | 14 |
13 #include "webrtc/base/arraysize.h" | 15 #include "webrtc/base/arraysize.h" |
14 #include "webrtc/base/buffer.h" | 16 #include "webrtc/base/buffer.h" |
15 #include "webrtc/base/asyncudpsocket.h" | 17 #include "webrtc/base/asyncudpsocket.h" |
16 #include "webrtc/base/gunit.h" | 18 #include "webrtc/base/gunit.h" |
17 #include "webrtc/base/nethelpers.h" | 19 #include "webrtc/base/nethelpers.h" |
18 #include "webrtc/base/socketserver.h" | 20 #include "webrtc/base/socketserver.h" |
19 #include "webrtc/base/testclient.h" | 21 #include "webrtc/base/testclient.h" |
20 #include "webrtc/base/testutils.h" | 22 #include "webrtc/base/testutils.h" |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 #else | 193 #else |
192 return address.family() == AF_UNSPEC; | 194 return address.family() == AF_UNSPEC; |
193 #endif | 195 #endif |
194 } | 196 } |
195 | 197 |
196 void SocketTest::ConnectInternal(const IPAddress& loopback) { | 198 void SocketTest::ConnectInternal(const IPAddress& loopback) { |
197 testing::StreamSink sink; | 199 testing::StreamSink sink; |
198 SocketAddress accept_addr; | 200 SocketAddress accept_addr; |
199 | 201 |
200 // Create client. | 202 // Create client. |
201 scoped_ptr<AsyncSocket> client(ss_->CreateAsyncSocket(loopback.family(), | 203 std::unique_ptr<AsyncSocket> client( |
202 SOCK_STREAM)); | 204 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
203 sink.Monitor(client.get()); | 205 sink.Monitor(client.get()); |
204 EXPECT_EQ(AsyncSocket::CS_CLOSED, client->GetState()); | 206 EXPECT_EQ(AsyncSocket::CS_CLOSED, client->GetState()); |
205 EXPECT_PRED1(IsUnspecOrEmptyIP, client->GetLocalAddress().ipaddr()); | 207 EXPECT_PRED1(IsUnspecOrEmptyIP, client->GetLocalAddress().ipaddr()); |
206 | 208 |
207 // Create server and listen. | 209 // Create server and listen. |
208 scoped_ptr<AsyncSocket> server( | 210 std::unique_ptr<AsyncSocket> server( |
209 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 211 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
210 sink.Monitor(server.get()); | 212 sink.Monitor(server.get()); |
211 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 213 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); |
212 EXPECT_EQ(0, server->Listen(5)); | 214 EXPECT_EQ(0, server->Listen(5)); |
213 EXPECT_EQ(AsyncSocket::CS_CONNECTING, server->GetState()); | 215 EXPECT_EQ(AsyncSocket::CS_CONNECTING, server->GetState()); |
214 | 216 |
215 // Ensure no pending server connections, since we haven't done anything yet. | 217 // Ensure no pending server connections, since we haven't done anything yet. |
216 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); | 218 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); |
217 EXPECT_TRUE(NULL == server->Accept(&accept_addr)); | 219 EXPECT_TRUE(NULL == server->Accept(&accept_addr)); |
218 EXPECT_TRUE(accept_addr.IsNil()); | 220 EXPECT_TRUE(accept_addr.IsNil()); |
219 | 221 |
220 // Attempt connect to listening socket. | 222 // Attempt connect to listening socket. |
221 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 223 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
222 EXPECT_FALSE(client->GetLocalAddress().IsNil()); | 224 EXPECT_FALSE(client->GetLocalAddress().IsNil()); |
223 EXPECT_NE(server->GetLocalAddress(), client->GetLocalAddress()); | 225 EXPECT_NE(server->GetLocalAddress(), client->GetLocalAddress()); |
224 | 226 |
225 // Client is connecting, outcome not yet determined. | 227 // Client is connecting, outcome not yet determined. |
226 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState()); | 228 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState()); |
227 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_OPEN)); | 229 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_OPEN)); |
228 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); | 230 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); |
229 | 231 |
230 // Server has pending connection, accept it. | 232 // Server has pending connection, accept it. |
231 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); | 233 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); |
232 scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); | 234 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); |
233 ASSERT_TRUE(accepted); | 235 ASSERT_TRUE(accepted); |
234 EXPECT_FALSE(accept_addr.IsNil()); | 236 EXPECT_FALSE(accept_addr.IsNil()); |
235 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); | 237 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); |
236 | 238 |
237 // Connected from server perspective, check the addresses are correct. | 239 // Connected from server perspective, check the addresses are correct. |
238 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); | 240 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); |
239 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress()); | 241 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress()); |
240 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress()); | 242 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress()); |
241 | 243 |
242 // Connected from client perspective, check the addresses are correct. | 244 // Connected from client perspective, check the addresses are correct. |
243 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); | 245 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); |
244 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); | 246 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); |
245 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); | 247 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); |
246 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); | 248 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); |
247 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); | 249 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); |
248 } | 250 } |
249 | 251 |
250 void SocketTest::ConnectWithDnsLookupInternal(const IPAddress& loopback, | 252 void SocketTest::ConnectWithDnsLookupInternal(const IPAddress& loopback, |
251 const std::string& host) { | 253 const std::string& host) { |
252 testing::StreamSink sink; | 254 testing::StreamSink sink; |
253 SocketAddress accept_addr; | 255 SocketAddress accept_addr; |
254 | 256 |
255 // Create client. | 257 // Create client. |
256 scoped_ptr<AsyncSocket> client( | 258 std::unique_ptr<AsyncSocket> client( |
257 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 259 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
258 sink.Monitor(client.get()); | 260 sink.Monitor(client.get()); |
259 | 261 |
260 // Create server and listen. | 262 // Create server and listen. |
261 scoped_ptr<AsyncSocket> server( | 263 std::unique_ptr<AsyncSocket> server( |
262 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 264 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
263 sink.Monitor(server.get()); | 265 sink.Monitor(server.get()); |
264 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 266 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); |
265 EXPECT_EQ(0, server->Listen(5)); | 267 EXPECT_EQ(0, server->Listen(5)); |
266 | 268 |
267 // Attempt connect to listening socket. | 269 // Attempt connect to listening socket. |
268 SocketAddress dns_addr(server->GetLocalAddress()); | 270 SocketAddress dns_addr(server->GetLocalAddress()); |
269 dns_addr.SetIP(host); | 271 dns_addr.SetIP(host); |
270 EXPECT_EQ(0, client->Connect(dns_addr)); | 272 EXPECT_EQ(0, client->Connect(dns_addr)); |
271 // TODO: Bind when doing DNS lookup. | 273 // TODO: Bind when doing DNS lookup. |
272 //EXPECT_NE(kEmptyAddr, client->GetLocalAddress()); // Implicit Bind | 274 //EXPECT_NE(kEmptyAddr, client->GetLocalAddress()); // Implicit Bind |
273 | 275 |
274 // Client is connecting, outcome not yet determined. | 276 // Client is connecting, outcome not yet determined. |
275 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState()); | 277 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState()); |
276 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_OPEN)); | 278 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_OPEN)); |
277 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); | 279 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); |
278 | 280 |
279 // Server has pending connection, accept it. | 281 // Server has pending connection, accept it. |
280 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); | 282 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); |
281 scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); | 283 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); |
282 ASSERT_TRUE(accepted); | 284 ASSERT_TRUE(accepted); |
283 EXPECT_FALSE(accept_addr.IsNil()); | 285 EXPECT_FALSE(accept_addr.IsNil()); |
284 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); | 286 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); |
285 | 287 |
286 // Connected from server perspective, check the addresses are correct. | 288 // Connected from server perspective, check the addresses are correct. |
287 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); | 289 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); |
288 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress()); | 290 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress()); |
289 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress()); | 291 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress()); |
290 | 292 |
291 // Connected from client perspective, check the addresses are correct. | 293 // Connected from client perspective, check the addresses are correct. |
292 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); | 294 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); |
293 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); | 295 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); |
294 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); | 296 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); |
295 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); | 297 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); |
296 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); | 298 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); |
297 } | 299 } |
298 | 300 |
299 void SocketTest::ConnectFailInternal(const IPAddress& loopback) { | 301 void SocketTest::ConnectFailInternal(const IPAddress& loopback) { |
300 testing::StreamSink sink; | 302 testing::StreamSink sink; |
301 SocketAddress accept_addr; | 303 SocketAddress accept_addr; |
302 | 304 |
303 // Create client. | 305 // Create client. |
304 scoped_ptr<AsyncSocket> client( | 306 std::unique_ptr<AsyncSocket> client( |
305 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 307 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
306 sink.Monitor(client.get()); | 308 sink.Monitor(client.get()); |
307 | 309 |
308 // Create server, but don't listen yet. | 310 // Create server, but don't listen yet. |
309 scoped_ptr<AsyncSocket> server( | 311 std::unique_ptr<AsyncSocket> server( |
310 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 312 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
311 sink.Monitor(server.get()); | 313 sink.Monitor(server.get()); |
312 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 314 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); |
313 | 315 |
314 // Attempt connect to a non-existent socket. | 316 // Attempt connect to a non-existent socket. |
315 // We don't connect to the server socket created above, since on | 317 // We don't connect to the server socket created above, since on |
316 // MacOS it takes about 75 seconds to get back an error! | 318 // MacOS it takes about 75 seconds to get back an error! |
317 SocketAddress bogus_addr(loopback, 65535); | 319 SocketAddress bogus_addr(loopback, 65535); |
318 EXPECT_EQ(0, client->Connect(bogus_addr)); | 320 EXPECT_EQ(0, client->Connect(bogus_addr)); |
319 | 321 |
320 // Wait for connection to fail (ECONNREFUSED). | 322 // Wait for connection to fail (ECONNREFUSED). |
321 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout); | 323 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout); |
322 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_OPEN)); | 324 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_OPEN)); |
323 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); | 325 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); |
324 EXPECT_TRUE(client->GetRemoteAddress().IsNil()); | 326 EXPECT_TRUE(client->GetRemoteAddress().IsNil()); |
325 | 327 |
326 // Should be no pending server connections. | 328 // Should be no pending server connections. |
327 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); | 329 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); |
328 EXPECT_TRUE(NULL == server->Accept(&accept_addr)); | 330 EXPECT_TRUE(NULL == server->Accept(&accept_addr)); |
329 EXPECT_EQ(IPAddress(), accept_addr.ipaddr()); | 331 EXPECT_EQ(IPAddress(), accept_addr.ipaddr()); |
330 } | 332 } |
331 | 333 |
332 void SocketTest::ConnectWithDnsLookupFailInternal(const IPAddress& loopback) { | 334 void SocketTest::ConnectWithDnsLookupFailInternal(const IPAddress& loopback) { |
333 testing::StreamSink sink; | 335 testing::StreamSink sink; |
334 SocketAddress accept_addr; | 336 SocketAddress accept_addr; |
335 | 337 |
336 // Create client. | 338 // Create client. |
337 scoped_ptr<AsyncSocket> client( | 339 std::unique_ptr<AsyncSocket> client( |
338 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 340 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
339 sink.Monitor(client.get()); | 341 sink.Monitor(client.get()); |
340 | 342 |
341 // Create server, but don't listen yet. | 343 // Create server, but don't listen yet. |
342 scoped_ptr<AsyncSocket> server( | 344 std::unique_ptr<AsyncSocket> server( |
343 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 345 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
344 sink.Monitor(server.get()); | 346 sink.Monitor(server.get()); |
345 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 347 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); |
346 | 348 |
347 // Attempt connect to a non-existent host. | 349 // Attempt connect to a non-existent host. |
348 // We don't connect to the server socket created above, since on | 350 // We don't connect to the server socket created above, since on |
349 // MacOS it takes about 75 seconds to get back an error! | 351 // MacOS it takes about 75 seconds to get back an error! |
350 SocketAddress bogus_dns_addr("not-a-real-hostname", 65535); | 352 SocketAddress bogus_dns_addr("not-a-real-hostname", 65535); |
351 EXPECT_EQ(0, client->Connect(bogus_dns_addr)); | 353 EXPECT_EQ(0, client->Connect(bogus_dns_addr)); |
352 | 354 |
(...skipping 12 matching lines...) Expand all Loading... |
365 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); | 367 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); |
366 EXPECT_TRUE(client->GetRemoteAddress().IsNil()); | 368 EXPECT_TRUE(client->GetRemoteAddress().IsNil()); |
367 // Should be no pending server connections. | 369 // Should be no pending server connections. |
368 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); | 370 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); |
369 EXPECT_TRUE(NULL == server->Accept(&accept_addr)); | 371 EXPECT_TRUE(NULL == server->Accept(&accept_addr)); |
370 EXPECT_TRUE(accept_addr.IsNil()); | 372 EXPECT_TRUE(accept_addr.IsNil()); |
371 } | 373 } |
372 | 374 |
373 void SocketTest::ConnectWithClosedSocketInternal(const IPAddress& loopback) { | 375 void SocketTest::ConnectWithClosedSocketInternal(const IPAddress& loopback) { |
374 // Create server and listen. | 376 // Create server and listen. |
375 scoped_ptr<AsyncSocket> server( | 377 std::unique_ptr<AsyncSocket> server( |
376 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 378 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
377 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 379 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); |
378 EXPECT_EQ(0, server->Listen(5)); | 380 EXPECT_EQ(0, server->Listen(5)); |
379 | 381 |
380 // Create a client and put in to CS_CLOSED state. | 382 // Create a client and put in to CS_CLOSED state. |
381 scoped_ptr<AsyncSocket> client( | 383 std::unique_ptr<AsyncSocket> client( |
382 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 384 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
383 EXPECT_EQ(0, client->Close()); | 385 EXPECT_EQ(0, client->Close()); |
384 EXPECT_EQ(AsyncSocket::CS_CLOSED, client->GetState()); | 386 EXPECT_EQ(AsyncSocket::CS_CLOSED, client->GetState()); |
385 | 387 |
386 // Connect() should reinitialize the socket, and put it in to CS_CONNECTING. | 388 // Connect() should reinitialize the socket, and put it in to CS_CONNECTING. |
387 EXPECT_EQ(0, client->Connect(SocketAddress(server->GetLocalAddress()))); | 389 EXPECT_EQ(0, client->Connect(SocketAddress(server->GetLocalAddress()))); |
388 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState()); | 390 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState()); |
389 } | 391 } |
390 | 392 |
391 void SocketTest::ConnectWhileNotClosedInternal(const IPAddress& loopback) { | 393 void SocketTest::ConnectWhileNotClosedInternal(const IPAddress& loopback) { |
392 // Create server and listen. | 394 // Create server and listen. |
393 testing::StreamSink sink; | 395 testing::StreamSink sink; |
394 scoped_ptr<AsyncSocket> server( | 396 std::unique_ptr<AsyncSocket> server( |
395 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 397 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
396 sink.Monitor(server.get()); | 398 sink.Monitor(server.get()); |
397 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 399 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); |
398 EXPECT_EQ(0, server->Listen(5)); | 400 EXPECT_EQ(0, server->Listen(5)); |
399 // Create client, connect. | 401 // Create client, connect. |
400 scoped_ptr<AsyncSocket> client( | 402 std::unique_ptr<AsyncSocket> client( |
401 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 403 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
402 EXPECT_EQ(0, client->Connect(SocketAddress(server->GetLocalAddress()))); | 404 EXPECT_EQ(0, client->Connect(SocketAddress(server->GetLocalAddress()))); |
403 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState()); | 405 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState()); |
404 // Try to connect again. Should fail, but not interfere with original attempt. | 406 // Try to connect again. Should fail, but not interfere with original attempt. |
405 EXPECT_EQ(SOCKET_ERROR, | 407 EXPECT_EQ(SOCKET_ERROR, |
406 client->Connect(SocketAddress(server->GetLocalAddress()))); | 408 client->Connect(SocketAddress(server->GetLocalAddress()))); |
407 | 409 |
408 // Accept the original connection. | 410 // Accept the original connection. |
409 SocketAddress accept_addr; | 411 SocketAddress accept_addr; |
410 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); | 412 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); |
411 scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); | 413 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); |
412 ASSERT_TRUE(accepted); | 414 ASSERT_TRUE(accepted); |
413 EXPECT_FALSE(accept_addr.IsNil()); | 415 EXPECT_FALSE(accept_addr.IsNil()); |
414 | 416 |
415 // Check the states and addresses. | 417 // Check the states and addresses. |
416 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); | 418 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); |
417 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress()); | 419 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress()); |
418 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress()); | 420 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress()); |
419 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); | 421 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); |
420 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); | 422 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); |
421 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); | 423 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); |
422 | 424 |
423 // Try to connect again, to an unresolved hostname. | 425 // Try to connect again, to an unresolved hostname. |
424 // Shouldn't break anything. | 426 // Shouldn't break anything. |
425 EXPECT_EQ(SOCKET_ERROR, | 427 EXPECT_EQ(SOCKET_ERROR, |
426 client->Connect(SocketAddress("localhost", | 428 client->Connect(SocketAddress("localhost", |
427 server->GetLocalAddress().port()))); | 429 server->GetLocalAddress().port()))); |
428 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); | 430 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); |
429 EXPECT_EQ(AsyncSocket::CS_CONNECTED, client->GetState()); | 431 EXPECT_EQ(AsyncSocket::CS_CONNECTED, client->GetState()); |
430 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); | 432 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); |
431 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); | 433 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); |
432 } | 434 } |
433 | 435 |
434 void SocketTest::ServerCloseDuringConnectInternal(const IPAddress& loopback) { | 436 void SocketTest::ServerCloseDuringConnectInternal(const IPAddress& loopback) { |
435 testing::StreamSink sink; | 437 testing::StreamSink sink; |
436 | 438 |
437 // Create client. | 439 // Create client. |
438 scoped_ptr<AsyncSocket> client( | 440 std::unique_ptr<AsyncSocket> client( |
439 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 441 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
440 sink.Monitor(client.get()); | 442 sink.Monitor(client.get()); |
441 | 443 |
442 // Create server and listen. | 444 // Create server and listen. |
443 scoped_ptr<AsyncSocket> server( | 445 std::unique_ptr<AsyncSocket> server( |
444 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 446 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
445 sink.Monitor(server.get()); | 447 sink.Monitor(server.get()); |
446 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 448 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); |
447 EXPECT_EQ(0, server->Listen(5)); | 449 EXPECT_EQ(0, server->Listen(5)); |
448 | 450 |
449 // Attempt connect to listening socket. | 451 // Attempt connect to listening socket. |
450 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 452 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
451 | 453 |
452 // Close down the server while the socket is in the accept queue. | 454 // Close down the server while the socket is in the accept queue. |
453 EXPECT_TRUE_WAIT(sink.Check(server.get(), testing::SSE_READ), kTimeout); | 455 EXPECT_TRUE_WAIT(sink.Check(server.get(), testing::SSE_READ), kTimeout); |
454 server->Close(); | 456 server->Close(); |
455 | 457 |
456 // This should fail the connection for the client. Clean up. | 458 // This should fail the connection for the client. Clean up. |
457 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout); | 459 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout); |
458 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); | 460 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); |
459 client->Close(); | 461 client->Close(); |
460 } | 462 } |
461 | 463 |
462 void SocketTest::ClientCloseDuringConnectInternal(const IPAddress& loopback) { | 464 void SocketTest::ClientCloseDuringConnectInternal(const IPAddress& loopback) { |
463 testing::StreamSink sink; | 465 testing::StreamSink sink; |
464 SocketAddress accept_addr; | 466 SocketAddress accept_addr; |
465 | 467 |
466 // Create client. | 468 // Create client. |
467 scoped_ptr<AsyncSocket> client( | 469 std::unique_ptr<AsyncSocket> client( |
468 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 470 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
469 sink.Monitor(client.get()); | 471 sink.Monitor(client.get()); |
470 | 472 |
471 // Create server and listen. | 473 // Create server and listen. |
472 scoped_ptr<AsyncSocket> server( | 474 std::unique_ptr<AsyncSocket> server( |
473 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 475 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
474 sink.Monitor(server.get()); | 476 sink.Monitor(server.get()); |
475 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 477 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); |
476 EXPECT_EQ(0, server->Listen(5)); | 478 EXPECT_EQ(0, server->Listen(5)); |
477 | 479 |
478 // Attempt connect to listening socket. | 480 // Attempt connect to listening socket. |
479 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 481 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
480 | 482 |
481 // Close down the client while the socket is in the accept queue. | 483 // Close down the client while the socket is in the accept queue. |
482 EXPECT_TRUE_WAIT(sink.Check(server.get(), testing::SSE_READ), kTimeout); | 484 EXPECT_TRUE_WAIT(sink.Check(server.get(), testing::SSE_READ), kTimeout); |
483 client->Close(); | 485 client->Close(); |
484 | 486 |
485 // The connection should still be able to be accepted. | 487 // The connection should still be able to be accepted. |
486 scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); | 488 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); |
487 ASSERT_TRUE(accepted); | 489 ASSERT_TRUE(accepted); |
488 sink.Monitor(accepted.get()); | 490 sink.Monitor(accepted.get()); |
489 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); | 491 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); |
490 | 492 |
491 // The accepted socket should then close (possibly with err, timing-related) | 493 // The accepted socket should then close (possibly with err, timing-related) |
492 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, accepted->GetState(), kTimeout); | 494 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, accepted->GetState(), kTimeout); |
493 EXPECT_TRUE(sink.Check(accepted.get(), testing::SSE_CLOSE) || | 495 EXPECT_TRUE(sink.Check(accepted.get(), testing::SSE_CLOSE) || |
494 sink.Check(accepted.get(), testing::SSE_ERROR)); | 496 sink.Check(accepted.get(), testing::SSE_ERROR)); |
495 | 497 |
496 // The client should not get a close event. | 498 // The client should not get a close event. |
497 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); | 499 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); |
498 } | 500 } |
499 | 501 |
500 void SocketTest::ServerCloseInternal(const IPAddress& loopback) { | 502 void SocketTest::ServerCloseInternal(const IPAddress& loopback) { |
501 testing::StreamSink sink; | 503 testing::StreamSink sink; |
502 SocketAddress accept_addr; | 504 SocketAddress accept_addr; |
503 | 505 |
504 // Create client. | 506 // Create client. |
505 scoped_ptr<AsyncSocket> client( | 507 std::unique_ptr<AsyncSocket> client( |
506 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 508 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
507 sink.Monitor(client.get()); | 509 sink.Monitor(client.get()); |
508 | 510 |
509 // Create server and listen. | 511 // Create server and listen. |
510 scoped_ptr<AsyncSocket> server( | 512 std::unique_ptr<AsyncSocket> server( |
511 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 513 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
512 sink.Monitor(server.get()); | 514 sink.Monitor(server.get()); |
513 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 515 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); |
514 EXPECT_EQ(0, server->Listen(5)); | 516 EXPECT_EQ(0, server->Listen(5)); |
515 | 517 |
516 // Attempt connection. | 518 // Attempt connection. |
517 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 519 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
518 | 520 |
519 // Accept connection. | 521 // Accept connection. |
520 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); | 522 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); |
521 scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); | 523 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); |
522 ASSERT_TRUE(accepted); | 524 ASSERT_TRUE(accepted); |
523 sink.Monitor(accepted.get()); | 525 sink.Monitor(accepted.get()); |
524 | 526 |
525 // Both sides are now connected. | 527 // Both sides are now connected. |
526 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); | 528 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); |
527 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); | 529 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); |
528 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); | 530 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); |
529 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); | 531 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); |
530 | 532 |
531 // Send data to the client, and then close the connection. | 533 // Send data to the client, and then close the connection. |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 // for the socket's signal. | 571 // for the socket's signal. |
570 } | 572 } |
571 }; | 573 }; |
572 | 574 |
573 void SocketTest::CloseInClosedCallbackInternal(const IPAddress& loopback) { | 575 void SocketTest::CloseInClosedCallbackInternal(const IPAddress& loopback) { |
574 testing::StreamSink sink; | 576 testing::StreamSink sink; |
575 SocketCloser closer; | 577 SocketCloser closer; |
576 SocketAddress accept_addr; | 578 SocketAddress accept_addr; |
577 | 579 |
578 // Create client. | 580 // Create client. |
579 scoped_ptr<AsyncSocket> client( | 581 std::unique_ptr<AsyncSocket> client( |
580 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 582 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
581 sink.Monitor(client.get()); | 583 sink.Monitor(client.get()); |
582 client->SignalCloseEvent.connect(&closer, &SocketCloser::OnClose); | 584 client->SignalCloseEvent.connect(&closer, &SocketCloser::OnClose); |
583 | 585 |
584 // Create server and listen. | 586 // Create server and listen. |
585 scoped_ptr<AsyncSocket> server( | 587 std::unique_ptr<AsyncSocket> server( |
586 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 588 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
587 sink.Monitor(server.get()); | 589 sink.Monitor(server.get()); |
588 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 590 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); |
589 EXPECT_EQ(0, server->Listen(5)); | 591 EXPECT_EQ(0, server->Listen(5)); |
590 | 592 |
591 // Attempt connection. | 593 // Attempt connection. |
592 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 594 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
593 | 595 |
594 // Accept connection. | 596 // Accept connection. |
595 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); | 597 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); |
596 scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); | 598 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); |
597 ASSERT_TRUE(accepted); | 599 ASSERT_TRUE(accepted); |
598 sink.Monitor(accepted.get()); | 600 sink.Monitor(accepted.get()); |
599 | 601 |
600 // Both sides are now connected. | 602 // Both sides are now connected. |
601 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); | 603 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); |
602 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); | 604 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); |
603 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); | 605 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); |
604 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); | 606 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); |
605 | 607 |
606 // Send data to the client, and then close the connection. | 608 // Send data to the client, and then close the connection. |
(...skipping 16 matching lines...) Expand all Loading... |
623 void OnMessage(Message* msg) { | 625 void OnMessage(Message* msg) { |
624 Thread::Current()->SleepMs(500); | 626 Thread::Current()->SleepMs(500); |
625 } | 627 } |
626 }; | 628 }; |
627 | 629 |
628 void SocketTest::SocketServerWaitInternal(const IPAddress& loopback) { | 630 void SocketTest::SocketServerWaitInternal(const IPAddress& loopback) { |
629 testing::StreamSink sink; | 631 testing::StreamSink sink; |
630 SocketAddress accept_addr; | 632 SocketAddress accept_addr; |
631 | 633 |
632 // Create & connect server and client sockets. | 634 // Create & connect server and client sockets. |
633 scoped_ptr<AsyncSocket> client( | 635 std::unique_ptr<AsyncSocket> client( |
634 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 636 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
635 scoped_ptr<AsyncSocket> server( | 637 std::unique_ptr<AsyncSocket> server( |
636 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 638 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
637 sink.Monitor(client.get()); | 639 sink.Monitor(client.get()); |
638 sink.Monitor(server.get()); | 640 sink.Monitor(server.get()); |
639 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 641 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); |
640 EXPECT_EQ(0, server->Listen(5)); | 642 EXPECT_EQ(0, server->Listen(5)); |
641 | 643 |
642 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 644 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
643 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); | 645 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); |
644 | 646 |
645 scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); | 647 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); |
646 ASSERT_TRUE(accepted); | 648 ASSERT_TRUE(accepted); |
647 sink.Monitor(accepted.get()); | 649 sink.Monitor(accepted.get()); |
648 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); | 650 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); |
649 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress()); | 651 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress()); |
650 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress()); | 652 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress()); |
651 | 653 |
652 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); | 654 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); |
653 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); | 655 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); |
654 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); | 656 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); |
655 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); | 657 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); |
656 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); | 658 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); |
657 | 659 |
658 // Do an i/o operation, triggering an eventual callback. | 660 // Do an i/o operation, triggering an eventual callback. |
659 EXPECT_FALSE(sink.Check(accepted.get(), testing::SSE_READ)); | 661 EXPECT_FALSE(sink.Check(accepted.get(), testing::SSE_READ)); |
660 char buf[1024] = {0}; | 662 char buf[1024] = {0}; |
661 | 663 |
662 EXPECT_EQ(1024, client->Send(buf, 1024)); | 664 EXPECT_EQ(1024, client->Send(buf, 1024)); |
663 EXPECT_FALSE(sink.Check(accepted.get(), testing::SSE_READ)); | 665 EXPECT_FALSE(sink.Check(accepted.get(), testing::SSE_READ)); |
664 | 666 |
665 // Shouldn't signal when blocked in a thread Send, where process_io is false. | 667 // Shouldn't signal when blocked in a thread Send, where process_io is false. |
666 scoped_ptr<Thread> thread(new Thread()); | 668 std::unique_ptr<Thread> thread(new Thread()); |
667 thread->Start(); | 669 thread->Start(); |
668 Sleeper sleeper; | 670 Sleeper sleeper; |
669 TypedMessageData<AsyncSocket*> data(client.get()); | 671 TypedMessageData<AsyncSocket*> data(client.get()); |
670 thread->Send(&sleeper, 0, &data); | 672 thread->Send(&sleeper, 0, &data); |
671 EXPECT_FALSE(sink.Check(accepted.get(), testing::SSE_READ)); | 673 EXPECT_FALSE(sink.Check(accepted.get(), testing::SSE_READ)); |
672 | 674 |
673 // But should signal when process_io is true. | 675 // But should signal when process_io is true. |
674 EXPECT_TRUE_WAIT((sink.Check(accepted.get(), testing::SSE_READ)), kTimeout); | 676 EXPECT_TRUE_WAIT((sink.Check(accepted.get(), testing::SSE_READ)), kTimeout); |
675 EXPECT_LT(0, accepted->Recv(buf, 1024)); | 677 EXPECT_LT(0, accepted->Recv(buf, 1024)); |
676 } | 678 } |
677 | 679 |
678 void SocketTest::TcpInternal(const IPAddress& loopback, size_t data_size, | 680 void SocketTest::TcpInternal(const IPAddress& loopback, size_t data_size, |
679 ssize_t max_send_size) { | 681 ssize_t max_send_size) { |
680 testing::StreamSink sink; | 682 testing::StreamSink sink; |
681 SocketAddress accept_addr; | 683 SocketAddress accept_addr; |
682 | 684 |
683 // Create receiving client. | 685 // Create receiving client. |
684 scoped_ptr<AsyncSocket> receiver( | 686 std::unique_ptr<AsyncSocket> receiver( |
685 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 687 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
686 sink.Monitor(receiver.get()); | 688 sink.Monitor(receiver.get()); |
687 | 689 |
688 // Create server and listen. | 690 // Create server and listen. |
689 scoped_ptr<AsyncSocket> server( | 691 std::unique_ptr<AsyncSocket> server( |
690 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 692 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
691 sink.Monitor(server.get()); | 693 sink.Monitor(server.get()); |
692 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 694 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); |
693 EXPECT_EQ(0, server->Listen(5)); | 695 EXPECT_EQ(0, server->Listen(5)); |
694 | 696 |
695 // Attempt connection. | 697 // Attempt connection. |
696 EXPECT_EQ(0, receiver->Connect(server->GetLocalAddress())); | 698 EXPECT_EQ(0, receiver->Connect(server->GetLocalAddress())); |
697 | 699 |
698 // Accept connection which will be used for sending. | 700 // Accept connection which will be used for sending. |
699 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); | 701 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); |
700 scoped_ptr<AsyncSocket> sender(server->Accept(&accept_addr)); | 702 std::unique_ptr<AsyncSocket> sender(server->Accept(&accept_addr)); |
701 ASSERT_TRUE(sender); | 703 ASSERT_TRUE(sender); |
702 sink.Monitor(sender.get()); | 704 sink.Monitor(sender.get()); |
703 | 705 |
704 // Both sides are now connected. | 706 // Both sides are now connected. |
705 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, receiver->GetState(), kTimeout); | 707 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, receiver->GetState(), kTimeout); |
706 EXPECT_TRUE(sink.Check(receiver.get(), testing::SSE_OPEN)); | 708 EXPECT_TRUE(sink.Check(receiver.get(), testing::SSE_OPEN)); |
707 EXPECT_EQ(receiver->GetRemoteAddress(), sender->GetLocalAddress()); | 709 EXPECT_EQ(receiver->GetRemoteAddress(), sender->GetLocalAddress()); |
708 EXPECT_EQ(sender->GetRemoteAddress(), receiver->GetLocalAddress()); | 710 EXPECT_EQ(sender->GetRemoteAddress(), receiver->GetLocalAddress()); |
709 | 711 |
710 // Create test data. | 712 // Create test data. |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
802 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, receiver->GetState(), kTimeout); | 804 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, receiver->GetState(), kTimeout); |
803 EXPECT_TRUE(sink.Check(receiver.get(), testing::SSE_CLOSE)); | 805 EXPECT_TRUE(sink.Check(receiver.get(), testing::SSE_CLOSE)); |
804 receiver->Close(); | 806 receiver->Close(); |
805 } | 807 } |
806 | 808 |
807 void SocketTest::SingleFlowControlCallbackInternal(const IPAddress& loopback) { | 809 void SocketTest::SingleFlowControlCallbackInternal(const IPAddress& loopback) { |
808 testing::StreamSink sink; | 810 testing::StreamSink sink; |
809 SocketAddress accept_addr; | 811 SocketAddress accept_addr; |
810 | 812 |
811 // Create client. | 813 // Create client. |
812 scoped_ptr<AsyncSocket> client( | 814 std::unique_ptr<AsyncSocket> client( |
813 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 815 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
814 sink.Monitor(client.get()); | 816 sink.Monitor(client.get()); |
815 | 817 |
816 // Create server and listen. | 818 // Create server and listen. |
817 scoped_ptr<AsyncSocket> server( | 819 std::unique_ptr<AsyncSocket> server( |
818 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); | 820 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); |
819 sink.Monitor(server.get()); | 821 sink.Monitor(server.get()); |
820 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); | 822 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); |
821 EXPECT_EQ(0, server->Listen(5)); | 823 EXPECT_EQ(0, server->Listen(5)); |
822 | 824 |
823 // Attempt connection. | 825 // Attempt connection. |
824 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); | 826 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); |
825 | 827 |
826 // Accept connection. | 828 // Accept connection. |
827 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); | 829 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); |
828 scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); | 830 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); |
829 ASSERT_TRUE(accepted); | 831 ASSERT_TRUE(accepted); |
830 sink.Monitor(accepted.get()); | 832 sink.Monitor(accepted.get()); |
831 | 833 |
832 // Both sides are now connected. | 834 // Both sides are now connected. |
833 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); | 835 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); |
834 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); | 836 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); |
835 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); | 837 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); |
836 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); | 838 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); |
837 | 839 |
838 // Expect a writable callback from the connect. | 840 // Expect a writable callback from the connect. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
880 EXPECT_EQ(AsyncSocket::CS_CLOSED, socket->GetState()); | 882 EXPECT_EQ(AsyncSocket::CS_CLOSED, socket->GetState()); |
881 EXPECT_EQ(0, socket->Bind(SocketAddress(loopback, 0))); | 883 EXPECT_EQ(0, socket->Bind(SocketAddress(loopback, 0))); |
882 SocketAddress addr1 = socket->GetLocalAddress(); | 884 SocketAddress addr1 = socket->GetLocalAddress(); |
883 EXPECT_EQ(0, socket->Connect(addr1)); | 885 EXPECT_EQ(0, socket->Connect(addr1)); |
884 EXPECT_EQ(AsyncSocket::CS_CONNECTED, socket->GetState()); | 886 EXPECT_EQ(AsyncSocket::CS_CONNECTED, socket->GetState()); |
885 socket->Close(); | 887 socket->Close(); |
886 EXPECT_EQ(AsyncSocket::CS_CLOSED, socket->GetState()); | 888 EXPECT_EQ(AsyncSocket::CS_CLOSED, socket->GetState()); |
887 delete socket; | 889 delete socket; |
888 | 890 |
889 // Test send/receive behavior. | 891 // Test send/receive behavior. |
890 scoped_ptr<TestClient> client1( | 892 std::unique_ptr<TestClient> client1( |
891 new TestClient(AsyncUDPSocket::Create(ss_, addr1))); | 893 new TestClient(AsyncUDPSocket::Create(ss_, addr1))); |
892 scoped_ptr<TestClient> client2( | 894 std::unique_ptr<TestClient> client2( |
893 new TestClient(AsyncUDPSocket::Create(ss_, empty))); | 895 new TestClient(AsyncUDPSocket::Create(ss_, empty))); |
894 | 896 |
895 SocketAddress addr2; | 897 SocketAddress addr2; |
896 EXPECT_EQ(3, client2->SendTo("foo", 3, addr1)); | 898 EXPECT_EQ(3, client2->SendTo("foo", 3, addr1)); |
897 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &addr2)); | 899 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &addr2)); |
898 | 900 |
899 SocketAddress addr3; | 901 SocketAddress addr3; |
900 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, addr2)); | 902 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, addr2)); |
901 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &addr3)); | 903 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &addr3)); |
902 EXPECT_EQ(addr3, addr1); | 904 EXPECT_EQ(addr3, addr1); |
(...skipping 18 matching lines...) Expand all Loading... |
921 void SocketTest::UdpReadyToSend(const IPAddress& loopback) { | 923 void SocketTest::UdpReadyToSend(const IPAddress& loopback) { |
922 SocketAddress empty = EmptySocketAddressWithFamily(loopback.family()); | 924 SocketAddress empty = EmptySocketAddressWithFamily(loopback.family()); |
923 // RFC 5737 - The blocks 192.0.2.0/24 (TEST-NET-1) ... are provided for use in | 925 // RFC 5737 - The blocks 192.0.2.0/24 (TEST-NET-1) ... are provided for use in |
924 // documentation. | 926 // documentation. |
925 // RFC 3849 - 2001:DB8::/32 as a documentation-only prefix. | 927 // RFC 3849 - 2001:DB8::/32 as a documentation-only prefix. |
926 std::string dest = (loopback.family() == AF_INET6) ? | 928 std::string dest = (loopback.family() == AF_INET6) ? |
927 "2001:db8::1" : "192.0.2.0"; | 929 "2001:db8::1" : "192.0.2.0"; |
928 SocketAddress test_addr(dest, 2345); | 930 SocketAddress test_addr(dest, 2345); |
929 | 931 |
930 // Test send | 932 // Test send |
931 scoped_ptr<TestClient> client( | 933 std::unique_ptr<TestClient> client( |
932 new TestClient(AsyncUDPSocket::Create(ss_, empty))); | 934 new TestClient(AsyncUDPSocket::Create(ss_, empty))); |
933 int test_packet_size = 1200; | 935 int test_packet_size = 1200; |
934 rtc::scoped_ptr<char[]> test_packet(new char[test_packet_size]); | 936 std::unique_ptr<char[]> test_packet(new char[test_packet_size]); |
935 // Init the test packet just to avoid memcheck warning. | 937 // Init the test packet just to avoid memcheck warning. |
936 memset(test_packet.get(), 0, test_packet_size); | 938 memset(test_packet.get(), 0, test_packet_size); |
937 // Set the send buffer size to the same size as the test packet to have a | 939 // Set the send buffer size to the same size as the test packet to have a |
938 // better chance to get EWOULDBLOCK. | 940 // better chance to get EWOULDBLOCK. |
939 int send_buffer_size = test_packet_size; | 941 int send_buffer_size = test_packet_size; |
940 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) | 942 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) |
941 send_buffer_size /= 2; | 943 send_buffer_size /= 2; |
942 #endif | 944 #endif |
943 client->SetOption(rtc::Socket::OPT_SNDBUF, send_buffer_size); | 945 client->SetOption(rtc::Socket::OPT_SNDBUF, send_buffer_size); |
944 | 946 |
(...skipping 13 matching lines...) Expand all Loading... |
958 } | 960 } |
959 } | 961 } |
960 } | 962 } |
961 EXPECT_EQ(expected_error, error); | 963 EXPECT_EQ(expected_error, error); |
962 EXPECT_FALSE(client->ready_to_send()); | 964 EXPECT_FALSE(client->ready_to_send()); |
963 EXPECT_TRUE_WAIT(client->ready_to_send(), kTimeout); | 965 EXPECT_TRUE_WAIT(client->ready_to_send(), kTimeout); |
964 LOG(LS_INFO) << "Got SignalReadyToSend"; | 966 LOG(LS_INFO) << "Got SignalReadyToSend"; |
965 } | 967 } |
966 | 968 |
967 void SocketTest::GetSetOptionsInternal(const IPAddress& loopback) { | 969 void SocketTest::GetSetOptionsInternal(const IPAddress& loopback) { |
968 rtc::scoped_ptr<AsyncSocket> socket( | 970 std::unique_ptr<AsyncSocket> socket( |
969 ss_->CreateAsyncSocket(loopback.family(), SOCK_DGRAM)); | 971 ss_->CreateAsyncSocket(loopback.family(), SOCK_DGRAM)); |
970 socket->Bind(SocketAddress(loopback, 0)); | 972 socket->Bind(SocketAddress(loopback, 0)); |
971 | 973 |
972 // Check SNDBUF/RCVBUF. | 974 // Check SNDBUF/RCVBUF. |
973 const int desired_size = 12345; | 975 const int desired_size = 12345; |
974 #if defined(WEBRTC_LINUX) | 976 #if defined(WEBRTC_LINUX) |
975 // Yes, really. It's in the kernel source. | 977 // Yes, really. It's in the kernel source. |
976 const int expected_size = desired_size * 2; | 978 const int expected_size = desired_size * 2; |
977 #else // !WEBRTC_LINUX | 979 #else // !WEBRTC_LINUX |
978 const int expected_size = desired_size; | 980 const int expected_size = desired_size; |
(...skipping 14 matching lines...) Expand all Loading... |
993 ASSERT_EQ(expected_size, send_size); | 995 ASSERT_EQ(expected_size, send_size); |
994 | 996 |
995 // Check that we can't set NODELAY on a UDP socket. | 997 // Check that we can't set NODELAY on a UDP socket. |
996 int current_nd, desired_nd = 1; | 998 int current_nd, desired_nd = 1; |
997 ASSERT_EQ(-1, socket->GetOption(Socket::OPT_NODELAY, ¤t_nd)); | 999 ASSERT_EQ(-1, socket->GetOption(Socket::OPT_NODELAY, ¤t_nd)); |
998 ASSERT_EQ(-1, socket->SetOption(Socket::OPT_NODELAY, desired_nd)); | 1000 ASSERT_EQ(-1, socket->SetOption(Socket::OPT_NODELAY, desired_nd)); |
999 | 1001 |
1000 // Skip the esimate MTU test for IPv6 for now. | 1002 // Skip the esimate MTU test for IPv6 for now. |
1001 if (loopback.family() != AF_INET6) { | 1003 if (loopback.family() != AF_INET6) { |
1002 // Try estimating MTU. | 1004 // Try estimating MTU. |
1003 rtc::scoped_ptr<AsyncSocket> | 1005 std::unique_ptr<AsyncSocket> mtu_socket( |
1004 mtu_socket( | 1006 ss_->CreateAsyncSocket(loopback.family(), SOCK_DGRAM)); |
1005 ss_->CreateAsyncSocket(loopback.family(), SOCK_DGRAM)); | |
1006 mtu_socket->Bind(SocketAddress(loopback, 0)); | 1007 mtu_socket->Bind(SocketAddress(loopback, 0)); |
1007 uint16_t mtu; | 1008 uint16_t mtu; |
1008 // should fail until we connect | 1009 // should fail until we connect |
1009 ASSERT_EQ(-1, mtu_socket->EstimateMTU(&mtu)); | 1010 ASSERT_EQ(-1, mtu_socket->EstimateMTU(&mtu)); |
1010 mtu_socket->Connect(SocketAddress(loopback, 0)); | 1011 mtu_socket->Connect(SocketAddress(loopback, 0)); |
1011 #if defined(WEBRTC_WIN) | 1012 #if defined(WEBRTC_WIN) |
1012 // now it should succeed | 1013 // now it should succeed |
1013 ASSERT_NE(-1, mtu_socket->EstimateMTU(&mtu)); | 1014 ASSERT_NE(-1, mtu_socket->EstimateMTU(&mtu)); |
1014 ASSERT_GE(mtu, 1492); // should be at least the 1492 "plateau" on localhost | 1015 ASSERT_GE(mtu, 1492); // should be at least the 1492 "plateau" on localhost |
1015 #elif defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) | 1016 #elif defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) |
1016 // except on WEBRTC_MAC && !WEBRTC_IOS, where it's not yet implemented | 1017 // except on WEBRTC_MAC && !WEBRTC_IOS, where it's not yet implemented |
1017 ASSERT_EQ(-1, mtu_socket->EstimateMTU(&mtu)); | 1018 ASSERT_EQ(-1, mtu_socket->EstimateMTU(&mtu)); |
1018 #else | 1019 #else |
1019 // and the behavior seems unpredictable on Linux, | 1020 // and the behavior seems unpredictable on Linux, |
1020 // failing on the build machine | 1021 // failing on the build machine |
1021 // but succeeding on my Ubiquity instance. | 1022 // but succeeding on my Ubiquity instance. |
1022 #endif | 1023 #endif |
1023 } | 1024 } |
1024 } | 1025 } |
1025 | 1026 |
1026 } // namespace rtc | 1027 } // namespace rtc |
OLD | NEW |