Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Side by Side Diff: webrtc/base/socket_unittest.cc

Issue 2819473004: base/testutils.h: Use namespace webrtc::testing instead of plain testing (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/base/physicalsocketserver_unittest.cc ('k') | webrtc/base/testutils.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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> 11 #include <memory>
12 12
13 #include "webrtc/base/socket_unittest.h" 13 #include "webrtc/base/socket_unittest.h"
14 14
15 #include "webrtc/base/arraysize.h" 15 #include "webrtc/base/arraysize.h"
16 #include "webrtc/base/buffer.h" 16 #include "webrtc/base/buffer.h"
17 #include "webrtc/base/asyncudpsocket.h" 17 #include "webrtc/base/asyncudpsocket.h"
18 #include "webrtc/base/gunit.h" 18 #include "webrtc/base/gunit.h"
19 #include "webrtc/base/nethelpers.h" 19 #include "webrtc/base/nethelpers.h"
20 #include "webrtc/base/socketserver.h" 20 #include "webrtc/base/socketserver.h"
21 #include "webrtc/base/testclient.h" 21 #include "webrtc/base/testclient.h"
22 #include "webrtc/base/testutils.h" 22 #include "webrtc/base/testutils.h"
23 #include "webrtc/base/thread.h" 23 #include "webrtc/base/thread.h"
24 24
25 namespace rtc { 25 namespace rtc {
26 26
27 using webrtc::testing::SSE_CLOSE;
28 using webrtc::testing::SSE_ERROR;
29 using webrtc::testing::SSE_OPEN;
30 using webrtc::testing::SSE_READ;
31 using webrtc::testing::SSE_WRITE;
32 using webrtc::testing::StreamSink;
33
27 #define MAYBE_SKIP_IPV6 \ 34 #define MAYBE_SKIP_IPV6 \
28 if (!HasIPv6Enabled()) { \ 35 if (!HasIPv6Enabled()) { \
29 LOG(LS_INFO) << "No IPv6... skipping"; \ 36 LOG(LS_INFO) << "No IPv6... skipping"; \
30 return; \ 37 return; \
31 } 38 }
32 39
33 // Data size to be used in TcpInternal tests. 40 // Data size to be used in TcpInternal tests.
34 static const size_t kTcpInternalDataSize = 1024 * 1024; // bytes 41 static const size_t kTcpInternalDataSize = 1024 * 1024; // bytes
35 42
36 void SocketTest::TestConnectIPv4() { 43 void SocketTest::TestConnectIPv4() {
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 // values on Windows, but an empty address of the same family on Linux/MacOS X. 204 // values on Windows, but an empty address of the same family on Linux/MacOS X.
198 bool IsUnspecOrEmptyIP(const IPAddress& address) { 205 bool IsUnspecOrEmptyIP(const IPAddress& address) {
199 #if !defined(WEBRTC_WIN) 206 #if !defined(WEBRTC_WIN)
200 return IPIsAny(address); 207 return IPIsAny(address);
201 #else 208 #else
202 return address.family() == AF_UNSPEC; 209 return address.family() == AF_UNSPEC;
203 #endif 210 #endif
204 } 211 }
205 212
206 void SocketTest::ConnectInternal(const IPAddress& loopback) { 213 void SocketTest::ConnectInternal(const IPAddress& loopback) {
207 testing::StreamSink sink; 214 StreamSink sink;
208 SocketAddress accept_addr; 215 SocketAddress accept_addr;
209 216
210 // Create client. 217 // Create client.
211 std::unique_ptr<AsyncSocket> client( 218 std::unique_ptr<AsyncSocket> client(
212 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 219 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
213 sink.Monitor(client.get()); 220 sink.Monitor(client.get());
214 EXPECT_EQ(AsyncSocket::CS_CLOSED, client->GetState()); 221 EXPECT_EQ(AsyncSocket::CS_CLOSED, client->GetState());
215 EXPECT_PRED1(IsUnspecOrEmptyIP, client->GetLocalAddress().ipaddr()); 222 EXPECT_PRED1(IsUnspecOrEmptyIP, client->GetLocalAddress().ipaddr());
216 223
217 // Create server and listen. 224 // Create server and listen.
218 std::unique_ptr<AsyncSocket> server( 225 std::unique_ptr<AsyncSocket> server(
219 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 226 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
220 sink.Monitor(server.get()); 227 sink.Monitor(server.get());
221 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); 228 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
222 EXPECT_EQ(0, server->Listen(5)); 229 EXPECT_EQ(0, server->Listen(5));
223 EXPECT_EQ(AsyncSocket::CS_CONNECTING, server->GetState()); 230 EXPECT_EQ(AsyncSocket::CS_CONNECTING, server->GetState());
224 231
225 // Ensure no pending server connections, since we haven't done anything yet. 232 // Ensure no pending server connections, since we haven't done anything yet.
226 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); 233 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
227 EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); 234 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
228 EXPECT_TRUE(accept_addr.IsNil()); 235 EXPECT_TRUE(accept_addr.IsNil());
229 236
230 // Attempt connect to listening socket. 237 // Attempt connect to listening socket.
231 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 238 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
232 EXPECT_FALSE(client->GetLocalAddress().IsNil()); 239 EXPECT_FALSE(client->GetLocalAddress().IsNil());
233 EXPECT_NE(server->GetLocalAddress(), client->GetLocalAddress()); 240 EXPECT_NE(server->GetLocalAddress(), client->GetLocalAddress());
234 241
235 // Client is connecting, outcome not yet determined. 242 // Client is connecting, outcome not yet determined.
236 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState()); 243 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState());
237 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_OPEN)); 244 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
238 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); 245 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
239 246
240 // Server has pending connection, accept it. 247 // Server has pending connection, accept it.
241 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); 248 EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
242 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); 249 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
243 ASSERT_TRUE(accepted); 250 ASSERT_TRUE(accepted);
244 EXPECT_FALSE(accept_addr.IsNil()); 251 EXPECT_FALSE(accept_addr.IsNil());
245 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); 252 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
246 253
247 // Connected from server perspective, check the addresses are correct. 254 // Connected from server perspective, check the addresses are correct.
248 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); 255 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState());
249 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress()); 256 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress());
250 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress()); 257 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress());
251 258
252 // Connected from client perspective, check the addresses are correct. 259 // Connected from client perspective, check the addresses are correct.
253 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); 260 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
254 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); 261 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
255 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); 262 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
256 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); 263 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
257 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); 264 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
258 } 265 }
259 266
260 void SocketTest::ConnectWithDnsLookupInternal(const IPAddress& loopback, 267 void SocketTest::ConnectWithDnsLookupInternal(const IPAddress& loopback,
261 const std::string& host) { 268 const std::string& host) {
262 testing::StreamSink sink; 269 StreamSink sink;
263 SocketAddress accept_addr; 270 SocketAddress accept_addr;
264 271
265 // Create client. 272 // Create client.
266 std::unique_ptr<AsyncSocket> client( 273 std::unique_ptr<AsyncSocket> client(
267 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 274 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
268 sink.Monitor(client.get()); 275 sink.Monitor(client.get());
269 276
270 // Create server and listen. 277 // Create server and listen.
271 std::unique_ptr<AsyncSocket> server( 278 std::unique_ptr<AsyncSocket> server(
272 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 279 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
273 sink.Monitor(server.get()); 280 sink.Monitor(server.get());
274 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); 281 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
275 EXPECT_EQ(0, server->Listen(5)); 282 EXPECT_EQ(0, server->Listen(5));
276 283
277 // Attempt connect to listening socket. 284 // Attempt connect to listening socket.
278 SocketAddress dns_addr(server->GetLocalAddress()); 285 SocketAddress dns_addr(server->GetLocalAddress());
279 dns_addr.SetIP(host); 286 dns_addr.SetIP(host);
280 EXPECT_EQ(0, client->Connect(dns_addr)); 287 EXPECT_EQ(0, client->Connect(dns_addr));
281 // TODO: Bind when doing DNS lookup. 288 // TODO: Bind when doing DNS lookup.
282 //EXPECT_NE(kEmptyAddr, client->GetLocalAddress()); // Implicit Bind 289 //EXPECT_NE(kEmptyAddr, client->GetLocalAddress()); // Implicit Bind
283 290
284 // Client is connecting, outcome not yet determined. 291 // Client is connecting, outcome not yet determined.
285 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState()); 292 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState());
286 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_OPEN)); 293 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
287 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); 294 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
288 295
289 // Server has pending connection, accept it. 296 // Server has pending connection, accept it.
290 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); 297 EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
291 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); 298 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
292 ASSERT_TRUE(accepted); 299 ASSERT_TRUE(accepted);
293 EXPECT_FALSE(accept_addr.IsNil()); 300 EXPECT_FALSE(accept_addr.IsNil());
294 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); 301 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
295 302
296 // Connected from server perspective, check the addresses are correct. 303 // Connected from server perspective, check the addresses are correct.
297 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); 304 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState());
298 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress()); 305 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress());
299 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress()); 306 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress());
300 307
301 // Connected from client perspective, check the addresses are correct. 308 // Connected from client perspective, check the addresses are correct.
302 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); 309 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
303 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); 310 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
304 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); 311 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
305 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); 312 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
306 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); 313 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
307 } 314 }
308 315
309 void SocketTest::ConnectFailInternal(const IPAddress& loopback) { 316 void SocketTest::ConnectFailInternal(const IPAddress& loopback) {
310 testing::StreamSink sink; 317 StreamSink sink;
311 SocketAddress accept_addr; 318 SocketAddress accept_addr;
312 319
313 // Create client. 320 // Create client.
314 std::unique_ptr<AsyncSocket> client( 321 std::unique_ptr<AsyncSocket> client(
315 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 322 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
316 sink.Monitor(client.get()); 323 sink.Monitor(client.get());
317 324
318 // Create server, but don't listen yet. 325 // Create server, but don't listen yet.
319 std::unique_ptr<AsyncSocket> server( 326 std::unique_ptr<AsyncSocket> server(
320 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 327 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
321 sink.Monitor(server.get()); 328 sink.Monitor(server.get());
322 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); 329 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
323 330
324 // Attempt connect to a non-existent socket. 331 // Attempt connect to a non-existent socket.
325 // We don't connect to the server socket created above, since on 332 // We don't connect to the server socket created above, since on
326 // MacOS it takes about 75 seconds to get back an error! 333 // MacOS it takes about 75 seconds to get back an error!
327 SocketAddress bogus_addr(loopback, 65535); 334 SocketAddress bogus_addr(loopback, 65535);
328 EXPECT_EQ(0, client->Connect(bogus_addr)); 335 EXPECT_EQ(0, client->Connect(bogus_addr));
329 336
330 // Wait for connection to fail (ECONNREFUSED). 337 // Wait for connection to fail (ECONNREFUSED).
331 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout); 338 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout);
332 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_OPEN)); 339 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
333 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); 340 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
334 EXPECT_TRUE(client->GetRemoteAddress().IsNil()); 341 EXPECT_TRUE(client->GetRemoteAddress().IsNil());
335 342
336 // Should be no pending server connections. 343 // Should be no pending server connections.
337 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); 344 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
338 EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); 345 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
339 EXPECT_EQ(IPAddress(), accept_addr.ipaddr()); 346 EXPECT_EQ(IPAddress(), accept_addr.ipaddr());
340 } 347 }
341 348
342 void SocketTest::ConnectWithDnsLookupFailInternal(const IPAddress& loopback) { 349 void SocketTest::ConnectWithDnsLookupFailInternal(const IPAddress& loopback) {
343 testing::StreamSink sink; 350 StreamSink sink;
344 SocketAddress accept_addr; 351 SocketAddress accept_addr;
345 352
346 // Create client. 353 // Create client.
347 std::unique_ptr<AsyncSocket> client( 354 std::unique_ptr<AsyncSocket> client(
348 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 355 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
349 sink.Monitor(client.get()); 356 sink.Monitor(client.get());
350 357
351 // Create server, but don't listen yet. 358 // Create server, but don't listen yet.
352 std::unique_ptr<AsyncSocket> server( 359 std::unique_ptr<AsyncSocket> server(
353 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 360 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
(...skipping 10 matching lines...) Expand all
364 bool dns_lookup_finished = false; 371 bool dns_lookup_finished = false;
365 WAIT_(client->GetState() == AsyncSocket::CS_CLOSED, kTimeout, 372 WAIT_(client->GetState() == AsyncSocket::CS_CLOSED, kTimeout,
366 dns_lookup_finished); 373 dns_lookup_finished);
367 if (!dns_lookup_finished) { 374 if (!dns_lookup_finished) {
368 LOG(LS_WARNING) << "Skipping test; DNS resolution took longer than 5 " 375 LOG(LS_WARNING) << "Skipping test; DNS resolution took longer than 5 "
369 << "seconds."; 376 << "seconds.";
370 return; 377 return;
371 } 378 }
372 379
373 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout); 380 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout);
374 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_OPEN)); 381 EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
375 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); 382 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
376 EXPECT_TRUE(client->GetRemoteAddress().IsNil()); 383 EXPECT_TRUE(client->GetRemoteAddress().IsNil());
377 // Should be no pending server connections. 384 // Should be no pending server connections.
378 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); 385 EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
379 EXPECT_TRUE(nullptr == server->Accept(&accept_addr)); 386 EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
380 EXPECT_TRUE(accept_addr.IsNil()); 387 EXPECT_TRUE(accept_addr.IsNil());
381 } 388 }
382 389
383 void SocketTest::ConnectWithClosedSocketInternal(const IPAddress& loopback) { 390 void SocketTest::ConnectWithClosedSocketInternal(const IPAddress& loopback) {
384 // Create server and listen. 391 // Create server and listen.
385 std::unique_ptr<AsyncSocket> server( 392 std::unique_ptr<AsyncSocket> server(
386 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 393 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
387 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); 394 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
388 EXPECT_EQ(0, server->Listen(5)); 395 EXPECT_EQ(0, server->Listen(5));
389 396
390 // Create a client and put in to CS_CLOSED state. 397 // Create a client and put in to CS_CLOSED state.
391 std::unique_ptr<AsyncSocket> client( 398 std::unique_ptr<AsyncSocket> client(
392 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 399 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
393 EXPECT_EQ(0, client->Close()); 400 EXPECT_EQ(0, client->Close());
394 EXPECT_EQ(AsyncSocket::CS_CLOSED, client->GetState()); 401 EXPECT_EQ(AsyncSocket::CS_CLOSED, client->GetState());
395 402
396 // Connect() should reinitialize the socket, and put it in to CS_CONNECTING. 403 // Connect() should reinitialize the socket, and put it in to CS_CONNECTING.
397 EXPECT_EQ(0, client->Connect(SocketAddress(server->GetLocalAddress()))); 404 EXPECT_EQ(0, client->Connect(SocketAddress(server->GetLocalAddress())));
398 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState()); 405 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState());
399 } 406 }
400 407
401 void SocketTest::ConnectWhileNotClosedInternal(const IPAddress& loopback) { 408 void SocketTest::ConnectWhileNotClosedInternal(const IPAddress& loopback) {
402 // Create server and listen. 409 // Create server and listen.
403 testing::StreamSink sink; 410 StreamSink sink;
404 std::unique_ptr<AsyncSocket> server( 411 std::unique_ptr<AsyncSocket> server(
405 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 412 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
406 sink.Monitor(server.get()); 413 sink.Monitor(server.get());
407 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); 414 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
408 EXPECT_EQ(0, server->Listen(5)); 415 EXPECT_EQ(0, server->Listen(5));
409 // Create client, connect. 416 // Create client, connect.
410 std::unique_ptr<AsyncSocket> client( 417 std::unique_ptr<AsyncSocket> client(
411 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 418 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
412 EXPECT_EQ(0, client->Connect(SocketAddress(server->GetLocalAddress()))); 419 EXPECT_EQ(0, client->Connect(SocketAddress(server->GetLocalAddress())));
413 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState()); 420 EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState());
414 // Try to connect again. Should fail, but not interfere with original attempt. 421 // Try to connect again. Should fail, but not interfere with original attempt.
415 EXPECT_EQ(SOCKET_ERROR, 422 EXPECT_EQ(SOCKET_ERROR,
416 client->Connect(SocketAddress(server->GetLocalAddress()))); 423 client->Connect(SocketAddress(server->GetLocalAddress())));
417 424
418 // Accept the original connection. 425 // Accept the original connection.
419 SocketAddress accept_addr; 426 SocketAddress accept_addr;
420 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); 427 EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
421 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); 428 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
422 ASSERT_TRUE(accepted); 429 ASSERT_TRUE(accepted);
423 EXPECT_FALSE(accept_addr.IsNil()); 430 EXPECT_FALSE(accept_addr.IsNil());
424 431
425 // Check the states and addresses. 432 // Check the states and addresses.
426 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); 433 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState());
427 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress()); 434 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress());
428 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress()); 435 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress());
429 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); 436 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
430 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); 437 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
431 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); 438 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
432 439
433 // Try to connect again, to an unresolved hostname. 440 // Try to connect again, to an unresolved hostname.
434 // Shouldn't break anything. 441 // Shouldn't break anything.
435 EXPECT_EQ(SOCKET_ERROR, 442 EXPECT_EQ(SOCKET_ERROR,
436 client->Connect(SocketAddress("localhost", 443 client->Connect(SocketAddress("localhost",
437 server->GetLocalAddress().port()))); 444 server->GetLocalAddress().port())));
438 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); 445 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState());
439 EXPECT_EQ(AsyncSocket::CS_CONNECTED, client->GetState()); 446 EXPECT_EQ(AsyncSocket::CS_CONNECTED, client->GetState());
440 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); 447 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
441 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); 448 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
442 } 449 }
443 450
444 void SocketTest::ServerCloseDuringConnectInternal(const IPAddress& loopback) { 451 void SocketTest::ServerCloseDuringConnectInternal(const IPAddress& loopback) {
445 testing::StreamSink sink; 452 StreamSink sink;
446 453
447 // Create client. 454 // Create client.
448 std::unique_ptr<AsyncSocket> client( 455 std::unique_ptr<AsyncSocket> client(
449 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 456 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
450 sink.Monitor(client.get()); 457 sink.Monitor(client.get());
451 458
452 // Create server and listen. 459 // Create server and listen.
453 std::unique_ptr<AsyncSocket> server( 460 std::unique_ptr<AsyncSocket> server(
454 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 461 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
455 sink.Monitor(server.get()); 462 sink.Monitor(server.get());
456 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); 463 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
457 EXPECT_EQ(0, server->Listen(5)); 464 EXPECT_EQ(0, server->Listen(5));
458 465
459 // Attempt connect to listening socket. 466 // Attempt connect to listening socket.
460 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 467 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
461 468
462 // Close down the server while the socket is in the accept queue. 469 // Close down the server while the socket is in the accept queue.
463 EXPECT_TRUE_WAIT(sink.Check(server.get(), testing::SSE_READ), kTimeout); 470 EXPECT_TRUE_WAIT(sink.Check(server.get(), SSE_READ), kTimeout);
464 server->Close(); 471 server->Close();
465 472
466 // This should fail the connection for the client. Clean up. 473 // This should fail the connection for the client. Clean up.
467 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout); 474 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout);
468 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); 475 EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
469 client->Close(); 476 client->Close();
470 } 477 }
471 478
472 void SocketTest::ClientCloseDuringConnectInternal(const IPAddress& loopback) { 479 void SocketTest::ClientCloseDuringConnectInternal(const IPAddress& loopback) {
473 testing::StreamSink sink; 480 StreamSink sink;
474 SocketAddress accept_addr; 481 SocketAddress accept_addr;
475 482
476 // Create client. 483 // Create client.
477 std::unique_ptr<AsyncSocket> client( 484 std::unique_ptr<AsyncSocket> client(
478 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 485 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
479 sink.Monitor(client.get()); 486 sink.Monitor(client.get());
480 487
481 // Create server and listen. 488 // Create server and listen.
482 std::unique_ptr<AsyncSocket> server( 489 std::unique_ptr<AsyncSocket> server(
483 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 490 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
484 sink.Monitor(server.get()); 491 sink.Monitor(server.get());
485 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); 492 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
486 EXPECT_EQ(0, server->Listen(5)); 493 EXPECT_EQ(0, server->Listen(5));
487 494
488 // Attempt connect to listening socket. 495 // Attempt connect to listening socket.
489 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 496 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
490 497
491 // Close down the client while the socket is in the accept queue. 498 // Close down the client while the socket is in the accept queue.
492 EXPECT_TRUE_WAIT(sink.Check(server.get(), testing::SSE_READ), kTimeout); 499 EXPECT_TRUE_WAIT(sink.Check(server.get(), SSE_READ), kTimeout);
493 client->Close(); 500 client->Close();
494 501
495 // The connection should still be able to be accepted. 502 // The connection should still be able to be accepted.
496 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); 503 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
497 ASSERT_TRUE(accepted); 504 ASSERT_TRUE(accepted);
498 sink.Monitor(accepted.get()); 505 sink.Monitor(accepted.get());
499 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); 506 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState());
500 507
501 // The accepted socket should then close (possibly with err, timing-related) 508 // The accepted socket should then close (possibly with err, timing-related)
502 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, accepted->GetState(), kTimeout); 509 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, accepted->GetState(), kTimeout);
503 EXPECT_TRUE(sink.Check(accepted.get(), testing::SSE_CLOSE) || 510 EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE) ||
504 sink.Check(accepted.get(), testing::SSE_ERROR)); 511 sink.Check(accepted.get(), SSE_ERROR));
505 512
506 // The client should not get a close event. 513 // The client should not get a close event.
507 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); 514 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
508 } 515 }
509 516
510 void SocketTest::ServerCloseInternal(const IPAddress& loopback) { 517 void SocketTest::ServerCloseInternal(const IPAddress& loopback) {
511 testing::StreamSink sink; 518 StreamSink sink;
512 SocketAddress accept_addr; 519 SocketAddress accept_addr;
513 520
514 // Create client. 521 // Create client.
515 std::unique_ptr<AsyncSocket> client( 522 std::unique_ptr<AsyncSocket> client(
516 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 523 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
517 sink.Monitor(client.get()); 524 sink.Monitor(client.get());
518 525
519 // Create server and listen. 526 // Create server and listen.
520 std::unique_ptr<AsyncSocket> server( 527 std::unique_ptr<AsyncSocket> server(
521 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 528 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
522 sink.Monitor(server.get()); 529 sink.Monitor(server.get());
523 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); 530 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
524 EXPECT_EQ(0, server->Listen(5)); 531 EXPECT_EQ(0, server->Listen(5));
525 532
526 // Attempt connection. 533 // Attempt connection.
527 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 534 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
528 535
529 // Accept connection. 536 // Accept connection.
530 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); 537 EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
531 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); 538 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
532 ASSERT_TRUE(accepted); 539 ASSERT_TRUE(accepted);
533 sink.Monitor(accepted.get()); 540 sink.Monitor(accepted.get());
534 541
535 // Both sides are now connected. 542 // Both sides are now connected.
536 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); 543 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
537 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); 544 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
538 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); 545 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
539 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); 546 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
540 547
541 // Send data to the client, and then close the connection. 548 // Send data to the client, and then close the connection.
542 EXPECT_EQ(1, accepted->Send("a", 1)); 549 EXPECT_EQ(1, accepted->Send("a", 1));
543 accepted->Close(); 550 accepted->Close();
544 EXPECT_EQ(AsyncSocket::CS_CLOSED, accepted->GetState()); 551 EXPECT_EQ(AsyncSocket::CS_CLOSED, accepted->GetState());
545 552
546 // Expect that the client is notified, and has not yet closed. 553 // Expect that the client is notified, and has not yet closed.
547 EXPECT_TRUE_WAIT(sink.Check(client.get(), testing::SSE_READ), kTimeout); 554 EXPECT_TRUE_WAIT(sink.Check(client.get(), SSE_READ), kTimeout);
548 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); 555 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
549 EXPECT_EQ(AsyncSocket::CS_CONNECTED, client->GetState()); 556 EXPECT_EQ(AsyncSocket::CS_CONNECTED, client->GetState());
550 557
551 // Ensure the data can be read. 558 // Ensure the data can be read.
552 char buffer[10]; 559 char buffer[10];
553 EXPECT_EQ(1, client->Recv(buffer, sizeof(buffer), nullptr)); 560 EXPECT_EQ(1, client->Recv(buffer, sizeof(buffer), nullptr));
554 EXPECT_EQ('a', buffer[0]); 561 EXPECT_EQ('a', buffer[0]);
555 562
556 // Now we should close, but the remote address will remain. 563 // Now we should close, but the remote address will remain.
557 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout); 564 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout);
558 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_CLOSE)); 565 EXPECT_TRUE(sink.Check(client.get(), SSE_CLOSE));
559 EXPECT_FALSE(client->GetRemoteAddress().IsAnyIP()); 566 EXPECT_FALSE(client->GetRemoteAddress().IsAnyIP());
560 567
561 // The closer should not get a close signal. 568 // The closer should not get a close signal.
562 EXPECT_FALSE(sink.Check(accepted.get(), testing::SSE_CLOSE)); 569 EXPECT_FALSE(sink.Check(accepted.get(), SSE_CLOSE));
563 EXPECT_TRUE(accepted->GetRemoteAddress().IsNil()); 570 EXPECT_TRUE(accepted->GetRemoteAddress().IsNil());
564 571
565 // And the closee should only get a single signal. 572 // And the closee should only get a single signal.
566 Thread::Current()->ProcessMessages(0); 573 Thread::Current()->ProcessMessages(0);
567 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); 574 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
568 575
569 // Close down the client and ensure all is good. 576 // Close down the client and ensure all is good.
570 client->Close(); 577 client->Close();
571 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); 578 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
572 EXPECT_TRUE(client->GetRemoteAddress().IsNil()); 579 EXPECT_TRUE(client->GetRemoteAddress().IsNil());
573 } 580 }
574 581
575 class SocketCloser : public sigslot::has_slots<> { 582 class SocketCloser : public sigslot::has_slots<> {
576 public: 583 public:
577 void OnClose(AsyncSocket* socket, int error) { 584 void OnClose(AsyncSocket* socket, int error) {
578 socket->Close(); // Deleting here would blow up the vector of handlers 585 socket->Close(); // Deleting here would blow up the vector of handlers
579 // for the socket's signal. 586 // for the socket's signal.
580 } 587 }
581 }; 588 };
582 589
583 void SocketTest::CloseInClosedCallbackInternal(const IPAddress& loopback) { 590 void SocketTest::CloseInClosedCallbackInternal(const IPAddress& loopback) {
584 testing::StreamSink sink; 591 StreamSink sink;
585 SocketCloser closer; 592 SocketCloser closer;
586 SocketAddress accept_addr; 593 SocketAddress accept_addr;
587 594
588 // Create client. 595 // Create client.
589 std::unique_ptr<AsyncSocket> client( 596 std::unique_ptr<AsyncSocket> client(
590 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 597 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
591 sink.Monitor(client.get()); 598 sink.Monitor(client.get());
592 client->SignalCloseEvent.connect(&closer, &SocketCloser::OnClose); 599 client->SignalCloseEvent.connect(&closer, &SocketCloser::OnClose);
593 600
594 // Create server and listen. 601 // Create server and listen.
595 std::unique_ptr<AsyncSocket> server( 602 std::unique_ptr<AsyncSocket> server(
596 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 603 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
597 sink.Monitor(server.get()); 604 sink.Monitor(server.get());
598 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); 605 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
599 EXPECT_EQ(0, server->Listen(5)); 606 EXPECT_EQ(0, server->Listen(5));
600 607
601 // Attempt connection. 608 // Attempt connection.
602 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 609 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
603 610
604 // Accept connection. 611 // Accept connection.
605 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); 612 EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
606 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); 613 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
607 ASSERT_TRUE(accepted); 614 ASSERT_TRUE(accepted);
608 sink.Monitor(accepted.get()); 615 sink.Monitor(accepted.get());
609 616
610 // Both sides are now connected. 617 // Both sides are now connected.
611 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); 618 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
612 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); 619 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
613 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); 620 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
614 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); 621 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
615 622
616 // Send data to the client, and then close the connection. 623 // Send data to the client, and then close the connection.
617 accepted->Close(); 624 accepted->Close();
618 EXPECT_EQ(AsyncSocket::CS_CLOSED, accepted->GetState()); 625 EXPECT_EQ(AsyncSocket::CS_CLOSED, accepted->GetState());
619 626
620 // Expect that the client is notified, and has not yet closed. 627 // Expect that the client is notified, and has not yet closed.
621 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); 628 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
622 EXPECT_EQ(AsyncSocket::CS_CONNECTED, client->GetState()); 629 EXPECT_EQ(AsyncSocket::CS_CONNECTED, client->GetState());
623 630
624 // Now we should be closed and invalidated 631 // Now we should be closed and invalidated
625 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout); 632 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout);
626 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_CLOSE)); 633 EXPECT_TRUE(sink.Check(client.get(), SSE_CLOSE));
627 EXPECT_TRUE(Socket::CS_CLOSED == client->GetState()); 634 EXPECT_TRUE(Socket::CS_CLOSED == client->GetState());
628 } 635 }
629 636
630 class Sleeper : public MessageHandler { 637 class Sleeper : public MessageHandler {
631 public: 638 public:
632 Sleeper() {} 639 Sleeper() {}
633 void OnMessage(Message* msg) { 640 void OnMessage(Message* msg) {
634 Thread::Current()->SleepMs(500); 641 Thread::Current()->SleepMs(500);
635 } 642 }
636 }; 643 };
637 644
638 void SocketTest::SocketServerWaitInternal(const IPAddress& loopback) { 645 void SocketTest::SocketServerWaitInternal(const IPAddress& loopback) {
639 testing::StreamSink sink; 646 StreamSink sink;
640 SocketAddress accept_addr; 647 SocketAddress accept_addr;
641 648
642 // Create & connect server and client sockets. 649 // Create & connect server and client sockets.
643 std::unique_ptr<AsyncSocket> client( 650 std::unique_ptr<AsyncSocket> client(
644 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 651 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
645 std::unique_ptr<AsyncSocket> server( 652 std::unique_ptr<AsyncSocket> server(
646 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 653 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
647 sink.Monitor(client.get()); 654 sink.Monitor(client.get());
648 sink.Monitor(server.get()); 655 sink.Monitor(server.get());
649 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); 656 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
650 EXPECT_EQ(0, server->Listen(5)); 657 EXPECT_EQ(0, server->Listen(5));
651 658
652 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 659 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
653 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); 660 EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
654 661
655 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); 662 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
656 ASSERT_TRUE(accepted); 663 ASSERT_TRUE(accepted);
657 sink.Monitor(accepted.get()); 664 sink.Monitor(accepted.get());
658 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState()); 665 EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState());
659 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress()); 666 EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress());
660 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress()); 667 EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress());
661 668
662 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); 669 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
663 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); 670 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
664 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); 671 EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
665 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); 672 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
666 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); 673 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
667 674
668 // Do an i/o operation, triggering an eventual callback. 675 // Do an i/o operation, triggering an eventual callback.
669 EXPECT_FALSE(sink.Check(accepted.get(), testing::SSE_READ)); 676 EXPECT_FALSE(sink.Check(accepted.get(), SSE_READ));
670 char buf[1024] = {0}; 677 char buf[1024] = {0};
671 678
672 EXPECT_EQ(1024, client->Send(buf, 1024)); 679 EXPECT_EQ(1024, client->Send(buf, 1024));
673 EXPECT_FALSE(sink.Check(accepted.get(), testing::SSE_READ)); 680 EXPECT_FALSE(sink.Check(accepted.get(), SSE_READ));
674 681
675 // Shouldn't signal when blocked in a thread Send, where process_io is false. 682 // Shouldn't signal when blocked in a thread Send, where process_io is false.
676 std::unique_ptr<Thread> thread(new Thread()); 683 std::unique_ptr<Thread> thread(new Thread());
677 thread->Start(); 684 thread->Start();
678 Sleeper sleeper; 685 Sleeper sleeper;
679 TypedMessageData<AsyncSocket*> data(client.get()); 686 TypedMessageData<AsyncSocket*> data(client.get());
680 thread->Send(RTC_FROM_HERE, &sleeper, 0, &data); 687 thread->Send(RTC_FROM_HERE, &sleeper, 0, &data);
681 EXPECT_FALSE(sink.Check(accepted.get(), testing::SSE_READ)); 688 EXPECT_FALSE(sink.Check(accepted.get(), SSE_READ));
682 689
683 // But should signal when process_io is true. 690 // But should signal when process_io is true.
684 EXPECT_TRUE_WAIT((sink.Check(accepted.get(), testing::SSE_READ)), kTimeout); 691 EXPECT_TRUE_WAIT((sink.Check(accepted.get(), SSE_READ)), kTimeout);
685 EXPECT_LT(0, accepted->Recv(buf, 1024, nullptr)); 692 EXPECT_LT(0, accepted->Recv(buf, 1024, nullptr));
686 } 693 }
687 694
688 void SocketTest::TcpInternal(const IPAddress& loopback, size_t data_size, 695 void SocketTest::TcpInternal(const IPAddress& loopback, size_t data_size,
689 ptrdiff_t max_send_size) { 696 ptrdiff_t max_send_size) {
690 testing::StreamSink sink; 697 StreamSink sink;
691 SocketAddress accept_addr; 698 SocketAddress accept_addr;
692 699
693 // Create receiving client. 700 // Create receiving client.
694 std::unique_ptr<AsyncSocket> receiver( 701 std::unique_ptr<AsyncSocket> receiver(
695 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 702 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
696 sink.Monitor(receiver.get()); 703 sink.Monitor(receiver.get());
697 704
698 // Create server and listen. 705 // Create server and listen.
699 std::unique_ptr<AsyncSocket> server( 706 std::unique_ptr<AsyncSocket> server(
700 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 707 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
701 sink.Monitor(server.get()); 708 sink.Monitor(server.get());
702 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); 709 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
703 EXPECT_EQ(0, server->Listen(5)); 710 EXPECT_EQ(0, server->Listen(5));
704 711
705 // Attempt connection. 712 // Attempt connection.
706 EXPECT_EQ(0, receiver->Connect(server->GetLocalAddress())); 713 EXPECT_EQ(0, receiver->Connect(server->GetLocalAddress()));
707 714
708 // Accept connection which will be used for sending. 715 // Accept connection which will be used for sending.
709 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); 716 EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
710 std::unique_ptr<AsyncSocket> sender(server->Accept(&accept_addr)); 717 std::unique_ptr<AsyncSocket> sender(server->Accept(&accept_addr));
711 ASSERT_TRUE(sender); 718 ASSERT_TRUE(sender);
712 sink.Monitor(sender.get()); 719 sink.Monitor(sender.get());
713 720
714 // Both sides are now connected. 721 // Both sides are now connected.
715 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, receiver->GetState(), kTimeout); 722 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, receiver->GetState(), kTimeout);
716 EXPECT_TRUE(sink.Check(receiver.get(), testing::SSE_OPEN)); 723 EXPECT_TRUE(sink.Check(receiver.get(), SSE_OPEN));
717 EXPECT_EQ(receiver->GetRemoteAddress(), sender->GetLocalAddress()); 724 EXPECT_EQ(receiver->GetRemoteAddress(), sender->GetLocalAddress());
718 EXPECT_EQ(sender->GetRemoteAddress(), receiver->GetLocalAddress()); 725 EXPECT_EQ(sender->GetRemoteAddress(), receiver->GetLocalAddress());
719 726
720 // Create test data. 727 // Create test data.
721 rtc::Buffer send_buffer(0, data_size); 728 rtc::Buffer send_buffer(0, data_size);
722 rtc::Buffer recv_buffer(0, data_size); 729 rtc::Buffer recv_buffer(0, data_size);
723 for (size_t i = 0; i < data_size; ++i) { 730 for (size_t i = 0; i < data_size; ++i) {
724 char ch = static_cast<char>(i % 256); 731 char ch = static_cast<char>(i % 256);
725 send_buffer.AppendData(&ch, sizeof(ch)); 732 send_buffer.AppendData(&ch, sizeof(ch));
726 } 733 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 } else { 765 } else {
759 ASSERT_TRUE(sender->IsBlocking()); 766 ASSERT_TRUE(sender->IsBlocking());
760 writable = false; 767 writable = false;
761 } 768 }
762 } 769 }
763 770
764 // Read all the sent data. 771 // Read all the sent data.
765 while (recv_buffer.size() < sent_size) { 772 while (recv_buffer.size() < sent_size) {
766 if (!readable) { 773 if (!readable) {
767 // Wait until data is available. 774 // Wait until data is available.
768 EXPECT_TRUE_WAIT(sink.Check(receiver.get(), testing::SSE_READ), 775 EXPECT_TRUE_WAIT(sink.Check(receiver.get(), SSE_READ), kTimeout);
769 kTimeout);
770 readable = true; 776 readable = true;
771 recv_called = false; 777 recv_called = false;
772 } 778 }
773 779
774 // Receive as much as we can get in a single recv call. 780 // Receive as much as we can get in a single recv call.
775 int recved_size = receiver->Recv(recved_data.data(), data_size, nullptr); 781 int recved_size = receiver->Recv(recved_data.data(), data_size, nullptr);
776 782
777 if (!recv_called) { 783 if (!recv_called) {
778 // The first Recv() after getting readability should succeed and receive 784 // The first Recv() after getting readability should succeed and receive
779 // some data. 785 // some data.
780 // TODO: The following line is disabled due to flakey pulse 786 // TODO: The following line is disabled due to flakey pulse
781 // builds. Re-enable if/when possible. 787 // builds. Re-enable if/when possible.
782 // EXPECT_GT(recved_size, 0); 788 // EXPECT_GT(recved_size, 0);
783 recv_called = true; 789 recv_called = true;
784 } 790 }
785 if (recved_size >= 0) { 791 if (recved_size >= 0) {
786 EXPECT_LE(static_cast<size_t>(recved_size), 792 EXPECT_LE(static_cast<size_t>(recved_size),
787 sent_size - recv_buffer.size()); 793 sent_size - recv_buffer.size());
788 recv_buffer.AppendData(recved_data.data(), recved_size); 794 recv_buffer.AppendData(recved_data.data(), recved_size);
789 } else { 795 } else {
790 ASSERT_TRUE(receiver->IsBlocking()); 796 ASSERT_TRUE(receiver->IsBlocking());
791 readable = false; 797 readable = false;
792 } 798 }
793 } 799 }
794 800
795 // Once all that we've sent has been received, expect to be able to send 801 // Once all that we've sent has been received, expect to be able to send
796 // again. 802 // again.
797 if (!writable) { 803 if (!writable) {
798 ASSERT_TRUE_WAIT(sink.Check(sender.get(), testing::SSE_WRITE), 804 ASSERT_TRUE_WAIT(sink.Check(sender.get(), SSE_WRITE), kTimeout);
799 kTimeout);
800 writable = true; 805 writable = true;
801 send_called = false; 806 send_called = false;
802 } 807 }
803 } 808 }
804 809
805 // The received data matches the sent data. 810 // The received data matches the sent data.
806 EXPECT_EQ(data_size, sent_size); 811 EXPECT_EQ(data_size, sent_size);
807 EXPECT_EQ(data_size, recv_buffer.size()); 812 EXPECT_EQ(data_size, recv_buffer.size());
808 EXPECT_EQ(recv_buffer, send_buffer); 813 EXPECT_EQ(recv_buffer, send_buffer);
809 814
810 // Close down. 815 // Close down.
811 sender->Close(); 816 sender->Close();
812 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, receiver->GetState(), kTimeout); 817 EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, receiver->GetState(), kTimeout);
813 EXPECT_TRUE(sink.Check(receiver.get(), testing::SSE_CLOSE)); 818 EXPECT_TRUE(sink.Check(receiver.get(), SSE_CLOSE));
814 receiver->Close(); 819 receiver->Close();
815 } 820 }
816 821
817 void SocketTest::SingleFlowControlCallbackInternal(const IPAddress& loopback) { 822 void SocketTest::SingleFlowControlCallbackInternal(const IPAddress& loopback) {
818 testing::StreamSink sink; 823 StreamSink sink;
819 SocketAddress accept_addr; 824 SocketAddress accept_addr;
820 825
821 // Create client. 826 // Create client.
822 std::unique_ptr<AsyncSocket> client( 827 std::unique_ptr<AsyncSocket> client(
823 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 828 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
824 sink.Monitor(client.get()); 829 sink.Monitor(client.get());
825 830
826 // Create server and listen. 831 // Create server and listen.
827 std::unique_ptr<AsyncSocket> server( 832 std::unique_ptr<AsyncSocket> server(
828 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM)); 833 ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
829 sink.Monitor(server.get()); 834 sink.Monitor(server.get());
830 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0))); 835 EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
831 EXPECT_EQ(0, server->Listen(5)); 836 EXPECT_EQ(0, server->Listen(5));
832 837
833 // Attempt connection. 838 // Attempt connection.
834 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 839 EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
835 840
836 // Accept connection. 841 // Accept connection.
837 EXPECT_TRUE_WAIT((sink.Check(server.get(), testing::SSE_READ)), kTimeout); 842 EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
838 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); 843 std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
839 ASSERT_TRUE(accepted); 844 ASSERT_TRUE(accepted);
840 sink.Monitor(accepted.get()); 845 sink.Monitor(accepted.get());
841 846
842 // Both sides are now connected. 847 // Both sides are now connected.
843 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout); 848 EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
844 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_OPEN)); 849 EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
845 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); 850 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
846 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); 851 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
847 852
848 // Expect a writable callback from the connect. 853 // Expect a writable callback from the connect.
849 EXPECT_TRUE_WAIT(sink.Check(accepted.get(), testing::SSE_WRITE), kTimeout); 854 EXPECT_TRUE_WAIT(sink.Check(accepted.get(), SSE_WRITE), kTimeout);
850 855
851 // Fill the socket buffer. 856 // Fill the socket buffer.
852 char buf[1024 * 16] = {0}; 857 char buf[1024 * 16] = {0};
853 int sends = 0; 858 int sends = 0;
854 while (++sends && accepted->Send(&buf, arraysize(buf)) != -1) {} 859 while (++sends && accepted->Send(&buf, arraysize(buf)) != -1) {}
855 EXPECT_TRUE(accepted->IsBlocking()); 860 EXPECT_TRUE(accepted->IsBlocking());
856 861
857 // Wait until data is available. 862 // Wait until data is available.
858 EXPECT_TRUE_WAIT(sink.Check(client.get(), testing::SSE_READ), kTimeout); 863 EXPECT_TRUE_WAIT(sink.Check(client.get(), SSE_READ), kTimeout);
859 864
860 // Pull data. 865 // Pull data.
861 for (int i = 0; i < sends; ++i) { 866 for (int i = 0; i < sends; ++i) {
862 client->Recv(buf, arraysize(buf), nullptr); 867 client->Recv(buf, arraysize(buf), nullptr);
863 } 868 }
864 869
865 // Expect at least one additional writable callback. 870 // Expect at least one additional writable callback.
866 EXPECT_TRUE_WAIT(sink.Check(accepted.get(), testing::SSE_WRITE), kTimeout); 871 EXPECT_TRUE_WAIT(sink.Check(accepted.get(), SSE_WRITE), kTimeout);
867 872
868 // Adding data in response to the writeable callback shouldn't cause infinite 873 // Adding data in response to the writeable callback shouldn't cause infinite
869 // callbacks. 874 // callbacks.
870 int extras = 0; 875 int extras = 0;
871 for (int i = 0; i < 100; ++i) { 876 for (int i = 0; i < 100; ++i) {
872 accepted->Send(&buf, arraysize(buf)); 877 accepted->Send(&buf, arraysize(buf));
873 rtc::Thread::Current()->ProcessMessages(1); 878 rtc::Thread::Current()->ProcessMessages(1);
874 if (sink.Check(accepted.get(), testing::SSE_WRITE)) { 879 if (sink.Check(accepted.get(), SSE_WRITE)) {
875 extras++; 880 extras++;
876 } 881 }
877 } 882 }
878 EXPECT_LT(extras, 2); 883 EXPECT_LT(extras, 2);
879 884
880 // Close down. 885 // Close down.
881 accepted->Close(); 886 accepted->Close();
882 client->Close(); 887 client->Close();
883 } 888 }
884 889
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
1054 socket->RecvFrom(buffer, 3, nullptr, &recv_timestamp_2); 1059 socket->RecvFrom(buffer, 3, nullptr, &recv_timestamp_2);
1055 1060
1056 int64_t system_time_diff = send_time_2 - send_time_1; 1061 int64_t system_time_diff = send_time_2 - send_time_1;
1057 int64_t recv_timestamp_diff = recv_timestamp_2 - recv_timestamp_1; 1062 int64_t recv_timestamp_diff = recv_timestamp_2 - recv_timestamp_1;
1058 // Compare against the system time at the point of sending, because 1063 // Compare against the system time at the point of sending, because
1059 // SleepMs may not sleep for exactly the requested time. 1064 // SleepMs may not sleep for exactly the requested time.
1060 EXPECT_NEAR(system_time_diff, recv_timestamp_diff, 10000); 1065 EXPECT_NEAR(system_time_diff, recv_timestamp_diff, 10000);
1061 } 1066 }
1062 1067
1063 } // namespace rtc 1068 } // namespace rtc
OLDNEW
« no previous file with comments | « webrtc/base/physicalsocketserver_unittest.cc ('k') | webrtc/base/testutils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698