| 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/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
| 6 #include "base/message_loop/message_loop.h" | 6 #include "base/message_loop/message_loop.h" |
| 7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
| 8 #include "content/child/child_process.h" | 8 #include "content/child/child_process.h" |
| 9 #include "content/renderer/media/media_stream.h" | 9 #include "content/renderer/media/media_stream.h" |
| 10 #include "content/renderer/media/media_stream_track.h" | 10 #include "content/renderer/media/media_stream_track.h" |
| 11 #include "content/renderer/media/mock_media_stream_dispatcher.h" | 11 #include "content/renderer/media/mock_media_stream_dispatcher.h" |
| 12 #include "content/renderer/media/mock_media_stream_video_source.h" | 12 #include "content/renderer/media/mock_media_stream_video_source.h" |
| 13 #include "content/renderer/media/user_media_client_impl.h" | 13 #include "content/renderer/media/user_media_client_impl.h" |
| 14 #include "content/renderer/media/webrtc/mock_peer_connection_dependency_factory.
h" | 14 #include "content/renderer/media/webrtc/mock_peer_connection_dependency_factory.
h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 #include "third_party/WebKit/public/platform/WebMediaDeviceInfo.h" | 16 #include "third_party/WebKit/public/platform/WebMediaDeviceInfo.h" |
| 17 #include "third_party/WebKit/public/platform/WebMediaStream.h" | 17 #include "third_party/WebKit/public/platform/WebMediaStream.h" |
| 18 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" | 18 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" |
| 19 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" | 19 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" |
| 20 #include "third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h
" |
| 20 #include "third_party/WebKit/public/platform/WebString.h" | 21 #include "third_party/WebKit/public/platform/WebString.h" |
| 21 #include "third_party/WebKit/public/platform/WebVector.h" | 22 #include "third_party/WebKit/public/platform/WebVector.h" |
| 22 #include "third_party/WebKit/public/web/WebHeap.h" | 23 #include "third_party/WebKit/public/web/WebHeap.h" |
| 23 | 24 |
| 24 namespace content { | 25 namespace content { |
| 25 | 26 |
| 26 class MockMediaStreamVideoCapturerSource : public MockMediaStreamVideoSource { | 27 class MockMediaStreamVideoCapturerSource : public MockMediaStreamVideoSource { |
| 27 public: | 28 public: |
| 28 MockMediaStreamVideoCapturerSource( | 29 MockMediaStreamVideoCapturerSource( |
| 29 const StreamDeviceInfo& device, | 30 const StreamDeviceInfo& device, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 state_ = REQUEST_NOT_COMPLETE; | 62 state_ = REQUEST_NOT_COMPLETE; |
| 62 requestUserMedia(user_media_request); | 63 requestUserMedia(user_media_request); |
| 63 } | 64 } |
| 64 | 65 |
| 65 void RequestMediaDevices() { | 66 void RequestMediaDevices() { |
| 66 blink::WebMediaDevicesRequest media_devices_request; | 67 blink::WebMediaDevicesRequest media_devices_request; |
| 67 state_ = REQUEST_NOT_COMPLETE; | 68 state_ = REQUEST_NOT_COMPLETE; |
| 68 requestMediaDevices(media_devices_request); | 69 requestMediaDevices(media_devices_request); |
| 69 } | 70 } |
| 70 | 71 |
| 72 void RequestSources() { |
| 73 blink::WebMediaStreamTrackSourcesRequest sources_request; |
| 74 state_ = REQUEST_NOT_COMPLETE; |
| 75 requestSources(sources_request); |
| 76 } |
| 77 |
| 71 virtual void GetUserMediaRequestSucceeded( | 78 virtual void GetUserMediaRequestSucceeded( |
| 72 const blink::WebMediaStream& stream, | 79 const blink::WebMediaStream& stream, |
| 73 blink::WebUserMediaRequest* request_info) OVERRIDE { | 80 blink::WebUserMediaRequest* request_info) OVERRIDE { |
| 74 last_generated_stream_ = stream; | 81 last_generated_stream_ = stream; |
| 75 state_ = REQUEST_SUCCEEDED; | 82 state_ = REQUEST_SUCCEEDED; |
| 76 } | 83 } |
| 77 | 84 |
| 78 virtual void GetUserMediaRequestFailed( | 85 virtual void GetUserMediaRequestFailed( |
| 79 blink::WebUserMediaRequest* request_info, | 86 blink::WebUserMediaRequest* request_info, |
| 80 content::MediaStreamRequestResult result) OVERRIDE { | 87 content::MediaStreamRequestResult result) OVERRIDE { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 93 result_name_ = result_name; | 100 result_name_ = result_name; |
| 94 } | 101 } |
| 95 | 102 |
| 96 virtual void EnumerateDevicesSucceded( | 103 virtual void EnumerateDevicesSucceded( |
| 97 blink::WebMediaDevicesRequest* request, | 104 blink::WebMediaDevicesRequest* request, |
| 98 blink::WebVector<blink::WebMediaDeviceInfo>& devices) OVERRIDE { | 105 blink::WebVector<blink::WebMediaDeviceInfo>& devices) OVERRIDE { |
| 99 state_ = REQUEST_SUCCEEDED; | 106 state_ = REQUEST_SUCCEEDED; |
| 100 last_devices_ = devices; | 107 last_devices_ = devices; |
| 101 } | 108 } |
| 102 | 109 |
| 110 virtual void EnumerateSourcesSucceded( |
| 111 blink::WebMediaStreamTrackSourcesRequest* request, |
| 112 blink::WebVector<blink::WebSourceInfo>& sources) OVERRIDE { |
| 113 state_ = REQUEST_SUCCEEDED; |
| 114 last_sources_ = sources; |
| 115 } |
| 116 |
| 103 virtual MediaStreamVideoSource* CreateVideoSource( | 117 virtual MediaStreamVideoSource* CreateVideoSource( |
| 104 const StreamDeviceInfo& device, | 118 const StreamDeviceInfo& device, |
| 105 const MediaStreamSource::SourceStoppedCallback& stop_callback) OVERRIDE { | 119 const MediaStreamSource::SourceStoppedCallback& stop_callback) OVERRIDE { |
| 106 video_source_ = new MockMediaStreamVideoCapturerSource(device, | 120 video_source_ = new MockMediaStreamVideoCapturerSource(device, |
| 107 stop_callback, | 121 stop_callback, |
| 108 factory_); | 122 factory_); |
| 109 return video_source_; | 123 return video_source_; |
| 110 } | 124 } |
| 111 | 125 |
| 112 const blink::WebMediaStream& last_generated_stream() { | 126 const blink::WebMediaStream& last_generated_stream() { |
| 113 return last_generated_stream_; | 127 return last_generated_stream_; |
| 114 } | 128 } |
| 115 | 129 |
| 116 const blink::WebVector<blink::WebMediaDeviceInfo>& last_devices() { | 130 const blink::WebVector<blink::WebMediaDeviceInfo>& last_devices() { |
| 117 return last_devices_; | 131 return last_devices_; |
| 118 } | 132 } |
| 119 | 133 |
| 134 const blink::WebVector<blink::WebSourceInfo>& last_sources() { |
| 135 return last_sources_; |
| 136 } |
| 137 |
| 120 void ClearLastGeneratedStream() { | 138 void ClearLastGeneratedStream() { |
| 121 last_generated_stream_.reset(); | 139 last_generated_stream_.reset(); |
| 122 } | 140 } |
| 123 | 141 |
| 124 MockMediaStreamVideoCapturerSource* last_created_video_source() const { | 142 MockMediaStreamVideoCapturerSource* last_created_video_source() const { |
| 125 return video_source_; | 143 return video_source_; |
| 126 } | 144 } |
| 127 | 145 |
| 128 RequestState request_state() const { return state_; } | 146 RequestState request_state() const { return state_; } |
| 129 content::MediaStreamRequestResult error_reason() const { return result_; } | 147 content::MediaStreamRequestResult error_reason() const { return result_; } |
| 130 blink::WebString error_name() const { return result_name_; } | 148 blink::WebString error_name() const { return result_name_; } |
| 131 | 149 |
| 132 private: | 150 private: |
| 133 blink::WebMediaStream last_generated_stream_; | 151 blink::WebMediaStream last_generated_stream_; |
| 134 RequestState state_; | 152 RequestState state_; |
| 135 content::MediaStreamRequestResult result_; | 153 content::MediaStreamRequestResult result_; |
| 136 blink::WebString result_name_; | 154 blink::WebString result_name_; |
| 137 blink::WebVector<blink::WebMediaDeviceInfo> last_devices_; | 155 blink::WebVector<blink::WebMediaDeviceInfo> last_devices_; |
| 156 blink::WebVector<blink::WebSourceInfo> last_sources_; |
| 138 PeerConnectionDependencyFactory* factory_; | 157 PeerConnectionDependencyFactory* factory_; |
| 139 MockMediaStreamVideoCapturerSource* video_source_; | 158 MockMediaStreamVideoCapturerSource* video_source_; |
| 140 }; | 159 }; |
| 141 | 160 |
| 142 class UserMediaClientImplTest : public ::testing::Test { | 161 class UserMediaClientImplTest : public ::testing::Test { |
| 143 public: | 162 public: |
| 144 virtual void SetUp() { | 163 virtual void SetUp() { |
| 145 // Create our test object. | 164 // Create our test object. |
| 146 child_process_.reset(new ChildProcess()); | 165 child_process_.reset(new ChildProcess()); |
| 147 dependency_factory_.reset(new MockPeerConnectionDependencyFactory()); | 166 dependency_factory_.reset(new MockPeerConnectionDependencyFactory()); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 ms_dispatcher_->audio_input_request_id(), | 216 ms_dispatcher_->audio_input_request_id(), |
| 198 ms_dispatcher_->audio_input_array()); | 217 ms_dispatcher_->audio_input_array()); |
| 199 used_media_impl_->OnDevicesEnumerated( | 218 used_media_impl_->OnDevicesEnumerated( |
| 200 ms_dispatcher_->audio_output_request_id(), | 219 ms_dispatcher_->audio_output_request_id(), |
| 201 ms_dispatcher_->audio_output_array()); | 220 ms_dispatcher_->audio_output_array()); |
| 202 used_media_impl_->OnDevicesEnumerated( | 221 used_media_impl_->OnDevicesEnumerated( |
| 203 ms_dispatcher_->video_request_id(), | 222 ms_dispatcher_->video_request_id(), |
| 204 ms_dispatcher_->video_array()); | 223 ms_dispatcher_->video_array()); |
| 205 } | 224 } |
| 206 | 225 |
| 226 void FakeMediaStreamDispatcherRequestSourcesComplete() { |
| 227 used_media_impl_->OnDevicesEnumerated( |
| 228 ms_dispatcher_->audio_input_request_id(), |
| 229 ms_dispatcher_->audio_input_array()); |
| 230 used_media_impl_->OnDevicesEnumerated( |
| 231 ms_dispatcher_->video_request_id(), |
| 232 ms_dispatcher_->video_array()); |
| 233 } |
| 234 |
| 207 void StartMockedVideoSource() { | 235 void StartMockedVideoSource() { |
| 208 MockMediaStreamVideoCapturerSource* video_source = | 236 MockMediaStreamVideoCapturerSource* video_source = |
| 209 used_media_impl_->last_created_video_source(); | 237 used_media_impl_->last_created_video_source(); |
| 210 if (video_source->SourceHasAttemptedToStart()) | 238 if (video_source->SourceHasAttemptedToStart()) |
| 211 video_source->StartMockedSource(); | 239 video_source->StartMockedSource(); |
| 212 } | 240 } |
| 213 | 241 |
| 214 void FailToStartMockedVideoSource() { | 242 void FailToStartMockedVideoSource() { |
| 215 MockMediaStreamVideoCapturerSource* video_source = | 243 MockMediaStreamVideoCapturerSource* video_source = |
| 216 used_media_impl_->last_created_video_source(); | 244 used_media_impl_->last_created_video_source(); |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 video_track->Stop(); | 485 video_track->Stop(); |
| 458 EXPECT_EQ(1, ms_dispatcher_->stop_video_device_counter()); | 486 EXPECT_EQ(1, ms_dispatcher_->stop_video_device_counter()); |
| 459 } | 487 } |
| 460 | 488 |
| 461 TEST_F(UserMediaClientImplTest, EnumerateMediaDevices) { | 489 TEST_F(UserMediaClientImplTest, EnumerateMediaDevices) { |
| 462 used_media_impl_->RequestMediaDevices(); | 490 used_media_impl_->RequestMediaDevices(); |
| 463 FakeMediaStreamDispatcherRequestMediaDevicesComplete(); | 491 FakeMediaStreamDispatcherRequestMediaDevicesComplete(); |
| 464 | 492 |
| 465 EXPECT_EQ(UserMediaClientImplUnderTest::REQUEST_SUCCEEDED, | 493 EXPECT_EQ(UserMediaClientImplUnderTest::REQUEST_SUCCEEDED, |
| 466 used_media_impl_->request_state()); | 494 used_media_impl_->request_state()); |
| 495 EXPECT_EQ(static_cast<size_t>(5), used_media_impl_->last_devices().size()); |
| 467 | 496 |
| 468 // Audio input device with matched output ID. | 497 // Audio input device with matched output ID. |
| 469 EXPECT_FALSE(used_media_impl_->last_devices()[0].deviceId().isEmpty()); | 498 const blink::WebMediaDeviceInfo* device = |
| 499 &used_media_impl_->last_devices()[0]; |
| 500 EXPECT_FALSE(device->deviceId().isEmpty()); |
| 470 EXPECT_EQ(blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput, | 501 EXPECT_EQ(blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput, |
| 471 used_media_impl_->last_devices()[0].kind()); | 502 device->kind()); |
| 472 EXPECT_FALSE(used_media_impl_->last_devices()[0].label().isEmpty()); | 503 EXPECT_FALSE(device->label().isEmpty()); |
| 473 EXPECT_FALSE(used_media_impl_->last_devices()[0].groupId().isEmpty()); | 504 EXPECT_FALSE(device->groupId().isEmpty()); |
| 474 | 505 |
| 475 // Audio input device without matched output ID. | 506 // Audio input device without matched output ID. |
| 476 EXPECT_FALSE(used_media_impl_->last_devices()[1].deviceId().isEmpty()); | 507 device = &used_media_impl_->last_devices()[1]; |
| 508 EXPECT_FALSE(device->deviceId().isEmpty()); |
| 477 EXPECT_EQ(blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput, | 509 EXPECT_EQ(blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput, |
| 478 used_media_impl_->last_devices()[1].kind()); | 510 device->kind()); |
| 479 EXPECT_FALSE(used_media_impl_->last_devices()[1].label().isEmpty()); | 511 EXPECT_FALSE(device->label().isEmpty()); |
| 480 EXPECT_FALSE(used_media_impl_->last_devices()[1].groupId().isEmpty()); | 512 EXPECT_FALSE(device->groupId().isEmpty()); |
| 481 | 513 |
| 482 // Video input device. | 514 // Video input devices. |
| 483 EXPECT_FALSE(used_media_impl_->last_devices()[2].deviceId().isEmpty()); | 515 device = &used_media_impl_->last_devices()[2]; |
| 516 EXPECT_FALSE(device->deviceId().isEmpty()); |
| 484 EXPECT_EQ(blink::WebMediaDeviceInfo::MediaDeviceKindVideoInput, | 517 EXPECT_EQ(blink::WebMediaDeviceInfo::MediaDeviceKindVideoInput, |
| 485 used_media_impl_->last_devices()[2].kind()); | 518 device->kind()); |
| 486 EXPECT_FALSE(used_media_impl_->last_devices()[2].label().isEmpty()); | 519 EXPECT_FALSE(device->label().isEmpty()); |
| 487 EXPECT_TRUE(used_media_impl_->last_devices()[2].groupId().isEmpty()); | 520 EXPECT_TRUE(device->groupId().isEmpty()); |
| 521 |
| 522 device = &used_media_impl_->last_devices()[3]; |
| 523 EXPECT_FALSE(device->deviceId().isEmpty()); |
| 524 EXPECT_EQ(blink::WebMediaDeviceInfo::MediaDeviceKindVideoInput, |
| 525 device->kind()); |
| 526 EXPECT_FALSE(device->label().isEmpty()); |
| 527 EXPECT_TRUE(device->groupId().isEmpty()); |
| 488 | 528 |
| 489 // Audio output device. | 529 // Audio output device. |
| 490 EXPECT_FALSE(used_media_impl_->last_devices()[3].deviceId().isEmpty()); | 530 device = &used_media_impl_->last_devices()[4]; |
| 531 EXPECT_FALSE(device->deviceId().isEmpty()); |
| 491 EXPECT_EQ(blink::WebMediaDeviceInfo::MediaDeviceKindAudioOutput, | 532 EXPECT_EQ(blink::WebMediaDeviceInfo::MediaDeviceKindAudioOutput, |
| 492 used_media_impl_->last_devices()[3].kind()); | 533 device->kind()); |
| 493 EXPECT_FALSE(used_media_impl_->last_devices()[3].label().isEmpty()); | 534 EXPECT_FALSE(device->label().isEmpty()); |
| 494 EXPECT_FALSE(used_media_impl_->last_devices()[3].groupId().isEmpty()); | 535 EXPECT_FALSE(device->groupId().isEmpty()); |
| 495 | 536 |
| 496 // Verfify group IDs. | 537 // Verfify group IDs. |
| 497 EXPECT_TRUE(used_media_impl_->last_devices()[0].groupId().equals( | 538 EXPECT_TRUE(used_media_impl_->last_devices()[0].groupId().equals( |
| 498 used_media_impl_->last_devices()[3].groupId())); | 539 used_media_impl_->last_devices()[4].groupId())); |
| 499 EXPECT_FALSE(used_media_impl_->last_devices()[1].groupId().equals( | 540 EXPECT_FALSE(used_media_impl_->last_devices()[1].groupId().equals( |
| 500 used_media_impl_->last_devices()[3].groupId())); | 541 used_media_impl_->last_devices()[4].groupId())); |
| 542 } |
| 543 |
| 544 TEST_F(UserMediaClientImplTest, EnumerateSources) { |
| 545 used_media_impl_->RequestSources(); |
| 546 FakeMediaStreamDispatcherRequestSourcesComplete(); |
| 547 |
| 548 EXPECT_EQ(UserMediaClientImplUnderTest::REQUEST_SUCCEEDED, |
| 549 used_media_impl_->request_state()); |
| 550 EXPECT_EQ(static_cast<size_t>(4), used_media_impl_->last_sources().size()); |
| 551 |
| 552 // Audio input devices. |
| 553 const blink::WebSourceInfo* source = &used_media_impl_->last_sources()[0]; |
| 554 EXPECT_FALSE(source->id().isEmpty()); |
| 555 EXPECT_EQ(blink::WebSourceInfo::SourceKindAudio, source->kind()); |
| 556 EXPECT_FALSE(source->label().isEmpty()); |
| 557 EXPECT_EQ(blink::WebSourceInfo::VideoFacingModeNone, source->facing()); |
| 558 |
| 559 source = &used_media_impl_->last_sources()[1]; |
| 560 EXPECT_FALSE(source->id().isEmpty()); |
| 561 EXPECT_EQ(blink::WebSourceInfo::SourceKindAudio, source->kind()); |
| 562 EXPECT_FALSE(source->label().isEmpty()); |
| 563 EXPECT_EQ(blink::WebSourceInfo::VideoFacingModeNone, source->facing()); |
| 564 |
| 565 // Video input device user facing. |
| 566 source = &used_media_impl_->last_sources()[2]; |
| 567 EXPECT_FALSE(source->id().isEmpty()); |
| 568 EXPECT_EQ(blink::WebSourceInfo::SourceKindVideo, source->kind()); |
| 569 EXPECT_FALSE(source->label().isEmpty()); |
| 570 EXPECT_EQ(blink::WebSourceInfo::VideoFacingModeUser, source->facing()); |
| 571 |
| 572 // Video input device environment facing. |
| 573 source = &used_media_impl_->last_sources()[3]; |
| 574 EXPECT_FALSE(source->id().isEmpty()); |
| 575 EXPECT_EQ(blink::WebSourceInfo::SourceKindVideo, source->kind()); |
| 576 EXPECT_FALSE(source->label().isEmpty()); |
| 577 EXPECT_EQ(blink::WebSourceInfo::VideoFacingModeEnvironment, source->facing()); |
| 501 } | 578 } |
| 502 | 579 |
| 503 } // namespace content | 580 } // namespace content |
| OLD | NEW |