summaryrefslogtreecommitdiff
path: root/chromium/content/browser/media/session/media_session_browsertest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/media/session/media_session_browsertest.cc')
-rw-r--r--chromium/content/browser/media/session/media_session_browsertest.cc1203
1 files changed, 1203 insertions, 0 deletions
diff --git a/chromium/content/browser/media/session/media_session_browsertest.cc b/chromium/content/browser/media/session/media_session_browsertest.cc
new file mode 100644
index 00000000000..db7a67ee5b6
--- /dev/null
+++ b/chromium/content/browser/media/session/media_session_browsertest.cc
@@ -0,0 +1,1203 @@
+// Copyright 2015 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 "content/browser/media/session/media_session.h"
+
+#include <stddef.h>
+
+#include <list>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/metrics/histogram_samples.h"
+#include "base/test/histogram_tester.h"
+#include "base/test/simple_test_clock.h"
+#include "content/browser/media/session/media_session_delegate.h"
+#include "content/browser/media/session/mock_media_session_observer.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "content/public/test/content_browser_test.h"
+#include "content/shell/browser/shell.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+using content::WebContents;
+using content::WebContentsObserver;
+using content::MediaSession;
+using content::MediaSessionDelegate;
+using content::MediaSessionObserver;
+using content::MediaSessionUmaHelper;
+using content::MockMediaSessionObserver;
+
+using ::testing::Expectation;
+
+namespace {
+
+class MockMediaSessionDelegate : public MediaSessionDelegate {
+ public:
+ bool RequestAudioFocus(MediaSession::Type) override {
+ return true;
+ }
+
+ void AbandonAudioFocus() override {
+ }
+};
+
+class MockWebContentsObserver : public WebContentsObserver {
+ public:
+ MockWebContentsObserver(WebContents* web_contents)
+ : WebContentsObserver(web_contents) {}
+
+ MOCK_METHOD3(MediaSessionStateChanged,
+ void(bool is_controllable, bool is_suspended,
+ const content::MediaMetadata& metadata));
+};
+
+} // namespace
+
+class MediaSessionBrowserTest : public content::ContentBrowserTest {
+ protected:
+ MediaSessionBrowserTest() = default;
+
+ void SetUpOnMainThread() override {
+ ContentBrowserTest::SetUpOnMainThread();
+
+ mock_web_contents_observer_.reset(
+ new MockWebContentsObserver(shell()->web_contents()));
+ media_session_ = MediaSession::Get(shell()->web_contents());
+ media_session_->SetDelegateForTests(
+ std::unique_ptr<MediaSessionDelegate>(new MockMediaSessionDelegate()));
+ ASSERT_TRUE(media_session_);
+ }
+
+ void TearDownOnMainThread() override {
+ mock_web_contents_observer_.reset();
+
+ media_session_->RemoveAllPlayersForTest();
+ media_session_ = nullptr;
+
+ ContentBrowserTest::TearDownOnMainThread();
+ }
+
+ void StartNewPlayer(MockMediaSessionObserver* media_session_observer,
+ MediaSession::Type type) {
+ bool result = AddPlayer(
+ media_session_observer,
+ media_session_observer->StartNewPlayer(),
+ type);
+ EXPECT_TRUE(result);
+ }
+
+ bool AddPlayer(MockMediaSessionObserver* media_session_observer,
+ int player_id,
+ MediaSession::Type type) {
+ return media_session_->AddPlayer(media_session_observer, player_id, type);
+ }
+
+ void RemovePlayer(MockMediaSessionObserver* media_session_observer,
+ int player_id) {
+ media_session_->RemovePlayer(media_session_observer, player_id);
+ }
+
+ void RemovePlayers(MockMediaSessionObserver* media_session_observer) {
+ media_session_->RemovePlayers(media_session_observer);
+ }
+
+ void OnPlayerPaused(MockMediaSessionObserver* media_session_observer,
+ int player_id) {
+ media_session_->OnPlayerPaused(media_session_observer, player_id);
+ }
+
+ bool HasAudioFocus() { return media_session_->IsActiveForTest(); }
+
+ MediaSession::Type GetSessionType() {
+ return media_session_->audio_focus_type_for_test();
+ }
+
+ bool IsControllable() { return media_session_->IsControllable(); }
+
+ bool IsSuspended() { return media_session_->IsSuspended(); }
+
+ void UIResume() {
+ media_session_->Resume(MediaSession::SuspendType::UI);
+ }
+
+ void SystemResume() {
+ media_session_->OnResumeInternal(MediaSession::SuspendType::SYSTEM);
+ }
+
+ void UISuspend() {
+ media_session_->Suspend(MediaSession::SuspendType::UI);
+ }
+
+ void SystemSuspend(bool temporary) {
+ media_session_->OnSuspendInternal(
+ MediaSession::SuspendType::SYSTEM,
+ temporary ? MediaSession::State::SUSPENDED
+ : MediaSession::State::INACTIVE);
+ }
+
+ void SystemSetVolumeMultiplier(double volume_multiplier) {
+ media_session_->SetVolumeMultiplier(volume_multiplier);
+ }
+
+ MockWebContentsObserver* mock_web_contents_observer() {
+ return mock_web_contents_observer_.get();
+ }
+
+ std::unique_ptr<MediaSession> CreateDummyMediaSession() {
+ return std::unique_ptr<MediaSession>(new MediaSession(nullptr));
+ }
+
+ MediaSessionUmaHelper* GetMediaSessionUMAHelper() {
+ return media_session_->uma_helper_for_test();
+ }
+
+ protected:
+ MediaSession* media_session_;
+ std::unique_ptr<MockWebContentsObserver> mock_web_contents_observer_;
+
+ DISALLOW_COPY_AND_ASSIGN(MediaSessionBrowserTest);
+};
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ PlayersFromSameObserverDoNotStopEachOtherInSameSession) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ EXPECT_TRUE(media_session_observer->IsPlaying(0));
+ EXPECT_TRUE(media_session_observer->IsPlaying(1));
+ EXPECT_TRUE(media_session_observer->IsPlaying(2));
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ PlayersFromManyObserverDoNotStopEachOtherInSameSession) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer_1(
+ new MockMediaSessionObserver);
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer_2(
+ new MockMediaSessionObserver);
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer_3(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer_1.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer_2.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer_3.get(), MediaSession::Type::Content);
+
+ EXPECT_TRUE(media_session_observer_1->IsPlaying(0));
+ EXPECT_TRUE(media_session_observer_2->IsPlaying(0));
+ EXPECT_TRUE(media_session_observer_3->IsPlaying(0));
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ SuspendedMediaSessionStopsPlayers) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ SystemSuspend(true);
+
+ EXPECT_FALSE(media_session_observer->IsPlaying(0));
+ EXPECT_FALSE(media_session_observer->IsPlaying(1));
+ EXPECT_FALSE(media_session_observer->IsPlaying(2));
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ResumedMediaSessionRestartsPlayers) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ SystemSuspend(true);
+ SystemResume();
+
+ EXPECT_TRUE(media_session_observer->IsPlaying(0));
+ EXPECT_TRUE(media_session_observer->IsPlaying(1));
+ EXPECT_TRUE(media_session_observer->IsPlaying(2));
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ StartedPlayerOnSuspendedSessionPlaysAlone) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ EXPECT_TRUE(media_session_observer->IsPlaying(0));
+
+ SystemSuspend(true);
+
+ EXPECT_FALSE(media_session_observer->IsPlaying(0));
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ EXPECT_FALSE(media_session_observer->IsPlaying(0));
+ EXPECT_TRUE(media_session_observer->IsPlaying(1));
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ EXPECT_FALSE(media_session_observer->IsPlaying(0));
+ EXPECT_TRUE(media_session_observer->IsPlaying(1));
+ EXPECT_TRUE(media_session_observer->IsPlaying(2));
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ MediaSessionSetVolumeMultiplier) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ double volume_multiplier = 0.2f;
+ SystemSetVolumeMultiplier(volume_multiplier);
+
+ EXPECT_EQ(volume_multiplier, media_session_observer->GetVolumeMultiplier(0));
+ EXPECT_EQ(volume_multiplier, media_session_observer->GetVolumeMultiplier(1));
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ EXPECT_EQ(volume_multiplier, media_session_observer->GetVolumeMultiplier(2));
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, AudioFocusInitialState) {
+ EXPECT_FALSE(HasAudioFocus());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, StartPlayerGivesFocus) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ EXPECT_TRUE(HasAudioFocus());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, SuspendGivesAwayAudioFocus) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ SystemSuspend(true);
+
+ EXPECT_FALSE(HasAudioFocus());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, StopGivesAwayAudioFocus) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ media_session_->Stop(MediaSession::SuspendType::UI);
+
+ EXPECT_FALSE(HasAudioFocus());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, ResumeGivesBackAudioFocus) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ SystemSuspend(true);
+ SystemResume();
+
+ EXPECT_TRUE(HasAudioFocus());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ RemovingLastPlayerDropsAudioFocus) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ RemovePlayer(media_session_observer.get(), 0);
+ EXPECT_TRUE(HasAudioFocus());
+ RemovePlayer(media_session_observer.get(), 1);
+ EXPECT_TRUE(HasAudioFocus());
+ RemovePlayer(media_session_observer.get(), 2);
+ EXPECT_FALSE(HasAudioFocus());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ RemovingLastPlayerFromManyObserversDropsAudioFocus) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer_1(
+ new MockMediaSessionObserver);
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer_2(
+ new MockMediaSessionObserver);
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer_3(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer_1.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer_2.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer_3.get(), MediaSession::Type::Content);
+
+ RemovePlayer(media_session_observer_1.get(), 0);
+ EXPECT_TRUE(HasAudioFocus());
+ RemovePlayer(media_session_observer_2.get(), 0);
+ EXPECT_TRUE(HasAudioFocus());
+ RemovePlayer(media_session_observer_3.get(), 0);
+ EXPECT_FALSE(HasAudioFocus());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ RemovingAllPlayersFromObserversDropsAudioFocus) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer_1(
+ new MockMediaSessionObserver);
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer_2(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer_1.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer_1.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer_2.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer_2.get(), MediaSession::Type::Content);
+
+ RemovePlayers(media_session_observer_1.get());
+ EXPECT_TRUE(HasAudioFocus());
+ RemovePlayers(media_session_observer_2.get());
+ EXPECT_FALSE(HasAudioFocus());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, ResumePlayGivesAudioFocus) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ RemovePlayer(media_session_observer.get(), 0);
+ EXPECT_FALSE(HasAudioFocus());
+
+ EXPECT_TRUE(
+ AddPlayer(media_session_observer.get(), 0, MediaSession::Type::Content));
+ EXPECT_TRUE(HasAudioFocus());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ResumeSuspendAreSentOnlyOncePerPlayers) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ EXPECT_EQ(0, media_session_observer->received_suspend_calls());
+ EXPECT_EQ(0, media_session_observer->received_resume_calls());
+
+ SystemSuspend(true);
+ EXPECT_EQ(3, media_session_observer->received_suspend_calls());
+
+ SystemResume();
+ EXPECT_EQ(3, media_session_observer->received_resume_calls());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ResumeSuspendAreSentOnlyOncePerPlayersAddedTwice) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ // Adding the three players above again.
+ EXPECT_TRUE(
+ AddPlayer(media_session_observer.get(), 0, MediaSession::Type::Content));
+ EXPECT_TRUE(
+ AddPlayer(media_session_observer.get(), 1, MediaSession::Type::Content));
+ EXPECT_TRUE(
+ AddPlayer(media_session_observer.get(), 2, MediaSession::Type::Content));
+
+ EXPECT_EQ(0, media_session_observer->received_suspend_calls());
+ EXPECT_EQ(0, media_session_observer->received_resume_calls());
+
+ SystemSuspend(true);
+ EXPECT_EQ(3, media_session_observer->received_suspend_calls());
+
+ SystemResume();
+ EXPECT_EQ(3, media_session_observer->received_resume_calls());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ RemovingTheSamePlayerTwiceIsANoop) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ RemovePlayer(media_session_observer.get(), 0);
+ RemovePlayer(media_session_observer.get(), 0);
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, MediaSessionType) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ // Starting a player with a given type should set the session to that type.
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Transient);
+ EXPECT_EQ(MediaSession::Type::Transient, GetSessionType());
+
+ // Adding a player of the same type should have no effect on the type.
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Transient);
+ EXPECT_EQ(MediaSession::Type::Transient, GetSessionType());
+
+ // Adding a player of Content type should override the current type.
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ EXPECT_EQ(MediaSession::Type::Content, GetSessionType());
+
+ // Adding a player of the Transient type should have no effect on the type.
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Transient);
+ EXPECT_EQ(MediaSession::Type::Content, GetSessionType());
+
+ EXPECT_TRUE(media_session_observer->IsPlaying(0));
+ EXPECT_TRUE(media_session_observer->IsPlaying(1));
+ EXPECT_TRUE(media_session_observer->IsPlaying(2));
+ EXPECT_TRUE(media_session_observer->IsPlaying(3));
+
+ SystemSuspend(true);
+
+ EXPECT_FALSE(media_session_observer->IsPlaying(0));
+ EXPECT_FALSE(media_session_observer->IsPlaying(1));
+ EXPECT_FALSE(media_session_observer->IsPlaying(2));
+ EXPECT_FALSE(media_session_observer->IsPlaying(3));
+
+ EXPECT_EQ(MediaSession::Type::Content, GetSessionType());
+
+ SystemResume();
+
+ EXPECT_TRUE(media_session_observer->IsPlaying(0));
+ EXPECT_TRUE(media_session_observer->IsPlaying(1));
+ EXPECT_TRUE(media_session_observer->IsPlaying(2));
+ EXPECT_TRUE(media_session_observer->IsPlaying(3));
+
+ EXPECT_EQ(MediaSession::Type::Content, GetSessionType());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, ControlsShowForContent) {
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ // Starting a player with a content type should show the media controls.
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, ControlsNoShowForTransient) {
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(false, false, testing::_));
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ // Starting a player with a transient type should not show the media controls.
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Transient);
+
+ EXPECT_FALSE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, ControlsHideWhenStopped) {
+ Expectation showControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(false, true, testing::_))
+ .After(showControls);
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ RemovePlayers(media_session_observer.get());
+
+ EXPECT_FALSE(IsControllable());
+ EXPECT_TRUE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, ControlsShownAcceptTransient) {
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ // Transient player join the session without affecting the controls.
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Transient);
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ControlsShownAfterContentAdded) {
+ Expectation dontShowControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(false, false, testing::_));
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_))
+ .After(dontShowControls);
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Transient);
+
+ // The controls are shown when the content player is added.
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ControlsStayIfOnlyOnePlayerHasBeenPaused) {
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Transient);
+
+ // Removing only content player doesn't hide the controls since the session
+ // is still active.
+ RemovePlayer(media_session_observer.get(), 0);
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ControlsHideWhenTheLastPlayerIsRemoved) {
+ Expectation showControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(false, true, testing::_))
+ .After(showControls);
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ RemovePlayer(media_session_observer.get(), 0);
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+
+ RemovePlayer(media_session_observer.get(), 1);
+
+ EXPECT_FALSE(IsControllable());
+ EXPECT_TRUE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ControlsHideWhenAllThePlayersAreRemoved) {
+ Expectation showControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(false, true, testing::_))
+ .After(showControls);
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ RemovePlayers(media_session_observer.get());
+
+ EXPECT_FALSE(IsControllable());
+ EXPECT_TRUE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ControlsNotHideWhenTheLastPlayerIsPaused) {
+ Expectation showControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, true, testing::_))
+ .After(showControls);
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ OnPlayerPaused(media_session_observer.get(), 0);
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+
+ OnPlayerPaused(media_session_observer.get(), 1);
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_TRUE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ SuspendTemporaryUpdatesControls) {
+ Expectation showControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, true, testing::_))
+ .After(showControls);
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ SystemSuspend(true);
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_TRUE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, ControlsUpdatedWhenResumed) {
+ Expectation showControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+ Expectation pauseControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, true, testing::_)).After(showControls);
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_))
+ .After(pauseControls);
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ SystemSuspend(true);
+ SystemResume();
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ControlsHideWhenSessionSuspendedPermanently) {
+ Expectation showControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(false, true, testing::_))
+ .After(showControls);
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ SystemSuspend(false);
+
+ EXPECT_FALSE(IsControllable());
+ EXPECT_TRUE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ConstrolsHideWhenSessionStops) {
+ Expectation showControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+ Expectation pauseControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, true, testing::_)).After(showControls);
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(false, true, testing::_))
+ .After(pauseControls);
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ media_session_->Stop(MediaSession::SuspendType::UI);
+
+ EXPECT_FALSE(IsControllable());
+ EXPECT_TRUE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ControlsHideWhenSessionChangesFromContentToTransient) {
+ Expectation showControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+ Expectation pauseControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, true, testing::_)).After(showControls);
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(false, false, testing::_))
+ .After(pauseControls);
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ SystemSuspend(true);
+
+ // This should reset the session and change it to a transient, so
+ // hide the controls.
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Transient);
+
+ EXPECT_FALSE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ControlsUpdatedWhenNewPlayerResetsSession) {
+ Expectation showControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+ Expectation pauseControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, true, testing::_)).After(showControls);
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_))
+ .After(pauseControls);
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ SystemSuspend(true);
+
+ // This should reset the session and update the controls.
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ControlsResumedWhenPlayerIsResumed) {
+ Expectation showControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+ Expectation pauseControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, true, testing::_)).After(showControls);
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_))
+ .After(pauseControls);
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ SystemSuspend(true);
+
+ // This should resume the session and update the controls.
+ AddPlayer(media_session_observer.get(), 0, MediaSession::Type::Content);
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ControlsUpdatedDueToResumeSessionAction) {
+ Expectation showControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, true, testing::_))
+ .After(showControls);
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ UISuspend();
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_TRUE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ ControlsUpdatedDueToSuspendSessionAction) {
+ Expectation showControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_));
+ Expectation pauseControls = EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, true, testing::_)).After(showControls);
+ EXPECT_CALL(*mock_web_contents_observer(),
+ MediaSessionStateChanged(true, false, testing::_))
+ .After(pauseControls);
+
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ UISuspend();
+ UIResume();
+
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ DontResumeBySystemUISuspendedSessions) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ UISuspend();
+ EXPECT_TRUE(IsControllable());
+ EXPECT_TRUE(IsSuspended());
+
+ SystemResume();
+ EXPECT_TRUE(IsControllable());
+ EXPECT_TRUE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ AllowUIResumeForSystemSuspend) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ SystemSuspend(true);
+ EXPECT_TRUE(IsControllable());
+ EXPECT_TRUE(IsSuspended());
+
+ UIResume();
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, ResumeSuspendFromUI) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ UISuspend();
+ EXPECT_TRUE(IsControllable());
+ EXPECT_TRUE(IsSuspended());
+
+ UIResume();
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, ResumeSuspendFromSystem) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ SystemSuspend(true);
+ EXPECT_TRUE(IsControllable());
+ EXPECT_TRUE(IsSuspended());
+
+ SystemResume();
+ EXPECT_TRUE(IsControllable());
+ EXPECT_FALSE(IsSuspended());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, UMA_Suspended_SystemTransient) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ base::HistogramTester tester;
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ SystemSuspend(true);
+
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(0)); // System Transient
+ EXPECT_EQ(0, samples->GetCount(1)); // System Permanent
+ EXPECT_EQ(0, samples->GetCount(2)); // UI
+}
+
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ UMA_Suspended_SystemPermantent) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ base::HistogramTester tester;
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ SystemSuspend(false);
+
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(0, samples->GetCount(0)); // System Transient
+ EXPECT_EQ(1, samples->GetCount(1)); // System Permanent
+ EXPECT_EQ(0, samples->GetCount(2)); // UI
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, UMA_Suspended_UI) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ base::HistogramTester tester;
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ UISuspend();
+
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(0, samples->GetCount(0)); // System Transient
+ EXPECT_EQ(0, samples->GetCount(1)); // System Permanent
+ EXPECT_EQ(1, samples->GetCount(2)); // UI
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, UMA_Suspended_Multiple) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ base::HistogramTester tester;
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ UISuspend();
+ UIResume();
+
+ SystemSuspend(true);
+ SystemResume();
+
+ UISuspend();
+ UIResume();
+
+ SystemSuspend(false);
+
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
+ EXPECT_EQ(4, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(0)); // System Transient
+ EXPECT_EQ(1, samples->GetCount(1)); // System Permanent
+ EXPECT_EQ(2, samples->GetCount(2)); // UI
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, UMA_Suspended_Crossing) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ base::HistogramTester tester;
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ UISuspend();
+ SystemSuspend(true);
+ SystemSuspend(false);
+ UIResume();
+
+ SystemSuspend(true);
+ SystemSuspend(true);
+ SystemSuspend(false);
+ SystemResume();
+
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
+ EXPECT_EQ(2, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(0)); // System Transient
+ EXPECT_EQ(0, samples->GetCount(1)); // System Permanent
+ EXPECT_EQ(1, samples->GetCount(2)); // UI
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, UMA_Suspended_Stop) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ base::HistogramTester tester;
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ media_session_->Stop(MediaSession::SuspendType::UI);
+
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.Suspended"));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(0, samples->GetCount(0)); // System Transient
+ EXPECT_EQ(0, samples->GetCount(1)); // System Permanent
+ EXPECT_EQ(1, samples->GetCount(2)); // UI
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest, UMA_ActiveTime_NoActivation) {
+ base::HistogramTester tester;
+
+ std::unique_ptr<MediaSession> media_session = CreateDummyMediaSession();
+ media_session.reset();
+
+ // A MediaSession that wasn't active doesn't register an active time.
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
+ EXPECT_EQ(0, samples->TotalCount());
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ UMA_ActiveTime_SimpleActivation) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ base::HistogramTester tester;
+
+ MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
+ base::SimpleTestClock* clock = new base::SimpleTestClock();
+ clock->SetNow(base::Time::Now());
+ media_session_uma_helper->SetClockForTest(
+ std::unique_ptr<base::SimpleTestClock>(clock));
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ clock->Advance(base::TimeDelta::FromMilliseconds(1000));
+ media_session_->Stop(MediaSession::SuspendType::UI);
+
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(1000));
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ UMA_ActiveTime_ActivationWithUISuspension) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ base::HistogramTester tester;
+
+ MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
+ base::SimpleTestClock* clock = new base::SimpleTestClock();
+ clock->SetNow(base::Time::Now());
+ media_session_uma_helper->SetClockForTest(
+ std::unique_ptr<base::SimpleTestClock>(clock));
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ clock->Advance(base::TimeDelta::FromMilliseconds(1000));
+ UISuspend();
+
+ clock->Advance(base::TimeDelta::FromMilliseconds(2000));
+ UIResume();
+
+ clock->Advance(base::TimeDelta::FromMilliseconds(1000));
+ media_session_->Stop(MediaSession::SuspendType::UI);
+
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(2000));
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ UMA_ActiveTime_ActivationWithSystemSuspension) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ base::HistogramTester tester;
+
+ MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
+ base::SimpleTestClock* clock = new base::SimpleTestClock();
+ clock->SetNow(base::Time::Now());
+ media_session_uma_helper->SetClockForTest(
+ std::unique_ptr<base::SimpleTestClock>(clock));
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+
+ clock->Advance(base::TimeDelta::FromMilliseconds(1000));
+ SystemSuspend(true);
+
+ clock->Advance(base::TimeDelta::FromMilliseconds(2000));
+ SystemResume();
+
+ clock->Advance(base::TimeDelta::FromMilliseconds(1000));
+ media_session_->Stop(MediaSession::SuspendType::UI);
+
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(2000));
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ UMA_ActiveTime_ActivateSuspendedButNotStopped) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ base::HistogramTester tester;
+
+ MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
+ base::SimpleTestClock* clock = new base::SimpleTestClock();
+ clock->SetNow(base::Time::Now());
+ media_session_uma_helper->SetClockForTest(
+ std::unique_ptr<base::SimpleTestClock>(clock));
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ clock->Advance(base::TimeDelta::FromMilliseconds(500));
+ SystemSuspend(true);
+
+ {
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
+ EXPECT_EQ(0, samples->TotalCount());
+ }
+
+ SystemResume();
+ clock->Advance(base::TimeDelta::FromMilliseconds(5000));
+ UISuspend();
+
+ {
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
+ EXPECT_EQ(0, samples->TotalCount());
+ }
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ UMA_ActiveTime_ActivateSuspendStopTwice) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ base::HistogramTester tester;
+
+ MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
+ base::SimpleTestClock* clock = new base::SimpleTestClock();
+ clock->SetNow(base::Time::Now());
+ media_session_uma_helper->SetClockForTest(
+ std::unique_ptr<base::SimpleTestClock>(clock));
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ clock->Advance(base::TimeDelta::FromMilliseconds(500));
+ SystemSuspend(true);
+ media_session_->Stop(MediaSession::SuspendType::UI);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ clock->Advance(base::TimeDelta::FromMilliseconds(5000));
+ SystemResume();
+ media_session_->Stop(MediaSession::SuspendType::UI);
+
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
+ EXPECT_EQ(2, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(500));
+ EXPECT_EQ(1, samples->GetCount(5000));
+}
+
+IN_PROC_BROWSER_TEST_F(MediaSessionBrowserTest,
+ UMA_ActiveTime_MultipleActivations) {
+ std::unique_ptr<MockMediaSessionObserver> media_session_observer(
+ new MockMediaSessionObserver);
+ base::HistogramTester tester;
+
+ MediaSessionUmaHelper* media_session_uma_helper = GetMediaSessionUMAHelper();
+ base::SimpleTestClock* clock = new base::SimpleTestClock();
+ clock->SetNow(base::Time::Now());
+ media_session_uma_helper->SetClockForTest(
+ std::unique_ptr<base::SimpleTestClock>(clock));
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ clock->Advance(base::TimeDelta::FromMilliseconds(10000));
+ RemovePlayer(media_session_observer.get(), 0);
+
+ StartNewPlayer(media_session_observer.get(), MediaSession::Type::Content);
+ clock->Advance(base::TimeDelta::FromMilliseconds(1000));
+ media_session_->Stop(MediaSession::SuspendType::UI);
+
+ std::unique_ptr<base::HistogramSamples> samples(
+ tester.GetHistogramSamplesSinceCreation("Media.Session.ActiveTime"));
+ EXPECT_EQ(2, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(1000));
+ EXPECT_EQ(1, samples->GetCount(10000));
+}