RTCIceCandidateStats.transportId added and collected.

BUG=webrtc:6756, chromium:632723, chromium:627816

Review-Url: https://codereview.webrtc.org/2597963002
Cr-Commit-Position: refs/heads/master@{#15875}
diff --git a/webrtc/api/rtcstats_integrationtest.cc b/webrtc/api/rtcstats_integrationtest.cc
index eec8915..b9e8ac2 100644
--- a/webrtc/api/rtcstats_integrationtest.cc
+++ b/webrtc/api/rtcstats_integrationtest.cc
@@ -390,6 +390,8 @@
   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<int32_t>(candidate.port);
diff --git a/webrtc/api/rtcstatscollector.cc b/webrtc/api/rtcstatscollector.cc
index ff7b751..3ab7ac9 100644
--- a/webrtc/api/rtcstatscollector.cc
+++ b/webrtc/api/rtcstatscollector.cc
@@ -277,7 +277,7 @@
 
 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 @@
       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<int32_t>(candidate.address().port());
     candidate_stats->protocol = candidate.protocol();
@@ -664,9 +665,9 @@
         // 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 adec104..72d00c4 100644
--- a/webrtc/api/rtcstatscollector_unittest.cc
+++ b/webrtc/api/rtcstatscollector_unittest.cc
@@ -904,6 +904,7 @@
       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 @@
       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 @@
       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 @@
       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 @@
       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 @@
       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 @@
 
   rtc::scoped_refptr<const RTCStatsReport> 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 @@
   EXPECT_EQ(
       expected_pair,
       report->Get(expected_pair.id())->cast_to<RTCIceCandidatePairStats>());
+  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 @@
 
   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 cad3bc5..a006b38 100644
--- a/webrtc/api/stats/rtcstats_objects.h
+++ b/webrtc/api/stats/rtcstats_objects.h
@@ -167,6 +167,7 @@
   RTCIceCandidateStats(const RTCIceCandidateStats& other);
   ~RTCIceCandidateStats() override;
 
+  RTCStatsMember<std::string> transport_id;
   RTCStatsMember<bool> is_remote;
   RTCStatsMember<std::string> ip;
   RTCStatsMember<int32_t> port;
diff --git a/webrtc/stats/rtcstats_objects.cc b/webrtc/stats/rtcstats_objects.cc
index 11d418b..947cc32 100644
--- a/webrtc/stats/rtcstats_objects.cc
+++ b/webrtc/stats/rtcstats_objects.cc
@@ -236,6 +236,7 @@
 }
 
 WEBRTC_RTCSTATS_IMPL(RTCIceCandidateStats, RTCStats, "ice-candidate",
+    &transport_id,
     &is_remote,
     &ip,
     &port,
@@ -253,6 +254,7 @@
 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(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),