Index: p2p/client/basicportallocator_unittest.cc |
diff --git a/p2p/client/basicportallocator_unittest.cc b/p2p/client/basicportallocator_unittest.cc |
index 52c83349ef62787e24a1ecfab8edc2176f896686..beebe976a0083c2b0a48522bf4d79871fc5ed543 100644 |
--- a/p2p/client/basicportallocator_unittest.cc |
+++ b/p2p/client/basicportallocator_unittest.cc |
@@ -752,17 +752,15 @@ TEST_F(BasicPortAllocatorTest, TestIgnoreNetworksAccordingToIgnoreMask) { |
EXPECT_EQ(0x12345602U, candidates_[0].address().ip()); |
} |
-// Test that high cost networks are filtered if the flag |
-// PORTALLOCATOR_DISABLE_COSTLY_NETWORKS is set. |
-TEST_F(BasicPortAllocatorTest, TestGatherLowCostNetworkOnly) { |
- SocketAddress addr_wifi(IPAddress(0x12345600U), 0); |
- SocketAddress addr_cellular(IPAddress(0x12345601U), 0); |
- SocketAddress addr_unknown1(IPAddress(0x12345602U), 0); |
- SocketAddress addr_unknown2(IPAddress(0x12345603U), 0); |
- // If both Wi-Fi and cellular interfaces are present, only gather on the Wi-Fi |
- // interface. |
- AddInterface(addr_wifi, "test_wlan0", rtc::ADAPTER_TYPE_WIFI); |
- AddInterface(addr_cellular, "test_cell0", rtc::ADAPTER_TYPE_CELLULAR); |
+// Test that when the PORTALLOCATOR_DISABLE_COSTLY_NETWORKS flag is set and |
+// both Wi-Fi and cell interfaces are available, only Wi-Fi is used. |
+TEST_F(BasicPortAllocatorTest, |
+ WifiUsedInsteadOfCellWhenCostlyNetworksDisabled) { |
+ SocketAddress wifi(IPAddress(0x12345600U), 0); |
+ SocketAddress cell(IPAddress(0x12345601U), 0); |
+ AddInterface(wifi, "test_wlan0", rtc::ADAPTER_TYPE_WIFI); |
+ AddInterface(cell, "test_cell0", rtc::ADAPTER_TYPE_CELLULAR); |
+ // Disable all but UDP candidates to make the test simpler. |
allocator().set_flags(cricket::PORTALLOCATOR_DISABLE_STUN | |
cricket::PORTALLOCATOR_DISABLE_RELAY | |
cricket::PORTALLOCATOR_DISABLE_TCP | |
@@ -771,35 +769,84 @@ TEST_F(BasicPortAllocatorTest, TestGatherLowCostNetworkOnly) { |
session_->StartGettingPorts(); |
EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_, |
kDefaultAllocationTimeout, fake_clock); |
+ // Should only get one Wi-Fi candidate. |
EXPECT_EQ(1U, candidates_.size()); |
- EXPECT_TRUE(addr_wifi.EqualIPs(candidates_[0].address())); |
+ EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", wifi); |
+} |
- // If both cellular and unknown interfaces are present, only gather on the |
- // unknown interfaces. |
- candidates_.clear(); |
- candidate_allocation_done_ = false; |
- RemoveInterface(addr_wifi); |
- AddInterface(addr_unknown1, "test_unknown0", rtc::ADAPTER_TYPE_UNKNOWN); |
- AddInterface(addr_unknown2, "test_unknown1", rtc::ADAPTER_TYPE_UNKNOWN); |
+// Test that when the PORTALLOCATOR_DISABLE_COSTLY_NETWORKS flag is set and |
+// both "unknown" and cell interfaces are available, only the unknown are used. |
+// The unknown interface may be something that ultimately uses Wi-Fi, so we do |
+// this to be on the safe side. |
+TEST_F(BasicPortAllocatorTest, |
+ UnknownInterfaceUsedInsteadOfCellWhenCostlyNetworksDisabled) { |
+ SocketAddress cell(IPAddress(0x12345601U), 0); |
+ SocketAddress unknown1(IPAddress(0x12345602U), 0); |
+ SocketAddress unknown2(IPAddress(0x12345603U), 0); |
+ AddInterface(cell, "test_cell0", rtc::ADAPTER_TYPE_CELLULAR); |
+ AddInterface(unknown1, "test_unknown0", rtc::ADAPTER_TYPE_UNKNOWN); |
+ AddInterface(unknown2, "test_unknown1", rtc::ADAPTER_TYPE_UNKNOWN); |
+ // Disable all but UDP candidates to make the test simpler. |
+ allocator().set_flags(cricket::PORTALLOCATOR_DISABLE_STUN | |
+ cricket::PORTALLOCATOR_DISABLE_RELAY | |
+ cricket::PORTALLOCATOR_DISABLE_TCP | |
+ cricket::PORTALLOCATOR_DISABLE_COSTLY_NETWORKS); |
+ EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
session_->StartGettingPorts(); |
EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_, |
kDefaultAllocationTimeout, fake_clock); |
+ // Should only get two candidates, none of which is cell. |
EXPECT_EQ(2U, candidates_.size()); |
- EXPECT_TRUE((addr_unknown1.EqualIPs(candidates_[0].address()) && |
- addr_unknown2.EqualIPs(candidates_[1].address())) || |
- (addr_unknown1.EqualIPs(candidates_[1].address()) && |
- addr_unknown2.EqualIPs(candidates_[0].address()))); |
+ EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", unknown1); |
+ EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", unknown2); |
+} |
- // If Wi-Fi, cellular, unknown interfaces are all present, only gather on the |
- // Wi-Fi interface. |
- candidates_.clear(); |
- candidate_allocation_done_ = false; |
- AddInterface(addr_wifi, "test_wlan0", rtc::ADAPTER_TYPE_WIFI); |
+// Test that when the PORTALLOCATOR_DISABLE_COSTLY_NETWORKS flag is set and |
+// there are a mix of Wi-Fi, "unknown" and cell interfaces, only the Wi-Fi |
+// interface is used. |
+TEST_F(BasicPortAllocatorTest, |
+ WifiUsedInsteadOfUnknownOrCellWhenCostlyNetworksDisabled) { |
+ SocketAddress wifi(IPAddress(0x12345600U), 0); |
+ SocketAddress cellular(IPAddress(0x12345601U), 0); |
+ SocketAddress unknown1(IPAddress(0x12345602U), 0); |
+ SocketAddress unknown2(IPAddress(0x12345603U), 0); |
+ AddInterface(wifi, "test_wlan0", rtc::ADAPTER_TYPE_WIFI); |
+ AddInterface(cellular, "test_cell0", rtc::ADAPTER_TYPE_CELLULAR); |
+ AddInterface(unknown1, "test_unknown0", rtc::ADAPTER_TYPE_UNKNOWN); |
+ AddInterface(unknown2, "test_unknown1", rtc::ADAPTER_TYPE_UNKNOWN); |
+ // Disable all but UDP candidates to make the test simpler. |
+ allocator().set_flags(cricket::PORTALLOCATOR_DISABLE_STUN | |
+ cricket::PORTALLOCATOR_DISABLE_RELAY | |
+ cricket::PORTALLOCATOR_DISABLE_TCP | |
+ cricket::PORTALLOCATOR_DISABLE_COSTLY_NETWORKS); |
+ EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
session_->StartGettingPorts(); |
EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_, |
kDefaultAllocationTimeout, fake_clock); |
+ // Should only get one Wi-Fi candidate. |
EXPECT_EQ(1U, candidates_.size()); |
- EXPECT_TRUE(addr_wifi.EqualIPs(candidates_[0].address())); |
+ EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", wifi); |
+} |
+ |
+// Test that if the PORTALLOCATOR_DISABLE_COSTLY_NETWORKS flag is set, but the |
+// only interface available is cellular, it ends up used anyway. A costly |
+// connection is always better than no connection. |
+TEST_F(BasicPortAllocatorTest, |
+ CellUsedWhenCostlyNetworksDisabledButThereAreNoOtherInterfaces) { |
+ SocketAddress cellular(IPAddress(0x12345601U), 0); |
+ AddInterface(cellular, "test_cell0", rtc::ADAPTER_TYPE_CELLULAR); |
+ // Disable all but UDP candidates to make the test simpler. |
+ allocator().set_flags(cricket::PORTALLOCATOR_DISABLE_STUN | |
+ cricket::PORTALLOCATOR_DISABLE_RELAY | |
+ cricket::PORTALLOCATOR_DISABLE_TCP | |
+ cricket::PORTALLOCATOR_DISABLE_COSTLY_NETWORKS); |
+ EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP)); |
+ session_->StartGettingPorts(); |
+ EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_, |
+ kDefaultAllocationTimeout, fake_clock); |
+ // Make sure we got the cell candidate. |
+ EXPECT_EQ(1U, candidates_.size()); |
+ EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", cellular); |
} |
// Test that no more than allocator.max_ipv6_networks() IPv6 networks are used |
@@ -953,6 +1000,46 @@ TEST_F(BasicPortAllocatorTest, TestSameNetworkDownAndUpWhenSessionStopped) { |
EXPECT_EQ(0U, ports_.size()); |
} |
+// Similar to the above tests, but tests a situation when sockets can't be |
+// bound to a network interface, then after a network change event can be. |
+// Related bug: https://bugs.chromium.org/p/webrtc/issues/detail?id=8256 |
+TEST_F(BasicPortAllocatorTest, CandidatesRegatheredAfterBindingFails) { |
+ // Only test local ports to simplify test. |
+ ResetWithNoServersOrNat(); |
+ // Provide a situation where the interface appears to be available, but |
+ // binding the sockets fails. See bug for description of when this can |
+ // happen. |
+ std::string if_name("test_net0"); |
+ AddInterface(kClientAddr, if_name); |
+ fss_->set_tcp_sockets_enabled(false); |
+ fss_->set_udp_sockets_enabled(false); |
+ EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP)); |
+ session_->StartGettingPorts(); |
+ ASSERT_TRUE_SIMULATED_WAIT(candidate_allocation_done_, |
+ kDefaultAllocationTimeout, fake_clock); |
+ // Make sure we actually prevented candidates from being gathered (other than |
+ // a single TCP active candidate, since that doesn't require creating a |
+ // socket). |
+ ASSERT_EQ(1U, candidates_.size()); |
+ EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr); |
+ candidate_allocation_done_ = false; |
+ |
+ // Now simulate the interface coming up, with the newfound ability to bind |
+ // sockets. |
+ fss_->set_tcp_sockets_enabled(true); |
+ fss_->set_udp_sockets_enabled(true); |
+ AddInterface(kClientAddr, if_name); |
+ ASSERT_TRUE_SIMULATED_WAIT(candidate_allocation_done_, |
+ kDefaultAllocationTimeout, fake_clock); |
+ // Should get UDP and TCP candidate. |
+ ASSERT_EQ(2U, candidates_.size()); |
+ EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr); |
+ // TODO(deadbeef): This is actually the same active TCP candidate as before. |
+ // We should extend this test to also verify that a server candidate is |
+ // gathered. |
+ EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr); |
+} |
+ |
// Verify candidates with default step delay of 1sec. |
TEST_F(BasicPortAllocatorTest, TestGetAllPortsWithOneSecondStepDelay) { |
AddInterface(kClientAddr); |