1 /* 2 * Copyright 2009 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 "webrtc/p2p/base/basicpacketsocketfactory.h" 12 #include "webrtc/p2p/base/constants.h" 13 #include "webrtc/p2p/base/p2ptransportchannel.h" 14 #include "webrtc/p2p/base/testrelayserver.h" 15 #include "webrtc/p2p/base/teststunserver.h" 16 #include "webrtc/p2p/base/testturnserver.h" 17 #include "webrtc/p2p/client/basicportallocator.h" 18 #include "webrtc/p2p/client/httpportallocator.h" 19 #include "webrtc/base/fakenetwork.h" 20 #include "webrtc/base/firewallsocketserver.h" 21 #include "webrtc/base/gunit.h" 22 #include "webrtc/base/helpers.h" 23 #include "webrtc/base/ipaddress.h" 24 #include "webrtc/base/logging.h" 25 #include "webrtc/base/natserver.h" 26 #include "webrtc/base/natsocketfactory.h" 27 #include "webrtc/base/network.h" 28 #include "webrtc/base/physicalsocketserver.h" 29 #include "webrtc/base/socketaddress.h" 30 #include "webrtc/base/ssladapter.h" 31 #include "webrtc/base/thread.h" 32 #include "webrtc/base/virtualsocketserver.h" 33 34 using cricket::ServerAddresses; 35 using rtc::IPAddress; 36 using rtc::SocketAddress; 37 using rtc::Thread; 38 39 static const SocketAddress kClientAddr("11.11.11.11", 0); 40 static const SocketAddress kLoopbackAddr("127.0.0.1", 0); 41 static const SocketAddress kPrivateAddr("192.168.1.11", 0); 42 static const SocketAddress kPrivateAddr2("192.168.1.12", 0); 43 static const SocketAddress kClientIPv6Addr( 44 "2401:fa00:4:1000:be30:5bff:fee5:c3", 0); 45 static const SocketAddress kClientAddr2("22.22.22.22", 0); 46 static const SocketAddress kNatUdpAddr("77.77.77.77", rtc::NAT_SERVER_UDP_PORT); 47 static const SocketAddress kNatTcpAddr("77.77.77.77", rtc::NAT_SERVER_TCP_PORT); 48 static const SocketAddress kRemoteClientAddr("22.22.22.22", 0); 49 static const SocketAddress kStunAddr("99.99.99.1", cricket::STUN_SERVER_PORT); 50 static const SocketAddress kRelayUdpIntAddr("99.99.99.2", 5000); 51 static const SocketAddress kRelayUdpExtAddr("99.99.99.3", 5001); 52 static const SocketAddress kRelayTcpIntAddr("99.99.99.2", 5002); 53 static const SocketAddress kRelayTcpExtAddr("99.99.99.3", 5003); 54 static const SocketAddress kRelaySslTcpIntAddr("99.99.99.2", 5004); 55 static const SocketAddress kRelaySslTcpExtAddr("99.99.99.3", 5005); 56 static const SocketAddress kTurnUdpIntAddr("99.99.99.4", 3478); 57 static const SocketAddress kTurnTcpIntAddr("99.99.99.5", 3478); 58 static const SocketAddress kTurnUdpExtAddr("99.99.99.6", 0); 59 60 // Minimum and maximum port for port range tests. 61 static const int kMinPort = 10000; 62 static const int kMaxPort = 10099; 63 64 // Based on ICE_UFRAG_LENGTH 65 static const char kIceUfrag0[] = "TESTICEUFRAG0000"; 66 // Based on ICE_PWD_LENGTH 67 static const char kIcePwd0[] = "TESTICEPWD00000000000000"; 68 69 static const char kContentName[] = "test content"; 70 71 static const int kDefaultAllocationTimeout = 1000; 72 static const char kTurnUsername[] = "test"; 73 static const char kTurnPassword[] = "test"; 74 75 namespace cricket { 76 77 // Helper for dumping candidates 78 std::ostream& operator<<(std::ostream& os, const cricket::Candidate& c) { 79 os << c.ToString(); 80 return os; 81 } 82 83 } // namespace cricket 84 85 class PortAllocatorTest : public testing::Test, public sigslot::has_slots<> { 86 public: 87 PortAllocatorTest() 88 : pss_(new rtc::PhysicalSocketServer), 89 vss_(new rtc::VirtualSocketServer(pss_.get())), 90 fss_(new rtc::FirewallSocketServer(vss_.get())), 91 ss_scope_(fss_.get()), 92 nat_factory_(vss_.get(), kNatUdpAddr, kNatTcpAddr), 93 nat_socket_factory_(new rtc::BasicPacketSocketFactory(&nat_factory_)), 94 stun_server_(cricket::TestStunServer::Create(Thread::Current(), 95 kStunAddr)), 96 relay_server_(Thread::Current(), kRelayUdpIntAddr, kRelayUdpExtAddr, 97 kRelayTcpIntAddr, kRelayTcpExtAddr, 98 kRelaySslTcpIntAddr, kRelaySslTcpExtAddr), 99 turn_server_(Thread::Current(), kTurnUdpIntAddr, kTurnUdpExtAddr), 100 candidate_allocation_done_(false) { 101 cricket::ServerAddresses stun_servers; 102 stun_servers.insert(kStunAddr); 103 // Passing the addresses of GTURN servers will enable GTURN in 104 // Basicportallocator. 105 allocator_.reset(new cricket::BasicPortAllocator( 106 &network_manager_, 107 stun_servers, 108 kRelayUdpIntAddr, kRelayTcpIntAddr, kRelaySslTcpIntAddr)); 109 allocator_->set_step_delay(cricket::kMinimumStepDelay); 110 } 111 112 void AddInterface(const SocketAddress& addr) { 113 network_manager_.AddInterface(addr); 114 } 115 void AddInterface(const SocketAddress& addr, const std::string& if_name) { 116 network_manager_.AddInterface(addr, if_name); 117 } 118 void AddInterface(const SocketAddress& addr, 119 const std::string& if_name, 120 rtc::AdapterType type) { 121 network_manager_.AddInterface(addr, if_name, type); 122 } 123 // The default route is the public address that STUN server will observe when 124 // the endpoint is sitting on the public internet and the local port is bound 125 // to the "any" address. This may be different from the default local address 126 // which the endpoint observes. This can occur if the route to the public 127 // endpoint like 8.8.8.8 (specified as the default local address) is 128 // different from the route to the STUN server (the default route). 129 void AddInterfaceAsDefaultRoute(const SocketAddress& addr) { 130 AddInterface(addr); 131 // When a binding comes from the any address, the |addr| will be used as the 132 // srflx address. 133 vss_->SetDefaultRoute(addr.ipaddr()); 134 } 135 void RemoveInterface(const SocketAddress& addr) { 136 network_manager_.RemoveInterface(addr); 137 } 138 bool SetPortRange(int min_port, int max_port) { 139 return allocator_->SetPortRange(min_port, max_port); 140 } 141 // Endpoint is on the public network. No STUN or TURN. 142 void ResetWithNoServersOrNat() { 143 allocator_.reset(new cricket::BasicPortAllocator(&network_manager_)); 144 allocator_->set_step_delay(cricket::kMinimumStepDelay); 145 } 146 // Endpoint is behind a NAT, with STUN specified. 147 void ResetWithStunServerAndNat(const rtc::SocketAddress& stun_server) { 148 ResetWithStunServer(stun_server, true); 149 } 150 // Endpoint is on the public network, with STUN specified. 151 void ResetWithStunServerNoNat(const rtc::SocketAddress& stun_server) { 152 ResetWithStunServer(stun_server, false); 153 } 154 // Endpoint is on the public network, with TURN specified. 155 void ResetWithTurnServersNoNat(const rtc::SocketAddress& udp_turn, 156 const rtc::SocketAddress& tcp_turn) { 157 ResetWithNoServersOrNat(); 158 AddTurnServers(udp_turn, tcp_turn); 159 } 160 161 void AddTurnServers(const rtc::SocketAddress& udp_turn, 162 const rtc::SocketAddress& tcp_turn) { 163 cricket::RelayServerConfig turn_server(cricket::RELAY_TURN); 164 cricket::RelayCredentials credentials(kTurnUsername, kTurnPassword); 165 turn_server.credentials = credentials; 166 167 if (!udp_turn.IsNil()) { 168 turn_server.ports.push_back( 169 cricket::ProtocolAddress(kTurnUdpIntAddr, cricket::PROTO_UDP, false)); 170 } 171 if (!tcp_turn.IsNil()) { 172 turn_server.ports.push_back( 173 cricket::ProtocolAddress(kTurnTcpIntAddr, cricket::PROTO_TCP, false)); 174 } 175 allocator_->AddTurnServer(turn_server); 176 } 177 178 bool CreateSession(int component) { 179 session_.reset(CreateSession("session", component)); 180 if (!session_) 181 return false; 182 return true; 183 } 184 185 bool CreateSession(int component, const std::string& content_name) { 186 session_.reset(CreateSession("session", content_name, component)); 187 if (!session_) 188 return false; 189 return true; 190 } 191 192 cricket::PortAllocatorSession* CreateSession( 193 const std::string& sid, int component) { 194 return CreateSession(sid, kContentName, component); 195 } 196 197 cricket::PortAllocatorSession* CreateSession( 198 const std::string& sid, const std::string& content_name, int component) { 199 return CreateSession(sid, content_name, component, kIceUfrag0, kIcePwd0); 200 } 201 202 cricket::PortAllocatorSession* CreateSession( 203 const std::string& sid, const std::string& content_name, int component, 204 const std::string& ice_ufrag, const std::string& ice_pwd) { 205 cricket::PortAllocatorSession* session = 206 allocator_->CreateSession( 207 sid, content_name, component, ice_ufrag, ice_pwd); 208 session->SignalPortReady.connect(this, 209 &PortAllocatorTest::OnPortReady); 210 session->SignalCandidatesReady.connect(this, 211 &PortAllocatorTest::OnCandidatesReady); 212 session->SignalCandidatesAllocationDone.connect(this, 213 &PortAllocatorTest::OnCandidatesAllocationDone); 214 return session; 215 } 216 217 static bool CheckCandidate(const cricket::Candidate& c, 218 int component, const std::string& type, 219 const std::string& proto, 220 const SocketAddress& addr) { 221 return (c.component() == component && c.type() == type && 222 c.protocol() == proto && c.address().ipaddr() == addr.ipaddr() && 223 ((addr.port() == 0 && (c.address().port() != 0)) || 224 (c.address().port() == addr.port()))); 225 } 226 static bool CheckPort(const rtc::SocketAddress& addr, 227 int min_port, int max_port) { 228 return (addr.port() >= min_port && addr.port() <= max_port); 229 } 230 231 void OnCandidatesAllocationDone(cricket::PortAllocatorSession* session) { 232 // We should only get this callback once, except in the mux test where 233 // we have multiple port allocation sessions. 234 if (session == session_.get()) { 235 ASSERT_FALSE(candidate_allocation_done_); 236 candidate_allocation_done_ = true; 237 } 238 } 239 240 // Check if all ports allocated have send-buffer size |expected|. If 241 // |expected| == -1, check if GetOptions returns SOCKET_ERROR. 242 void CheckSendBufferSizesOfAllPorts(int expected) { 243 std::vector<cricket::PortInterface*>::iterator it; 244 for (it = ports_.begin(); it < ports_.end(); ++it) { 245 int send_buffer_size; 246 if (expected == -1) { 247 EXPECT_EQ(SOCKET_ERROR, 248 (*it)->GetOption(rtc::Socket::OPT_SNDBUF, 249 &send_buffer_size)); 250 } else { 251 EXPECT_EQ(0, (*it)->GetOption(rtc::Socket::OPT_SNDBUF, 252 &send_buffer_size)); 253 ASSERT_EQ(expected, send_buffer_size); 254 } 255 } 256 } 257 258 // This function starts the port/address gathering and check the existence of 259 // candidates as specified. When |expect_stun_candidate| is true, 260 // |stun_candidate_addr| carries the expected reflective address, which is 261 // also the related address for TURN candidate if it is expected. Otherwise, 262 // it should be ignore. 263 void CheckDisableAdapterEnumeration( 264 uint32_t total_ports, 265 const rtc::IPAddress& host_candidate_addr, 266 const rtc::IPAddress& stun_candidate_addr, 267 const rtc::IPAddress& relay_candidate_udp_transport_addr, 268 const rtc::IPAddress& relay_candidate_tcp_transport_addr) { 269 network_manager_.set_default_local_addresses(kPrivateAddr.ipaddr(), 270 rtc::IPAddress()); 271 if (!session_) { 272 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 273 } 274 session_->set_flags(session_->flags() | 275 cricket::PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION | 276 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 277 allocator().set_allow_tcp_listen(false); 278 session_->StartGettingPorts(); 279 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 280 281 uint32_t total_candidates = 0; 282 if (!host_candidate_addr.IsNil()) { 283 EXPECT_PRED5(CheckCandidate, candidates_[total_candidates], 284 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", 285 rtc::SocketAddress(kPrivateAddr.ipaddr(), 0)); 286 ++total_candidates; 287 } 288 if (!stun_candidate_addr.IsNil()) { 289 EXPECT_PRED5(CheckCandidate, candidates_[total_candidates], 290 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", 291 rtc::SocketAddress(stun_candidate_addr, 0)); 292 rtc::IPAddress related_address = host_candidate_addr; 293 if (host_candidate_addr.IsNil()) { 294 related_address = 295 rtc::GetAnyIP(candidates_[total_candidates].address().family()); 296 } 297 EXPECT_EQ(related_address, 298 candidates_[total_candidates].related_address().ipaddr()); 299 ++total_candidates; 300 } 301 if (!relay_candidate_udp_transport_addr.IsNil()) { 302 EXPECT_PRED5(CheckCandidate, candidates_[total_candidates], 303 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", 304 rtc::SocketAddress(relay_candidate_udp_transport_addr, 0)); 305 EXPECT_EQ(stun_candidate_addr, 306 candidates_[total_candidates].related_address().ipaddr()); 307 ++total_candidates; 308 } 309 if (!relay_candidate_tcp_transport_addr.IsNil()) { 310 EXPECT_PRED5(CheckCandidate, candidates_[total_candidates], 311 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", 312 rtc::SocketAddress(relay_candidate_tcp_transport_addr, 0)); 313 EXPECT_EQ(stun_candidate_addr, 314 candidates_[total_candidates].related_address().ipaddr()); 315 ++total_candidates; 316 } 317 318 EXPECT_EQ(total_candidates, candidates_.size()); 319 EXPECT_EQ(total_ports, ports_.size()); 320 } 321 322 protected: 323 cricket::BasicPortAllocator& allocator() { 324 return *allocator_; 325 } 326 327 void OnPortReady(cricket::PortAllocatorSession* ses, 328 cricket::PortInterface* port) { 329 LOG(LS_INFO) << "OnPortReady: " << port->ToString(); 330 ports_.push_back(port); 331 } 332 void OnCandidatesReady(cricket::PortAllocatorSession* ses, 333 const std::vector<cricket::Candidate>& candidates) { 334 for (size_t i = 0; i < candidates.size(); ++i) { 335 LOG(LS_INFO) << "OnCandidatesReady: " << candidates[i].ToString(); 336 candidates_.push_back(candidates[i]); 337 } 338 } 339 340 bool HasRelayAddress(const cricket::ProtocolAddress& proto_addr) { 341 for (size_t i = 0; i < allocator_->turn_servers().size(); ++i) { 342 cricket::RelayServerConfig server_config = allocator_->turn_servers()[i]; 343 cricket::PortList::const_iterator relay_port; 344 for (relay_port = server_config.ports.begin(); 345 relay_port != server_config.ports.end(); ++relay_port) { 346 if (proto_addr.address == relay_port->address && 347 proto_addr.proto == relay_port->proto) 348 return true; 349 } 350 } 351 return false; 352 } 353 354 void ResetWithStunServer(const rtc::SocketAddress& stun_server, 355 bool with_nat) { 356 if (with_nat) { 357 nat_server_.reset(new rtc::NATServer( 358 rtc::NAT_OPEN_CONE, vss_.get(), kNatUdpAddr, kNatTcpAddr, vss_.get(), 359 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0))); 360 } else { 361 nat_socket_factory_.reset(new rtc::BasicPacketSocketFactory()); 362 } 363 364 ServerAddresses stun_servers; 365 if (!stun_server.IsNil()) { 366 stun_servers.insert(stun_server); 367 } 368 allocator_.reset(new cricket::BasicPortAllocator( 369 &network_manager_, nat_socket_factory_.get(), stun_servers)); 370 allocator().set_step_delay(cricket::kMinimumStepDelay); 371 } 372 373 rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_; 374 rtc::scoped_ptr<rtc::VirtualSocketServer> vss_; 375 rtc::scoped_ptr<rtc::FirewallSocketServer> fss_; 376 rtc::SocketServerScope ss_scope_; 377 rtc::scoped_ptr<rtc::NATServer> nat_server_; 378 rtc::NATSocketFactory nat_factory_; 379 rtc::scoped_ptr<rtc::BasicPacketSocketFactory> nat_socket_factory_; 380 rtc::scoped_ptr<cricket::TestStunServer> stun_server_; 381 cricket::TestRelayServer relay_server_; 382 cricket::TestTurnServer turn_server_; 383 rtc::FakeNetworkManager network_manager_; 384 rtc::scoped_ptr<cricket::BasicPortAllocator> allocator_; 385 rtc::scoped_ptr<cricket::PortAllocatorSession> session_; 386 std::vector<cricket::PortInterface*> ports_; 387 std::vector<cricket::Candidate> candidates_; 388 bool candidate_allocation_done_; 389 }; 390 391 // Tests that we can init the port allocator and create a session. 392 TEST_F(PortAllocatorTest, TestBasic) { 393 EXPECT_EQ(&network_manager_, allocator().network_manager()); 394 EXPECT_EQ(kStunAddr, *allocator().stun_servers().begin()); 395 ASSERT_EQ(1u, allocator().turn_servers().size()); 396 EXPECT_EQ(cricket::RELAY_GTURN, allocator().turn_servers()[0].type); 397 // Empty relay credentials are used for GTURN. 398 EXPECT_TRUE(allocator().turn_servers()[0].credentials.username.empty()); 399 EXPECT_TRUE(allocator().turn_servers()[0].credentials.password.empty()); 400 EXPECT_TRUE(HasRelayAddress(cricket::ProtocolAddress( 401 kRelayUdpIntAddr, cricket::PROTO_UDP))); 402 EXPECT_TRUE(HasRelayAddress(cricket::ProtocolAddress( 403 kRelayTcpIntAddr, cricket::PROTO_TCP))); 404 EXPECT_TRUE(HasRelayAddress(cricket::ProtocolAddress( 405 kRelaySslTcpIntAddr, cricket::PROTO_SSLTCP))); 406 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 407 } 408 409 // Tests that our network filtering works properly. 410 TEST_F(PortAllocatorTest, TestIgnoreOnlyLoopbackNetworkByDefault) { 411 AddInterface(SocketAddress(IPAddress(0x12345600U), 0), "test_eth0", 412 rtc::ADAPTER_TYPE_ETHERNET); 413 AddInterface(SocketAddress(IPAddress(0x12345601U), 0), "test_wlan0", 414 rtc::ADAPTER_TYPE_WIFI); 415 AddInterface(SocketAddress(IPAddress(0x12345602U), 0), "test_cell0", 416 rtc::ADAPTER_TYPE_CELLULAR); 417 AddInterface(SocketAddress(IPAddress(0x12345603U), 0), "test_vpn0", 418 rtc::ADAPTER_TYPE_VPN); 419 AddInterface(SocketAddress(IPAddress(0x12345604U), 0), "test_lo", 420 rtc::ADAPTER_TYPE_LOOPBACK); 421 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 422 session_->set_flags(cricket::PORTALLOCATOR_DISABLE_STUN | 423 cricket::PORTALLOCATOR_DISABLE_RELAY | 424 cricket::PORTALLOCATOR_DISABLE_TCP); 425 session_->StartGettingPorts(); 426 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 427 EXPECT_EQ(4U, candidates_.size()); 428 for (cricket::Candidate candidate : candidates_) { 429 EXPECT_LT(candidate.address().ip(), 0x12345604U); 430 } 431 } 432 433 TEST_F(PortAllocatorTest, TestIgnoreNetworksAccordingToIgnoreMask) { 434 AddInterface(SocketAddress(IPAddress(0x12345600U), 0), "test_eth0", 435 rtc::ADAPTER_TYPE_ETHERNET); 436 AddInterface(SocketAddress(IPAddress(0x12345601U), 0), "test_wlan0", 437 rtc::ADAPTER_TYPE_WIFI); 438 AddInterface(SocketAddress(IPAddress(0x12345602U), 0), "test_cell0", 439 rtc::ADAPTER_TYPE_CELLULAR); 440 allocator_->SetNetworkIgnoreMask(rtc::ADAPTER_TYPE_ETHERNET | 441 rtc::ADAPTER_TYPE_LOOPBACK | 442 rtc::ADAPTER_TYPE_WIFI); 443 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 444 session_->set_flags(cricket::PORTALLOCATOR_DISABLE_STUN | 445 cricket::PORTALLOCATOR_DISABLE_RELAY | 446 cricket::PORTALLOCATOR_DISABLE_TCP); 447 session_->StartGettingPorts(); 448 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 449 EXPECT_EQ(1U, candidates_.size()); 450 EXPECT_EQ(0x12345602U, candidates_[0].address().ip()); 451 } 452 453 // Tests that we allocator session not trying to allocate ports for every 250ms. 454 TEST_F(PortAllocatorTest, TestNoNetworkInterface) { 455 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 456 session_->StartGettingPorts(); 457 // Waiting for one second to make sure BasicPortAllocatorSession has not 458 // called OnAllocate multiple times. In old behavior it's called every 250ms. 459 // When there are no network interfaces, each execution of OnAllocate will 460 // result in SignalCandidatesAllocationDone signal. 461 rtc::Thread::Current()->ProcessMessages(1000); 462 EXPECT_TRUE(candidate_allocation_done_); 463 EXPECT_EQ(0U, candidates_.size()); 464 } 465 466 // Test that we could use loopback interface as host candidate. 467 TEST_F(PortAllocatorTest, TestLoopbackNetworkInterface) { 468 AddInterface(kLoopbackAddr, "test_loopback", rtc::ADAPTER_TYPE_LOOPBACK); 469 allocator_->SetNetworkIgnoreMask(0); 470 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 471 session_->set_flags(cricket::PORTALLOCATOR_DISABLE_STUN | 472 cricket::PORTALLOCATOR_DISABLE_RELAY | 473 cricket::PORTALLOCATOR_DISABLE_TCP); 474 session_->StartGettingPorts(); 475 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 476 EXPECT_EQ(1U, candidates_.size()); 477 } 478 479 // Tests that we can get all the desired addresses successfully. 480 TEST_F(PortAllocatorTest, TestGetAllPortsWithMinimumStepDelay) { 481 AddInterface(kClientAddr); 482 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 483 session_->StartGettingPorts(); 484 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 485 EXPECT_EQ(4U, ports_.size()); 486 EXPECT_PRED5(CheckCandidate, candidates_[0], 487 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 488 EXPECT_PRED5(CheckCandidate, candidates_[1], 489 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", kClientAddr); 490 EXPECT_PRED5(CheckCandidate, candidates_[2], 491 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpIntAddr); 492 EXPECT_PRED5(CheckCandidate, candidates_[3], 493 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpExtAddr); 494 EXPECT_PRED5(CheckCandidate, candidates_[4], 495 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "tcp", kRelayTcpIntAddr); 496 EXPECT_PRED5(CheckCandidate, candidates_[5], 497 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", kClientAddr); 498 EXPECT_PRED5(CheckCandidate, candidates_[6], 499 cricket::ICE_CANDIDATE_COMPONENT_RTP, 500 "relay", "ssltcp", kRelaySslTcpIntAddr); 501 EXPECT_TRUE(candidate_allocation_done_); 502 } 503 504 // Test that when the same network interface is brought down and up, the 505 // port allocator session will restart a new allocation sequence if 506 // it is not stopped. 507 TEST_F(PortAllocatorTest, TestSameNetworkDownAndUpWhenSessionNotStopped) { 508 std::string if_name("test_net0"); 509 AddInterface(kClientAddr, if_name); 510 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 511 session_->StartGettingPorts(); 512 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 513 EXPECT_EQ(4U, ports_.size()); 514 EXPECT_TRUE(candidate_allocation_done_); 515 candidate_allocation_done_ = false; 516 candidates_.clear(); 517 ports_.clear(); 518 519 RemoveInterface(kClientAddr); 520 ASSERT_EQ_WAIT(0U, candidates_.size(), kDefaultAllocationTimeout); 521 EXPECT_EQ(0U, ports_.size()); 522 EXPECT_FALSE(candidate_allocation_done_); 523 524 // When the same interfaces are added again, new candidates/ports should be 525 // generated. 526 AddInterface(kClientAddr, if_name); 527 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 528 EXPECT_EQ(4U, ports_.size()); 529 EXPECT_TRUE(candidate_allocation_done_); 530 } 531 532 // Test that when the same network interface is brought down and up, the 533 // port allocator session will not restart a new allocation sequence if 534 // it is stopped. 535 TEST_F(PortAllocatorTest, TestSameNetworkDownAndUpWhenSessionStopped) { 536 std::string if_name("test_net0"); 537 AddInterface(kClientAddr, if_name); 538 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 539 session_->StartGettingPorts(); 540 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 541 EXPECT_EQ(4U, ports_.size()); 542 EXPECT_TRUE(candidate_allocation_done_); 543 session_->StopGettingPorts(); 544 candidates_.clear(); 545 ports_.clear(); 546 547 RemoveInterface(kClientAddr); 548 ASSERT_EQ_WAIT(0U, candidates_.size(), kDefaultAllocationTimeout); 549 EXPECT_EQ(0U, ports_.size()); 550 551 // When the same interfaces are added again, new candidates/ports should not 552 // be generated because the session has stopped. 553 AddInterface(kClientAddr, if_name); 554 ASSERT_EQ_WAIT(0U, candidates_.size(), kDefaultAllocationTimeout); 555 EXPECT_EQ(0U, ports_.size()); 556 EXPECT_TRUE(candidate_allocation_done_); 557 } 558 559 // Verify candidates with default step delay of 1sec. 560 TEST_F(PortAllocatorTest, TestGetAllPortsWithOneSecondStepDelay) { 561 AddInterface(kClientAddr); 562 allocator_->set_step_delay(cricket::kDefaultStepDelay); 563 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 564 session_->StartGettingPorts(); 565 ASSERT_EQ_WAIT(2U, candidates_.size(), 1000); 566 EXPECT_EQ(2U, ports_.size()); 567 ASSERT_EQ_WAIT(4U, candidates_.size(), 2000); 568 EXPECT_EQ(3U, ports_.size()); 569 EXPECT_PRED5(CheckCandidate, candidates_[2], 570 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpIntAddr); 571 EXPECT_PRED5(CheckCandidate, candidates_[3], 572 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpExtAddr); 573 ASSERT_EQ_WAIT(6U, candidates_.size(), 1500); 574 EXPECT_PRED5(CheckCandidate, candidates_[4], 575 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "tcp", kRelayTcpIntAddr); 576 EXPECT_PRED5(CheckCandidate, candidates_[5], 577 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", kClientAddr); 578 EXPECT_EQ(4U, ports_.size()); 579 ASSERT_EQ_WAIT(7U, candidates_.size(), 2000); 580 EXPECT_PRED5(CheckCandidate, candidates_[6], 581 cricket::ICE_CANDIDATE_COMPONENT_RTP, 582 "relay", "ssltcp", kRelaySslTcpIntAddr); 583 EXPECT_EQ(4U, ports_.size()); 584 EXPECT_TRUE(candidate_allocation_done_); 585 // If we Stop gathering now, we shouldn't get a second "done" callback. 586 session_->StopGettingPorts(); 587 } 588 589 TEST_F(PortAllocatorTest, TestSetupVideoRtpPortsWithNormalSendBuffers) { 590 AddInterface(kClientAddr); 591 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP, 592 cricket::CN_VIDEO)); 593 session_->StartGettingPorts(); 594 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 595 EXPECT_TRUE(candidate_allocation_done_); 596 // If we Stop gathering now, we shouldn't get a second "done" callback. 597 session_->StopGettingPorts(); 598 599 // All ports should have unset send-buffer sizes. 600 CheckSendBufferSizesOfAllPorts(-1); 601 } 602 603 // Tests that we can get callback after StopGetAllPorts. 604 TEST_F(PortAllocatorTest, TestStopGetAllPorts) { 605 AddInterface(kClientAddr); 606 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 607 session_->StartGettingPorts(); 608 ASSERT_EQ_WAIT(2U, candidates_.size(), kDefaultAllocationTimeout); 609 EXPECT_EQ(2U, ports_.size()); 610 session_->StopGettingPorts(); 611 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 612 } 613 614 // Test that we restrict client ports appropriately when a port range is set. 615 // We check the candidates for udp/stun/tcp ports, and the from address 616 // for relay ports. 617 TEST_F(PortAllocatorTest, TestGetAllPortsPortRange) { 618 AddInterface(kClientAddr); 619 // Check that an invalid port range fails. 620 EXPECT_FALSE(SetPortRange(kMaxPort, kMinPort)); 621 // Check that a null port range succeeds. 622 EXPECT_TRUE(SetPortRange(0, 0)); 623 // Check that a valid port range succeeds. 624 EXPECT_TRUE(SetPortRange(kMinPort, kMaxPort)); 625 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 626 session_->StartGettingPorts(); 627 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 628 EXPECT_EQ(4U, ports_.size()); 629 // Check the port number for the UDP port object. 630 EXPECT_PRED3(CheckPort, candidates_[0].address(), kMinPort, kMaxPort); 631 // Check the port number for the STUN port object. 632 EXPECT_PRED3(CheckPort, candidates_[1].address(), kMinPort, kMaxPort); 633 // Check the port number used to connect to the relay server. 634 EXPECT_PRED3(CheckPort, relay_server_.GetConnection(0).source(), 635 kMinPort, kMaxPort); 636 // Check the port number for the TCP port object. 637 EXPECT_PRED3(CheckPort, candidates_[5].address(), kMinPort, kMaxPort); 638 EXPECT_TRUE(candidate_allocation_done_); 639 } 640 641 // Test that we don't crash or malfunction if we have no network adapters. 642 TEST_F(PortAllocatorTest, TestGetAllPortsNoAdapters) { 643 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 644 session_->StartGettingPorts(); 645 rtc::Thread::Current()->ProcessMessages(100); 646 // Without network adapter, we should not get any candidate. 647 EXPECT_EQ(0U, candidates_.size()); 648 EXPECT_TRUE(candidate_allocation_done_); 649 } 650 651 // Test that when enumeration is disabled, we should not have any ports when 652 // candidate_filter() is set to CF_RELAY and no relay is specified. 653 TEST_F(PortAllocatorTest, 654 TestDisableAdapterEnumerationWithoutNatRelayTransportOnly) { 655 ResetWithStunServerNoNat(kStunAddr); 656 allocator().set_candidate_filter(cricket::CF_RELAY); 657 // Expect to see no ports and no candidates. 658 CheckDisableAdapterEnumeration(0U, rtc::IPAddress(), rtc::IPAddress(), 659 rtc::IPAddress(), rtc::IPAddress()); 660 } 661 662 // Test that even with multiple interfaces, the result should still be a single 663 // default private, one STUN and one TURN candidate since we bind to any address 664 // (i.e. all 0s). 665 TEST_F(PortAllocatorTest, 666 TestDisableAdapterEnumerationBehindNatMultipleInterfaces) { 667 AddInterface(kPrivateAddr); 668 AddInterface(kPrivateAddr2); 669 ResetWithStunServerAndNat(kStunAddr); 670 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress()); 671 672 // Enable IPv6 here. Since the network_manager doesn't have IPv6 default 673 // address set and we have no IPv6 STUN server, there should be no IPv6 674 // candidates. 675 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 676 session_->set_flags(cricket::PORTALLOCATOR_ENABLE_IPV6); 677 678 // Expect to see 3 ports for IPv4: HOST/STUN, TURN/UDP and TCP ports, 2 ports 679 // for IPv6: HOST, and TCP. Only IPv4 candidates: a default private, STUN and 680 // TURN/UDP candidates. 681 CheckDisableAdapterEnumeration(5U, kPrivateAddr.ipaddr(), 682 kNatUdpAddr.ipaddr(), kTurnUdpExtAddr.ipaddr(), 683 rtc::IPAddress()); 684 } 685 686 // Test that we should get a default private, STUN, TURN/UDP and TURN/TCP 687 // candidates when both TURN/UDP and TURN/TCP servers are specified. 688 TEST_F(PortAllocatorTest, TestDisableAdapterEnumerationBehindNatWithTcp) { 689 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); 690 AddInterface(kPrivateAddr); 691 ResetWithStunServerAndNat(kStunAddr); 692 AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr); 693 // Expect to see 4 ports - STUN, TURN/UDP, TURN/TCP and TCP port. A default 694 // private, STUN, TURN/UDP, and TURN/TCP candidates. 695 CheckDisableAdapterEnumeration(4U, kPrivateAddr.ipaddr(), 696 kNatUdpAddr.ipaddr(), kTurnUdpExtAddr.ipaddr(), 697 kTurnUdpExtAddr.ipaddr()); 698 } 699 700 // Test that when adapter enumeration is disabled, for endpoints without 701 // STUN/TURN specified, a default private candidate is still generated. 702 TEST_F(PortAllocatorTest, TestDisableAdapterEnumerationWithoutNatOrServers) { 703 ResetWithNoServersOrNat(); 704 // Expect to see 2 ports: STUN and TCP ports, one default private candidate. 705 CheckDisableAdapterEnumeration(2U, kPrivateAddr.ipaddr(), rtc::IPAddress(), 706 rtc::IPAddress(), rtc::IPAddress()); 707 } 708 709 // Test that when adapter enumeration is disabled, with 710 // PORTALLOCATOR_DISABLE_LOCALHOST_CANDIDATE specified, for endpoints not behind 711 // a NAT, there is no local candidate. 712 TEST_F(PortAllocatorTest, 713 TestDisableAdapterEnumerationWithoutNatLocalhostCandidateDisabled) { 714 ResetWithStunServerNoNat(kStunAddr); 715 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 716 session_->set_flags(cricket::PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE); 717 // Expect to see 2 ports: STUN and TCP ports, localhost candidate and STUN 718 // candidate. 719 CheckDisableAdapterEnumeration(2U, rtc::IPAddress(), rtc::IPAddress(), 720 rtc::IPAddress(), rtc::IPAddress()); 721 } 722 723 // Test that when adapter enumeration is disabled, with 724 // PORTALLOCATOR_DISABLE_LOCALHOST_CANDIDATE specified, for endpoints not behind 725 // a NAT, there is no local candidate. However, this specified default route 726 // (kClientAddr) which was discovered when sending STUN requests, will become 727 // the srflx addresses. 728 TEST_F( 729 PortAllocatorTest, 730 TestDisableAdapterEnumerationWithoutNatLocalhostCandidateDisabledWithDifferentDefaultRoute) { 731 ResetWithStunServerNoNat(kStunAddr); 732 AddInterfaceAsDefaultRoute(kClientAddr); 733 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 734 session_->set_flags(cricket::PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE); 735 // Expect to see 2 ports: STUN and TCP ports, localhost candidate and STUN 736 // candidate. 737 CheckDisableAdapterEnumeration(2U, rtc::IPAddress(), kClientAddr.ipaddr(), 738 rtc::IPAddress(), rtc::IPAddress()); 739 } 740 741 // Test that when adapter enumeration is disabled, with 742 // PORTALLOCATOR_DISABLE_LOCALHOST_CANDIDATE specified, for endpoints behind a 743 // NAT, there is only one STUN candidate. 744 TEST_F(PortAllocatorTest, 745 TestDisableAdapterEnumerationWithNatLocalhostCandidateDisabled) { 746 ResetWithStunServerAndNat(kStunAddr); 747 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 748 session_->set_flags(cricket::PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE); 749 // Expect to see 2 ports: STUN and TCP ports, and single STUN candidate. 750 CheckDisableAdapterEnumeration(2U, rtc::IPAddress(), kNatUdpAddr.ipaddr(), 751 rtc::IPAddress(), rtc::IPAddress()); 752 } 753 754 // Test that we disable relay over UDP, and only TCP is used when connecting to 755 // the relay server. 756 TEST_F(PortAllocatorTest, TestDisableUdpTurn) { 757 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); 758 AddInterface(kClientAddr); 759 ResetWithStunServerAndNat(kStunAddr); 760 AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr); 761 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 762 session_->set_flags(cricket::PORTALLOCATOR_DISABLE_UDP_RELAY | 763 cricket::PORTALLOCATOR_DISABLE_UDP | 764 cricket::PORTALLOCATOR_DISABLE_STUN | 765 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 766 767 session_->StartGettingPorts(); 768 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 769 770 // Expect to see 2 ports and 2 candidates - TURN/TCP and TCP ports, TCP and 771 // TURN/TCP candidates. 772 EXPECT_EQ(2U, ports_.size()); 773 EXPECT_EQ(2U, candidates_.size()); 774 EXPECT_PRED5(CheckCandidate, candidates_[0], 775 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", 776 kTurnUdpExtAddr); 777 // The TURN candidate should use TCP to contact the TURN server. 778 EXPECT_EQ(cricket::TCP_PROTOCOL_NAME, candidates_[0].relay_protocol()); 779 EXPECT_PRED5(CheckCandidate, candidates_[1], 780 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", 781 kClientAddr); 782 } 783 784 // Disable for asan, see 785 // https://code.google.com/p/webrtc/issues/detail?id=4743 for details. 786 #if !defined(ADDRESS_SANITIZER) 787 788 // Test that we can get OnCandidatesAllocationDone callback when all the ports 789 // are disabled. 790 TEST_F(PortAllocatorTest, TestDisableAllPorts) { 791 AddInterface(kClientAddr); 792 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 793 session_->set_flags(cricket::PORTALLOCATOR_DISABLE_UDP | 794 cricket::PORTALLOCATOR_DISABLE_STUN | 795 cricket::PORTALLOCATOR_DISABLE_RELAY | 796 cricket::PORTALLOCATOR_DISABLE_TCP); 797 session_->StartGettingPorts(); 798 rtc::Thread::Current()->ProcessMessages(100); 799 EXPECT_EQ(0U, candidates_.size()); 800 EXPECT_TRUE(candidate_allocation_done_); 801 } 802 803 // Test that we don't crash or malfunction if we can't create UDP sockets. 804 TEST_F(PortAllocatorTest, TestGetAllPortsNoUdpSockets) { 805 AddInterface(kClientAddr); 806 fss_->set_udp_sockets_enabled(false); 807 EXPECT_TRUE(CreateSession(1)); 808 session_->StartGettingPorts(); 809 ASSERT_EQ_WAIT(5U, candidates_.size(), kDefaultAllocationTimeout); 810 EXPECT_EQ(2U, ports_.size()); 811 EXPECT_PRED5(CheckCandidate, candidates_[0], 812 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpIntAddr); 813 EXPECT_PRED5(CheckCandidate, candidates_[1], 814 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpExtAddr); 815 EXPECT_PRED5(CheckCandidate, candidates_[2], 816 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "tcp", kRelayTcpIntAddr); 817 EXPECT_PRED5(CheckCandidate, candidates_[3], 818 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", kClientAddr); 819 EXPECT_PRED5(CheckCandidate, candidates_[4], 820 cricket::ICE_CANDIDATE_COMPONENT_RTP, 821 "relay", "ssltcp", kRelaySslTcpIntAddr); 822 EXPECT_TRUE(candidate_allocation_done_); 823 } 824 825 #endif // if !defined(ADDRESS_SANITIZER) 826 827 // Test that we don't crash or malfunction if we can't create UDP sockets or 828 // listen on TCP sockets. We still give out a local TCP address, since 829 // apparently this is needed for the remote side to accept our connection. 830 TEST_F(PortAllocatorTest, TestGetAllPortsNoUdpSocketsNoTcpListen) { 831 AddInterface(kClientAddr); 832 fss_->set_udp_sockets_enabled(false); 833 fss_->set_tcp_listen_enabled(false); 834 EXPECT_TRUE(CreateSession(1)); 835 session_->StartGettingPorts(); 836 ASSERT_EQ_WAIT(5U, candidates_.size(), kDefaultAllocationTimeout); 837 EXPECT_EQ(2U, ports_.size()); 838 EXPECT_PRED5(CheckCandidate, candidates_[0], 839 1, "relay", "udp", kRelayUdpIntAddr); 840 EXPECT_PRED5(CheckCandidate, candidates_[1], 841 1, "relay", "udp", kRelayUdpExtAddr); 842 EXPECT_PRED5(CheckCandidate, candidates_[2], 843 1, "relay", "tcp", kRelayTcpIntAddr); 844 EXPECT_PRED5(CheckCandidate, candidates_[3], 845 1, "local", "tcp", kClientAddr); 846 EXPECT_PRED5(CheckCandidate, candidates_[4], 847 1, "relay", "ssltcp", kRelaySslTcpIntAddr); 848 EXPECT_TRUE(candidate_allocation_done_); 849 } 850 851 // Test that we don't crash or malfunction if we can't create any sockets. 852 // TODO: Find a way to exit early here. 853 TEST_F(PortAllocatorTest, TestGetAllPortsNoSockets) { 854 AddInterface(kClientAddr); 855 fss_->set_tcp_sockets_enabled(false); 856 fss_->set_udp_sockets_enabled(false); 857 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 858 session_->StartGettingPorts(); 859 WAIT(candidates_.size() > 0, 2000); 860 // TODO - Check candidate_allocation_done signal. 861 // In case of Relay, ports creation will succeed but sockets will fail. 862 // There is no error reporting from RelayEntry to handle this failure. 863 } 864 865 // Testing STUN timeout. 866 TEST_F(PortAllocatorTest, TestGetAllPortsNoUdpAllowed) { 867 fss_->AddRule(false, rtc::FP_UDP, rtc::FD_ANY, kClientAddr); 868 AddInterface(kClientAddr); 869 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 870 session_->StartGettingPorts(); 871 EXPECT_EQ_WAIT(2U, candidates_.size(), kDefaultAllocationTimeout); 872 EXPECT_EQ(2U, ports_.size()); 873 EXPECT_PRED5(CheckCandidate, candidates_[0], 874 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 875 EXPECT_PRED5(CheckCandidate, candidates_[1], 876 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", kClientAddr); 877 // RelayPort connection timeout is 3sec. TCP connection with RelayServer 878 // will be tried after 3 seconds. 879 EXPECT_EQ_WAIT(6U, candidates_.size(), 4000); 880 EXPECT_EQ(3U, ports_.size()); 881 EXPECT_PRED5(CheckCandidate, candidates_[2], 882 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpIntAddr); 883 EXPECT_PRED5(CheckCandidate, candidates_[3], 884 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "tcp", kRelayTcpIntAddr); 885 EXPECT_PRED5(CheckCandidate, candidates_[4], 886 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "ssltcp", 887 kRelaySslTcpIntAddr); 888 EXPECT_PRED5(CheckCandidate, candidates_[5], 889 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", kRelayUdpExtAddr); 890 // Stun Timeout is 9sec. 891 EXPECT_TRUE_WAIT(candidate_allocation_done_, 9000); 892 } 893 894 TEST_F(PortAllocatorTest, TestCandidatePriorityOfMultipleInterfaces) { 895 AddInterface(kClientAddr); 896 AddInterface(kClientAddr2); 897 // Allocating only host UDP ports. This is done purely for testing 898 // convenience. 899 allocator().set_flags(cricket::PORTALLOCATOR_DISABLE_TCP | 900 cricket::PORTALLOCATOR_DISABLE_STUN | 901 cricket::PORTALLOCATOR_DISABLE_RELAY); 902 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 903 session_->StartGettingPorts(); 904 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 905 ASSERT_EQ(2U, candidates_.size()); 906 EXPECT_EQ(2U, ports_.size()); 907 // Candidates priorities should be different. 908 EXPECT_NE(candidates_[0].priority(), candidates_[1].priority()); 909 } 910 911 // Test to verify ICE restart process. 912 TEST_F(PortAllocatorTest, TestGetAllPortsRestarts) { 913 AddInterface(kClientAddr); 914 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 915 session_->StartGettingPorts(); 916 EXPECT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 917 EXPECT_EQ(4U, ports_.size()); 918 EXPECT_TRUE(candidate_allocation_done_); 919 // TODO - Extend this to verify ICE restart. 920 } 921 922 // Test ICE candidate filter mechanism with options Relay/Host/Reflexive. 923 // This test also verifies that when the allocator is only allowed to use 924 // relay (i.e. IceTransportsType is relay), the raddr is an empty 925 // address with the correct family. This is to prevent any local 926 // reflective address leakage in the sdp line. 927 TEST_F(PortAllocatorTest, TestCandidateFilterWithRelayOnly) { 928 AddInterface(kClientAddr); 929 // GTURN is not configured here. 930 ResetWithTurnServersNoNat(kTurnUdpIntAddr, rtc::SocketAddress()); 931 allocator().set_candidate_filter(cricket::CF_RELAY); 932 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 933 session_->StartGettingPorts(); 934 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 935 EXPECT_PRED5(CheckCandidate, 936 candidates_[0], 937 cricket::ICE_CANDIDATE_COMPONENT_RTP, 938 "relay", 939 "udp", 940 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0)); 941 942 EXPECT_EQ(1U, candidates_.size()); 943 EXPECT_EQ(1U, ports_.size()); // Only Relay port will be in ready state. 944 for (size_t i = 0; i < candidates_.size(); ++i) { 945 EXPECT_EQ(std::string(cricket::RELAY_PORT_TYPE), candidates_[i].type()); 946 EXPECT_EQ( 947 candidates_[0].related_address(), 948 rtc::EmptySocketAddressWithFamily(candidates_[0].address().family())); 949 } 950 } 951 952 TEST_F(PortAllocatorTest, TestCandidateFilterWithHostOnly) { 953 AddInterface(kClientAddr); 954 allocator().set_flags(cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 955 allocator().set_candidate_filter(cricket::CF_HOST); 956 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 957 session_->StartGettingPorts(); 958 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 959 EXPECT_EQ(2U, candidates_.size()); // Host UDP/TCP candidates only. 960 EXPECT_EQ(2U, ports_.size()); // UDP/TCP ports only. 961 for (size_t i = 0; i < candidates_.size(); ++i) { 962 EXPECT_EQ(std::string(cricket::LOCAL_PORT_TYPE), candidates_[i].type()); 963 } 964 } 965 966 // Host is behind the NAT. 967 TEST_F(PortAllocatorTest, TestCandidateFilterWithReflexiveOnly) { 968 AddInterface(kPrivateAddr); 969 ResetWithStunServerAndNat(kStunAddr); 970 971 allocator().set_flags(cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 972 allocator().set_candidate_filter(cricket::CF_REFLEXIVE); 973 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 974 session_->StartGettingPorts(); 975 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 976 // Host is behind NAT, no private address will be exposed. Hence only UDP 977 // port with STUN candidate will be sent outside. 978 EXPECT_EQ(1U, candidates_.size()); // Only STUN candidate. 979 EXPECT_EQ(1U, ports_.size()); // Only UDP port will be in ready state. 980 for (size_t i = 0; i < candidates_.size(); ++i) { 981 EXPECT_EQ(std::string(cricket::STUN_PORT_TYPE), candidates_[i].type()); 982 EXPECT_EQ( 983 candidates_[0].related_address(), 984 rtc::EmptySocketAddressWithFamily(candidates_[0].address().family())); 985 } 986 } 987 988 // Host is not behind the NAT. 989 TEST_F(PortAllocatorTest, TestCandidateFilterWithReflexiveOnlyAndNoNAT) { 990 AddInterface(kClientAddr); 991 allocator().set_flags(cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 992 allocator().set_candidate_filter(cricket::CF_REFLEXIVE); 993 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 994 session_->StartGettingPorts(); 995 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 996 // Host has a public address, both UDP and TCP candidates will be exposed. 997 EXPECT_EQ(2U, candidates_.size()); // Local UDP + TCP candidate. 998 EXPECT_EQ(2U, ports_.size()); // UDP and TCP ports will be in ready state. 999 for (size_t i = 0; i < candidates_.size(); ++i) { 1000 EXPECT_EQ(std::string(cricket::LOCAL_PORT_TYPE), candidates_[i].type()); 1001 } 1002 } 1003 1004 // Test that we get the same ufrag and pwd for all candidates. 1005 TEST_F(PortAllocatorTest, TestEnableSharedUfrag) { 1006 AddInterface(kClientAddr); 1007 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1008 session_->StartGettingPorts(); 1009 ASSERT_EQ_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout); 1010 EXPECT_PRED5(CheckCandidate, candidates_[0], 1011 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 1012 EXPECT_PRED5(CheckCandidate, candidates_[1], 1013 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", kClientAddr); 1014 EXPECT_PRED5(CheckCandidate, candidates_[5], 1015 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", kClientAddr); 1016 EXPECT_EQ(4U, ports_.size()); 1017 EXPECT_EQ(kIceUfrag0, candidates_[0].username()); 1018 EXPECT_EQ(kIceUfrag0, candidates_[1].username()); 1019 EXPECT_EQ(kIceUfrag0, candidates_[2].username()); 1020 EXPECT_EQ(kIcePwd0, candidates_[0].password()); 1021 EXPECT_EQ(kIcePwd0, candidates_[1].password()); 1022 EXPECT_TRUE(candidate_allocation_done_); 1023 } 1024 1025 // Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port 1026 // is allocated for udp and stun. Also verify there is only one candidate 1027 // (local) if stun candidate is same as local candidate, which will be the case 1028 // in a public network like the below test. 1029 TEST_F(PortAllocatorTest, TestSharedSocketWithoutNat) { 1030 AddInterface(kClientAddr); 1031 allocator_->set_flags(allocator().flags() | 1032 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 1033 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1034 session_->StartGettingPorts(); 1035 ASSERT_EQ_WAIT(6U, candidates_.size(), kDefaultAllocationTimeout); 1036 EXPECT_EQ(3U, ports_.size()); 1037 EXPECT_PRED5(CheckCandidate, candidates_[0], 1038 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 1039 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 1040 } 1041 1042 // Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port 1043 // is allocated for udp and stun. In this test we should expect both stun and 1044 // local candidates as client behind a nat. 1045 TEST_F(PortAllocatorTest, TestSharedSocketWithNat) { 1046 AddInterface(kClientAddr); 1047 ResetWithStunServerAndNat(kStunAddr); 1048 1049 allocator_->set_flags(allocator().flags() | 1050 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 1051 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1052 session_->StartGettingPorts(); 1053 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); 1054 ASSERT_EQ(2U, ports_.size()); 1055 EXPECT_PRED5(CheckCandidate, candidates_[0], 1056 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 1057 EXPECT_PRED5(CheckCandidate, candidates_[1], 1058 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", 1059 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0)); 1060 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 1061 EXPECT_EQ(3U, candidates_.size()); 1062 } 1063 1064 // Test TURN port in shared socket mode with UDP and TCP TURN server addresses. 1065 TEST_F(PortAllocatorTest, TestSharedSocketWithoutNatUsingTurn) { 1066 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); 1067 AddInterface(kClientAddr); 1068 allocator_.reset(new cricket::BasicPortAllocator(&network_manager_)); 1069 1070 AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr); 1071 1072 allocator_->set_step_delay(cricket::kMinimumStepDelay); 1073 allocator_->set_flags(allocator().flags() | 1074 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | 1075 cricket::PORTALLOCATOR_DISABLE_TCP); 1076 1077 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1078 session_->StartGettingPorts(); 1079 1080 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); 1081 ASSERT_EQ(3U, ports_.size()); 1082 EXPECT_PRED5(CheckCandidate, candidates_[0], 1083 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 1084 EXPECT_PRED5(CheckCandidate, candidates_[1], 1085 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", 1086 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0)); 1087 EXPECT_PRED5(CheckCandidate, candidates_[2], 1088 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", 1089 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0)); 1090 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 1091 EXPECT_EQ(3U, candidates_.size()); 1092 } 1093 1094 // Testing DNS resolve for the TURN server, this will test AllocationSequence 1095 // handling the unresolved address signal from TurnPort. 1096 TEST_F(PortAllocatorTest, TestSharedSocketWithServerAddressResolve) { 1097 turn_server_.AddInternalSocket(rtc::SocketAddress("127.0.0.1", 3478), 1098 cricket::PROTO_UDP); 1099 AddInterface(kClientAddr); 1100 allocator_.reset(new cricket::BasicPortAllocator(&network_manager_)); 1101 cricket::RelayServerConfig turn_server(cricket::RELAY_TURN); 1102 cricket::RelayCredentials credentials(kTurnUsername, kTurnPassword); 1103 turn_server.credentials = credentials; 1104 turn_server.ports.push_back(cricket::ProtocolAddress( 1105 rtc::SocketAddress("localhost", 3478), cricket::PROTO_UDP, false)); 1106 allocator_->AddTurnServer(turn_server); 1107 1108 allocator_->set_step_delay(cricket::kMinimumStepDelay); 1109 allocator_->set_flags(allocator().flags() | 1110 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | 1111 cricket::PORTALLOCATOR_DISABLE_TCP); 1112 1113 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1114 session_->StartGettingPorts(); 1115 1116 EXPECT_EQ_WAIT(2U, ports_.size(), kDefaultAllocationTimeout); 1117 } 1118 1119 // Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port 1120 // is allocated for udp/stun/turn. In this test we should expect all local, 1121 // stun and turn candidates. 1122 TEST_F(PortAllocatorTest, TestSharedSocketWithNatUsingTurn) { 1123 AddInterface(kClientAddr); 1124 ResetWithStunServerAndNat(kStunAddr); 1125 1126 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress()); 1127 1128 allocator_->set_flags(allocator().flags() | 1129 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | 1130 cricket::PORTALLOCATOR_DISABLE_TCP); 1131 1132 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1133 session_->StartGettingPorts(); 1134 1135 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); 1136 ASSERT_EQ(2U, ports_.size()); 1137 EXPECT_PRED5(CheckCandidate, candidates_[0], 1138 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 1139 EXPECT_PRED5(CheckCandidate, candidates_[1], 1140 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", 1141 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0)); 1142 EXPECT_PRED5(CheckCandidate, candidates_[2], 1143 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", 1144 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0)); 1145 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 1146 EXPECT_EQ(3U, candidates_.size()); 1147 // Local port will be created first and then TURN port. 1148 EXPECT_EQ(2U, ports_[0]->Candidates().size()); 1149 EXPECT_EQ(1U, ports_[1]->Candidates().size()); 1150 } 1151 1152 // Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled and the TURN 1153 // server is also used as the STUN server, we should get 'local', 'stun', and 1154 // 'relay' candidates. 1155 TEST_F(PortAllocatorTest, TestSharedSocketWithNatUsingTurnAsStun) { 1156 AddInterface(kClientAddr); 1157 // Use an empty SocketAddress to add a NAT without STUN server. 1158 ResetWithStunServerAndNat(SocketAddress()); 1159 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress()); 1160 1161 // Must set the step delay to 0 to make sure the relay allocation phase is 1162 // started before the STUN candidates are obtained, so that the STUN binding 1163 // response is processed when both StunPort and TurnPort exist to reproduce 1164 // webrtc issue 3537. 1165 allocator_->set_step_delay(0); 1166 allocator_->set_flags(allocator().flags() | 1167 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | 1168 cricket::PORTALLOCATOR_DISABLE_TCP); 1169 1170 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1171 session_->StartGettingPorts(); 1172 1173 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); 1174 EXPECT_PRED5(CheckCandidate, candidates_[0], 1175 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 1176 EXPECT_PRED5(CheckCandidate, candidates_[1], 1177 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", 1178 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0)); 1179 EXPECT_PRED5(CheckCandidate, candidates_[2], 1180 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", 1181 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0)); 1182 EXPECT_EQ(candidates_[2].related_address(), candidates_[1].address()); 1183 1184 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 1185 EXPECT_EQ(3U, candidates_.size()); 1186 // Local port will be created first and then TURN port. 1187 EXPECT_EQ(2U, ports_[0]->Candidates().size()); 1188 EXPECT_EQ(1U, ports_[1]->Candidates().size()); 1189 } 1190 1191 // Test that when only a TCP TURN server is available, we do NOT use it as 1192 // a UDP STUN server, as this could leak our IP address. Thus we should only 1193 // expect two ports, a UDPPort and TurnPort. 1194 TEST_F(PortAllocatorTest, TestSharedSocketWithNatUsingTurnTcpOnly) { 1195 turn_server_.AddInternalSocket(kTurnTcpIntAddr, cricket::PROTO_TCP); 1196 AddInterface(kClientAddr); 1197 ResetWithStunServerAndNat(rtc::SocketAddress()); 1198 AddTurnServers(rtc::SocketAddress(), kTurnTcpIntAddr); 1199 1200 allocator_->set_flags(allocator().flags() | 1201 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | 1202 cricket::PORTALLOCATOR_DISABLE_TCP); 1203 1204 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1205 session_->StartGettingPorts(); 1206 1207 ASSERT_EQ_WAIT(2U, candidates_.size(), kDefaultAllocationTimeout); 1208 ASSERT_EQ(2U, ports_.size()); 1209 EXPECT_PRED5(CheckCandidate, candidates_[0], 1210 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", 1211 kClientAddr); 1212 EXPECT_PRED5(CheckCandidate, candidates_[1], 1213 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", 1214 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0)); 1215 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 1216 EXPECT_EQ(2U, candidates_.size()); 1217 EXPECT_EQ(1U, ports_[0]->Candidates().size()); 1218 EXPECT_EQ(1U, ports_[1]->Candidates().size()); 1219 } 1220 1221 // Test that even when PORTALLOCATOR_ENABLE_SHARED_SOCKET is NOT enabled, the 1222 // TURN server is used as the STUN server and we get 'local', 'stun', and 1223 // 'relay' candidates. 1224 // TODO(deadbeef): Remove this test when support for non-shared socket mode 1225 // is removed. 1226 TEST_F(PortAllocatorTest, TestNonSharedSocketWithNatUsingTurnAsStun) { 1227 AddInterface(kClientAddr); 1228 // Use an empty SocketAddress to add a NAT without STUN server. 1229 ResetWithStunServerAndNat(SocketAddress()); 1230 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress()); 1231 1232 allocator_->set_flags(allocator().flags() | 1233 cricket::PORTALLOCATOR_DISABLE_TCP); 1234 1235 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1236 session_->StartGettingPorts(); 1237 1238 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); 1239 ASSERT_EQ(3U, ports_.size()); 1240 EXPECT_PRED5(CheckCandidate, candidates_[0], 1241 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", 1242 kClientAddr); 1243 EXPECT_PRED5(CheckCandidate, candidates_[1], 1244 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", 1245 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0)); 1246 EXPECT_PRED5(CheckCandidate, candidates_[2], 1247 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", 1248 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0)); 1249 // Not using shared socket, so the STUN request's server reflexive address 1250 // should be different than the TURN request's server reflexive address. 1251 EXPECT_NE(candidates_[2].related_address(), candidates_[1].address()); 1252 1253 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 1254 EXPECT_EQ(3U, candidates_.size()); 1255 EXPECT_EQ(1U, ports_[0]->Candidates().size()); 1256 EXPECT_EQ(1U, ports_[1]->Candidates().size()); 1257 EXPECT_EQ(1U, ports_[2]->Candidates().size()); 1258 } 1259 1260 // Test that even when both a STUN and TURN server are configured, the TURN 1261 // server is used as a STUN server and we get a 'stun' candidate. 1262 TEST_F(PortAllocatorTest, TestSharedSocketWithNatUsingTurnAndStun) { 1263 AddInterface(kClientAddr); 1264 // Configure with STUN server but destroy it, so we can ensure that it's 1265 // the TURN server actually being used as a STUN server. 1266 ResetWithStunServerAndNat(kStunAddr); 1267 stun_server_.reset(); 1268 AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress()); 1269 1270 allocator_->set_flags(allocator().flags() | 1271 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET | 1272 cricket::PORTALLOCATOR_DISABLE_TCP); 1273 1274 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1275 session_->StartGettingPorts(); 1276 1277 ASSERT_EQ_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout); 1278 EXPECT_PRED5(CheckCandidate, candidates_[0], 1279 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", 1280 kClientAddr); 1281 EXPECT_PRED5(CheckCandidate, candidates_[1], 1282 cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp", 1283 rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0)); 1284 EXPECT_PRED5(CheckCandidate, candidates_[2], 1285 cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp", 1286 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0)); 1287 EXPECT_EQ(candidates_[2].related_address(), candidates_[1].address()); 1288 1289 // Don't bother waiting for STUN timeout, since we already verified 1290 // that we got a STUN candidate from the TURN server. 1291 } 1292 1293 // This test verifies when PORTALLOCATOR_ENABLE_SHARED_SOCKET flag is enabled 1294 // and fail to generate STUN candidate, local UDP candidate is generated 1295 // properly. 1296 TEST_F(PortAllocatorTest, TestSharedSocketNoUdpAllowed) { 1297 allocator().set_flags(allocator().flags() | 1298 cricket::PORTALLOCATOR_DISABLE_RELAY | 1299 cricket::PORTALLOCATOR_DISABLE_TCP | 1300 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 1301 fss_->AddRule(false, rtc::FP_UDP, rtc::FD_ANY, kClientAddr); 1302 AddInterface(kClientAddr); 1303 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1304 session_->StartGettingPorts(); 1305 ASSERT_EQ_WAIT(1U, ports_.size(), kDefaultAllocationTimeout); 1306 EXPECT_EQ(1U, candidates_.size()); 1307 EXPECT_PRED5(CheckCandidate, candidates_[0], 1308 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", kClientAddr); 1309 // STUN timeout is 9sec. We need to wait to get candidate done signal. 1310 EXPECT_TRUE_WAIT(candidate_allocation_done_, 10000); 1311 EXPECT_EQ(1U, candidates_.size()); 1312 } 1313 1314 // Test that when the NetworkManager doesn't have permission to enumerate 1315 // adapters, the PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION is specified 1316 // automatically. 1317 TEST_F(PortAllocatorTest, TestNetworkPermissionBlocked) { 1318 network_manager_.set_default_local_addresses(kPrivateAddr.ipaddr(), 1319 rtc::IPAddress()); 1320 network_manager_.set_enumeration_permission( 1321 rtc::NetworkManager::ENUMERATION_BLOCKED); 1322 allocator().set_flags(allocator().flags() | 1323 cricket::PORTALLOCATOR_DISABLE_RELAY | 1324 cricket::PORTALLOCATOR_DISABLE_TCP | 1325 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 1326 EXPECT_EQ(0U, allocator_->flags() & 1327 cricket::PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION); 1328 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1329 EXPECT_EQ(0U, session_->flags() & 1330 cricket::PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION); 1331 session_->StartGettingPorts(); 1332 EXPECT_EQ_WAIT(1U, ports_.size(), kDefaultAllocationTimeout); 1333 EXPECT_EQ(1U, candidates_.size()); 1334 EXPECT_PRED5(CheckCandidate, candidates_[0], 1335 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", 1336 kPrivateAddr); 1337 EXPECT_TRUE((session_->flags() & 1338 cricket::PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION) != 0); 1339 } 1340 1341 // This test verifies allocator can use IPv6 addresses along with IPv4. 1342 TEST_F(PortAllocatorTest, TestEnableIPv6Addresses) { 1343 allocator().set_flags(allocator().flags() | 1344 cricket::PORTALLOCATOR_DISABLE_RELAY | 1345 cricket::PORTALLOCATOR_ENABLE_IPV6 | 1346 cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET); 1347 AddInterface(kClientIPv6Addr); 1348 AddInterface(kClientAddr); 1349 allocator_->set_step_delay(cricket::kMinimumStepDelay); 1350 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1351 session_->StartGettingPorts(); 1352 ASSERT_EQ_WAIT(4U, ports_.size(), kDefaultAllocationTimeout); 1353 EXPECT_EQ(4U, candidates_.size()); 1354 EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout); 1355 EXPECT_PRED5(CheckCandidate, candidates_[0], 1356 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", 1357 kClientIPv6Addr); 1358 EXPECT_PRED5(CheckCandidate, candidates_[1], 1359 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp", 1360 kClientAddr); 1361 EXPECT_PRED5(CheckCandidate, candidates_[2], 1362 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", 1363 kClientIPv6Addr); 1364 EXPECT_PRED5(CheckCandidate, candidates_[3], 1365 cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "tcp", 1366 kClientAddr); 1367 EXPECT_EQ(4U, candidates_.size()); 1368 } 1369 1370 TEST_F(PortAllocatorTest, TestStopGettingPorts) { 1371 AddInterface(kClientAddr); 1372 allocator_->set_step_delay(cricket::kDefaultStepDelay); 1373 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1374 session_->StartGettingPorts(); 1375 ASSERT_EQ_WAIT(2U, candidates_.size(), 1000); 1376 EXPECT_EQ(2U, ports_.size()); 1377 session_->StopGettingPorts(); 1378 EXPECT_TRUE_WAIT(candidate_allocation_done_, 1000); 1379 1380 // After stopping getting ports, adding a new interface will not start 1381 // getting ports again. 1382 candidates_.clear(); 1383 ports_.clear(); 1384 candidate_allocation_done_ = false; 1385 network_manager_.AddInterface(kClientAddr2); 1386 rtc::Thread::Current()->ProcessMessages(1000); 1387 EXPECT_EQ(0U, candidates_.size()); 1388 EXPECT_EQ(0U, ports_.size()); 1389 } 1390 1391 TEST_F(PortAllocatorTest, TestClearGettingPorts) { 1392 AddInterface(kClientAddr); 1393 allocator_->set_step_delay(cricket::kDefaultStepDelay); 1394 EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); 1395 session_->StartGettingPorts(); 1396 ASSERT_EQ_WAIT(2U, candidates_.size(), 1000); 1397 EXPECT_EQ(2U, ports_.size()); 1398 session_->ClearGettingPorts(); 1399 WAIT(candidate_allocation_done_, 1000); 1400 EXPECT_FALSE(candidate_allocation_done_); 1401 1402 // After clearing getting ports, adding a new interface will start getting 1403 // ports again. 1404 candidates_.clear(); 1405 ports_.clear(); 1406 candidate_allocation_done_ = false; 1407 network_manager_.AddInterface(kClientAddr2); 1408 ASSERT_EQ_WAIT(2U, candidates_.size(), 1000); 1409 EXPECT_EQ(2U, ports_.size()); 1410 } 1411