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> | 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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |