15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector>
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ash/accessibility_delegate.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/ash_switches.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/browser_process.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/ash/volume_controller_chromeos.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/audio/chromeos_sounds.h"
16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chromeos/audio/cras_audio_handler.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/chromeos_switches.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/audio/sounds/sounds_manager.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SoundsManagerTestImpl : public media::SoundsManager {
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SoundsManagerTestImpl()
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : is_sound_initialized_(chromeos::SOUND_COUNT),
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      num_play_requests_(chromeos::SOUND_COUNT) {
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~SoundsManagerTestImpl() {}
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool Initialize(SoundKey key,
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          const base::StringPiece& /* data */) OVERRIDE {
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    is_sound_initialized_[key] = true;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool Play(SoundKey key) OVERRIDE {
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ++num_play_requests_[key];
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual base::TimeDelta GetDuration(SoundKey /* key */) OVERRIDE {
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return base::TimeDelta();
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool is_sound_initialized(SoundKey key) const {
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return is_sound_initialized_[key];
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int num_play_requests(SoundKey key) const {
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return num_play_requests_[key];
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<bool> is_sound_initialized_;
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<int> num_play_requests_;
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SoundsManagerTestImpl);
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VolumeControllerTest : public InProcessBrowserTest {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeControllerTest() {}
65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual ~VolumeControllerTest() {}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    volume_controller_.reset(new VolumeController());
69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    audio_handler_ = chromeos::CrasAudioHandler::Get();
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VolumeMute() {
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    volume_controller_->HandleVolumeMute(ui::Accelerator());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VolumeUp() {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    volume_controller_->HandleVolumeUp(ui::Accelerator());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VolumeDown() {
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    volume_controller_->HandleVolumeDown(ui::Accelerator());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  chromeos::CrasAudioHandler* audio_handler_;  // Not owned.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<VolumeController> volume_controller_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VolumeControllerTest);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(VolumeControllerTest, VolumeUpAndDown) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set initial value as 50%
95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const int kInitVolume = 50;
96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  audio_handler_->SetOutputVolumePercent(kInitVolume);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(audio_handler_->GetOutputVolumePercent(), kInitVolume);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeUp();
101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_LT(kInitVolume, audio_handler_->GetOutputVolumePercent());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeDown();
103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(kInitVolume, audio_handler_->GetOutputVolumePercent());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeDown();
105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_GT(kInitVolume, audio_handler_->GetOutputVolumePercent());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(VolumeControllerTest, VolumeDownToZero) {
109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Setting to very small volume.
110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  audio_handler_->SetOutputVolumePercent(1);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeDown();
113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(0, audio_handler_->GetOutputVolumePercent());
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeDown();
115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(0, audio_handler_->GetOutputVolumePercent());
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeUp();
117558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_LT(0, audio_handler_->GetOutputVolumePercent());
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(VolumeControllerTest, VolumeUpTo100) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setting to almost max
122558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  audio_handler_->SetOutputVolumePercent(99);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeUp();
125558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(100, audio_handler_->GetOutputVolumePercent());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeUp();
127558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(100, audio_handler_->GetOutputVolumePercent());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeDown();
129558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_GT(100, audio_handler_->GetOutputVolumePercent());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(VolumeControllerTest, Mutes) {
133558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_FALSE(audio_handler_->IsOutputMuted());
134558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  const int initial_volume = audio_handler_->GetOutputVolumePercent();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeMute();
137558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(audio_handler_->IsOutputMuted());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Further mute buttons doesn't have effects.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeMute();
141558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(audio_handler_->IsOutputMuted());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Right after the volume up after set_mute recovers to original volume.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeUp();
145558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(audio_handler_->IsOutputMuted());
146558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(initial_volume, audio_handler_->GetOutputVolumePercent());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeMute();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // After the volume down, the volume goes down to zero explicitly.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeDown();
151558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_TRUE(audio_handler_->IsOutputMuted());
152558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(0, audio_handler_->GetOutputVolumePercent());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Thus, further VolumeUp doesn't recover the volume, it's just slightly
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bigger than 0.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VolumeUp();
157558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_LT(0, audio_handler_->GetOutputVolumePercent());
158558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_GT(initial_volume, audio_handler_->GetOutputVolumePercent());
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class VolumeControllerSoundsTest : public VolumeControllerTest {
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VolumeControllerSoundsTest() : sounds_manager_(NULL) {}
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~VolumeControllerSoundsTest() {}
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    sounds_manager_ = new SoundsManagerTestImpl();
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    media::SoundsManager::InitializeForTesting(sounds_manager_);
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void EnableSpokenFeedback(bool enabled) {
172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    chromeos::AccessibilityManager* manager =
173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        chromeos::AccessibilityManager::Get();
174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    manager->EnableSpokenFeedback(enabled, ash::A11Y_NOTIFICATION_NONE);
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool is_sound_initialized() const {
178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return sounds_manager_->is_sound_initialized(chromeos::SOUND_VOLUME_ADJUST);
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int num_play_requests() const {
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return sounds_manager_->num_play_requests(chromeos::SOUND_VOLUME_ADJUST);
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SoundsManagerTestImpl* sounds_manager_;
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VolumeControllerSoundsTest);
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
191effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_F(VolumeControllerSoundsTest, Simple) {
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  audio_handler_->SetOutputVolumePercent(50);
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EnableSpokenFeedback(false /* enabled */);
195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  VolumeUp();
196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  VolumeDown();
197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(0, num_play_requests());
198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EnableSpokenFeedback(true /* enabled */);
200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  VolumeUp();
201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  VolumeDown();
202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(2, num_play_requests());
203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
205effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_F(VolumeControllerSoundsTest, EdgeCases) {
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(is_sound_initialized());
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EnableSpokenFeedback(true /* enabled */);
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check that sound is played on volume up and volume down.
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  audio_handler_->SetOutputVolumePercent(50);
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VolumeUp();
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, num_play_requests());
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VolumeDown();
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, num_play_requests());
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  audio_handler_->SetOutputVolumePercent(99);
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VolumeUp();
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3, num_play_requests());
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  audio_handler_->SetOutputVolumePercent(100);
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VolumeUp();
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3, num_play_requests());
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check that sound isn't played when audio is muted.
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  audio_handler_->SetOutputVolumePercent(50);
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VolumeMute();
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VolumeDown();
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(audio_handler_->IsOutputMuted());
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3, num_play_requests());
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check that audio is unmuted and sound is played.
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VolumeUp();
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_FALSE(audio_handler_->IsOutputMuted());
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(4, num_play_requests());
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class VolumeControllerSoundsDisabledTest : public VolumeControllerSoundsTest {
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VolumeControllerSoundsDisabledTest() {}
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~VolumeControllerSoundsDisabledTest() {}
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    VolumeControllerSoundsTest::SetUpCommandLine(command_line);
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    command_line->AppendSwitch(chromeos::switches::kDisableVolumeAdjustSound);
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VolumeControllerSoundsDisabledTest);
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(VolumeControllerSoundsDisabledTest,
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       VolumeAdjustSounds) {
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(is_sound_initialized());
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check that sound isn't played on volume up and volume down.
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  audio_handler_->SetOutputVolumePercent(50);
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VolumeUp();
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  VolumeDown();
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, num_play_requests());
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
263