1 /* 2 * Copyright 2012 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 #if defined(WEBRTC_POSIX) 11 #include <dirent.h> 12 #endif 13 14 #include "webrtc/p2p/base/basicpacketsocketfactory.h" 15 #include "webrtc/p2p/base/constants.h" 16 #include "webrtc/p2p/base/portallocator.h" 17 #include "webrtc/p2p/base/tcpport.h" 18 #include "webrtc/p2p/base/testturnserver.h" 19 #include "webrtc/p2p/base/turnport.h" 20 #include "webrtc/p2p/base/udpport.h" 21 #include "webrtc/base/asynctcpsocket.h" 22 #include "webrtc/base/buffer.h" 23 #include "webrtc/base/dscp.h" 24 #include "webrtc/base/firewallsocketserver.h" 25 #include "webrtc/base/gunit.h" 26 #include "webrtc/base/helpers.h" 27 #include "webrtc/base/logging.h" 28 #include "webrtc/base/physicalsocketserver.h" 29 #include "webrtc/base/scoped_ptr.h" 30 #include "webrtc/base/socketaddress.h" 31 #include "webrtc/base/ssladapter.h" 32 #include "webrtc/base/thread.h" 33 #include "webrtc/base/virtualsocketserver.h" 34 35 using rtc::SocketAddress; 36 using cricket::Connection; 37 using cricket::Port; 38 using cricket::PortInterface; 39 using cricket::TurnPort; 40 using cricket::UDPPort; 41 42 static const SocketAddress kLocalAddr1("11.11.11.11", 0); 43 static const SocketAddress kLocalAddr2("22.22.22.22", 0); 44 static const SocketAddress kLocalIPv6Addr( 45 "2401:fa00:4:1000:be30:5bff:fee5:c3", 0); 46 static const SocketAddress kTurnUdpIntAddr("99.99.99.3", 47 cricket::TURN_SERVER_PORT); 48 static const SocketAddress kTurnTcpIntAddr("99.99.99.4", 49 cricket::TURN_SERVER_PORT); 50 static const SocketAddress kTurnUdpExtAddr("99.99.99.5", 0); 51 static const SocketAddress kTurnAlternateIntAddr("99.99.99.6", 52 cricket::TURN_SERVER_PORT); 53 static const SocketAddress kTurnIntAddr("99.99.99.7", 54 cricket::TURN_SERVER_PORT); 55 static const SocketAddress kTurnIPv6IntAddr( 56 "2400:4030:2:2c00:be30:abcd:efab:cdef", 57 cricket::TURN_SERVER_PORT); 58 static const SocketAddress kTurnUdpIPv6IntAddr( 59 "2400:4030:1:2c00:be30:abcd:efab:cdef", cricket::TURN_SERVER_PORT); 60 static const SocketAddress kTurnUdpIPv6ExtAddr( 61 "2620:0:1000:1b03:2e41:38ff:fea6:f2a4", 0); 62 63 static const char kIceUfrag1[] = "TESTICEUFRAG0001"; 64 static const char kIceUfrag2[] = "TESTICEUFRAG0002"; 65 static const char kIcePwd1[] = "TESTICEPWD00000000000001"; 66 static const char kIcePwd2[] = "TESTICEPWD00000000000002"; 67 static const char kTurnUsername[] = "test"; 68 static const char kTurnPassword[] = "test"; 69 static const char kTestOrigin[] = "http://example.com"; 70 static const unsigned int kTimeout = 1000; 71 72 static const cricket::ProtocolAddress kTurnUdpProtoAddr( 73 kTurnUdpIntAddr, cricket::PROTO_UDP); 74 static const cricket::ProtocolAddress kTurnTcpProtoAddr( 75 kTurnTcpIntAddr, cricket::PROTO_TCP); 76 static const cricket::ProtocolAddress kTurnUdpIPv6ProtoAddr( 77 kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); 78 79 static const unsigned int MSG_TESTFINISH = 0; 80 81 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) 82 static int GetFDCount() { 83 struct dirent *dp; 84 int fd_count = 0; 85 DIR *dir = opendir("/proc/self/fd/"); 86 while ((dp = readdir(dir)) != NULL) { 87 if (dp->d_name[0] == '.') 88 continue; 89 ++fd_count; 90 } 91 closedir(dir); 92 return fd_count; 93 } 94 #endif 95 96 class TurnPortTestVirtualSocketServer : public rtc::VirtualSocketServer { 97 public: 98 explicit TurnPortTestVirtualSocketServer(SocketServer* ss) 99 : VirtualSocketServer(ss) {} 100 101 using rtc::VirtualSocketServer::LookupBinding; 102 }; 103 104 class TestConnectionWrapper : public sigslot::has_slots<> { 105 public: 106 TestConnectionWrapper(Connection* conn) : connection_(conn) { 107 conn->SignalDestroyed.connect( 108 this, &TestConnectionWrapper::OnConnectionDestroyed); 109 } 110 111 Connection* connection() { return connection_; } 112 113 private: 114 void OnConnectionDestroyed(Connection* conn) { 115 ASSERT_TRUE(conn == connection_); 116 connection_ = nullptr; 117 } 118 119 Connection* connection_; 120 }; 121 122 class TurnPortTest : public testing::Test, 123 public sigslot::has_slots<>, 124 public rtc::MessageHandler { 125 public: 126 TurnPortTest() 127 : main_(rtc::Thread::Current()), 128 pss_(new rtc::PhysicalSocketServer), 129 ss_(new TurnPortTestVirtualSocketServer(pss_.get())), 130 ss_scope_(ss_.get()), 131 network_("unittest", "unittest", rtc::IPAddress(INADDR_ANY), 32), 132 socket_factory_(rtc::Thread::Current()), 133 turn_server_(main_, kTurnUdpIntAddr, kTurnUdpExtAddr), 134 turn_ready_(false), 135 turn_error_(false), 136 turn_unknown_address_(false), 137 turn_create_permission_success_(false), 138 udp_ready_(false), 139 test_finish_(false) { 140 network_.AddIP(rtc::IPAddress(INADDR_ANY)); 141 } 142 143 virtual void OnMessage(rtc::Message* msg) { 144 ASSERT(msg->message_id == MSG_TESTFINISH); 145 if (msg->message_id == MSG_TESTFINISH) 146 test_finish_ = true; 147 } 148 149 void ConnectSignalAddressReadyToSetLocalhostAsAltenertativeLocalAddress() { 150 rtc::AsyncPacketSocket* socket = turn_port_->socket(); 151 rtc::VirtualSocket* virtual_socket = 152 ss_->LookupBinding(socket->GetLocalAddress()); 153 virtual_socket->SignalAddressReady.connect( 154 this, &TurnPortTest::SetLocalhostAsAltenertativeLocalAddress); 155 } 156 157 void SetLocalhostAsAltenertativeLocalAddress( 158 rtc::VirtualSocket* socket, 159 const rtc::SocketAddress& address) { 160 SocketAddress local_address("127.0.0.1", 2000); 161 socket->SetAlternativeLocalAddress(local_address); 162 } 163 164 void OnTurnPortComplete(Port* port) { 165 turn_ready_ = true; 166 } 167 void OnTurnPortError(Port* port) { 168 turn_error_ = true; 169 } 170 void OnTurnUnknownAddress(PortInterface* port, const SocketAddress& addr, 171 cricket::ProtocolType proto, 172 cricket::IceMessage* msg, const std::string& rf, 173 bool /*port_muxed*/) { 174 turn_unknown_address_ = true; 175 } 176 void OnTurnCreatePermissionResult(TurnPort* port, 177 const SocketAddress& addr, 178 int code) { 179 // Ignoring the address. 180 turn_create_permission_success_ = (code == 0); 181 } 182 183 void OnTurnRefreshResult(TurnPort* port, int code) { 184 turn_refresh_success_ = (code == 0); 185 } 186 void OnTurnReadPacket(Connection* conn, const char* data, size_t size, 187 const rtc::PacketTime& packet_time) { 188 turn_packets_.push_back(rtc::Buffer(data, size)); 189 } 190 void OnUdpPortComplete(Port* port) { 191 udp_ready_ = true; 192 } 193 void OnUdpReadPacket(Connection* conn, const char* data, size_t size, 194 const rtc::PacketTime& packet_time) { 195 udp_packets_.push_back(rtc::Buffer(data, size)); 196 } 197 void OnConnectionDestroyed(Connection* conn) { connection_destroyed_ = true; } 198 void OnSocketReadPacket(rtc::AsyncPacketSocket* socket, 199 const char* data, size_t size, 200 const rtc::SocketAddress& remote_addr, 201 const rtc::PacketTime& packet_time) { 202 turn_port_->HandleIncomingPacket(socket, data, size, remote_addr, 203 packet_time); 204 } 205 rtc::AsyncSocket* CreateServerSocket(const SocketAddress addr) { 206 rtc::AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_STREAM); 207 EXPECT_GE(socket->Bind(addr), 0); 208 EXPECT_GE(socket->Listen(5), 0); 209 return socket; 210 } 211 212 void CreateTurnPort(const std::string& username, 213 const std::string& password, 214 const cricket::ProtocolAddress& server_address) { 215 CreateTurnPort(kLocalAddr1, username, password, server_address); 216 } 217 void CreateTurnPort(const rtc::SocketAddress& local_address, 218 const std::string& username, 219 const std::string& password, 220 const cricket::ProtocolAddress& server_address) { 221 cricket::RelayCredentials credentials(username, password); 222 turn_port_.reset(TurnPort::Create(main_, &socket_factory_, &network_, 223 local_address.ipaddr(), 0, 0, 224 kIceUfrag1, kIcePwd1, 225 server_address, credentials, 0, 226 std::string())); 227 // This TURN port will be the controlling. 228 turn_port_->SetIceRole(cricket::ICEROLE_CONTROLLING); 229 ConnectSignals(); 230 } 231 232 // Should be identical to CreateTurnPort but specifies an origin value 233 // when creating the instance of TurnPort. 234 void CreateTurnPortWithOrigin(const rtc::SocketAddress& local_address, 235 const std::string& username, 236 const std::string& password, 237 const cricket::ProtocolAddress& server_address, 238 const std::string& origin) { 239 cricket::RelayCredentials credentials(username, password); 240 turn_port_.reset(TurnPort::Create(main_, &socket_factory_, &network_, 241 local_address.ipaddr(), 0, 0, 242 kIceUfrag1, kIcePwd1, 243 server_address, credentials, 0, 244 origin)); 245 // This TURN port will be the controlling. 246 turn_port_->SetIceRole(cricket::ICEROLE_CONTROLLING); 247 ConnectSignals(); 248 } 249 250 void CreateSharedTurnPort(const std::string& username, 251 const std::string& password, 252 const cricket::ProtocolAddress& server_address) { 253 ASSERT(server_address.proto == cricket::PROTO_UDP); 254 255 if (!socket_) { 256 socket_.reset(socket_factory_.CreateUdpSocket( 257 rtc::SocketAddress(kLocalAddr1.ipaddr(), 0), 0, 0)); 258 ASSERT_TRUE(socket_ != NULL); 259 socket_->SignalReadPacket.connect( 260 this, &TurnPortTest::OnSocketReadPacket); 261 } 262 263 cricket::RelayCredentials credentials(username, password); 264 turn_port_.reset(cricket::TurnPort::Create( 265 main_, &socket_factory_, &network_, socket_.get(), 266 kIceUfrag1, kIcePwd1, server_address, credentials, 0, std::string())); 267 // This TURN port will be the controlling. 268 turn_port_->SetIceRole(cricket::ICEROLE_CONTROLLING); 269 ConnectSignals(); 270 } 271 272 void ConnectSignals() { 273 turn_port_->SignalPortComplete.connect(this, 274 &TurnPortTest::OnTurnPortComplete); 275 turn_port_->SignalPortError.connect(this, 276 &TurnPortTest::OnTurnPortError); 277 turn_port_->SignalUnknownAddress.connect(this, 278 &TurnPortTest::OnTurnUnknownAddress); 279 turn_port_->SignalCreatePermissionResult.connect(this, 280 &TurnPortTest::OnTurnCreatePermissionResult); 281 turn_port_->SignalTurnRefreshResult.connect( 282 this, &TurnPortTest::OnTurnRefreshResult); 283 } 284 void ConnectConnectionDestroyedSignal(Connection* conn) { 285 conn->SignalDestroyed.connect(this, &TurnPortTest::OnConnectionDestroyed); 286 } 287 288 void CreateUdpPort() { CreateUdpPort(kLocalAddr2); } 289 290 void CreateUdpPort(const SocketAddress& address) { 291 udp_port_.reset(UDPPort::Create(main_, &socket_factory_, &network_, 292 address.ipaddr(), 0, 0, kIceUfrag2, 293 kIcePwd2, std::string(), false)); 294 // UDP port will be controlled. 295 udp_port_->SetIceRole(cricket::ICEROLE_CONTROLLED); 296 udp_port_->SignalPortComplete.connect( 297 this, &TurnPortTest::OnUdpPortComplete); 298 } 299 300 void PrepareTurnAndUdpPorts() { 301 // turn_port_ should have been created. 302 ASSERT_TRUE(turn_port_ != nullptr); 303 turn_port_->PrepareAddress(); 304 ASSERT_TRUE_WAIT(turn_ready_, kTimeout); 305 306 CreateUdpPort(); 307 udp_port_->PrepareAddress(); 308 ASSERT_TRUE_WAIT(udp_ready_, kTimeout); 309 } 310 311 bool CheckConnectionDestroyed() { 312 turn_port_->FlushRequests(cricket::kAllRequests); 313 rtc::Thread::Current()->ProcessMessages(50); 314 return connection_destroyed_; 315 } 316 317 void TestTurnAlternateServer(cricket::ProtocolType protocol_type) { 318 std::vector<rtc::SocketAddress> redirect_addresses; 319 redirect_addresses.push_back(kTurnAlternateIntAddr); 320 321 cricket::TestTurnRedirector redirector(redirect_addresses); 322 323 turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); 324 turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type); 325 turn_server_.set_redirect_hook(&redirector); 326 CreateTurnPort(kTurnUsername, kTurnPassword, 327 cricket::ProtocolAddress(kTurnIntAddr, protocol_type)); 328 329 // Retrieve the address before we run the state machine. 330 const SocketAddress old_addr = turn_port_->server_address().address; 331 332 turn_port_->PrepareAddress(); 333 EXPECT_TRUE_WAIT(turn_ready_, kTimeout * 100); 334 // Retrieve the address again, the turn port's address should be 335 // changed. 336 const SocketAddress new_addr = turn_port_->server_address().address; 337 EXPECT_NE(old_addr, new_addr); 338 ASSERT_EQ(1U, turn_port_->Candidates().size()); 339 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), 340 turn_port_->Candidates()[0].address().ipaddr()); 341 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); 342 } 343 344 void TestTurnAlternateServerV4toV6(cricket::ProtocolType protocol_type) { 345 std::vector<rtc::SocketAddress> redirect_addresses; 346 redirect_addresses.push_back(kTurnIPv6IntAddr); 347 348 cricket::TestTurnRedirector redirector(redirect_addresses); 349 turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); 350 turn_server_.set_redirect_hook(&redirector); 351 CreateTurnPort(kTurnUsername, kTurnPassword, 352 cricket::ProtocolAddress(kTurnIntAddr, protocol_type)); 353 turn_port_->PrepareAddress(); 354 EXPECT_TRUE_WAIT(turn_error_, kTimeout); 355 } 356 357 void TestTurnAlternateServerPingPong(cricket::ProtocolType protocol_type) { 358 std::vector<rtc::SocketAddress> redirect_addresses; 359 redirect_addresses.push_back(kTurnAlternateIntAddr); 360 redirect_addresses.push_back(kTurnIntAddr); 361 362 cricket::TestTurnRedirector redirector(redirect_addresses); 363 364 turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); 365 turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type); 366 turn_server_.set_redirect_hook(&redirector); 367 CreateTurnPort(kTurnUsername, kTurnPassword, 368 cricket::ProtocolAddress(kTurnIntAddr, protocol_type)); 369 370 turn_port_->PrepareAddress(); 371 EXPECT_TRUE_WAIT(turn_error_, kTimeout); 372 ASSERT_EQ(0U, turn_port_->Candidates().size()); 373 rtc::SocketAddress address; 374 // Verify that we have exhausted all alternate servers instead of 375 // failure caused by other errors. 376 EXPECT_FALSE(redirector.ShouldRedirect(address, &address)); 377 } 378 379 void TestTurnAlternateServerDetectRepetition( 380 cricket::ProtocolType protocol_type) { 381 std::vector<rtc::SocketAddress> redirect_addresses; 382 redirect_addresses.push_back(kTurnAlternateIntAddr); 383 redirect_addresses.push_back(kTurnAlternateIntAddr); 384 385 cricket::TestTurnRedirector redirector(redirect_addresses); 386 387 turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type); 388 turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type); 389 turn_server_.set_redirect_hook(&redirector); 390 CreateTurnPort(kTurnUsername, kTurnPassword, 391 cricket::ProtocolAddress(kTurnIntAddr, protocol_type)); 392 393 turn_port_->PrepareAddress(); 394 EXPECT_TRUE_WAIT(turn_error_, kTimeout); 395 ASSERT_EQ(0U, turn_port_->Candidates().size()); 396 } 397 398 void TestTurnConnection() { 399 // Create ports and prepare addresses. 400 PrepareTurnAndUdpPorts(); 401 402 // Send ping from UDP to TURN. 403 Connection* conn1 = udp_port_->CreateConnection( 404 turn_port_->Candidates()[0], Port::ORIGIN_MESSAGE); 405 ASSERT_TRUE(conn1 != NULL); 406 conn1->Ping(0); 407 WAIT(!turn_unknown_address_, kTimeout); 408 EXPECT_FALSE(turn_unknown_address_); 409 EXPECT_FALSE(conn1->receiving()); 410 EXPECT_EQ(Connection::STATE_WRITE_INIT, conn1->write_state()); 411 412 // Send ping from TURN to UDP. 413 Connection* conn2 = turn_port_->CreateConnection( 414 udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE); 415 ASSERT_TRUE(conn2 != NULL); 416 ASSERT_TRUE_WAIT(turn_create_permission_success_, kTimeout); 417 conn2->Ping(0); 418 419 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), kTimeout); 420 EXPECT_TRUE(conn1->receiving()); 421 EXPECT_TRUE(conn2->receiving()); 422 EXPECT_EQ(Connection::STATE_WRITE_INIT, conn1->write_state()); 423 424 // Send another ping from UDP to TURN. 425 conn1->Ping(0); 426 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), kTimeout); 427 EXPECT_TRUE(conn2->receiving()); 428 } 429 430 void TestDestroyTurnConnection() { 431 PrepareTurnAndUdpPorts(); 432 433 // Create connections on both ends. 434 Connection* conn1 = udp_port_->CreateConnection(turn_port_->Candidates()[0], 435 Port::ORIGIN_MESSAGE); 436 Connection* conn2 = turn_port_->CreateConnection(udp_port_->Candidates()[0], 437 Port::ORIGIN_MESSAGE); 438 ASSERT_TRUE(conn2 != NULL); 439 ASSERT_TRUE_WAIT(turn_create_permission_success_, kTimeout); 440 // Make sure turn connection can receive. 441 conn1->Ping(0); 442 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), kTimeout); 443 EXPECT_FALSE(turn_unknown_address_); 444 445 // Destroy the connection on the turn port. The TurnEntry is still 446 // there. So the turn port gets ping from unknown address if it is pinged. 447 conn2->Destroy(); 448 conn1->Ping(0); 449 EXPECT_TRUE_WAIT(turn_unknown_address_, kTimeout); 450 451 // Flush all requests in the invoker to destroy the TurnEntry. 452 // Now the turn port cannot receive the ping. 453 turn_unknown_address_ = false; 454 turn_port_->invoker()->Flush(rtc::Thread::Current()); 455 conn1->Ping(0); 456 rtc::Thread::Current()->ProcessMessages(500); 457 EXPECT_FALSE(turn_unknown_address_); 458 459 // If the connection is created again, it will start to receive pings. 460 conn2 = turn_port_->CreateConnection(udp_port_->Candidates()[0], 461 Port::ORIGIN_MESSAGE); 462 conn1->Ping(0); 463 EXPECT_TRUE_WAIT(conn2->receiving(), kTimeout); 464 EXPECT_FALSE(turn_unknown_address_); 465 } 466 467 void TestTurnSendData() { 468 PrepareTurnAndUdpPorts(); 469 470 // Create connections and send pings. 471 Connection* conn1 = turn_port_->CreateConnection( 472 udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE); 473 Connection* conn2 = udp_port_->CreateConnection( 474 turn_port_->Candidates()[0], Port::ORIGIN_MESSAGE); 475 ASSERT_TRUE(conn1 != NULL); 476 ASSERT_TRUE(conn2 != NULL); 477 conn1->SignalReadPacket.connect(static_cast<TurnPortTest*>(this), 478 &TurnPortTest::OnTurnReadPacket); 479 conn2->SignalReadPacket.connect(static_cast<TurnPortTest*>(this), 480 &TurnPortTest::OnUdpReadPacket); 481 conn1->Ping(0); 482 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn1->write_state(), kTimeout); 483 conn2->Ping(0); 484 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, conn2->write_state(), kTimeout); 485 486 // Send some data. 487 size_t num_packets = 256; 488 for (size_t i = 0; i < num_packets; ++i) { 489 unsigned char buf[256] = { 0 }; 490 for (size_t j = 0; j < i + 1; ++j) { 491 buf[j] = 0xFF - static_cast<unsigned char>(j); 492 } 493 conn1->Send(buf, i + 1, options); 494 conn2->Send(buf, i + 1, options); 495 main_->ProcessMessages(0); 496 } 497 498 // Check the data. 499 ASSERT_EQ_WAIT(num_packets, turn_packets_.size(), kTimeout); 500 ASSERT_EQ_WAIT(num_packets, udp_packets_.size(), kTimeout); 501 for (size_t i = 0; i < num_packets; ++i) { 502 EXPECT_EQ(i + 1, turn_packets_[i].size()); 503 EXPECT_EQ(i + 1, udp_packets_[i].size()); 504 EXPECT_EQ(turn_packets_[i], udp_packets_[i]); 505 } 506 } 507 508 protected: 509 rtc::Thread* main_; 510 rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_; 511 rtc::scoped_ptr<TurnPortTestVirtualSocketServer> ss_; 512 rtc::SocketServerScope ss_scope_; 513 rtc::Network network_; 514 rtc::BasicPacketSocketFactory socket_factory_; 515 rtc::scoped_ptr<rtc::AsyncPacketSocket> socket_; 516 cricket::TestTurnServer turn_server_; 517 rtc::scoped_ptr<TurnPort> turn_port_; 518 rtc::scoped_ptr<UDPPort> udp_port_; 519 bool turn_ready_; 520 bool turn_error_; 521 bool turn_unknown_address_; 522 bool turn_create_permission_success_; 523 bool udp_ready_; 524 bool test_finish_; 525 bool turn_refresh_success_ = false; 526 bool connection_destroyed_ = false; 527 std::vector<rtc::Buffer> turn_packets_; 528 std::vector<rtc::Buffer> udp_packets_; 529 rtc::PacketOptions options; 530 }; 531 532 // Do a normal TURN allocation. 533 TEST_F(TurnPortTest, TestTurnAllocate) { 534 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 535 EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10*1024)); 536 turn_port_->PrepareAddress(); 537 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); 538 ASSERT_EQ(1U, turn_port_->Candidates().size()); 539 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), 540 turn_port_->Candidates()[0].address().ipaddr()); 541 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); 542 } 543 544 // Testing a normal UDP allocation using TCP connection. 545 TEST_F(TurnPortTest, TestTurnTcpAllocate) { 546 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); 547 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); 548 EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10*1024)); 549 turn_port_->PrepareAddress(); 550 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); 551 ASSERT_EQ(1U, turn_port_->Candidates().size()); 552 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), 553 turn_port_->Candidates()[0].address().ipaddr()); 554 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); 555 } 556 557 // Test case for WebRTC issue 3927 where a proxy binds to the local host address 558 // instead the address that TurnPort originally bound to. The candidate pair 559 // impacted by this behavior should still be used. 560 TEST_F(TurnPortTest, TestTurnTcpAllocationWhenProxyChangesAddressToLocalHost) { 561 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); 562 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); 563 EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10 * 1024)); 564 turn_port_->PrepareAddress(); 565 ConnectSignalAddressReadyToSetLocalhostAsAltenertativeLocalAddress(); 566 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); 567 ASSERT_EQ(1U, turn_port_->Candidates().size()); 568 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), 569 turn_port_->Candidates()[0].address().ipaddr()); 570 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); 571 } 572 573 // Testing turn port will attempt to create TCP socket on address resolution 574 // failure. 575 TEST_F(TurnPortTest, DISABLED_TestTurnTcpOnAddressResolveFailure) { 576 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); 577 CreateTurnPort(kTurnUsername, kTurnPassword, cricket::ProtocolAddress( 578 rtc::SocketAddress("www.webrtc-blah-blah.com", 3478), 579 cricket::PROTO_TCP)); 580 turn_port_->PrepareAddress(); 581 EXPECT_TRUE_WAIT(turn_error_, kTimeout); 582 // As VSS doesn't provide a DNS resolution, name resolve will fail. TurnPort 583 // will proceed in creating a TCP socket which will fail as there is no 584 // server on the above domain and error will be set to SOCKET_ERROR. 585 EXPECT_EQ(SOCKET_ERROR, turn_port_->error()); 586 } 587 588 // In case of UDP on address resolve failure, TurnPort will not create socket 589 // and return allocate failure. 590 TEST_F(TurnPortTest, DISABLED_TestTurnUdpOnAdressResolveFailure) { 591 CreateTurnPort(kTurnUsername, kTurnPassword, cricket::ProtocolAddress( 592 rtc::SocketAddress("www.webrtc-blah-blah.com", 3478), 593 cricket::PROTO_UDP)); 594 turn_port_->PrepareAddress(); 595 EXPECT_TRUE_WAIT(turn_error_, kTimeout); 596 // Error from turn port will not be socket error. 597 EXPECT_NE(SOCKET_ERROR, turn_port_->error()); 598 } 599 600 // Try to do a TURN allocation with an invalid password. 601 TEST_F(TurnPortTest, TestTurnAllocateBadPassword) { 602 CreateTurnPort(kTurnUsername, "bad", kTurnUdpProtoAddr); 603 turn_port_->PrepareAddress(); 604 EXPECT_TRUE_WAIT(turn_error_, kTimeout); 605 ASSERT_EQ(0U, turn_port_->Candidates().size()); 606 } 607 608 // Tests that a new local address is created after 609 // STUN_ERROR_ALLOCATION_MISMATCH. 610 TEST_F(TurnPortTest, TestTurnAllocateMismatch) { 611 // Do a normal allocation first. 612 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 613 turn_port_->PrepareAddress(); 614 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); 615 rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); 616 617 // Clear connected_ flag on turnport to suppress the release of 618 // the allocation. 619 turn_port_->OnSocketClose(turn_port_->socket(), 0); 620 621 // Forces the socket server to assign the same port. 622 ss_->SetNextPortForTesting(first_addr.port()); 623 624 turn_ready_ = false; 625 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 626 turn_port_->PrepareAddress(); 627 628 // Verifies that the new port has the same address. 629 EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress()); 630 631 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); 632 633 // Verifies that the new port has a different address now. 634 EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress()); 635 } 636 637 // Tests that a shared-socket-TurnPort creates its own socket after 638 // STUN_ERROR_ALLOCATION_MISMATCH. 639 TEST_F(TurnPortTest, TestSharedSocketAllocateMismatch) { 640 // Do a normal allocation first. 641 CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 642 turn_port_->PrepareAddress(); 643 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); 644 rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); 645 646 // Clear connected_ flag on turnport to suppress the release of 647 // the allocation. 648 turn_port_->OnSocketClose(turn_port_->socket(), 0); 649 650 turn_ready_ = false; 651 CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 652 653 // Verifies that the new port has the same address. 654 EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress()); 655 EXPECT_TRUE(turn_port_->SharedSocket()); 656 657 turn_port_->PrepareAddress(); 658 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); 659 660 // Verifies that the new port has a different address now. 661 EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress()); 662 EXPECT_FALSE(turn_port_->SharedSocket()); 663 } 664 665 TEST_F(TurnPortTest, TestTurnTcpAllocateMismatch) { 666 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); 667 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); 668 669 // Do a normal allocation first. 670 turn_port_->PrepareAddress(); 671 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); 672 rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress()); 673 674 // Clear connected_ flag on turnport to suppress the release of 675 // the allocation. 676 turn_port_->OnSocketClose(turn_port_->socket(), 0); 677 678 // Forces the socket server to assign the same port. 679 ss_->SetNextPortForTesting(first_addr.port()); 680 681 turn_ready_ = false; 682 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); 683 turn_port_->PrepareAddress(); 684 685 // Verifies that the new port has the same address. 686 EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress()); 687 688 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); 689 690 // Verifies that the new port has a different address now. 691 EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress()); 692 } 693 694 TEST_F(TurnPortTest, TestRefreshRequestGetsErrorResponse) { 695 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 696 PrepareTurnAndUdpPorts(); 697 turn_port_->CreateConnection(udp_port_->Candidates()[0], 698 Port::ORIGIN_MESSAGE); 699 // Set bad credentials. 700 cricket::RelayCredentials bad_credentials("bad_user", "bad_pwd"); 701 turn_port_->set_credentials(bad_credentials); 702 turn_refresh_success_ = false; 703 // This sends out the first RefreshRequest with correct credentials. 704 // When this succeeds, it will schedule a new RefreshRequest with the bad 705 // credential. 706 turn_port_->FlushRequests(cricket::TURN_REFRESH_REQUEST); 707 EXPECT_TRUE_WAIT(turn_refresh_success_, kTimeout); 708 // Flush it again, it will receive a bad response. 709 turn_port_->FlushRequests(cricket::TURN_REFRESH_REQUEST); 710 EXPECT_TRUE_WAIT(!turn_refresh_success_, kTimeout); 711 EXPECT_TRUE_WAIT(!turn_port_->connected(), kTimeout); 712 EXPECT_TRUE_WAIT(turn_port_->connections().empty(), kTimeout); 713 EXPECT_FALSE(turn_port_->HasRequests()); 714 } 715 716 // Test that CreateConnection will return null if port becomes disconnected. 717 TEST_F(TurnPortTest, TestCreateConnectionWhenSocketClosed) { 718 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); 719 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); 720 PrepareTurnAndUdpPorts(); 721 // Create a connection. 722 Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], 723 Port::ORIGIN_MESSAGE); 724 ASSERT_TRUE(conn1 != NULL); 725 726 // Close the socket and create a connection again. 727 turn_port_->OnSocketClose(turn_port_->socket(), 1); 728 conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], 729 Port::ORIGIN_MESSAGE); 730 ASSERT_TRUE(conn1 == NULL); 731 } 732 733 // Test try-alternate-server feature. 734 TEST_F(TurnPortTest, TestTurnAlternateServerUDP) { 735 TestTurnAlternateServer(cricket::PROTO_UDP); 736 } 737 738 TEST_F(TurnPortTest, TestTurnAlternateServerTCP) { 739 TestTurnAlternateServer(cricket::PROTO_TCP); 740 } 741 742 // Test that we fail when we redirect to an address different from 743 // current IP family. 744 TEST_F(TurnPortTest, TestTurnAlternateServerV4toV6UDP) { 745 TestTurnAlternateServerV4toV6(cricket::PROTO_UDP); 746 } 747 748 TEST_F(TurnPortTest, TestTurnAlternateServerV4toV6TCP) { 749 TestTurnAlternateServerV4toV6(cricket::PROTO_TCP); 750 } 751 752 // Test try-alternate-server catches the case of pingpong. 753 TEST_F(TurnPortTest, TestTurnAlternateServerPingPongUDP) { 754 TestTurnAlternateServerPingPong(cricket::PROTO_UDP); 755 } 756 757 TEST_F(TurnPortTest, TestTurnAlternateServerPingPongTCP) { 758 TestTurnAlternateServerPingPong(cricket::PROTO_TCP); 759 } 760 761 // Test try-alternate-server catch the case of repeated server. 762 TEST_F(TurnPortTest, TestTurnAlternateServerDetectRepetitionUDP) { 763 TestTurnAlternateServerDetectRepetition(cricket::PROTO_UDP); 764 } 765 766 TEST_F(TurnPortTest, TestTurnAlternateServerDetectRepetitionTCP) { 767 TestTurnAlternateServerDetectRepetition(cricket::PROTO_TCP); 768 } 769 770 // Do a TURN allocation and try to send a packet to it from the outside. 771 // The packet should be dropped. Then, try to send a packet from TURN to the 772 // outside. It should reach its destination. Finally, try again from the 773 // outside. It should now work as well. 774 TEST_F(TurnPortTest, TestTurnConnection) { 775 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 776 TestTurnConnection(); 777 } 778 779 // Similar to above, except that this test will use the shared socket. 780 TEST_F(TurnPortTest, TestTurnConnectionUsingSharedSocket) { 781 CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 782 TestTurnConnection(); 783 } 784 785 // Test that we can establish a TCP connection with TURN server. 786 TEST_F(TurnPortTest, TestTurnTcpConnection) { 787 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); 788 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); 789 TestTurnConnection(); 790 } 791 792 // Test that if a connection on a TURN port is destroyed, the TURN port can 793 // still receive ping on that connection as if it is from an unknown address. 794 // If the connection is created again, it will be used to receive ping. 795 TEST_F(TurnPortTest, TestDestroyTurnConnection) { 796 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 797 TestDestroyTurnConnection(); 798 } 799 800 // Similar to above, except that this test will use the shared socket. 801 TEST_F(TurnPortTest, TestDestroyTurnConnectionUsingSharedSocket) { 802 CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 803 TestDestroyTurnConnection(); 804 } 805 806 // Test that we fail to create a connection when we want to use TLS over TCP. 807 // This test should be removed once we have TLS support. 808 TEST_F(TurnPortTest, TestTurnTlsTcpConnectionFails) { 809 cricket::ProtocolAddress secure_addr(kTurnTcpProtoAddr.address, 810 kTurnTcpProtoAddr.proto, 811 true); 812 CreateTurnPort(kTurnUsername, kTurnPassword, secure_addr); 813 turn_port_->PrepareAddress(); 814 EXPECT_TRUE_WAIT(turn_error_, kTimeout); 815 ASSERT_EQ(0U, turn_port_->Candidates().size()); 816 } 817 818 // Run TurnConnectionTest with one-time-use nonce feature. 819 // Here server will send a 438 STALE_NONCE error message for 820 // every TURN transaction. 821 TEST_F(TurnPortTest, TestTurnConnectionUsingOTUNonce) { 822 turn_server_.set_enable_otu_nonce(true); 823 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 824 TestTurnConnection(); 825 } 826 827 // Test that CreatePermissionRequest will be scheduled after the success 828 // of the first create permission request and the request will get an 829 // ErrorResponse if the ufrag and pwd are incorrect. 830 TEST_F(TurnPortTest, TestRefreshCreatePermissionRequest) { 831 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 832 PrepareTurnAndUdpPorts(); 833 834 Connection* conn = turn_port_->CreateConnection(udp_port_->Candidates()[0], 835 Port::ORIGIN_MESSAGE); 836 ConnectConnectionDestroyedSignal(conn); 837 ASSERT_TRUE(conn != NULL); 838 ASSERT_TRUE_WAIT(turn_create_permission_success_, kTimeout); 839 turn_create_permission_success_ = false; 840 // A create-permission-request should be pending. 841 // After the next create-permission-response is received, it will schedule 842 // another request with bad_ufrag and bad_pwd. 843 cricket::RelayCredentials bad_credentials("bad_user", "bad_pwd"); 844 turn_port_->set_credentials(bad_credentials); 845 turn_port_->FlushRequests(cricket::kAllRequests); 846 ASSERT_TRUE_WAIT(turn_create_permission_success_, kTimeout); 847 // Flush the requests again; the create-permission-request will fail. 848 turn_port_->FlushRequests(cricket::kAllRequests); 849 EXPECT_TRUE_WAIT(!turn_create_permission_success_, kTimeout); 850 EXPECT_TRUE_WAIT(connection_destroyed_, kTimeout); 851 } 852 853 TEST_F(TurnPortTest, TestChannelBindGetErrorResponse) { 854 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 855 PrepareTurnAndUdpPorts(); 856 Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0], 857 Port::ORIGIN_MESSAGE); 858 ASSERT_TRUE(conn1 != nullptr); 859 Connection* conn2 = udp_port_->CreateConnection(turn_port_->Candidates()[0], 860 Port::ORIGIN_MESSAGE); 861 ASSERT_TRUE(conn2 != nullptr); 862 ConnectConnectionDestroyedSignal(conn1); 863 conn1->Ping(0); 864 ASSERT_TRUE_WAIT(conn1->writable(), kTimeout); 865 866 std::string data = "ABC"; 867 conn1->Send(data.data(), data.length(), options); 868 bool success = 869 turn_port_->SetEntryChannelId(udp_port_->Candidates()[0].address(), -1); 870 ASSERT_TRUE(success); 871 // Next time when the binding request is sent, it will get an ErrorResponse. 872 EXPECT_TRUE_WAIT(CheckConnectionDestroyed(), kTimeout); 873 } 874 875 // Do a TURN allocation, establish a UDP connection, and send some data. 876 TEST_F(TurnPortTest, TestTurnSendDataTurnUdpToUdp) { 877 // Create ports and prepare addresses. 878 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 879 TestTurnSendData(); 880 EXPECT_EQ(cricket::UDP_PROTOCOL_NAME, 881 turn_port_->Candidates()[0].relay_protocol()); 882 } 883 884 // Do a TURN allocation, establish a TCP connection, and send some data. 885 TEST_F(TurnPortTest, TestTurnSendDataTurnTcpToUdp) { 886 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); 887 // Create ports and prepare addresses. 888 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); 889 TestTurnSendData(); 890 EXPECT_EQ(cricket::TCP_PROTOCOL_NAME, 891 turn_port_->Candidates()[0].relay_protocol()); 892 } 893 894 // Test TURN fails to make a connection from IPv6 address to a server which has 895 // IPv4 address. 896 TEST_F(TurnPortTest, TestTurnLocalIPv6AddressServerIPv4) { 897 turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); 898 CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, 899 kTurnUdpProtoAddr); 900 turn_port_->PrepareAddress(); 901 ASSERT_TRUE_WAIT(turn_error_, kTimeout); 902 EXPECT_TRUE(turn_port_->Candidates().empty()); 903 } 904 905 // Test TURN make a connection from IPv6 address to a server which has 906 // IPv6 intenal address. But in this test external address is a IPv4 address, 907 // hence allocated address will be a IPv4 address. 908 TEST_F(TurnPortTest, TestTurnLocalIPv6AddressServerIPv6ExtenalIPv4) { 909 turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); 910 CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, 911 kTurnUdpIPv6ProtoAddr); 912 turn_port_->PrepareAddress(); 913 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); 914 ASSERT_EQ(1U, turn_port_->Candidates().size()); 915 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), 916 turn_port_->Candidates()[0].address().ipaddr()); 917 EXPECT_NE(0, turn_port_->Candidates()[0].address().port()); 918 } 919 920 TEST_F(TurnPortTest, TestOriginHeader) { 921 CreateTurnPortWithOrigin(kLocalAddr1, kTurnUsername, kTurnPassword, 922 kTurnUdpProtoAddr, kTestOrigin); 923 turn_port_->PrepareAddress(); 924 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); 925 ASSERT_GT(turn_server_.server()->allocations().size(), 0U); 926 SocketAddress local_address = turn_port_->GetLocalAddress(); 927 ASSERT_TRUE(turn_server_.FindAllocation(local_address) != NULL); 928 EXPECT_EQ(kTestOrigin, turn_server_.FindAllocation(local_address)->origin()); 929 } 930 931 // Test that a CreatePermission failure will result in the connection being 932 // destroyed. 933 TEST_F(TurnPortTest, TestConnectionDestroyedOnCreatePermissionFailure) { 934 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); 935 turn_server_.server()->set_reject_private_addresses(true); 936 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); 937 turn_port_->PrepareAddress(); 938 ASSERT_TRUE_WAIT(turn_ready_, kTimeout); 939 940 CreateUdpPort(SocketAddress("10.0.0.10", 0)); 941 udp_port_->PrepareAddress(); 942 ASSERT_TRUE_WAIT(udp_ready_, kTimeout); 943 // Create a connection. 944 TestConnectionWrapper conn(turn_port_->CreateConnection( 945 udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE)); 946 ASSERT_TRUE(conn.connection() != nullptr); 947 948 // Asynchronously, CreatePermission request should be sent and fail, closing 949 // the connection. 950 EXPECT_TRUE_WAIT(conn.connection() == nullptr, kTimeout); 951 EXPECT_FALSE(turn_create_permission_success_); 952 } 953 954 // Test that a TURN allocation is released when the port is closed. 955 TEST_F(TurnPortTest, TestTurnReleaseAllocation) { 956 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr); 957 turn_port_->PrepareAddress(); 958 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); 959 960 ASSERT_GT(turn_server_.server()->allocations().size(), 0U); 961 turn_port_.reset(); 962 EXPECT_EQ_WAIT(0U, turn_server_.server()->allocations().size(), kTimeout); 963 } 964 965 // Test that a TURN TCP allocation is released when the port is closed. 966 TEST_F(TurnPortTest, DISABLED_TestTurnTCPReleaseAllocation) { 967 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); 968 CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr); 969 turn_port_->PrepareAddress(); 970 EXPECT_TRUE_WAIT(turn_ready_, kTimeout); 971 972 ASSERT_GT(turn_server_.server()->allocations().size(), 0U); 973 turn_port_.reset(); 974 EXPECT_EQ_WAIT(0U, turn_server_.server()->allocations().size(), kTimeout); 975 } 976 977 // This test verifies any FD's are not leaked after TurnPort is destroyed. 978 // https://code.google.com/p/webrtc/issues/detail?id=2651 979 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) 980 // 1 second is not always enough for getaddrinfo(). 981 // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5191 982 static const unsigned int kResolverTimeout = 10000; 983 984 TEST_F(TurnPortTest, TestResolverShutdown) { 985 turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, cricket::PROTO_UDP); 986 int last_fd_count = GetFDCount(); 987 // Need to supply unresolved address to kick off resolver. 988 CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword, 989 cricket::ProtocolAddress(rtc::SocketAddress( 990 "www.google.invalid", 3478), cricket::PROTO_UDP)); 991 turn_port_->PrepareAddress(); 992 ASSERT_TRUE_WAIT(turn_error_, kResolverTimeout); 993 EXPECT_TRUE(turn_port_->Candidates().empty()); 994 turn_port_.reset(); 995 rtc::Thread::Current()->Post(this, MSG_TESTFINISH); 996 // Waiting for above message to be processed. 997 ASSERT_TRUE_WAIT(test_finish_, kTimeout); 998 EXPECT_EQ(last_fd_count, GetFDCount()); 999 } 1000 #endif 1001