123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371 |
- // Copyright 2018 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 "services/media_session/media_controller.h"
- #include <memory>
- #include <utility>
- #include <vector>
- #include "base/run_loop.h"
- #include "base/strings/utf_string_conversions.h"
- #include "base/test/task_environment.h"
- #include "base/time/time.h"
- #include "base/unguessable_token.h"
- #include "mojo/public/cpp/bindings/remote.h"
- #include "services/media_session/media_session_service_impl.h"
- #include "services/media_session/public/cpp/media_metadata.h"
- #include "services/media_session/public/cpp/test/mock_media_session.h"
- #include "services/media_session/public/cpp/test/test_media_controller.h"
- #include "services/media_session/public/mojom/constants.mojom.h"
- #include "services/media_session/public/mojom/media_session.mojom.h"
- #include "testing/gtest/include/gtest/gtest.h"
- namespace media_session {
- class MediaControllerTest : public testing::Test {
- public:
- MediaControllerTest() = default;
- MediaControllerTest(const MediaControllerTest&) = delete;
- MediaControllerTest& operator=(const MediaControllerTest&) = delete;
- void SetUp() override {
- // Create an instance of the MediaSessionService and bind some interfaces.
- service_ = std::make_unique<MediaSessionServiceImpl>();
- service_->BindAudioFocusManager(
- audio_focus_remote_.BindNewPipeAndPassReceiver());
- service_->BindMediaControllerManager(
- controller_manager_remote_.BindNewPipeAndPassReceiver());
- controller_manager_remote_->CreateActiveMediaController(
- media_controller_remote_.BindNewPipeAndPassReceiver());
- controller_manager_remote_.FlushForTesting();
- audio_focus_remote_->SetEnforcementMode(
- mojom::EnforcementMode::kSingleSession);
- audio_focus_remote_.FlushForTesting();
- }
- void TearDown() override {
- // Run pending tasks.
- base::RunLoop().RunUntilIdle();
- }
- void RequestAudioFocus(test::MockMediaSession& session,
- mojom::AudioFocusType type) {
- session.RequestAudioFocusFromService(audio_focus_remote_, type);
- }
- mojo::Remote<mojom::MediaController>& controller() {
- return media_controller_remote_;
- }
- mojo::Remote<mojom::MediaControllerManager>& manager() {
- return controller_manager_remote_;
- }
- static size_t GetImageObserverCount(const MediaController& controller) {
- return controller.image_observers_.size();
- }
- private:
- base::test::TaskEnvironment task_environment_;
- std::unique_ptr<MediaSessionService> service_;
- mojo::Remote<mojom::AudioFocusManager> audio_focus_remote_;
- mojo::Remote<mojom::MediaController> media_controller_remote_;
- mojo::Remote<mojom::MediaControllerManager> controller_manager_remote_;
- };
- TEST_F(MediaControllerTest, ActiveController_Suspend) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- controller()->Suspend();
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Multiple_Abandon_Top) {
- test::MockMediaSession media_session_1;
- test::MockMediaSession media_session_2;
- media_session_1.SetIsControllable(true);
- media_session_2.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- RequestAudioFocus(media_session_1, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- {
- test::MockMediaSessionMojoObserver observer_1(media_session_1);
- test::MockMediaSessionMojoObserver observer_2(media_session_2);
- RequestAudioFocus(media_session_2, mojom::AudioFocusType::kGain);
- observer_1.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
- observer_2.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- media_session_2.AbandonAudioFocusFromClient();
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- controller()->Resume();
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- }
- TEST_F(MediaControllerTest,
- ActiveController_Multiple_Abandon_UnderNonControllable) {
- test::MockMediaSession media_session_1;
- test::MockMediaSession media_session_2;
- test::MockMediaSession media_session_3;
- media_session_1.SetIsControllable(true);
- media_session_2.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- RequestAudioFocus(media_session_1, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- {
- test::MockMediaSessionMojoObserver observer_1(media_session_1);
- test::MockMediaSessionMojoObserver observer_2(media_session_2);
- RequestAudioFocus(media_session_2, mojom::AudioFocusType::kGain);
- observer_1.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
- observer_2.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- {
- test::MockMediaSessionMojoObserver observer_2(media_session_2);
- test::MockMediaSessionMojoObserver observer_3(media_session_3);
- RequestAudioFocus(media_session_3, mojom::AudioFocusType::kGain);
- observer_2.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
- observer_3.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- media_session_2.AbandonAudioFocusFromClient();
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- controller()->Resume();
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Multiple_Controllable) {
- test::MockMediaSession media_session_1;
- test::MockMediaSession media_session_2;
- media_session_1.SetIsControllable(true);
- media_session_2.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- RequestAudioFocus(media_session_1, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- {
- test::MockMediaSessionMojoObserver observer_1(media_session_1);
- test::MockMediaSessionMojoObserver observer_2(media_session_2);
- RequestAudioFocus(media_session_2, mojom::AudioFocusType::kGain);
- observer_1.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
- observer_2.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session_2);
- controller()->Suspend();
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Multiple_NonControllable) {
- test::MockMediaSession media_session_1;
- test::MockMediaSession media_session_2;
- media_session_1.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- RequestAudioFocus(media_session_1, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- EXPECT_EQ(2, media_session_1.add_observer_count());
- {
- test::MockMediaSessionMojoObserver observer_1(media_session_1);
- test::MockMediaSessionMojoObserver observer_2(media_session_2);
- RequestAudioFocus(media_session_2, mojom::AudioFocusType::kGain);
- observer_1.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
- observer_2.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- // The top session has changed but the controller is still bound to
- // |media_session_1|. We should make sure we do not add an observer if we
- // already have one.
- EXPECT_EQ(3, media_session_1.add_observer_count());
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- controller()->Resume();
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- EXPECT_EQ(4, media_session_1.add_observer_count());
- }
- TEST_F(MediaControllerTest, ActiveController_Multiple_UpdateControllable) {
- test::MockMediaSession media_session_1;
- test::MockMediaSession media_session_2;
- media_session_1.SetIsControllable(true);
- media_session_2.SetIsControllable(true);
- EXPECT_EQ(0, media_session_1.add_observer_count());
- EXPECT_EQ(0, media_session_2.add_observer_count());
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- RequestAudioFocus(media_session_1, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- EXPECT_EQ(2, media_session_1.add_observer_count());
- EXPECT_EQ(0, media_session_2.add_observer_count());
- {
- test::MockMediaSessionMojoObserver observer(media_session_2);
- RequestAudioFocus(media_session_2, mojom::AudioFocusType::kGainTransient);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- EXPECT_EQ(2, media_session_1.add_observer_count());
- EXPECT_EQ(2, media_session_2.add_observer_count());
- media_session_2.SetIsControllable(false);
- media_session_2.FlushForTesting();
- EXPECT_EQ(3, media_session_1.add_observer_count());
- EXPECT_EQ(2, media_session_2.add_observer_count());
- media_session_1.SetIsControllable(false);
- media_session_1.FlushForTesting();
- EXPECT_EQ(3, media_session_1.add_observer_count());
- EXPECT_EQ(2, media_session_2.add_observer_count());
- }
- TEST_F(MediaControllerTest, ActiveController_Suspend_Noop) {
- controller()->Suspend();
- }
- TEST_F(MediaControllerTest, ActiveController_Suspend_Noop_Abandoned) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- media_session.AbandonAudioFocusFromClient();
- controller()->Suspend();
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_SuspendResume) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- controller()->Suspend();
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- controller()->Resume();
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_ToggleSuspendResume_Playing) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- controller()->ToggleSuspendResume();
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_ToggleSuspendResume_Ducked) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- media_session.StartDucking();
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kDucking);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- controller()->ToggleSuspendResume();
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_ToggleSuspendResume_Inactive) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- media_session.Stop(mojom::MediaSession::SuspendType::kUI);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kInactive);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- controller()->ToggleSuspendResume();
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_ToggleSuspendResume_Paused) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- controller()->Suspend();
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- controller()->ToggleSuspendResume();
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Observer_StateTransition) {
- test::MockMediaSession media_session_1;
- test::MockMediaSession media_session_2;
- media_session_1.SetIsControllable(true);
- media_session_2.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- RequestAudioFocus(media_session_1, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- controller()->Suspend();
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kSuspended);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- RequestAudioFocus(media_session_2, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- media_session_1.StartDucking();
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kDucking);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_PreviousTrack) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- EXPECT_EQ(0, media_session.prev_track_count());
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- EXPECT_EQ(0, media_session.prev_track_count());
- }
- controller()->PreviousTrack();
- controller().FlushForTesting();
- EXPECT_EQ(1, media_session.prev_track_count());
- }
- TEST_F(MediaControllerTest, ActiveController_NextTrack) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- EXPECT_EQ(0, media_session.next_track_count());
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- EXPECT_EQ(0, media_session.next_track_count());
- }
- controller()->NextTrack();
- controller().FlushForTesting();
- EXPECT_EQ(1, media_session.next_track_count());
- }
- TEST_F(MediaControllerTest, ActiveController_Seek) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- EXPECT_EQ(0, media_session.seek_count());
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- EXPECT_EQ(0, media_session.seek_count());
- }
- controller()->Seek(base::Seconds(mojom::kDefaultSeekTimeSeconds));
- controller().FlushForTesting();
- EXPECT_EQ(1, media_session.seek_count());
- }
- TEST_F(MediaControllerTest, ActiveController_SeekTo) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- EXPECT_EQ(0, media_session.seek_to_count());
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- EXPECT_EQ(0, media_session.seek_to_count());
- }
- controller()->SeekTo(base::Seconds(mojom::kDefaultSeekTimeSeconds));
- controller().FlushForTesting();
- EXPECT_EQ(1, media_session.seek_to_count());
- }
- TEST_F(MediaControllerTest, ActiveController_ScrubTo) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- EXPECT_FALSE(media_session.is_scrubbing());
- EXPECT_EQ(0, media_session.seek_to_count());
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- EXPECT_FALSE(media_session.is_scrubbing());
- EXPECT_EQ(0, media_session.seek_to_count());
- }
- controller()->ScrubTo(base::Seconds(mojom::kDefaultSeekTimeSeconds));
- controller().FlushForTesting();
- EXPECT_TRUE(media_session.is_scrubbing());
- EXPECT_EQ(0, media_session.seek_to_count());
- controller()->ScrubTo(base::Seconds(mojom::kDefaultSeekTimeSeconds));
- controller().FlushForTesting();
- EXPECT_TRUE(media_session.is_scrubbing());
- EXPECT_EQ(0, media_session.seek_to_count());
- controller()->SeekTo(base::Seconds(mojom::kDefaultSeekTimeSeconds));
- controller().FlushForTesting();
- EXPECT_FALSE(media_session.is_scrubbing());
- EXPECT_EQ(1, media_session.seek_to_count());
- }
- TEST_F(MediaControllerTest, ActiveController_Metadata_Observer_Abandoned) {
- MediaMetadata metadata;
- metadata.title = u"title";
- metadata.artist = u"artist";
- metadata.album = u"album";
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- absl::optional<MediaMetadata> test_metadata(metadata);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- media_session.SimulateMetadataChanged(test_metadata);
- media_session.AbandonAudioFocusFromClient();
- {
- test::TestMediaControllerObserver observer(controller());
- observer.WaitForEmptyMetadata();
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Metadata_Observer_Empty) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- absl::optional<MediaMetadata> test_metadata;
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- media_session.SimulateMetadataChanged(test_metadata);
- observer.WaitForEmptyMetadata();
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Metadata_Observer_WithInfo) {
- MediaMetadata metadata;
- metadata.title = u"title";
- metadata.artist = u"artist";
- metadata.album = u"album";
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- absl::optional<MediaMetadata> test_metadata(metadata);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- media_session.SimulateMetadataChanged(test_metadata);
- observer.WaitForExpectedMetadata(metadata);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Metadata_AddObserver_Empty) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- absl::optional<MediaMetadata> test_metadata;
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- media_session.SimulateMetadataChanged(test_metadata);
- {
- test::TestMediaControllerObserver observer(controller());
- observer.WaitForEmptyMetadata();
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Metadata_AddObserver_WithInfo) {
- MediaMetadata metadata;
- metadata.title = u"title";
- metadata.artist = u"artist";
- metadata.album = u"album";
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- absl::optional<MediaMetadata> test_metadata(metadata);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- media_session.SimulateMetadataChanged(test_metadata);
- {
- test::TestMediaControllerObserver observer(controller());
- observer.WaitForExpectedMetadata(metadata);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Stop) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- controller()->Stop();
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kInactive);
- }
- }
- TEST_F(MediaControllerTest, BoundController_Routing) {
- test::MockMediaSession media_session_1;
- test::MockMediaSession media_session_2;
- media_session_1.SetIsControllable(true);
- media_session_2.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- RequestAudioFocus(media_session_1, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- mojo::Remote<mojom::MediaController> controller;
- manager()->CreateMediaControllerForSession(
- controller.BindNewPipeAndPassReceiver(), media_session_1.request_id());
- manager().FlushForTesting();
- EXPECT_EQ(0, media_session_1.next_track_count());
- controller->NextTrack();
- controller.FlushForTesting();
- EXPECT_EQ(1, media_session_1.next_track_count());
- {
- test::MockMediaSessionMojoObserver observer(media_session_2);
- RequestAudioFocus(media_session_2, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- EXPECT_EQ(1, media_session_1.next_track_count());
- EXPECT_EQ(0, media_session_2.next_track_count());
- controller->NextTrack();
- controller.FlushForTesting();
- EXPECT_EQ(2, media_session_1.next_track_count());
- EXPECT_EQ(0, media_session_2.next_track_count());
- }
- TEST_F(MediaControllerTest, BoundController_BadRequestId) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- mojo::Remote<mojom::MediaController> controller;
- manager()->CreateMediaControllerForSession(
- controller.BindNewPipeAndPassReceiver(),
- base::UnguessableToken::Create());
- manager().FlushForTesting();
- EXPECT_EQ(0, media_session.next_track_count());
- controller->NextTrack();
- controller.FlushForTesting();
- EXPECT_EQ(0, media_session.next_track_count());
- }
- TEST_F(MediaControllerTest, BoundController_DropOnAbandon) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- mojo::Remote<mojom::MediaController> controller;
- manager()->CreateMediaControllerForSession(
- controller.BindNewPipeAndPassReceiver(), media_session.request_id());
- manager().FlushForTesting();
- EXPECT_EQ(0, media_session.next_track_count());
- controller->NextTrack();
- controller.FlushForTesting();
- EXPECT_EQ(1, media_session.next_track_count());
- media_session.AbandonAudioFocusFromClient();
- EXPECT_EQ(1, media_session.next_track_count());
- controller->NextTrack();
- controller.FlushForTesting();
- EXPECT_EQ(1, media_session.next_track_count());
- }
- TEST_F(MediaControllerTest, ActiveController_Actions_AddObserver_Empty) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- observer.WaitForEmptyActions();
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Actions_AddObserver_WithInfo) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- media_session.EnableAction(mojom::MediaSessionAction::kPlay);
- {
- test::TestMediaControllerObserver observer(controller());
- std::set<mojom::MediaSessionAction> expected_actions;
- expected_actions.insert(mojom::MediaSessionAction::kPlay);
- observer.WaitForExpectedActions(expected_actions);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Actions_Observer_Empty) {
- test::MockMediaSession media_session;
- media_session.EnableAction(mojom::MediaSessionAction::kPlay);
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- media_session.DisableAction(mojom::MediaSessionAction::kPlay);
- observer.WaitForEmptyActions();
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Actions_Observer_WithInfo) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- media_session.EnableAction(mojom::MediaSessionAction::kPlay);
- std::set<mojom::MediaSessionAction> expected_actions;
- expected_actions.insert(mojom::MediaSessionAction::kPlay);
- observer.WaitForExpectedActions(expected_actions);
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Actions_Observer_Abandoned) {
- test::MockMediaSession media_session;
- media_session.EnableAction(mojom::MediaSessionAction::kPlay);
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- media_session.AbandonAudioFocusFromClient();
- {
- test::TestMediaControllerObserver observer(controller());
- observer.WaitForEmptyActions();
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Position_Observer_Empty) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- absl::optional<MediaPosition> test_position;
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- media_session.SimulatePositionChanged(test_position);
- observer.WaitForEmptyPosition();
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Position_Observer_WithInfo) {
- MediaPosition position(
- /*playback_rate=*/1,
- /*duration=*/base::Seconds(600),
- /*position=*/base::Seconds(300),
- /*end_of_media=*/false);
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- absl::optional<MediaPosition> test_position(position);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- media_session.SimulatePositionChanged(test_position);
- observer.WaitForNonEmptyPosition();
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Position_AddObserver_Empty) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- absl::optional<MediaPosition> test_position;
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- media_session.SimulatePositionChanged(test_position);
- {
- test::TestMediaControllerObserver observer(controller());
- observer.WaitForEmptyPosition();
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Position_AddObserver_WithInfo) {
- MediaPosition position(
- /*playback_rate=*/1,
- /*duration=*/base::Seconds(600),
- /*position=*/base::Seconds(300),
- /*end_of_media=*/false);
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- absl::optional<MediaPosition> test_position(position);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- media_session.SimulatePositionChanged(test_position);
- {
- test::TestMediaControllerObserver observer(controller());
- observer.WaitForNonEmptyPosition();
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Position_Observer_Abandoned) {
- MediaPosition position(
- /*playback_rate=*/1,
- /*duration=*/base::Seconds(600),
- /*position=*/base::Seconds(300),
- /*end_of_media=*/false);
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- absl::optional<MediaPosition> test_position(position);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- media_session.SimulatePositionChanged(test_position);
- media_session.AbandonAudioFocusFromClient();
- {
- test::TestMediaControllerObserver observer(controller());
- observer.WaitForEmptyPosition();
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Observer_Abandoned) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- media_session.AbandonAudioFocusFromClient();
- // We should see empty info, metadata, actions, and position flushed since
- // the active controller is no longer bound to a media session.
- observer.WaitForEmptyInfo();
- observer.WaitForEmptyMetadata();
- observer.WaitForEmptyActions();
- observer.WaitForEmptyPosition();
- }
- }
- TEST_F(MediaControllerTest, ActiveController_AddObserver_Abandoned) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- media_session.AbandonAudioFocusFromClient();
- {
- test::TestMediaControllerObserver observer(controller());
- // We should see empty info, metadata, actions, and position since the
- // active controller is no longer bound to a media session.
- observer.WaitForEmptyInfo();
- observer.WaitForEmptyMetadata();
- observer.WaitForEmptyActions();
- observer.WaitForEmptyPosition();
- }
- }
- TEST_F(MediaControllerTest, ClearImageObserverOnError) {
- MediaController controller;
- mojo::Remote<mojom::MediaController> controller_remote;
- controller.BindToInterface(controller_remote.BindNewPipeAndPassReceiver());
- EXPECT_EQ(0u, GetImageObserverCount(controller));
- {
- test::TestMediaControllerImageObserver observer(controller_remote, 0, 0);
- EXPECT_EQ(1u, GetImageObserverCount(controller));
- }
- EXPECT_EQ(1u, GetImageObserverCount(controller));
- base::RunLoop().RunUntilIdle();
- EXPECT_EQ(0u, GetImageObserverCount(controller));
- }
- TEST_F(MediaControllerTest, ActiveController_SimulateImagesChanged) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- std::vector<MediaImage> images;
- MediaImage image;
- image.src = GURL("https://www.google.com");
- images.push_back(image);
- {
- test::TestMediaControllerImageObserver observer(controller(), 0, 0);
- // By default, the image is empty but no notification should be received.
- EXPECT_TRUE(media_session.last_image_src().is_empty());
- // Check that we receive the correct image and that it was requested from
- // |media_session| by the controller.
- media_session.SetImagesOfType(mojom::MediaSessionImageType::kArtwork,
- images);
- observer.WaitForExpectedImageOfType(mojom::MediaSessionImageType::kArtwork,
- false);
- EXPECT_EQ(image.src, media_session.last_image_src());
- // Check that we flush the observer with an empty image. Since the image is
- // empty the last downloaded image by |media_session| should still be the
- // previous image.
- media_session.SetImagesOfType(mojom::MediaSessionImageType::kArtwork,
- std::vector<MediaImage>());
- observer.WaitForExpectedImageOfType(mojom::MediaSessionImageType::kArtwork,
- true);
- EXPECT_EQ(image.src, media_session.last_image_src());
- }
- }
- TEST_F(MediaControllerTest,
- ActiveController_SimulateImagesChanged_ToggleControllable) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- std::vector<MediaImage> images;
- MediaImage image;
- image.src = GURL("https://www.google.com");
- images.push_back(image);
- media_session.SetImagesOfType(mojom::MediaSessionImageType::kArtwork, images);
- {
- test::TestMediaControllerImageObserver observer(controller(), 0, 0);
- observer.WaitForExpectedImageOfType(mojom::MediaSessionImageType::kArtwork,
- false);
- EXPECT_EQ(image.src, media_session.last_image_src());
- // When the |media_session| becomes uncontrollable it is unbound from the
- // media controller and we should flush the observer with an empty image.
- media_session.SetIsControllable(false);
- observer.WaitForExpectedImageOfType(mojom::MediaSessionImageType::kArtwork,
- true);
- // When the |media_session| becomes controllable again it will be bound to
- // the media controller and we should flush the observer with the current
- // images.
- media_session.SetIsControllable(true);
- observer.WaitForExpectedImageOfType(mojom::MediaSessionImageType::kArtwork,
- false);
- EXPECT_EQ(image.src, media_session.last_image_src());
- }
- }
- TEST_F(MediaControllerTest,
- ActiveController_SimulateImagesChanged_TypeChanged) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- std::vector<MediaImage> images;
- MediaImage image;
- image.src = GURL("https://www.google.com");
- images.push_back(image);
- media_session.SetImagesOfType(mojom::MediaSessionImageType::kArtwork, images);
- {
- test::TestMediaControllerImageObserver observer(controller(), 0, 0);
- observer.WaitForExpectedImageOfType(mojom::MediaSessionImageType::kArtwork,
- false);
- EXPECT_EQ(image.src, media_session.last_image_src());
- // If we clear all the images associated with the media session we should
- // flush all the observers.
- media_session.ClearAllImages();
- observer.WaitForExpectedImageOfType(mojom::MediaSessionImageType::kArtwork,
- true);
- EXPECT_EQ(image.src, media_session.last_image_src());
- }
- }
- TEST_F(MediaControllerTest,
- ActiveController_SimulateImagesChanged_MinSizeCutoff) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- std::vector<MediaImage> images;
- MediaImage image1;
- image1.src = GURL("https://www.google.com");
- image1.sizes.push_back(gfx::Size(1, 1));
- media_session.SetImagesOfType(mojom::MediaSessionImageType::kArtwork,
- {image1});
- {
- test::TestMediaControllerImageObserver observer(controller(), 5, 10);
- // The observer requires an image that is at least 5px but the only image
- // we have is 1px so the observer will not be notified.
- EXPECT_TRUE(media_session.last_image_src().is_empty());
- MediaImage image2;
- image2.src = GURL("https://www.example.com");
- image2.sizes.push_back(gfx::Size(10, 10));
- // Update the media session with two images, one that is too small and one
- // that is the right size. We should receive the second image through the
- // observer.
- media_session.SetImagesOfType(mojom::MediaSessionImageType::kArtwork,
- {image1, image2});
- observer.WaitForExpectedImageOfType(mojom::MediaSessionImageType::kArtwork,
- false);
- EXPECT_EQ(image2.src, media_session.last_image_src());
- // Use the first set of images again.
- media_session.SetImagesOfType(mojom::MediaSessionImageType::kArtwork,
- {image1});
- // The observer requires as image that is at least 5px and should now be
- // notified that the image was cleared.
- observer.WaitForExpectedImageOfType(mojom::MediaSessionImageType::kArtwork,
- true);
- }
- }
- TEST_F(MediaControllerTest,
- ActiveController_SimulateImagesChanged_DesiredSize) {
- test::MockMediaSession media_session;
- media_session.SetIsControllable(true);
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- std::vector<MediaImage> images;
- MediaImage image1;
- image1.src = GURL("https://www.google.com");
- image1.sizes.push_back(gfx::Size(10, 10));
- images.push_back(image1);
- MediaImage image2;
- image2.src = GURL("https://www.example.com");
- image2.sizes.push_back(gfx::Size(9, 9));
- images.push_back(image2);
- media_session.SetImagesOfType(mojom::MediaSessionImageType::kArtwork, images);
- {
- test::TestMediaControllerImageObserver observer(controller(), 5, 10);
- // The media session has two images, but the first one is closer to the 10px
- // desired size that the observer has specified. Therefore, the observer
- // should receive that image.
- media_session.SetImagesOfType(mojom::MediaSessionImageType::kArtwork,
- images);
- observer.WaitForExpectedImageOfType(mojom::MediaSessionImageType::kArtwork,
- false);
- EXPECT_EQ(image1.src, media_session.last_image_src());
- }
- }
- TEST_F(MediaControllerTest, ActiveController_Observer_SessionChanged) {
- test::MockMediaSession media_session_1;
- test::MockMediaSession media_session_2;
- media_session_1.SetIsControllable(true);
- media_session_2.SetIsControllable(true);
- {
- test::TestMediaControllerObserver observer(controller());
- observer.WaitForSession(absl::nullopt);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- RequestAudioFocus(media_session_1, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- observer.WaitForSession(media_session_1.request_id());
- }
- {
- test::TestMediaControllerObserver observer(controller());
- RequestAudioFocus(media_session_2, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- {
- test::TestMediaControllerObserver observer(controller());
- observer.WaitForSession(media_session_2.request_id());
- }
- {
- test::TestMediaControllerObserver observer(controller());
- media_session_2.AbandonAudioFocusFromClient();
- observer.WaitForSession(media_session_1.request_id());
- }
- {
- test::TestMediaControllerObserver observer(controller());
- media_session_1.SetIsControllable(false);
- observer.WaitForSession(absl::nullopt);
- }
- }
- TEST_F(MediaControllerTest, BoundController_Observer_SessionChanged) {
- test::MockMediaSession media_session;
- {
- test::MockMediaSessionMojoObserver observer(media_session);
- RequestAudioFocus(media_session, mojom::AudioFocusType::kGain);
- observer.WaitForState(mojom::MediaSessionInfo::SessionState::kActive);
- }
- mojo::Remote<mojom::MediaController> controller;
- manager()->CreateMediaControllerForSession(
- controller.BindNewPipeAndPassReceiver(), media_session.request_id());
- manager().FlushForTesting();
- {
- test::TestMediaControllerObserver observer(controller);
- observer.WaitForSession(media_session.request_id());
- }
- }
- TEST_F(MediaControllerTest, Manager_SuspendAllSessions) {
- test::MockMediaSession media_session_1;
- test::MockMediaSession media_session_2;
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- RequestAudioFocus(media_session_1, mojom::AudioFocusType::kGain);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session_2);
- RequestAudioFocus(media_session_2,
- mojom::AudioFocusType::kGainTransientMayDuck);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
- }
- manager()->SuspendAllSessions();
- {
- test::MockMediaSessionMojoObserver observer(media_session_1);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
- }
- {
- test::MockMediaSessionMojoObserver observer(media_session_2);
- observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
- }
- }
- } // namespace media_session
|