Chromium Code Reviews| 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 de42fe8b2a6e46829f66c4bb414cfe58a0c62995..a2951f0de90b343d67e52032de09c5086c0e2cfe 100644 |
| --- a/webrtc/video/send_statistics_proxy_unittest.cc |
| +++ b/webrtc/video/send_statistics_proxy_unittest.cc |
| @@ -17,6 +17,7 @@ |
| #include "webrtc/system_wrappers/include/metrics.h" |
| #include "webrtc/system_wrappers/include/metrics_default.h" |
| +#include "webrtc/test/field_trial.h" |
| #include "webrtc/test/gtest.h" |
| namespace webrtc { |
| @@ -31,6 +32,7 @@ const int kWidth = 640; |
| const int kHeight = 480; |
| const int kQpIdx0 = 21; |
| const int kQpIdx1 = 39; |
| +const int kMinFirstFallbackIntervalMs = 1500; |
| const CodecSpecificInfo kDefaultCodecInfo = []() { |
| CodecSpecificInfo codec_info; |
| codec_info.codecType = kVideoCodecVP8; |
| @@ -41,8 +43,12 @@ const CodecSpecificInfo kDefaultCodecInfo = []() { |
| class SendStatisticsProxyTest : public ::testing::Test { |
| public: |
| - SendStatisticsProxyTest() |
| - : fake_clock_(1234), config_(GetTestConfig()), avg_delay_ms_(0), |
| + SendStatisticsProxyTest() : SendStatisticsProxyTest("") {} |
| + explicit SendStatisticsProxyTest(const std::string& field_trials) |
| + : override_field_trials_(field_trials), |
| + fake_clock_(1234), |
| + config_(GetTestConfig()), |
| + avg_delay_ms_(0), |
| max_delay_ms_(0) {} |
| virtual ~SendStatisticsProxyTest() {} |
| @@ -140,6 +146,7 @@ class SendStatisticsProxyTest : public ::testing::Test { |
| } |
| } |
| + test::ScopedFieldTrials override_field_trials_; |
| SimulatedClock fake_clock_; |
| std::unique_ptr<SendStatisticsProxy> statistics_proxy_; |
| VideoSendStream::Config config_; |
| @@ -1799,4 +1806,143 @@ TEST_F(SendStatisticsProxyTest, FecBitrateNotReportedWhenNotEnabled) { |
| EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps")); |
| } |
| +TEST_F(SendStatisticsProxyTest, GetStatsReportsEncoderImplementationName) { |
| + const char* kName = "encoderName"; |
| + EncodedImage encoded_image; |
| + CodecSpecificInfo codec_info; |
| + codec_info.codec_name = kName; |
| + statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info); |
| + EXPECT_STREQ( |
| + kName, statistics_proxy_->GetStats().encoder_implementation_name.c_str()); |
| +} |
| + |
|
brandtr
2017/09/14 12:30:12
Add unit test checking that FallbackTimeInPercent.
åsapersson
2017/09/14 14:41:44
Done.
|
| +class ForcedFallbackEnabled : public SendStatisticsProxyTest { |
| + public: |
| + ForcedFallbackEnabled() |
| + : SendStatisticsProxyTest( |
| + "WebRTC-VP8-Forced-Fallback-Encoder/Enabled-1,2," + |
| + std::to_string(kMinFirstFallbackIntervalMs) + ",4/") { |
| + codec_info_.codecType = kVideoCodecVP8; |
| + codec_info_.codecSpecific.VP8.simulcastIdx = 0; |
| + codec_info_.codecSpecific.VP8.temporalIdx = 0; |
| + codec_info_.codec_name = "fake_codec"; |
| + } |
| + |
| + protected: |
| + void InsertEncodedFrames(int num_frames, int interval_ms) { |
| + // First frame is not updating stats, insert initial frame. |
| + if (statistics_proxy_->GetStats().frames_encoded == 0) { |
| + statistics_proxy_->OnSendEncodedImage(encoded_image_, &codec_info_); |
| + } |
| + for (int i = 0; i < num_frames; ++i) { |
| + statistics_proxy_->OnSendEncodedImage(encoded_image_, &codec_info_); |
| + fake_clock_.AdvanceTimeMilliseconds(interval_ms); |
| + } |
| + statistics_proxy_->OnSendEncodedImage(encoded_image_, &codec_info_); |
|
brandtr
2017/09/14 12:30:12
Add comment.
åsapersson
2017/09/14 14:41:44
Done.
|
| + } |
| + |
| + EncodedImage encoded_image_; |
| + CodecSpecificInfo codec_info_; |
| + const std::string kPrefix = "WebRTC.Video.Encoder.ForcedSw"; |
| + const int kFrameIntervalMs = 1000; |
| + const int kMinFrames = 20; // Min run time 20 sec. |
| +}; |
| + |
| +TEST_F(ForcedFallbackEnabled, StatsNotUpdatedIfMinRunTimeHasNotPassed) { |
| + InsertEncodedFrames(kMinFrames, kFrameIntervalMs - 1); |
| + statistics_proxy_.reset(); |
| + EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8")); |
| + EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8")); |
| +} |
| + |
| +TEST_F(ForcedFallbackEnabled, StatsUpdated) { |
| + InsertEncodedFrames(kMinFrames, kFrameIntervalMs); |
| + statistics_proxy_.reset(); |
| + EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8")); |
| + EXPECT_EQ(1, metrics::NumEvents(kPrefix + "FallbackTimeInPercent.Vp8", 0)); |
| + EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8")); |
| + EXPECT_EQ(1, metrics::NumEvents(kPrefix + "FallbackChangesPerMinute.Vp8", 0)); |
| +} |
| + |
| +TEST_F(ForcedFallbackEnabled, StatsNotUpdatedIfNotVp8) { |
| + codec_info_.codecType = kVideoCodecVP9; |
| + InsertEncodedFrames(kMinFrames, kFrameIntervalMs); |
| + statistics_proxy_.reset(); |
| + EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8")); |
| + EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8")); |
| +} |
| + |
| +TEST_F(ForcedFallbackEnabled, StatsNotUpdatedForTemporalLayers) { |
| + codec_info_.codecSpecific.VP8.temporalIdx = 1; |
| + InsertEncodedFrames(kMinFrames, kFrameIntervalMs); |
| + statistics_proxy_.reset(); |
| + EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8")); |
| + EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8")); |
| +} |
| + |
| +TEST_F(ForcedFallbackEnabled, StatsNotUpdatedForSimulcast) { |
| + codec_info_.codecSpecific.VP8.simulcastIdx = 1; |
| + InsertEncodedFrames(kMinFrames, kFrameIntervalMs); |
| + statistics_proxy_.reset(); |
| + EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8")); |
| + EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8")); |
| +} |
| + |
| +TEST_F(ForcedFallbackEnabled, OneFallbackEvent) { |
| + // One change. Video: 20000 ms, fallback: 5000 ms (25%). |
| + InsertEncodedFrames(15, 1000); |
| + codec_info_.codec_name = "libvpx"; |
| + InsertEncodedFrames(5, 1000); |
| + |
| + statistics_proxy_.reset(); |
| + EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8")); |
| + EXPECT_EQ(1, metrics::NumEvents(kPrefix + "FallbackTimeInPercent.Vp8", 25)); |
| + EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8")); |
| + EXPECT_EQ(1, metrics::NumEvents(kPrefix + "FallbackChangesPerMinute.Vp8", 3)); |
| +} |
| + |
| +TEST_F(ForcedFallbackEnabled, ThreeFallbackEvents) { |
| + codec_info_.codecSpecific.VP8.temporalIdx = kNoTemporalIdx; |
|
brandtr
2017/09/14 12:30:12
Delete this line?
åsapersson
2017/09/14 14:41:44
Added comment..
|
| + const int kMaxFrameDiffMs = 2000; |
| + |
| + // Three changes. Video: 60000 ms, fallback: 15000 ms (25%). |
| + InsertEncodedFrames(10, 1000); |
| + codec_info_.codec_name = "libvpx"; |
| + InsertEncodedFrames(15, 500); |
| + codec_info_.codec_name = "notlibvpx"; |
| + InsertEncodedFrames(20, 1000); |
| + InsertEncodedFrames(3, kMaxFrameDiffMs); // Should not be included. |
| + InsertEncodedFrames(10, 1000); |
| + codec_info_.codec_name = "notlibvpx2"; |
| + InsertEncodedFrames(10, 500); |
| + codec_info_.codec_name = "libvpx"; |
| + InsertEncodedFrames(15, 500); |
| + |
| + statistics_proxy_.reset(); |
| + EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8")); |
| + EXPECT_EQ(1, metrics::NumEvents(kPrefix + "FallbackTimeInPercent.Vp8", 25)); |
| + EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8")); |
| + EXPECT_EQ(1, metrics::NumEvents(kPrefix + "FallbackChangesPerMinute.Vp8", 3)); |
| +} |
| + |
| +TEST_F(ForcedFallbackEnabled, NoFallbackIfMinIntervalHasNotPassed) { |
| + InsertEncodedFrames(1, kMinFirstFallbackIntervalMs - 1); |
| + codec_info_.codec_name = "libvpx"; |
| + InsertEncodedFrames(kMinFrames, kFrameIntervalMs); |
| + |
| + statistics_proxy_.reset(); |
| + EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8")); |
| + EXPECT_EQ(0, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8")); |
| +} |
| + |
| +TEST_F(ForcedFallbackEnabled, FallbackIfMinIntervalPassed) { |
| + InsertEncodedFrames(1, kMinFirstFallbackIntervalMs); |
| + codec_info_.codec_name = "libvpx"; |
| + InsertEncodedFrames(kMinFrames, kFrameIntervalMs); |
| + |
| + statistics_proxy_.reset(); |
| + EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackTimeInPercent.Vp8")); |
| + EXPECT_EQ(1, metrics::NumSamples(kPrefix + "FallbackChangesPerMinute.Vp8")); |
| +} |
| + |
| } // namespace webrtc |