blob: f40f96c99f6fad7e0cb0c491cd0d66f3dab932e1 [file] [log] [blame]
Harald Alvestrand19793842018-06-25 12:03:50 +02001/*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <tuple>
12
Karl Wiberg918f50c2018-07-05 11:40:33 +020013#include "absl/memory/memory.h"
Harald Alvestrand42386282018-07-12 07:56:05 +020014#include "api/jsep.h"
Harald Alvestrand19793842018-06-25 12:03:50 +020015#include "api/peerconnectionproxy.h"
16#include "media/base/fakemediaengine.h"
Harald Alvestrand056d8112018-07-16 19:18:58 +020017#include "p2p/client/basicportallocator.h"
Harald Alvestrand19793842018-06-25 12:03:50 +020018#include "pc/mediasession.h"
19#include "pc/peerconnection.h"
20#include "pc/peerconnectionfactory.h"
21#include "pc/peerconnectionwrapper.h"
22#include "pc/sdputils.h"
Harald Alvestrand19793842018-06-25 12:03:50 +020023#include "pc/test/fakesctptransport.h"
Harald Alvestrand056d8112018-07-16 19:18:58 +020024#include "rtc_base/fakenetwork.h"
Harald Alvestrand19793842018-06-25 12:03:50 +020025#include "rtc_base/gunit.h"
Harald Alvestrand19793842018-06-25 12:03:50 +020026#include "rtc_base/virtualsocketserver.h"
Qingsi Wang7fc821d2018-07-12 12:54:53 -070027#include "system_wrappers/include/metrics_default.h"
Harald Alvestrand19793842018-06-25 12:03:50 +020028
29namespace webrtc {
30
31using RTCConfiguration = PeerConnectionInterface::RTCConfiguration;
32using RTCOfferAnswerOptions = PeerConnectionInterface::RTCOfferAnswerOptions;
33using ::testing::Values;
34
Harald Alvestrandc0e97252018-07-26 10:39:55 +020035static const char kUsagePatternMetric[] = "WebRTC.PeerConnection.UsagePattern";
Harald Alvestrand19793842018-06-25 12:03:50 +020036static constexpr int kDefaultTimeout = 10000;
Harald Alvestrand056d8112018-07-16 19:18:58 +020037static const rtc::SocketAddress kDefaultLocalAddress("1.1.1.1", 0);
38static const rtc::SocketAddress kPrivateLocalAddress("10.1.1.1", 0);
Harald Alvestrand19793842018-06-25 12:03:50 +020039
40int MakeUsageFingerprint(std::set<PeerConnection::UsageEvent> events) {
41 int signature = 0;
42 for (const auto it : events) {
43 signature |= static_cast<int>(it);
44 }
45 return signature;
46}
47
48class PeerConnectionFactoryForUsageHistogramTest
49 : public rtc::RefCountedObject<PeerConnectionFactory> {
50 public:
51 PeerConnectionFactoryForUsageHistogramTest()
52 : rtc::RefCountedObject<PeerConnectionFactory>(
53 rtc::Thread::Current(),
54 rtc::Thread::Current(),
55 rtc::Thread::Current(),
Karl Wiberg918f50c2018-07-05 11:40:33 +020056 absl::make_unique<cricket::FakeMediaEngine>(),
Harald Alvestrand19793842018-06-25 12:03:50 +020057 CreateCallFactory(),
58 nullptr) {}
59
60 void ActionsBeforeInitializeForTesting(PeerConnectionInterface* pc) override {
61 PeerConnection* internal_pc = static_cast<PeerConnection*>(pc);
62 if (return_histogram_very_quickly_) {
63 internal_pc->ReturnHistogramVeryQuicklyForTesting();
64 }
65 }
66
67 void ReturnHistogramVeryQuickly() { return_histogram_very_quickly_ = true; }
68
69 private:
Harald Alvestrand183e09d2018-06-28 12:04:41 +020070 bool return_histogram_very_quickly_ = false;
71};
72
73class PeerConnectionWrapperForUsageHistogramTest;
74typedef PeerConnectionWrapperForUsageHistogramTest* RawWrapperPtr;
75
76class ObserverForUsageHistogramTest : public MockPeerConnectionObserver {
77 public:
78 void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override;
Harald Alvestrandc0e97252018-07-26 10:39:55 +020079
80 void OnInterestingUsage(int usage_pattern) override {
81 interesting_usage_detected_ = usage_pattern;
82 }
83
Harald Alvestrand183e09d2018-06-28 12:04:41 +020084 void PrepareToExchangeCandidates(RawWrapperPtr other) {
85 candidate_target_ = other;
86 }
Harald Alvestrandc0e97252018-07-26 10:39:55 +020087
Harald Alvestrand183e09d2018-06-28 12:04:41 +020088 bool HaveDataChannel() { return last_datachannel_; }
89
Harald Alvestrandc0e97252018-07-26 10:39:55 +020090 absl::optional<int> interesting_usage_detected() {
91 return interesting_usage_detected_;
92 }
93
Harald Alvestrand183e09d2018-06-28 12:04:41 +020094 private:
Harald Alvestrandc0e97252018-07-26 10:39:55 +020095 absl::optional<int> interesting_usage_detected_;
Harald Alvestrand183e09d2018-06-28 12:04:41 +020096 RawWrapperPtr candidate_target_; // Note: Not thread-safe against deletions.
Harald Alvestrand19793842018-06-25 12:03:50 +020097};
98
99class PeerConnectionWrapperForUsageHistogramTest
100 : public PeerConnectionWrapper {
101 public:
102 using PeerConnectionWrapper::PeerConnectionWrapper;
103
104 PeerConnection* GetInternalPeerConnection() {
105 auto* pci =
106 static_cast<PeerConnectionProxyWithInternal<PeerConnectionInterface>*>(
107 pc());
108 return static_cast<PeerConnection*>(pci->internal());
109 }
Harald Alvestrand183e09d2018-06-28 12:04:41 +0200110
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200111 // Override with different return type
112 ObserverForUsageHistogramTest* observer() {
113 return static_cast<ObserverForUsageHistogramTest*>(
114 PeerConnectionWrapper::observer());
115 }
116
Harald Alvestrand183e09d2018-06-28 12:04:41 +0200117 void PrepareToExchangeCandidates(
118 PeerConnectionWrapperForUsageHistogramTest* other) {
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200119 observer()->PrepareToExchangeCandidates(other);
120 other->observer()->PrepareToExchangeCandidates(this);
Harald Alvestrand183e09d2018-06-28 12:04:41 +0200121 }
122
123 bool IsConnected() {
124 return pc()->ice_connection_state() ==
125 PeerConnectionInterface::kIceConnectionConnected ||
126 pc()->ice_connection_state() ==
127 PeerConnectionInterface::kIceConnectionCompleted;
128 }
129
130 bool HaveDataChannel() {
131 return static_cast<ObserverForUsageHistogramTest*>(observer())
132 ->HaveDataChannel();
133 }
Harald Alvestrand42386282018-07-12 07:56:05 +0200134 void AddOrBufferIceCandidate(const webrtc::IceCandidateInterface* candidate) {
135 if (!pc()->AddIceCandidate(candidate)) {
136 std::string sdp;
137 EXPECT_TRUE(candidate->ToString(&sdp));
138 std::unique_ptr<webrtc::IceCandidateInterface> candidate_copy(
139 CreateIceCandidate(candidate->sdp_mid(), candidate->sdp_mline_index(),
140 sdp, nullptr));
141 buffered_candidates_.push_back(std::move(candidate_copy));
142 }
143 }
Harald Alvestrand056d8112018-07-16 19:18:58 +0200144
Harald Alvestrand42386282018-07-12 07:56:05 +0200145 void AddBufferedIceCandidates() {
146 for (const auto& candidate : buffered_candidates_) {
147 EXPECT_TRUE(pc()->AddIceCandidate(candidate.get()));
148 }
149 buffered_candidates_.clear();
150 }
Harald Alvestrand056d8112018-07-16 19:18:58 +0200151
Harald Alvestrand42386282018-07-12 07:56:05 +0200152 bool ConnectTo(PeerConnectionWrapperForUsageHistogramTest* callee) {
153 PrepareToExchangeCandidates(callee);
Harald Alvestrand056d8112018-07-16 19:18:58 +0200154 if (!ExchangeOfferAnswerWith(callee)) {
155 return false;
156 }
Harald Alvestrand42386282018-07-12 07:56:05 +0200157 AddBufferedIceCandidates();
158 callee->AddBufferedIceCandidates();
Harald Alvestrand056d8112018-07-16 19:18:58 +0200159 WAIT(IsConnected(), kDefaultTimeout);
160 WAIT(callee->IsConnected(), kDefaultTimeout);
Harald Alvestrand42386282018-07-12 07:56:05 +0200161 return IsConnected() && callee->IsConnected();
162 }
163
Harald Alvestrand056d8112018-07-16 19:18:58 +0200164 bool GenerateOfferAndCollectCandidates() {
165 auto offer = CreateOffer(RTCOfferAnswerOptions());
166 if (!offer) {
167 return false;
168 }
169 bool set_local_offer =
170 SetLocalDescription(CloneSessionDescription(offer.get()));
171 EXPECT_TRUE(set_local_offer);
172 if (!set_local_offer) {
173 return false;
174 }
175 EXPECT_TRUE_WAIT(observer()->ice_gathering_complete_, kDefaultTimeout);
176 return true;
177 }
178
Harald Alvestrand42386282018-07-12 07:56:05 +0200179 private:
180 // Candidates that have been sent but not yet configured
181 std::vector<std::unique_ptr<webrtc::IceCandidateInterface>>
182 buffered_candidates_;
Harald Alvestrand19793842018-06-25 12:03:50 +0200183};
184
Harald Alvestrand183e09d2018-06-28 12:04:41 +0200185void ObserverForUsageHistogramTest::OnIceCandidate(
186 const webrtc::IceCandidateInterface* candidate) {
187 if (candidate_target_) {
Harald Alvestrand42386282018-07-12 07:56:05 +0200188 this->candidate_target_->AddOrBufferIceCandidate(candidate);
Harald Alvestrand183e09d2018-06-28 12:04:41 +0200189 }
Harald Alvestrand056d8112018-07-16 19:18:58 +0200190 // If target is not set, ignore. This happens in one-ended unit tests.
Harald Alvestrand183e09d2018-06-28 12:04:41 +0200191}
192
Harald Alvestrand19793842018-06-25 12:03:50 +0200193class PeerConnectionUsageHistogramTest : public ::testing::Test {
194 protected:
195 typedef std::unique_ptr<PeerConnectionWrapperForUsageHistogramTest>
196 WrapperPtr;
197
198 PeerConnectionUsageHistogramTest()
199 : vss_(new rtc::VirtualSocketServer()), main_(vss_.get()) {
Qingsi Wang7fc821d2018-07-12 12:54:53 -0700200 webrtc::metrics::Reset();
Harald Alvestrand19793842018-06-25 12:03:50 +0200201 }
202
203 WrapperPtr CreatePeerConnection() {
Harald Alvestrand056d8112018-07-16 19:18:58 +0200204 return CreatePeerConnection(RTCConfiguration(),
205 PeerConnectionFactoryInterface::Options(),
206 nullptr, false);
Harald Alvestrand19793842018-06-25 12:03:50 +0200207 }
208
Harald Alvestrandb2a74782018-06-28 13:54:07 +0200209 WrapperPtr CreatePeerConnection(const RTCConfiguration& config) {
210 return CreatePeerConnection(
Harald Alvestrand056d8112018-07-16 19:18:58 +0200211 config, PeerConnectionFactoryInterface::Options(), nullptr, false);
Harald Alvestrandb2a74782018-06-28 13:54:07 +0200212 }
213
Harald Alvestrand19793842018-06-25 12:03:50 +0200214 WrapperPtr CreatePeerConnectionWithImmediateReport() {
Harald Alvestrand056d8112018-07-16 19:18:58 +0200215 return CreatePeerConnection(RTCConfiguration(),
216 PeerConnectionFactoryInterface::Options(),
217 nullptr, true);
218 }
219
220 WrapperPtr CreatePeerConnectionWithPrivateLocalAddresses() {
221 fake_network_manager_.reset(new rtc::FakeNetworkManager());
222 fake_network_manager_->AddInterface(kDefaultLocalAddress);
223 fake_network_manager_->AddInterface(kPrivateLocalAddress);
224 std::unique_ptr<cricket::BasicPortAllocator> port_allocator(
225 new cricket::BasicPortAllocator(fake_network_manager_.get()));
226 return CreatePeerConnection(RTCConfiguration(),
227 PeerConnectionFactoryInterface::Options(),
228 std::move(port_allocator), false);
Harald Alvestrand19793842018-06-25 12:03:50 +0200229 }
230
231 WrapperPtr CreatePeerConnection(
232 const RTCConfiguration& config,
233 const PeerConnectionFactoryInterface::Options factory_options,
Harald Alvestrand056d8112018-07-16 19:18:58 +0200234 std::unique_ptr<cricket::PortAllocator> allocator,
Harald Alvestrand19793842018-06-25 12:03:50 +0200235 bool immediate_report) {
236 rtc::scoped_refptr<PeerConnectionFactoryForUsageHistogramTest> pc_factory(
237 new PeerConnectionFactoryForUsageHistogramTest());
238 pc_factory->SetOptions(factory_options);
239 RTC_CHECK(pc_factory->Initialize());
240 if (immediate_report) {
241 pc_factory->ReturnHistogramVeryQuickly();
242 }
Karl Wiberg918f50c2018-07-05 11:40:33 +0200243 auto observer = absl::make_unique<ObserverForUsageHistogramTest>();
Harald Alvestrand056d8112018-07-16 19:18:58 +0200244 auto pc = pc_factory->CreatePeerConnection(config, std::move(allocator),
245 nullptr, observer.get());
Harald Alvestrand19793842018-06-25 12:03:50 +0200246 if (!pc) {
247 return nullptr;
248 }
249
Karl Wiberg918f50c2018-07-05 11:40:33 +0200250 auto wrapper =
251 absl::make_unique<PeerConnectionWrapperForUsageHistogramTest>(
252 pc_factory, pc, std::move(observer));
Harald Alvestrand19793842018-06-25 12:03:50 +0200253 return wrapper;
254 }
255
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200256 int ObservedFingerprint() {
257 // This works correctly only if there is only one sample value
258 // that has been counted.
259 // Returns -1 for "not found".
260 return webrtc::metrics::MinSample(kUsagePatternMetric);
261 }
262
Harald Alvestrand056d8112018-07-16 19:18:58 +0200263 std::unique_ptr<rtc::FakeNetworkManager> fake_network_manager_;
Harald Alvestrand19793842018-06-25 12:03:50 +0200264 std::unique_ptr<rtc::VirtualSocketServer> vss_;
265 rtc::AutoSocketServerThread main_;
266};
267
268TEST_F(PeerConnectionUsageHistogramTest, UsageFingerprintHistogramFromTimeout) {
269 auto pc = CreatePeerConnectionWithImmediateReport();
270
Harald Alvestrand19793842018-06-25 12:03:50 +0200271 int expected_fingerprint = MakeUsageFingerprint({});
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200272 ASSERT_EQ_WAIT(1, webrtc::metrics::NumSamples(kUsagePatternMetric),
273 kDefaultTimeout);
274 EXPECT_EQ(
275 1, webrtc::metrics::NumEvents(kUsagePatternMetric, expected_fingerprint));
Harald Alvestrand19793842018-06-25 12:03:50 +0200276}
277
Harald Alvestrand183e09d2018-06-28 12:04:41 +0200278#ifndef WEBRTC_ANDROID
279// These tests do not work on Android. Why is unclear.
280// https://bugs.webrtc.org/9461
281
282// Test getting the usage fingerprint for an audio/video connection.
283TEST_F(PeerConnectionUsageHistogramTest, FingerprintAudioVideo) {
284 auto caller = CreatePeerConnection();
285 auto callee = CreatePeerConnection();
Harald Alvestrand183e09d2018-06-28 12:04:41 +0200286 caller->AddAudioTrack("audio");
287 caller->AddVideoTrack("video");
Harald Alvestrand42386282018-07-12 07:56:05 +0200288 ASSERT_TRUE(caller->ConnectTo(callee.get()));
Harald Alvestrand183e09d2018-06-28 12:04:41 +0200289 caller->pc()->Close();
290 callee->pc()->Close();
291 int expected_fingerprint = MakeUsageFingerprint(
292 {PeerConnection::UsageEvent::AUDIO_ADDED,
293 PeerConnection::UsageEvent::VIDEO_ADDED,
294 PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_CALLED,
295 PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_CALLED,
296 PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
297 PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
298 PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
299 PeerConnection::UsageEvent::CLOSE_CALLED});
Harald Alvestrand056d8112018-07-16 19:18:58 +0200300 // In this case, we may or may not have PRIVATE_CANDIDATE_COLLECTED,
301 // depending on the machine configuration.
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200302 EXPECT_EQ(2, webrtc::metrics::NumSamples(kUsagePatternMetric));
Harald Alvestrand056d8112018-07-16 19:18:58 +0200303 EXPECT_TRUE(
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200304 webrtc::metrics::NumEvents(kUsagePatternMetric, expected_fingerprint) ==
305 2 ||
Harald Alvestrand056d8112018-07-16 19:18:58 +0200306 webrtc::metrics::NumEvents(
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200307 kUsagePatternMetric,
Harald Alvestrand056d8112018-07-16 19:18:58 +0200308 expected_fingerprint |
309 static_cast<int>(
310 PeerConnection::UsageEvent::PRIVATE_CANDIDATE_COLLECTED)) ==
311 2);
312}
313
314// Test getting the usage fingerprint when there are no host candidates.
315TEST_F(PeerConnectionUsageHistogramTest, FingerprintWithNoHostCandidates) {
316 RTCConfiguration config;
317 config.type = PeerConnectionInterface::kNoHost;
318 auto caller = CreatePeerConnection(config);
319 auto callee = CreatePeerConnection(config);
320 caller->AddAudioTrack("audio");
321 caller->AddVideoTrack("video");
322 // Under some bot configurations, this will fail - presumably bots where
323 // no working non-host addresses exist.
324 if (!caller->ConnectTo(callee.get())) {
325 return;
326 }
327 // If we manage to connect, we should get this precise fingerprint.
328 caller->pc()->Close();
329 callee->pc()->Close();
330 int expected_fingerprint = MakeUsageFingerprint(
331 {PeerConnection::UsageEvent::AUDIO_ADDED,
332 PeerConnection::UsageEvent::VIDEO_ADDED,
333 PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_CALLED,
334 PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_CALLED,
335 PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
336 PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
337 PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
338 PeerConnection::UsageEvent::CLOSE_CALLED});
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200339 EXPECT_EQ(2, webrtc::metrics::NumSamples(kUsagePatternMetric));
340 EXPECT_EQ(
341 2, webrtc::metrics::NumEvents(kUsagePatternMetric, expected_fingerprint));
Harald Alvestrand183e09d2018-06-28 12:04:41 +0200342}
343
344#ifdef HAVE_SCTP
345TEST_F(PeerConnectionUsageHistogramTest, FingerprintDataOnly) {
346 auto caller = CreatePeerConnection();
347 auto callee = CreatePeerConnection();
Harald Alvestrand183e09d2018-06-28 12:04:41 +0200348 caller->CreateDataChannel("foodata");
Harald Alvestrand42386282018-07-12 07:56:05 +0200349 ASSERT_TRUE(caller->ConnectTo(callee.get()));
Harald Alvestrand183e09d2018-06-28 12:04:41 +0200350 ASSERT_TRUE_WAIT(callee->HaveDataChannel(), kDefaultTimeout);
351 caller->pc()->Close();
352 callee->pc()->Close();
353 int expected_fingerprint = MakeUsageFingerprint(
354 {PeerConnection::UsageEvent::DATA_ADDED,
355 PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_CALLED,
356 PeerConnection::UsageEvent::SET_REMOTE_DESCRIPTION_CALLED,
357 PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
358 PeerConnection::UsageEvent::REMOTE_CANDIDATE_ADDED,
359 PeerConnection::UsageEvent::ICE_STATE_CONNECTED,
360 PeerConnection::UsageEvent::CLOSE_CALLED});
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200361 EXPECT_EQ(2, webrtc::metrics::NumSamples(kUsagePatternMetric));
Harald Alvestrand056d8112018-07-16 19:18:58 +0200362 EXPECT_TRUE(
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200363 webrtc::metrics::NumEvents(kUsagePatternMetric, expected_fingerprint) ==
364 2 ||
Harald Alvestrand056d8112018-07-16 19:18:58 +0200365 webrtc::metrics::NumEvents(
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200366 kUsagePatternMetric,
Harald Alvestrand056d8112018-07-16 19:18:58 +0200367 expected_fingerprint |
368 static_cast<int>(
369 PeerConnection::UsageEvent::PRIVATE_CANDIDATE_COLLECTED)) ==
370 2);
Harald Alvestrand183e09d2018-06-28 12:04:41 +0200371}
372#endif // HAVE_SCTP
373#endif // WEBRTC_ANDROID
374
Harald Alvestrandb2a74782018-06-28 13:54:07 +0200375TEST_F(PeerConnectionUsageHistogramTest, FingerprintStunTurn) {
376 RTCConfiguration configuration;
377 PeerConnection::IceServer server;
378 server.urls = {"stun:dummy.stun.server/"};
379 configuration.servers.push_back(server);
380 server.urls = {"turn:dummy.turn.server/"};
381 server.username = "username";
382 server.password = "password";
383 configuration.servers.push_back(server);
384 auto caller = CreatePeerConnection(configuration);
385 ASSERT_TRUE(caller);
Harald Alvestrandb2a74782018-06-28 13:54:07 +0200386 caller->pc()->Close();
387 int expected_fingerprint =
388 MakeUsageFingerprint({PeerConnection::UsageEvent::STUN_SERVER_ADDED,
389 PeerConnection::UsageEvent::TURN_SERVER_ADDED,
390 PeerConnection::UsageEvent::CLOSE_CALLED});
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200391 EXPECT_EQ(1, webrtc::metrics::NumSamples(kUsagePatternMetric));
392 EXPECT_EQ(
393 1, webrtc::metrics::NumEvents(kUsagePatternMetric, expected_fingerprint));
Harald Alvestrandb2a74782018-06-28 13:54:07 +0200394}
395
396TEST_F(PeerConnectionUsageHistogramTest, FingerprintStunTurnInReconfiguration) {
397 RTCConfiguration configuration;
398 PeerConnection::IceServer server;
399 server.urls = {"stun:dummy.stun.server/"};
400 configuration.servers.push_back(server);
401 server.urls = {"turn:dummy.turn.server/"};
402 server.username = "username";
403 server.password = "password";
404 configuration.servers.push_back(server);
405 auto caller = CreatePeerConnection();
406 ASSERT_TRUE(caller);
Harald Alvestrandb2a74782018-06-28 13:54:07 +0200407 RTCError error;
408 caller->pc()->SetConfiguration(configuration, &error);
409 ASSERT_TRUE(error.ok());
410 caller->pc()->Close();
411 int expected_fingerprint =
412 MakeUsageFingerprint({PeerConnection::UsageEvent::STUN_SERVER_ADDED,
413 PeerConnection::UsageEvent::TURN_SERVER_ADDED,
414 PeerConnection::UsageEvent::CLOSE_CALLED});
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200415 EXPECT_EQ(1, webrtc::metrics::NumSamples(kUsagePatternMetric));
416 EXPECT_EQ(
417 1, webrtc::metrics::NumEvents(kUsagePatternMetric, expected_fingerprint));
Harald Alvestrandb2a74782018-06-28 13:54:07 +0200418}
419
Harald Alvestrand056d8112018-07-16 19:18:58 +0200420TEST_F(PeerConnectionUsageHistogramTest, FingerprintWithPrivateIP) {
421 auto caller = CreatePeerConnectionWithPrivateLocalAddresses();
422 caller->AddAudioTrack("audio");
423 ASSERT_TRUE(caller->GenerateOfferAndCollectCandidates());
424 caller->pc()->Close();
425 int expected_fingerprint = MakeUsageFingerprint(
426 {PeerConnection::UsageEvent::AUDIO_ADDED,
427 PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_CALLED,
428 PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
429 PeerConnection::UsageEvent::CLOSE_CALLED,
430 PeerConnection::UsageEvent::PRIVATE_CANDIDATE_COLLECTED});
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200431 EXPECT_EQ(1, webrtc::metrics::NumSamples(kUsagePatternMetric));
432 EXPECT_EQ(
433 1, webrtc::metrics::NumEvents(kUsagePatternMetric, expected_fingerprint));
Harald Alvestrand056d8112018-07-16 19:18:58 +0200434}
435
Harald Alvestrandc0e97252018-07-26 10:39:55 +0200436#ifndef WEBRTC_ANDROID
437#ifdef HAVE_SCTP
438TEST_F(PeerConnectionUsageHistogramTest, NotableUsageNoted) {
439 auto caller = CreatePeerConnection();
440 caller->CreateDataChannel("foo");
441 caller->GenerateOfferAndCollectCandidates();
442 caller->pc()->Close();
443 int expected_fingerprint = MakeUsageFingerprint(
444 {PeerConnection::UsageEvent::DATA_ADDED,
445 PeerConnection::UsageEvent::SET_LOCAL_DESCRIPTION_CALLED,
446 PeerConnection::UsageEvent::CANDIDATE_COLLECTED,
447 PeerConnection::UsageEvent::CLOSE_CALLED});
448 EXPECT_EQ(1, webrtc::metrics::NumSamples(kUsagePatternMetric));
449 EXPECT_TRUE(expected_fingerprint == ObservedFingerprint() ||
450 (expected_fingerprint |
451 static_cast<int>(
452 PeerConnection::UsageEvent::PRIVATE_CANDIDATE_COLLECTED)) ==
453 ObservedFingerprint());
454 EXPECT_EQ(absl::make_optional(ObservedFingerprint()),
455 caller->observer()->interesting_usage_detected());
456}
457#endif
458#endif
459
Harald Alvestrand19793842018-06-25 12:03:50 +0200460} // namespace webrtc