| Index: media/blink/watch_time_reporter_unittest.cc
|
| diff --git a/media/blink/watch_time_reporter_unittest.cc b/media/blink/watch_time_reporter_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f4271836c21ec8d2fc61e5031a24cb2d7afce8ad
|
| --- /dev/null
|
| +++ b/media/blink/watch_time_reporter_unittest.cc
|
| @@ -0,0 +1,183 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <memory>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| +#include "base/metrics/histogram_base.h"
|
| +#include "base/metrics/histogram_samples.h"
|
| +#include "base/metrics/statistics_recorder.h"
|
| +#include "base/run_loop.h"
|
| +#include "base/test/power_monitor_test_base.h"
|
| +#include "base/test/test_message_loop.h"
|
| +#include "media/blink/watch_time_reporter.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace media {
|
| +
|
| +constexpr gfx::Size kSizeJustRight = gfx::Size(201, 201);
|
| +
|
| +class WatchTimeReporterTest : public testing::Test {
|
| + public:
|
| + WatchTimeReporterTest()
|
| + : test_power_source_(new base::PowerMonitorTestSource()),
|
| + test_power_monitor_(new base::PowerMonitor(
|
| + std::unique_ptr<base::PowerMonitorSource>(test_power_source_))) {
|
| + statistics_recorder_ =
|
| + base::StatisticsRecorder::CreateTemporaryForTesting();
|
| + }
|
| +
|
| + ~WatchTimeReporterTest() override {}
|
| +
|
| + protected:
|
| + void Initialize(bool has_audio,
|
| + bool has_video,
|
| + bool is_mse,
|
| + bool is_encrypted,
|
| + const gfx::Size& initial_video_size) {
|
| + wtr_.reset(new WatchTimeReporter(
|
| + has_audio, has_video, is_mse, is_encrypted, initial_video_size,
|
| + base::Bind(&WatchTimeReporterTest::GetCurrentMediaTime,
|
| + base::Unretained(this))));
|
| + // Setup the reporting interval to be immediate to avoid spinning real time
|
| + // within the unit test.
|
| + wtr_->reporting_interval_ = base::TimeDelta();
|
| + }
|
| +
|
| + void CycleReportingTimer() {
|
| + base::RunLoop run_loop;
|
| + message_loop_.task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure());
|
| + run_loop.Run();
|
| + }
|
| +
|
| + base::TimeDelta GetReportedWatchTime(const char* histogram_name) {
|
| + const base::HistogramBase* histogram =
|
| + statistics_recorder_->FindHistogram(histogram_name);
|
| + if (!histogram)
|
| + return kNoTimestamp;
|
| +
|
| + std::unique_ptr<base::HistogramSamples> samples =
|
| + histogram->SnapshotSamples();
|
| + if (!samples)
|
| + return kNoTimestamp;
|
| +
|
| + return base::TimeDelta::FromMilliseconds(samples->sum());
|
| + }
|
| +
|
| + base::TimeDelta GetAllWatchTime() {
|
| + return GetReportedWatchTime(WatchTimeReporter::kHistogramAudioVideoAll);
|
| + }
|
| +
|
| + base::TimeDelta GetMseWatchTime() {
|
| + return GetReportedWatchTime(WatchTimeReporter::kHistogramAudioVideoMse);
|
| + }
|
| +
|
| + base::TimeDelta GetEmeWatchTime() {
|
| + return GetReportedWatchTime(WatchTimeReporter::kHistogramAudioVideoEme);
|
| + }
|
| +
|
| + base::TimeDelta GetAcWatchTime() {
|
| + return GetReportedWatchTime(WatchTimeReporter::kHistogramAudioVideoAc);
|
| + }
|
| +
|
| + base::TimeDelta GetBatteryWatchTime() {
|
| + return GetReportedWatchTime(WatchTimeReporter::kHistogramAudioVideoBattery);
|
| + }
|
| +
|
| + bool IsMonitoring() { return wtr_->reporting_timer_.IsRunning(); }
|
| +
|
| + MOCK_METHOD0(GetCurrentMediaTime, base::TimeDelta());
|
| +
|
| + base::TestMessageLoop message_loop_;
|
| + base::PowerMonitorTestSource* test_power_source_;
|
| + std::unique_ptr<base::StatisticsRecorder> statistics_recorder_;
|
| + std::unique_ptr<base::PowerMonitor> test_power_monitor_;
|
| + std::unique_ptr<WatchTimeReporter> wtr_;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(WatchTimeReporterTest);
|
| +};
|
| +
|
| +// Tests that watch time reporting is appropriately enabled or disabled.
|
| +TEST_F(WatchTimeReporterTest, WatchTimeReporter) {
|
| + EXPECT_CALL(*this, GetCurrentMediaTime())
|
| + .WillRepeatedly(testing::Return(base::TimeDelta()));
|
| +
|
| + Initialize(false, true, true, true, kSizeJustRight);
|
| + wtr_->OnPlaying();
|
| + EXPECT_FALSE(IsMonitoring());
|
| +
|
| + Initialize(true, false, true, true, kSizeJustRight);
|
| + wtr_->OnPlaying();
|
| + EXPECT_FALSE(IsMonitoring());
|
| +
|
| + constexpr gfx::Size kSizeTooSmall = gfx::Size(100, 100);
|
| + Initialize(true, true, true, true, kSizeTooSmall);
|
| + wtr_->OnPlaying();
|
| + EXPECT_FALSE(IsMonitoring());
|
| +
|
| + Initialize(true, true, true, true, kSizeJustRight);
|
| + wtr_->OnPlaying();
|
| + EXPECT_TRUE(IsMonitoring());
|
| +
|
| + Initialize(true, true, false, false, kSizeJustRight);
|
| + wtr_->OnPlaying();
|
| + EXPECT_TRUE(IsMonitoring());
|
| +
|
| + Initialize(true, true, true, false, kSizeJustRight);
|
| + wtr_->OnPlaying();
|
| + EXPECT_TRUE(IsMonitoring());
|
| +}
|
| +
|
| +// Tests that basic reporting for the all category works.
|
| +TEST_F(WatchTimeReporterTest, WatchTimeReporterBasic) {
|
| + constexpr base::TimeDelta kWatchTimeEarly = base::TimeDelta::FromSeconds(5);
|
| + constexpr base::TimeDelta kWatchTimeLate = base::TimeDelta::FromSeconds(10);
|
| + EXPECT_CALL(*this, GetCurrentMediaTime())
|
| + .WillOnce(testing::Return(base::TimeDelta()))
|
| + .WillOnce(testing::Return(kWatchTimeEarly))
|
| + .WillRepeatedly(testing::Return(kWatchTimeLate));
|
| + Initialize(true, true, true, true, kSizeJustRight);
|
| + wtr_->OnPlaying();
|
| + EXPECT_TRUE(IsMonitoring());
|
| +
|
| + // No histogram should have been recorded yet since the message loop has not
|
| + // had any chance to pump.
|
| + EXPECT_EQ(kNoTimestamp, GetAllWatchTime());
|
| + CycleReportingTimer();
|
| +
|
| + // No watch time should have been reported since not enough time has elapsed.
|
| + EXPECT_EQ(kNoTimestamp, GetAllWatchTime());
|
| + CycleReportingTimer();
|
| +
|
| + // Watch time should have been reported.
|
| + EXPECT_EQ(kWatchTimeLate, GetAllWatchTime());
|
| +}
|
| +
|
| +// Tests that watch time is finalized upon destruction.
|
| +TEST_F(WatchTimeReporterTest, WatchTimeReporterFinalizeOnDestruction) {
|
| + constexpr base::TimeDelta kWatchTime = base::TimeDelta::FromSeconds(10);
|
| + EXPECT_CALL(*this, GetCurrentMediaTime())
|
| + .WillOnce(testing::Return(base::TimeDelta()))
|
| + .WillOnce(testing::Return(kWatchTime));
|
| + Initialize(true, true, true, true, kSizeJustRight);
|
| + wtr_->OnPlaying();
|
| + EXPECT_TRUE(IsMonitoring());
|
| +
|
| + // No histogram should have been recorded yet since the message loop has not
|
| + // had any chance to pump.
|
| + EXPECT_EQ(kNoTimestamp, GetAllWatchTime());
|
| +
|
| + // Finalize the histogram.
|
| + wtr_.reset();
|
| + EXPECT_EQ(kWatchTime, GetAllWatchTime());
|
| + EXPECT_EQ(kWatchTime, GetMseWatchTime());
|
| + EXPECT_EQ(kWatchTime, GetEmeWatchTime());
|
| + EXPECT_EQ(kWatchTime, GetAcWatchTime());
|
| + EXPECT_EQ(kNoTimestamp, GetBatteryWatchTime());
|
| +}
|
| +
|
| +} // namespace media
|
|
|