| 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 "content/browser/renderer_host/media/audio_renderer_host.h" | 5 #include "content/browser/renderer_host/media/audio_renderer_host.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #include "media/base/bind_to_current_loop.h" | 25 #include "media/base/bind_to_current_loop.h" |
| 26 #include "media/base/media_switches.h" | 26 #include "media/base/media_switches.h" |
| 27 #include "testing/gmock/include/gmock/gmock.h" | 27 #include "testing/gmock/include/gmock/gmock.h" |
| 28 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 29 | 29 |
| 30 using ::testing::_; | 30 using ::testing::_; |
| 31 using ::testing::Assign; | 31 using ::testing::Assign; |
| 32 using ::testing::DoAll; | 32 using ::testing::DoAll; |
| 33 using ::testing::NotNull; | 33 using ::testing::NotNull; |
| 34 | 34 |
| 35 namespace content { |
| 36 |
| 35 namespace { | 37 namespace { |
| 36 const int kRenderProcessId = 1; | 38 const int kRenderProcessId = 1; |
| 37 const int kRenderFrameId = 5; | 39 const int kRenderFrameId = 5; |
| 38 const int kStreamId = 50; | 40 const int kStreamId = 50; |
| 39 const char kSecurityOrigin[] = "http://localhost"; | 41 const char kSecurityOrigin[] = "http://localhost"; |
| 40 const char kDefaultDeviceId[] = ""; | 42 const char kDefaultDeviceId[] = ""; |
| 41 const char kBadDeviceId[] = | 43 const char kBadDeviceId[] = |
| 42 "badbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbad1"; | 44 "badbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbadbad1"; |
| 43 const char kInvalidDeviceId[] = "invalid-device-id"; | 45 const char kInvalidDeviceId[] = "invalid-device-id"; |
| 46 |
| 47 void ValidateRenderFrameId(int render_process_id, |
| 48 int render_frame_id, |
| 49 const base::Callback<void(bool)>& callback) { |
| 50 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 51 const bool frame_exists = (render_process_id == kRenderProcessId && |
| 52 render_frame_id == kRenderFrameId); |
| 53 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 54 base::Bind(callback, frame_exists)); |
| 55 } |
| 56 |
| 44 } // namespace | 57 } // namespace |
| 45 | 58 |
| 46 namespace content { | |
| 47 | |
| 48 class MockAudioMirroringManager : public AudioMirroringManager { | 59 class MockAudioMirroringManager : public AudioMirroringManager { |
| 49 public: | 60 public: |
| 50 MockAudioMirroringManager() {} | 61 MockAudioMirroringManager() {} |
| 51 virtual ~MockAudioMirroringManager() {} | 62 virtual ~MockAudioMirroringManager() {} |
| 52 | 63 |
| 53 MOCK_METHOD3(AddDiverter, | 64 MOCK_METHOD3(AddDiverter, |
| 54 void(int render_process_id, | 65 void(int render_process_id, |
| 55 int render_frame_id, | 66 int render_frame_id, |
| 56 Diverter* diverter)); | 67 Diverter* diverter)); |
| 57 MOCK_METHOD1(RemoveDiverter, void(Diverter* diverter)); | 68 MOCK_METHOD1(RemoveDiverter, void(Diverter* diverter)); |
| 58 | 69 |
| 59 private: | 70 private: |
| 60 DISALLOW_COPY_AND_ASSIGN(MockAudioMirroringManager); | 71 DISALLOW_COPY_AND_ASSIGN(MockAudioMirroringManager); |
| 61 }; | 72 }; |
| 62 | 73 |
| 63 class MockAudioRendererHost : public AudioRendererHost { | 74 class MockAudioRendererHost : public AudioRendererHost { |
| 64 public: | 75 public: |
| 65 MockAudioRendererHost(media::AudioManager* audio_manager, | 76 MockAudioRendererHost(media::AudioManager* audio_manager, |
| 66 AudioMirroringManager* mirroring_manager, | 77 AudioMirroringManager* mirroring_manager, |
| 67 MediaInternals* media_internals, | 78 MediaInternals* media_internals, |
| 68 MediaStreamManager* media_stream_manager, | 79 MediaStreamManager* media_stream_manager, |
| 69 const std::string& salt) | 80 const std::string& salt) |
| 70 : AudioRendererHost(kRenderProcessId, | 81 : AudioRendererHost(kRenderProcessId, |
| 71 audio_manager, | 82 audio_manager, |
| 72 mirroring_manager, | 83 mirroring_manager, |
| 73 media_internals, | 84 media_internals, |
| 74 media_stream_manager, | 85 media_stream_manager, |
| 75 salt), | 86 salt), |
| 76 shared_memory_length_(0) {} | 87 shared_memory_length_(0) { |
| 88 set_render_frame_id_validate_function_for_testing(&ValidateRenderFrameId); |
| 89 } |
| 77 | 90 |
| 78 // A list of mock methods. | 91 // A list of mock methods. |
| 79 MOCK_METHOD4(OnDeviceAuthorized, | 92 MOCK_METHOD4(OnDeviceAuthorized, |
| 80 void(int stream_id, | 93 void(int stream_id, |
| 81 media::OutputDeviceStatus device_status, | 94 media::OutputDeviceStatus device_status, |
| 82 const media::AudioParameters& output_params, | 95 const media::AudioParameters& output_params, |
| 83 const std::string& matched_device_id)); | 96 const std::string& matched_device_id)); |
| 84 MOCK_METHOD2(OnStreamCreated, void(int stream_id, int length)); | 97 MOCK_METHOD2(OnStreamCreated, void(int stream_id, int length)); |
| 85 MOCK_METHOD1(OnStreamPlaying, void(int stream_id)); | 98 MOCK_METHOD1(OnStreamPlaying, void(int stream_id)); |
| 86 MOCK_METHOD1(OnStreamPaused, void(int stream_id)); | 99 MOCK_METHOD1(OnStreamPaused, void(int stream_id)); |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 host_->OnCreateStream(kStreamId, kRenderFrameId, params); | 272 host_->OnCreateStream(kStreamId, kRenderFrameId, params); |
| 260 | 273 |
| 261 // At some point in the future, a corresponding RemoveDiverter() call must | 274 // At some point in the future, a corresponding RemoveDiverter() call must |
| 262 // be made. | 275 // be made. |
| 263 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())) | 276 EXPECT_CALL(mirroring_manager_, RemoveDiverter(NotNull())) |
| 264 .RetiresOnSaturation(); | 277 .RetiresOnSaturation(); |
| 265 } | 278 } |
| 266 SyncWithAudioThread(); | 279 SyncWithAudioThread(); |
| 267 } | 280 } |
| 268 | 281 |
| 282 void CreateWithInvalidRenderFrameId() { |
| 283 // Because the render frame is invalid, the host should only reply with a |
| 284 // stream error message. |
| 285 EXPECT_CALL(*host_, OnStreamError(kStreamId)); |
| 286 |
| 287 const int kInvalidRenderFrameId = kRenderFrameId + 1; |
| 288 const media::AudioParameters params( |
| 289 media::AudioParameters::AUDIO_FAKE, media::CHANNEL_LAYOUT_STEREO, |
| 290 media::AudioParameters::kAudioCDSampleRate, 16, |
| 291 media::AudioParameters::kAudioCDSampleRate / 10); |
| 292 host_->OnCreateStream(kStreamId, kInvalidRenderFrameId, params); |
| 293 } |
| 294 |
| 269 void Close() { | 295 void Close() { |
| 270 // Send a message to AudioRendererHost to tell it we want to close the | 296 // Send a message to AudioRendererHost to tell it we want to close the |
| 271 // stream. | 297 // stream. |
| 272 host_->OnCloseStream(kStreamId); | 298 host_->OnCloseStream(kStreamId); |
| 273 SyncWithAudioThread(); | 299 SyncWithAudioThread(); |
| 274 } | 300 } |
| 275 | 301 |
| 276 void Play() { | 302 void Play() { |
| 277 EXPECT_CALL(*host_.get(), OnStreamPlaying(kStreamId)); | 303 EXPECT_CALL(*host_.get(), OnStreamPlaying(kStreamId)); |
| 278 host_->OnPlayStream(kStreamId); | 304 host_->OnPlayStream(kStreamId); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 TEST_F(AudioRendererHostTest, CreateUnauthorizedDevice) { | 424 TEST_F(AudioRendererHostTest, CreateUnauthorizedDevice) { |
| 399 Create(false, kBadDeviceId, url::Origin(GURL(kSecurityOrigin))); | 425 Create(false, kBadDeviceId, url::Origin(GURL(kSecurityOrigin))); |
| 400 Close(); | 426 Close(); |
| 401 } | 427 } |
| 402 | 428 |
| 403 TEST_F(AudioRendererHostTest, CreateInvalidDevice) { | 429 TEST_F(AudioRendererHostTest, CreateInvalidDevice) { |
| 404 Create(false, kInvalidDeviceId, url::Origin(GURL(kSecurityOrigin))); | 430 Create(false, kInvalidDeviceId, url::Origin(GURL(kSecurityOrigin))); |
| 405 Close(); | 431 Close(); |
| 406 } | 432 } |
| 407 | 433 |
| 434 TEST_F(AudioRendererHostTest, CreateFailsForInvalidRenderFrame) { |
| 435 CreateWithInvalidRenderFrameId(); |
| 436 Close(); |
| 437 } |
| 438 |
| 408 // TODO(hclam): Add tests for data conversation in low latency mode. | 439 // TODO(hclam): Add tests for data conversation in low latency mode. |
| 409 | 440 |
| 410 } // namespace content | 441 } // namespace content |
| OLD | NEW |