| // 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 "chrome/browser/ui/ash/volume_controller_chromeos.h" |
| |
| #include "chrome/browser/chromeos/audio/audio_handler.h" |
| #include "chrome/browser/chromeos/audio/audio_mixer.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| #include "ui/base/accelerators/accelerator.h" |
| |
| namespace { |
| |
| class MockAudioMixer : public chromeos::AudioMixer { |
| public: |
| MockAudioMixer() |
| : volume_(0.0), |
| is_muted_(false) { |
| } |
| |
| virtual void Init() OVERRIDE { |
| } |
| |
| virtual double GetVolumePercent() OVERRIDE { |
| return volume_; |
| } |
| |
| virtual void SetVolumePercent(double percent) OVERRIDE { |
| volume_ = percent; |
| } |
| |
| virtual bool IsMuted() OVERRIDE { |
| return is_muted_; |
| } |
| |
| virtual void SetMuted(bool mute) OVERRIDE { |
| is_muted_ = mute; |
| } |
| |
| bool IsMuteLocked() OVERRIDE { |
| return is_mute_locked_; |
| } |
| |
| void SetMuteLocked(bool locked) OVERRIDE { |
| is_mute_locked_ = locked; |
| } |
| |
| bool IsCaptureMuted() OVERRIDE { |
| return is_capture_muted_; |
| } |
| |
| void SetCaptureMuted(bool mute) OVERRIDE { |
| is_capture_muted_ = mute; |
| } |
| |
| bool IsCaptureMuteLocked() OVERRIDE { |
| return is_capture_mute_locked_; |
| } |
| |
| void SetCaptureMuteLocked(bool locked) OVERRIDE { |
| is_capture_mute_locked_ = locked; |
| } |
| |
| private: |
| double volume_; |
| bool is_muted_; |
| bool is_mute_locked_; |
| bool is_capture_muted_; |
| bool is_capture_mute_locked_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MockAudioMixer); |
| }; |
| |
| // This class has to be browsertest because AudioHandler uses prefs_service. |
| class VolumeControllerTest : public InProcessBrowserTest { |
| public: |
| VolumeControllerTest() {} |
| |
| virtual void SetUpOnMainThread() OVERRIDE { |
| // First we should shutdown the default audio handler. |
| chromeos::AudioHandler::Shutdown(); |
| audio_mixer_ = new MockAudioMixer; |
| chromeos::AudioHandler::InitializeForTesting(audio_mixer_); |
| } |
| |
| virtual void CleanUpOnMainThread() OVERRIDE { |
| chromeos::AudioHandler::Shutdown(); |
| audio_mixer_ = NULL; |
| } |
| |
| protected: |
| void VolumeMute() { |
| volume_controller_.HandleVolumeMute(ui::Accelerator()); |
| } |
| |
| void VolumeUp() { |
| volume_controller_.HandleVolumeUp(ui::Accelerator()); |
| } |
| |
| void VolumeDown() { |
| volume_controller_.HandleVolumeDown(ui::Accelerator()); |
| } |
| |
| MockAudioMixer* audio_mixer() { return audio_mixer_; } |
| |
| private: |
| VolumeController volume_controller_; |
| MockAudioMixer* audio_mixer_; |
| |
| DISALLOW_COPY_AND_ASSIGN(VolumeControllerTest); |
| }; |
| |
| IN_PROC_BROWSER_TEST_F(VolumeControllerTest, VolumeUpAndDown) { |
| // Set initial value as 50% |
| audio_mixer()->SetVolumePercent(50.0); |
| |
| double initial_volume = audio_mixer()->GetVolumePercent(); |
| |
| VolumeUp(); |
| EXPECT_LT(initial_volume, audio_mixer()->GetVolumePercent()); |
| VolumeDown(); |
| EXPECT_DOUBLE_EQ(initial_volume, audio_mixer()->GetVolumePercent()); |
| VolumeDown(); |
| EXPECT_GT(initial_volume, audio_mixer()->GetVolumePercent()); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(VolumeControllerTest, VolumeDownToZero) { |
| // Setting to very small |
| audio_mixer()->SetVolumePercent(0.1); |
| |
| VolumeDown(); |
| EXPECT_DOUBLE_EQ(0.0, audio_mixer()->GetVolumePercent()); |
| VolumeDown(); |
| EXPECT_DOUBLE_EQ(0.0, audio_mixer()->GetVolumePercent()); |
| VolumeUp(); |
| EXPECT_LT(0.0, audio_mixer()->GetVolumePercent()); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(VolumeControllerTest, VolumeUpTo100) { |
| // Setting to almost max |
| audio_mixer()->SetVolumePercent(99.0); |
| |
| VolumeUp(); |
| EXPECT_DOUBLE_EQ(100.0, audio_mixer()->GetVolumePercent()); |
| VolumeUp(); |
| EXPECT_DOUBLE_EQ(100.0, audio_mixer()->GetVolumePercent()); |
| VolumeDown(); |
| EXPECT_GT(100.0, audio_mixer()->GetVolumePercent()); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(VolumeControllerTest, Mutes) { |
| ASSERT_FALSE(audio_mixer()->IsMuted()); |
| double initial_volume = audio_mixer()->GetVolumePercent(); |
| |
| VolumeMute(); |
| EXPECT_TRUE(audio_mixer()->IsMuted()); |
| |
| // Further mute buttons doesn't have effects. |
| VolumeMute(); |
| EXPECT_TRUE(audio_mixer()->IsMuted()); |
| |
| // Right after the volume up after set_mute recovers to original volume. |
| VolumeUp(); |
| EXPECT_FALSE(audio_mixer()->IsMuted()); |
| EXPECT_DOUBLE_EQ(initial_volume, audio_mixer()->GetVolumePercent()); |
| |
| VolumeMute(); |
| // After the volume down, the volume goes down to zero explicitly. |
| VolumeDown(); |
| EXPECT_TRUE(audio_mixer()->IsMuted()); |
| EXPECT_DOUBLE_EQ(0.0, audio_mixer()->GetVolumePercent()); |
| |
| // Thus, further VolumeUp doesn't recover the volume, it's just slightly |
| // bigger than 0. |
| VolumeUp(); |
| EXPECT_LT(0.0, audio_mixer()->GetVolumePercent()); |
| EXPECT_GT(initial_volume, audio_mixer()->GetVolumePercent()); |
| } |
| |
| } // namespace |