1 // Copyright (c) 2012 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 <vector>
6
7 #include "ash/accessibility_delegate.h"
8 #include "ash/ash_switches.h"
9 #include "base/command_line.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "chrome/browser/browser_process.h"
12 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
13 #include "chrome/browser/ui/ash/volume_controller_chromeos.h"
14 #include "chrome/test/base/in_process_browser_test.h"
15 #include "chromeos/audio/chromeos_sounds.h"
16 #include "chromeos/audio/cras_audio_handler.h"
17 #include "chromeos/chromeos_switches.h"
18 #include "media/audio/sounds/sounds_manager.h"
19 #include "ui/base/accelerators/accelerator.h"
20
21 namespace {
22
23 class SoundsManagerTestImpl : public media::SoundsManager {
24 public:
SoundsManagerTestImpl()25 SoundsManagerTestImpl()
26 : is_sound_initialized_(chromeos::SOUND_COUNT),
27 num_play_requests_(chromeos::SOUND_COUNT) {
28 }
29
~SoundsManagerTestImpl()30 virtual ~SoundsManagerTestImpl() {}
31
Initialize(SoundKey key,const base::StringPiece &)32 virtual bool Initialize(SoundKey key,
33 const base::StringPiece& /* data */) OVERRIDE {
34 is_sound_initialized_[key] = true;
35 return true;
36 }
37
Play(SoundKey key)38 virtual bool Play(SoundKey key) OVERRIDE {
39 ++num_play_requests_[key];
40 return true;
41 }
42
GetDuration(SoundKey)43 virtual base::TimeDelta GetDuration(SoundKey /* key */) OVERRIDE {
44 return base::TimeDelta();
45 }
46
is_sound_initialized(SoundKey key) const47 bool is_sound_initialized(SoundKey key) const {
48 return is_sound_initialized_[key];
49 }
50
num_play_requests(SoundKey key) const51 int num_play_requests(SoundKey key) const {
52 return num_play_requests_[key];
53 }
54
55 private:
56 std::vector<bool> is_sound_initialized_;
57 std::vector<int> num_play_requests_;
58
59 DISALLOW_COPY_AND_ASSIGN(SoundsManagerTestImpl);
60 };
61
62 class VolumeControllerTest : public InProcessBrowserTest {
63 public:
VolumeControllerTest()64 VolumeControllerTest() {}
~VolumeControllerTest()65 virtual ~VolumeControllerTest() {}
66
SetUpOnMainThread()67 virtual void SetUpOnMainThread() OVERRIDE {
68 volume_controller_.reset(new VolumeController());
69 audio_handler_ = chromeos::CrasAudioHandler::Get();
70 }
71
72 protected:
VolumeMute()73 void VolumeMute() {
74 volume_controller_->HandleVolumeMute(ui::Accelerator());
75 }
76
VolumeUp()77 void VolumeUp() {
78 volume_controller_->HandleVolumeUp(ui::Accelerator());
79 }
80
VolumeDown()81 void VolumeDown() {
82 volume_controller_->HandleVolumeDown(ui::Accelerator());
83 }
84
85 chromeos::CrasAudioHandler* audio_handler_; // Not owned.
86
87 private:
88 scoped_ptr<VolumeController> volume_controller_;
89
90 DISALLOW_COPY_AND_ASSIGN(VolumeControllerTest);
91 };
92
IN_PROC_BROWSER_TEST_F(VolumeControllerTest,VolumeUpAndDown)93 IN_PROC_BROWSER_TEST_F(VolumeControllerTest, VolumeUpAndDown) {
94 // Set initial value as 50%
95 const int kInitVolume = 50;
96 audio_handler_->SetOutputVolumePercent(kInitVolume);
97
98 EXPECT_EQ(audio_handler_->GetOutputVolumePercent(), kInitVolume);
99
100 VolumeUp();
101 EXPECT_LT(kInitVolume, audio_handler_->GetOutputVolumePercent());
102 VolumeDown();
103 EXPECT_EQ(kInitVolume, audio_handler_->GetOutputVolumePercent());
104 VolumeDown();
105 EXPECT_GT(kInitVolume, audio_handler_->GetOutputVolumePercent());
106 }
107
IN_PROC_BROWSER_TEST_F(VolumeControllerTest,VolumeDownToZero)108 IN_PROC_BROWSER_TEST_F(VolumeControllerTest, VolumeDownToZero) {
109 // Setting to very small volume.
110 audio_handler_->SetOutputVolumePercent(1);
111
112 VolumeDown();
113 EXPECT_EQ(0, audio_handler_->GetOutputVolumePercent());
114 VolumeDown();
115 EXPECT_EQ(0, audio_handler_->GetOutputVolumePercent());
116 VolumeUp();
117 EXPECT_LT(0, audio_handler_->GetOutputVolumePercent());
118 }
119
IN_PROC_BROWSER_TEST_F(VolumeControllerTest,VolumeUpTo100)120 IN_PROC_BROWSER_TEST_F(VolumeControllerTest, VolumeUpTo100) {
121 // Setting to almost max
122 audio_handler_->SetOutputVolumePercent(99);
123
124 VolumeUp();
125 EXPECT_EQ(100, audio_handler_->GetOutputVolumePercent());
126 VolumeUp();
127 EXPECT_EQ(100, audio_handler_->GetOutputVolumePercent());
128 VolumeDown();
129 EXPECT_GT(100, audio_handler_->GetOutputVolumePercent());
130 }
131
IN_PROC_BROWSER_TEST_F(VolumeControllerTest,Mutes)132 IN_PROC_BROWSER_TEST_F(VolumeControllerTest, Mutes) {
133 ASSERT_FALSE(audio_handler_->IsOutputMuted());
134 const int initial_volume = audio_handler_->GetOutputVolumePercent();
135
136 VolumeMute();
137 EXPECT_TRUE(audio_handler_->IsOutputMuted());
138
139 // Further mute buttons doesn't have effects.
140 VolumeMute();
141 EXPECT_TRUE(audio_handler_->IsOutputMuted());
142
143 // Right after the volume up after set_mute recovers to original volume.
144 VolumeUp();
145 EXPECT_FALSE(audio_handler_->IsOutputMuted());
146 EXPECT_EQ(initial_volume, audio_handler_->GetOutputVolumePercent());
147
148 VolumeMute();
149 // After the volume down, the volume goes down to zero explicitly.
150 VolumeDown();
151 EXPECT_TRUE(audio_handler_->IsOutputMuted());
152 EXPECT_EQ(0, audio_handler_->GetOutputVolumePercent());
153
154 // Thus, further VolumeUp doesn't recover the volume, it's just slightly
155 // bigger than 0.
156 VolumeUp();
157 EXPECT_LT(0, audio_handler_->GetOutputVolumePercent());
158 EXPECT_GT(initial_volume, audio_handler_->GetOutputVolumePercent());
159 }
160
161 class VolumeControllerSoundsTest : public VolumeControllerTest {
162 public:
VolumeControllerSoundsTest()163 VolumeControllerSoundsTest() : sounds_manager_(NULL) {}
~VolumeControllerSoundsTest()164 virtual ~VolumeControllerSoundsTest() {}
165
SetUpInProcessBrowserTestFixture()166 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
167 sounds_manager_ = new SoundsManagerTestImpl();
168 media::SoundsManager::InitializeForTesting(sounds_manager_);
169 }
170
EnableSpokenFeedback(bool enabled)171 void EnableSpokenFeedback(bool enabled) {
172 chromeos::AccessibilityManager* manager =
173 chromeos::AccessibilityManager::Get();
174 manager->EnableSpokenFeedback(enabled, ash::A11Y_NOTIFICATION_NONE);
175 }
176
is_sound_initialized() const177 bool is_sound_initialized() const {
178 return sounds_manager_->is_sound_initialized(chromeos::SOUND_VOLUME_ADJUST);
179 }
180
num_play_requests() const181 int num_play_requests() const {
182 return sounds_manager_->num_play_requests(chromeos::SOUND_VOLUME_ADJUST);
183 }
184
185 private:
186 SoundsManagerTestImpl* sounds_manager_;
187
188 DISALLOW_COPY_AND_ASSIGN(VolumeControllerSoundsTest);
189 };
190
IN_PROC_BROWSER_TEST_F(VolumeControllerSoundsTest,Simple)191 IN_PROC_BROWSER_TEST_F(VolumeControllerSoundsTest, Simple) {
192 audio_handler_->SetOutputVolumePercent(50);
193
194 EnableSpokenFeedback(false /* enabled */);
195 VolumeUp();
196 VolumeDown();
197 EXPECT_EQ(0, num_play_requests());
198
199 EnableSpokenFeedback(true /* enabled */);
200 VolumeUp();
201 VolumeDown();
202 EXPECT_EQ(2, num_play_requests());
203 }
204
IN_PROC_BROWSER_TEST_F(VolumeControllerSoundsTest,EdgeCases)205 IN_PROC_BROWSER_TEST_F(VolumeControllerSoundsTest, EdgeCases) {
206 EXPECT_TRUE(is_sound_initialized());
207 EnableSpokenFeedback(true /* enabled */);
208
209 // Check that sound is played on volume up and volume down.
210 audio_handler_->SetOutputVolumePercent(50);
211 VolumeUp();
212 EXPECT_EQ(1, num_play_requests());
213 VolumeDown();
214 EXPECT_EQ(2, num_play_requests());
215
216 audio_handler_->SetOutputVolumePercent(99);
217 VolumeUp();
218 EXPECT_EQ(3, num_play_requests());
219
220 audio_handler_->SetOutputVolumePercent(100);
221 VolumeUp();
222 EXPECT_EQ(3, num_play_requests());
223
224 // Check that sound isn't played when audio is muted.
225 audio_handler_->SetOutputVolumePercent(50);
226 VolumeMute();
227 VolumeDown();
228 ASSERT_TRUE(audio_handler_->IsOutputMuted());
229 EXPECT_EQ(3, num_play_requests());
230
231 // Check that audio is unmuted and sound is played.
232 VolumeUp();
233 ASSERT_FALSE(audio_handler_->IsOutputMuted());
234 EXPECT_EQ(4, num_play_requests());
235 }
236
237 class VolumeControllerSoundsDisabledTest : public VolumeControllerSoundsTest {
238 public:
VolumeControllerSoundsDisabledTest()239 VolumeControllerSoundsDisabledTest() {}
~VolumeControllerSoundsDisabledTest()240 virtual ~VolumeControllerSoundsDisabledTest() {}
241
SetUpCommandLine(CommandLine * command_line)242 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
243 VolumeControllerSoundsTest::SetUpCommandLine(command_line);
244 command_line->AppendSwitch(chromeos::switches::kDisableVolumeAdjustSound);
245 }
246
247 private:
248 DISALLOW_COPY_AND_ASSIGN(VolumeControllerSoundsDisabledTest);
249 };
250
IN_PROC_BROWSER_TEST_F(VolumeControllerSoundsDisabledTest,VolumeAdjustSounds)251 IN_PROC_BROWSER_TEST_F(VolumeControllerSoundsDisabledTest,
252 VolumeAdjustSounds) {
253 EXPECT_FALSE(is_sound_initialized());
254
255 // Check that sound isn't played on volume up and volume down.
256 audio_handler_->SetOutputVolumePercent(50);
257 VolumeUp();
258 VolumeDown();
259 EXPECT_EQ(0, num_play_requests());
260 }
261
262 } // namespace
263