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 |