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