// Copyright (c) 2012 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 #include "ash/ash_switches.h" #include "base/command_line.h" #include "base/memory/scoped_ptr.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/ui/ash/volume_controller_chromeos.h" #include "chrome/test/base/in_process_browser_test.h" #include "chromeos/audio/chromeos_sounds.h" #include "chromeos/audio/cras_audio_handler.h" #include "chromeos/chromeos_switches.h" #include "media/audio/sounds/sounds_manager.h" #include "ui/base/accelerators/accelerator.h" namespace { class SoundsManagerTestImpl : public media::SoundsManager { public: SoundsManagerTestImpl() : is_sound_initialized_(chromeos::SOUND_COUNT), num_play_requests_(chromeos::SOUND_COUNT) { } virtual ~SoundsManagerTestImpl() {} virtual bool Initialize(SoundKey key, const base::StringPiece& /* data */) OVERRIDE { is_sound_initialized_[key] = true; return true; } virtual bool Play(SoundKey key) OVERRIDE { ++num_play_requests_[key]; return true; } virtual base::TimeDelta GetDuration(SoundKey /* key */) OVERRIDE { return base::TimeDelta(); } bool is_sound_initialized(SoundKey key) const { return is_sound_initialized_[key]; } int num_play_requests(SoundKey key) const { return num_play_requests_[key]; } private: std::vector is_sound_initialized_; std::vector num_play_requests_; DISALLOW_COPY_AND_ASSIGN(SoundsManagerTestImpl); }; class VolumeControllerTest : public InProcessBrowserTest { public: VolumeControllerTest() {} virtual ~VolumeControllerTest() {} virtual void SetUpOnMainThread() OVERRIDE { volume_controller_.reset(new VolumeController()); audio_handler_ = chromeos::CrasAudioHandler::Get(); } protected: void VolumeMute() { volume_controller_->HandleVolumeMute(ui::Accelerator()); } void VolumeUp() { volume_controller_->HandleVolumeUp(ui::Accelerator()); } void VolumeDown() { volume_controller_->HandleVolumeDown(ui::Accelerator()); } chromeos::CrasAudioHandler* audio_handler_; // Not owned. private: scoped_ptr volume_controller_; DISALLOW_COPY_AND_ASSIGN(VolumeControllerTest); }; IN_PROC_BROWSER_TEST_F(VolumeControllerTest, VolumeUpAndDown) { // Set initial value as 50% const int kInitVolume = 50; audio_handler_->SetOutputVolumePercent(kInitVolume); EXPECT_EQ(audio_handler_->GetOutputVolumePercent(), kInitVolume); VolumeUp(); EXPECT_LT(kInitVolume, audio_handler_->GetOutputVolumePercent()); VolumeDown(); EXPECT_EQ(kInitVolume, audio_handler_->GetOutputVolumePercent()); VolumeDown(); EXPECT_GT(kInitVolume, audio_handler_->GetOutputVolumePercent()); } IN_PROC_BROWSER_TEST_F(VolumeControllerTest, VolumeDownToZero) { // Setting to very small volume. audio_handler_->SetOutputVolumePercent(1); VolumeDown(); EXPECT_EQ(0, audio_handler_->GetOutputVolumePercent()); VolumeDown(); EXPECT_EQ(0, audio_handler_->GetOutputVolumePercent()); VolumeUp(); EXPECT_LT(0, audio_handler_->GetOutputVolumePercent()); } IN_PROC_BROWSER_TEST_F(VolumeControllerTest, VolumeUpTo100) { // Setting to almost max audio_handler_->SetOutputVolumePercent(99); VolumeUp(); EXPECT_EQ(100, audio_handler_->GetOutputVolumePercent()); VolumeUp(); EXPECT_EQ(100, audio_handler_->GetOutputVolumePercent()); VolumeDown(); EXPECT_GT(100, audio_handler_->GetOutputVolumePercent()); } IN_PROC_BROWSER_TEST_F(VolumeControllerTest, Mutes) { ASSERT_FALSE(audio_handler_->IsOutputMuted()); const int initial_volume = audio_handler_->GetOutputVolumePercent(); VolumeMute(); EXPECT_TRUE(audio_handler_->IsOutputMuted()); // Further mute buttons doesn't have effects. VolumeMute(); EXPECT_TRUE(audio_handler_->IsOutputMuted()); // Right after the volume up after set_mute recovers to original volume. VolumeUp(); EXPECT_FALSE(audio_handler_->IsOutputMuted()); EXPECT_EQ(initial_volume, audio_handler_->GetOutputVolumePercent()); VolumeMute(); // After the volume down, the volume goes down to zero explicitly. VolumeDown(); EXPECT_TRUE(audio_handler_->IsOutputMuted()); EXPECT_EQ(0, audio_handler_->GetOutputVolumePercent()); // Thus, further VolumeUp doesn't recover the volume, it's just slightly // bigger than 0. VolumeUp(); EXPECT_LT(0, audio_handler_->GetOutputVolumePercent()); EXPECT_GT(initial_volume, audio_handler_->GetOutputVolumePercent()); } class VolumeControllerSoundsTest : public VolumeControllerTest { public: VolumeControllerSoundsTest() : sounds_manager_(NULL) {} virtual ~VolumeControllerSoundsTest() {} virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { sounds_manager_ = new SoundsManagerTestImpl(); media::SoundsManager::InitializeForTesting(sounds_manager_); } virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { VolumeControllerTest::SetUpCommandLine(command_line); command_line->AppendSwitch(ash::switches::kAshEnableSystemSounds); } bool is_sound_initialized() const { return sounds_manager_->is_sound_initialized( chromeos::SOUND_VOLUME_ADJUST); } int num_play_requests() const { return sounds_manager_->num_play_requests(chromeos::SOUND_VOLUME_ADJUST); } private: SoundsManagerTestImpl* sounds_manager_; DISALLOW_COPY_AND_ASSIGN(VolumeControllerSoundsTest); }; IN_PROC_BROWSER_TEST_F(VolumeControllerSoundsTest, VolumeAdjustSounds) { EXPECT_TRUE(is_sound_initialized()); // Check that sound is played on volume up and volume down. audio_handler_->SetOutputVolumePercent(50); VolumeUp(); EXPECT_EQ(1, num_play_requests()); VolumeDown(); EXPECT_EQ(2, num_play_requests()); audio_handler_->SetOutputVolumePercent(99); VolumeUp(); EXPECT_EQ(3, num_play_requests()); audio_handler_->SetOutputVolumePercent(100); VolumeUp(); EXPECT_EQ(3, num_play_requests()); // Check that sound isn't played when audio is muted. audio_handler_->SetOutputVolumePercent(50); VolumeMute(); VolumeDown(); ASSERT_TRUE(audio_handler_->IsOutputMuted()); EXPECT_EQ(3, num_play_requests()); // Check that audio is unmuted and sound is played. VolumeUp(); ASSERT_FALSE(audio_handler_->IsOutputMuted()); EXPECT_EQ(4, num_play_requests()); } class VolumeControllerSoundsDisabledTest : public VolumeControllerSoundsTest { public: VolumeControllerSoundsDisabledTest() {} virtual ~VolumeControllerSoundsDisabledTest() {} virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { VolumeControllerSoundsTest::SetUpCommandLine(command_line); command_line->AppendSwitch(chromeos::switches::kDisableVolumeAdjustSound); } private: DISALLOW_COPY_AND_ASSIGN(VolumeControllerSoundsDisabledTest); }; IN_PROC_BROWSER_TEST_F(VolumeControllerSoundsDisabledTest, VolumeAdjustSounds) { EXPECT_FALSE(is_sound_initialized()); // Check that sound isn't played on volume up and volume down. audio_handler_->SetOutputVolumePercent(50); VolumeUp(); VolumeDown(); EXPECT_EQ(0, num_play_requests()); } } // namespace