diff --git a/webrtc/api/rtcstats_integrationtest.cc b/webrtc/api/rtcstats_integrationtest.cc index eec8915070..b9e8ac276f 100644 --- a/webrtc/api/rtcstats_integrationtest.cc +++ b/webrtc/api/rtcstats_integrationtest.cc @@ -390,6 +390,8 @@ class RTCStatsReportVerifier { bool VerifyRTCIceCandidateStats( const RTCIceCandidateStats& candidate) { RTCStatsVerifier verifier(report_, &candidate); + verifier.TestMemberIsIDReference( + candidate.transport_id, RTCTransportStats::kType); verifier.TestMemberIsDefined(candidate.is_remote); verifier.TestMemberIsDefined(candidate.ip); verifier.TestMemberIsNonNegative(candidate.port); diff --git a/webrtc/api/rtcstatscollector.cc b/webrtc/api/rtcstatscollector.cc index ff7b7516f6..3ab7ac94e1 100644 --- a/webrtc/api/rtcstatscollector.cc +++ b/webrtc/api/rtcstatscollector.cc @@ -277,7 +277,7 @@ void ProduceCertificateStatsFromSSLCertificateStats( const std::string& ProduceIceCandidateStats( int64_t timestamp_us, const cricket::Candidate& candidate, bool is_local, - RTCStatsReport* report) { + const std::string& transport_id, RTCStatsReport* report) { const std::string& id = "RTCIceCandidate_" + candidate.id(); const RTCStats* stats = report->Get(id); if (!stats) { @@ -286,6 +286,7 @@ const std::string& ProduceIceCandidateStats( candidate_stats.reset(new RTCLocalIceCandidateStats(id, timestamp_us)); else candidate_stats.reset(new RTCRemoteIceCandidateStats(id, timestamp_us)); + candidate_stats->transport_id = transport_id; candidate_stats->ip = candidate.address().ipaddr().ToString(); candidate_stats->port = static_cast(candidate.address().port()); candidate_stats->protocol = candidate.protocol(); @@ -664,9 +665,9 @@ void RTCStatsCollector::ProduceIceCandidateAndPairStats_n( // Port objects, and prflx candidates (both local and remote) are only // stored in candidate pairs. crbug.com/632723 candidate_pair_stats->local_candidate_id = ProduceIceCandidateStats( - timestamp_us, info.local_candidate, true, report); + timestamp_us, info.local_candidate, true, transport_id, report); candidate_pair_stats->remote_candidate_id = ProduceIceCandidateStats( - timestamp_us, info.remote_candidate, false, report); + timestamp_us, info.remote_candidate, false, transport_id, report); candidate_pair_stats->state = IceCandidatePairStateToRTCStatsIceCandidatePairState(info.state); candidate_pair_stats->priority = info.priority; diff --git a/webrtc/api/rtcstatscollector_unittest.cc b/webrtc/api/rtcstatscollector_unittest.cc index adec104135..72d00c49ac 100644 --- a/webrtc/api/rtcstatscollector_unittest.cc +++ b/webrtc/api/rtcstatscollector_unittest.cc @@ -904,6 +904,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCIceCandidateStats) { 0); RTCLocalIceCandidateStats expected_a_local_host( "RTCIceCandidate_" + a_local_host->id(), 0); + expected_a_local_host.transport_id = "RTCTransport_a_0"; expected_a_local_host.ip = "1.2.3.4"; expected_a_local_host.port = 5; expected_a_local_host.protocol = "a_local_host's protocol"; @@ -918,6 +919,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCIceCandidateStats) { 1); RTCRemoteIceCandidateStats expected_a_remote_srflx( "RTCIceCandidate_" + a_remote_srflx->id(), 0); + expected_a_remote_srflx.transport_id = "RTCTransport_a_0"; expected_a_remote_srflx.ip = "6.7.8.9"; expected_a_remote_srflx.port = 10; expected_a_remote_srflx.protocol = "remote_srflx's protocol"; @@ -933,6 +935,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCIceCandidateStats) { 2); RTCLocalIceCandidateStats expected_a_local_prflx( "RTCIceCandidate_" + a_local_prflx->id(), 0); + expected_a_local_prflx.transport_id = "RTCTransport_a_0"; expected_a_local_prflx.ip = "11.12.13.14"; expected_a_local_prflx.port = 15; expected_a_local_prflx.protocol = "a_local_prflx's protocol"; @@ -948,6 +951,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCIceCandidateStats) { 3); RTCRemoteIceCandidateStats expected_a_remote_relay( "RTCIceCandidate_" + a_remote_relay->id(), 0); + expected_a_remote_relay.transport_id = "RTCTransport_a_0"; expected_a_remote_relay.ip = "16.17.18.19"; expected_a_remote_relay.port = 20; expected_a_remote_relay.protocol = "a_remote_relay's protocol"; @@ -964,6 +968,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCIceCandidateStats) { 42); RTCLocalIceCandidateStats expected_b_local( "RTCIceCandidate_" + b_local->id(), 0); + expected_b_local.transport_id = "RTCTransport_b_0"; expected_b_local.ip = "42.42.42.42"; expected_b_local.port = 42; expected_b_local.protocol = "b_local's protocol"; @@ -979,6 +984,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCIceCandidateStats) { 42); RTCRemoteIceCandidateStats expected_b_remote( "RTCIceCandidate_" + b_remote->id(), 0); + expected_b_remote.transport_id = "RTCTransport_b_0"; expected_b_remote.ip = "42.42.42.42"; expected_b_remote.port = 42; expected_b_remote.protocol = "b_remote's protocol"; @@ -1025,30 +1031,32 @@ TEST_F(RTCStatsCollectorTest, CollectRTCIceCandidateStats) { rtc::scoped_refptr report = GetStatsReport(); - EXPECT_TRUE(report->Get(expected_a_local_host.id())); + ASSERT_TRUE(report->Get(expected_a_local_host.id())); EXPECT_EQ(expected_a_local_host, report->Get(expected_a_local_host.id())->cast_to< RTCLocalIceCandidateStats>()); - EXPECT_TRUE(report->Get(expected_a_remote_srflx.id())); + ASSERT_TRUE(report->Get(expected_a_remote_srflx.id())); EXPECT_EQ(expected_a_remote_srflx, report->Get(expected_a_remote_srflx.id())->cast_to< RTCRemoteIceCandidateStats>()); - EXPECT_TRUE(report->Get(expected_a_local_prflx.id())); + ASSERT_TRUE(report->Get(expected_a_local_prflx.id())); EXPECT_EQ(expected_a_local_prflx, report->Get(expected_a_local_prflx.id())->cast_to< RTCLocalIceCandidateStats>()); - EXPECT_TRUE(report->Get(expected_a_remote_relay.id())); + ASSERT_TRUE(report->Get(expected_a_remote_relay.id())); EXPECT_EQ(expected_a_remote_relay, report->Get(expected_a_remote_relay.id())->cast_to< RTCRemoteIceCandidateStats>()); - EXPECT_TRUE(report->Get(expected_b_local.id())); + ASSERT_TRUE(report->Get(expected_b_local.id())); EXPECT_EQ(expected_b_local, report->Get(expected_b_local.id())->cast_to< RTCLocalIceCandidateStats>()); - EXPECT_TRUE(report->Get(expected_b_remote.id())); + ASSERT_TRUE(report->Get(expected_b_remote.id())); EXPECT_EQ(expected_b_remote, report->Get(expected_b_remote.id())->cast_to< RTCRemoteIceCandidateStats>()); + EXPECT_TRUE(report->Get("RTCTransport_a_0")); + EXPECT_TRUE(report->Get("RTCTransport_b_0")); } TEST_F(RTCStatsCollectorTest, CollectRTCIceCandidatePairStats) { @@ -1115,9 +1123,11 @@ TEST_F(RTCStatsCollectorTest, CollectRTCIceCandidatePairStats) { EXPECT_EQ( expected_pair, report->Get(expected_pair.id())->cast_to()); + EXPECT_TRUE(report->Get(*expected_pair.transport_id)); RTCLocalIceCandidateStats expected_local_candidate( *expected_pair.local_candidate_id, report->timestamp_us()); + expected_local_candidate.transport_id = *expected_pair.transport_id; expected_local_candidate.ip = "42.42.42.42"; expected_local_candidate.port = 42; expected_local_candidate.protocol = "protocol"; @@ -1132,6 +1142,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCIceCandidatePairStats) { RTCRemoteIceCandidateStats expected_remote_candidate( *expected_pair.remote_candidate_id, report->timestamp_us()); + expected_remote_candidate.transport_id = *expected_pair.transport_id; expected_remote_candidate.ip = "42.42.42.42"; expected_remote_candidate.port = 42; expected_remote_candidate.protocol = "protocol"; diff --git a/webrtc/api/stats/rtcstats_objects.h b/webrtc/api/stats/rtcstats_objects.h index cad3bc5e5a..a006b38ba0 100644 --- a/webrtc/api/stats/rtcstats_objects.h +++ b/webrtc/api/stats/rtcstats_objects.h @@ -167,6 +167,7 @@ class RTCIceCandidateStats : public RTCStats { RTCIceCandidateStats(const RTCIceCandidateStats& other); ~RTCIceCandidateStats() override; + RTCStatsMember transport_id; RTCStatsMember is_remote; RTCStatsMember ip; RTCStatsMember port; diff --git a/webrtc/stats/rtcstats_objects.cc b/webrtc/stats/rtcstats_objects.cc index 11d418b440..947cc32fad 100644 --- a/webrtc/stats/rtcstats_objects.cc +++ b/webrtc/stats/rtcstats_objects.cc @@ -236,6 +236,7 @@ RTCIceCandidatePairStats::~RTCIceCandidatePairStats() { } WEBRTC_RTCSTATS_IMPL(RTCIceCandidateStats, RTCStats, "ice-candidate", + &transport_id, &is_remote, &ip, &port, @@ -253,6 +254,7 @@ RTCIceCandidateStats::RTCIceCandidateStats( RTCIceCandidateStats::RTCIceCandidateStats( std::string&& id, int64_t timestamp_us, bool is_remote) : RTCStats(std::move(id), timestamp_us), + transport_id("transportId"), is_remote("isRemote", is_remote), ip("ip"), port("port"), @@ -265,6 +267,7 @@ RTCIceCandidateStats::RTCIceCandidateStats( RTCIceCandidateStats::RTCIceCandidateStats(const RTCIceCandidateStats& other) : RTCStats(other.id(), other.timestamp_us()), + transport_id(other.transport_id), is_remote(other.is_remote), ip(other.ip), port(other.port),