RTCTransportStats.dtlsState replaces .activeConnection

In accordance with recent spec change:
https://github.com/w3c/webrtc-stats/pull/122

BUG=chromium:653873, chromium:627816

Review-Url: https://codereview.webrtc.org/2625993002
Cr-Original-Commit-Position: refs/heads/master@{#16098}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: 7064d5929a978aad8c3ce6cab61cef2c8c9203be
diff --git a/api/rtcstats_integrationtest.cc b/api/rtcstats_integrationtest.cc
index 69dc834..7a67038 100644
--- a/api/rtcstats_integrationtest.cc
+++ b/api/rtcstats_integrationtest.cc
@@ -572,7 +572,7 @@
     verifier.TestMemberIsNonNegative<uint64_t>(transport.bytes_received);
     verifier.TestMemberIsOptionalIDReference(
         transport.rtcp_transport_stats_id, RTCTransportStats::kType);
-    verifier.TestMemberIsDefined(transport.active_connection);
+    verifier.TestMemberIsDefined(transport.dtls_state);
     verifier.TestMemberIsIDReference(
         transport.selected_candidate_pair_id, RTCIceCandidatePairStats::kType);
     verifier.TestMemberIsIDReference(
diff --git a/api/rtcstatscollector.cc b/api/rtcstatscollector.cc
index eade3d3..5afbb7b 100644
--- a/api/rtcstatscollector.cc
+++ b/api/rtcstatscollector.cc
@@ -132,6 +132,25 @@
   }
 }
 
+const char* DtlsTransportStateToRTCDtlsTransportState(
+    cricket::DtlsTransportState state) {
+  switch (state) {
+    case cricket::DTLS_TRANSPORT_NEW:
+      return RTCDtlsTransportState::kNew;
+    case cricket::DTLS_TRANSPORT_CONNECTING:
+      return RTCDtlsTransportState::kConnecting;
+    case cricket::DTLS_TRANSPORT_CONNECTED:
+      return RTCDtlsTransportState::kConnected;
+    case cricket::DTLS_TRANSPORT_CLOSED:
+      return RTCDtlsTransportState::kClosed;
+    case cricket::DTLS_TRANSPORT_FAILED:
+      return RTCDtlsTransportState::kFailed;
+    default:
+      RTC_NOTREACHED();
+      return nullptr;
+  }
+}
+
 std::unique_ptr<RTCCodecStats> CodecStatsFromRtpCodecParameters(
     uint64_t timestamp_us, bool inbound, bool audio,
     const RtpCodecParameters& codec_params) {
@@ -926,13 +945,13 @@
               timestamp_us));
       transport_stats->bytes_sent = 0;
       transport_stats->bytes_received = 0;
-      transport_stats->active_connection = false;
+      transport_stats->dtls_state = DtlsTransportStateToRTCDtlsTransportState(
+          channel_stats.dtls_state);
       for (const cricket::ConnectionInfo& info :
            channel_stats.connection_infos) {
         *transport_stats->bytes_sent += info.sent_total_bytes;
         *transport_stats->bytes_received += info.recv_total_bytes;
         if (info.best_connection) {
-          transport_stats->active_connection = true;
           transport_stats->selected_candidate_pair_id =
               RTCIceCandidatePairStatsIDFromConnectionInfo(info);
         }
diff --git a/api/rtcstatscollector_unittest.cc b/api/rtcstatscollector_unittest.cc
index 5392586..22b7ee4 100644
--- a/api/rtcstatscollector_unittest.cc
+++ b/api/rtcstatscollector_unittest.cc
@@ -1989,6 +1989,7 @@
   cricket::TransportChannelStats rtp_transport_channel_stats;
   rtp_transport_channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP;
   rtp_transport_channel_stats.connection_infos.push_back(rtp_connection_info);
+  rtp_transport_channel_stats.dtls_state = cricket::DTLS_TRANSPORT_NEW;
   session_stats.transport_stats["transport"].channel_stats.push_back(
       rtp_transport_channel_stats);
 
@@ -2008,7 +2009,7 @@
       report->timestamp_us());
   expected_rtp_transport.bytes_sent = 42;
   expected_rtp_transport.bytes_received = 1337;
-  expected_rtp_transport.active_connection = false;
+  expected_rtp_transport.dtls_state = RTCDtlsTransportState::kNew;
 
   ASSERT_TRUE(report->Get(expected_rtp_transport.id()));
   EXPECT_EQ(
@@ -2025,6 +2026,7 @@
   rtcp_transport_channel_stats.component =
       cricket::ICE_CANDIDATE_COMPONENT_RTCP;
   rtcp_transport_channel_stats.connection_infos.push_back(rtcp_connection_info);
+  rtcp_transport_channel_stats.dtls_state = cricket::DTLS_TRANSPORT_CONNECTING;
   session_stats.transport_stats["transport"].channel_stats.push_back(
       rtcp_transport_channel_stats);
 
@@ -2038,7 +2040,7 @@
       report->timestamp_us());
   expected_rtcp_transport.bytes_sent = 1337;
   expected_rtcp_transport.bytes_received = 42;
-  expected_rtcp_transport.active_connection = false;
+  expected_rtcp_transport.dtls_state = RTCDtlsTransportState::kConnecting;
 
   expected_rtp_transport.rtcp_transport_stats_id = expected_rtcp_transport.id();
 
