Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(352)

Side by Side Diff: content/browser/renderer_host/media/audio_output_device_enumerator_unittest.cc

Issue 1607923002: Correctly handle enumerations for AudioManagers that report only the default audio output device. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2623
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698