| 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..4dfac9a4a3fbe6c5f355094339f84a87f3c7e67b
|
| --- /dev/null
|
| +++ b/media/blink/watch_time_reporter_unittest.cc
|
| @@ -0,0 +1,167 @@
|
| +// 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/run_loop.h"
|
| +#include "base/test/power_monitor_test_base.h"
|
| +#include "base/test/test_message_loop.h"
|
| +#include "media/base/mock_media_log.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);
|
| +
|
| +#define EXPECT_WATCH_TIME(key, value) \
|
| + EXPECT_CALL(*media_log_, OnWatchTimeUpdate(key, value));
|
| +
|
| +class WatchTimeReporterTest : public testing::Test {
|
| + public:
|
| + WatchTimeReporterTest()
|
| + : media_log_(new testing::StrictMock<WatchTimeLogMonitor>()),
|
| + test_power_source_(new base::PowerMonitorTestSource()),
|
| + test_power_monitor_(new base::PowerMonitor(
|
| + std::unique_ptr<base::PowerMonitorSource>(test_power_source_))) {}
|
| + ~WatchTimeReporterTest() override {}
|
| +
|
| + protected:
|
| + class WatchTimeLogMonitor : public MediaLog {
|
| + public:
|
| + WatchTimeLogMonitor() {}
|
| +
|
| + void AddEvent(std::unique_ptr<MediaLogEvent> event) override {
|
| + ASSERT_EQ(event->type, MediaLogEvent::Type::WATCH_TIME_UPDATE);
|
| +
|
| + for (base::DictionaryValue::Iterator it(event->params); !it.IsAtEnd();
|
| + it.Advance()) {
|
| + double in_seconds;
|
| + ASSERT_TRUE(it.value().GetAsDouble(&in_seconds));
|
| + OnWatchTimeUpdate(it.key(), base::TimeDelta::FromSecondsD(in_seconds));
|
| + }
|
| + }
|
| +
|
| + MOCK_METHOD2(OnWatchTimeUpdate, void(const std::string&, base::TimeDelta));
|
| +
|
| + protected:
|
| + ~WatchTimeLogMonitor() override {}
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(WatchTimeLogMonitor);
|
| + };
|
| +
|
| + 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, media_log_,
|
| + 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();
|
| + }
|
| +
|
| + bool IsMonitoring() { return wtr_->reporting_timer_.IsRunning(); }
|
| +
|
| + MOCK_METHOD0(GetCurrentMediaTime, base::TimeDelta());
|
| +
|
| + base::TestMessageLoop message_loop_;
|
| + scoped_refptr<testing::StrictMock<WatchTimeLogMonitor>> media_log_;
|
| +
|
| + base::PowerMonitorTestSource* test_power_source_;
|
| + 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 log should have been generated yet since the message loop has not had
|
| + // any chance to pump.
|
| + CycleReportingTimer();
|
| +
|
| + EXPECT_WATCH_TIME(WatchTimeReporter::kHistogramAudioVideoAc, kWatchTimeLate);
|
| + EXPECT_WATCH_TIME(WatchTimeReporter::kHistogramAudioVideoAll, kWatchTimeLate);
|
| + EXPECT_WATCH_TIME(WatchTimeReporter::kHistogramAudioVideoEme, kWatchTimeLate);
|
| + EXPECT_WATCH_TIME(WatchTimeReporter::kHistogramAudioVideoMse, kWatchTimeLate);
|
| + CycleReportingTimer();
|
| +}
|
| +
|
| +// 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());
|
| +
|
| + // Finalize the histogram before any cycles of the timer have run.
|
| + EXPECT_WATCH_TIME(WatchTimeReporter::kHistogramAudioVideoAc, kWatchTime);
|
| + EXPECT_WATCH_TIME(WatchTimeReporter::kHistogramAudioVideoAll, kWatchTime);
|
| + EXPECT_WATCH_TIME(WatchTimeReporter::kHistogramAudioVideoEme, kWatchTime);
|
| + EXPECT_WATCH_TIME(WatchTimeReporter::kHistogramAudioVideoMse, kWatchTime);
|
| + wtr_.reset();
|
| +}
|
| +
|
| +} // namespace media
|
|
|