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

Side by Side Diff: webrtc/api/rtcstatscollector_unittest.cc

Issue 2408363002: RTCTransportStats added. (Closed)
Patch Set: Addressed comments, RTP and RTCP 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 unified diff | Download patch
OLDNEW
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
(...skipping 13 matching lines...) Expand all
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/socketaddress.h"
29 #include "webrtc/base/thread_checker.h" 29 #include "webrtc/base/thread_checker.h"
30 #include "webrtc/base/timedelta.h" 30 #include "webrtc/base/timedelta.h"
31 #include "webrtc/base/timeutils.h" 31 #include "webrtc/base/timeutils.h"
32 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" 32 #include "webrtc/logging/rtc_event_log/rtc_event_log.h"
33 #include "webrtc/media/base/fakemediaengine.h" 33 #include "webrtc/media/base/fakemediaengine.h"
34 #include "webrtc/p2p/base/p2pconstants.h"
34 #include "webrtc/p2p/base/port.h" 35 #include "webrtc/p2p/base/port.h"
35 36
36 using testing::_; 37 using testing::_;
37 using testing::Invoke; 38 using testing::Invoke;
38 using testing::Return; 39 using testing::Return;
39 using testing::ReturnRef; 40 using testing::ReturnRef;
40 41
41 namespace webrtc { 42 namespace webrtc {
42 43
43 namespace { 44 namespace {
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 358
358 void ExpectReportContainsCandidatePair( 359 void ExpectReportContainsCandidatePair(
359 const rtc::scoped_refptr<const RTCStatsReport>& report, 360 const rtc::scoped_refptr<const RTCStatsReport>& report,
360 const cricket::TransportStats& transport_stats) { 361 const cricket::TransportStats& transport_stats) {
361 for (const auto& channel_stats : transport_stats.channel_stats) { 362 for (const auto& channel_stats : transport_stats.channel_stats) {
362 for (const cricket::ConnectionInfo& info : 363 for (const cricket::ConnectionInfo& info :
363 channel_stats.connection_infos) { 364 channel_stats.connection_infos) {
364 const std::string& id = "RTCIceCandidatePair_" + 365 const std::string& id = "RTCIceCandidatePair_" +
365 info.local_candidate.id() + "_" + info.remote_candidate.id(); 366 info.local_candidate.id() + "_" + info.remote_candidate.id();
366 const RTCStats* stats = report->Get(id); 367 const RTCStats* stats = report->Get(id);
367 EXPECT_TRUE(stats); 368 ASSERT_TRUE(stats);
368 const RTCIceCandidatePairStats& candidate_pair_stats = 369 const RTCIceCandidatePairStats& candidate_pair_stats =
369 stats->cast_to<RTCIceCandidatePairStats>(); 370 stats->cast_to<RTCIceCandidatePairStats>();
370 371
371 // TODO(hbos): Define all the undefined |candidate_pair_stats| stats. 372 // TODO(hbos): Define all the undefined |candidate_pair_stats| stats.
372 // The EXPECT_FALSE are for the undefined stats, see also todos listed 373 // The EXPECT_FALSE are for the undefined stats, see also todos listed
373 // in rtcstatscollector.cc. crbug.com/633550 374 // in rtcstatscollector.cc. crbug.com/633550
374 EXPECT_FALSE(candidate_pair_stats.transport_id.is_defined()); 375 EXPECT_FALSE(candidate_pair_stats.transport_id.is_defined());
375 const RTCIceCandidateStats* local_candidate = 376 const RTCIceCandidateStats* local_candidate =
376 ExpectReportContainsCandidate(report, info.local_candidate, true); 377 ExpectReportContainsCandidate(report, info.local_candidate, true);
377 EXPECT_EQ(*candidate_pair_stats.local_candidate_id, 378 EXPECT_EQ(*candidate_pair_stats.local_candidate_id,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 } 417 }
417 } 418 }
418 } 419 }
419 420
420 void ExpectReportContainsCertificateInfo( 421 void ExpectReportContainsCertificateInfo(
421 const rtc::scoped_refptr<const RTCStatsReport>& report, 422 const rtc::scoped_refptr<const RTCStatsReport>& report,
422 const CertificateInfo& cert_info) { 423 const CertificateInfo& cert_info) {
423 for (size_t i = 0; i < cert_info.fingerprints.size(); ++i) { 424 for (size_t i = 0; i < cert_info.fingerprints.size(); ++i) {
424 const RTCStats* stats = report->Get( 425 const RTCStats* stats = report->Get(
425 "RTCCertificate_" + cert_info.fingerprints[i]); 426 "RTCCertificate_" + cert_info.fingerprints[i]);
426 EXPECT_TRUE(stats); 427 ASSERT_TRUE(stats);
427 const RTCCertificateStats& cert_stats = 428 const RTCCertificateStats& cert_stats =
428 stats->cast_to<const RTCCertificateStats>(); 429 stats->cast_to<const RTCCertificateStats>();
429 EXPECT_EQ(*cert_stats.fingerprint, cert_info.fingerprints[i]); 430 EXPECT_EQ(*cert_stats.fingerprint, cert_info.fingerprints[i]);
430 EXPECT_EQ(*cert_stats.fingerprint_algorithm, "sha-1"); 431 EXPECT_EQ(*cert_stats.fingerprint_algorithm, "sha-1");
431 EXPECT_EQ(*cert_stats.base64_certificate, cert_info.pems[i]); 432 EXPECT_EQ(*cert_stats.base64_certificate, cert_info.pems[i]);
432 if (i + 1 < cert_info.fingerprints.size()) { 433 if (i + 1 < cert_info.fingerprints.size()) {
433 EXPECT_EQ(*cert_stats.issuer_certificate_id, 434 EXPECT_EQ(*cert_stats.issuer_certificate_id,
434 "RTCCertificate_" + cert_info.fingerprints[i + 1]); 435 "RTCCertificate_" + cert_info.fingerprints[i + 1]);
435 } else { 436 } else {
436 EXPECT_FALSE(cert_stats.issuer_certificate_id.is_defined()); 437 EXPECT_FALSE(cert_stats.issuer_certificate_id.is_defined());
437 } 438 }
438 } 439 }
439 } 440 }
440 441
442 void ExpectReportContainsTransportStats(
443 const rtc::scoped_refptr<const RTCStatsReport>& report,
444 const cricket::TransportStats& transport,
445 const CertificateInfo* local_certinfo,
446 const CertificateInfo* remote_certinfo) {
447 std::string rtcp_transport_stats_id;
448 for (const auto& channel_stats : transport.channel_stats) {
449 if (channel_stats.component == cricket::ICE_CANDIDATE_COMPONENT_RTCP) {
450 rtcp_transport_stats_id = "RTCTransport_" + transport.transport_name +
451 "_" + rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTCP);
452 }
453 }
454 for (const auto& channel_stats : transport.channel_stats) {
455 const cricket::ConnectionInfo* best_connection_info = nullptr;
456 const RTCStats* stats = report->Get(
457 "RTCTransport_" + transport.transport_name + "_" +
458 rtc::ToString<>(channel_stats.component));
459 ASSERT_TRUE(stats);
460 const RTCTransportStats& transport_stats =
461 stats->cast_to<const RTCTransportStats>();
462 uint64_t bytes_sent = 0;
463 uint64_t bytes_received = 0;
464 for (const cricket::ConnectionInfo& info :
465 channel_stats.connection_infos) {
466 bytes_sent += info.sent_total_bytes;
467 bytes_received += info.recv_total_bytes;
468 if (info.best_connection)
469 best_connection_info = &info;
470 }
471 EXPECT_EQ(*transport_stats.bytes_sent, bytes_sent);
472 EXPECT_EQ(*transport_stats.bytes_received, bytes_received);
473 if (best_connection_info) {
474 EXPECT_EQ(*transport_stats.active_connection, true);
475 EXPECT_EQ(*transport_stats.selected_candidate_pair_id,
476 "RTCIceCandidatePair_" +
477 best_connection_info->local_candidate.id() + "_" +
478 best_connection_info->remote_candidate.id());
hta-webrtc 2016/10/21 08:37:51 I'm a bit skeptical of this method of testing that
hbos_chromium 2016/10/21 16:56:06 Added TODO.
479 EXPECT_TRUE(report->Get(*transport_stats.selected_candidate_pair_id));
480 } else {
481 EXPECT_EQ(*transport_stats.active_connection, false);
482 EXPECT_FALSE(transport_stats.selected_candidate_pair_id.is_defined());
483 }
484 if (channel_stats.component != cricket::ICE_CANDIDATE_COMPONENT_RTCP &&
485 !rtcp_transport_stats_id.empty()) {
486 EXPECT_EQ(*transport_stats.rtcp_transport_stats_id,
487 rtcp_transport_stats_id);
488 } else {
489 EXPECT_FALSE(transport_stats.rtcp_transport_stats_id.is_defined());
490 }
491 if (local_certinfo && remote_certinfo) {
492 EXPECT_EQ(*transport_stats.local_certificate_id,
493 "RTCCertificate_" + local_certinfo->fingerprints[0]);
494 EXPECT_EQ(*transport_stats.remote_certificate_id,
495 "RTCCertificate_" + remote_certinfo->fingerprints[0]);
496 EXPECT_TRUE(report->Get(*transport_stats.local_certificate_id));
497 EXPECT_TRUE(report->Get(*transport_stats.remote_certificate_id));
498 } else {
499 EXPECT_FALSE(transport_stats.local_certificate_id.is_defined());
500 EXPECT_FALSE(transport_stats.remote_certificate_id.is_defined());
501 }
502 }
503 }
504
441 protected: 505 protected:
442 rtc::scoped_refptr<RTCStatsCollectorTestHelper> test_; 506 rtc::scoped_refptr<RTCStatsCollectorTestHelper> test_;
443 rtc::scoped_refptr<RTCStatsCollector> collector_; 507 rtc::scoped_refptr<RTCStatsCollector> collector_;
444 }; 508 };
445 509
446 TEST_F(RTCStatsCollectorTest, SingleCallback) { 510 TEST_F(RTCStatsCollectorTest, SingleCallback) {
447 rtc::scoped_refptr<const RTCStatsReport> result; 511 rtc::scoped_refptr<const RTCStatsReport> result;
448 collector_->GetStatsReport(StatsCallback::Create(&result)); 512 collector_->GetStatsReport(StatsCallback::Create(&result));
449 EXPECT_TRUE_WAIT(result, kGetStatsReportTimeoutMs); 513 EXPECT_TRUE_WAIT(result, kGetStatsReportTimeoutMs);
450 } 514 }
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
758 report, session_stats.transport_stats["transport"]); 822 report, session_stats.transport_stats["transport"]);
759 } 823 }
760 824
761 TEST_F(RTCStatsCollectorTest, CollectRTCPeerConnectionStats) { 825 TEST_F(RTCStatsCollectorTest, CollectRTCPeerConnectionStats) {
762 int64_t before = rtc::TimeUTCMicros(); 826 int64_t before = rtc::TimeUTCMicros();
763 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); 827 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
764 int64_t after = rtc::TimeUTCMicros(); 828 int64_t after = rtc::TimeUTCMicros();
765 EXPECT_EQ(report->GetStatsOfType<RTCPeerConnectionStats>().size(), 829 EXPECT_EQ(report->GetStatsOfType<RTCPeerConnectionStats>().size(),
766 static_cast<size_t>(1)) << "Expecting 1 RTCPeerConnectionStats."; 830 static_cast<size_t>(1)) << "Expecting 1 RTCPeerConnectionStats.";
767 const RTCStats* stats = report->Get("RTCPeerConnection"); 831 const RTCStats* stats = report->Get("RTCPeerConnection");
768 EXPECT_TRUE(stats); 832 ASSERT_TRUE(stats);
769 EXPECT_LE(before, stats->timestamp_us()); 833 EXPECT_LE(before, stats->timestamp_us());
770 EXPECT_LE(stats->timestamp_us(), after); 834 EXPECT_LE(stats->timestamp_us(), after);
771 { 835 {
772 // Expected stats with no data channels 836 // Expected stats with no data channels
773 const RTCPeerConnectionStats& pcstats = 837 const RTCPeerConnectionStats& pcstats =
774 stats->cast_to<RTCPeerConnectionStats>(); 838 stats->cast_to<RTCPeerConnectionStats>();
775 EXPECT_EQ(*pcstats.data_channels_opened, static_cast<uint32_t>(0)); 839 EXPECT_EQ(*pcstats.data_channels_opened, static_cast<uint32_t>(0));
776 EXPECT_EQ(*pcstats.data_channels_closed, static_cast<uint32_t>(0)); 840 EXPECT_EQ(*pcstats.data_channels_closed, static_cast<uint32_t>(0));
777 } 841 }
778 842
779 test_->data_channels().push_back( 843 test_->data_channels().push_back(
780 new MockDataChannel(DataChannelInterface::kConnecting)); 844 new MockDataChannel(DataChannelInterface::kConnecting));
781 test_->data_channels().push_back( 845 test_->data_channels().push_back(
782 new MockDataChannel(DataChannelInterface::kOpen)); 846 new MockDataChannel(DataChannelInterface::kOpen));
783 test_->data_channels().push_back( 847 test_->data_channels().push_back(
784 new MockDataChannel(DataChannelInterface::kClosing)); 848 new MockDataChannel(DataChannelInterface::kClosing));
785 test_->data_channels().push_back( 849 test_->data_channels().push_back(
786 new MockDataChannel(DataChannelInterface::kClosed)); 850 new MockDataChannel(DataChannelInterface::kClosed));
787 851
788 collector_->ClearCachedStatsReport(); 852 collector_->ClearCachedStatsReport();
789 report = GetStatsReport(); 853 report = GetStatsReport();
790 EXPECT_EQ(report->GetStatsOfType<RTCPeerConnectionStats>().size(), 854 EXPECT_EQ(report->GetStatsOfType<RTCPeerConnectionStats>().size(),
791 static_cast<size_t>(1)) << "Expecting 1 RTCPeerConnectionStats."; 855 static_cast<size_t>(1)) << "Expecting 1 RTCPeerConnectionStats.";
792 stats = report->Get("RTCPeerConnection"); 856 stats = report->Get("RTCPeerConnection");
793 EXPECT_TRUE(stats); 857 ASSERT_TRUE(stats);
794 { 858 {
795 // Expected stats with the above four data channels 859 // Expected stats with the above four data channels
796 // TODO(hbos): When the |RTCPeerConnectionStats| is the number of data 860 // TODO(hbos): When the |RTCPeerConnectionStats| is the number of data
797 // channels that have been opened and closed, not the numbers currently 861 // channels that have been opened and closed, not the numbers currently
798 // open/closed, we would expect opened >= closed and (opened - closed) to be 862 // open/closed, we would expect opened >= closed and (opened - closed) to be
799 // the number currently open. crbug.com/636818. 863 // the number currently open. crbug.com/636818.
800 const RTCPeerConnectionStats& pcstats = 864 const RTCPeerConnectionStats& pcstats =
801 stats->cast_to<RTCPeerConnectionStats>(); 865 stats->cast_to<RTCPeerConnectionStats>();
802 EXPECT_EQ(*pcstats.data_channels_opened, static_cast<uint32_t>(1)); 866 EXPECT_EQ(*pcstats.data_channels_opened, static_cast<uint32_t>(1));
803 EXPECT_EQ(*pcstats.data_channels_closed, static_cast<uint32_t>(3)); 867 EXPECT_EQ(*pcstats.data_channels_closed, static_cast<uint32_t>(3));
804 } 868 }
805 } 869 }
806 870
871 TEST_F(RTCStatsCollectorTest, CollectRTCTransportStats) {
872 std::unique_ptr<cricket::Candidate> rtp_local_candidate = CreateFakeCandidate(
873 "42.42.42.42", 42, "protocol", cricket::LOCAL_PORT_TYPE, 42);
874 std::unique_ptr<cricket::Candidate> rtp_remote_candidate =
875 CreateFakeCandidate("42.42.42.42", 42, "protocol",
876 cricket::LOCAL_PORT_TYPE, 42);
877 std::unique_ptr<cricket::Candidate> rtcp_local_candidate =
878 CreateFakeCandidate("42.42.42.42", 42, "protocol",
879 cricket::LOCAL_PORT_TYPE, 42);
880 std::unique_ptr<cricket::Candidate> rtcp_remote_candidate =
881 CreateFakeCandidate("42.42.42.42", 42, "protocol",
882 cricket::LOCAL_PORT_TYPE, 42);
883
884 SessionStats session_stats;
885 session_stats.transport_stats["transport"].transport_name = "transport";
886
887 cricket::ConnectionInfo rtp_connection_info;
888 rtp_connection_info.best_connection = false;
889 rtp_connection_info.local_candidate = *rtp_local_candidate.get();
890 rtp_connection_info.remote_candidate = *rtp_remote_candidate.get();
891 rtp_connection_info.sent_total_bytes = 42;
892 rtp_connection_info.recv_total_bytes = 1337;
893 cricket::TransportChannelStats rtp_transport_channel_stats;
894 rtp_transport_channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP;
895 rtp_transport_channel_stats.connection_infos.push_back(rtp_connection_info);
896 session_stats.transport_stats["transport"].channel_stats.push_back(
897 rtp_transport_channel_stats);
898
899
900 // Mock the session to return the desired candidates.
901 EXPECT_CALL(test_->session(), GetTransportStats(_)).WillRepeatedly(Invoke(
902 [this, &session_stats](SessionStats* stats) {
903 *stats = session_stats;
904 return true;
905 }));
906
907 // Get stats without RTCP, an active connection or certificates.
908 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
909 ExpectReportContainsTransportStats(
910 report, session_stats.transport_stats["transport"], nullptr, nullptr);
911
912 // Get stats with RTCP and without an active connection or certificates.
Taylor Brandstetter 2016/10/19 19:03:07 nit: For consistency, should this comment go above
hta-webrtc 2016/10/21 08:37:51 Agree that comment seems misplaced. This stuff set
hbos_chromium 2016/10/21 16:56:06 Done.
913 cricket::ConnectionInfo rtcp_connection_info;
914 rtcp_connection_info.best_connection = false;
915 rtcp_connection_info.local_candidate = *rtcp_local_candidate.get();
916 rtcp_connection_info.remote_candidate = *rtcp_remote_candidate.get();
917 rtcp_connection_info.sent_total_bytes = 1337;
918 rtcp_connection_info.recv_total_bytes = 42;
919 cricket::TransportChannelStats rtcp_transport_channel_stats;
920 rtcp_transport_channel_stats.component =
921 cricket::ICE_CANDIDATE_COMPONENT_RTCP;
922 rtcp_transport_channel_stats.connection_infos.push_back(rtcp_connection_info);
923 session_stats.transport_stats["transport"].channel_stats.push_back(
924 rtcp_transport_channel_stats);
925
926 // Get stats without an active connection or certificates.
927 collector_->ClearCachedStatsReport();
928 report = GetStatsReport();
929 ExpectReportContainsTransportStats(
930 report, session_stats.transport_stats["transport"], nullptr, nullptr);
931
932 // Get stats with an active connection.
933 rtcp_connection_info.best_connection = true;
934
935 collector_->ClearCachedStatsReport();
936 report = GetStatsReport();
937 ExpectReportContainsTransportStats(
938 report, session_stats.transport_stats["transport"], nullptr, nullptr);
939
940 // Get stats with certificates.
941 std::unique_ptr<CertificateInfo> local_certinfo =
942 CreateFakeCertificateAndInfoFromDers(
943 std::vector<std::string>({ "(local) local", "(local) chain" }));
944 std::unique_ptr<CertificateInfo> remote_certinfo =
945 CreateFakeCertificateAndInfoFromDers(
946 std::vector<std::string>({ "(remote) local", "(remote) chain" }));
947 EXPECT_CALL(test_->session(), GetLocalCertificate(_, _)).WillRepeatedly(
948 Invoke([this, &local_certinfo](const std::string& transport_name,
949 rtc::scoped_refptr<rtc::RTCCertificate>* certificate) {
950 if (transport_name == "transport") {
951 *certificate = local_certinfo->certificate;
952 return true;
953 }
954 return false;
955 }));
956 EXPECT_CALL(test_->session(),
957 GetRemoteSSLCertificate_ReturnsRawPointer(_)).WillRepeatedly(Invoke(
958 [this, &remote_certinfo](const std::string& transport_name) {
959 if (transport_name == "transport")
960 return remote_certinfo->certificate->ssl_certificate().GetReference();
961 return static_cast<rtc::SSLCertificate*>(nullptr);
962 }));
963
964 collector_->ClearCachedStatsReport();
965 report = GetStatsReport();
966 ExpectReportContainsTransportStats(
967 report, session_stats.transport_stats["transport"],
968 local_certinfo.get(), remote_certinfo.get());
969 }
970
807 class RTCStatsCollectorTestWithFakeCollector : public testing::Test { 971 class RTCStatsCollectorTestWithFakeCollector : public testing::Test {
808 public: 972 public:
809 RTCStatsCollectorTestWithFakeCollector() 973 RTCStatsCollectorTestWithFakeCollector()
810 : test_(new rtc::RefCountedObject<RTCStatsCollectorTestHelper>()), 974 : test_(new rtc::RefCountedObject<RTCStatsCollectorTestHelper>()),
811 collector_(FakeRTCStatsCollector::Create( 975 collector_(FakeRTCStatsCollector::Create(
812 &test_->pc(), 50 * rtc::kNumMicrosecsPerMillisec)) { 976 &test_->pc(), 50 * rtc::kNumMicrosecsPerMillisec)) {
813 } 977 }
814 978
815 protected: 979 protected:
816 rtc::scoped_refptr<RTCStatsCollectorTestHelper> test_; 980 rtc::scoped_refptr<RTCStatsCollectorTestHelper> test_;
817 rtc::scoped_refptr<FakeRTCStatsCollector> collector_; 981 rtc::scoped_refptr<FakeRTCStatsCollector> collector_;
818 }; 982 };
819 983
820 TEST_F(RTCStatsCollectorTestWithFakeCollector, ThreadUsageAndResultsMerging) { 984 TEST_F(RTCStatsCollectorTestWithFakeCollector, ThreadUsageAndResultsMerging) {
821 collector_->VerifyThreadUsageAndResultsMerging(); 985 collector_->VerifyThreadUsageAndResultsMerging();
822 } 986 }
823 987
824 } // namespace 988 } // namespace
825 989
826 } // namespace webrtc 990 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698