OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/media/capture/web_contents_audio_input_stream.h" | 5 #include "content/browser/media/capture/web_contents_audio_input_stream.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <list> | 9 #include <list> |
10 | 10 |
(...skipping 15 matching lines...) Expand all Loading... | |
26 | 26 |
27 using ::testing::_; | 27 using ::testing::_; |
28 using ::testing::Assign; | 28 using ::testing::Assign; |
29 using ::testing::DoAll; | 29 using ::testing::DoAll; |
30 using ::testing::Invoke; | 30 using ::testing::Invoke; |
31 using ::testing::InvokeWithoutArgs; | 31 using ::testing::InvokeWithoutArgs; |
32 using ::testing::NotNull; | 32 using ::testing::NotNull; |
33 using ::testing::SaveArg; | 33 using ::testing::SaveArg; |
34 using ::testing::WithArgs; | 34 using ::testing::WithArgs; |
35 | 35 |
36 using media::AudioBus; | |
36 using media::AudioInputStream; | 37 using media::AudioInputStream; |
37 using media::AudioOutputStream; | 38 using media::AudioOutputStream; |
38 using media::AudioParameters; | 39 using media::AudioParameters; |
40 using media::AudioPushSink; | |
39 using media::SineWaveAudioSource; | 41 using media::SineWaveAudioSource; |
40 using media::VirtualAudioInputStream; | 42 using media::VirtualAudioInputStream; |
41 using media::VirtualAudioOutputStream; | 43 using media::VirtualAudioOutputStream; |
42 | 44 |
43 namespace content { | 45 namespace content { |
44 | 46 |
45 namespace { | 47 namespace { |
46 | 48 |
47 const int kRenderProcessId = 123; | 49 const int kRenderProcessId = 123; |
48 const int kRenderFrameId = 456; | 50 const int kRenderFrameId = 456; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
112 ON_CALL(*this, SetVolume(_)) | 114 ON_CALL(*this, SetVolume(_)) |
113 .WillByDefault(Invoke(&real_, &VirtualAudioInputStream::SetVolume)); | 115 .WillByDefault(Invoke(&real_, &VirtualAudioInputStream::SetVolume)); |
114 ON_CALL(*this, GetVolume()) | 116 ON_CALL(*this, GetVolume()) |
115 .WillByDefault(Invoke(&real_, &VirtualAudioInputStream::GetVolume)); | 117 .WillByDefault(Invoke(&real_, &VirtualAudioInputStream::GetVolume)); |
116 ON_CALL(*this, SetAutomaticGainControl(_)) | 118 ON_CALL(*this, SetAutomaticGainControl(_)) |
117 .WillByDefault( | 119 .WillByDefault( |
118 Invoke(&real_, &VirtualAudioInputStream::SetAutomaticGainControl)); | 120 Invoke(&real_, &VirtualAudioInputStream::SetAutomaticGainControl)); |
119 ON_CALL(*this, GetAutomaticGainControl()) | 121 ON_CALL(*this, GetAutomaticGainControl()) |
120 .WillByDefault( | 122 .WillByDefault( |
121 Invoke(&real_, &VirtualAudioInputStream::GetAutomaticGainControl)); | 123 Invoke(&real_, &VirtualAudioInputStream::GetAutomaticGainControl)); |
122 ON_CALL(*this, AddOutputStream(NotNull(), _)) | 124 ON_CALL(*this, AddInputProvider(NotNull(), _)) |
123 .WillByDefault( | 125 .WillByDefault( |
124 Invoke(&real_, &VirtualAudioInputStream::AddOutputStream)); | 126 Invoke(&real_, &VirtualAudioInputStream::AddInputProvider)); |
125 ON_CALL(*this, RemoveOutputStream(NotNull(), _)) | 127 ON_CALL(*this, RemoveInputProvider(NotNull(), _)) |
126 .WillByDefault( | 128 .WillByDefault( |
127 Invoke(&real_, &VirtualAudioInputStream::RemoveOutputStream)); | 129 Invoke(&real_, &VirtualAudioInputStream::RemoveInputProvider)); |
128 } | 130 } |
129 | 131 |
130 ~MockVirtualAudioInputStream() { | 132 ~MockVirtualAudioInputStream() { |
131 DCHECK(real_stream_is_closed_); | 133 DCHECK(real_stream_is_closed_); |
132 } | 134 } |
133 | 135 |
134 MOCK_METHOD0(Open, bool()); | 136 MOCK_METHOD0(Open, bool()); |
135 MOCK_METHOD1(Start, void(AudioInputStream::AudioInputCallback*)); | 137 MOCK_METHOD1(Start, void(AudioInputStream::AudioInputCallback*)); |
136 MOCK_METHOD0(Stop, void()); | 138 MOCK_METHOD0(Stop, void()); |
137 MOCK_METHOD0(Close, void()); | 139 MOCK_METHOD0(Close, void()); |
138 MOCK_METHOD0(GetMaxVolume, double()); | 140 MOCK_METHOD0(GetMaxVolume, double()); |
139 MOCK_METHOD1(SetVolume, void(double)); | 141 MOCK_METHOD1(SetVolume, void(double)); |
140 MOCK_METHOD0(GetVolume, double()); | 142 MOCK_METHOD0(GetVolume, double()); |
141 MOCK_METHOD1(SetAutomaticGainControl, bool(bool)); | 143 MOCK_METHOD1(SetAutomaticGainControl, bool(bool)); |
142 MOCK_METHOD0(GetAutomaticGainControl, bool()); | 144 MOCK_METHOD0(GetAutomaticGainControl, bool()); |
143 MOCK_METHOD2(AddOutputStream, void(VirtualAudioOutputStream*, | 145 MOCK_METHOD2(AddInputProvider, |
144 const AudioParameters&)); | 146 void(media::AudioConverter::InputCallback*, |
145 MOCK_METHOD2(RemoveOutputStream, void(VirtualAudioOutputStream*, | 147 const AudioParameters&)); |
146 const AudioParameters&)); | 148 MOCK_METHOD2(RemoveInputProvider, |
149 void(media::AudioConverter::InputCallback*, | |
150 const AudioParameters&)); | |
147 | 151 |
148 private: | 152 private: |
149 void OnRealStreamHasClosed(VirtualAudioInputStream* stream) { | 153 void OnRealStreamHasClosed(VirtualAudioInputStream* stream) { |
150 DCHECK_EQ(&real_, stream); | 154 DCHECK_EQ(&real_, stream); |
151 DCHECK(!real_stream_is_closed_); | 155 DCHECK(!real_stream_is_closed_); |
152 real_stream_is_closed_ = true; | 156 real_stream_is_closed_ = true; |
153 } | 157 } |
154 | 158 |
155 VirtualAudioInputStream real_; | 159 VirtualAudioInputStream real_; |
156 bool real_stream_is_closed_; | 160 bool real_stream_is_closed_; |
(...skipping 11 matching lines...) Expand all Loading... | |
168 uint32_t hardware_delay_bytes, | 172 uint32_t hardware_delay_bytes, |
169 double volume)); | 173 double volume)); |
170 MOCK_METHOD1(OnError, void(AudioInputStream* stream)); | 174 MOCK_METHOD1(OnError, void(AudioInputStream* stream)); |
171 | 175 |
172 private: | 176 private: |
173 DISALLOW_COPY_AND_ASSIGN(MockAudioInputCallback); | 177 DISALLOW_COPY_AND_ASSIGN(MockAudioInputCallback); |
174 }; | 178 }; |
175 | 179 |
176 } // namespace | 180 } // namespace |
177 | 181 |
178 class WebContentsAudioInputStreamTest : public testing::Test { | 182 class WebContentsAudioInputStreamTest : public testing::TestWithParam<bool> { |
179 public: | 183 public: |
180 WebContentsAudioInputStreamTest() | 184 WebContentsAudioInputStreamTest() |
181 : thread_bundle_(new TestBrowserThreadBundle( | 185 : thread_bundle_(new TestBrowserThreadBundle( |
182 TestBrowserThreadBundle::REAL_IO_THREAD)), | 186 TestBrowserThreadBundle::REAL_IO_THREAD)), |
183 audio_thread_("Audio thread"), | 187 audio_thread_("Audio thread"), |
184 mock_mirroring_manager_(new MockAudioMirroringManager()), | 188 mock_mirroring_manager_(new MockAudioMirroringManager()), |
185 mock_tracker_(new MockWebContentsTracker()), | 189 mock_tracker_(new MockWebContentsTracker()), |
186 mock_vais_(NULL), | 190 mock_vais_(NULL), |
187 wcais_(NULL), | 191 wcais_(NULL), |
188 destination_(NULL), | 192 destination_(NULL), |
189 current_render_process_id_(kRenderProcessId), | 193 current_render_process_id_(kRenderProcessId), |
190 current_render_frame_id_(kRenderFrameId), | 194 current_render_frame_id_(kRenderFrameId), |
191 on_data_event_(false, false) { | 195 on_data_event_(false, false) { |
192 audio_thread_.Start(); | 196 audio_thread_.Start(); |
193 } | 197 } |
194 | 198 |
195 ~WebContentsAudioInputStreamTest() override { | 199 ~WebContentsAudioInputStreamTest() override { |
196 audio_thread_.Stop(); | 200 audio_thread_.Stop(); |
197 thread_bundle_.reset(); | 201 thread_bundle_.reset(); |
198 | 202 |
199 DCHECK(!mock_vais_); | 203 DCHECK(!mock_vais_); |
200 DCHECK(!wcais_); | 204 DCHECK(!wcais_); |
201 EXPECT_FALSE(destination_); | 205 EXPECT_FALSE(destination_); |
202 DCHECK(streams_.empty()); | 206 DCHECK(streams_.empty()); |
203 DCHECK(sources_.empty()); | 207 DCHECK(sources_.empty()); |
204 } | 208 } |
205 | 209 |
210 void SetIsDuplication(bool is_duplication) { | |
miu
2016/05/06 22:29:49
The is_duplication_ member (and this setter method
qiangchen
2016/05/10 22:36:53
Done.
| |
211 is_duplication_ = is_duplication; | |
212 } | |
213 | |
206 void Open() { | 214 void Open() { |
207 mock_vais_ = new MockVirtualAudioInputStream(audio_thread_.task_runner()); | 215 mock_vais_ = new MockVirtualAudioInputStream(audio_thread_.task_runner()); |
208 EXPECT_CALL(*mock_vais_, Open()); | 216 EXPECT_CALL(*mock_vais_, Open()); |
209 EXPECT_CALL(*mock_vais_, Close()); // At Close() time. | 217 EXPECT_CALL(*mock_vais_, Close()); // At Close() time. |
210 | 218 |
211 ASSERT_EQ(kRenderProcessId, current_render_process_id_); | 219 ASSERT_EQ(kRenderProcessId, current_render_process_id_); |
212 ASSERT_EQ(kRenderFrameId, current_render_frame_id_); | 220 ASSERT_EQ(kRenderFrameId, current_render_frame_id_); |
213 EXPECT_CALL(*mock_tracker_.get(), | 221 EXPECT_CALL(*mock_tracker_.get(), |
214 Start(kRenderProcessId, kRenderFrameId, _)) | 222 Start(kRenderProcessId, kRenderFrameId, _)) |
215 .WillOnce(DoAll( | 223 .WillOnce(DoAll( |
216 SaveArg<2>(&change_callback_), | 224 SaveArg<2>(&change_callback_), |
217 WithArgs<0, 1>(Invoke(this, | 225 WithArgs<0, 1>(Invoke(this, |
218 &WebContentsAudioInputStreamTest:: | 226 &WebContentsAudioInputStreamTest:: |
219 SimulateChangeCallback)))); | 227 SimulateChangeCallback)))); |
220 | 228 |
221 EXPECT_CALL(*mock_tracker_.get(), Stop()); // At Close() time. | 229 EXPECT_CALL(*mock_tracker_.get(), Stop()); // At Close() time. |
222 | 230 |
223 wcais_ = new WebContentsAudioInputStream( | 231 wcais_ = new WebContentsAudioInputStream( |
224 current_render_process_id_, current_render_frame_id_, | 232 current_render_process_id_, current_render_frame_id_, |
225 mock_mirroring_manager_.get(), | 233 mock_mirroring_manager_.get(), mock_tracker_, mock_vais_, |
226 mock_tracker_, mock_vais_); | 234 is_duplication_); |
227 wcais_->Open(); | 235 wcais_->Open(); |
228 } | 236 } |
229 | 237 |
230 void Start() { | 238 void Start() { |
231 EXPECT_CALL(*mock_vais_, Start(&mock_input_callback_)); | 239 EXPECT_CALL(*mock_vais_, Start(&mock_input_callback_)); |
232 EXPECT_CALL(*mock_vais_, Stop()); // At Stop() time. | 240 EXPECT_CALL(*mock_vais_, Stop()); // At Stop() time. |
233 | 241 |
234 EXPECT_CALL(*mock_mirroring_manager_, StartMirroring(NotNull())) | 242 EXPECT_CALL(*mock_mirroring_manager_, StartMirroring(NotNull())) |
235 .WillOnce(SaveArg<0>(&destination_)) | 243 .WillOnce(SaveArg<0>(&destination_)) |
236 .RetiresOnSaturation(); | 244 .RetiresOnSaturation(); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
270 // Note: WCAIS posts a task to invoke | 278 // Note: WCAIS posts a task to invoke |
271 // MockAudioMirroringManager::StartMirroring() on the IO thread, which | 279 // MockAudioMirroringManager::StartMirroring() on the IO thread, which |
272 // causes our mock to set |destination_|. Block until that has happened. | 280 // causes our mock to set |destination_|. Block until that has happened. |
273 base::WaitableEvent done(false, false); | 281 base::WaitableEvent done(false, false); |
274 BrowserThread::PostTask( | 282 BrowserThread::PostTask( |
275 BrowserThread::IO, FROM_HERE, base::Bind( | 283 BrowserThread::IO, FROM_HERE, base::Bind( |
276 &base::WaitableEvent::Signal, base::Unretained(&done))); | 284 &base::WaitableEvent::Signal, base::Unretained(&done))); |
277 done.Wait(); | 285 done.Wait(); |
278 ASSERT_TRUE(destination_); | 286 ASSERT_TRUE(destination_); |
279 | 287 |
280 EXPECT_CALL(*mock_vais_, AddOutputStream(NotNull(), _)) | 288 EXPECT_CALL(*mock_vais_, AddInputProvider(NotNull(), _)) |
281 .RetiresOnSaturation(); | 289 .RetiresOnSaturation(); |
282 // Later, when stream is closed: | 290 // Later, when stream is closed: |
283 EXPECT_CALL(*mock_vais_, RemoveOutputStream(NotNull(), _)) | 291 EXPECT_CALL(*mock_vais_, RemoveInputProvider(NotNull(), _)) |
284 .RetiresOnSaturation(); | 292 .RetiresOnSaturation(); |
285 | 293 |
286 const AudioParameters& params = TestAudioParameters(); | 294 const AudioParameters& params = TestAudioParameters(); |
287 AudioOutputStream* const out = destination_->AddInput(params); | 295 if (is_duplication_) { |
288 ASSERT_TRUE(out); | 296 media::AudioPushSink* out = destination_->AddPushInput(params); |
289 streams_.push_back(out); | 297 ASSERT_TRUE(out); |
290 EXPECT_TRUE(out->Open()); | 298 sinks_.push_back(out); |
291 SineWaveAudioSource* const source = new SineWaveAudioSource( | 299 SineWaveAudioSource* const source = new SineWaveAudioSource( |
miu
2016/05/06 22:29:49
Please try to avoid duplicate code where possible:
qiangchen
2016/05/10 22:36:52
Done.
| |
292 params.channel_layout(), 200.0, params.sample_rate()); | 300 params.channel_layout(), 200.0, params.sample_rate()); |
293 sources_.push_back(source); | 301 sources_.push_back(source); |
294 out->Start(source); | 302 |
303 std::unique_ptr<media::AudioBus> audio_data = AudioBus::Create(params); | |
304 base::TimeTicks now = base::TimeTicks::Now(); | |
305 // 20 Audio buses are enough for all test cases. | |
306 const int kAudioBusesNumber = 20; | |
307 for (int i = 0; i < kAudioBusesNumber; i++) { | |
308 int frames = source->OnMoreData(audio_data.get(), 0, 0); | |
309 out->OnData(*(audio_data.get()), now); | |
310 now += base::TimeDelta::FromMillisecondsD( | |
311 frames * params.GetMicrosecondsPerFrame()); | |
312 } | |
313 } else { | |
314 AudioOutputStream* const out = destination_->AddInput(params); | |
315 ASSERT_TRUE(out); | |
316 streams_.push_back(out); | |
317 EXPECT_TRUE(out->Open()); | |
318 SineWaveAudioSource* const source = new SineWaveAudioSource( | |
319 params.channel_layout(), 200.0, params.sample_rate()); | |
320 sources_.push_back(source); | |
321 out->Start(source); | |
322 } | |
295 } | 323 } |
296 | 324 |
297 void RemoveOneInputInFIFOOrder() { | 325 void RemoveOneInputInFIFOOrder() { |
298 ASSERT_FALSE(streams_.empty()); | 326 if (is_duplication_) { |
299 AudioOutputStream* const out = streams_.front(); | 327 ASSERT_FALSE(sinks_.empty()); |
300 streams_.pop_front(); | 328 AudioPushSink* const out = sinks_.front(); |
301 out->Stop(); | 329 sinks_.pop_front(); |
302 out->Close(); // Self-deletes. | 330 out->Close(); // Self-deletes. |
303 ASSERT_TRUE(!sources_.empty()); | 331 ASSERT_TRUE(!sources_.empty()); |
miu
2016/05/06 22:29:50
ditto (duplicate code): The last three lines here
qiangchen
2016/05/10 22:36:53
Done.
| |
304 delete sources_.front(); | 332 delete sources_.front(); |
305 sources_.pop_front(); | 333 sources_.pop_front(); |
334 } else { | |
335 ASSERT_FALSE(streams_.empty()); | |
336 AudioOutputStream* const out = streams_.front(); | |
337 streams_.pop_front(); | |
338 out->Stop(); | |
339 out->Close(); // Self-deletes. | |
340 ASSERT_TRUE(!sources_.empty()); | |
341 delete sources_.front(); | |
342 sources_.pop_front(); | |
343 } | |
306 } | 344 } |
307 | 345 |
308 void ChangeMirroringTarget() { | 346 void ChangeMirroringTarget() { |
309 const int next_render_process_id = | 347 const int next_render_process_id = |
310 current_render_process_id_ == kRenderProcessId ? | 348 current_render_process_id_ == kRenderProcessId ? |
311 kAnotherRenderProcessId : kRenderProcessId; | 349 kAnotherRenderProcessId : kRenderProcessId; |
312 const int next_render_frame_id = | 350 const int next_render_frame_id = |
313 current_render_frame_id_ == kRenderFrameId ? | 351 current_render_frame_id_ == kRenderFrameId ? |
314 kAnotherRenderFrameId : kRenderFrameId; | 352 kAnotherRenderFrameId : kRenderFrameId; |
315 | 353 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
383 // to simulate: 1) calls to AddInput(); and 2) diverting audio data. | 421 // to simulate: 1) calls to AddInput(); and 2) diverting audio data. |
384 AudioMirroringManager::MirroringDestination* destination_; | 422 AudioMirroringManager::MirroringDestination* destination_; |
385 | 423 |
386 // Current target RenderFrame. These get flipped in ChangedMirroringTarget(). | 424 // Current target RenderFrame. These get flipped in ChangedMirroringTarget(). |
387 int current_render_process_id_; | 425 int current_render_process_id_; |
388 int current_render_frame_id_; | 426 int current_render_frame_id_; |
389 | 427 |
390 // Streams provided by calls to WebContentsAudioInputStream::AddInput(). Each | 428 // Streams provided by calls to WebContentsAudioInputStream::AddInput(). Each |
391 // is started with a simulated source of audio data. | 429 // is started with a simulated source of audio data. |
392 std::list<AudioOutputStream*> streams_; | 430 std::list<AudioOutputStream*> streams_; |
431 std::list<media::AudioPushSink*> sinks_; | |
393 std::list<SineWaveAudioSource*> sources_; // 1:1 with elements in streams_. | 432 std::list<SineWaveAudioSource*> sources_; // 1:1 with elements in streams_. |
394 | 433 |
434 // Set this value to true to test a WebContentsAudioInputStream instance, | |
435 // which requests duplicate audio. | |
436 // Otherwise, we are testing a WebContentsAudioInputStream instance, which | |
437 // requests diverting audio. | |
438 bool is_duplication_; | |
439 | |
395 base::WaitableEvent on_data_event_; | 440 base::WaitableEvent on_data_event_; |
396 | 441 |
397 DISALLOW_COPY_AND_ASSIGN(WebContentsAudioInputStreamTest); | 442 DISALLOW_COPY_AND_ASSIGN(WebContentsAudioInputStreamTest); |
398 }; | 443 }; |
399 | 444 |
400 #define RUN_ON_AUDIO_THREAD(method) \ | 445 #define RUN_ON_AUDIO_THREAD(method) \ |
401 RunOnAudioThread(base::Bind(&WebContentsAudioInputStreamTest::method, \ | 446 RunOnAudioThread(base::Bind(&WebContentsAudioInputStreamTest::method, \ |
402 base::Unretained(this))) | 447 base::Unretained(this))) |
403 | 448 |
404 TEST_F(WebContentsAudioInputStreamTest, OpenedButNeverStarted) { | 449 TEST_P(WebContentsAudioInputStreamTest, OpenedButNeverStarted) { |
450 SetIsDuplication(GetParam()); | |
405 RUN_ON_AUDIO_THREAD(Open); | 451 RUN_ON_AUDIO_THREAD(Open); |
406 RUN_ON_AUDIO_THREAD(Close); | 452 RUN_ON_AUDIO_THREAD(Close); |
407 } | 453 } |
408 | 454 |
409 TEST_F(WebContentsAudioInputStreamTest, MirroringNothing) { | 455 TEST_P(WebContentsAudioInputStreamTest, MirroringNothing) { |
456 SetIsDuplication(GetParam()); | |
410 RUN_ON_AUDIO_THREAD(Open); | 457 RUN_ON_AUDIO_THREAD(Open); |
411 RUN_ON_AUDIO_THREAD(Start); | 458 RUN_ON_AUDIO_THREAD(Start); |
412 WaitForData(); | 459 WaitForData(); |
413 RUN_ON_AUDIO_THREAD(Stop); | 460 RUN_ON_AUDIO_THREAD(Stop); |
414 RUN_ON_AUDIO_THREAD(Close); | 461 RUN_ON_AUDIO_THREAD(Close); |
415 } | 462 } |
416 | 463 |
417 TEST_F(WebContentsAudioInputStreamTest, MirroringOutputOutlivesSession) { | 464 TEST_P(WebContentsAudioInputStreamTest, MirroringOutputOutlivesSession) { |
465 SetIsDuplication(GetParam()); | |
418 RUN_ON_AUDIO_THREAD(Open); | 466 RUN_ON_AUDIO_THREAD(Open); |
419 RUN_ON_AUDIO_THREAD(Start); | 467 RUN_ON_AUDIO_THREAD(Start); |
420 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 468 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
421 WaitForData(); | 469 WaitForData(); |
422 RUN_ON_AUDIO_THREAD(Stop); | 470 RUN_ON_AUDIO_THREAD(Stop); |
423 RUN_ON_AUDIO_THREAD(Close); | 471 RUN_ON_AUDIO_THREAD(Close); |
424 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 472 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
425 } | 473 } |
426 | 474 |
427 TEST_F(WebContentsAudioInputStreamTest, MirroringOutputWithinSession) { | 475 TEST_P(WebContentsAudioInputStreamTest, MirroringOutputWithinSession) { |
476 SetIsDuplication(GetParam()); | |
428 RUN_ON_AUDIO_THREAD(Open); | 477 RUN_ON_AUDIO_THREAD(Open); |
429 RUN_ON_AUDIO_THREAD(Start); | 478 RUN_ON_AUDIO_THREAD(Start); |
430 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 479 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
431 WaitForData(); | 480 WaitForData(); |
432 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 481 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
433 RUN_ON_AUDIO_THREAD(Stop); | 482 RUN_ON_AUDIO_THREAD(Stop); |
434 RUN_ON_AUDIO_THREAD(Close); | 483 RUN_ON_AUDIO_THREAD(Close); |
435 } | 484 } |
436 | 485 |
437 TEST_F(WebContentsAudioInputStreamTest, MirroringNothingWithTargetChange) { | 486 TEST_P(WebContentsAudioInputStreamTest, MirroringNothingWithTargetChange) { |
487 SetIsDuplication(GetParam()); | |
438 RUN_ON_AUDIO_THREAD(Open); | 488 RUN_ON_AUDIO_THREAD(Open); |
439 RUN_ON_AUDIO_THREAD(Start); | 489 RUN_ON_AUDIO_THREAD(Start); |
440 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); | 490 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); |
441 RUN_ON_AUDIO_THREAD(Stop); | 491 RUN_ON_AUDIO_THREAD(Stop); |
442 RUN_ON_AUDIO_THREAD(Close); | 492 RUN_ON_AUDIO_THREAD(Close); |
443 } | 493 } |
444 | 494 |
445 TEST_F(WebContentsAudioInputStreamTest, MirroringOneStreamAfterTargetChange) { | 495 TEST_P(WebContentsAudioInputStreamTest, MirroringOneStreamAfterTargetChange) { |
496 SetIsDuplication(GetParam()); | |
446 RUN_ON_AUDIO_THREAD(Open); | 497 RUN_ON_AUDIO_THREAD(Open); |
447 RUN_ON_AUDIO_THREAD(Start); | 498 RUN_ON_AUDIO_THREAD(Start); |
448 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); | 499 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); |
449 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 500 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
450 WaitForData(); | 501 WaitForData(); |
451 RUN_ON_AUDIO_THREAD(Stop); | 502 RUN_ON_AUDIO_THREAD(Stop); |
452 RUN_ON_AUDIO_THREAD(Close); | 503 RUN_ON_AUDIO_THREAD(Close); |
453 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 504 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
454 } | 505 } |
455 | 506 |
456 TEST_F(WebContentsAudioInputStreamTest, MirroringOneStreamWithTargetChange) { | 507 TEST_P(WebContentsAudioInputStreamTest, MirroringOneStreamWithTargetChange) { |
508 SetIsDuplication(GetParam()); | |
457 RUN_ON_AUDIO_THREAD(Open); | 509 RUN_ON_AUDIO_THREAD(Open); |
458 RUN_ON_AUDIO_THREAD(Start); | 510 RUN_ON_AUDIO_THREAD(Start); |
459 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 511 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
460 WaitForData(); | 512 WaitForData(); |
461 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); | 513 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); |
462 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 514 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
463 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 515 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
464 WaitForData(); | 516 WaitForData(); |
465 RUN_ON_AUDIO_THREAD(Stop); | 517 RUN_ON_AUDIO_THREAD(Stop); |
466 RUN_ON_AUDIO_THREAD(Close); | 518 RUN_ON_AUDIO_THREAD(Close); |
467 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 519 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
468 } | 520 } |
469 | 521 |
470 TEST_F(WebContentsAudioInputStreamTest, MirroringLostTarget) { | 522 TEST_P(WebContentsAudioInputStreamTest, MirroringLostTarget) { |
523 SetIsDuplication(GetParam()); | |
471 RUN_ON_AUDIO_THREAD(Open); | 524 RUN_ON_AUDIO_THREAD(Open); |
472 RUN_ON_AUDIO_THREAD(Start); | 525 RUN_ON_AUDIO_THREAD(Start); |
473 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 526 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
474 WaitForData(); | 527 WaitForData(); |
475 RUN_ON_AUDIO_THREAD(LoseMirroringTarget); | 528 RUN_ON_AUDIO_THREAD(LoseMirroringTarget); |
476 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 529 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
477 RUN_ON_AUDIO_THREAD(Stop); | 530 RUN_ON_AUDIO_THREAD(Stop); |
478 RUN_ON_AUDIO_THREAD(Close); | 531 RUN_ON_AUDIO_THREAD(Close); |
479 } | 532 } |
480 | 533 |
481 TEST_F(WebContentsAudioInputStreamTest, MirroringMultipleStreamsAndTargets) { | 534 TEST_P(WebContentsAudioInputStreamTest, MirroringMultipleStreamsAndTargets) { |
535 SetIsDuplication(GetParam()); | |
482 RUN_ON_AUDIO_THREAD(Open); | 536 RUN_ON_AUDIO_THREAD(Open); |
483 RUN_ON_AUDIO_THREAD(Start); | 537 RUN_ON_AUDIO_THREAD(Start); |
484 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 538 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
485 WaitForData(); | 539 WaitForData(); |
486 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 540 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
487 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 541 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
488 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 542 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
489 WaitForData(); | 543 WaitForData(); |
490 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); | 544 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); |
491 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 545 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
492 WaitForData(); | 546 WaitForData(); |
493 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 547 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
494 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 548 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
495 RUN_ON_AUDIO_THREAD(AddAnotherInput); | 549 RUN_ON_AUDIO_THREAD(AddAnotherInput); |
496 WaitForData(); | 550 WaitForData(); |
497 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 551 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
498 WaitForData(); | 552 WaitForData(); |
499 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); | 553 RUN_ON_AUDIO_THREAD(ChangeMirroringTarget); |
500 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); | 554 RUN_ON_AUDIO_THREAD(RemoveOneInputInFIFOOrder); |
501 RUN_ON_AUDIO_THREAD(Stop); | 555 RUN_ON_AUDIO_THREAD(Stop); |
502 RUN_ON_AUDIO_THREAD(Close); | 556 RUN_ON_AUDIO_THREAD(Close); |
503 } | 557 } |
504 | 558 |
559 INSTANTIATE_TEST_CASE_P(, WebContentsAudioInputStreamTest, ::testing::Bool()); | |
miu
2016/05/06 22:29:49
Great idea here! (to just run all the tests when
qiangchen
2016/05/10 22:36:52
Acknowledged.
| |
560 | |
505 } // namespace content | 561 } // namespace content |
OLD | NEW |