OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "content/browser/renderer_host/media/audio_output_delegate.h" | 5 #include "content/browser/renderer_host/media/audio_output_delegate.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
11 | 11 |
12 #include "base/bind.h" | 12 #include "base/bind.h" |
13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
14 #include "base/message_loop/message_loop.h" | 14 #include "base/message_loop/message_loop.h" |
15 #include "base/run_loop.h" | 15 #include "base/run_loop.h" |
16 #include "content/browser/audio_manager_thread.h" | 16 #include "content/browser/audio_manager_thread.h" |
17 #include "content/browser/media/capture/audio_mirroring_manager.h" | 17 #include "content/browser/media/capture/audio_mirroring_manager.h" |
18 #include "content/browser/renderer_host/media/media_stream_manager.h" | 18 #include "content/browser/renderer_host/media/media_stream_manager.h" |
19 #include "content/public/browser/browser_thread.h" | 19 #include "content/public/browser/browser_thread.h" |
20 #include "content/public/browser/media_observer.h" | 20 #include "content/public/browser/media_observer.h" |
21 #include "content/public/test/test_browser_thread_bundle.h" | 21 #include "content/public/test/test_browser_thread_bundle.h" |
| 22 #include "content/test/mock_audio_stream_registry.h" |
22 #include "media/audio/fake_audio_log_factory.h" | 23 #include "media/audio/fake_audio_log_factory.h" |
23 #include "media/audio/fake_audio_manager.h" | 24 #include "media/audio/fake_audio_manager.h" |
24 #include "media/base/media_switches.h" | 25 #include "media/base/media_switches.h" |
25 #include "testing/gmock/include/gmock/gmock.h" | 26 #include "testing/gmock/include/gmock/gmock.h" |
26 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
27 | 28 |
28 using ::testing::_; | 29 using ::testing::_; |
29 using ::testing::InSequence; | 30 using ::testing::InSequence; |
30 using ::testing::NotNull; | 31 using ::testing::NotNull; |
31 using ::testing::StrictMock; | 32 using ::testing::StrictMock; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 int page_request_id, | 70 int page_request_id, |
70 MediaStreamType stream_type, | 71 MediaStreamType stream_type, |
71 bool is_secure) override {} | 72 bool is_secure) override {} |
72 | 73 |
73 MOCK_METHOD2(OnCreatingAudioStream, | 74 MOCK_METHOD2(OnCreatingAudioStream, |
74 void(int render_process_id, int render_frame_id)); | 75 void(int render_process_id, int render_frame_id)); |
75 }; | 76 }; |
76 | 77 |
77 class MockEventHandler : public AudioOutputDelegate::EventHandler { | 78 class MockEventHandler : public AudioOutputDelegate::EventHandler { |
78 public: | 79 public: |
79 MOCK_METHOD1(OnStreamStateChanged, void(bool playing)); | |
80 MOCK_METHOD3(OnStreamCreated, | 80 MOCK_METHOD3(OnStreamCreated, |
81 void(int stream_id, | 81 void(int stream_id, |
82 base::SharedMemory* shared_memory, | 82 base::SharedMemory* shared_memory, |
83 base::CancelableSyncSocket* socket)); | 83 base::CancelableSyncSocket* socket)); |
84 MOCK_METHOD1(OnStreamError, void(int stream_id)); | 84 MOCK_METHOD1(OnStreamError, void(int stream_id)); |
85 }; | 85 }; |
86 | 86 |
87 class DummyAudioOutputStream : public media::AudioOutputStream { | 87 class DummyAudioOutputStream : public media::AudioOutputStream { |
88 public: | 88 public: |
89 // AudioOutputSteam implementation: | 89 // AudioOutputSteam implementation: |
90 bool Open() override { return true; } | 90 bool Open() override { return true; } |
91 void Start(AudioSourceCallback* cb) override {} | 91 void Start(AudioSourceCallback* cb) override {} |
92 void Stop() override {} | 92 void Stop() override {} |
93 void SetVolume(double volume) override {} | 93 void SetVolume(double volume) override {} |
94 void GetVolume(double* volume) override { *volume = 1; } | 94 void GetVolume(double* volume) override { *volume = 1; } |
95 void Close() override {} | 95 void Close() override {} |
96 }; | 96 }; |
97 | 97 |
98 } // namespace | 98 } // namespace |
99 | 99 |
100 class AudioOutputDelegateTest : public testing::Test { | 100 class AudioOutputDelegateTest : public testing::Test { |
101 public: | 101 public: |
102 AudioOutputDelegateTest() { | 102 AudioOutputDelegateTest() |
| 103 : stream_registry_(new MockAudioStreamRegistry(kRenderProcessId)) { |
103 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 104 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
104 switches::kUseFakeDeviceForMediaStream); | 105 switches::kUseFakeDeviceForMediaStream); |
105 | 106 |
106 // This test uses real UI, IO and audio threads. | 107 // This test uses real UI, IO and audio threads. |
107 // AudioOutputDelegate mainly interacts with the IO and audio threads, | 108 // AudioOutputDelegate mainly interacts with the IO and audio threads, |
108 // but interacts with UI for bad messages, so using these threads should | 109 // but interacts with UI for bad messages, so using these threads should |
109 // approximate the real conditions of AudioOutputDelegate well. | 110 // approximate the real conditions of AudioOutputDelegate well. |
110 thread_bundle_ = base::MakeUnique<TestBrowserThreadBundle>( | 111 thread_bundle_ = base::MakeUnique<TestBrowserThreadBundle>( |
111 TestBrowserThreadBundle::Options::REAL_IO_THREAD); | 112 TestBrowserThreadBundle::Options::REAL_IO_THREAD); |
112 audio_thread_ = base::MakeUnique<AudioManagerThread>(); | 113 audio_thread_ = base::MakeUnique<AudioManagerThread>(); |
113 | 114 |
114 audio_manager_.reset(new media::FakeAudioManager( | 115 audio_manager_.reset(new media::FakeAudioManager( |
115 audio_thread_->task_runner(), audio_thread_->worker_task_runner(), | 116 audio_thread_->task_runner(), audio_thread_->worker_task_runner(), |
116 &log_factory_)); | 117 &log_factory_)); |
117 media_stream_manager_ = | 118 media_stream_manager_ = |
118 base::MakeUnique<MediaStreamManager>(audio_manager_.get()); | 119 base::MakeUnique<MediaStreamManager>(audio_manager_.get()); |
119 } | 120 } |
120 | 121 |
| 122 ~AudioOutputDelegateTest() override { |
| 123 stream_registry_.reset(); |
| 124 BrowserThread::PostTask( |
| 125 BrowserThread::IO, FROM_HERE, base::Bind([]() { |
| 126 AudioStreamRegistryImpl:: |
| 127 DetachAudioStreamsTrackerFromThreadForTesting(); |
| 128 })); |
| 129 } |
| 130 |
121 // Test bodies are here, so that we can run them on the IO thread. | 131 // Test bodies are here, so that we can run them on the IO thread. |
122 void CreateTest(base::Closure done) { | 132 void CreateTest(base::Closure done) { |
123 EXPECT_CALL(media_observer_, | 133 EXPECT_CALL(media_observer_, |
124 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | 134 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); |
125 EXPECT_CALL(event_handler_, | 135 EXPECT_CALL(event_handler_, |
126 OnStreamCreated(kStreamId, NotNull(), NotNull())); | 136 OnStreamCreated(kStreamId, NotNull(), NotNull())); |
127 EXPECT_CALL(mirroring_manager_, | 137 EXPECT_CALL(mirroring_manager_, |
128 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | 138 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); |
| 139 EXPECT_CALL(*stream_registry_, RegisterOutputStream(NotNull())); |
129 | 140 |
130 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | 141 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( |
131 &event_handler_, audio_manager_.get(), | 142 &event_handler_, stream_registry_.get(), audio_manager_.get(), |
132 log_factory_.CreateAudioLog( | 143 log_factory_.CreateAudioLog( |
133 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | 144 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), |
134 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | 145 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, |
135 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | 146 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), |
136 kDefaultDeviceId); | 147 kDefaultDeviceId); |
137 | 148 |
138 SyncWithAllThreads(); | 149 SyncWithAllThreads(); |
139 | 150 |
140 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | 151 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); |
| 152 EXPECT_CALL(*stream_registry_, DeregisterOutputStream(NotNull())); |
141 delegate.reset(); | 153 delegate.reset(); |
142 SyncWithAllThreads(); | 154 SyncWithAllThreads(); |
143 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | 155 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); |
144 } | 156 } |
145 | 157 |
146 void PlayTest(base::Closure done) { | 158 void PlayTest(base::Closure done) { |
147 EXPECT_CALL(media_observer_, | 159 EXPECT_CALL(media_observer_, |
148 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | 160 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); |
149 EXPECT_CALL(event_handler_, | 161 EXPECT_CALL(event_handler_, |
150 OnStreamCreated(kStreamId, NotNull(), NotNull())); | 162 OnStreamCreated(kStreamId, NotNull(), NotNull())); |
151 EXPECT_CALL(mirroring_manager_, | 163 EXPECT_CALL(mirroring_manager_, |
152 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | 164 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); |
| 165 EXPECT_CALL(*stream_registry_, RegisterOutputStream(NotNull())); |
153 { | 166 { |
154 InSequence s; | 167 InSequence s; |
155 EXPECT_CALL(event_handler_, OnStreamStateChanged(true)); | 168 EXPECT_CALL(*stream_registry_, OutputStreamStateChanged(NotNull(), true)); |
156 EXPECT_CALL(event_handler_, OnStreamStateChanged(false)); | 169 EXPECT_CALL(*stream_registry_, |
| 170 OutputStreamStateChanged(NotNull(), false)); |
157 } | 171 } |
158 | 172 |
159 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | 173 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( |
160 &event_handler_, audio_manager_.get(), | 174 &event_handler_, stream_registry_.get(), audio_manager_.get(), |
161 log_factory_.CreateAudioLog( | 175 log_factory_.CreateAudioLog( |
162 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | 176 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), |
163 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | 177 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, |
164 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | 178 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), |
165 kDefaultDeviceId); | 179 kDefaultDeviceId); |
166 | 180 |
167 delegate->OnPlayStream(); | 181 delegate->OnPlayStream(); |
168 | 182 |
169 SyncWithAllThreads(); | 183 SyncWithAllThreads(); |
170 | 184 |
171 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | 185 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); |
| 186 EXPECT_CALL(*stream_registry_, DeregisterOutputStream(NotNull())); |
172 delegate.reset(); | 187 delegate.reset(); |
173 SyncWithAllThreads(); | 188 SyncWithAllThreads(); |
174 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | 189 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); |
175 } | 190 } |
176 | 191 |
177 void PauseTest(base::Closure done) { | 192 void PauseTest(base::Closure done) { |
178 EXPECT_CALL(media_observer_, | 193 EXPECT_CALL(media_observer_, |
179 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | 194 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); |
180 EXPECT_CALL(event_handler_, | 195 EXPECT_CALL(event_handler_, |
181 OnStreamCreated(kStreamId, NotNull(), NotNull())); | 196 OnStreamCreated(kStreamId, NotNull(), NotNull())); |
182 EXPECT_CALL(mirroring_manager_, | 197 EXPECT_CALL(mirroring_manager_, |
183 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | 198 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); |
| 199 EXPECT_CALL(*stream_registry_, RegisterOutputStream(NotNull())); |
184 | 200 |
185 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | 201 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( |
186 &event_handler_, audio_manager_.get(), | 202 &event_handler_, stream_registry_.get(), audio_manager_.get(), |
187 log_factory_.CreateAudioLog( | 203 log_factory_.CreateAudioLog( |
188 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | 204 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), |
189 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | 205 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, |
190 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | 206 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), |
191 kDefaultDeviceId); | 207 kDefaultDeviceId); |
192 | 208 |
193 delegate->OnPauseStream(); | 209 delegate->OnPauseStream(); |
194 | 210 |
195 SyncWithAllThreads(); | 211 SyncWithAllThreads(); |
196 | 212 |
197 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | 213 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); |
| 214 EXPECT_CALL(*stream_registry_, DeregisterOutputStream(NotNull())); |
198 delegate.reset(); | 215 delegate.reset(); |
199 SyncWithAllThreads(); | 216 SyncWithAllThreads(); |
200 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | 217 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); |
201 } | 218 } |
202 | 219 |
203 void PlayPausePlayTest(base::Closure done) { | 220 void PlayPausePlayTest(base::Closure done) { |
204 EXPECT_CALL(media_observer_, | 221 EXPECT_CALL(media_observer_, |
205 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | 222 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); |
206 EXPECT_CALL(event_handler_, | 223 EXPECT_CALL(event_handler_, |
207 OnStreamCreated(kStreamId, NotNull(), NotNull())); | 224 OnStreamCreated(kStreamId, NotNull(), NotNull())); |
208 EXPECT_CALL(mirroring_manager_, | 225 EXPECT_CALL(mirroring_manager_, |
209 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | 226 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); |
| 227 EXPECT_CALL(*stream_registry_, RegisterOutputStream(NotNull())); |
210 { | 228 { |
211 InSequence s; | 229 InSequence s; |
212 EXPECT_CALL(event_handler_, OnStreamStateChanged(true)); | 230 EXPECT_CALL(*stream_registry_, OutputStreamStateChanged(NotNull(), true)); |
213 EXPECT_CALL(event_handler_, OnStreamStateChanged(false)); | 231 EXPECT_CALL(*stream_registry_, |
214 EXPECT_CALL(event_handler_, OnStreamStateChanged(true)); | 232 OutputStreamStateChanged(NotNull(), false)); |
215 EXPECT_CALL(event_handler_, OnStreamStateChanged(false)); | 233 EXPECT_CALL(*stream_registry_, OutputStreamStateChanged(NotNull(), true)); |
| 234 EXPECT_CALL(*stream_registry_, |
| 235 OutputStreamStateChanged(NotNull(), false)); |
216 } | 236 } |
217 | 237 |
218 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | 238 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( |
219 &event_handler_, audio_manager_.get(), | 239 &event_handler_, stream_registry_.get(), audio_manager_.get(), |
220 log_factory_.CreateAudioLog( | 240 log_factory_.CreateAudioLog( |
221 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | 241 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), |
222 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | 242 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, |
223 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | 243 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), |
224 kDefaultDeviceId); | 244 kDefaultDeviceId); |
225 | 245 |
226 delegate->OnPlayStream(); | 246 delegate->OnPlayStream(); |
227 delegate->OnPauseStream(); | 247 delegate->OnPauseStream(); |
228 delegate->OnPlayStream(); | 248 delegate->OnPlayStream(); |
229 | 249 |
230 SyncWithAllThreads(); | 250 SyncWithAllThreads(); |
231 | 251 |
232 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | 252 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); |
| 253 EXPECT_CALL(*stream_registry_, DeregisterOutputStream(NotNull())); |
233 delegate.reset(); | 254 delegate.reset(); |
234 SyncWithAllThreads(); | 255 SyncWithAllThreads(); |
235 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | 256 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); |
236 } | 257 } |
237 | 258 |
238 void PlayPlayTest(base::Closure done) { | 259 void PlayPlayTest(base::Closure done) { |
239 EXPECT_CALL(media_observer_, | 260 EXPECT_CALL(media_observer_, |
240 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | 261 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); |
241 EXPECT_CALL(event_handler_, | 262 EXPECT_CALL(event_handler_, |
242 OnStreamCreated(kStreamId, NotNull(), NotNull())); | 263 OnStreamCreated(kStreamId, NotNull(), NotNull())); |
243 EXPECT_CALL(mirroring_manager_, | 264 EXPECT_CALL(mirroring_manager_, |
244 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | 265 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); |
| 266 EXPECT_CALL(*stream_registry_, RegisterOutputStream(NotNull())); |
245 { | 267 { |
246 InSequence s; | 268 InSequence s; |
247 EXPECT_CALL(event_handler_, OnStreamStateChanged(true)); | 269 EXPECT_CALL(*stream_registry_, OutputStreamStateChanged(NotNull(), true)); |
248 EXPECT_CALL(event_handler_, OnStreamStateChanged(false)); | 270 EXPECT_CALL(*stream_registry_, |
| 271 OutputStreamStateChanged(NotNull(), false)); |
249 } | 272 } |
250 | 273 |
251 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | 274 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( |
252 &event_handler_, audio_manager_.get(), | 275 &event_handler_, stream_registry_.get(), audio_manager_.get(), |
253 log_factory_.CreateAudioLog( | 276 log_factory_.CreateAudioLog( |
254 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | 277 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), |
255 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | 278 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, |
256 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | 279 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), |
257 kDefaultDeviceId); | 280 kDefaultDeviceId); |
258 | 281 |
259 delegate->OnPlayStream(); | 282 delegate->OnPlayStream(); |
260 delegate->OnPlayStream(); | 283 delegate->OnPlayStream(); |
261 | 284 |
262 SyncWithAllThreads(); | 285 SyncWithAllThreads(); |
263 | 286 |
264 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | 287 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); |
| 288 EXPECT_CALL(*stream_registry_, DeregisterOutputStream(NotNull())); |
265 delegate.reset(); | 289 delegate.reset(); |
266 SyncWithAllThreads(); | 290 SyncWithAllThreads(); |
267 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | 291 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); |
268 } | 292 } |
269 | 293 |
270 void CreateDivertTest(base::Closure done) { | 294 void CreateDivertTest(base::Closure done) { |
271 EXPECT_CALL(media_observer_, | 295 EXPECT_CALL(media_observer_, |
272 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | 296 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); |
273 EXPECT_CALL(event_handler_, | 297 EXPECT_CALL(event_handler_, |
274 OnStreamCreated(kStreamId, NotNull(), NotNull())); | 298 OnStreamCreated(kStreamId, NotNull(), NotNull())); |
275 EXPECT_CALL(mirroring_manager_, | 299 EXPECT_CALL(mirroring_manager_, |
276 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | 300 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); |
| 301 EXPECT_CALL(*stream_registry_, RegisterOutputStream(NotNull())); |
277 | 302 |
278 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | 303 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( |
279 &event_handler_, audio_manager_.get(), | 304 &event_handler_, stream_registry_.get(), audio_manager_.get(), |
280 log_factory_.CreateAudioLog( | 305 log_factory_.CreateAudioLog( |
281 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | 306 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), |
282 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | 307 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, |
283 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | 308 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), |
284 kDefaultDeviceId); | 309 kDefaultDeviceId); |
285 | 310 |
286 DummyAudioOutputStream stream; | 311 DummyAudioOutputStream stream; |
287 delegate->controller()->StartDiverting(&stream); | 312 delegate->controller()->StartDiverting(&stream); |
288 | 313 |
289 SyncWithAllThreads(); | 314 SyncWithAllThreads(); |
290 | 315 |
291 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | 316 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); |
| 317 EXPECT_CALL(*stream_registry_, DeregisterOutputStream(NotNull())); |
292 delegate.reset(); | 318 delegate.reset(); |
293 SyncWithAllThreads(); | 319 SyncWithAllThreads(); |
294 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | 320 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); |
295 } | 321 } |
296 | 322 |
297 void CreateDivertPauseTest(base::Closure done) { | 323 void CreateDivertPauseTest(base::Closure done) { |
298 EXPECT_CALL(media_observer_, | 324 EXPECT_CALL(media_observer_, |
299 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | 325 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); |
300 EXPECT_CALL(event_handler_, | 326 EXPECT_CALL(event_handler_, |
301 OnStreamCreated(kStreamId, NotNull(), NotNull())); | 327 OnStreamCreated(kStreamId, NotNull(), NotNull())); |
302 EXPECT_CALL(mirroring_manager_, | 328 EXPECT_CALL(mirroring_manager_, |
303 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | 329 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); |
| 330 EXPECT_CALL(*stream_registry_, RegisterOutputStream(NotNull())); |
304 | 331 |
305 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | 332 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( |
306 &event_handler_, audio_manager_.get(), | 333 &event_handler_, stream_registry_.get(), audio_manager_.get(), |
307 log_factory_.CreateAudioLog( | 334 log_factory_.CreateAudioLog( |
308 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | 335 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), |
309 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | 336 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, |
310 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | 337 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), |
311 kDefaultDeviceId); | 338 kDefaultDeviceId); |
312 | 339 |
313 DummyAudioOutputStream stream; | 340 DummyAudioOutputStream stream; |
314 delegate->controller()->StartDiverting(&stream); | 341 delegate->controller()->StartDiverting(&stream); |
315 | 342 |
316 SyncWithAllThreads(); | 343 SyncWithAllThreads(); |
317 delegate->OnPauseStream(); | 344 delegate->OnPauseStream(); |
318 | 345 |
319 SyncWithAllThreads(); | 346 SyncWithAllThreads(); |
320 | 347 |
321 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | 348 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); |
| 349 EXPECT_CALL(*stream_registry_, DeregisterOutputStream(NotNull())); |
322 delegate.reset(); | 350 delegate.reset(); |
323 SyncWithAllThreads(); | 351 SyncWithAllThreads(); |
324 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | 352 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); |
325 } | 353 } |
326 | 354 |
327 void PlayDivertTest(base::Closure done) { | 355 void PlayDivertTest(base::Closure done) { |
328 EXPECT_CALL(media_observer_, | 356 EXPECT_CALL(media_observer_, |
329 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | 357 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); |
330 EXPECT_CALL(event_handler_, | 358 EXPECT_CALL(event_handler_, |
331 OnStreamCreated(kStreamId, NotNull(), NotNull())); | 359 OnStreamCreated(kStreamId, NotNull(), NotNull())); |
332 EXPECT_CALL(mirroring_manager_, | 360 EXPECT_CALL(mirroring_manager_, |
333 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | 361 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); |
| 362 EXPECT_CALL(*stream_registry_, RegisterOutputStream(NotNull())); |
334 { | 363 { |
335 InSequence s; | 364 InSequence s; |
336 EXPECT_CALL(event_handler_, OnStreamStateChanged(true)); | 365 EXPECT_CALL(*stream_registry_, OutputStreamStateChanged(NotNull(), true)); |
337 EXPECT_CALL(event_handler_, OnStreamStateChanged(false)); | 366 EXPECT_CALL(*stream_registry_, |
| 367 OutputStreamStateChanged(NotNull(), false)); |
338 } | 368 } |
339 | 369 |
340 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | 370 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( |
341 &event_handler_, audio_manager_.get(), | 371 &event_handler_, stream_registry_.get(), audio_manager_.get(), |
342 log_factory_.CreateAudioLog( | 372 log_factory_.CreateAudioLog( |
343 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | 373 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), |
344 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | 374 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, |
345 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | 375 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), |
346 kDefaultDeviceId); | 376 kDefaultDeviceId); |
347 | 377 |
348 DummyAudioOutputStream stream; | 378 DummyAudioOutputStream stream; |
349 delegate->OnPlayStream(); | 379 delegate->OnPlayStream(); |
350 delegate->controller()->StartDiverting(&stream); | 380 delegate->controller()->StartDiverting(&stream); |
351 | 381 |
352 SyncWithAllThreads(); | 382 SyncWithAllThreads(); |
353 | 383 |
354 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | 384 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); |
| 385 EXPECT_CALL(*stream_registry_, DeregisterOutputStream(NotNull())); |
355 delegate.reset(); | 386 delegate.reset(); |
356 SyncWithAllThreads(); | 387 SyncWithAllThreads(); |
357 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | 388 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); |
358 } | 389 } |
359 | 390 |
360 void ErrorTest(base::Closure done) { | 391 void ErrorTest(base::Closure done) { |
361 EXPECT_CALL(media_observer_, | 392 EXPECT_CALL(media_observer_, |
362 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | 393 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); |
363 EXPECT_CALL(event_handler_, | 394 EXPECT_CALL(event_handler_, |
364 OnStreamCreated(kStreamId, NotNull(), NotNull())); | 395 OnStreamCreated(kStreamId, NotNull(), NotNull())); |
365 EXPECT_CALL(event_handler_, OnStreamError(kStreamId)); | 396 EXPECT_CALL(event_handler_, OnStreamError(kStreamId)); |
366 EXPECT_CALL(mirroring_manager_, | 397 EXPECT_CALL(mirroring_manager_, |
367 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | 398 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); |
| 399 EXPECT_CALL(*stream_registry_, RegisterOutputStream(NotNull())); |
368 | 400 |
369 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | 401 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( |
370 &event_handler_, audio_manager_.get(), | 402 &event_handler_, stream_registry_.get(), audio_manager_.get(), |
371 log_factory_.CreateAudioLog( | 403 log_factory_.CreateAudioLog( |
372 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | 404 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), |
373 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | 405 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, |
374 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | 406 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), |
375 kDefaultDeviceId); | 407 kDefaultDeviceId); |
376 | 408 |
377 delegate->controller()->OnError(nullptr); | 409 delegate->controller()->OnError(nullptr); |
378 | 410 |
379 SyncWithAllThreads(); | 411 SyncWithAllThreads(); |
380 | 412 |
381 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | 413 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); |
| 414 EXPECT_CALL(*stream_registry_, DeregisterOutputStream(NotNull())); |
382 delegate.reset(); | 415 delegate.reset(); |
383 SyncWithAllThreads(); | 416 SyncWithAllThreads(); |
384 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | 417 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); |
385 } | 418 } |
386 | 419 |
387 void CreateAndDestroyTest(base::Closure done) { | 420 void CreateAndDestroyTest(base::Closure done) { |
388 EXPECT_CALL(media_observer_, | 421 EXPECT_CALL(media_observer_, |
389 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | 422 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); |
390 EXPECT_CALL(mirroring_manager_, | 423 EXPECT_CALL(mirroring_manager_, |
391 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | 424 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); |
| 425 EXPECT_CALL(*stream_registry_, RegisterOutputStream(NotNull())); |
392 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | 426 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); |
| 427 EXPECT_CALL(*stream_registry_, DeregisterOutputStream(NotNull())); |
393 | 428 |
394 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | 429 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( |
395 &event_handler_, audio_manager_.get(), | 430 &event_handler_, stream_registry_.get(), audio_manager_.get(), |
396 log_factory_.CreateAudioLog( | 431 log_factory_.CreateAudioLog( |
397 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | 432 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), |
398 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | 433 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, |
399 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | 434 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), |
400 kDefaultDeviceId); | 435 kDefaultDeviceId); |
401 | 436 |
402 delegate.reset(); | 437 delegate.reset(); |
403 SyncWithAllThreads(); | 438 SyncWithAllThreads(); |
404 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | 439 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); |
405 } | 440 } |
406 | 441 |
407 void PlayAndDestroyTest(base::Closure done) { | 442 void PlayAndDestroyTest(base::Closure done) { |
408 EXPECT_CALL(media_observer_, | 443 EXPECT_CALL(media_observer_, |
409 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | 444 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); |
410 EXPECT_CALL(event_handler_, | 445 EXPECT_CALL(event_handler_, |
411 OnStreamCreated(kStreamId, NotNull(), NotNull())); | 446 OnStreamCreated(kStreamId, NotNull(), NotNull())); |
412 EXPECT_CALL(mirroring_manager_, | 447 EXPECT_CALL(mirroring_manager_, |
413 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | 448 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); |
| 449 EXPECT_CALL(*stream_registry_, RegisterOutputStream(NotNull())); |
414 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | 450 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); |
| 451 EXPECT_CALL(*stream_registry_, DeregisterOutputStream(NotNull())); |
415 | 452 |
416 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | 453 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( |
417 &event_handler_, audio_manager_.get(), | 454 &event_handler_, stream_registry_.get(), audio_manager_.get(), |
418 log_factory_.CreateAudioLog( | 455 log_factory_.CreateAudioLog( |
419 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | 456 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), |
420 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | 457 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, |
421 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | 458 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), |
422 kDefaultDeviceId); | 459 kDefaultDeviceId); |
423 | 460 |
424 SyncWithAllThreads(); | 461 SyncWithAllThreads(); |
425 | 462 |
426 delegate->OnPlayStream(); | 463 delegate->OnPlayStream(); |
427 delegate.reset(); | 464 delegate.reset(); |
428 SyncWithAllThreads(); | 465 SyncWithAllThreads(); |
429 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | 466 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); |
430 } | 467 } |
431 | 468 |
432 void ErrorAndDestroyTest(base::Closure done) { | 469 void ErrorAndDestroyTest(base::Closure done) { |
433 EXPECT_CALL(media_observer_, | 470 EXPECT_CALL(media_observer_, |
434 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); | 471 OnCreatingAudioStream(kRenderProcessId, kRenderFrameId)); |
435 EXPECT_CALL(event_handler_, | 472 EXPECT_CALL(event_handler_, |
436 OnStreamCreated(kStreamId, NotNull(), NotNull())); | 473 OnStreamCreated(kStreamId, NotNull(), NotNull())); |
437 EXPECT_CALL(mirroring_manager_, | 474 EXPECT_CALL(mirroring_manager_, |
438 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); | 475 AddDiverter(kRenderProcessId, kRenderFrameId, NotNull())); |
| 476 EXPECT_CALL(*stream_registry_, RegisterOutputStream(NotNull())); |
439 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); | 477 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())); |
| 478 EXPECT_CALL(*stream_registry_, DeregisterOutputStream(NotNull())); |
440 | 479 |
441 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( | 480 AudioOutputDelegate::UniquePtr delegate = AudioOutputDelegate::Create( |
442 &event_handler_, audio_manager_.get(), | 481 &event_handler_, stream_registry_.get(), audio_manager_.get(), |
443 log_factory_.CreateAudioLog( | 482 log_factory_.CreateAudioLog( |
444 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), | 483 media::AudioLogFactory::AUDIO_OUTPUT_CONTROLLER), |
445 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, | 484 &mirroring_manager_, &media_observer_, kStreamId, kRenderFrameId, |
446 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), | 485 kRenderProcessId, audio_manager_->GetDefaultOutputStreamParameters(), |
447 kDefaultDeviceId); | 486 kDefaultDeviceId); |
448 SyncWithAllThreads(); | 487 SyncWithAllThreads(); |
449 | 488 |
450 delegate->controller()->OnError(nullptr); | 489 delegate->controller()->OnError(nullptr); |
451 delegate.reset(); | 490 delegate.reset(); |
452 SyncWithAllThreads(); | 491 SyncWithAllThreads(); |
453 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); | 492 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, done); |
454 } | 493 } |
455 | 494 |
456 protected: | 495 protected: |
457 // MediaStreamManager uses a DestructionObserver, so it must outlive the | 496 // MediaStreamManager uses a DestructionObserver, so it must outlive the |
458 // TestBrowserThreadBundle. | 497 // TestBrowserThreadBundle. |
459 std::unique_ptr<MediaStreamManager> media_stream_manager_; | 498 std::unique_ptr<MediaStreamManager> media_stream_manager_; |
460 std::unique_ptr<TestBrowserThreadBundle> thread_bundle_; | 499 std::unique_ptr<TestBrowserThreadBundle> thread_bundle_; |
461 std::unique_ptr<AudioManagerThread> audio_thread_; | 500 std::unique_ptr<AudioManagerThread> audio_thread_; |
462 media::ScopedAudioManagerPtr audio_manager_; | 501 media::ScopedAudioManagerPtr audio_manager_; |
463 StrictMock<MockAudioMirroringManager> mirroring_manager_; | 502 StrictMock<MockAudioMirroringManager> mirroring_manager_; |
464 StrictMock<MockEventHandler> event_handler_; | 503 StrictMock<MockEventHandler> event_handler_; |
465 StrictMock<MockObserver> media_observer_; | 504 StrictMock<MockObserver> media_observer_; |
| 505 std::unique_ptr<MockAudioStreamRegistry, BrowserThread::DeleteOnIOThread> |
| 506 stream_registry_; |
466 media::FakeAudioLogFactory log_factory_; | 507 media::FakeAudioLogFactory log_factory_; |
467 | 508 |
468 private: | 509 private: |
469 void SyncWithAllThreads() { | 510 void SyncWithAllThreads() { |
470 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 511 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
471 // New tasks might be posted while we are syncing, but in every iteration at | 512 // New tasks might be posted while we are syncing, but in every iteration at |
472 // least one task will be run. 20 iterations should be enough for our code. | 513 // least one task will be run. 20 iterations should be enough for our code. |
473 for (int i = 0; i < 20; ++i) { | 514 for (int i = 0; i < 20; ++i) { |
474 { | 515 { |
475 base::MessageLoop::ScopedNestableTaskAllower allower( | 516 base::MessageLoop::ScopedNestableTaskAllower allower( |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 TEST_F(AudioOutputDelegateTest, ErrorAndDestroy) { | 621 TEST_F(AudioOutputDelegateTest, ErrorAndDestroy) { |
581 base::RunLoop l; | 622 base::RunLoop l; |
582 BrowserThread::PostTask( | 623 BrowserThread::PostTask( |
583 BrowserThread::IO, FROM_HERE, | 624 BrowserThread::IO, FROM_HERE, |
584 base::Bind(&AudioOutputDelegateTest::PlayAndDestroyTest, | 625 base::Bind(&AudioOutputDelegateTest::PlayAndDestroyTest, |
585 base::Unretained(this), l.QuitClosure())); | 626 base::Unretained(this), l.QuitClosure())); |
586 l.Run(); | 627 l.Run(); |
587 } | 628 } |
588 | 629 |
589 } // namespace content | 630 } // namespace content |
OLD | NEW |