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_impl.h" | 10 #include "content/renderer/media/media_stream_impl.h" |
11 #include "content/renderer/media/media_stream_track.h" | 11 #include "content/renderer/media/media_stream_track.h" |
12 #include "content/renderer/media/mock_media_stream_dispatcher.h" | 12 #include "content/renderer/media/mock_media_stream_dispatcher.h" |
13 #include "content/renderer/media/mock_media_stream_video_source.h" | 13 #include "content/renderer/media/mock_media_stream_video_source.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/WebMediaStream.h" | 17 #include "third_party/WebKit/public/platform/WebMediaStream.h" |
17 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" | 18 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h" |
18 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" | 19 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" |
19 #include "third_party/WebKit/public/platform/WebString.h" | 20 #include "third_party/WebKit/public/platform/WebString.h" |
20 #include "third_party/WebKit/public/platform/WebVector.h" | 21 #include "third_party/WebKit/public/platform/WebVector.h" |
21 | 22 |
22 namespace content { | 23 namespace content { |
23 | 24 |
24 class MockMediaStreamVideoCapturerSource : public MockMediaStreamVideoSource { | 25 class MockMediaStreamVideoCapturerSource : public MockMediaStreamVideoSource { |
25 public: | 26 public: |
(...skipping 24 matching lines...) Expand all Loading... |
50 factory_(dependency_factory), | 51 factory_(dependency_factory), |
51 video_source_(NULL) { | 52 video_source_(NULL) { |
52 } | 53 } |
53 | 54 |
54 void RequestUserMedia() { | 55 void RequestUserMedia() { |
55 blink::WebUserMediaRequest user_media_request; | 56 blink::WebUserMediaRequest user_media_request; |
56 state_ = REQUEST_NOT_COMPLETE; | 57 state_ = REQUEST_NOT_COMPLETE; |
57 requestUserMedia(user_media_request); | 58 requestUserMedia(user_media_request); |
58 } | 59 } |
59 | 60 |
| 61 void RequestMediaDevices() { |
| 62 blink::WebMediaDevicesRequest media_devices_request; |
| 63 state_ = REQUEST_NOT_COMPLETE; |
| 64 requestMediaDevices(media_devices_request); |
| 65 } |
| 66 |
60 virtual void GetUserMediaRequestSucceeded( | 67 virtual void GetUserMediaRequestSucceeded( |
61 const blink::WebMediaStream& stream, | 68 const blink::WebMediaStream& stream, |
62 blink::WebUserMediaRequest* request_info) OVERRIDE { | 69 blink::WebUserMediaRequest* request_info) OVERRIDE { |
63 last_generated_stream_ = stream; | 70 last_generated_stream_ = stream; |
64 state_ = REQUEST_SUCCEEDED; | 71 state_ = REQUEST_SUCCEEDED; |
65 } | 72 } |
66 | 73 |
67 virtual void GetUserMediaRequestFailed( | 74 virtual void GetUserMediaRequestFailed( |
68 blink::WebUserMediaRequest* request_info, | 75 blink::WebUserMediaRequest* request_info, |
69 content::MediaStreamRequestResult result) OVERRIDE { | 76 content::MediaStreamRequestResult result) OVERRIDE { |
70 last_generated_stream_.reset(); | 77 last_generated_stream_.reset(); |
71 state_ = REQUEST_FAILED; | 78 state_ = REQUEST_FAILED; |
72 result_ = result; | 79 result_ = result; |
73 } | 80 } |
74 | 81 |
| 82 virtual void EnumerateDevicesSucceded( |
| 83 blink::WebMediaDevicesRequest* request, |
| 84 blink::WebVector<blink::WebMediaDeviceInfo>& devices) OVERRIDE { |
| 85 state_ = REQUEST_SUCCEEDED; |
| 86 last_devices_ = devices; |
| 87 } |
| 88 |
75 virtual MediaStreamVideoSource* CreateVideoSource( | 89 virtual MediaStreamVideoSource* CreateVideoSource( |
76 const StreamDeviceInfo& device, | 90 const StreamDeviceInfo& device, |
77 const MediaStreamSource::SourceStoppedCallback& stop_callback) OVERRIDE { | 91 const MediaStreamSource::SourceStoppedCallback& stop_callback) OVERRIDE { |
78 video_source_ = new MockMediaStreamVideoCapturerSource(device, | 92 video_source_ = new MockMediaStreamVideoCapturerSource(device, |
79 stop_callback, | 93 stop_callback, |
80 factory_); | 94 factory_); |
81 return video_source_; | 95 return video_source_; |
82 } | 96 } |
83 | 97 |
84 const blink::WebMediaStream& last_generated_stream() { | 98 const blink::WebMediaStream& last_generated_stream() { |
85 return last_generated_stream_; | 99 return last_generated_stream_; |
86 } | 100 } |
87 | 101 |
| 102 const blink::WebVector<blink::WebMediaDeviceInfo>& last_devices() { |
| 103 return last_devices_; |
| 104 } |
| 105 |
88 void ClearLastGeneratedStream() { | 106 void ClearLastGeneratedStream() { |
89 last_generated_stream_.reset(); | 107 last_generated_stream_.reset(); |
90 } | 108 } |
91 | 109 |
92 MockMediaStreamVideoCapturerSource* last_created_video_source() const { | 110 MockMediaStreamVideoCapturerSource* last_created_video_source() const { |
93 return video_source_; | 111 return video_source_; |
94 } | 112 } |
95 | 113 |
96 RequestState request_state() const { return state_; } | 114 RequestState request_state() const { return state_; } |
97 content::MediaStreamRequestResult error_reason() const { return result_; } | 115 content::MediaStreamRequestResult error_reason() const { return result_; } |
98 | 116 |
99 private: | 117 private: |
100 blink::WebMediaStream last_generated_stream_; | 118 blink::WebMediaStream last_generated_stream_; |
101 RequestState state_; | 119 RequestState state_; |
102 content::MediaStreamRequestResult result_; | 120 content::MediaStreamRequestResult result_; |
| 121 blink::WebVector<blink::WebMediaDeviceInfo> last_devices_; |
103 PeerConnectionDependencyFactory* factory_; | 122 PeerConnectionDependencyFactory* factory_; |
104 MockMediaStreamVideoCapturerSource* video_source_; | 123 MockMediaStreamVideoCapturerSource* video_source_; |
105 }; | 124 }; |
106 | 125 |
107 class MediaStreamImplTest : public ::testing::Test { | 126 class MediaStreamImplTest : public ::testing::Test { |
108 public: | 127 public: |
109 virtual void SetUp() { | 128 virtual void SetUp() { |
110 // Create our test object. | 129 // Create our test object. |
111 child_process_.reset(new ChildProcess()); | 130 child_process_.reset(new ChildProcess()); |
112 ms_dispatcher_.reset(new MockMediaStreamDispatcher()); | 131 ms_dispatcher_.reset(new MockMediaStreamDispatcher()); |
113 dependency_factory_.reset(new MockPeerConnectionDependencyFactory()); | 132 dependency_factory_.reset(new MockPeerConnectionDependencyFactory()); |
114 ms_impl_.reset(new MediaStreamImplUnderTest(ms_dispatcher_.get(), | 133 ms_impl_.reset(new MediaStreamImplUnderTest(ms_dispatcher_.get(), |
115 dependency_factory_.get())); | 134 dependency_factory_.get())); |
116 } | 135 } |
117 | 136 |
118 blink::WebMediaStream RequestLocalMediaStream() { | 137 blink::WebMediaStream RequestLocalMediaStream() { |
119 ms_impl_->RequestUserMedia(); | 138 ms_impl_->RequestUserMedia(); |
120 FakeMediaStreamDispatcherComplete(); | 139 FakeMediaStreamDispatcherRequestUserMediaComplete(); |
121 StartMockedVideoSource(); | 140 StartMockedVideoSource(); |
122 | 141 |
123 EXPECT_EQ(MediaStreamImplUnderTest::REQUEST_SUCCEEDED, | 142 EXPECT_EQ(MediaStreamImplUnderTest::REQUEST_SUCCEEDED, |
124 ms_impl_->request_state()); | 143 ms_impl_->request_state()); |
125 | 144 |
126 blink::WebMediaStream desc = ms_impl_->last_generated_stream(); | 145 blink::WebMediaStream desc = ms_impl_->last_generated_stream(); |
127 content::MediaStream* native_stream = | 146 content::MediaStream* native_stream = |
128 content::MediaStream::GetMediaStream(desc); | 147 content::MediaStream::GetMediaStream(desc); |
129 if (!native_stream) { | 148 if (!native_stream) { |
130 ADD_FAILURE(); | 149 ADD_FAILURE(); |
131 return desc; | 150 return desc; |
132 } | 151 } |
133 | 152 |
134 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; | 153 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; |
135 desc.audioTracks(audio_tracks); | 154 desc.audioTracks(audio_tracks); |
136 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; | 155 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; |
137 desc.videoTracks(video_tracks); | 156 desc.videoTracks(video_tracks); |
138 | 157 |
139 EXPECT_EQ(1u, audio_tracks.size()); | 158 EXPECT_EQ(1u, audio_tracks.size()); |
140 EXPECT_EQ(1u, video_tracks.size()); | 159 EXPECT_EQ(1u, video_tracks.size()); |
141 EXPECT_NE(audio_tracks[0].id(), video_tracks[0].id()); | 160 EXPECT_NE(audio_tracks[0].id(), video_tracks[0].id()); |
142 return desc; | 161 return desc; |
143 } | 162 } |
144 | 163 |
145 void FakeMediaStreamDispatcherComplete() { | 164 void FakeMediaStreamDispatcherRequestUserMediaComplete() { |
146 ms_impl_->OnStreamGenerated(ms_dispatcher_->request_id(), | 165 // Audio request ID is used as the shared request ID. |
| 166 ms_impl_->OnStreamGenerated(ms_dispatcher_->audio_request_id(), |
147 ms_dispatcher_->stream_label(), | 167 ms_dispatcher_->stream_label(), |
148 ms_dispatcher_->audio_array(), | 168 ms_dispatcher_->audio_array(), |
149 ms_dispatcher_->video_array()); | 169 ms_dispatcher_->video_array()); |
150 } | 170 } |
151 | 171 |
| 172 void FakeMediaStreamDispatcherRequestMediaDevicesComplete() { |
| 173 ms_impl_->OnDevicesEnumerated(ms_dispatcher_->audio_request_id(), |
| 174 ms_dispatcher_->audio_array()); |
| 175 ms_impl_->OnDevicesEnumerated(ms_dispatcher_->video_request_id(), |
| 176 ms_dispatcher_->video_array()); |
| 177 } |
| 178 |
152 void StartMockedVideoSource() { | 179 void StartMockedVideoSource() { |
153 MockMediaStreamVideoCapturerSource* video_source = | 180 MockMediaStreamVideoCapturerSource* video_source = |
154 ms_impl_->last_created_video_source(); | 181 ms_impl_->last_created_video_source(); |
155 if (video_source->SourceHasAttemptedToStart()) | 182 if (video_source->SourceHasAttemptedToStart()) |
156 video_source->StartMockedSource(); | 183 video_source->StartMockedSource(); |
157 } | 184 } |
158 | 185 |
159 void FailToStartMockedVideoSource() { | 186 void FailToStartMockedVideoSource() { |
160 MockMediaStreamVideoCapturerSource* video_source = | 187 MockMediaStreamVideoCapturerSource* video_source = |
161 ms_impl_->last_created_video_source(); | 188 ms_impl_->last_created_video_source(); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 // Test that the MediaStreams are deleted if the owning WebFrame is deleted. | 337 // Test that the MediaStreams are deleted if the owning WebFrame is deleted. |
311 // In the unit test the owning frame is NULL. | 338 // In the unit test the owning frame is NULL. |
312 ms_impl_->FrameWillClose(NULL); | 339 ms_impl_->FrameWillClose(NULL); |
313 EXPECT_EQ(1, ms_dispatcher_->stop_audio_device_counter()); | 340 EXPECT_EQ(1, ms_dispatcher_->stop_audio_device_counter()); |
314 EXPECT_EQ(1, ms_dispatcher_->stop_video_device_counter()); | 341 EXPECT_EQ(1, ms_dispatcher_->stop_video_device_counter()); |
315 } | 342 } |
316 | 343 |
317 // This test what happens if a video source to a MediaSteam fails to start. | 344 // This test what happens if a video source to a MediaSteam fails to start. |
318 TEST_F(MediaStreamImplTest, MediaVideoSourceFailToStart) { | 345 TEST_F(MediaStreamImplTest, MediaVideoSourceFailToStart) { |
319 ms_impl_->RequestUserMedia(); | 346 ms_impl_->RequestUserMedia(); |
320 FakeMediaStreamDispatcherComplete(); | 347 FakeMediaStreamDispatcherRequestUserMediaComplete(); |
321 FailToStartMockedVideoSource(); | 348 FailToStartMockedVideoSource(); |
322 EXPECT_EQ(MediaStreamImplUnderTest::REQUEST_FAILED, | 349 EXPECT_EQ(MediaStreamImplUnderTest::REQUEST_FAILED, |
323 ms_impl_->request_state()); | 350 ms_impl_->request_state()); |
324 EXPECT_EQ(MEDIA_DEVICE_TRACK_START_FAILURE, | 351 EXPECT_EQ(MEDIA_DEVICE_TRACK_START_FAILURE, |
325 ms_impl_->error_reason()); | 352 ms_impl_->error_reason()); |
326 EXPECT_EQ(1, ms_dispatcher_->request_stream_counter()); | 353 EXPECT_EQ(1, ms_dispatcher_->request_stream_counter()); |
327 EXPECT_EQ(1, ms_dispatcher_->stop_audio_device_counter()); | 354 EXPECT_EQ(1, ms_dispatcher_->stop_audio_device_counter()); |
328 EXPECT_EQ(1, ms_dispatcher_->stop_video_device_counter()); | 355 EXPECT_EQ(1, ms_dispatcher_->stop_video_device_counter()); |
329 } | 356 } |
330 | 357 |
331 // This test what happens if an audio source fail to initialize. | 358 // This test what happens if an audio source fail to initialize. |
332 TEST_F(MediaStreamImplTest, MediaAudioSourceFailToInitialize) { | 359 TEST_F(MediaStreamImplTest, MediaAudioSourceFailToInitialize) { |
333 FailToCreateNextAudioCapturer(); | 360 FailToCreateNextAudioCapturer(); |
334 ms_impl_->RequestUserMedia(); | 361 ms_impl_->RequestUserMedia(); |
335 FakeMediaStreamDispatcherComplete(); | 362 FakeMediaStreamDispatcherRequestUserMediaComplete(); |
336 StartMockedVideoSource(); | 363 StartMockedVideoSource(); |
337 EXPECT_EQ(MediaStreamImplUnderTest::REQUEST_FAILED, | 364 EXPECT_EQ(MediaStreamImplUnderTest::REQUEST_FAILED, |
338 ms_impl_->request_state()); | 365 ms_impl_->request_state()); |
339 EXPECT_EQ(MEDIA_DEVICE_TRACK_START_FAILURE, | 366 EXPECT_EQ(MEDIA_DEVICE_TRACK_START_FAILURE, |
340 ms_impl_->error_reason()); | 367 ms_impl_->error_reason()); |
341 EXPECT_EQ(1, ms_dispatcher_->request_stream_counter()); | 368 EXPECT_EQ(1, ms_dispatcher_->request_stream_counter()); |
342 EXPECT_EQ(1, ms_dispatcher_->stop_audio_device_counter()); | 369 EXPECT_EQ(1, ms_dispatcher_->stop_audio_device_counter()); |
343 EXPECT_EQ(1, ms_dispatcher_->stop_video_device_counter()); | 370 EXPECT_EQ(1, ms_dispatcher_->stop_video_device_counter()); |
344 } | 371 } |
345 | 372 |
346 // This test what happens if MediaStreamImpl is deleted before a source has | 373 // This test what happens if MediaStreamImpl is deleted before a source has |
347 // started. | 374 // started. |
348 TEST_F(MediaStreamImplTest, MediaStreamImplShutDown) { | 375 TEST_F(MediaStreamImplTest, MediaStreamImplShutDown) { |
349 ms_impl_->RequestUserMedia(); | 376 ms_impl_->RequestUserMedia(); |
350 FakeMediaStreamDispatcherComplete(); | 377 FakeMediaStreamDispatcherRequestUserMediaComplete(); |
351 EXPECT_EQ(1, ms_dispatcher_->request_stream_counter()); | 378 EXPECT_EQ(1, ms_dispatcher_->request_stream_counter()); |
352 EXPECT_EQ(MediaStreamImplUnderTest::REQUEST_NOT_COMPLETE, | 379 EXPECT_EQ(MediaStreamImplUnderTest::REQUEST_NOT_COMPLETE, |
353 ms_impl_->request_state()); | 380 ms_impl_->request_state()); |
354 ms_impl_.reset(); | 381 ms_impl_.reset(); |
355 } | 382 } |
356 | 383 |
357 // This test what happens if the WebFrame is closed while the MediaStream is | 384 // This test what happens if the WebFrame is closed while the MediaStream is |
358 // being generated by the MediaStreamDispatcher. | 385 // being generated by the MediaStreamDispatcher. |
359 TEST_F(MediaStreamImplTest, ReloadFrameWhileGeneratingStream) { | 386 TEST_F(MediaStreamImplTest, ReloadFrameWhileGeneratingStream) { |
360 ms_impl_->RequestUserMedia(); | 387 ms_impl_->RequestUserMedia(); |
361 ms_impl_->FrameWillClose(NULL); | 388 ms_impl_->FrameWillClose(NULL); |
362 EXPECT_EQ(1, ms_dispatcher_->request_stream_counter()); | 389 EXPECT_EQ(1, ms_dispatcher_->request_stream_counter()); |
363 EXPECT_EQ(0, ms_dispatcher_->stop_audio_device_counter()); | 390 EXPECT_EQ(0, ms_dispatcher_->stop_audio_device_counter()); |
364 EXPECT_EQ(0, ms_dispatcher_->stop_video_device_counter()); | 391 EXPECT_EQ(0, ms_dispatcher_->stop_video_device_counter()); |
365 EXPECT_EQ(MediaStreamImplUnderTest::REQUEST_NOT_COMPLETE, | 392 EXPECT_EQ(MediaStreamImplUnderTest::REQUEST_NOT_COMPLETE, |
366 ms_impl_->request_state()); | 393 ms_impl_->request_state()); |
367 } | 394 } |
368 | 395 |
369 // This test what happens if the WebFrame is closed while the sources are being | 396 // This test what happens if the WebFrame is closed while the sources are being |
370 // started. | 397 // started. |
371 TEST_F(MediaStreamImplTest, ReloadFrameWhileGeneratingSources) { | 398 TEST_F(MediaStreamImplTest, ReloadFrameWhileGeneratingSources) { |
372 ms_impl_->RequestUserMedia(); | 399 ms_impl_->RequestUserMedia(); |
373 FakeMediaStreamDispatcherComplete(); | 400 FakeMediaStreamDispatcherRequestUserMediaComplete(); |
374 EXPECT_EQ(1, ms_dispatcher_->request_stream_counter()); | 401 EXPECT_EQ(1, ms_dispatcher_->request_stream_counter()); |
375 ms_impl_->FrameWillClose(NULL); | 402 ms_impl_->FrameWillClose(NULL); |
376 EXPECT_EQ(1, ms_dispatcher_->stop_audio_device_counter()); | 403 EXPECT_EQ(1, ms_dispatcher_->stop_audio_device_counter()); |
377 EXPECT_EQ(1, ms_dispatcher_->stop_video_device_counter()); | 404 EXPECT_EQ(1, ms_dispatcher_->stop_video_device_counter()); |
378 EXPECT_EQ(MediaStreamImplUnderTest::REQUEST_NOT_COMPLETE, | 405 EXPECT_EQ(MediaStreamImplUnderTest::REQUEST_NOT_COMPLETE, |
379 ms_impl_->request_state()); | 406 ms_impl_->request_state()); |
380 } | 407 } |
381 | 408 |
382 // This test what happens if stop is called on a track after the frame has | 409 // This test what happens if stop is called on a track after the frame has |
383 // been reloaded. | 410 // been reloaded. |
(...skipping 10 matching lines...) Expand all Loading... |
394 audio_track->Stop(); | 421 audio_track->Stop(); |
395 EXPECT_EQ(1, ms_dispatcher_->stop_audio_device_counter()); | 422 EXPECT_EQ(1, ms_dispatcher_->stop_audio_device_counter()); |
396 | 423 |
397 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; | 424 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; |
398 mixed_desc.videoTracks(video_tracks); | 425 mixed_desc.videoTracks(video_tracks); |
399 MediaStreamTrack* video_track = MediaStreamTrack::GetTrack(video_tracks[0]); | 426 MediaStreamTrack* video_track = MediaStreamTrack::GetTrack(video_tracks[0]); |
400 video_track->Stop(); | 427 video_track->Stop(); |
401 EXPECT_EQ(1, ms_dispatcher_->stop_video_device_counter()); | 428 EXPECT_EQ(1, ms_dispatcher_->stop_video_device_counter()); |
402 } | 429 } |
403 | 430 |
| 431 TEST_F(MediaStreamImplTest, EnumerateMediaDevices) { |
| 432 ms_impl_->RequestMediaDevices(); |
| 433 FakeMediaStreamDispatcherRequestMediaDevicesComplete(); |
| 434 |
| 435 EXPECT_EQ(MediaStreamImplUnderTest::REQUEST_SUCCEEDED, |
| 436 ms_impl_->request_state()); |
| 437 |
| 438 EXPECT_FALSE(ms_impl_->last_devices()[0].deviceId().isEmpty()); |
| 439 EXPECT_EQ(blink::WebMediaDeviceInfo::MediaDeviceKindAudioInput, |
| 440 ms_impl_->last_devices()[0].kind()); |
| 441 EXPECT_FALSE(ms_impl_->last_devices()[0].label().isEmpty()); |
| 442 |
| 443 EXPECT_FALSE(ms_impl_->last_devices()[1].deviceId().isEmpty()); |
| 444 EXPECT_EQ(blink::WebMediaDeviceInfo::MediaDeviceKindVideoInput, |
| 445 ms_impl_->last_devices()[1].kind()); |
| 446 EXPECT_FALSE(ms_impl_->last_devices()[1].label().isEmpty()); |
| 447 } |
| 448 |
404 } // namespace content | 449 } // namespace content |
OLD | NEW |