Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(408)

Side by Side Diff: content/browser/media/android/media_session_controller_unittest.cc

Issue 1570043002: Implement MediaSession on top of the WebMediaPlayerDelegate. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@media_session
Patch Set: Comments. Fix test? Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/tuple.h"
6 #include "content/browser/media/android/media_session.h"
7 #include "content/browser/media/android/media_session_controller.h"
8 #include "content/browser/media/android/media_web_contents_observer_android.h"
9 #include "content/common/media/media_player_delegate_messages.h"
10 #include "content/test/test_render_view_host.h"
11 #include "content/test/test_web_contents.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace content {
15
16 class MediaSessionControllerTest : public RenderViewHostImplTestHarness {
17 public:
18 void SetUp() override {
19 RenderViewHostImplTestHarness::SetUp();
20 id_ = WebContentsObserver::MediaPlayerId(contents()->GetMainFrame(), 0);
21 observer_ = MediaWebContentsObserverAndroid::FromWebContents(contents());
22 controller_ = CreateController();
23 }
24
25 void TearDown() override {
26 // Destruct the controller prior to any other teardown to avoid out of order
27 // destruction relative to the MediaSession instance.
28 controller_.reset();
29 RenderViewHostImplTestHarness::TearDown();
30 }
31
32 protected:
33 scoped_ptr<MediaSessionController> CreateController() {
34 return scoped_ptr<MediaSessionController>(
35 new MediaSessionController(id_, observer_));
36 }
37
38 MediaSession* media_session() { return MediaSession::Get(contents()); }
39
40 IPC::TestSink& test_sink() { return main_test_rfh()->GetProcess()->sink(); }
41
42 void Suspend() {
43 controller_->OnSuspend(controller_->get_player_id_for_testing());
44 }
45
46 void Resume() {
47 controller_->OnResume(controller_->get_player_id_for_testing());
48 }
49
50 void SetVolumeMultiplier(double multiplier) {
51 controller_->OnSetVolumeMultiplier(controller_->get_player_id_for_testing(),
52 multiplier);
53 }
54
55 // Returns a duration long enough for a media session instance to be created.
56 base::TimeDelta DurationJustRight() {
57 return base::TimeDelta::FromSeconds(
58 MediaSessionController::kMinimumDurationForContentSecs + 1);
59 }
60
61 // Returns a duration too short for a media session instance.
62 base::TimeDelta DurationTooShort() {
63 return base::TimeDelta::FromSeconds(
64 MediaSessionController::kMinimumDurationForContentSecs);
65 }
66
67 template <typename T>
68 bool ReceivedMessagePlayPause() {
69 const IPC::Message* msg = test_sink().GetUniqueMessageMatching(T::ID);
70 if (!msg)
71 return false;
72
73 base::Tuple<int> result;
74 if (!T::Read(msg, &result))
75 return false;
76
77 EXPECT_EQ(id_.second, base::get<0>(result));
78 test_sink().ClearMessages();
79 return id_.second == base::get<0>(result);
80 }
81
82 template <typename T>
83 bool ReceivedMessageVolumeMultiplierUpdate(double expected_multiplier) {
84 const IPC::Message* msg = test_sink().GetUniqueMessageMatching(T::ID);
85 if (!msg)
86 return false;
87
88 base::Tuple<int, double> result;
89 if (!T::Read(msg, &result))
90 return false;
91
92 EXPECT_EQ(id_.second, base::get<0>(result));
93 if (id_.second != base::get<0>(result))
94 return false;
95
96 EXPECT_EQ(expected_multiplier, base::get<1>(result));
97 test_sink().ClearMessages();
98 return expected_multiplier == base::get<1>(result);
99 }
100
101 WebContentsObserver::MediaPlayerId id_;
102 MediaWebContentsObserverAndroid* observer_;
103 scoped_ptr<MediaSessionController> controller_;
104 };
105
106 TEST_F(MediaSessionControllerTest, NoAudioNoSession) {
107 ASSERT_TRUE(controller_->Initialize(false, false, DurationJustRight()));
108 EXPECT_TRUE(media_session()->IsSuspended());
109 EXPECT_FALSE(media_session()->IsControllable());
110 }
111
112 TEST_F(MediaSessionControllerTest, IsRemoteNoSession) {
113 ASSERT_TRUE(controller_->Initialize(true, true, DurationJustRight()));
114 EXPECT_TRUE(media_session()->IsSuspended());
115 EXPECT_FALSE(media_session()->IsControllable());
116 }
117
118 TEST_F(MediaSessionControllerTest, TooShortNoControllableSession) {
119 ASSERT_TRUE(controller_->Initialize(true, false, DurationTooShort()));
120 EXPECT_FALSE(media_session()->IsSuspended());
121 EXPECT_FALSE(media_session()->IsControllable());
122 EXPECT_EQ(MediaSession::Type::Transient,
123 controller_->get_session_type_for_testing());
124 }
125
126 TEST_F(MediaSessionControllerTest, BasicControls) {
127 ASSERT_TRUE(controller_->Initialize(true, false, DurationJustRight()));
128 EXPECT_FALSE(media_session()->IsSuspended());
129 EXPECT_TRUE(media_session()->IsControllable());
130 EXPECT_EQ(MediaSession::Type::Content,
131 controller_->get_session_type_for_testing());
132
133 // Verify suspend notifies the renderer and maintains its session.
134 Suspend();
135 EXPECT_TRUE(ReceivedMessagePlayPause<MediaPlayerDelegateMsg_Pause>());
136
137 // Likewise verify the resume behavior.
138 Resume();
139 EXPECT_TRUE(ReceivedMessagePlayPause<MediaPlayerDelegateMsg_Play>());
140
141 // Verify destruction of the controller removes its session.
142 controller_.reset();
143 EXPECT_TRUE(media_session()->IsSuspended());
144 EXPECT_FALSE(media_session()->IsControllable());
145 }
146
147 TEST_F(MediaSessionControllerTest, VolumeMultiplier) {
148 ASSERT_TRUE(controller_->Initialize(true, false, DurationJustRight()));
149 EXPECT_FALSE(media_session()->IsSuspended());
150 EXPECT_TRUE(media_session()->IsControllable());
151
152 // Upon creation of the MediaSession the default multiplier will be sent.
153 EXPECT_TRUE(ReceivedMessageVolumeMultiplierUpdate<
154 MediaPlayerDelegateMsg_UpdateVolumeMultiplier>(1.0));
155
156 // Verify a different volume multiplier is sent.
157 const double kTestMultiplier = 0.5;
158 SetVolumeMultiplier(kTestMultiplier);
159 EXPECT_TRUE(ReceivedMessageVolumeMultiplierUpdate<
160 MediaPlayerDelegateMsg_UpdateVolumeMultiplier>(kTestMultiplier));
161 }
162
163 TEST_F(MediaSessionControllerTest, ControllerSidePause) {
164 ASSERT_TRUE(controller_->Initialize(true, false, DurationJustRight()));
165 EXPECT_FALSE(media_session()->IsSuspended());
166 EXPECT_TRUE(media_session()->IsControllable());
167
168 // Verify pause behavior.
169 controller_->OnPlaybackPaused();
170 EXPECT_TRUE(media_session()->IsSuspended());
171 EXPECT_TRUE(media_session()->IsControllable());
172 }
173
174 TEST_F(MediaSessionControllerTest, Reinitialize) {
175 ASSERT_TRUE(controller_->Initialize(false, false, DurationJustRight()));
176 EXPECT_TRUE(media_session()->IsSuspended());
177 EXPECT_FALSE(media_session()->IsControllable());
178
179 // Create normal content type session.
180 ASSERT_TRUE(controller_->Initialize(true, false, DurationJustRight()));
181 EXPECT_FALSE(media_session()->IsSuspended());
182 EXPECT_TRUE(media_session()->IsControllable());
183 EXPECT_EQ(MediaSession::Type::Content,
184 controller_->get_session_type_for_testing());
185 const int current_player_id = controller_->get_player_id_for_testing();
186
187 // Reinitialize the session as transient type.
188 ASSERT_TRUE(controller_->Initialize(true, false, DurationTooShort()));
189 EXPECT_FALSE(media_session()->IsSuspended());
190 EXPECT_FALSE(media_session()->IsControllable());
191 // Player id should not change when there's an active session.
192 EXPECT_EQ(current_player_id, controller_->get_player_id_for_testing());
193 EXPECT_EQ(MediaSession::Type::Transient,
194 controller_->get_session_type_for_testing());
195
196 // Verify suspend notifies the renderer and maintains its session.
197 Suspend();
198 EXPECT_TRUE(ReceivedMessagePlayPause<MediaPlayerDelegateMsg_Pause>());
199
200 // Likewise verify the resume behavior.
201 Resume();
202 EXPECT_TRUE(ReceivedMessagePlayPause<MediaPlayerDelegateMsg_Play>());
203
204 // Attempt to switch to no audio player, which should do nothing.
205 // TODO(dalecurtis): Delete this test once we're no longer using WMPA and
206 // the BrowserMediaPlayerManagers. Tracked by http://crbug.com/580626
207 ASSERT_TRUE(controller_->Initialize(false, false, DurationTooShort()));
208 EXPECT_FALSE(media_session()->IsSuspended());
209 EXPECT_FALSE(media_session()->IsControllable());
210 EXPECT_EQ(current_player_id, controller_->get_player_id_for_testing());
211
212 // Switch to a remote player, which should release the session.
213 ASSERT_TRUE(controller_->Initialize(true, true, DurationJustRight()));
214 EXPECT_TRUE(media_session()->IsSuspended());
215 EXPECT_FALSE(media_session()->IsControllable());
216 EXPECT_EQ(current_player_id, controller_->get_player_id_for_testing());
217 }
218
219 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698