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 |