| Index: webrtc/p2p/client/portallocator_unittest.cc
|
| diff --git a/webrtc/p2p/client/portallocator_unittest.cc b/webrtc/p2p/client/portallocator_unittest.cc
|
| index 7dc25140cccf91a91194af75af8f8b4c18f33993..725fa73bfa9879b10b1274a63b2743dc9d17887d 100644
|
| --- a/webrtc/p2p/client/portallocator_unittest.cc
|
| +++ b/webrtc/p2p/client/portallocator_unittest.cc
|
| @@ -88,7 +88,7 @@ class PortAllocatorTest : public testing::Test, public sigslot::has_slots<> {
|
| fss_(new rtc::FirewallSocketServer(vss_.get())),
|
| ss_scope_(fss_.get()),
|
| nat_factory_(vss_.get(), kNatUdpAddr, kNatTcpAddr),
|
| - nat_socket_factory_(&nat_factory_),
|
| + nat_socket_factory_(new rtc::BasicPacketSocketFactory(&nat_factory_)),
|
| stun_server_(cricket::TestStunServer::Create(Thread::Current(),
|
| kStunAddr)),
|
| relay_server_(Thread::Current(), kRelayUdpIntAddr, kRelayUdpExtAddr,
|
| @@ -110,9 +110,20 @@ class PortAllocatorTest : public testing::Test, public sigslot::has_slots<> {
|
| void AddInterface(const SocketAddress& addr) {
|
| network_manager_.AddInterface(addr);
|
| }
|
| + void AddInterfaceAsDefaultRoute(const SocketAddress& addr) {
|
| + AddInterface(addr);
|
| + // When a binding comes from the any address, the |addr| will be used as the
|
| + // srflx address.
|
| + vss_->SetDefaultRoute(addr.ipaddr());
|
| + }
|
| bool SetPortRange(int min_port, int max_port) {
|
| return allocator_->SetPortRange(min_port, max_port);
|
| }
|
| + // No STUN/TURN configuration.
|
| + void ResetWithNoServers() {
|
| + allocator_.reset(new cricket::BasicPortAllocator(&network_manager_));
|
| + allocator_->set_step_delay(cricket::kMinimumStepDelay);
|
| + }
|
| void ResetWithNatServer(const rtc::SocketAddress& stun_server) {
|
| nat_server_.reset(new rtc::NATServer(
|
| rtc::NAT_OPEN_CONE, vss_.get(), kNatUdpAddr, kNatTcpAddr, vss_.get(),
|
| @@ -123,7 +134,19 @@ class PortAllocatorTest : public testing::Test, public sigslot::has_slots<> {
|
| stun_servers.insert(stun_server);
|
| }
|
| allocator_.reset(new cricket::BasicPortAllocator(
|
| - &network_manager_, &nat_socket_factory_, stun_servers));
|
| + &network_manager_, nat_socket_factory_.get(), stun_servers));
|
| + allocator().set_step_delay(cricket::kMinimumStepDelay);
|
| + }
|
| +
|
| + void ResetWithStunServer(const rtc::SocketAddress& stun_server) {
|
| + nat_socket_factory_.reset(new rtc::BasicPacketSocketFactory());
|
| +
|
| + ServerAddresses stun_servers;
|
| + if (!stun_server.IsNil()) {
|
| + stun_servers.insert(stun_server);
|
| + }
|
| + allocator_.reset(new cricket::BasicPortAllocator(
|
| + &network_manager_, nat_socket_factory_.get(), stun_servers));
|
| allocator().set_step_delay(cricket::kMinimumStepDelay);
|
| }
|
|
|
| @@ -232,27 +255,47 @@ class PortAllocatorTest : public testing::Test, public sigslot::has_slots<> {
|
| }
|
| }
|
|
|
| - void CheckDisableAdapterEnumeration() {
|
| + // When |expect_stun_candidate| is true, |stun_candidate_addr| carries the
|
| + // expected reflective address, which is also the related address for TURN
|
| + // candidate if it is expected. Otherwise, it should be ignore.
|
| + void CheckDisableAdapterEnumeration(uint32 total_ports,
|
| + bool expect_stun_candidate,
|
| + const rtc::IPAddress& stun_candidate_addr,
|
| + bool expect_relay_candidate) {
|
| EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP));
|
| - session_->set_flags(cricket::PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION);
|
| + session_->set_flags(cricket::PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION |
|
| + cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG |
|
| + cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET);
|
| session_->StartGettingPorts();
|
| EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
|
|
|
| - // Only 2 candidates as local UDP/TCP are all 0s and get trimmed out.
|
| - EXPECT_EQ(2U, candidates_.size());
|
| - EXPECT_EQ(2U, ports_.size()); // One stunport and one turnport.
|
| + uint32 total_candidates = 0;
|
| + if (expect_stun_candidate) {
|
| + total_candidates++;
|
| + }
|
| + if (expect_relay_candidate) {
|
| + total_candidates++;
|
| + }
|
|
|
| - EXPECT_PRED5(CheckCandidate, candidates_[0],
|
| - cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp",
|
| - rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0));
|
| - EXPECT_EQ(
|
| - rtc::EmptySocketAddressWithFamily(candidates_[0].address().family()),
|
| - candidates_[0].related_address());
|
| + EXPECT_EQ(total_candidates, candidates_.size());
|
| + EXPECT_EQ(total_ports, ports_.size());
|
|
|
| - EXPECT_PRED5(CheckCandidate, candidates_[1],
|
| - cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp",
|
| - rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
|
| - EXPECT_EQ(kNatUdpAddr.ipaddr(), candidates_[1].related_address().ipaddr());
|
| + if (expect_stun_candidate) {
|
| + EXPECT_PRED5(CheckCandidate, candidates_[0],
|
| + cricket::ICE_CANDIDATE_COMPONENT_RTP, "stun", "udp",
|
| + rtc::SocketAddress(stun_candidate_addr, 0));
|
| + EXPECT_EQ(
|
| + rtc::EmptySocketAddressWithFamily(candidates_[0].address().family()),
|
| + candidates_[0].related_address());
|
| + }
|
| +
|
| + if (expect_relay_candidate) {
|
| + EXPECT_PRED5(CheckCandidate, candidates_[1],
|
| + cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp",
|
| + rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
|
| + EXPECT_EQ(stun_candidate_addr,
|
| + candidates_[1].related_address().ipaddr());
|
| + }
|
| }
|
|
|
| protected:
|
| @@ -293,7 +336,7 @@ class PortAllocatorTest : public testing::Test, public sigslot::has_slots<> {
|
| rtc::SocketServerScope ss_scope_;
|
| rtc::scoped_ptr<rtc::NATServer> nat_server_;
|
| rtc::NATSocketFactory nat_factory_;
|
| - rtc::BasicPacketSocketFactory nat_socket_factory_;
|
| + rtc::scoped_ptr<rtc::BasicPacketSocketFactory> nat_socket_factory_;
|
| rtc::scoped_ptr<cricket::TestStunServer> stun_server_;
|
| cricket::TestRelayServer relay_server_;
|
| cricket::TestTurnServer turn_server_;
|
| @@ -455,24 +498,46 @@ TEST_F(PortAllocatorTest, TestGetAllPortsNoAdapters) {
|
|
|
| // Test that we should only get STUN and TURN candidates when adapter
|
| // enumeration is disabled.
|
| -TEST_F(PortAllocatorTest, TestDisableAdapterEnumeration) {
|
| +TEST_F(PortAllocatorTest, TestDisableAdapterEnumerationBehindNat) {
|
| AddInterface(kClientAddr);
|
| // GTURN is not configured here.
|
| ResetWithNatServer(kStunAddr);
|
| AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
|
| -
|
| - CheckDisableAdapterEnumeration();
|
| + // Expect to see 2 ports, both STUN and TURN candidates.
|
| + CheckDisableAdapterEnumeration(2U, true, kNatUdpAddr.ipaddr(), true);
|
| }
|
|
|
| // Test that even with multiple interfaces, the result should be only 1 Stun
|
| // candidate since we bind to any address (i.e. all 0s).
|
| -TEST_F(PortAllocatorTest, TestDisableAdapterEnumerationMultipleInterfaces) {
|
| +TEST_F(PortAllocatorTest,
|
| + TestDisableAdapterEnumerationBehindNatMultipleInterfaces) {
|
| AddInterface(kPrivateAddr);
|
| AddInterface(kPrivateAddr2);
|
| ResetWithNatServer(kStunAddr);
|
| AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
|
| + // Expect to see 2 ports, both STUN and TURN candidates.
|
| + CheckDisableAdapterEnumeration(2U, true, kNatUdpAddr.ipaddr(), true);
|
| +}
|
| +
|
| +// Test that when adapter enumeration is disabled, STUN is the only candidate
|
| +// for endpoints not behind a NAT.
|
| +TEST_F(PortAllocatorTest, TestDisableAdapterEnumerationWithoutNat) {
|
| + AddInterfaceAsDefaultRoute(kClientAddr);
|
| + ResetWithStunServer(kStunAddr);
|
| + AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
|
| + // Expect to see 2 port, the STUN candidate with kClientAddr, and TURN
|
| + // candidate with kClientAddr as the related address.
|
| + CheckDisableAdapterEnumeration(2U, true, kClientAddr.ipaddr(), true);
|
| +}
|
| +
|
|
|
| - CheckDisableAdapterEnumeration();
|
| +// Test that when adapter enumeration is disabled, for endpoints without
|
| +// STUN/TURN specified, no candidate is generated.
|
| +TEST_F(PortAllocatorTest, TestDisableAdapterEnumerationWithoutNat_NoCandidate) {
|
| + AddInterfaceAsDefaultRoute(kClientAddr);
|
| + ResetWithNoServers();
|
| + // Expect to see 1 ports but no candidate.
|
| + CheckDisableAdapterEnumeration(1U, false, rtc::IPAddress(), false);
|
| }
|
|
|
| // Disable for asan, see
|
|
|