diff --git a/webrtc/pc/rtcstatscollector.cc b/webrtc/pc/rtcstatscollector.cc index 347bca53ea..d9da0729ed 100644 --- a/webrtc/pc/rtcstatscollector.cc +++ b/webrtc/pc/rtcstatscollector.cc @@ -1235,9 +1235,8 @@ void RTCStatsCollector::OnDataChannelClosed(DataChannel* channel) { RTC_DCHECK(signaling_thread_->IsCurrent()); // Only channels that have been fully opened (and have increased the // |data_channels_opened_| counter) increase the closed counter. - if (internal_record_.opened_data_channels.find( - reinterpret_cast(channel)) != - internal_record_.opened_data_channels.end()) { + if (internal_record_.opened_data_channels.erase( + reinterpret_cast(channel))) { ++internal_record_.data_channels_closed; } } diff --git a/webrtc/pc/rtcstatscollector_unittest.cc b/webrtc/pc/rtcstatscollector_unittest.cc index ea7b34a933..8fd00c6178 100644 --- a/webrtc/pc/rtcstatscollector_unittest.cc +++ b/webrtc/pc/rtcstatscollector_unittest.cc @@ -1463,6 +1463,39 @@ TEST_F(RTCStatsCollectorTest, CollectRTCPeerConnectionStats) { report->Get("RTCPeerConnection")->cast_to< RTCPeerConnectionStats>()); } + + // Re-opening a data channel (or opening a new data channel that is re-using + // the same address in memory) should increase the opened count. + dummy_channel_b->SignalOpened(dummy_channel_b.get()); + + { + collector_->ClearCachedStatsReport(); + rtc::scoped_refptr report = GetStatsReport(); + RTCPeerConnectionStats expected("RTCPeerConnection", + report->timestamp_us()); + expected.data_channels_opened = 3; + expected.data_channels_closed = 1; + ASSERT_TRUE(report->Get("RTCPeerConnection")); + EXPECT_EQ(expected, + report->Get("RTCPeerConnection")->cast_to< + RTCPeerConnectionStats>()); + } + + dummy_channel_a->SignalClosed(dummy_channel_a.get()); + dummy_channel_b->SignalClosed(dummy_channel_b.get()); + + { + collector_->ClearCachedStatsReport(); + rtc::scoped_refptr report = GetStatsReport(); + RTCPeerConnectionStats expected("RTCPeerConnection", + report->timestamp_us()); + expected.data_channels_opened = 3; + expected.data_channels_closed = 3; + ASSERT_TRUE(report->Get("RTCPeerConnection")); + EXPECT_EQ(expected, + report->Get("RTCPeerConnection")->cast_to< + RTCPeerConnectionStats>()); + } } TEST_F(RTCStatsCollectorTest,