Correct data histogram entry for incoming DC
Both incoming and outgoing datachannels should cause
the DATA_ADDED flag to be set.
This CL also moves all tests into their own file, and
improves scaffolding.
Bug: chromium:718508
Change-Id: I5c4c257ccb6f26799f7593bce8b27ebf59015b1e
Reviewed-on: https://webrtc-review.googlesource.com/85348
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23766}
diff --git a/pc/peerconnection_histogram_unittest.cc b/pc/peerconnection_histogram_unittest.cc
index b554e86..e6255d5 100644
--- a/pc/peerconnection_histogram_unittest.cc
+++ b/pc/peerconnection_histogram_unittest.cc
@@ -18,9 +18,6 @@
#include "pc/peerconnectionfactory.h"
#include "pc/peerconnectionwrapper.h"
#include "pc/sdputils.h"
-#ifdef WEBRTC_ANDROID
-#include "pc/test/androidtestinitializer.h"
-#endif
#include "pc/test/fakesctptransport.h"
#include "rtc_base/gunit.h"
#include "rtc_base/ptr_util.h"
@@ -64,7 +61,23 @@
void ReturnHistogramVeryQuickly() { return_histogram_very_quickly_ = true; }
private:
- bool return_histogram_very_quickly_;
+ bool return_histogram_very_quickly_ = false;
+};
+
+class PeerConnectionWrapperForUsageHistogramTest;
+typedef PeerConnectionWrapperForUsageHistogramTest* RawWrapperPtr;
+
+class ObserverForUsageHistogramTest : public MockPeerConnectionObserver {
+ public:
+ void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override;
+ void PrepareToExchangeCandidates(RawWrapperPtr other) {
+ candidate_target_ = other;
+ }
+
+ bool HaveDataChannel() { return last_datachannel_; }
+
+ private:
+ RawWrapperPtr candidate_target_; // Note: Not thread-safe against deletions.
};
class PeerConnectionWrapperForUsageHistogramTest
@@ -78,8 +91,35 @@
pc());
return static_cast<PeerConnection*>(pci->internal());
}
+
+ void PrepareToExchangeCandidates(
+ PeerConnectionWrapperForUsageHistogramTest* other) {
+ static_cast<ObserverForUsageHistogramTest*>(observer())
+ ->PrepareToExchangeCandidates(other);
+ static_cast<ObserverForUsageHistogramTest*>(other->observer())
+ ->PrepareToExchangeCandidates(this);
+ }
+
+ bool IsConnected() {
+ return pc()->ice_connection_state() ==
+ PeerConnectionInterface::kIceConnectionConnected ||
+ pc()->ice_connection_state() ==
+ PeerConnectionInterface::kIceConnectionCompleted;
+ }
+
+ bool HaveDataChannel() {
+ return static_cast<ObserverForUsageHistogramTest*>(observer())
+ ->HaveDataChannel();
+ }
};
+void ObserverForUsageHistogramTest::OnIceCandidate(
+ const webrtc::IceCandidateInterface* candidate) {
+ if (candidate_target_) {
+ candidate_target_->pc()->AddIceCandidate(candidate);
+ }
+}
+
class PeerConnectionUsageHistogramTest : public ::testing::Test {
protected:
typedef std::unique_ptr<PeerConnectionWrapperForUsageHistogramTest>
@@ -87,9 +127,6 @@
PeerConnectionUsageHistogramTest()
: vss_(new rtc::VirtualSocketServer()), main_(vss_.get()) {
-#ifdef WEBRTC_ANDROID
- InitializeAndroidObjects();
-#endif
}
WrapperPtr CreatePeerConnection() {
@@ -113,7 +150,7 @@
if (immediate_report) {
pc_factory->ReturnHistogramVeryQuickly();
}
- auto observer = rtc::MakeUnique<MockPeerConnectionObserver>();
+ auto observer = rtc::MakeUnique<ObserverForUsageHistogramTest>();
auto pc = pc_factory->CreatePeerConnection(config, nullptr, nullptr,
observer.get());
if (!pc) {
@@ -142,4 +179,67 @@
kDefaultTimeout);
}
+#ifndef WEBRTC_ANDROID
+// These tests do not work on Android. Why is unclear.
+// https://bugs.webrtc.org/9461
+
+// Test getting the usage fingerprint for an audio/video connection.
+TEST_F(PeerConnectionUsageHistogramTest, FingerprintAudioVideo) {
+ auto caller = CreatePeerConnection();
+ auto callee = CreatePeerConnection();
+ // Register UMA observer before signaling begins.
+ auto caller_observer = caller->RegisterFakeMetricsObserver();
+ auto callee_observer = callee->RegisterFakeMetricsObserver();
+ caller->AddAudioTrack("audio");
+ caller->AddVideoTrack("video");
+ caller->PrepareToExchangeCandidates(callee.get());
+ ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
+ ASSERT_TRUE_WAIT(caller->IsConnected(), kDefaultTimeout);
+ ASSERT_TRUE_WAIT(callee->IsConnected(), kDefaultTimeout);
+ caller->pc()->Close();
+ callee->pc()->Close();
+ int expected_fingerprint = MakeUsageFingerprint(
+ {PeerConnection::UsageEvent::AUDIO_ADDED,
+ PeerConnection::UsageEvent::VIDEO_ADDED,
+ PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_CALLED,
+ PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_CALLED,
+ PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
+ PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
+ PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
+ PeerConnection::UsageEvent::CLOSE_CALLED});
+ EXPECT_TRUE(caller_observer->ExpectOnlySingleEnumCount(
+ webrtc::kEnumCounterUsagePattern, expected_fingerprint));
+ EXPECT_TRUE(callee_observer->ExpectOnlySingleEnumCount(
+ webrtc::kEnumCounterUsagePattern, expected_fingerprint));
+}
+
+#ifdef HAVE_SCTP
+TEST_F(PeerConnectionUsageHistogramTest, FingerprintDataOnly) {
+ auto caller = CreatePeerConnection();
+ auto callee = CreatePeerConnection();
+ // Register UMA observer before signaling begins.
+ auto caller_observer = caller->RegisterFakeMetricsObserver();
+ auto callee_observer = callee->RegisterFakeMetricsObserver();
+ caller->CreateDataChannel("foodata");
+ caller->PrepareToExchangeCandidates(callee.get());
+ ASSERT_TRUE(caller->ExchangeOfferAnswerWith(callee.get()));
+ ASSERT_TRUE_WAIT(callee->HaveDataChannel(), kDefaultTimeout);
+ caller->pc()->Close();
+ callee->pc()->Close();
+ int expected_fingerprint = MakeUsageFingerprint(
+ {PeerConnection::UsageEvent::DATA_ADDED,
+ PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_CALLED,
+ PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_CALLED,
+ PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
+ PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
+ PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
+ PeerConnection::UsageEvent::CLOSE_CALLED});
+ EXPECT_TRUE(caller_observer->ExpectOnlySingleEnumCount(
+ webrtc::kEnumCounterUsagePattern, expected_fingerprint));
+ EXPECT_TRUE(callee_observer->ExpectOnlySingleEnumCount(
+ webrtc::kEnumCounterUsagePattern, expected_fingerprint));
+}
+#endif // HAVE_SCTP
+#endif // WEBRTC_ANDROID
+
} // namespace webrtc