| 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 4cee1046ddb0509980a9e6a46673adeb19c30057..599fb7a359164ba1b7686c6e623b3041f472ae5c 100644
|
| --- a/webrtc/video/send_statistics_proxy_unittest.cc
|
| +++ b/webrtc/video/send_statistics_proxy_unittest.cc
|
| @@ -82,6 +82,13 @@ class SendStatisticsProxyTest : public ::testing::Test {
|
| return it->second;
|
| }
|
|
|
| + void UpdateDataCounters(uint32_t ssrc) {
|
| + StreamDataCountersCallback* proxy =
|
| + static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
|
| + StreamDataCounters counters;
|
| + proxy->DataCountersUpdated(counters, ssrc);
|
| + }
|
| +
|
| void ExpectEqual(VideoSendStream::Stats one, VideoSendStream::Stats other) {
|
| EXPECT_EQ(one.input_frame_rate, other.input_frame_rate);
|
| EXPECT_EQ(one.encode_frame_rate, other.encode_frame_rate);
|
| @@ -504,6 +511,114 @@ TEST_F(SendStatisticsProxyTest, CodecTypeHistogramIsUpdated) {
|
| EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoder.CodecType"));
|
| }
|
|
|
| +TEST_F(SendStatisticsProxyTest, PauseEventHistogramIsUpdated) {
|
| + // First RTP packet sent.
|
| + UpdateDataCounters(kFirstSsrc);
|
| +
|
| + // Min runtime has passed.
|
| + fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
|
| + statistics_proxy_.reset();
|
| + EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.NumberOfPauseEvents"));
|
| + EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.NumberOfPauseEvents", 0));
|
| +}
|
| +
|
| +TEST_F(SendStatisticsProxyTest,
|
| + PauseEventHistogramIsNotUpdatedIfMinRuntimeHasNotPassed) {
|
| + // First RTP packet sent.
|
| + UpdateDataCounters(kFirstSsrc);
|
| +
|
| + // Min runtime has not passed.
|
| + fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000 - 1);
|
| + statistics_proxy_.reset();
|
| + EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.NumberOfPauseEvents"));
|
| + EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.PausedTimeInPercent"));
|
| +}
|
| +
|
| +TEST_F(SendStatisticsProxyTest,
|
| + PauseEventHistogramIsNotUpdatedIfNoMediaIsSent) {
|
| + // First RTP packet not sent.
|
| + fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
|
| + statistics_proxy_.reset();
|
| + EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.NumberOfPauseEvents"));
|
| +}
|
| +
|
| +TEST_F(SendStatisticsProxyTest, NoPauseEvent) {
|
| + // First RTP packet sent and min runtime passed.
|
| + UpdateDataCounters(kFirstSsrc);
|
| +
|
| + // No change. Video: 10000 ms, paused: 0 ms (0%).
|
| + statistics_proxy_->OnSetEncoderTargetRate(50000);
|
| + fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
|
| + statistics_proxy_->OnSetEncoderTargetRate(0); // VideoSendStream::Stop
|
| +
|
| + statistics_proxy_.reset();
|
| + EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.NumberOfPauseEvents"));
|
| + EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.NumberOfPauseEvents", 0));
|
| + EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PausedTimeInPercent"));
|
| + EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.PausedTimeInPercent", 0));
|
| +}
|
| +
|
| +TEST_F(SendStatisticsProxyTest, OnePauseEvent) {
|
| + // First RTP packet sent and min runtime passed.
|
| + UpdateDataCounters(kFirstSsrc);
|
| +
|
| + // One change. Video: 7000 ms, paused: 3000 ms (30%).
|
| + statistics_proxy_->OnSetEncoderTargetRate(50000);
|
| + fake_clock_.AdvanceTimeMilliseconds(7000);
|
| + statistics_proxy_->OnSetEncoderTargetRate(0);
|
| + fake_clock_.AdvanceTimeMilliseconds(3000);
|
| + statistics_proxy_->OnSetEncoderTargetRate(0); // VideoSendStream::Stop
|
| +
|
| + statistics_proxy_.reset();
|
| + EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.NumberOfPauseEvents"));
|
| + EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.NumberOfPauseEvents", 1));
|
| + EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PausedTimeInPercent"));
|
| + EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.PausedTimeInPercent", 30));
|
| +}
|
| +
|
| +TEST_F(SendStatisticsProxyTest, TwoPauseEvents) {
|
| + // First RTP packet sent.
|
| + UpdateDataCounters(kFirstSsrc);
|
| +
|
| + // Two changes. Video: 19000 ms, paused: 1000 ms (5%).
|
| + statistics_proxy_->OnSetEncoderTargetRate(0);
|
| + fake_clock_.AdvanceTimeMilliseconds(1000);
|
| + statistics_proxy_->OnSetEncoderTargetRate(50000); // Starts on bitrate > 0.
|
| + fake_clock_.AdvanceTimeMilliseconds(7000);
|
| + statistics_proxy_->OnSetEncoderTargetRate(60000);
|
| + fake_clock_.AdvanceTimeMilliseconds(3000);
|
| + statistics_proxy_->OnSetEncoderTargetRate(0);
|
| + fake_clock_.AdvanceTimeMilliseconds(250);
|
| + statistics_proxy_->OnSetEncoderTargetRate(0);
|
| + fake_clock_.AdvanceTimeMilliseconds(750);
|
| + statistics_proxy_->OnSetEncoderTargetRate(60000);
|
| + fake_clock_.AdvanceTimeMilliseconds(5000);
|
| + statistics_proxy_->OnSetEncoderTargetRate(50000);
|
| + fake_clock_.AdvanceTimeMilliseconds(4000);
|
| + statistics_proxy_->OnSetEncoderTargetRate(0); // VideoSendStream::Stop
|
| +
|
| + statistics_proxy_.reset();
|
| + EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.NumberOfPauseEvents"));
|
| + EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.NumberOfPauseEvents", 2));
|
| + EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PausedTimeInPercent"));
|
| + EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.PausedTimeInPercent", 5));
|
| +}
|
| +
|
| +TEST_F(SendStatisticsProxyTest,
|
| + PausedTimeHistogramIsNotUpdatedIfMinRuntimeHasNotPassed) {
|
| + // First RTP packet sent.
|
| + UpdateDataCounters(kFirstSsrc);
|
| + fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
|
| +
|
| + // Min runtime has not passed.
|
| + statistics_proxy_->OnSetEncoderTargetRate(50000);
|
| + fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000 - 1);
|
| + statistics_proxy_->OnSetEncoderTargetRate(0); // VideoSendStream::Stop
|
| +
|
| + statistics_proxy_.reset();
|
| + EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.PausedTimeInPercent"));
|
| +}
|
| +
|
| TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8) {
|
| EncodedImage encoded_image;
|
| CodecSpecificInfo codec_info;
|
| @@ -730,6 +845,18 @@ TEST_F(SendStatisticsProxyTest, GetStatsReportsBandwidthLimitedResolution) {
|
| EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_resolution);
|
| }
|
|
|
| +TEST_F(SendStatisticsProxyTest, GetStatsReportsTargetMediaBitrate) {
|
| + // Initially zero.
|
| + EXPECT_EQ(0, statistics_proxy_->GetStats().target_media_bitrate_bps);
|
| +
|
| + const int kBitrate = 100000;
|
| + statistics_proxy_->OnSetEncoderTargetRate(kBitrate);
|
| + EXPECT_EQ(kBitrate, statistics_proxy_->GetStats().target_media_bitrate_bps);
|
| +
|
| + statistics_proxy_->OnSetEncoderTargetRate(0);
|
| + EXPECT_EQ(0, statistics_proxy_->GetStats().target_media_bitrate_bps);
|
| +}
|
| +
|
| TEST_F(SendStatisticsProxyTest, NoSubstreams) {
|
| uint32_t excluded_ssrc =
|
| std::max(
|
|
|