| 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(
 | 
| 
 |