Chromium Code Reviews| Index: content/browser/media/session/audio_focus_manager_unittest.cc |
| diff --git a/content/browser/media/session/audio_focus_manager_unittest.cc b/content/browser/media/session/audio_focus_manager_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c261b84ab4d671a37af8c0aa3a100c60089b4224 |
| --- /dev/null |
| +++ b/content/browser/media/session/audio_focus_manager_unittest.cc |
| @@ -0,0 +1,366 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/media/session/audio_focus_manager.h" |
| + |
| +#include "content/browser/media/session/media_session.h" |
| +#include "content/public/test/test_browser_context.h" |
| +#include "content/public/test/test_browser_thread.h" |
| +#include "content/test/test_web_contents.h" |
| +#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.
|
| + |
| +namespace content { |
| + |
| +using AudioFocusType = AudioFocusManager::AudioFocusType; |
| +using SuspendType = MediaSession::SuspendType; |
| + |
| +class AudioFocusManagerTest : public testing::Test { |
| + public: |
| + const double kDuckingVolumeMultiplier = 0.2; |
| + const double kDefaultVolumeMultiplier = 1.0; |
| + |
| + AudioFocusManagerTest() : ui_thread_(BrowserThread::UI, &message_loop_) {} |
| + |
| + void SetUp() override { |
| + browser_context_.reset(new TestBrowserContext()); |
| + site_instance_ = SiteInstance::Create(browser_context_.get()); |
| + } |
| + |
| + WebContents* GetAudioFocusedContent() const { |
| + if (!AudioFocusManager::GetInstance()->focus_entry_) |
| + return nullptr; |
| + return AudioFocusManager::GetInstance()->focus_entry_->web_contents(); |
| + } |
| + |
| + int GetTransientMaybeDuckCount() const { |
| + return AudioFocusManager::GetInstance()->TransientMayDuckEntriesCount(); |
| + } |
| + |
| + double GetVolumeMultiplier(MediaSession* session) { |
| + return session->volume_multiplier_; |
| + } |
| + |
| + BrowserContext* browser_context() const { return browser_context_.get(); } |
| + scoped_refptr<SiteInstance> site_instance() const { return site_instance_; } |
| + |
| + private: |
| + base::MessageLoopForUI message_loop_; |
| + TestBrowserThread ui_thread_; |
| + |
| + std::unique_ptr<TestBrowserContext> browser_context_; |
| + scoped_refptr<SiteInstance> site_instance_; |
| +}; |
| + |
| +TEST_F(AudioFocusManagerTest, InstanceAvailableAndSame) { |
| + AudioFocusManager* audio_focus_manager = AudioFocusManager::GetInstance(); |
| + ASSERT_TRUE(!!audio_focus_manager); |
| + ASSERT_EQ(audio_focus_manager, AudioFocusManager::GetInstance()); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_ReplaceFocusedEntry) { |
| + std::unique_ptr<TestWebContents> web_contents_1( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
| + |
| + std::unique_ptr<TestWebContents> web_contents_2( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
| + |
| + std::unique_ptr<TestWebContents> web_contents_3( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get()); |
| + |
| + ASSERT_EQ(nullptr, GetAudioFocusedContent()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_1, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(web_contents_1.get(), GetAudioFocusedContent()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_2, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(web_contents_2.get(), GetAudioFocusedContent()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_3, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(web_contents_3.get(), GetAudioFocusedContent()); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_Duplicate) { |
| + std::unique_ptr<TestWebContents> web_contents( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session = MediaSession::Get(web_contents.get()); |
| + |
| + ASSERT_EQ(nullptr, GetAudioFocusedContent()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(web_contents.get(), GetAudioFocusedContent()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(web_contents.get(), GetAudioFocusedContent()); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, RequestAudioFocusGain_FromTransient) { |
| + std::unique_ptr<TestWebContents> web_contents( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session = MediaSession::Get(web_contents.get()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| + ASSERT_EQ(nullptr, GetAudioFocusedContent()); |
| + ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(web_contents.get(), GetAudioFocusedContent()); |
| + ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGain) { |
| + std::unique_ptr<TestWebContents> web_contents( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session = MediaSession::Get(web_contents.get()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(web_contents.get(), GetAudioFocusedContent()); |
| + ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| + ASSERT_EQ(nullptr, GetAudioFocusedContent()); |
| + ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
| + ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session)); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, RequestAudioFocusTransient_FromGainWhileDucking) { |
| + std::unique_ptr<TestWebContents> web_contents_1( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
| + |
| + std::unique_ptr<TestWebContents> web_contents_2( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_1, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
| + ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| + ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
| + ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_1, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| + ASSERT_EQ(2, GetTransientMaybeDuckCount()); |
| + ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesFocusedEntry) { |
| + std::unique_ptr<TestWebContents> web_contents( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session = MediaSession::Get(web_contents.get()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(web_contents.get(), GetAudioFocusedContent()); |
| + |
| + AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session); |
| + ASSERT_EQ(nullptr, GetAudioFocusedContent()); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, AbandonAudioFocus_NoAssociatedEntry) { |
| + std::unique_ptr<TestWebContents> web_contents( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session = MediaSession::Get(web_contents.get()); |
| + |
| + AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session); |
| + ASSERT_EQ(nullptr, GetAudioFocusedContent()); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, AbandonAudioFocus_RemovesTransientEntry) { |
| + std::unique_ptr<TestWebContents> web_contents( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session = MediaSession::Get(web_contents.get()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| + ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
| + |
| + AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session); |
| + ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, AbandonAudioFocus_WhileDuckingThenResume) { |
| + std::unique_ptr<TestWebContents> web_contents_1( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
| + |
| + std::unique_ptr<TestWebContents> web_contents_2( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_1, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
| + ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| + ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
| + ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| + |
| + AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_1); |
| + ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
| + |
| + AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2); |
| + ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_1, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, AbandonAudioFocus_StopsDucking) { |
| + std::unique_ptr<TestWebContents> web_contents_1( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
| + |
| + std::unique_ptr<TestWebContents> web_contents_2( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_1, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
| + ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| + ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
| + ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| + |
| + AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2); |
| + ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
| + ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, DuckWhilePlaying) { |
| + std::unique_ptr<TestWebContents> web_contents_1( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
| + |
| + std::unique_ptr<TestWebContents> web_contents_2( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_1, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| + ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, DuckWhenStarting) { |
| + std::unique_ptr<TestWebContents> web_contents_1( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
| + |
| + std::unique_ptr<TestWebContents> web_contents_2( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_1, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, DuckWithMultipleTransients) { |
| + std::unique_ptr<TestWebContents> web_contents_1( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
| + |
| + std::unique_ptr<TestWebContents> web_contents_2( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
| + |
| + std::unique_ptr<TestWebContents> web_contents_3( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_3 = MediaSession::Get(web_contents_3.get()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_1, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| + ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_3, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| + ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| + |
| + AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_2); |
| + ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| + |
| + AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_3); |
| + ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesFocus) { |
| + std::unique_ptr<TestWebContents> web_contents( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session = MediaSession::Get(web_contents.get()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(web_contents.get(), GetAudioFocusedContent()); |
| + |
| + web_contents.reset(); |
| + ASSERT_EQ(nullptr, GetAudioFocusedContent()); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, WebContentsDestroyed_ReleasesTransients) { |
| + std::unique_ptr<TestWebContents> web_contents( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session = MediaSession::Get(web_contents.get()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| + ASSERT_EQ(1, GetTransientMaybeDuckCount()); |
| + |
| + web_contents.reset(); |
| + ASSERT_EQ(0, GetTransientMaybeDuckCount()); |
| +} |
| + |
| +TEST_F(AudioFocusManagerTest, WebContentsDestroyed_StopsDucking) { |
| + std::unique_ptr<TestWebContents> web_contents_1( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_1 = MediaSession::Get(web_contents_1.get()); |
| + |
| + std::unique_ptr<TestWebContents> web_contents_2( |
| + TestWebContents::Create(browser_context(), site_instance())); |
| + MediaSession* media_session_2 = MediaSession::Get(web_contents_2.get()); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_1, AudioFocusManager::AudioFocusType::Gain); |
| + ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| + |
| + AudioFocusManager::GetInstance()->RequestAudioFocus( |
| + media_session_2, AudioFocusManager::AudioFocusType::GainTransientMayDuck); |
| + ASSERT_EQ(kDuckingVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| + |
| + web_contents_2.reset(); |
| + ASSERT_EQ(kDefaultVolumeMultiplier, GetVolumeMultiplier(media_session_1)); |
| +} |
| + |
| +} // namespace content |