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