1 /* 2 * Copyright 2006 The WebRTC Project Authors. All rights reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include <math.h> 12 #include <time.h> 13 #if defined(WEBRTC_POSIX) 14 #include <netinet/in.h> 15 #endif 16 17 #include "webrtc/base/logging.h" 18 #include "webrtc/base/gunit.h" 19 #include "webrtc/base/testclient.h" 20 #include "webrtc/base/testutils.h" 21 #include "webrtc/base/thread.h" 22 #include "webrtc/base/timeutils.h" 23 #include "webrtc/base/virtualsocketserver.h" 24 #include "webrtc/test/testsupport/gtest_disable.h" 25 26 using namespace rtc; 27 28 // Sends at a constant rate but with random packet sizes. 29 struct Sender : public MessageHandler { 30 Sender(Thread* th, AsyncSocket* s, uint32 rt) 31 : thread(th), socket(new AsyncUDPSocket(s)), 32 done(false), rate(rt), count(0) { 33 last_send = rtc::Time(); 34 thread->PostDelayed(NextDelay(), this, 1); 35 } 36 37 uint32 NextDelay() { 38 uint32 size = (rand() % 4096) + 1; 39 return 1000 * size / rate; 40 } 41 42 void OnMessage(Message* pmsg) { 43 ASSERT_EQ(1u, pmsg->message_id); 44 45 if (done) 46 return; 47 48 uint32 cur_time = rtc::Time(); 49 uint32 delay = cur_time - last_send; 50 uint32 size = rate * delay / 1000; 51 size = std::min<uint32>(size, 4096); 52 size = std::max<uint32>(size, sizeof(uint32)); 53 54 count += size; 55 memcpy(dummy, &cur_time, sizeof(cur_time)); 56 socket->Send(dummy, size, options); 57 58 last_send = cur_time; 59 thread->PostDelayed(NextDelay(), this, 1); 60 } 61 62 Thread* thread; 63 scoped_ptr<AsyncUDPSocket> socket; 64 rtc::PacketOptions options; 65 bool done; 66 uint32 rate; // bytes per second 67 uint32 count; 68 uint32 last_send; 69 char dummy[4096]; 70 }; 71 72 struct Receiver : public MessageHandler, public sigslot::has_slots<> { 73 Receiver(Thread* th, AsyncSocket* s, uint32 bw) 74 : thread(th), socket(new AsyncUDPSocket(s)), bandwidth(bw), done(false), 75 count(0), sec_count(0), sum(0), sum_sq(0), samples(0) { 76 socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket); 77 thread->PostDelayed(1000, this, 1); 78 } 79 80 ~Receiver() { 81 thread->Clear(this); 82 } 83 84 void OnReadPacket(AsyncPacketSocket* s, const char* data, size_t size, 85 const SocketAddress& remote_addr, 86 const PacketTime& packet_time) { 87 ASSERT_EQ(socket.get(), s); 88 ASSERT_GE(size, 4U); 89 90 count += size; 91 sec_count += size; 92 93 uint32 send_time = *reinterpret_cast<const uint32*>(data); 94 uint32 recv_time = rtc::Time(); 95 uint32 delay = recv_time - send_time; 96 sum += delay; 97 sum_sq += delay * delay; 98 samples += 1; 99 } 100 101 void OnMessage(Message* pmsg) { 102 ASSERT_EQ(1u, pmsg->message_id); 103 104 if (done) 105 return; 106 107 // It is always possible for us to receive more than expected because 108 // packets can be further delayed in delivery. 109 if (bandwidth > 0) 110 ASSERT_TRUE(sec_count <= 5 * bandwidth / 4); 111 sec_count = 0; 112 thread->PostDelayed(1000, this, 1); 113 } 114 115 Thread* thread; 116 scoped_ptr<AsyncUDPSocket> socket; 117 uint32 bandwidth; 118 bool done; 119 size_t count; 120 size_t sec_count; 121 double sum; 122 double sum_sq; 123 uint32 samples; 124 }; 125 126 class VirtualSocketServerTest : public testing::Test { 127 public: 128 VirtualSocketServerTest() : ss_(new VirtualSocketServer(NULL)), 129 kIPv4AnyAddress(IPAddress(INADDR_ANY), 0), 130 kIPv6AnyAddress(IPAddress(in6addr_any), 0) { 131 } 132 133 void CheckAddressIncrementalization(const SocketAddress& post, 134 const SocketAddress& pre) { 135 EXPECT_EQ(post.port(), pre.port() + 1); 136 IPAddress post_ip = post.ipaddr(); 137 IPAddress pre_ip = pre.ipaddr(); 138 EXPECT_EQ(pre_ip.family(), post_ip.family()); 139 if (post_ip.family() == AF_INET) { 140 in_addr pre_ipv4 = pre_ip.ipv4_address(); 141 in_addr post_ipv4 = post_ip.ipv4_address(); 142 int difference = ntohl(post_ipv4.s_addr) - ntohl(pre_ipv4.s_addr); 143 EXPECT_EQ(1, difference); 144 } else if (post_ip.family() == AF_INET6) { 145 in6_addr post_ip6 = post_ip.ipv6_address(); 146 in6_addr pre_ip6 = pre_ip.ipv6_address(); 147 uint32* post_as_ints = reinterpret_cast<uint32*>(&post_ip6.s6_addr); 148 uint32* pre_as_ints = reinterpret_cast<uint32*>(&pre_ip6.s6_addr); 149 EXPECT_EQ(post_as_ints[3], pre_as_ints[3] + 1); 150 } 151 } 152 153 void BasicTest(const SocketAddress& initial_addr) { 154 AsyncSocket* socket = ss_->CreateAsyncSocket(initial_addr.family(), 155 SOCK_DGRAM); 156 socket->Bind(initial_addr); 157 SocketAddress server_addr = socket->GetLocalAddress(); 158 // Make sure VSS didn't switch families on us. 159 EXPECT_EQ(server_addr.family(), initial_addr.family()); 160 161 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket)); 162 AsyncSocket* socket2 = 163 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 164 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2)); 165 166 SocketAddress client2_addr; 167 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); 168 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); 169 170 SocketAddress client1_addr; 171 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); 172 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); 173 EXPECT_EQ(client1_addr, server_addr); 174 175 SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family()); 176 for (int i = 0; i < 10; i++) { 177 client2 = new TestClient(AsyncUDPSocket::Create(ss_, empty)); 178 179 SocketAddress next_client2_addr; 180 EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr)); 181 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr)); 182 CheckAddressIncrementalization(next_client2_addr, client2_addr); 183 // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1); 184 185 SocketAddress server_addr2; 186 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr)); 187 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2)); 188 EXPECT_EQ(server_addr2, server_addr); 189 190 client2_addr = next_client2_addr; 191 } 192 } 193 194 // initial_addr should be made from either INADDR_ANY or in6addr_any. 195 void ConnectTest(const SocketAddress& initial_addr) { 196 testing::StreamSink sink; 197 SocketAddress accept_addr; 198 const SocketAddress kEmptyAddr = 199 EmptySocketAddressWithFamily(initial_addr.family()); 200 201 // Create client 202 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(), 203 SOCK_STREAM); 204 sink.Monitor(client); 205 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 206 EXPECT_TRUE(client->GetLocalAddress().IsNil()); 207 208 // Create server 209 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(), 210 SOCK_STREAM); 211 sink.Monitor(server); 212 EXPECT_NE(0, server->Listen(5)); // Bind required 213 EXPECT_EQ(0, server->Bind(initial_addr)); 214 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 215 EXPECT_EQ(0, server->Listen(5)); 216 EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING); 217 218 // No pending server connections 219 EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); 220 EXPECT_TRUE(NULL == server->Accept(&accept_addr)); 221 EXPECT_EQ(AF_UNSPEC, accept_addr.family()); 222 223 // Attempt connect to listening socket 224 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 225 EXPECT_NE(client->GetLocalAddress(), kEmptyAddr); // Implicit Bind 226 EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family()); // Implicit Bind 227 EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress()); 228 229 // Client is connecting 230 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); 231 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); 232 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE)); 233 234 ss_->ProcessMessagesUntilIdle(); 235 236 // Client still connecting 237 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); 238 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); 239 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE)); 240 241 // Server has pending connection 242 EXPECT_TRUE(sink.Check(server, testing::SSE_READ)); 243 Socket* accepted = server->Accept(&accept_addr); 244 EXPECT_TRUE(NULL != accepted); 245 EXPECT_NE(accept_addr, kEmptyAddr); 246 EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr); 247 248 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); 249 EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress()); 250 EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress()); 251 252 ss_->ProcessMessagesUntilIdle(); 253 254 // Client has connected 255 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED); 256 EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN)); 257 EXPECT_FALSE(sink.Check(client, testing::SSE_CLOSE)); 258 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); 259 EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress()); 260 } 261 262 void ConnectToNonListenerTest(const SocketAddress& initial_addr) { 263 testing::StreamSink sink; 264 SocketAddress accept_addr; 265 const SocketAddress nil_addr; 266 const SocketAddress empty_addr = 267 EmptySocketAddressWithFamily(initial_addr.family()); 268 269 // Create client 270 AsyncSocket* client = ss_->CreateAsyncSocket(initial_addr.family(), 271 SOCK_STREAM); 272 sink.Monitor(client); 273 274 // Create server 275 AsyncSocket* server = ss_->CreateAsyncSocket(initial_addr.family(), 276 SOCK_STREAM); 277 sink.Monitor(server); 278 EXPECT_EQ(0, server->Bind(initial_addr)); 279 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 280 // Attempt connect to non-listening socket 281 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 282 283 ss_->ProcessMessagesUntilIdle(); 284 285 // No pending server connections 286 EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); 287 EXPECT_TRUE(NULL == server->Accept(&accept_addr)); 288 EXPECT_EQ(accept_addr, nil_addr); 289 290 // Connection failed 291 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 292 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); 293 EXPECT_TRUE(sink.Check(client, testing::SSE_ERROR)); 294 EXPECT_EQ(client->GetRemoteAddress(), nil_addr); 295 } 296 297 void CloseDuringConnectTest(const SocketAddress& initial_addr) { 298 testing::StreamSink sink; 299 SocketAddress accept_addr; 300 const SocketAddress empty_addr = 301 EmptySocketAddressWithFamily(initial_addr.family()); 302 303 // Create client and server 304 scoped_ptr<AsyncSocket> client(ss_->CreateAsyncSocket(initial_addr.family(), 305 SOCK_STREAM)); 306 sink.Monitor(client.get()); 307 scoped_ptr<AsyncSocket> server(ss_->CreateAsyncSocket(initial_addr.family(), 308 SOCK_STREAM)); 309 sink.Monitor(server.get()); 310 311 // Initiate connect 312 EXPECT_EQ(0, server->Bind(initial_addr)); 313 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 314 315 EXPECT_EQ(0, server->Listen(5)); 316 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 317 318 // Server close before socket enters accept queue 319 EXPECT_FALSE(sink.Check(server.get(), testing::SSE_READ)); 320 server->Close(); 321 322 ss_->ProcessMessagesUntilIdle(); 323 324 // Result: connection failed 325 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 326 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); 327 328 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); 329 sink.Monitor(server.get()); 330 331 // Initiate connect 332 EXPECT_EQ(0, server->Bind(initial_addr)); 333 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 334 335 EXPECT_EQ(0, server->Listen(5)); 336 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 337 338 ss_->ProcessMessagesUntilIdle(); 339 340 // Server close while socket is in accept queue 341 EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ)); 342 server->Close(); 343 344 ss_->ProcessMessagesUntilIdle(); 345 346 // Result: connection failed 347 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 348 EXPECT_TRUE(sink.Check(client.get(), testing::SSE_ERROR)); 349 350 // New server 351 server.reset(ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM)); 352 sink.Monitor(server.get()); 353 354 // Initiate connect 355 EXPECT_EQ(0, server->Bind(initial_addr)); 356 EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family()); 357 358 EXPECT_EQ(0, server->Listen(5)); 359 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 360 361 ss_->ProcessMessagesUntilIdle(); 362 363 // Server accepts connection 364 EXPECT_TRUE(sink.Check(server.get(), testing::SSE_READ)); 365 scoped_ptr<AsyncSocket> accepted(server->Accept(&accept_addr)); 366 ASSERT_TRUE(NULL != accepted.get()); 367 sink.Monitor(accepted.get()); 368 369 // Client closes before connection complets 370 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED); 371 372 // Connected message has not been processed yet. 373 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING); 374 client->Close(); 375 376 ss_->ProcessMessagesUntilIdle(); 377 378 // Result: accepted socket closes 379 EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED); 380 EXPECT_TRUE(sink.Check(accepted.get(), testing::SSE_CLOSE)); 381 EXPECT_FALSE(sink.Check(client.get(), testing::SSE_CLOSE)); 382 } 383 384 void CloseTest(const SocketAddress& initial_addr) { 385 testing::StreamSink sink; 386 const SocketAddress kEmptyAddr; 387 388 // Create clients 389 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); 390 sink.Monitor(a); 391 a->Bind(initial_addr); 392 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); 393 394 395 scoped_ptr<AsyncSocket> b(ss_->CreateAsyncSocket(initial_addr.family(), 396 SOCK_STREAM)); 397 sink.Monitor(b.get()); 398 b->Bind(initial_addr); 399 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); 400 401 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); 402 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); 403 404 ss_->ProcessMessagesUntilIdle(); 405 406 EXPECT_TRUE(sink.Check(a, testing::SSE_OPEN)); 407 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED); 408 EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress()); 409 410 EXPECT_TRUE(sink.Check(b.get(), testing::SSE_OPEN)); 411 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED); 412 EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress()); 413 414 EXPECT_EQ(1, a->Send("a", 1)); 415 b->Close(); 416 EXPECT_EQ(1, a->Send("b", 1)); 417 418 ss_->ProcessMessagesUntilIdle(); 419 420 char buffer[10]; 421 EXPECT_FALSE(sink.Check(b.get(), testing::SSE_READ)); 422 EXPECT_EQ(-1, b->Recv(buffer, 10)); 423 424 EXPECT_TRUE(sink.Check(a, testing::SSE_CLOSE)); 425 EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED); 426 EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr); 427 428 // No signal for Closer 429 EXPECT_FALSE(sink.Check(b.get(), testing::SSE_CLOSE)); 430 EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED); 431 EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr); 432 } 433 434 void TcpSendTest(const SocketAddress& initial_addr) { 435 testing::StreamSink sink; 436 const SocketAddress kEmptyAddr; 437 438 // Connect two sockets 439 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); 440 sink.Monitor(a); 441 a->Bind(initial_addr); 442 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); 443 444 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), SOCK_STREAM); 445 sink.Monitor(b); 446 b->Bind(initial_addr); 447 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); 448 449 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); 450 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); 451 452 ss_->ProcessMessagesUntilIdle(); 453 454 const size_t kBufferSize = 2000; 455 ss_->set_send_buffer_capacity(kBufferSize); 456 ss_->set_recv_buffer_capacity(kBufferSize); 457 458 const size_t kDataSize = 5000; 459 char send_buffer[kDataSize], recv_buffer[kDataSize]; 460 for (size_t i = 0; i < kDataSize; ++i) 461 send_buffer[i] = static_cast<char>(i % 256); 462 memset(recv_buffer, 0, sizeof(recv_buffer)); 463 size_t send_pos = 0, recv_pos = 0; 464 465 // Can't send more than send buffer in one write 466 int result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 467 EXPECT_EQ(static_cast<int>(kBufferSize), result); 468 send_pos += result; 469 470 ss_->ProcessMessagesUntilIdle(); 471 EXPECT_FALSE(sink.Check(a, testing::SSE_WRITE)); 472 EXPECT_TRUE(sink.Check(b, testing::SSE_READ)); 473 474 // Receive buffer is already filled, fill send buffer again 475 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 476 EXPECT_EQ(static_cast<int>(kBufferSize), result); 477 send_pos += result; 478 479 ss_->ProcessMessagesUntilIdle(); 480 EXPECT_FALSE(sink.Check(a, testing::SSE_WRITE)); 481 EXPECT_FALSE(sink.Check(b, testing::SSE_READ)); 482 483 // No more room in send or receive buffer 484 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 485 EXPECT_EQ(-1, result); 486 EXPECT_TRUE(a->IsBlocking()); 487 488 // Read a subset of the data 489 result = b->Recv(recv_buffer + recv_pos, 500); 490 EXPECT_EQ(500, result); 491 recv_pos += result; 492 493 ss_->ProcessMessagesUntilIdle(); 494 EXPECT_TRUE(sink.Check(a, testing::SSE_WRITE)); 495 EXPECT_TRUE(sink.Check(b, testing::SSE_READ)); 496 497 // Room for more on the sending side 498 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 499 EXPECT_EQ(500, result); 500 send_pos += result; 501 502 // Empty the recv buffer 503 while (true) { 504 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos); 505 if (result < 0) { 506 EXPECT_EQ(-1, result); 507 EXPECT_TRUE(b->IsBlocking()); 508 break; 509 } 510 recv_pos += result; 511 } 512 513 ss_->ProcessMessagesUntilIdle(); 514 EXPECT_TRUE(sink.Check(b, testing::SSE_READ)); 515 516 // Continue to empty the recv buffer 517 while (true) { 518 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos); 519 if (result < 0) { 520 EXPECT_EQ(-1, result); 521 EXPECT_TRUE(b->IsBlocking()); 522 break; 523 } 524 recv_pos += result; 525 } 526 527 // Send last of the data 528 result = a->Send(send_buffer + send_pos, kDataSize - send_pos); 529 EXPECT_EQ(500, result); 530 send_pos += result; 531 532 ss_->ProcessMessagesUntilIdle(); 533 EXPECT_TRUE(sink.Check(b, testing::SSE_READ)); 534 535 // Receive the last of the data 536 while (true) { 537 result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos); 538 if (result < 0) { 539 EXPECT_EQ(-1, result); 540 EXPECT_TRUE(b->IsBlocking()); 541 break; 542 } 543 recv_pos += result; 544 } 545 546 ss_->ProcessMessagesUntilIdle(); 547 EXPECT_FALSE(sink.Check(b, testing::SSE_READ)); 548 549 // The received data matches the sent data 550 EXPECT_EQ(kDataSize, send_pos); 551 EXPECT_EQ(kDataSize, recv_pos); 552 EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize)); 553 } 554 555 void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) { 556 const SocketAddress kEmptyAddr; 557 558 // Connect two sockets 559 AsyncSocket* a = ss_->CreateAsyncSocket(initial_addr.family(), 560 SOCK_STREAM); 561 AsyncSocket* b = ss_->CreateAsyncSocket(initial_addr.family(), 562 SOCK_STREAM); 563 a->Bind(initial_addr); 564 EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family()); 565 566 b->Bind(initial_addr); 567 EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family()); 568 569 EXPECT_EQ(0, a->Connect(b->GetLocalAddress())); 570 EXPECT_EQ(0, b->Connect(a->GetLocalAddress())); 571 ss_->ProcessMessagesUntilIdle(); 572 573 // First, deliver all packets in 0 ms. 574 char buffer[2] = { 0, 0 }; 575 const char cNumPackets = 10; 576 for (char i = 0; i < cNumPackets; ++i) { 577 buffer[0] = '0' + i; 578 EXPECT_EQ(1, a->Send(buffer, 1)); 579 } 580 581 ss_->ProcessMessagesUntilIdle(); 582 583 for (char i = 0; i < cNumPackets; ++i) { 584 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer))); 585 EXPECT_EQ(static_cast<char>('0' + i), buffer[0]); 586 } 587 588 // Next, deliver packets at random intervals 589 const uint32 mean = 50; 590 const uint32 stddev = 50; 591 592 ss_->set_delay_mean(mean); 593 ss_->set_delay_stddev(stddev); 594 ss_->UpdateDelayDistribution(); 595 596 for (char i = 0; i < cNumPackets; ++i) { 597 buffer[0] = 'A' + i; 598 EXPECT_EQ(1, a->Send(buffer, 1)); 599 } 600 601 ss_->ProcessMessagesUntilIdle(); 602 603 for (char i = 0; i < cNumPackets; ++i) { 604 EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer))); 605 EXPECT_EQ(static_cast<char>('A' + i), buffer[0]); 606 } 607 } 608 609 void BandwidthTest(const SocketAddress& initial_addr) { 610 AsyncSocket* send_socket = 611 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 612 AsyncSocket* recv_socket = 613 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 614 ASSERT_EQ(0, send_socket->Bind(initial_addr)); 615 ASSERT_EQ(0, recv_socket->Bind(initial_addr)); 616 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); 617 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); 618 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); 619 620 uint32 bandwidth = 64 * 1024; 621 ss_->set_bandwidth(bandwidth); 622 623 Thread* pthMain = Thread::Current(); 624 Sender sender(pthMain, send_socket, 80 * 1024); 625 Receiver receiver(pthMain, recv_socket, bandwidth); 626 627 pthMain->ProcessMessages(5000); 628 sender.done = true; 629 pthMain->ProcessMessages(5000); 630 631 ASSERT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4); 632 ASSERT_TRUE(receiver.count <= 6 * bandwidth); // queue could drain for 1s 633 634 ss_->set_bandwidth(0); 635 } 636 637 void DelayTest(const SocketAddress& initial_addr) { 638 time_t seed = ::time(NULL); 639 LOG(LS_VERBOSE) << "seed = " << seed; 640 srand(static_cast<unsigned int>(seed)); 641 642 const uint32 mean = 2000; 643 const uint32 stddev = 500; 644 645 ss_->set_delay_mean(mean); 646 ss_->set_delay_stddev(stddev); 647 ss_->UpdateDelayDistribution(); 648 649 AsyncSocket* send_socket = 650 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 651 AsyncSocket* recv_socket = 652 ss_->CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM); 653 ASSERT_EQ(0, send_socket->Bind(initial_addr)); 654 ASSERT_EQ(0, recv_socket->Bind(initial_addr)); 655 EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family()); 656 EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family()); 657 ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress())); 658 659 Thread* pthMain = Thread::Current(); 660 // Avg packet size is 2K, so at 200KB/s for 10s, we should see about 661 // 1000 packets, which is necessary to get a good distribution. 662 Sender sender(pthMain, send_socket, 100 * 2 * 1024); 663 Receiver receiver(pthMain, recv_socket, 0); 664 665 pthMain->ProcessMessages(10000); 666 sender.done = receiver.done = true; 667 ss_->ProcessMessagesUntilIdle(); 668 669 const double sample_mean = receiver.sum / receiver.samples; 670 double num = 671 receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum; 672 double den = receiver.samples * (receiver.samples - 1); 673 const double sample_stddev = sqrt(num / den); 674 LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev; 675 676 EXPECT_LE(500u, receiver.samples); 677 // We initially used a 0.1 fudge factor, but on the build machine, we 678 // have seen the value differ by as much as 0.13. 679 EXPECT_NEAR(mean, sample_mean, 0.15 * mean); 680 EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev); 681 682 ss_->set_delay_mean(0); 683 ss_->set_delay_stddev(0); 684 ss_->UpdateDelayDistribution(); 685 } 686 687 // Test cross-family communication between a client bound to client_addr and a 688 // server bound to server_addr. shouldSucceed indicates if communication is 689 // expected to work or not. 690 void CrossFamilyConnectionTest(const SocketAddress& client_addr, 691 const SocketAddress& server_addr, 692 bool shouldSucceed) { 693 testing::StreamSink sink; 694 SocketAddress accept_address; 695 const SocketAddress kEmptyAddr; 696 697 // Client gets a IPv4 address 698 AsyncSocket* client = ss_->CreateAsyncSocket(client_addr.family(), 699 SOCK_STREAM); 700 sink.Monitor(client); 701 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 702 EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr); 703 client->Bind(client_addr); 704 705 // Server gets a non-mapped non-any IPv6 address. 706 // IPv4 sockets should not be able to connect to this. 707 AsyncSocket* server = ss_->CreateAsyncSocket(server_addr.family(), 708 SOCK_STREAM); 709 sink.Monitor(server); 710 server->Bind(server_addr); 711 server->Listen(5); 712 713 if (shouldSucceed) { 714 EXPECT_EQ(0, client->Connect(server->GetLocalAddress())); 715 ss_->ProcessMessagesUntilIdle(); 716 EXPECT_TRUE(sink.Check(server, testing::SSE_READ)); 717 Socket* accepted = server->Accept(&accept_address); 718 EXPECT_TRUE(NULL != accepted); 719 EXPECT_NE(kEmptyAddr, accept_address); 720 ss_->ProcessMessagesUntilIdle(); 721 EXPECT_TRUE(sink.Check(client, testing::SSE_OPEN)); 722 EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress()); 723 } else { 724 // Check that the connection failed. 725 EXPECT_EQ(-1, client->Connect(server->GetLocalAddress())); 726 ss_->ProcessMessagesUntilIdle(); 727 728 EXPECT_FALSE(sink.Check(server, testing::SSE_READ)); 729 EXPECT_TRUE(NULL == server->Accept(&accept_address)); 730 EXPECT_EQ(accept_address, kEmptyAddr); 731 EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED); 732 EXPECT_FALSE(sink.Check(client, testing::SSE_OPEN)); 733 EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr); 734 } 735 } 736 737 // Test cross-family datagram sending between a client bound to client_addr 738 // and a server bound to server_addr. shouldSucceed indicates if sending is 739 // expected to succed or not. 740 void CrossFamilyDatagramTest(const SocketAddress& client_addr, 741 const SocketAddress& server_addr, 742 bool shouldSucceed) { 743 AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_DGRAM); 744 socket->Bind(server_addr); 745 SocketAddress bound_server_addr = socket->GetLocalAddress(); 746 TestClient* client1 = new TestClient(new AsyncUDPSocket(socket)); 747 748 AsyncSocket* socket2 = ss_->CreateAsyncSocket(SOCK_DGRAM); 749 socket2->Bind(client_addr); 750 TestClient* client2 = new TestClient(new AsyncUDPSocket(socket2)); 751 SocketAddress client2_addr; 752 753 if (shouldSucceed) { 754 EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr)); 755 EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr)); 756 SocketAddress client1_addr; 757 EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr)); 758 EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr)); 759 EXPECT_EQ(client1_addr, bound_server_addr); 760 } else { 761 EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr)); 762 EXPECT_FALSE(client1->CheckNextPacket("foo", 3, 0)); 763 } 764 } 765 766 protected: 767 virtual void SetUp() { 768 Thread::Current()->set_socketserver(ss_); 769 } 770 virtual void TearDown() { 771 Thread::Current()->set_socketserver(NULL); 772 } 773 774 VirtualSocketServer* ss_; 775 const SocketAddress kIPv4AnyAddress; 776 const SocketAddress kIPv6AnyAddress; 777 }; 778 779 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(basic_v4)) { 780 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000); 781 BasicTest(ipv4_test_addr); 782 } 783 784 TEST_F(VirtualSocketServerTest,DISABLED_ON_MAC( basic_v6)) { 785 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000); 786 BasicTest(ipv6_test_addr); 787 } 788 789 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(connect_v4)) { 790 ConnectTest(kIPv4AnyAddress); 791 } 792 793 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(connect_v6)) { 794 ConnectTest(kIPv6AnyAddress); 795 } 796 797 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(connect_to_non_listener_v4)) { 798 ConnectToNonListenerTest(kIPv4AnyAddress); 799 } 800 801 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(connect_to_non_listener_v6)) { 802 ConnectToNonListenerTest(kIPv6AnyAddress); 803 } 804 805 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(close_during_connect_v4)) { 806 CloseDuringConnectTest(kIPv4AnyAddress); 807 } 808 809 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(close_during_connect_v6)) { 810 CloseDuringConnectTest(kIPv6AnyAddress); 811 } 812 813 TEST_F(VirtualSocketServerTest, close_v4) { 814 CloseTest(kIPv4AnyAddress); 815 } 816 817 TEST_F(VirtualSocketServerTest, close_v6) { 818 CloseTest(kIPv6AnyAddress); 819 } 820 821 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(tcp_send_v4)) { 822 TcpSendTest(kIPv4AnyAddress); 823 } 824 825 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(tcp_send_v6)) { 826 TcpSendTest(kIPv6AnyAddress); 827 } 828 829 TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) { 830 TcpSendsPacketsInOrderTest(kIPv4AnyAddress); 831 } 832 833 TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) { 834 TcpSendsPacketsInOrderTest(kIPv6AnyAddress); 835 } 836 837 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(bandwidth_v4)) { 838 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 1000); 839 BandwidthTest(ipv4_test_addr); 840 } 841 842 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(bandwidth_v6)) { 843 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 1000); 844 BandwidthTest(ipv6_test_addr); 845 } 846 847 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(delay_v4)) { 848 SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 1000); 849 DelayTest(ipv4_test_addr); 850 } 851 852 // See: https://code.google.com/p/webrtc/issues/detail?id=2409 853 TEST_F(VirtualSocketServerTest, DISABLED_delay_v6) { 854 SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 1000); 855 DelayTest(ipv6_test_addr); 856 } 857 858 // Works, receiving socket sees 127.0.0.2. 859 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CanConnectFromMappedIPv6ToIPv4Any)) { 860 CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0), 861 SocketAddress("0.0.0.0", 5000), 862 true); 863 } 864 865 // Fails. 866 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CantConnectFromUnMappedIPv6ToIPv4Any)) { 867 CrossFamilyConnectionTest(SocketAddress("::2", 0), 868 SocketAddress("0.0.0.0", 5000), 869 false); 870 } 871 872 // Fails. 873 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CantConnectFromUnMappedIPv6ToMappedIPv6)) { 874 CrossFamilyConnectionTest(SocketAddress("::2", 0), 875 SocketAddress("::ffff:127.0.0.1", 5000), 876 false); 877 } 878 879 // Works. receiving socket sees ::ffff:127.0.0.2. 880 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CanConnectFromIPv4ToIPv6Any)) { 881 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0), 882 SocketAddress("::", 5000), 883 true); 884 } 885 886 // Fails. 887 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CantConnectFromIPv4ToUnMappedIPv6)) { 888 CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0), 889 SocketAddress("::1", 5000), 890 false); 891 } 892 893 // Works. Receiving socket sees ::ffff:127.0.0.1. 894 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CanConnectFromIPv4ToMappedIPv6)) { 895 CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0), 896 SocketAddress("::ffff:127.0.0.2", 5000), 897 true); 898 } 899 900 // Works, receiving socket sees a result from GetNextIP. 901 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CanConnectFromUnboundIPv6ToIPv4Any)) { 902 CrossFamilyConnectionTest(SocketAddress("::", 0), 903 SocketAddress("0.0.0.0", 5000), 904 true); 905 } 906 907 // Works, receiving socket sees whatever GetNextIP gave the client. 908 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CanConnectFromUnboundIPv4ToIPv6Any)) { 909 CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0), 910 SocketAddress("::", 5000), 911 true); 912 } 913 914 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CanSendDatagramFromUnboundIPv4ToIPv6Any)) { 915 CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0), 916 SocketAddress("::", 5000), 917 true); 918 } 919 920 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CanSendDatagramFromMappedIPv6ToIPv4Any)) { 921 CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0), 922 SocketAddress("0.0.0.0", 5000), 923 true); 924 } 925 926 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CantSendDatagramFromUnMappedIPv6ToIPv4Any)) { 927 CrossFamilyDatagramTest(SocketAddress("::2", 0), 928 SocketAddress("0.0.0.0", 5000), 929 false); 930 } 931 932 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CantSendDatagramFromUnMappedIPv6ToMappedIPv6)) { 933 CrossFamilyDatagramTest(SocketAddress("::2", 0), 934 SocketAddress("::ffff:127.0.0.1", 5000), 935 false); 936 } 937 938 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CanSendDatagramFromIPv4ToIPv6Any)) { 939 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0), 940 SocketAddress("::", 5000), 941 true); 942 } 943 944 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CantSendDatagramFromIPv4ToUnMappedIPv6)) { 945 CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0), 946 SocketAddress("::1", 5000), 947 false); 948 } 949 950 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CanSendDatagramFromIPv4ToMappedIPv6)) { 951 CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0), 952 SocketAddress("::ffff:127.0.0.2", 5000), 953 true); 954 } 955 956 TEST_F(VirtualSocketServerTest, DISABLED_ON_MAC(CanSendDatagramFromUnboundIPv6ToIPv4Any)) { 957 CrossFamilyDatagramTest(SocketAddress("::", 0), 958 SocketAddress("0.0.0.0", 5000), 959 true); 960 } 961 962 TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) { 963 const uint32 kTestMean[] = { 10, 100, 333, 1000 }; 964 const double kTestDev[] = { 0.25, 0.1, 0.01 }; 965 // TODO: The current code only works for 1000 data points or more. 966 const uint32 kTestSamples[] = { /*10, 100,*/ 1000 }; 967 for (size_t midx = 0; midx < ARRAY_SIZE(kTestMean); ++midx) { 968 for (size_t didx = 0; didx < ARRAY_SIZE(kTestDev); ++didx) { 969 for (size_t sidx = 0; sidx < ARRAY_SIZE(kTestSamples); ++sidx) { 970 ASSERT_LT(0u, kTestSamples[sidx]); 971 const uint32 kStdDev = 972 static_cast<uint32>(kTestDev[didx] * kTestMean[midx]); 973 VirtualSocketServer::Function* f = 974 VirtualSocketServer::CreateDistribution(kTestMean[midx], 975 kStdDev, 976 kTestSamples[sidx]); 977 ASSERT_TRUE(NULL != f); 978 ASSERT_EQ(kTestSamples[sidx], f->size()); 979 double sum = 0; 980 for (uint32 i = 0; i < f->size(); ++i) { 981 sum += (*f)[i].second; 982 } 983 const double mean = sum / f->size(); 984 double sum_sq_dev = 0; 985 for (uint32 i = 0; i < f->size(); ++i) { 986 double dev = (*f)[i].second - mean; 987 sum_sq_dev += dev * dev; 988 } 989 const double stddev = sqrt(sum_sq_dev / f->size()); 990 EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx]) 991 << "M=" << kTestMean[midx] 992 << " SD=" << kStdDev 993 << " N=" << kTestSamples[sidx]; 994 EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev) 995 << "M=" << kTestMean[midx] 996 << " SD=" << kStdDev 997 << " N=" << kTestSamples[sidx]; 998 delete f; 999 } 1000 } 1001 } 1002 } 1003