// 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