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

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: Address comments. 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 }
123
124 TEST_F(MediaSessionControllerTest, BasicControls) {
125 ASSERT_TRUE(controller_->Initialize(true, false, DurationJustRight()));
126 EXPECT_FALSE(media_session()->IsSuspended());
127 EXPECT_TRUE(media_session()->IsControllable());
128
129 // Verify suspend notifies the renderer and maintains its session.
130 Suspend();
131 EXPECT_TRUE(ReceivedMessagePlayPause<MediaPlayerDelegateMsg_Pause>());
132
133 // Likewise verify the resume behavior.
134 Resume();
135 EXPECT_TRUE(ReceivedMessagePlayPause<MediaPlayerDelegateMsg_Play>());
136
137 // Verify destruction of the controller removes its session.
138 controller_.reset();
139 EXPECT_TRUE(media_session()->IsSuspended());
140 EXPECT_FALSE(media_session()->IsControllable());
141 }
142
143 TEST_F(MediaSessionControllerTest, VolumeMultiplier) {
144 ASSERT_TRUE(controller_->Initialize(true, false, DurationJustRight()));
145 EXPECT_FALSE(media_session()->IsSuspended());
146 EXPECT_TRUE(media_session()->IsControllable());
147
148 // Upon creation of the MediaSession the default multiplier will be sent.
149 EXPECT_TRUE(ReceivedMessageVolumeMultiplierUpdate<
150 MediaPlayerDelegateMsg_UpdateVolumeMultiplier>(1.0));
151
152 // Verify a different volume multiplier is sent.
153 const double kTestMultiplier = 0.5;
154 SetVolumeMultiplier(kTestMultiplier);
155 EXPECT_TRUE(ReceivedMessageVolumeMultiplierUpdate<
156 MediaPlayerDelegateMsg_UpdateVolumeMultiplier>(kTestMultiplier));
157 }
158
159 TEST_F(MediaSessionControllerTest, ControllerSidePause) {
160 ASSERT_TRUE(controller_->Initialize(true, false, DurationJustRight()));
161 EXPECT_FALSE(media_session()->IsSuspended());
162 EXPECT_TRUE(media_session()->IsControllable());
163
164 // Verify pause behavior.
165 controller_->OnPlaybackPaused();
166 EXPECT_TRUE(media_session()->IsSuspended());
167 EXPECT_TRUE(media_session()->IsControllable());
168 }
169
170 TEST_F(MediaSessionControllerTest, Reinitialize) {
171 ASSERT_TRUE(controller_->Initialize(false, false, DurationJustRight()));
172 EXPECT_TRUE(media_session()->IsSuspended());
173 EXPECT_FALSE(media_session()->IsControllable());
174
175 // Create normal content type session.
176 ASSERT_TRUE(controller_->Initialize(true, false, DurationJustRight()));
177 EXPECT_FALSE(media_session()->IsSuspended());
178 EXPECT_TRUE(media_session()->IsControllable());
179 const int current_player_id = controller_->get_player_id_for_testing();
180
181 // Create a session of transient type.
182 ASSERT_TRUE(controller_->Initialize(true, false, DurationTooShort()));
183 EXPECT_FALSE(media_session()->IsSuspended());
184 EXPECT_FALSE(media_session()->IsControllable());
185 // Player id should not change when there's an active session.
186 EXPECT_EQ(current_player_id, controller_->get_player_id_for_testing());
187
188 // Verify suspend notifies the renderer and maintains its session.
189 Suspend();
190 EXPECT_TRUE(ReceivedMessagePlayPause<MediaPlayerDelegateMsg_Pause>());
191
192 // Likewise verify the resume behavior.
193 Resume();
194 EXPECT_TRUE(ReceivedMessagePlayPause<MediaPlayerDelegateMsg_Play>());
195
196 // Switch to a remote player, which should release the session.
197 ASSERT_TRUE(controller_->Initialize(true, true, DurationJustRight()));
198 EXPECT_TRUE(media_session()->IsSuspended());
199 EXPECT_FALSE(media_session()->IsControllable());
200 EXPECT_EQ(current_player_id, controller_->get_player_id_for_testing());
201 }
202
203 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698