@@ -2051,7 +2053,7 @@
       expected_rtcp_transport,
       report->Get(expected_rtcp_transport.id())->cast_to<RTCTransportStats>());
 
-  // Get stats with an active connection.
+  // Get stats with an active connection (selected candidate pair).
   session_stats.transport_stats["transport"]
       .channel_stats[1]
       .connection_infos[0]
@@ -2060,7 +2062,6 @@
   collector_->ClearCachedStatsReport();
   report = GetStatsReport();
 
-  expected_rtcp_transport.active_connection = true;
   expected_rtcp_transport.selected_candidate_pair_id =
       "RTCIceCandidatePair_" + rtcp_local_candidate->id() + "_" +
       rtcp_remote_candidate->id();
diff --git a/api/stats/rtcstats_objects.h b/api/stats/rtcstats_objects.h
index 80830c3..1f96bcd 100644
--- a/api/stats/rtcstats_objects.h
+++ b/api/stats/rtcstats_objects.h
@@ -42,6 +42,15 @@
   static const char* kRelay;
 };
 
+// https://w3c.github.io/webrtc-pc/#idl-def-rtcdtlstransportstate
+struct RTCDtlsTransportState {
+  static const char* kNew;
+  static const char* kConnecting;
+  static const char* kConnected;
+  static const char* kClosed;
+  static const char* kFailed;
+};
+
 // https://w3c.github.io/webrtc-stats/#certificatestats-dict*
 class RTCCertificateStats final : public RTCStats {
  public:
@@ -391,7 +400,8 @@
   RTCStatsMember<uint64_t> bytes_sent;
   RTCStatsMember<uint64_t> bytes_received;
   RTCStatsMember<std::string> rtcp_transport_stats_id;
-  RTCStatsMember<bool> active_connection;
+  // TODO(hbos): Support enum types? "RTCStatsMember<RTCDtlsTransportState>"?
+  RTCStatsMember<std::string> dtls_state;
   RTCStatsMember<std::string> selected_candidate_pair_id;
   RTCStatsMember<std::string> local_certificate_id;
   RTCStatsMember<std::string> remote_certificate_id;
diff --git a/p2p/base/jseptransport.cc b/p2p/base/jseptransport.cc
index 84e6cee..c3d6755 100644
--- a/p2p/base/jseptransport.cc
+++ b/p2p/base/jseptransport.cc
@@ -291,6 +291,7 @@
     substats.component = kv.first;
     channel->GetSrtpCryptoSuite(&substats.srtp_crypto_suite);
     channel->GetSslCipherSuite(&substats.ssl_cipher_suite);
+    substats.dtls_state = channel->dtls_state();
     if (!channel->GetStats(&substats.connection_infos)) {
       return false;
     }
diff --git a/p2p/base/jseptransport.h b/p2p/base/jseptransport.h
index 1cb94e0..dcf4a5f 100644
--- a/p2p/base/jseptransport.h
+++ b/p2p/base/jseptransport.h
@@ -125,6 +125,7 @@
   ConnectionInfos connection_infos;
   int srtp_crypto_suite = rtc::SRTP_INVALID_CRYPTO_SUITE;
   int ssl_cipher_suite = rtc::TLS_NULL_WITH_NULL_NULL;
+  DtlsTransportState dtls_state = DTLS_TRANSPORT_NEW;
 };
 
 // Information about all the channels of a transport.
diff --git a/stats/rtcstats_objects.cc b/stats/rtcstats_objects.cc
index 59183ad..1b9d12a 100644
--- a/stats/rtcstats_objects.cc
+++ b/stats/rtcstats_objects.cc
@@ -29,6 +29,12 @@
 const char* RTCIceCandidateType::kPrflx = "prflx";
 const char* RTCIceCandidateType::kRelay = "relay";
 
+const char* RTCDtlsTransportState::kNew = "new";
+const char* RTCDtlsTransportState::kConnecting = "connecting";
+const char* RTCDtlsTransportState::kConnected = "connected";
+const char* RTCDtlsTransportState::kClosed = "closed";
+const char* RTCDtlsTransportState::kFailed = "failed";
+
 WEBRTC_RTCSTATS_IMPL(RTCCertificateStats, RTCStats, "certificate",
     &fingerprint,
     &fingerprint_algorithm,
@@ -601,7 +607,7 @@
     &bytes_sent,
     &bytes_received,
     &rtcp_transport_stats_id,
-    &active_connection,
+    &dtls_state,
     &selected_candidate_pair_id,
     &local_certificate_id,
     &remote_certificate_id);
@@ -617,7 +623,7 @@
       bytes_sent("bytesSent"),
       bytes_received("bytesReceived"),
       rtcp_transport_stats_id("rtcpTransportStatsId"),
-      active_connection("activeConnection"),
+      dtls_state("dtlsState"),
       selected_candidate_pair_id("selectedCandidatePairId"),
       local_certificate_id("localCertificateId"),
       remote_certificate_id("remoteCertificateId") {
@@ -629,7 +635,7 @@
       bytes_sent(other.bytes_sent),
       bytes_received(other.bytes_received),
       rtcp_transport_stats_id(other.rtcp_transport_stats_id),
-      active_connection(other.active_connection),
+      dtls_state(other.dtls_state),
       selected_candidate_pair_id(other.selected_candidate_pair_id),
       local_certificate_id(other.local_certificate_id),
       remote_certificate_id(other.remote_certificate_id) {