| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/environment.h" | 6 #include "base/environment.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
| 9 #include "base/process_util.h" | 9 #include "base/process_util.h" |
| 10 #include "base/sync_socket.h" | 10 #include "base/sync_socket.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 using ::testing::InSequence; | 25 using ::testing::InSequence; |
| 26 using ::testing::InvokeWithoutArgs; | 26 using ::testing::InvokeWithoutArgs; |
| 27 using ::testing::Return; | 27 using ::testing::Return; |
| 28 using ::testing::SaveArg; | 28 using ::testing::SaveArg; |
| 29 using ::testing::SetArgumentPointee; | 29 using ::testing::SetArgumentPointee; |
| 30 using content::BrowserThread; | 30 using content::BrowserThread; |
| 31 | 31 |
| 32 using content::BrowserThreadImpl; | 32 using content::BrowserThreadImpl; |
| 33 | 33 |
| 34 static const int kStreamId = 50; | 34 static const int kStreamId = 50; |
| 35 static const int kRenderProcessId = 1; |
| 35 static const int kRenderViewId = -2; | 36 static const int kRenderViewId = -2; |
| 36 | 37 |
| 37 static bool IsRunningHeadless() { | 38 static bool IsRunningHeadless() { |
| 38 scoped_ptr<base::Environment> env(base::Environment::Create()); | 39 scoped_ptr<base::Environment> env(base::Environment::Create()); |
| 39 if (env->HasVar("CHROME_HEADLESS")) | 40 if (env->HasVar("CHROME_HEADLESS")) |
| 40 return true; | 41 return true; |
| 41 return false; | 42 return false; |
| 42 } | 43 } |
| 43 | 44 |
| 44 class MockAudioRendererHost : public AudioRendererHost { | 45 class MockAudioRendererHost : public AudioRendererHost { |
| 45 public: | 46 public: |
| 46 explicit MockAudioRendererHost( | 47 explicit MockAudioRendererHost( |
| 47 media::AudioManager* audio_manager, | 48 media::AudioManager* audio_manager, |
| 48 content::MediaObserver* media_observer) | 49 content::MediaObserver* media_observer) |
| 49 : AudioRendererHost(audio_manager, media_observer), | 50 : AudioRendererHost(kRenderProcessId, audio_manager, media_observer), |
| 50 shared_memory_length_(0) { | 51 shared_memory_length_(0) { |
| 51 } | 52 } |
| 52 | 53 |
| 53 // A list of mock methods. | 54 // A list of mock methods. |
| 54 MOCK_METHOD2(OnStreamCreated, | 55 MOCK_METHOD2(OnStreamCreated, |
| 55 void(int stream_id, int length)); | 56 void(int stream_id, int length)); |
| 56 MOCK_METHOD1(OnStreamPlaying, void(int stream_id)); | 57 MOCK_METHOD1(OnStreamPlaying, void(int stream_id)); |
| 57 MOCK_METHOD1(OnStreamPaused, void(int stream_id)); | 58 MOCK_METHOD1(OnStreamPaused, void(int stream_id)); |
| 58 MOCK_METHOD1(OnStreamError, void(int stream_id)); | 59 MOCK_METHOD1(OnStreamError, void(int stream_id)); |
| 59 MOCK_METHOD2(OnStreamVolume, void(int stream_id, double volume)); | 60 MOCK_METHOD2(OnStreamVolume, void(int stream_id, double volume)); |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 // We need to continue running message_loop_ to complete all destructions. | 187 // We need to continue running message_loop_ to complete all destructions. |
| 187 SyncWithAudioThread(); | 188 SyncWithAudioThread(); |
| 188 | 189 |
| 189 audio_manager_.reset(); | 190 audio_manager_.reset(); |
| 190 | 191 |
| 191 io_thread_.reset(); | 192 io_thread_.reset(); |
| 192 ui_thread_.reset(); | 193 ui_thread_.reset(); |
| 193 } | 194 } |
| 194 | 195 |
| 195 void Create() { | 196 void Create() { |
| 196 EXPECT_CALL(*observer_, | 197 EXPECT_CALL(*observer_, OnSetAudioStreamStatus( |
| 197 OnSetAudioStreamStatus(_, kStreamId, "created")); | 198 _, kRenderViewId, kStreamId, "created")); |
| 198 | 199 |
| 199 InSequence s; | 200 InSequence s; |
| 200 // We will first receive an OnStreamCreated() signal. | 201 // We will first receive an OnStreamCreated() signal. |
| 201 EXPECT_CALL(*host_, OnStreamCreated(kStreamId, _)) | 202 EXPECT_CALL(*host_, OnStreamCreated(kStreamId, _)) |
| 202 .WillOnce(QuitMessageLoop(message_loop_.get())); | 203 .WillOnce(QuitMessageLoop(message_loop_.get())); |
| 203 | 204 |
| 204 media::AudioParameters::Format format; | 205 media::AudioParameters::Format format; |
| 205 if (mock_stream_) | 206 if (mock_stream_) |
| 206 format = media::AudioParameters::AUDIO_MOCK; | 207 format = media::AudioParameters::AUDIO_MOCK; |
| 207 else | 208 else |
| 208 format = media::AudioParameters::AUDIO_PCM_LINEAR; | 209 format = media::AudioParameters::AUDIO_PCM_LINEAR; |
| 209 | 210 |
| 210 media::AudioParameters params( | 211 media::AudioParameters params( |
| 211 format, CHANNEL_LAYOUT_STEREO, | 212 format, CHANNEL_LAYOUT_STEREO, |
| 212 media::AudioParameters::kAudioCDSampleRate, 16, | 213 media::AudioParameters::kAudioCDSampleRate, 16, |
| 213 media::AudioParameters::kAudioCDSampleRate / 10); | 214 media::AudioParameters::kAudioCDSampleRate / 10); |
| 214 | 215 |
| 215 // Send a create stream message to the audio output stream and wait until | 216 // Send a create stream message to the audio output stream and wait until |
| 216 // we receive the created message. | 217 // we receive the created message. |
| 217 host_->OnCreateStream(kRenderViewId, kStreamId, params); | 218 host_->OnCreateStream(kRenderViewId, kStreamId, params); |
| 218 message_loop_->Run(); | 219 message_loop_->Run(); |
| 219 } | 220 } |
| 220 | 221 |
| 221 void Close() { | 222 void Close() { |
| 222 EXPECT_CALL(*observer_, | 223 EXPECT_CALL(*observer_, OnSetAudioStreamStatus( |
| 223 OnSetAudioStreamStatus(_, kStreamId, "closed")); | 224 _, kRenderViewId, kStreamId, "closed")); |
| 224 | 225 |
| 225 // Send a message to AudioRendererHost to tell it we want to close the | 226 // Send a message to AudioRendererHost to tell it we want to close the |
| 226 // stream. | 227 // stream. |
| 227 host_->OnCloseStream(kStreamId); | 228 host_->OnCloseStream(kStreamId); |
| 228 message_loop_->RunAllPending(); | 229 message_loop_->RunAllPending(); |
| 229 } | 230 } |
| 230 | 231 |
| 231 void Play() { | 232 void Play() { |
| 232 EXPECT_CALL(*observer_, | 233 EXPECT_CALL(*observer_, |
| 233 OnSetAudioStreamPlaying(_, kStreamId, true)); | 234 OnSetAudioStreamPlaying(_, kRenderViewId, kStreamId, true)); |
| 234 EXPECT_CALL(*host_, OnStreamPlaying(kStreamId)) | 235 EXPECT_CALL(*host_, OnStreamPlaying(kStreamId)) |
| 235 .WillOnce(QuitMessageLoop(message_loop_.get())); | 236 .WillOnce(QuitMessageLoop(message_loop_.get())); |
| 236 | 237 |
| 237 host_->OnPlayStream(kStreamId); | 238 host_->OnPlayStream(kStreamId); |
| 238 message_loop_->Run(); | 239 message_loop_->Run(); |
| 239 } | 240 } |
| 240 | 241 |
| 241 void Pause() { | 242 void Pause() { |
| 242 EXPECT_CALL(*observer_, | 243 EXPECT_CALL(*observer_, OnSetAudioStreamPlaying( |
| 243 OnSetAudioStreamPlaying(_, kStreamId, false)); | 244 _, kRenderViewId, kStreamId, false)); |
| 244 EXPECT_CALL(*host_, OnStreamPaused(kStreamId)) | 245 EXPECT_CALL(*host_, OnStreamPaused(kStreamId)) |
| 245 .WillOnce(QuitMessageLoop(message_loop_.get())); | 246 .WillOnce(QuitMessageLoop(message_loop_.get())); |
| 246 | 247 |
| 247 host_->OnPauseStream(kStreamId); | 248 host_->OnPauseStream(kStreamId); |
| 248 message_loop_->Run(); | 249 message_loop_->Run(); |
| 249 } | 250 } |
| 250 | 251 |
| 251 void SetVolume(double volume) { | 252 void SetVolume(double volume) { |
| 252 EXPECT_CALL(*observer_, | 253 EXPECT_CALL(*observer_, OnSetAudioStreamVolume( |
| 253 OnSetAudioStreamVolume(_, kStreamId, volume)); | 254 _, kRenderViewId, kStreamId, volume)); |
| 254 | 255 |
| 255 host_->OnSetVolume(kStreamId, volume); | 256 host_->OnSetVolume(kStreamId, volume); |
| 256 message_loop_->RunAllPending(); | 257 message_loop_->RunAllPending(); |
| 257 } | 258 } |
| 258 | 259 |
| 259 void SimulateError() { | 260 void SimulateError() { |
| 260 EXPECT_CALL(*observer_, | 261 EXPECT_CALL(*observer_, OnSetAudioStreamStatus( |
| 261 OnSetAudioStreamStatus(_, kStreamId, "error")); | 262 _, kRenderViewId, kStreamId, "error")); |
| 262 // Find the first AudioOutputController in the AudioRendererHost. | 263 // Find the first AudioOutputController in the AudioRendererHost. |
| 263 CHECK(host_->audio_entries_.size()) | 264 CHECK(host_->audio_entries_.size()) |
| 264 << "Calls Create() before calling this method"; | 265 << "Calls Create() before calling this method"; |
| 265 media::AudioOutputController* controller = | 266 media::AudioOutputController* controller = |
| 266 host_->audio_entries_.begin()->second->controller; | 267 host_->audio_entries_.begin()->second->controller; |
| 267 CHECK(controller) << "AudioOutputController not found"; | 268 CHECK(controller) << "AudioOutputController not found"; |
| 268 | 269 |
| 269 // Expect an error signal sent through IPC. | 270 // Expect an error signal sent through IPC. |
| 270 EXPECT_CALL(*host_, OnStreamError(kStreamId)); | 271 EXPECT_CALL(*host_, OnStreamError(kStreamId)); |
| 271 | 272 |
| 272 // Expect the audio stream will be deleted. | 273 // Expect the audio stream will be deleted. |
| 273 EXPECT_CALL(*observer_, OnDeleteAudioStream(_, kStreamId)); | 274 EXPECT_CALL(*observer_, OnDeleteAudioStream( |
| 275 _, kRenderViewId, kStreamId)); |
| 274 | 276 |
| 275 // Simulate an error sent from the audio device. | 277 // Simulate an error sent from the audio device. |
| 276 host_->OnError(controller, 0); | 278 host_->OnError(controller, 0); |
| 277 SyncWithAudioThread(); | 279 SyncWithAudioThread(); |
| 278 | 280 |
| 279 // Expect the audio stream record is removed. | 281 // Expect the audio stream record is removed. |
| 280 EXPECT_EQ(0u, host_->audio_entries_.size()); | 282 EXPECT_EQ(0u, host_->audio_entries_.size()); |
| 281 } | 283 } |
| 282 | 284 |
| 283 // Called on the audio thread. | 285 // Called on the audio thread. |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 EnableRealDevice(); | 406 EnableRealDevice(); |
| 405 | 407 |
| 406 Create(); | 408 Create(); |
| 407 Play(); | 409 Play(); |
| 408 SimulateError(); | 410 SimulateError(); |
| 409 Close(); | 411 Close(); |
| 410 } | 412 } |
| 411 | 413 |
| 412 | 414 |
| 413 // TODO(hclam): Add tests for data conversation in low latency mode. | 415 // TODO(hclam): Add tests for data conversation in low latency mode. |
| OLD | NEW |