| // Copyright 2015 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/browser/media/session/media_session_uma_helper.h" |
| |
| #include "base/metrics/histogram_samples.h" |
| #include "base/test/metrics/histogram_tester.h" |
| #include "base/test/simple_test_tick_clock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace content { |
| |
| namespace { |
| |
| const char kPictureInPictureTotalTimeForSessionHistogram[] = |
| "Media.Session.PictureInPicture.TotalTimeForSession"; |
| |
| class MediaSessionUmaHelperTest : public testing::Test { |
| public: |
| MediaSessionUmaHelperTest() = default; |
| |
| void SetUp() override { |
| clock_.SetNowTicks(base::TimeTicks::Now()); |
| media_session_uma_helper_.SetClockForTest(&clock_); |
| } |
| |
| base::SimpleTestTickClock* clock() { return &clock_; } |
| |
| MediaSessionUmaHelper& media_session_uma_helper() { |
| return media_session_uma_helper_; |
| } |
| |
| std::unique_ptr<base::HistogramSamples> GetHistogramSamplesSinceTestStart( |
| const std::string& name) { |
| return histogram_tester_.GetHistogramSamplesSinceCreation(name); |
| } |
| |
| private: |
| base::SimpleTestTickClock clock_; |
| MediaSessionUmaHelper media_session_uma_helper_; |
| base::HistogramTester histogram_tester_; |
| }; |
| |
| } // anonymous namespace |
| |
| TEST_F(MediaSessionUmaHelperTest, CreateAndKillDoesNothing) { |
| { |
| MediaSessionUmaHelper* uma_helper = new MediaSessionUmaHelper(); |
| delete uma_helper; |
| } |
| |
| { |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime")); |
| EXPECT_EQ(0, samples->TotalCount()); |
| } |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, ActivationNotTerminatedDoesNotCommit) { |
| media_session_uma_helper().OnSessionActive(); |
| clock()->Advance(base::Milliseconds(1000)); |
| |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime")); |
| EXPECT_EQ(0, samples->TotalCount()); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, SuspendActivationNotTerminatedDoesNotCommit) { |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionSuspended(); |
| |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime")); |
| EXPECT_EQ(0, samples->TotalCount()); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, FullActivation) { |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionInactive(); |
| |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime")); |
| EXPECT_EQ(1, samples->TotalCount()); |
| EXPECT_EQ(1, samples->GetCount(1000)); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, ActivationCycleWithSuspend) { |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionSuspended(); |
| |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionInactive(); |
| |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime")); |
| EXPECT_EQ(1, samples->TotalCount()); |
| EXPECT_EQ(1, samples->GetCount(2000)); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, ActivationCycleWithMultipleSuspend) { |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionSuspended(); |
| |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionSuspended(); |
| |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionInactive(); |
| |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime")); |
| EXPECT_EQ(1, samples->TotalCount()); |
| EXPECT_EQ(1, samples->GetCount(3000)); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, MultipleActivations) { |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionSuspended(); |
| |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionInactive(); |
| |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionSuspended(); |
| |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionSuspended(); |
| |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionInactive(); |
| |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime")); |
| EXPECT_EQ(2, samples->TotalCount()); |
| EXPECT_EQ(1, samples->GetCount(2000)); |
| EXPECT_EQ(1, samples->GetCount(3000)); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, MultipleActivationCalls) { |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(500)); |
| media_session_uma_helper().OnSessionInactive(); |
| |
| // Calling OnSessionActive() multiple times reset the start time of the |
| // session. |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime")); |
| EXPECT_EQ(1, samples->TotalCount()); |
| EXPECT_EQ(1, samples->GetCount(500)); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, MultipleSuspendCalls_WhileSuspended) { |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionSuspended(); |
| |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnSessionSuspended(); |
| |
| clock()->Advance(base::Milliseconds(500)); |
| media_session_uma_helper().OnSessionSuspended(); |
| |
| media_session_uma_helper().OnSessionInactive(); |
| |
| // If the session is already suspended, OnSessionSuspended() calls are |
| // ignored. |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime")); |
| EXPECT_EQ(1, samples->TotalCount()); |
| EXPECT_EQ(1, samples->GetCount(1000)); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, MultipleSuspendCalls_WhileInactive) { |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnSessionInactive(); |
| |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnSessionSuspended(); |
| |
| clock()->Advance(base::Milliseconds(500)); |
| media_session_uma_helper().OnSessionSuspended(); |
| |
| media_session_uma_helper().OnSessionInactive(); |
| |
| // If the session is already inactive, OnSessionSuspended() calls are |
| // ignored. |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime")); |
| EXPECT_EQ(1, samples->TotalCount()); |
| EXPECT_EQ(1, samples->GetCount(1000)); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, MultipleInactiveCalls) { |
| media_session_uma_helper().OnSessionActive(); |
| |
| clock()->Advance(base::Milliseconds(3000)); |
| media_session_uma_helper().OnSessionInactive(); |
| |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnSessionInactive(); |
| |
| clock()->Advance(base::Milliseconds(500)); |
| media_session_uma_helper().OnSessionInactive(); |
| |
| // If the session is already inactive, OnSessionInactive() calls are ignored. |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime")); |
| EXPECT_EQ(1, samples->TotalCount()); |
| EXPECT_EQ(1, samples->GetCount(3000)); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, |
| OnServiceDestroyedWithoutTotalTimeDoesNotCommit) { |
| media_session_uma_helper().OnServiceDestroyed(); |
| clock()->Advance(base::Milliseconds(1000)); |
| |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart( |
| kPictureInPictureTotalTimeForSessionHistogram)); |
| EXPECT_EQ(0, samples->TotalCount()); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, |
| EnterAndClosePipMultipleTimes_DoesCommitTotalPipTime) { |
| media_session_uma_helper().OnMediaPictureInPictureChanged(true); |
| |
| clock()->Advance(base::Milliseconds(4000)); |
| media_session_uma_helper().OnMediaPictureInPictureChanged(false); |
| |
| media_session_uma_helper().OnMediaPictureInPictureChanged(true); |
| clock()->Advance(base::Milliseconds(3000)); |
| media_session_uma_helper().OnMediaPictureInPictureChanged(false); |
| |
| media_session_uma_helper().OnMediaPictureInPictureChanged(true); |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnMediaPictureInPictureChanged(false); |
| media_session_uma_helper().OnServiceDestroyed(); |
| |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart( |
| kPictureInPictureTotalTimeForSessionHistogram)); |
| EXPECT_EQ(1, samples->TotalCount()); |
| EXPECT_EQ(1, samples->GetCount(9000)); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, EnterAndClosePip_DoesCommitTotalPipTime) { |
| media_session_uma_helper().OnMediaPictureInPictureChanged(true); |
| |
| clock()->Advance(base::Milliseconds(3000)); |
| media_session_uma_helper().OnMediaPictureInPictureChanged(false); |
| media_session_uma_helper().OnServiceDestroyed(); |
| |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart( |
| kPictureInPictureTotalTimeForSessionHistogram)); |
| EXPECT_EQ(1, samples->TotalCount()); |
| EXPECT_EQ(1, samples->GetCount(3000)); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, |
| EnterAndRepeatedlyClosePip_DoesCommitTotalPipTime) { |
| media_session_uma_helper().OnMediaPictureInPictureChanged(true); |
| |
| clock()->Advance(base::Milliseconds(3000)); |
| media_session_uma_helper().OnMediaPictureInPictureChanged(false); |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnMediaPictureInPictureChanged(false); |
| media_session_uma_helper().OnServiceDestroyed(); |
| |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart( |
| kPictureInPictureTotalTimeForSessionHistogram)); |
| EXPECT_EQ(1, samples->TotalCount()); |
| EXPECT_EQ(1, samples->GetCount(3000)); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, |
| CloseAndRepeatedlyEnterPip_DoesNotCommitTotalPipTime) { |
| media_session_uma_helper().OnMediaPictureInPictureChanged(false); |
| |
| clock()->Advance(base::Milliseconds(3000)); |
| media_session_uma_helper().OnMediaPictureInPictureChanged(true); |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnMediaPictureInPictureChanged(true); |
| media_session_uma_helper().OnServiceDestroyed(); |
| |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart( |
| kPictureInPictureTotalTimeForSessionHistogram)); |
| EXPECT_EQ(0, samples->TotalCount()); |
| } |
| |
| TEST_F(MediaSessionUmaHelperTest, |
| CloseRepeatedlyEnterThenClosePip_DoesCommitTotalPipTime) { |
| media_session_uma_helper().OnMediaPictureInPictureChanged(false); |
| |
| clock()->Advance(base::Milliseconds(3000)); |
| media_session_uma_helper().OnMediaPictureInPictureChanged(true); |
| clock()->Advance(base::Milliseconds(2000)); |
| media_session_uma_helper().OnMediaPictureInPictureChanged(true); |
| clock()->Advance(base::Milliseconds(1000)); |
| media_session_uma_helper().OnMediaPictureInPictureChanged(false); |
| media_session_uma_helper().OnServiceDestroyed(); |
| |
| std::unique_ptr<base::HistogramSamples> samples( |
| GetHistogramSamplesSinceTestStart( |
| kPictureInPictureTotalTimeForSessionHistogram)); |
| EXPECT_EQ(1, samples->TotalCount()); |
| EXPECT_EQ(1, samples->GetCount(1000)); |
| } |
| |
| } // namespace content |