Chromium Code Reviews| 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 |