| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2016 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "webrtc/api/rtcstatscollector.h" | 11 #include "webrtc/api/rtcstatscollector.h" |
| 12 | 12 |
| 13 #include <memory> | 13 #include <memory> |
| 14 #include <string> | 14 #include <string> |
| 15 #include <vector> | 15 #include <vector> |
| 16 | 16 |
| 17 #include "webrtc/api/jsepsessiondescription.h" | 17 #include "webrtc/api/jsepsessiondescription.h" |
| 18 #include "webrtc/api/stats/rtcstats_objects.h" | 18 #include "webrtc/api/stats/rtcstats_objects.h" |
| 19 #include "webrtc/api/stats/rtcstatsreport.h" | 19 #include "webrtc/api/stats/rtcstatsreport.h" |
| 20 #include "webrtc/api/test/mock_datachannel.h" | 20 #include "webrtc/api/test/mock_datachannel.h" |
| 21 #include "webrtc/api/test/mock_peerconnection.h" | 21 #include "webrtc/api/test/mock_peerconnection.h" |
| 22 #include "webrtc/api/test/mock_webrtcsession.h" | 22 #include "webrtc/api/test/mock_webrtcsession.h" |
| 23 #include "webrtc/base/checks.h" | 23 #include "webrtc/base/checks.h" |
| 24 #include "webrtc/base/fakeclock.h" | 24 #include "webrtc/base/fakeclock.h" |
| 25 #include "webrtc/base/fakesslidentity.h" | 25 #include "webrtc/base/fakesslidentity.h" |
| 26 #include "webrtc/base/gunit.h" | 26 #include "webrtc/base/gunit.h" |
| 27 #include "webrtc/base/logging.h" | 27 #include "webrtc/base/logging.h" |
| 28 #include "webrtc/base/socketaddress.h" |
| 28 #include "webrtc/base/thread_checker.h" | 29 #include "webrtc/base/thread_checker.h" |
| 29 #include "webrtc/base/timedelta.h" | 30 #include "webrtc/base/timedelta.h" |
| 30 #include "webrtc/base/timeutils.h" | 31 #include "webrtc/base/timeutils.h" |
| 31 #include "webrtc/media/base/fakemediaengine.h" | 32 #include "webrtc/media/base/fakemediaengine.h" |
| 33 #include "webrtc/p2p/base/port.h" |
| 32 | 34 |
| 33 using testing::_; | 35 using testing::_; |
| 34 using testing::Invoke; | 36 using testing::Invoke; |
| 35 using testing::Return; | 37 using testing::Return; |
| 36 using testing::ReturnRef; | 38 using testing::ReturnRef; |
| 37 | 39 |
| 38 namespace webrtc { | 40 namespace webrtc { |
| 39 | 41 |
| 40 namespace { | 42 namespace { |
| 41 | 43 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 for (size_t i = 0; i < chain->GetSize(); i++) { | 86 for (size_t i = 0; i < chain->GetSize(); i++) { |
| 85 fp.reset(rtc::SSLFingerprint::Create("sha-1", &chain->Get(i))); | 87 fp.reset(rtc::SSLFingerprint::Create("sha-1", &chain->Get(i))); |
| 86 EXPECT_TRUE(fp); | 88 EXPECT_TRUE(fp); |
| 87 info->fingerprints.push_back(fp->GetRfc4572Fingerprint()); | 89 info->fingerprints.push_back(fp->GetRfc4572Fingerprint()); |
| 88 } | 90 } |
| 89 } | 91 } |
| 90 EXPECT_EQ(info->ders.size(), info->fingerprints.size()); | 92 EXPECT_EQ(info->ders.size(), info->fingerprints.size()); |
| 91 return info; | 93 return info; |
| 92 } | 94 } |
| 93 | 95 |
| 96 std::unique_ptr<cricket::Candidate> CreateFakeCandidate( |
| 97 const std::string& hostname, |
| 98 int port, |
| 99 const std::string& protocol, |
| 100 const std::string& candidate_type, |
| 101 uint32_t priority) { |
| 102 std::unique_ptr<cricket::Candidate> candidate(new cricket::Candidate()); |
| 103 candidate->set_address(rtc::SocketAddress(hostname, port)); |
| 104 candidate->set_protocol(protocol); |
| 105 candidate->set_type(candidate_type); |
| 106 candidate->set_priority(priority); |
| 107 return candidate; |
| 108 } |
| 109 |
| 94 class RTCStatsCollectorTestHelper : public SetSessionDescriptionObserver { | 110 class RTCStatsCollectorTestHelper : public SetSessionDescriptionObserver { |
| 95 public: | 111 public: |
| 96 RTCStatsCollectorTestHelper() | 112 RTCStatsCollectorTestHelper() |
| 97 : worker_thread_(rtc::Thread::Current()), | 113 : worker_thread_(rtc::Thread::Current()), |
| 98 network_thread_(rtc::Thread::Current()), | 114 network_thread_(rtc::Thread::Current()), |
| 99 channel_manager_(new cricket::ChannelManager( | 115 channel_manager_(new cricket::ChannelManager( |
| 100 new cricket::FakeMediaEngine(), | 116 new cricket::FakeMediaEngine(), |
| 101 worker_thread_, | 117 worker_thread_, |
| 102 network_thread_)), | 118 network_thread_)), |
| 103 media_controller_( | 119 media_controller_( |
| 104 MediaControllerInterface::Create(cricket::MediaConfig(), | 120 MediaControllerInterface::Create(cricket::MediaConfig(), |
| 105 worker_thread_, | 121 worker_thread_, |
| 106 channel_manager_.get())), | 122 channel_manager_.get())), |
| 107 session_(media_controller_.get()), | 123 session_(media_controller_.get()), |
| 108 pc_() { | 124 pc_() { |
| 109 // Default return values for mocks. | 125 // Default return values for mocks. |
| 110 EXPECT_CALL(pc_, session()).WillRepeatedly(Return(&session_)); | 126 EXPECT_CALL(pc_, session()).WillRepeatedly(Return(&session_)); |
| 111 EXPECT_CALL(pc_, sctp_data_channels()).WillRepeatedly( | 127 EXPECT_CALL(pc_, sctp_data_channels()).WillRepeatedly( |
| 112 ReturnRef(data_channels_)); | 128 ReturnRef(data_channels_)); |
| 113 EXPECT_CALL(session_, GetTransportStats(_)).WillRepeatedly(Return(false)); | 129 EXPECT_CALL(session_, GetTransportStats(_)).WillRepeatedly(Return(false)); |
| 130 EXPECT_CALL(session_, GetLocalCertificate(_, _)).WillRepeatedly( |
| 131 Return(false)); |
| 132 EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_)) |
| 133 .WillRepeatedly(Return(nullptr)); |
| 114 } | 134 } |
| 115 | 135 |
| 116 rtc::ScopedFakeClock& fake_clock() { return fake_clock_; } | 136 rtc::ScopedFakeClock& fake_clock() { return fake_clock_; } |
| 117 MockWebRtcSession& session() { return session_; } | 137 MockWebRtcSession& session() { return session_; } |
| 118 MockPeerConnection& pc() { return pc_; } | 138 MockPeerConnection& pc() { return pc_; } |
| 119 std::vector<rtc::scoped_refptr<DataChannel>>& data_channels() { | 139 std::vector<rtc::scoped_refptr<DataChannel>>& data_channels() { |
| 120 return data_channels_; | 140 return data_channels_; |
| 121 } | 141 } |
| 122 | 142 |
| 123 // SetSessionDescriptionObserver overrides. | 143 // SetSessionDescriptionObserver overrides. |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 &test_->pc(), 50 * rtc::kNumMicrosecsPerMillisec)) { | 321 &test_->pc(), 50 * rtc::kNumMicrosecsPerMillisec)) { |
| 302 } | 322 } |
| 303 | 323 |
| 304 rtc::scoped_refptr<const RTCStatsReport> GetStatsReport() { | 324 rtc::scoped_refptr<const RTCStatsReport> GetStatsReport() { |
| 305 rtc::scoped_refptr<StatsCallback> callback = StatsCallback::Create(); | 325 rtc::scoped_refptr<StatsCallback> callback = StatsCallback::Create(); |
| 306 collector_->GetStatsReport(callback); | 326 collector_->GetStatsReport(callback); |
| 307 EXPECT_TRUE_WAIT(callback->report(), kGetStatsReportTimeoutMs); | 327 EXPECT_TRUE_WAIT(callback->report(), kGetStatsReportTimeoutMs); |
| 308 return callback->report(); | 328 return callback->report(); |
| 309 } | 329 } |
| 310 | 330 |
| 331 void ExpectReportContainsCandidate( |
| 332 const rtc::scoped_refptr<const RTCStatsReport>& report, |
| 333 const cricket::Candidate& candidate, |
| 334 bool is_local) { |
| 335 const RTCStats* stats = |
| 336 report->Get("RTCIceCandidate_" + candidate.id()); |
| 337 EXPECT_TRUE(stats); |
| 338 const RTCIceCandidateStats* candidate_stats; |
| 339 if (is_local) |
| 340 candidate_stats = &stats->cast_to<RTCLocalIceCandidateStats>(); |
| 341 else |
| 342 candidate_stats = &stats->cast_to<RTCRemoteIceCandidateStats>(); |
| 343 EXPECT_EQ(*candidate_stats->ip, candidate.address().ipaddr().ToString()); |
| 344 EXPECT_EQ(*candidate_stats->port, |
| 345 static_cast<int32_t>(candidate.address().port())); |
| 346 EXPECT_EQ(*candidate_stats->protocol, candidate.protocol()); |
| 347 EXPECT_EQ(*candidate_stats->candidate_type, |
| 348 CandidateTypeToRTCIceCandidateType(candidate.type())); |
| 349 EXPECT_EQ(*candidate_stats->priority, |
| 350 static_cast<int32_t>(candidate.priority())); |
| 351 // TODO(hbos): Define candidate_stats->url. crbug.com/632723 |
| 352 EXPECT_FALSE(candidate_stats->url.is_defined()); |
| 353 } |
| 354 |
| 311 void ExpectReportContainsCertificateInfo( | 355 void ExpectReportContainsCertificateInfo( |
| 312 const rtc::scoped_refptr<const RTCStatsReport>& report, | 356 const rtc::scoped_refptr<const RTCStatsReport>& report, |
| 313 const CertificateInfo& cert_info) { | 357 const CertificateInfo& cert_info) { |
| 314 for (size_t i = 0; i < cert_info.fingerprints.size(); ++i) { | 358 for (size_t i = 0; i < cert_info.fingerprints.size(); ++i) { |
| 315 const RTCStats* stats = report->Get( | 359 const RTCStats* stats = report->Get( |
| 316 "RTCCertificate_" + cert_info.fingerprints[i]); | 360 "RTCCertificate_" + cert_info.fingerprints[i]); |
| 317 EXPECT_TRUE(stats); | 361 EXPECT_TRUE(stats); |
| 318 const RTCCertificateStats& cert_stats = | 362 const RTCCertificateStats& cert_stats = |
| 319 stats->cast_to<const RTCCertificateStats>(); | 363 stats->cast_to<const RTCCertificateStats>(); |
| 320 EXPECT_EQ(*cert_stats.fingerprint, cert_info.fingerprints[i]); | 364 EXPECT_EQ(*cert_stats.fingerprint, cert_info.fingerprints[i]); |
| (...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 if (transport_name == "transport") | 571 if (transport_name == "transport") |
| 528 return remote_certinfo->certificate->ssl_certificate().GetReference(); | 572 return remote_certinfo->certificate->ssl_certificate().GetReference(); |
| 529 return static_cast<rtc::SSLCertificate*>(nullptr); | 573 return static_cast<rtc::SSLCertificate*>(nullptr); |
| 530 })); | 574 })); |
| 531 | 575 |
| 532 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | 576 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
| 533 ExpectReportContainsCertificateInfo(report, *local_certinfo.get()); | 577 ExpectReportContainsCertificateInfo(report, *local_certinfo.get()); |
| 534 ExpectReportContainsCertificateInfo(report, *remote_certinfo.get()); | 578 ExpectReportContainsCertificateInfo(report, *remote_certinfo.get()); |
| 535 } | 579 } |
| 536 | 580 |
| 581 TEST_F(RTCStatsCollectorTest, CollectRTCIceCandidateStats) { |
| 582 // Candidates in the first transport stats. |
| 583 std::unique_ptr<cricket::Candidate> a_local_host = CreateFakeCandidate( |
| 584 "1.2.3.4", 5, |
| 585 "a_local_host's protocol", |
| 586 cricket::LOCAL_PORT_TYPE, |
| 587 0); |
| 588 std::unique_ptr<cricket::Candidate> a_remote_srflx = CreateFakeCandidate( |
| 589 "6.7.8.9", 10, |
| 590 "remote_srflx's protocol", |
| 591 cricket::STUN_PORT_TYPE, |
| 592 1); |
| 593 std::unique_ptr<cricket::Candidate> a_local_prflx = CreateFakeCandidate( |
| 594 "11.12.13.14", 15, |
| 595 "a_local_prflx's protocol", |
| 596 cricket::PRFLX_PORT_TYPE, |
| 597 2); |
| 598 std::unique_ptr<cricket::Candidate> a_remote_relay = CreateFakeCandidate( |
| 599 "16.17.18.19", 20, |
| 600 "a_remote_relay's protocol", |
| 601 cricket::RELAY_PORT_TYPE, |
| 602 3); |
| 603 // Candidates in the second transport stats. |
| 604 std::unique_ptr<cricket::Candidate> b_local = CreateFakeCandidate( |
| 605 "42.42.42.42", 42, |
| 606 "b_local's protocol", |
| 607 cricket::LOCAL_PORT_TYPE, |
| 608 42); |
| 609 std::unique_ptr<cricket::Candidate> b_remote = CreateFakeCandidate( |
| 610 "42.42.42.42", 42, |
| 611 "b_remote's protocol", |
| 612 cricket::LOCAL_PORT_TYPE, |
| 613 42); |
| 614 |
| 615 SessionStats session_stats; |
| 616 |
| 617 cricket::TransportChannelStats a_transport_channel_stats; |
| 618 a_transport_channel_stats.connection_infos.push_back( |
| 619 cricket::ConnectionInfo()); |
| 620 a_transport_channel_stats.connection_infos[0].local_candidate = |
| 621 *a_local_host.get(); |
| 622 a_transport_channel_stats.connection_infos[0].remote_candidate = |
| 623 *a_remote_srflx.get(); |
| 624 a_transport_channel_stats.connection_infos.push_back( |
| 625 cricket::ConnectionInfo()); |
| 626 a_transport_channel_stats.connection_infos[1].local_candidate = |
| 627 *a_local_prflx.get(); |
| 628 a_transport_channel_stats.connection_infos[1].remote_candidate = |
| 629 *a_remote_relay.get(); |
| 630 session_stats.transport_stats["a"].channel_stats.push_back( |
| 631 a_transport_channel_stats); |
| 632 |
| 633 cricket::TransportChannelStats b_transport_channel_stats; |
| 634 b_transport_channel_stats.connection_infos.push_back( |
| 635 cricket::ConnectionInfo()); |
| 636 b_transport_channel_stats.connection_infos[0].local_candidate = |
| 637 *b_local.get(); |
| 638 b_transport_channel_stats.connection_infos[0].remote_candidate = |
| 639 *b_remote.get(); |
| 640 session_stats.transport_stats["b"].channel_stats.push_back( |
| 641 b_transport_channel_stats); |
| 642 |
| 643 // Mock the session to return the desired candidates. |
| 644 EXPECT_CALL(test_->session(), GetTransportStats(_)).WillRepeatedly(Invoke( |
| 645 [this, &session_stats](SessionStats* stats) { |
| 646 *stats = session_stats; |
| 647 return true; |
| 648 })); |
| 649 |
| 650 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
| 651 ExpectReportContainsCandidate(report, *a_local_host.get(), true); |
| 652 ExpectReportContainsCandidate(report, *a_remote_srflx.get(), false); |
| 653 ExpectReportContainsCandidate(report, *a_local_prflx.get(), true); |
| 654 ExpectReportContainsCandidate(report, *a_remote_relay.get(), false); |
| 655 ExpectReportContainsCandidate(report, *b_local.get(), true); |
| 656 ExpectReportContainsCandidate(report, *b_remote.get(), false); |
| 657 } |
| 658 |
| 537 TEST_F(RTCStatsCollectorTest, CollectRTCPeerConnectionStats) { | 659 TEST_F(RTCStatsCollectorTest, CollectRTCPeerConnectionStats) { |
| 538 int64_t before = rtc::TimeUTCMicros(); | 660 int64_t before = rtc::TimeUTCMicros(); |
| 539 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | 661 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
| 540 int64_t after = rtc::TimeUTCMicros(); | 662 int64_t after = rtc::TimeUTCMicros(); |
| 541 EXPECT_EQ(report->GetStatsOfType<RTCPeerConnectionStats>().size(), | 663 EXPECT_EQ(report->GetStatsOfType<RTCPeerConnectionStats>().size(), |
| 542 static_cast<size_t>(1)) << "Expecting 1 RTCPeerConnectionStats."; | 664 static_cast<size_t>(1)) << "Expecting 1 RTCPeerConnectionStats."; |
| 543 const RTCStats* stats = report->Get("RTCPeerConnection"); | 665 const RTCStats* stats = report->Get("RTCPeerConnection"); |
| 544 EXPECT_TRUE(stats); | 666 EXPECT_TRUE(stats); |
| 545 EXPECT_LE(before, stats->timestamp_us()); | 667 EXPECT_LE(before, stats->timestamp_us()); |
| 546 EXPECT_LE(stats->timestamp_us(), after); | 668 EXPECT_LE(stats->timestamp_us(), after); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 rtc::scoped_refptr<FakeRTCStatsCollector> collector_; | 715 rtc::scoped_refptr<FakeRTCStatsCollector> collector_; |
| 594 }; | 716 }; |
| 595 | 717 |
| 596 TEST_F(RTCStatsCollectorTestWithFakeCollector, ThreadUsageAndResultsMerging) { | 718 TEST_F(RTCStatsCollectorTestWithFakeCollector, ThreadUsageAndResultsMerging) { |
| 597 collector_->VerifyThreadUsageAndResultsMerging(); | 719 collector_->VerifyThreadUsageAndResultsMerging(); |
| 598 } | 720 } |
| 599 | 721 |
| 600 } // namespace | 722 } // namespace |
| 601 | 723 |
| 602 } // namespace webrtc | 724 } // namespace webrtc |
| OLD | NEW |