Index: webrtc/video/send_statistics_proxy_unittest.cc |
diff --git a/webrtc/video/send_statistics_proxy_unittest.cc b/webrtc/video/send_statistics_proxy_unittest.cc |
index bb404fb8bed65a29b2729a9c7055e24c8e0981c0..273ddf5aaf0d43df603794856a21fac486ed8c30 100644 |
--- a/webrtc/video/send_statistics_proxy_unittest.cc |
+++ b/webrtc/video/send_statistics_proxy_unittest.cc |
@@ -21,6 +21,9 @@ |
#include "webrtc/test/histogram.h" |
namespace webrtc { |
+namespace { |
+const int64_t kMaxPacketDelayMs = 11000; |
+} // namespace |
static const uint32_t kFirstSsrc = 17; |
static const uint32_t kSecondSsrc = 42; |
@@ -106,10 +109,7 @@ class SendStatisticsProxyTest : public ::testing::Test { |
TEST_F(SendStatisticsProxyTest, RtcpStatistics) { |
RtcpStatisticsCallback* callback = statistics_proxy_.get(); |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin(); |
- it != config_.rtp.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.ssrcs) { |
VideoSendStream::StreamStats& ssrc_stats = expected_.substreams[ssrc]; |
// Add statistics with some arbitrary, but unique, numbers. |
@@ -120,10 +120,7 @@ TEST_F(SendStatisticsProxyTest, RtcpStatistics) { |
ssrc_stats.rtcp_stats.jitter = offset + 3; |
callback->StatisticsUpdated(ssrc_stats.rtcp_stats, ssrc); |
} |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin(); |
- it != config_.rtp.rtx.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.rtx.ssrcs) { |
VideoSendStream::StreamStats& ssrc_stats = expected_.substreams[ssrc]; |
// Add statistics with some arbitrary, but unique, numbers. |
@@ -164,10 +161,7 @@ TEST_F(SendStatisticsProxyTest, Suspended) { |
TEST_F(SendStatisticsProxyTest, FrameCounts) { |
FrameCountObserver* observer = statistics_proxy_.get(); |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin(); |
- it != config_.rtp.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.ssrcs) { |
// Add statistics with some arbitrary, but unique, numbers. |
VideoSendStream::StreamStats& stats = expected_.substreams[ssrc]; |
uint32_t offset = ssrc * sizeof(VideoSendStream::StreamStats); |
@@ -177,10 +171,7 @@ TEST_F(SendStatisticsProxyTest, FrameCounts) { |
stats.frame_counts = frame_counts; |
observer->FrameCountUpdated(frame_counts, ssrc); |
} |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin(); |
- it != config_.rtp.rtx.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.rtx.ssrcs) { |
// Add statistics with some arbitrary, but unique, numbers. |
VideoSendStream::StreamStats& stats = expected_.substreams[ssrc]; |
uint32_t offset = ssrc * sizeof(VideoSendStream::StreamStats); |
@@ -197,10 +188,7 @@ TEST_F(SendStatisticsProxyTest, FrameCounts) { |
TEST_F(SendStatisticsProxyTest, DataCounters) { |
StreamDataCountersCallback* callback = statistics_proxy_.get(); |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin(); |
- it != config_.rtp.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.ssrcs) { |
StreamDataCounters& counters = expected_.substreams[ssrc].rtp_stats; |
// Add statistics with some arbitrary, but unique, numbers. |
size_t offset = ssrc * sizeof(StreamDataCounters); |
@@ -213,10 +201,7 @@ TEST_F(SendStatisticsProxyTest, DataCounters) { |
counters.transmitted.packets = offset_uint32 + 5; |
callback->DataCountersUpdated(counters, ssrc); |
} |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin(); |
- it != config_.rtp.rtx.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.rtx.ssrcs) { |
StreamDataCounters& counters = expected_.substreams[ssrc].rtp_stats; |
// Add statistics with some arbitrary, but unique, numbers. |
size_t offset = ssrc * sizeof(StreamDataCounters); |
@@ -236,10 +221,7 @@ TEST_F(SendStatisticsProxyTest, DataCounters) { |
TEST_F(SendStatisticsProxyTest, Bitrate) { |
BitrateStatisticsObserver* observer = statistics_proxy_.get(); |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin(); |
- it != config_.rtp.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.ssrcs) { |
BitrateStatistics total; |
BitrateStatistics retransmit; |
// Use ssrc as bitrate_bps to get a unique value for each stream. |
@@ -249,10 +231,7 @@ TEST_F(SendStatisticsProxyTest, Bitrate) { |
expected_.substreams[ssrc].total_bitrate_bps = total.bitrate_bps; |
expected_.substreams[ssrc].retransmit_bitrate_bps = retransmit.bitrate_bps; |
} |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin(); |
- it != config_.rtp.rtx.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.rtx.ssrcs) { |
BitrateStatistics total; |
BitrateStatistics retransmit; |
// Use ssrc as bitrate_bps to get a unique value for each stream. |
@@ -269,10 +248,7 @@ TEST_F(SendStatisticsProxyTest, Bitrate) { |
TEST_F(SendStatisticsProxyTest, SendSideDelay) { |
SendSideDelayObserver* observer = statistics_proxy_.get(); |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin(); |
- it != config_.rtp.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.ssrcs) { |
// Use ssrc as avg_delay_ms and max_delay_ms to get a unique value for each |
// stream. |
int avg_delay_ms = ssrc; |
@@ -281,10 +257,7 @@ TEST_F(SendStatisticsProxyTest, SendSideDelay) { |
expected_.substreams[ssrc].avg_delay_ms = avg_delay_ms; |
expected_.substreams[ssrc].max_delay_ms = max_delay_ms; |
} |
- for (std::vector<uint32_t>::const_iterator it = config_.rtp.rtx.ssrcs.begin(); |
- it != config_.rtp.rtx.ssrcs.end(); |
- ++it) { |
- const uint32_t ssrc = *it; |
+ for (const auto& ssrc : config_.rtp.rtx.ssrcs) { |
// Use ssrc as avg_delay_ms and max_delay_ms to get a unique value for each |
// stream. |
int avg_delay_ms = ssrc; |
@@ -297,6 +270,60 @@ TEST_F(SendStatisticsProxyTest, SendSideDelay) { |
ExpectEqual(expected_, stats); |
} |
+TEST_F(SendStatisticsProxyTest, VerifySendDelayHistogramStats) { |
+ test::ClearHistograms(); |
+ const int kMinRequiredSamples = 200; |
+ const int64_t kSendDelayInMs = 5; |
+ SendPacketObserver* observer = statistics_proxy_.get(); |
+ const uint32_t ssrc = *config_.rtp.ssrcs.begin(); |
+ |
+ uint16_t packet_id = 0; |
+ for (int i = 0; i < kMinRequiredSamples; ++i) { |
+ observer->OnSendPacket(++packet_id, fake_clock_.TimeInMilliseconds(), ssrc); |
+ // Packet sent to transport. |
+ fake_clock_.AdvanceTimeMilliseconds(kSendDelayInMs); |
+ EXPECT_TRUE(statistics_proxy_->OnSentPacket(packet_id)); |
+ } |
+ statistics_proxy_.reset(); |
+ EXPECT_EQ(1, test::NumHistogramSamples("WebRTC.Video.SendDelayInMs")); |
+ EXPECT_EQ(kSendDelayInMs, |
+ test::LastHistogramSample("WebRTC.Video.SendDelayInMs")); |
+} |
+ |
+TEST_F(SendStatisticsProxyTest, OnSentPacket) { |
+ const uint16_t kPacketId = 2345; |
+ SendPacketObserver* observer = statistics_proxy_.get(); |
+ const uint32_t ssrc = *config_.rtp.ssrcs.begin(); |
+ |
+ observer->OnSendPacket(kPacketId, fake_clock_.TimeInMilliseconds(), ssrc); |
+ fake_clock_.AdvanceTimeMilliseconds(kMaxPacketDelayMs - 1); |
+ observer->OnSendPacket(kPacketId + 1, fake_clock_.TimeInMilliseconds(), ssrc); |
+ |
+ // Verify that packets are found. |
+ EXPECT_TRUE(statistics_proxy_->OnSentPacket(kPacketId)); |
+ EXPECT_TRUE(statistics_proxy_->OnSentPacket(kPacketId + 1)); |
+ // Packets found, should have been removed. |
+ EXPECT_FALSE(statistics_proxy_->OnSentPacket(kPacketId)); |
+ EXPECT_FALSE(statistics_proxy_->OnSentPacket(kPacketId + 1)); |
+} |
+ |
+TEST_F(SendStatisticsProxyTest, OnSendPacketRemovesOldPackets) { |
+ SendPacketObserver* observer = statistics_proxy_.get(); |
+ const uint32_t ssrc = *config_.rtp.ssrcs.begin(); |
+ const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds(); |
+ |
+ observer->OnSendPacket(0xffffu, kCaptureTimeMs, ssrc); |
+ observer->OnSendPacket(0u, kCaptureTimeMs, ssrc); |
+ observer->OnSendPacket(1u, kCaptureTimeMs + 1, ssrc); |
+ fake_clock_.AdvanceTimeMilliseconds(kMaxPacketDelayMs); // 0xffff, 0 -> old. |
+ observer->OnSendPacket(2u, kCaptureTimeMs + 2, ssrc); |
+ |
+ EXPECT_FALSE(statistics_proxy_->OnSentPacket(0xffffu)); // Old removed. |
+ EXPECT_FALSE(statistics_proxy_->OnSentPacket(0u)); // Old removed. |
+ EXPECT_TRUE(statistics_proxy_->OnSentPacket(1u)); |
+ EXPECT_TRUE(statistics_proxy_->OnSentPacket(2u)); |
+} |
+ |
TEST_F(SendStatisticsProxyTest, OnEncodedFrameTimeMeasured) { |
const int kEncodeTimeMs = 11; |
CpuOveruseMetrics metrics; |