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

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: Rebase yet again. 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/frame_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 VerifyMessagePlayPause() {
mlamouri (slow - plz ping) 2016/01/22 16:58:31 nit: really a naming issue here. "Verify" sounds l
DaleCurtis 2016/01/23 02:11:00 Done.
69 const IPC::Message* msg = test_sink().GetUniqueMessageMatching(T::ID);
70 if (!msg)
71 return false;
72
73 base::Tuple<int64_t> 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 VerifyMessageVolumeMultiplierUpdate(double expected_multiplier) {
mlamouri (slow - plz ping) 2016/01/22 16:58:31 ditto
DaleCurtis 2016/01/23 02:11:00 Done.
84 const IPC::Message* msg = test_sink().GetUniqueMessageMatching(T::ID);
85 if (!msg)
86 return false;
87
88 base::Tuple<int64_t, 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 ASSERT_TRUE(VerifyMessagePlayPause<FrameMsg_MediaDelegatePause>());
mlamouri (slow - plz ping) 2016/01/22 16:58:31 nit: why ASSERT_TRUE?
DaleCurtis 2016/01/23 02:11:00 Done.
132
133 // Likewise verify the resume behavior.
134 Resume();
135 ASSERT_TRUE(VerifyMessagePlayPause<FrameMsg_MediaDelegatePlay>());
mlamouri (slow - plz ping) 2016/01/22 16:58:31 ditto
DaleCurtis 2016/01/23 02:11:00 Done.
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 ASSERT_TRUE(VerifyMessageVolumeMultiplierUpdate<
150 FrameMsg_MediaDelegateVolumeMultiplierUpdate>(1.0));
151
152 // Verify a different volume multiplier is sent.
153 const double kTestMultiplier = 0.5;
154 SetVolumeMultiplier(kTestMultiplier);
155 ASSERT_TRUE(VerifyMessageVolumeMultiplierUpdate<
156 FrameMsg_MediaDelegateVolumeMultiplierUpdate>(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_->PausePlayback();
166 EXPECT_TRUE(media_session()->IsSuspended());
167 EXPECT_TRUE(media_session()->IsControllable());
168 }
169
170 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698