| Index: webrtc/p2p/client/portallocator_unittest.cc
 | 
| diff --git a/webrtc/p2p/client/portallocator_unittest.cc b/webrtc/p2p/client/portallocator_unittest.cc
 | 
| index 5e2c1f89341a8d99977f917fd0601b5c86266e86..df32207169f73b42ff014b8f6860a216f58dd6cc 100644
 | 
| --- a/webrtc/p2p/client/portallocator_unittest.cc
 | 
| +++ b/webrtc/p2p/client/portallocator_unittest.cc
 | 
| @@ -36,6 +36,7 @@ using rtc::SocketAddress;
 | 
|  using rtc::Thread;
 | 
|  
 | 
|  static const SocketAddress kClientAddr("11.11.11.11", 0);
 | 
| +static const SocketAddress kLoopbackAddr("127.0.0.1", 0);
 | 
|  static const SocketAddress kPrivateAddr("192.168.1.11", 0);
 | 
|  static const SocketAddress kPrivateAddr2("192.168.1.12", 0);
 | 
|  static const SocketAddress kClientIPv6Addr(
 | 
| @@ -243,11 +244,15 @@ class PortAllocatorTest : public testing::Test, public sigslot::has_slots<> {
 | 
|    // it should be ignore.
 | 
|    void CheckDisableAdapterEnumeration(
 | 
|        uint32 total_ports,
 | 
| +      const rtc::IPAddress& host_candidate_addr,
 | 
|        const rtc::IPAddress& stun_candidate_addr,
 | 
|        const rtc::IPAddress& relay_candidate_udp_transport_addr,
 | 
|        const rtc::IPAddress& relay_candidate_tcp_transport_addr) {
 | 
| -    EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP));
 | 
| -    session_->set_flags(cricket::PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION |
 | 
| +    if (!session_) {
 | 
| +      EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP));
 | 
| +    }
 | 
| +    session_->set_flags(session_->flags() |
 | 
| +                        cricket::PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION |
 | 
|                          cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG |
 | 
|                          cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET);
 | 
|      allocator().set_allow_tcp_listen(false);
 | 
