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

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

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

Powered by Google App Engine
This is Rietveld 408576698