Index: webrtc/p2p/base/p2ptransportchannel_unittest.cc |
diff --git a/webrtc/p2p/base/p2ptransportchannel_unittest.cc b/webrtc/p2p/base/p2ptransportchannel_unittest.cc |
index d7ee87300d9ed5f9d886bb7a0c8190d2a2e9c080..b7b5f530ee6c7c6101e8d3712b59a318fc684f8e 100644 |
--- a/webrtc/p2p/base/p2ptransportchannel_unittest.cc |
+++ b/webrtc/p2p/base/p2ptransportchannel_unittest.cc |
@@ -11,6 +11,7 @@ |
#include <algorithm> |
#include <memory> |
+#include "webrtc/api/fakemetricsobserver.h" |
#include "webrtc/p2p/base/fakeportallocator.h" |
#include "webrtc/p2p/base/p2ptransportchannel.h" |
#include "webrtc/p2p/base/testrelayserver.h" |
@@ -198,9 +199,15 @@ class P2PTransportChannelTestBase : public testing::Test, |
ep1_.allocator_.reset( |
CreateBasicPortAllocator(&ep1_.network_manager_, stun_servers, |
kTurnUdpIntAddr, rtc::SocketAddress())); |
+ ep1_.metrics_observer_ = |
+ new rtc::RefCountedObject<webrtc::FakeMetricsObserver>(); |
+ ep1_.allocator_->set_metrics_observer(ep1_.metrics_observer_); |
ep2_.allocator_.reset( |
CreateBasicPortAllocator(&ep2_.network_manager_, stun_servers, |
kTurnUdpIntAddr, rtc::SocketAddress())); |
+ ep2_.metrics_observer_ = |
+ new rtc::RefCountedObject<webrtc::FakeMetricsObserver>(); |
+ ep2_.allocator_->set_metrics_observer(ep2_.metrics_observer_); |
} |
protected: |
@@ -298,6 +305,9 @@ class P2PTransportChannelTestBase : public testing::Test, |
} |
rtc::FakeNetworkManager network_manager_; |
+ // |metrics_observer_| should outlive |allocator_| as the former may be |
+ // used by the latter. |
+ rtc::scoped_refptr<webrtc::FakeMetricsObserver> metrics_observer_; |
std::unique_ptr<BasicPortAllocator> allocator_; |
ChannelData cd1_; |
ChannelData cd2_; |
@@ -416,6 +426,9 @@ class P2PTransportChannelTestBase : public testing::Test, |
PortAllocator* GetAllocator(int endpoint) { |
return GetEndpoint(endpoint)->allocator_.get(); |
} |
+ webrtc::FakeMetricsObserver* GetMetricsObserver(int endpoint) { |
+ return GetEndpoint(endpoint)->metrics_observer_; |
+ } |
void AddAddress(int endpoint, const SocketAddress& addr) { |
GetEndpoint(endpoint)->network_manager_.AddInterface(addr); |
} |
@@ -1172,6 +1185,187 @@ TEST_F(P2PTransportChannelTest, GetStats) { |
DestroyChannels(); |
} |
+TEST_F(P2PTransportChannelTest, |
+ TestIceRegatheringReasonIceRestartWhenDisconnected) { |
+ rtc::ScopedFakeClock clock; |
+ ConfigureEndpoints(OPEN, OPEN, kOnlyLocalPorts, kOnlyLocalPorts); |
+ |
+ CreateChannels(); |
+ EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() && |
+ ep2_ch1()->receiving() && |
+ ep2_ch1()->writable(), |
+ kDefaultTimeout, clock); |
+ |
+ // Drop all packets so that both channels become not writable. |
+ fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[0]); |
+ const int kWriteTimeoutDelay = 6000; |
+ EXPECT_TRUE_SIMULATED_WAIT(!ep1_ch1()->writable() && !ep2_ch1()->writable(), |
+ kWriteTimeoutDelay, clock); |
+ |
+ ep1_ch1()->SetIceParameters(kIceParams[2]); |
+ ep1_ch1()->SetRemoteIceParameters(kIceParams[3]); |
+ ep1_ch1()->MaybeStartGathering(); |
+ EXPECT_EQ(1, GetMetricsObserver(0)->GetEnumCounter( |
+ webrtc::kEnumCounterIceRegatheringReason, |
+ static_cast<int>( |
+ IceRegatheringReason::ICE_RESTART_WHEN_DISCONNECTED))); |
+ |
+ ep2_ch1()->SetIceParameters(kIceParams[3]); |
+ ep2_ch1()->SetRemoteIceParameters(kIceParams[2]); |
+ ep2_ch1()->MaybeStartGathering(); |
+ EXPECT_EQ(1, GetMetricsObserver(1)->GetEnumCounter( |
+ webrtc::kEnumCounterIceRegatheringReason, |
+ static_cast<int>( |
+ IceRegatheringReason::ICE_RESTART_WHEN_DISCONNECTED))); |
+ |
+ DestroyChannels(); |
+} |
+ |
+TEST_F(P2PTransportChannelTest, |
+ TestIceRegatheringReasonIceRestartWhenConnected) { |
+ rtc::ScopedFakeClock clock; |
+ ConfigureEndpoints(OPEN, OPEN, kOnlyLocalPorts, kOnlyLocalPorts); |
+ |
+ CreateChannels(); |
+ EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() && |
+ ep2_ch1()->receiving() && |
+ ep2_ch1()->writable(), |
+ kDefaultTimeout, clock); |
+ |
+ ep1_ch1()->SetIceParameters(kIceParams[2]); |
+ ep1_ch1()->SetRemoteIceParameters(kIceParams[3]); |
+ ep1_ch1()->MaybeStartGathering(); |
+ EXPECT_EQ( |
+ 1, |
+ GetMetricsObserver(0)->GetEnumCounter( |
+ webrtc::kEnumCounterIceRegatheringReason, |
+ static_cast<int>(IceRegatheringReason::ICE_RESTART_WHEN_CONNECTED))); |
+ |
+ ep2_ch1()->SetIceParameters(kIceParams[3]); |
+ ep2_ch1()->SetRemoteIceParameters(kIceParams[2]); |
+ ep2_ch1()->MaybeStartGathering(); |
+ EXPECT_EQ( |
+ 1, |
+ GetMetricsObserver(1)->GetEnumCounter( |
+ webrtc::kEnumCounterIceRegatheringReason, |
+ static_cast<int>(IceRegatheringReason::ICE_RESTART_WHEN_CONNECTED))); |
+ |
+ DestroyChannels(); |
+} |
+ |
+TEST_F(P2PTransportChannelTest, |
+ TestIceRegatheringReasonIceRestartWhenConnecting) { |
+ rtc::ScopedFakeClock clock; |
+ ConfigureEndpoints(OPEN, OPEN, kOnlyLocalPorts, kOnlyLocalPorts); |
+ |
+ // Create the channels without waiting for them to become connected. |
+ CreateChannels(); |
+ |
+ ep1_ch1()->SetIceParameters(kIceParams[2]); |
+ ep1_ch1()->SetRemoteIceParameters(kIceParams[3]); |
+ ep1_ch1()->MaybeStartGathering(); |
+ EXPECT_EQ( |
+ 1, |
+ GetMetricsObserver(0)->GetEnumCounter( |
+ webrtc::kEnumCounterIceRegatheringReason, |
+ static_cast<int>(IceRegatheringReason::ICE_RESTART_WHEN_CONNECTING))); |
+ |
+ ep2_ch1()->SetIceParameters(kIceParams[3]); |
+ ep2_ch1()->SetRemoteIceParameters(kIceParams[2]); |
+ ep2_ch1()->MaybeStartGathering(); |
+ EXPECT_EQ( |
+ 1, |
+ GetMetricsObserver(1)->GetEnumCounter( |
+ webrtc::kEnumCounterIceRegatheringReason, |
+ static_cast<int>(IceRegatheringReason::ICE_RESTART_WHEN_CONNECTING))); |
+ |
+ DestroyChannels(); |
+} |
+ |
+// Test the ICE regathering reason where there is a network change on |
+// both endpoints and one of them enables continual gathering but the other |
+// does not. |
+TEST_F(P2PTransportChannelTest, |
+ TestIceRegatheringReasonContinualGatheringByNetworkChange) { |
+ rtc::ScopedFakeClock clock; |
+ ConfigureEndpoints(OPEN, OPEN, kOnlyLocalPorts, kOnlyLocalPorts); |
+ |
+ // ep1 gathers continually but ep2 does not. |
+ IceConfig continual_gathering_config = |
+ CreateIceConfig(1000, GATHER_CONTINUALLY); |
+ IceConfig default_config; |
+ CreateChannels(continual_gathering_config, default_config); |
+ |
+ EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() && |
+ ep2_ch1()->receiving() && |
+ ep2_ch1()->writable(), |
+ kDefaultTimeout, clock); |
+ |
+ // Add address in ep1 will trigger continual gathering. |
+ AddAddress(0, kAlternateAddrs[0]); |
+ EXPECT_EQ_SIMULATED_WAIT( |
+ 1, GetMetricsObserver(0)->GetEnumCounter( |
+ webrtc::kEnumCounterIceRegatheringReason, |
+ static_cast<int>( |
+ IceRegatheringReason::CONTINUAL_GATHERING_BY_NETWORK_CHANGE)), |
+ kDefaultTimeout, clock); |
+ |
+ ep2_ch1()->SetIceParameters(kIceParams[3]); |
+ ep2_ch1()->SetRemoteIceParameters(kIceParams[2]); |
+ ep2_ch1()->MaybeStartGathering(); |
+ |
+ AddAddress(1, kAlternateAddrs[1]); |
+ SIMULATED_WAIT(false, kDefaultTimeout, clock); |
+ // ep2 has not enabled continual gathering. |
+ EXPECT_EQ( |
+ 0, GetMetricsObserver(1)->GetEnumCounter( |
+ webrtc::kEnumCounterIceRegatheringReason, |
+ static_cast<int>( |
+ IceRegatheringReason::CONTINUAL_GATHERING_BY_NETWORK_CHANGE))); |
+ |
+ DestroyChannels(); |
+} |
+ |
+// Test the ICE regathering reason where there is a network failure on |
+// both endpoints and one of them enables continual gathering but the other |
+// does not. |
+TEST_F(P2PTransportChannelTest, |
+ TestIceRegatheringReasonContinualGatheringByNetworkFailure) { |
+ rtc::ScopedFakeClock clock; |
+ ConfigureEndpoints(OPEN, OPEN, kOnlyLocalPorts, kOnlyLocalPorts); |
+ |
+ // ep1 gathers continually but ep2 does not. |
+ IceConfig config1 = CreateIceConfig(1000, GATHER_CONTINUALLY); |
+ config1.regather_on_failed_networks_interval = rtc::Optional<int>(2000); |
+ IceConfig config2; |
+ config2.regather_on_failed_networks_interval = rtc::Optional<int>(2000); |
+ CreateChannels(config1, config2); |
+ |
+ EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() && |
+ ep2_ch1()->receiving() && |
+ ep2_ch1()->writable(), |
+ kDefaultTimeout, clock); |
+ |
+ fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[0]); |
+ // Timeout value such that all connections are deleted. |
+ const int kNetworkFailureTimeout = 35000; |
+ SIMULATED_WAIT(false, kNetworkFailureTimeout, clock); |
+ EXPECT_LE( |
+ 1, |
+ GetMetricsObserver(0)->GetEnumCounter( |
+ webrtc::kEnumCounterIceRegatheringReason, |
+ static_cast<int>( |
+ IceRegatheringReason::CONTINUAL_GATHERING_BY_NETWORK_FAILURE))); |
+ EXPECT_EQ( |
+ 0, |
+ GetMetricsObserver(1)->GetEnumCounter( |
+ webrtc::kEnumCounterIceRegatheringReason, |
+ static_cast<int>( |
+ IceRegatheringReason::CONTINUAL_GATHERING_BY_NETWORK_FAILURE))); |
+ |
+ DestroyChannels(); |
+} |
+ |
// Test that we properly create a connection on a STUN ping from unknown address |
// when the signaling is slow. |
TEST_F(P2PTransportChannelTest, PeerReflexiveCandidateBeforeSignaling) { |