Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(218)

Unified Diff: webrtc/p2p/base/p2ptransportchannel_unittest.cc

Issue 2386783002: Add UMA metrics for ICE regathering reasons. (Closed)
Patch Set: Address comments Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698