| @@ -255,28 +260,36 @@ class PortAllocatorTest : public testing::Test, public sigslot::has_slots<> {
 | 
|      EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
 | 
|  
 | 
|      uint32 total_candidates = 0;
 | 
| -    if (!stun_candidate_addr.IsNil()) {
 | 
| +    if (!host_candidate_addr.IsNil()) {
 | 
| +      EXPECT_PRED5(CheckCandidate, candidates_[total_candidates],
 | 
| +                   cricket::ICE_CANDIDATE_COMPONENT_RTP, "local", "udp",
 | 
| +                   rtc::SocketAddress(host_candidate_addr, 0));
 | 
|        ++total_candidates;
 | 
| -      EXPECT_PRED5(CheckCandidate, candidates_[0],
 | 
| +    }
 | 
| +    if (!stun_candidate_addr.IsNil()) {
 | 
| +      EXPECT_PRED5(CheckCandidate, candidates_[total_candidates],
 | 
|                     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());
 | 
| +      EXPECT_EQ(rtc::EmptySocketAddressWithFamily(
 | 
| +                    candidates_[total_candidates].address().family()),
 | 
| +                candidates_[total_candidates].related_address());
 | 
| +      ++total_candidates;
 | 
|      }
 | 
|      if (!relay_candidate_udp_transport_addr.IsNil()) {
 | 
| -      ++total_candidates;
 | 
| -      EXPECT_PRED5(CheckCandidate, candidates_[1],
 | 
| +      EXPECT_PRED5(CheckCandidate, candidates_[total_candidates],
 | 
|                     cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp",
 | 
|                     rtc::SocketAddress(relay_candidate_udp_transport_addr, 0));
 | 
| -      EXPECT_EQ(stun_candidate_addr, candidates_[1].related_address().ipaddr());
 | 
| +      EXPECT_EQ(stun_candidate_addr,
 | 
| +                candidates_[total_candidates].related_address().ipaddr());
 | 
| +      ++total_candidates;
 | 
|      }
 | 
|      if (!relay_candidate_tcp_transport_addr.IsNil()) {
 | 
| -      ++total_candidates;
 | 
| -      EXPECT_PRED5(CheckCandidate, candidates_[2],
 | 
| +      EXPECT_PRED5(CheckCandidate, candidates_[total_candidates],
 | 
|                     cricket::ICE_CANDIDATE_COMPONENT_RTP, "relay", "udp",
 | 
|                     rtc::SocketAddress(relay_candidate_tcp_transport_addr, 0));
 | 
| -      EXPECT_EQ(stun_candidate_addr, candidates_[2].related_address().ipaddr());
 | 
| +      EXPECT_EQ(stun_candidate_addr,
 | 
| +                candidates_[total_candidates].related_address().ipaddr());
 | 
| +      ++total_candidates;
 | 
|      }
 | 
|  
 | 
|      EXPECT_EQ(total_candidates, candidates_.size());
 | 
| @@ -383,6 +396,18 @@ TEST_F(PortAllocatorTest, TestNoNetworkInterface) {
 | 
|    EXPECT_EQ(0U, candidates_.size());
 | 
|  }
 | 
|  
 | 
| +// Test that we could use loopback interface as host candidate.
 | 
| +TEST_F(PortAllocatorTest, TestLoopbackNetworkInterface) {
 | 
| +  AddInterface(kLoopbackAddr);
 | 
| +  EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP));
 | 
| +  session_->set_flags(cricket::PORTALLOCATOR_DISABLE_STUN |
 | 
| +                      cricket::PORTALLOCATOR_DISABLE_RELAY |
 | 
| +                      cricket::PORTALLOCATOR_DISABLE_TCP);
 | 
| +  session_->StartGettingPorts();
 | 
| +  EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
 | 
| +  EXPECT_EQ(1U, candidates_.size());
 | 
| +}
 | 
| +
 | 
|  // Tests that we can get all the desired addresses successfully.
 | 
|  TEST_F(PortAllocatorTest, TestGetAllPortsWithMinimumStepDelay) {
 | 
|    AddInterface(kClientAddr);
 | 
| @@ -509,7 +534,7 @@ TEST_F(PortAllocatorTest, TestDisableAdapterEnumerationBehindNat) {
 | 
|    AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
 | 
|    // Expect to see 3 ports: STUN, TURN/UDP and TCP ports, and both STUN and
 | 
|    // TURN/UDP candidates.
 | 
| -  CheckDisableAdapterEnumeration(3U, kNatUdpAddr.ipaddr(),
 | 
| +  CheckDisableAdapterEnumeration(3U, rtc::IPAddress(), kNatUdpAddr.ipaddr(),
 | 
|                                   kTurnUdpExtAddr.ipaddr(), rtc::IPAddress());
 | 
|  }
 | 
|  
 | 
| @@ -523,7 +548,7 @@ TEST_F(PortAllocatorTest,
 | 
|    AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
 | 
|    // Expect to see 3 ports: STUN, TURN/UDP and TCP ports, and both STUN and
 | 
|    // TURN/UDP candidates.
 | 
| -  CheckDisableAdapterEnumeration(3U, kNatUdpAddr.ipaddr(),
 | 
| +  CheckDisableAdapterEnumeration(3U, rtc::IPAddress(), kNatUdpAddr.ipaddr(),
 | 
|                                   kTurnUdpExtAddr.ipaddr(), rtc::IPAddress());
 | 
|  }
 | 
|  
 | 
| @@ -537,7 +562,7 @@ TEST_F(PortAllocatorTest, TestDisableAdapterEnumerationBehindNatWithTcp) {
 | 
|    AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
 | 
|    // Expect to see 4 ports - STUN, TURN/UDP, TURN/TCP and TCP port. STUN,
 | 
|    // TURN/UDP, and TURN/TCP candidates.
 | 
| -  CheckDisableAdapterEnumeration(4U, kNatUdpAddr.ipaddr(),
 | 
| +  CheckDisableAdapterEnumeration(4U, rtc::IPAddress(), kNatUdpAddr.ipaddr(),
 | 
|                                   kTurnUdpExtAddr.ipaddr(),
 | 
|                                   kTurnUdpExtAddr.ipaddr());
 | 
|  }
 | 
| @@ -552,7 +577,7 @@ TEST_F(PortAllocatorTest, TestDisableAdapterEnumerationWithoutNat) {
 | 
|    // Expect to see 3 ports: STUN, TURN/UDP and TCP ports, but only both STUN and
 | 
|    // TURN candidates. The STUN candidate should have kClientAddr as srflx
 | 
|    // address, and TURN candidate with kClientAddr as the related address.
 | 
| -  CheckDisableAdapterEnumeration(3U, kClientAddr.ipaddr(),
 | 
| +  CheckDisableAdapterEnumeration(3U, rtc::IPAddress(), kClientAddr.ipaddr(),
 | 
|                                   kTurnUdpExtAddr.ipaddr(), rtc::IPAddress());
 | 
|  }
 | 
|  
 | 
| @@ -563,6 +588,22 @@ TEST_F(PortAllocatorTest, TestDisableAdapterEnumerationWithoutNatOrServers) {
 | 
|    ResetWithNoServersOrNat();
 | 
|    // Expect to see 2 ports: STUN and TCP ports, but no candidate.
 | 
|    CheckDisableAdapterEnumeration(2U, rtc::IPAddress(), rtc::IPAddress(),
 | 
| +                                 rtc::IPAddress(), rtc::IPAddress());
 | 
| +}
 | 
| +
 | 
| +// Test that when adapter enumeration is disabled, with
 | 
| +// PORTALLOCATOR_ENABLE_LOCALHOST_CANDIDATE specified, for endpoints not behind
 | 
| +// a NAT, there are a localhost candidate in addition to a STUN candidate.
 | 
| +TEST_F(PortAllocatorTest,
 | 
| +       TestDisableAdapterEnumerationWithoutNatLocalhostCandidateRequested) {
 | 
| +  AddInterfaceAsDefaultRoute(kClientAddr);
 | 
| +  ResetWithStunServerNoNat(kStunAddr);
 | 
| +  EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP));
 | 
| +  session_->set_flags(cricket::PORTALLOCATOR_ENABLE_LOCALHOST_CANDIDATE);
 | 
| +  // Expect to see 2 ports: STUN and TCP ports, localhost candidate and STUN
 | 
| +  // candidate.
 | 
| +  CheckDisableAdapterEnumeration(2U, rtc::GetLoopbackIP(AF_INET),
 | 
| +                                 kClientAddr.ipaddr(), rtc::IPAddress(),
 | 
|                                   rtc::IPAddress());
 | 
|  }
 | 
|  
 | 
| 
 |