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

Side by Side Diff: content/browser/media/session/audio_focus_manager_unittest.cc

Issue 1971443002: Implement Audio Focus Manager for desktop. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix leak in unit tests Created 4 years, 5 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 "content/browser/media/session/audio_focus_manager.h"
6
7 #include "content/browser/media/session/media_session.h"
8 #include "content/public/test/mock_render_process_host.h"
9 #include "content/public/test/test_browser_context.h"
10 #include "content/public/test/test_browser_thread.h"
11 #include "content/test/test_web_contents.h"
12
13 namespace content {
14
15 using AudioFocusType = AudioFocusManager::AudioFocusType;
16 using SuspendType = MediaSession::SuspendType;
17
18 class AudioFocusManagerTest : public testing::Test {
19 public:
20 const double kDuckingVolumeMultiplier = 0.2;
21 const double kDefaultVolumeMultiplier = 1.0;
22
23 AudioFocusManagerTest() : ui_thread_(BrowserThread::UI, &message_loop_) {}
24
25 void SetUp() override {
26 rph_factory_.reset(new MockRenderProcessHostFactory());
27 SiteInstanceImpl::set_render_process_host_factory(rph_factory_.get());
28 browser_context_.reset(new TestBrowserContext());
29 }
30
31 void TearDown() override {
32 browser_context_.reset();
33 SiteInstanceImpl::set_render_process_host_factory(nullptr);
34 rph_factory_.reset();
35 }
36
37 WebContents* GetAudioFocusedContent() const {
38 if (!AudioFocusManager::GetInstance()->focus_entry_)
39 return nullptr;
40 return AudioFocusManager::GetInstance()->focus_entry_->web_contents();
41 }
42
43 int GetTransientMaybeDuckCount() const {
44 return AudioFocusManager::GetInstance()->TransientMayDuckEntriesCount();
45 }
46
47 double GetVolumeMultiplier(MediaSession* session) {
48 return session->volume_multiplier_;
49 }
50
51 WebContents* CreateWebContents() {
52 return TestWebContents::Create(browser_context_.get(),
53 SiteInstance::SiteInstance::Create(browser_context_.get()));
54 }
55
56 private:
57 base::MessageLoopForUI message_loop_;
58 TestBrowserThread ui_thread_;
59
60 std::unique_ptr<MockRenderProcessHostFactory> rph_factory_;
61 std::unique_ptr<TestBrowserContext> browser_context_;
62 };
63
64 TEST_F(AudioFocusManagerTest, InstanceAvailableAndSame) {
65 AudioFocusManager* audio_focus_manager = AudioFocusManager::GetInstance();
66 ASSERT_TRUE(!!audio_focus_manager);
67 ASSERT_EQ(audio_focus_manager, AudioFocusManager::GetInstance());
68 }
69
70 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_ReplaceFocusedEntry) {
71 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
72 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
73
74 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
75 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
76
77 std::unique_ptr<WebContents> web_contents_3(CreateWebContents());
78 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get());
79
80 ASSERT_EQ(nullptr, GetAudioFocusedContent());
81
82 AudioFocusManager::GetInstance()->RequestAudioFocus(
83 media_session_1, AudioFocusManager::AudioFocusType::Gain);
84 ASSERT_EQ(web_contents_1.get(), GetAudioFocusedContent());
85
86 AudioFocusManager::GetInstance()->RequestAudioFocus(
87 media_session_2, AudioFocusManager::AudioFocusType::Gain);
88 ASSERT_EQ(web_contents_2.get(), GetAudioFocusedContent());
89
90 AudioFocusManager::GetInstance()->RequestAudioFocus(
91 media_session_3, AudioFocusManager::AudioFocusType::Gain);
92 ASSERT_EQ(web_contents_3.get(), GetAudioFocusedContent());
93 }
94
95 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_Duplicate) {
96 std::unique_ptr<WebContents> web_contents(CreateWebContents());
97 MediaSession* media_session = MediaSession::Get(web_contents.get());
98
99 ASSERT_EQ(nullptr, GetAudioFocusedContent());
100
101 AudioFocusManager::GetInstance()->RequestAudioFocus(
102 media_session, AudioFocusManager::AudioFocusType::Gain);
103 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
104
105 AudioFocusManager::GetInstance()->RequestAudioFocus(
106 media_session, AudioFocusManager::AudioFocusType::Gain);
107 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
108 }
109
110 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_FromTransient) {
111 std::unique_ptr<WebContents> web_contents(CreateWebContents());
112 MediaSession* media_session = MediaSession::Get(web_contents.get());
113
114 AudioFocusManager::GetInstance()->RequestAudioFocus(
115 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
116 ASSERT_EQ(nullptr, GetAudioFocusedContent());
117 ASSERT_EQ(1, GetTransientMaybeDuckCount());
118
119 AudioFocusManager::GetInstance()->RequestAudioFocus(
120 media_session, AudioFocusManager::AudioFocusType::Gain);
121 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
122 ASSERT_EQ(0, GetTransientMaybeDuckCount());
123 }
124
125 TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGain) {
126 std::unique_ptr<WebContents> web_contents(CreateWebContents());
127 MediaSession* media_session = MediaSession::Get(web_contents.get());
128
129 AudioFocusManager::GetInstance()->RequestAudioFocus(
130 media_session, AudioFocusManager::AudioFocusType::Gain);
131 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
132 ASSERT_EQ(0, GetTransientMaybeDuckCount());
133
134 AudioFocusManager::GetInstance()->RequestAudioFocus(
135 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
136 ASSERT_EQ(nullptr, GetAudioFocusedContent());
137 ASSERT_EQ(1, GetTransientMaybeDuckCount());
138 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session));
139 }
140
141 TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGainWhileDucking) {
142 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
143 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
144
145 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
146 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
147
148 AudioFocusManager::GetInstance()->RequestAudioFocus(
149 media_session_1, AudioFocusManager::AudioFocusType::Gain);
150 ASSERT_EQ(0, GetTransientMaybeDuckCount());
151 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
152
153 AudioFocusManager::GetInstance()->RequestAudioFocus(
154 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
155 ASSERT_EQ(1, GetTransientMaybeDuckCount());
156 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
157
158 AudioFocusManager::GetInstance()->RequestAudioFocus(
159 media_session_1, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
160 ASSERT_EQ(2, GetTransientMaybeDuckCount());
161 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
162 }
163
164 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesFocusedEntry) {
165 std::unique_ptr<WebContents> web_contents(CreateWebContents());
166 MediaSession* media_session = MediaSession::Get(web_contents.get());
167
168 AudioFocusManager::GetInstance()->RequestAudioFocus(
169 media_session, AudioFocusManager::AudioFocusType::Gain);
170 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
171
172 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session);
173 ASSERT_EQ(nullptr, GetAudioFocusedContent());
174 }
175
176 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_NoAssociatedEntry) {
177 std::unique_ptr<WebContents> web_contents(CreateWebContents());
178 MediaSession* media_session = MediaSession::Get(web_contents.get());
179
180 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session);
181 ASSERT_EQ(nullptr, GetAudioFocusedContent());
182 }
183
184 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesTransientEntry) {
185 std::unique_ptr<WebContents> web_contents(CreateWebContents());
186 MediaSession* media_session = MediaSession::Get(web_contents.get());
187
188 AudioFocusManager::GetInstance()->RequestAudioFocus(
189 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
190 ASSERT_EQ(1, GetTransientMaybeDuckCount());
191
192 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session);
193 ASSERT_EQ(0, GetTransientMaybeDuckCount());
194 }
195
196 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_WhileDuckingThenResume) {
197 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
198 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
199
200 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
201 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
202
203 AudioFocusManager::GetInstance()->RequestAudioFocus(
204 media_session_1, AudioFocusManager::AudioFocusType::Gain);
205 ASSERT_EQ(0, GetTransientMaybeDuckCount());
206 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
207
208 AudioFocusManager::GetInstance()->RequestAudioFocus(
209 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
210 ASSERT_EQ(1, GetTransientMaybeDuckCount());
211 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
212
213 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_1);
214 ASSERT_EQ(1, GetTransientMaybeDuckCount());
215
216 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2);
217 ASSERT_EQ(0, GetTransientMaybeDuckCount());
218
219 AudioFocusManager::GetInstance()->RequestAudioFocus(
220 media_session_1, AudioFocusManager::AudioFocusType::Gain);
221 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
222 }
223
224 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_StopsDucking) {
225 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
226 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
227
228 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
229 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
230
231 AudioFocusManager::GetInstance()->RequestAudioFocus(
232 media_session_1, AudioFocusManager::AudioFocusType::Gain);
233 ASSERT_EQ(0, GetTransientMaybeDuckCount());
234 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
235
236 AudioFocusManager::GetInstance()->RequestAudioFocus(
237 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
238 ASSERT_EQ(1, GetTransientMaybeDuckCount());
239 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
240
241 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2);
242 ASSERT_EQ(0, GetTransientMaybeDuckCount());
243 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
244
245 }
246
247 TEST_F(AudioFocusManagerTest, DuckWhilePlaying) {
248 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
249 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
250
251 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
252 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
253
254 AudioFocusManager::GetInstance()->RequestAudioFocus(
255 media_session_1, AudioFocusManager::AudioFocusType::Gain);
256 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
257
258 AudioFocusManager::GetInstance()->RequestAudioFocus(
259 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
260 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
261 }
262
263 TEST_F(AudioFocusManagerTest, DuckWhenStarting) {
264 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
265 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
266
267 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
268 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
269
270 AudioFocusManager::GetInstance()->RequestAudioFocus(
271 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
272
273 AudioFocusManager::GetInstance()->RequestAudioFocus(
274 media_session_1, AudioFocusManager::AudioFocusType::Gain);
275 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
276 }
277
278 TEST_F(AudioFocusManagerTest, DuckWithMultipleTransients) {
279 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
280 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
281
282 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
283 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
284
285 std::unique_ptr<WebContents> web_contents_3(CreateWebContents());
286 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get());
287
288 AudioFocusManager::GetInstance()->RequestAudioFocus(
289 media_session_1, AudioFocusManager::AudioFocusType::Gain);
290 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
291
292 AudioFocusManager::GetInstance()->RequestAudioFocus(
293 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
294 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
295
296 AudioFocusManager::GetInstance()->RequestAudioFocus(
297 media_session_3, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
298 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
299
300 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2);
301 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
302
303 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_3);
304 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
305 }
306
307 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesFocus) {
308 std::unique_ptr<WebContents> web_contents(CreateWebContents());
309 MediaSession* media_session = MediaSession::Get(web_contents.get());
310
311 AudioFocusManager::GetInstance()->RequestAudioFocus(
312 media_session, AudioFocusManager::AudioFocusType::Gain);
313 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
314
315 web_contents.reset();
316 ASSERT_EQ(nullptr, GetAudioFocusedContent());
317 }
318
319 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesTransients) {
320 std::unique_ptr<WebContents> web_contents(CreateWebContents());
321 MediaSession* media_session = MediaSession::Get(web_contents.get());
322
323 AudioFocusManager::GetInstance()->RequestAudioFocus(
324 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
325 ASSERT_EQ(1, GetTransientMaybeDuckCount());
326
327 web_contents.reset();
328 ASSERT_EQ(0, GetTransientMaybeDuckCount());
329 }
330
331 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_StopsDucking) {
332 std::unique_ptr<WebContents> web_contents_1(CreateWebContents());
333 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
334
335 std::unique_ptr<WebContents> web_contents_2(CreateWebContents());
336 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
337
338 AudioFocusManager::GetInstance()->RequestAudioFocus(
339 media_session_1, AudioFocusManager::AudioFocusType::Gain);
340 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
341
342 AudioFocusManager::GetInstance()->RequestAudioFocus(
343 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
344 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
345
346 web_contents_2.reset();
347 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
348 }
349
350 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/media/session/audio_focus_manager.cc ('k') | content/browser/media/session/media_session.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698