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 |