| OLD | NEW |
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/location.h" | 8 #include "base/location.h" |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| 11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
| 12 #include "base/run_loop.h" | 12 #include "base/run_loop.h" |
| 13 #include "base/single_thread_task_runner.h" | 13 #include "base/single_thread_task_runner.h" |
| 14 #include "base/strings/string_number_conversions.h" |
| 14 #include "base/thread_task_runner_handle.h" | 15 #include "base/thread_task_runner_handle.h" |
| 15 #include "content/browser/renderer_host/media/audio_output_device_enumerator.h" | 16 #include "content/browser/renderer_host/media/audio_output_device_enumerator.h" |
| 16 #include "content/public/test/test_browser_thread_bundle.h" | 17 #include "content/public/test/test_browser_thread_bundle.h" |
| 17 #include "media/audio/audio_manager_base.h" | 18 #include "media/audio/audio_manager_base.h" |
| 18 #include "media/audio/fake_audio_log_factory.h" | 19 #include "media/audio/fake_audio_log_factory.h" |
| 19 #include "media/audio/fake_audio_manager.h" | 20 #include "media/audio/fake_audio_manager.h" |
| 20 #include "testing/gmock/include/gmock/gmock.h" | 21 #include "testing/gmock/include/gmock/gmock.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 22 | 23 |
| 23 using testing::_; | 24 using testing::_; |
| 24 | 25 |
| 25 namespace content { | 26 namespace content { |
| 26 | 27 |
| 27 namespace { | 28 namespace { |
| 29 |
| 28 class MockAudioManager : public media::FakeAudioManager { | 30 class MockAudioManager : public media::FakeAudioManager { |
| 29 public: | 31 public: |
| 30 MockAudioManager() : FakeAudioManager(&fake_audio_log_factory_) {} | 32 MockAudioManager(size_t num_devices) |
| 33 : FakeAudioManager(&fake_audio_log_factory_), num_devices_(num_devices) {} |
| 34 MockAudioManager() : MockAudioManager(0) {} |
| 31 ~MockAudioManager() override {} | 35 ~MockAudioManager() override {} |
| 32 MOCK_METHOD1(GetAudioOutputDeviceNames, void(media::AudioDeviceNames*)); | 36 |
| 37 MOCK_METHOD1(MockGetAudioOutputDeviceNames, void(media::AudioDeviceNames*)); |
| 38 |
| 39 void GetAudioOutputDeviceNames( |
| 40 media::AudioDeviceNames* device_names) override { |
| 41 DCHECK(device_names->empty()); |
| 42 MockGetAudioOutputDeviceNames(device_names); |
| 43 if (num_devices_ > 0) { |
| 44 device_names->push_back( |
| 45 media::AudioDeviceName(AudioManager::GetDefaultDeviceName(), |
| 46 AudioManagerBase::kDefaultDeviceId)); |
| 47 for (size_t i = 0; i < num_devices_; i++) { |
| 48 device_names->push_back( |
| 49 media::AudioDeviceName("FakeDeviceName_" + base::IntToString(i), |
| 50 "FakeDeviceId_" + base::IntToString(i))); |
| 51 } |
| 52 } |
| 53 } |
| 33 | 54 |
| 34 private: | 55 private: |
| 35 media::FakeAudioLogFactory fake_audio_log_factory_; | 56 media::FakeAudioLogFactory fake_audio_log_factory_; |
| 57 size_t num_devices_; |
| 36 DISALLOW_COPY_AND_ASSIGN(MockAudioManager); | 58 DISALLOW_COPY_AND_ASSIGN(MockAudioManager); |
| 37 }; | 59 }; |
| 60 |
| 61 // Fake audio manager that exposes only the default device |
| 62 class OnlyDefaultDeviceAudioManager : public MockAudioManager { |
| 63 public: |
| 64 OnlyDefaultDeviceAudioManager() {} |
| 65 ~OnlyDefaultDeviceAudioManager() override {} |
| 66 void GetAudioOutputDeviceNames( |
| 67 media::AudioDeviceNames* device_names) override { |
| 68 DCHECK(device_names->empty()); |
| 69 MockGetAudioOutputDeviceNames(device_names); |
| 70 device_names->push_front( |
| 71 media::AudioDeviceName(AudioManager::GetDefaultDeviceName(), |
| 72 AudioManagerBase::kDefaultDeviceId)); |
| 73 } |
| 74 |
| 75 private: |
| 76 DISALLOW_COPY_AND_ASSIGN(OnlyDefaultDeviceAudioManager); |
| 77 }; |
| 78 |
| 38 } // namespace | 79 } // namespace |
| 39 | 80 |
| 40 class AudioOutputDeviceEnumeratorTest : public ::testing::Test { | 81 class AudioOutputDeviceEnumeratorTest : public ::testing::Test { |
| 41 public: | 82 public: |
| 42 AudioOutputDeviceEnumeratorTest() | 83 AudioOutputDeviceEnumeratorTest() |
| 43 : thread_bundle_(), task_runner_(base::ThreadTaskRunnerHandle::Get()) { | 84 : thread_bundle_(), task_runner_(base::ThreadTaskRunnerHandle::Get()) {} |
| 44 audio_manager_.reset(new MockAudioManager()); | |
| 45 } | |
| 46 | 85 |
| 47 ~AudioOutputDeviceEnumeratorTest() override {} | 86 ~AudioOutputDeviceEnumeratorTest() override {} |
| 48 | 87 |
| 49 MOCK_METHOD1(MockCallback, void(const AudioOutputDeviceEnumeration&)); | 88 MOCK_METHOD1(MockCallback, void(const AudioOutputDeviceEnumeration&)); |
| 50 | 89 |
| 51 // Performs n calls to MockCallback (one by QuitCallback) | 90 // Performs n calls to MockCallback (one by QuitCallback) |
| 52 // and n-1 calls to Enumerate | 91 // and n-1 calls to Enumerate |
| 53 void EnumerateCallback(AudioOutputDeviceEnumerator* enumerator, | 92 void EnumerateCallback(AudioOutputDeviceEnumerator* enumerator, |
| 54 int n, | 93 int n, |
| 55 const AudioOutputDeviceEnumeration& result) { | 94 const AudioOutputDeviceEnumeration& result) { |
| 56 MockCallback(result); | 95 MockCallback(result); |
| 57 if (n > 1) { | 96 if (n > 1) { |
| 58 enumerator->Enumerate( | 97 enumerator->Enumerate( |
| 59 base::Bind(&AudioOutputDeviceEnumeratorTest::EnumerateCallback, | 98 base::Bind(&AudioOutputDeviceEnumeratorTest::EnumerateCallback, |
| 60 base::Unretained(this), enumerator, n - 1)); | 99 base::Unretained(this), enumerator, n - 1)); |
| 61 } else { | 100 } else { |
| 62 enumerator->Enumerate( | 101 enumerator->Enumerate( |
| 63 base::Bind(&AudioOutputDeviceEnumeratorTest::QuitCallback, | 102 base::Bind(&AudioOutputDeviceEnumeratorTest::QuitCallback, |
| 64 base::Unretained(this))); | 103 base::Unretained(this))); |
| 65 } | 104 } |
| 66 } | 105 } |
| 67 | 106 |
| 107 void EnumerateCountCallback(size_t num_entries_expected, |
| 108 bool actual_devices_expected, |
| 109 const AudioOutputDeviceEnumeration& result) { |
| 110 EXPECT_EQ(actual_devices_expected, result.has_actual_devices); |
| 111 EXPECT_EQ(num_entries_expected, result.devices.size()); |
| 112 task_runner_->PostTask(FROM_HERE, run_loop_.QuitClosure()); |
| 113 } |
| 114 |
| 68 void QuitCallback(const AudioOutputDeviceEnumeration& result) { | 115 void QuitCallback(const AudioOutputDeviceEnumeration& result) { |
| 69 MockCallback(result); | 116 MockCallback(result); |
| 70 task_runner_->PostTask(FROM_HERE, run_loop_.QuitClosure()); | 117 task_runner_->PostTask(FROM_HERE, run_loop_.QuitClosure()); |
| 71 } | 118 } |
| 72 | 119 |
| 73 protected: | 120 protected: |
| 74 scoped_ptr<MockAudioManager> audio_manager_; | 121 scoped_ptr<MockAudioManager> audio_manager_; |
| 75 TestBrowserThreadBundle thread_bundle_; | 122 TestBrowserThreadBundle thread_bundle_; |
| 76 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 123 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
| 77 base::RunLoop run_loop_; | 124 base::RunLoop run_loop_; |
| 78 | 125 |
| 79 private: | 126 private: |
| 80 DISALLOW_COPY_AND_ASSIGN(AudioOutputDeviceEnumeratorTest); | 127 DISALLOW_COPY_AND_ASSIGN(AudioOutputDeviceEnumeratorTest); |
| 81 }; | 128 }; |
| 82 | 129 |
| 83 TEST_F(AudioOutputDeviceEnumeratorTest, EnumerateWithCache) { | 130 TEST_F(AudioOutputDeviceEnumeratorTest, EnumerateWithCache) { |
| 84 const int num_calls = 10; | 131 const int num_calls = 10; |
| 85 EXPECT_CALL(*audio_manager_, GetAudioOutputDeviceNames(_)).Times(1); | 132 audio_manager_.reset(new MockAudioManager()); |
| 133 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(1); |
| 86 EXPECT_CALL(*this, MockCallback(_)).Times(num_calls); | 134 EXPECT_CALL(*this, MockCallback(_)).Times(num_calls); |
| 87 AudioOutputDeviceEnumerator enumerator( | 135 AudioOutputDeviceEnumerator enumerator( |
| 88 audio_manager_.get(), | 136 audio_manager_.get(), |
| 89 AudioOutputDeviceEnumerator::CACHE_POLICY_MANUAL_INVALIDATION); | 137 AudioOutputDeviceEnumerator::CACHE_POLICY_MANUAL_INVALIDATION); |
| 90 enumerator.Enumerate( | 138 enumerator.Enumerate( |
| 91 base::Bind(&AudioOutputDeviceEnumeratorTest::EnumerateCallback, | 139 base::Bind(&AudioOutputDeviceEnumeratorTest::EnumerateCallback, |
| 92 base::Unretained(this), &enumerator, num_calls - 1)); | 140 base::Unretained(this), &enumerator, num_calls - 1)); |
| 93 run_loop_.Run(); | 141 run_loop_.Run(); |
| 94 } | 142 } |
| 95 | 143 |
| 96 TEST_F(AudioOutputDeviceEnumeratorTest, EnumerateWithNoCache) { | 144 TEST_F(AudioOutputDeviceEnumeratorTest, EnumerateWithNoCache) { |
| 97 const int num_calls = 10; | 145 const int num_calls = 10; |
| 98 EXPECT_CALL(*audio_manager_, GetAudioOutputDeviceNames(_)).Times(num_calls); | 146 audio_manager_.reset(new MockAudioManager()); |
| 147 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)) |
| 148 .Times(num_calls); |
| 99 EXPECT_CALL(*this, MockCallback(_)).Times(num_calls); | 149 EXPECT_CALL(*this, MockCallback(_)).Times(num_calls); |
| 100 AudioOutputDeviceEnumerator enumerator( | 150 AudioOutputDeviceEnumerator enumerator( |
| 101 audio_manager_.get(), | 151 audio_manager_.get(), |
| 102 AudioOutputDeviceEnumerator::CACHE_POLICY_NO_CACHING); | 152 AudioOutputDeviceEnumerator::CACHE_POLICY_NO_CACHING); |
| 103 enumerator.Enumerate( | 153 enumerator.Enumerate( |
| 104 base::Bind(&AudioOutputDeviceEnumeratorTest::EnumerateCallback, | 154 base::Bind(&AudioOutputDeviceEnumeratorTest::EnumerateCallback, |
| 105 base::Unretained(this), &enumerator, num_calls - 1)); | 155 base::Unretained(this), &enumerator, num_calls - 1)); |
| 106 run_loop_.Run(); | 156 run_loop_.Run(); |
| 107 } | 157 } |
| 108 | 158 |
| 159 TEST_F(AudioOutputDeviceEnumeratorTest, EnumerateNoDevices) { |
| 160 audio_manager_.reset(new MockAudioManager()); |
| 161 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)); |
| 162 AudioOutputDeviceEnumerator enumerator( |
| 163 audio_manager_.get(), |
| 164 AudioOutputDeviceEnumerator::CACHE_POLICY_NO_CACHING); |
| 165 enumerator.Enumerate( |
| 166 base::Bind(&AudioOutputDeviceEnumeratorTest::EnumerateCountCallback, |
| 167 base::Unretained(this), 1, false)); |
| 168 run_loop_.Run(); |
| 169 } |
| 170 |
| 171 TEST_F(AudioOutputDeviceEnumeratorTest, EnumerateOnlyDefaultDevice) { |
| 172 audio_manager_.reset(new OnlyDefaultDeviceAudioManager()); |
| 173 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)); |
| 174 AudioOutputDeviceEnumerator enumerator( |
| 175 audio_manager_.get(), |
| 176 AudioOutputDeviceEnumerator::CACHE_POLICY_NO_CACHING); |
| 177 enumerator.Enumerate( |
| 178 base::Bind(&AudioOutputDeviceEnumeratorTest::EnumerateCountCallback, |
| 179 base::Unretained(this), 1, true)); |
| 180 run_loop_.Run(); |
| 181 } |
| 182 |
| 183 TEST_F(AudioOutputDeviceEnumeratorTest, EnumerateOneDevice) { |
| 184 size_t num_devices = 1; |
| 185 audio_manager_.reset(new MockAudioManager(num_devices)); |
| 186 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)); |
| 187 AudioOutputDeviceEnumerator enumerator( |
| 188 audio_manager_.get(), |
| 189 AudioOutputDeviceEnumerator::CACHE_POLICY_NO_CACHING); |
| 190 enumerator.Enumerate( |
| 191 base::Bind(&AudioOutputDeviceEnumeratorTest::EnumerateCountCallback, |
| 192 base::Unretained(this), num_devices + 1, true)); |
| 193 run_loop_.Run(); |
| 194 } |
| 195 |
| 196 TEST_F(AudioOutputDeviceEnumeratorTest, EnumerateMultipleDevices) { |
| 197 size_t num_devices = 5; |
| 198 audio_manager_.reset(new MockAudioManager(num_devices)); |
| 199 EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)); |
| 200 AudioOutputDeviceEnumerator enumerator( |
| 201 audio_manager_.get(), |
| 202 AudioOutputDeviceEnumerator::CACHE_POLICY_NO_CACHING); |
| 203 enumerator.Enumerate( |
| 204 base::Bind(&AudioOutputDeviceEnumeratorTest::EnumerateCountCallback, |
| 205 base::Unretained(this), num_devices + 1, true)); |
| 206 run_loop_.Run(); |
| 207 } |
| 208 |
| 109 } // namespace content | 209 } // namespace content |
| OLD | NEW |