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

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: style 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/test_browser_context.h"
9 #include "content/public/test/test_browser_thread.h"
10 #include "content/test/test_web_contents.h"
11 #include "testing/gmock/include/gmock/gmock.h"
Zhiqiang Zhang (Slow) 2016/07/08 15:26:26 "testing/gtest/include/gtest/gtest.h" should be en
mlamouri (slow - plz ping) 2016/07/08 17:41:35 Done.
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 browser_context_.reset(new TestBrowserContext());
27 site_instance_ = SiteInstance::Create(browser_context_.get());
28 }
29
30 WebContents* GetAudioFocusedContent() const {
31 if (!AudioFocusManager::GetInstance()->focus_entry_)
32 return nullptr;
33 return AudioFocusManager::GetInstance()->focus_entry_->web_contents();
34 }
35
36 int GetTransientMaybeDuckCount() const {
37 return AudioFocusManager::GetInstance()->TransientMayDuckEntriesCount();
38 }
39
40 double GetVolumeMultiplier(MediaSession* session) {
41 return session->volume_multiplier_;
42 }
43
44 BrowserContext* browser_context() const { return browser_context_.get(); }
45 scoped_refptr<SiteInstance> site_instance() const { return site_instance_; }
46
47 private:
48 base::MessageLoopForUI message_loop_;
49 TestBrowserThread ui_thread_;
50
51 std::unique_ptr<TestBrowserContext> browser_context_;
52 scoped_refptr<SiteInstance> site_instance_;
53 };
54
55 TEST_F(AudioFocusManagerTest, InstanceAvailableAndSame) {
56 AudioFocusManager* audio_focus_manager = AudioFocusManager::GetInstance();
57 ASSERT_TRUE(!!audio_focus_manager);
58 ASSERT_EQ(audio_focus_manager, AudioFocusManager::GetInstance());
59 }
60
61 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_ReplaceFocusedEntry) {
62 std::unique_ptr<TestWebContents> web_contents_1(
63 TestWebContents::Create(browser_context(), site_instance()));
64 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
65
66 std::unique_ptr<TestWebContents> web_contents_2(
67 TestWebContents::Create(browser_context(), site_instance()));
68 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
69
70 std::unique_ptr<TestWebContents> web_contents_3(
71 TestWebContents::Create(browser_context(), site_instance()));
72 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get());
73
74 ASSERT_EQ(nullptr, GetAudioFocusedContent());
75
76 AudioFocusManager::GetInstance()->RequestAudioFocus(
77 media_session_1, AudioFocusManager::AudioFocusType::Gain);
78 ASSERT_EQ(web_contents_1.get(), GetAudioFocusedContent());
79
80 AudioFocusManager::GetInstance()->RequestAudioFocus(
81 media_session_2, AudioFocusManager::AudioFocusType::Gain);
82 ASSERT_EQ(web_contents_2.get(), GetAudioFocusedContent());
83
84 AudioFocusManager::GetInstance()->RequestAudioFocus(
85 media_session_3, AudioFocusManager::AudioFocusType::Gain);
86 ASSERT_EQ(web_contents_3.get(), GetAudioFocusedContent());
87 }
88
89 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_Duplicate) {
90 std::unique_ptr<TestWebContents> web_contents(
91 TestWebContents::Create(browser_context(), site_instance()));
92 MediaSession* media_session = MediaSession::Get(web_contents.get());
93
94 ASSERT_EQ(nullptr, GetAudioFocusedContent());
95
96 AudioFocusManager::GetInstance()->RequestAudioFocus(
97 media_session, AudioFocusManager::AudioFocusType::Gain);
98 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
99
100 AudioFocusManager::GetInstance()->RequestAudioFocus(
101 media_session, AudioFocusManager::AudioFocusType::Gain);
102 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
103 }
104
105 TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_FromTransient) {
106 std::unique_ptr<TestWebContents> web_contents(
107 TestWebContents::Create(browser_context(), site_instance()));
108 MediaSession* media_session = MediaSession::Get(web_contents.get());
109
110 AudioFocusManager::GetInstance()->RequestAudioFocus(
111 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
112 ASSERT_EQ(nullptr, GetAudioFocusedContent());
113 ASSERT_EQ(1, GetTransientMaybeDuckCount());
114
115 AudioFocusManager::GetInstance()->RequestAudioFocus(
116 media_session, AudioFocusManager::AudioFocusType::Gain);
117 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
118 ASSERT_EQ(0, GetTransientMaybeDuckCount());
119 }
120
121 TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGain) {
122 std::unique_ptr<TestWebContents> web_contents(
123 TestWebContents::Create(browser_context(), site_instance()));
124 MediaSession* media_session = MediaSession::Get(web_contents.get());
125
126 AudioFocusManager::GetInstance()->RequestAudioFocus(
127 media_session, AudioFocusManager::AudioFocusType::Gain);
128 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
129 ASSERT_EQ(0, GetTransientMaybeDuckCount());
130
131 AudioFocusManager::GetInstance()->RequestAudioFocus(
132 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
133 ASSERT_EQ(nullptr, GetAudioFocusedContent());
134 ASSERT_EQ(1, GetTransientMaybeDuckCount());
135 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session));
136 }
137
138 TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGainWhileDucking) {
139 std::unique_ptr<TestWebContents> web_contents_1(
140 TestWebContents::Create(browser_context(), site_instance()));
141 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
142
143 std::unique_ptr<TestWebContents> web_contents_2(
144 TestWebContents::Create(browser_context(), site_instance()));
145 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
146
147 AudioFocusManager::GetInstance()->RequestAudioFocus(
148 media_session_1, AudioFocusManager::AudioFocusType::Gain);
149 ASSERT_EQ(0, GetTransientMaybeDuckCount());
150 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
151
152 AudioFocusManager::GetInstance()->RequestAudioFocus(
153 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
154 ASSERT_EQ(1, GetTransientMaybeDuckCount());
155 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
156
157 AudioFocusManager::GetInstance()->RequestAudioFocus(
158 media_session_1, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
159 ASSERT_EQ(2, GetTransientMaybeDuckCount());
160 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
161 }
162
163 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesFocusedEntry) {
164 std::unique_ptr<TestWebContents> web_contents(
165 TestWebContents::Create(browser_context(), site_instance()));
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<TestWebContents> web_contents(
178 TestWebContents::Create(browser_context(), site_instance()));
179 MediaSession* media_session = MediaSession::Get(web_contents.get());
180
181 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session);
182 ASSERT_EQ(nullptr, GetAudioFocusedContent());
183 }
184
185 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesTransientEntry) {
186 std::unique_ptr<TestWebContents> web_contents(
187 TestWebContents::Create(browser_context(), site_instance()));
188 MediaSession* media_session = MediaSession::Get(web_contents.get());
189
190 AudioFocusManager::GetInstance()->RequestAudioFocus(
191 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
192 ASSERT_EQ(1, GetTransientMaybeDuckCount());
193
194 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session);
195 ASSERT_EQ(0, GetTransientMaybeDuckCount());
196 }
197
198 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_WhileDuckingThenResume) {
199 std::unique_ptr<TestWebContents> web_contents_1(
200 TestWebContents::Create(browser_context(), site_instance()));
201 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
202
203 std::unique_ptr<TestWebContents> web_contents_2(
204 TestWebContents::Create(browser_context(), site_instance()));
205 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
206
207 AudioFocusManager::GetInstance()->RequestAudioFocus(
208 media_session_1, AudioFocusManager::AudioFocusType::Gain);
209 ASSERT_EQ(0, GetTransientMaybeDuckCount());
210 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
211
212 AudioFocusManager::GetInstance()->RequestAudioFocus(
213 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
214 ASSERT_EQ(1, GetTransientMaybeDuckCount());
215 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
216
217 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_1);
218 ASSERT_EQ(1, GetTransientMaybeDuckCount());
219
220 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2);
221 ASSERT_EQ(0, GetTransientMaybeDuckCount());
222
223 AudioFocusManager::GetInstance()->RequestAudioFocus(
224 media_session_1, AudioFocusManager::AudioFocusType::Gain);
225 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
226 }
227
228 TEST_F(AudioFocusManagerTest, AbandonAudioFocus_StopsDucking) {
229 std::unique_ptr<TestWebContents> web_contents_1(
230 TestWebContents::Create(browser_context(), site_instance()));
231 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
232
233 std::unique_ptr<TestWebContents> web_contents_2(
234 TestWebContents::Create(browser_context(), site_instance()));
235 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
236
237 AudioFocusManager::GetInstance()->RequestAudioFocus(
238 media_session_1, AudioFocusManager::AudioFocusType::Gain);
239 ASSERT_EQ(0, GetTransientMaybeDuckCount());
240 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
241
242 AudioFocusManager::GetInstance()->RequestAudioFocus(
243 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
244 ASSERT_EQ(1, GetTransientMaybeDuckCount());
245 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
246
247 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2);
248 ASSERT_EQ(0, GetTransientMaybeDuckCount());
249 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
250 }
251
252 TEST_F(AudioFocusManagerTest, DuckWhilePlaying) {
253 std::unique_ptr<TestWebContents> web_contents_1(
254 TestWebContents::Create(browser_context(), site_instance()));
255 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
256
257 std::unique_ptr<TestWebContents> web_contents_2(
258 TestWebContents::Create(browser_context(), site_instance()));
259 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
260
261 AudioFocusManager::GetInstance()->RequestAudioFocus(
262 media_session_1, AudioFocusManager::AudioFocusType::Gain);
263 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
264
265 AudioFocusManager::GetInstance()->RequestAudioFocus(
266 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
267 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
268 }
269
270 TEST_F(AudioFocusManagerTest, DuckWhenStarting) {
271 std::unique_ptr<TestWebContents> web_contents_1(
272 TestWebContents::Create(browser_context(), site_instance()));
273 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
274
275 std::unique_ptr<TestWebContents> web_contents_2(
276 TestWebContents::Create(browser_context(), site_instance()));
277 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
278
279 AudioFocusManager::GetInstance()->RequestAudioFocus(
280 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
281
282 AudioFocusManager::GetInstance()->RequestAudioFocus(
283 media_session_1, AudioFocusManager::AudioFocusType::Gain);
284 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
285 }
286
287 TEST_F(AudioFocusManagerTest, DuckWithMultipleTransients) {
288 std::unique_ptr<TestWebContents> web_contents_1(
289 TestWebContents::Create(browser_context(), site_instance()));
290 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
291
292 std::unique_ptr<TestWebContents> web_contents_2(
293 TestWebContents::Create(browser_context(), site_instance()));
294 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
295
296 std::unique_ptr<TestWebContents> web_contents_3(
297 TestWebContents::Create(browser_context(), site_instance()));
298 MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get());
299
300 AudioFocusManager::GetInstance()->RequestAudioFocus(
301 media_session_1, AudioFocusManager::AudioFocusType::Gain);
302 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
303
304 AudioFocusManager::GetInstance()->RequestAudioFocus(
305 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
306 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
307
308 AudioFocusManager::GetInstance()->RequestAudioFocus(
309 media_session_3, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
310 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
311
312 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2);
313 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
314
315 AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_3);
316 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
317 }
318
319 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesFocus) {
320 std::unique_ptr<TestWebContents> web_contents(
321 TestWebContents::Create(browser_context(), site_instance()));
322 MediaSession* media_session = MediaSession::Get(web_contents.get());
323
324 AudioFocusManager::GetInstance()->RequestAudioFocus(
325 media_session, AudioFocusManager::AudioFocusType::Gain);
326 ASSERT_EQ(web_contents.get(), GetAudioFocusedContent());
327
328 web_contents.reset();
329 ASSERT_EQ(nullptr, GetAudioFocusedContent());
330 }
331
332 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesTransients) {
333 std::unique_ptr<TestWebContents> web_contents(
334 TestWebContents::Create(browser_context(), site_instance()));
335 MediaSession* media_session = MediaSession::Get(web_contents.get());
336
337 AudioFocusManager::GetInstance()->RequestAudioFocus(
338 media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
339 ASSERT_EQ(1, GetTransientMaybeDuckCount());
340
341 web_contents.reset();
342 ASSERT_EQ(0, GetTransientMaybeDuckCount());
343 }
344
345 TEST_F(AudioFocusManagerTest, WebContentsDestroyed_StopsDucking) {
346 std::unique_ptr<TestWebContents> web_contents_1(
347 TestWebContents::Create(browser_context(), site_instance()));
348 MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get());
349
350 std::unique_ptr<TestWebContents> web_contents_2(
351 TestWebContents::Create(browser_context(), site_instance()));
352 MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get());
353
354 AudioFocusManager::GetInstance()->RequestAudioFocus(
355 media_session_1, AudioFocusManager::AudioFocusType::Gain);
356 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
357
358 AudioFocusManager::GetInstance()->RequestAudioFocus(
359 media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck);
360 ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1));
361
362 web_contents_2.reset();
363 ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1));
364 }
365
366 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698