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.h" | 6 #include "base/message_loop.h" |
7 #include "base/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
| 8 #include "content/renderer/media/media_stream_extra_data.h" |
8 #include "content/renderer/media/media_stream_impl.h" | 9 #include "content/renderer/media/media_stream_impl.h" |
9 #include "content/renderer/media/mock_media_stream_dependency_factory.h" | 10 #include "content/renderer/media/mock_media_stream_dependency_factory.h" |
10 #include "content/renderer/media/mock_media_stream_dispatcher.h" | 11 #include "content/renderer/media/mock_media_stream_dispatcher.h" |
11 #include "content/renderer/media/mock_web_peer_connection_00_handler_client.h" | |
12 #include "content/renderer/media/mock_web_peer_connection_handler_client.h" | |
13 #include "content/renderer/media/peer_connection_handler_jsep.h" | |
14 #include "content/renderer/media/video_capture_impl_manager.h" | 12 #include "content/renderer/media/video_capture_impl_manager.h" |
15 #include "content/renderer/p2p/socket_dispatcher.h" | 13 #include "media/base/video_decoder.h" |
16 #include "media/base/message_loop_factory.h" | 14 #include "media/base/message_loop_factory.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
18 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStre
amComponent.h" | 16 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStre
amComponent.h" |
| 17 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStre
amDescriptor.h" |
19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStre
amSource.h" | 18 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStre
amSource.h" |
20 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebPeerConne
ction00Handler.h" | |
21 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebPeerConne
ctionHandler.h" | |
22 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebVector.h" | 19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebVector.h" |
23 | 20 |
24 class MediaStreamImplUnderTest : public MediaStreamImpl { | 21 class MediaStreamImplUnderTest : public MediaStreamImpl { |
25 public: | 22 public: |
26 MediaStreamImplUnderTest(MediaStreamDispatcher* media_stream_dispatcher, | 23 MediaStreamImplUnderTest(MediaStreamDispatcher* media_stream_dispatcher, |
27 content::P2PSocketDispatcher* p2p_socket_dispatcher, | |
28 VideoCaptureImplManager* vc_manager, | 24 VideoCaptureImplManager* vc_manager, |
29 MediaStreamDependencyFactory* dependency_factory) | 25 MediaStreamDependencyFactory* dependency_factory) |
30 : MediaStreamImpl(NULL, media_stream_dispatcher, p2p_socket_dispatcher, | 26 : MediaStreamImpl(NULL, media_stream_dispatcher, vc_manager, |
31 vc_manager, dependency_factory) { | 27 dependency_factory) { |
32 } | 28 } |
33 | 29 |
34 virtual void CompleteGetUserMediaRequest( | 30 virtual void CompleteGetUserMediaRequest( |
35 const WebKit::WebMediaStreamDescriptor& stream, | 31 const WebKit::WebMediaStreamDescriptor& stream, |
36 WebKit::WebUserMediaRequest* request) { | 32 WebKit::WebUserMediaRequest* request) { |
37 last_generated_stream_ = stream; | 33 last_generated_stream_ = stream; |
38 } | 34 } |
39 | 35 |
40 virtual WebKit::WebMediaStreamDescriptor GetMediaStream(const GURL& url) { | 36 virtual WebKit::WebMediaStreamDescriptor GetMediaStream(const GURL& url) { |
41 return last_generated_stream_; | 37 return last_generated_stream_; |
42 } | 38 } |
43 | 39 |
44 const WebKit::WebMediaStreamDescriptor& last_generated_stream() { | 40 const WebKit::WebMediaStreamDescriptor& last_generated_stream() { |
45 return last_generated_stream_; | 41 return last_generated_stream_; |
46 } | 42 } |
47 | 43 |
48 private: | 44 private: |
49 WebKit::WebMediaStreamDescriptor last_generated_stream_; | 45 WebKit::WebMediaStreamDescriptor last_generated_stream_; |
50 }; | 46 }; |
51 | 47 |
52 class MediaStreamImplTest : public ::testing::Test { | 48 class MediaStreamImplTest : public ::testing::Test { |
53 public: | 49 public: |
54 void SetUp() { | 50 void SetUp() { |
55 // Create our test object. | 51 // Create our test object. |
56 ms_dispatcher_.reset(new MockMediaStreamDispatcher()); | 52 ms_dispatcher_.reset(new MockMediaStreamDispatcher()); |
57 p2p_socket_dispatcher_ = new content::P2PSocketDispatcher( | |
58 loop_.message_loop_proxy()); | |
59 scoped_refptr<VideoCaptureImplManager> vc_manager( | 53 scoped_refptr<VideoCaptureImplManager> vc_manager( |
60 new VideoCaptureImplManager()); | 54 new VideoCaptureImplManager()); |
61 MockMediaStreamDependencyFactory* dependency_factory = | 55 dependency_factory_.reset(new MockMediaStreamDependencyFactory()); |
62 new MockMediaStreamDependencyFactory(vc_manager); | |
63 ms_impl_.reset(new MediaStreamImplUnderTest(ms_dispatcher_.get(), | 56 ms_impl_.reset(new MediaStreamImplUnderTest(ms_dispatcher_.get(), |
64 p2p_socket_dispatcher_.get(), | |
65 vc_manager.get(), | 57 vc_manager.get(), |
66 dependency_factory)); | 58 dependency_factory_.get())); |
67 } | |
68 | |
69 void TearDown() { | |
70 // Make sure the message created by | |
71 // P2PSocketDispatcher::AsyncMessageSender::Send is handled before | |
72 // tear down to avoid a memory leak. | |
73 loop_.RunAllPending(); | |
74 } | 59 } |
75 | 60 |
76 WebKit::WebMediaStreamDescriptor RequestLocalMediaStream(bool audio, | 61 WebKit::WebMediaStreamDescriptor RequestLocalMediaStream(bool audio, |
77 bool video) { | 62 bool video) { |
78 WebKit::WebUserMediaRequest user_media_request; | 63 WebKit::WebUserMediaRequest user_media_request; |
79 WebKit::WebVector<WebKit::WebMediaStreamSource> audio_sources( | 64 WebKit::WebVector<WebKit::WebMediaStreamSource> audio_sources( |
80 audio ? static_cast<size_t>(1) : 0); | 65 audio ? static_cast<size_t>(1) : 0); |
81 WebKit::WebVector<WebKit::WebMediaStreamSource> video_sources( | 66 WebKit::WebVector<WebKit::WebMediaStreamSource> video_sources( |
82 video ? static_cast<size_t>(1) : 0); | 67 video ? static_cast<size_t>(1) : 0); |
83 ms_impl_->requestUserMedia(user_media_request, audio_sources, | 68 ms_impl_->requestUserMedia(user_media_request, audio_sources, |
(...skipping 17 matching lines...) Expand all Loading... |
101 if (video) | 86 if (video) |
102 EXPECT_EQ(1u, extra_data->local_stream()->video_tracks()->count()); | 87 EXPECT_EQ(1u, extra_data->local_stream()->video_tracks()->count()); |
103 if (audio && video) { | 88 if (audio && video) { |
104 EXPECT_NE(extra_data->local_stream()->audio_tracks()->at(0)->label(), | 89 EXPECT_NE(extra_data->local_stream()->audio_tracks()->at(0)->label(), |
105 extra_data->local_stream()->video_tracks()->at(0)->label()); | 90 extra_data->local_stream()->video_tracks()->at(0)->label()); |
106 } | 91 } |
107 return desc; | 92 return desc; |
108 } | 93 } |
109 | 94 |
110 protected: | 95 protected: |
111 MessageLoop loop_; | |
112 scoped_ptr<MockMediaStreamDispatcher> ms_dispatcher_; | 96 scoped_ptr<MockMediaStreamDispatcher> ms_dispatcher_; |
113 scoped_refptr<content::P2PSocketDispatcher> p2p_socket_dispatcher_; | |
114 scoped_ptr<MediaStreamImplUnderTest> ms_impl_; | 97 scoped_ptr<MediaStreamImplUnderTest> ms_impl_; |
| 98 scoped_ptr<MockMediaStreamDependencyFactory> dependency_factory_; |
115 }; | 99 }; |
116 | 100 |
117 TEST_F(MediaStreamImplTest, CreatePeerConnection) { | |
118 // Create JSEP PeerConnection. | |
119 WebKit::MockWebPeerConnection00HandlerClient client_jsep; | |
120 scoped_ptr<WebKit::WebPeerConnection00Handler> pc_handler_jsep( | |
121 ms_impl_->CreatePeerConnectionHandlerJsep(&client_jsep)); | |
122 pc_handler_jsep.reset(); | |
123 } | |
124 | |
125 TEST_F(MediaStreamImplTest, LocalMediaStream) { | 101 TEST_F(MediaStreamImplTest, LocalMediaStream) { |
126 // Test a stream with both audio and video. | 102 // Test a stream with both audio and video. |
127 WebKit::WebMediaStreamDescriptor mixed_desc = RequestLocalMediaStream(true, | 103 WebKit::WebMediaStreamDescriptor mixed_desc = RequestLocalMediaStream(true, |
128 true); | 104 true); |
129 // Create a renderer for the stream. | 105 // Create a renderer for the stream. |
130 scoped_ptr<media::MessageLoopFactory> message_loop_factory( | 106 scoped_ptr<media::MessageLoopFactory> message_loop_factory( |
131 new media::MessageLoopFactory()); | 107 new media::MessageLoopFactory()); |
132 scoped_refptr<media::VideoDecoder> mixed_decoder( | 108 scoped_refptr<media::VideoDecoder> mixed_decoder( |
133 ms_impl_->GetVideoDecoder(GURL(), message_loop_factory.get())); | 109 ms_impl_->GetVideoDecoder(GURL(), message_loop_factory.get())); |
134 EXPECT_TRUE(mixed_decoder.get() != NULL); | 110 EXPECT_TRUE(mixed_decoder.get() != NULL); |
(...skipping 16 matching lines...) Expand all Loading... |
151 ms_impl_->StopLocalMediaStream(mixed_desc); | 127 ms_impl_->StopLocalMediaStream(mixed_desc); |
152 EXPECT_EQ(1, ms_dispatcher_->stop_stream_counter()); | 128 EXPECT_EQ(1, ms_dispatcher_->stop_stream_counter()); |
153 ms_impl_->StopLocalMediaStream(audio_desc); | 129 ms_impl_->StopLocalMediaStream(audio_desc); |
154 EXPECT_EQ(2, ms_dispatcher_->stop_stream_counter()); | 130 EXPECT_EQ(2, ms_dispatcher_->stop_stream_counter()); |
155 | 131 |
156 // Test that the MediaStreams are deleted if the owning WebFrame is deleted. | 132 // Test that the MediaStreams are deleted if the owning WebFrame is deleted. |
157 // In the unit test the owning frame is NULL. | 133 // In the unit test the owning frame is NULL. |
158 ms_impl_->FrameWillClose(NULL); | 134 ms_impl_->FrameWillClose(NULL); |
159 EXPECT_EQ(3, ms_dispatcher_->stop_stream_counter()); | 135 EXPECT_EQ(3, ms_dispatcher_->stop_stream_counter()); |
160 } | 136 } |
161 | |
162 TEST_F(MediaStreamImplTest, CloneLocalMediaStream) { | |
163 // Request a stream with both audio and video. | |
164 WebKit::WebMediaStreamDescriptor mixed_desc = | |
165 RequestLocalMediaStream(true, true); | |
166 | |
167 // Create a WebKit MediaStream description with the same sources as the | |
168 // sources used in the original requested media stream. | |
169 WebKit::WebMediaStreamDescriptor cloned_desc; | |
170 WebKit::WebVector<WebKit::WebMediaStreamComponent> compontents; | |
171 mixed_desc.audioSources(compontents); | |
172 WebKit::WebVector<WebKit::WebMediaStreamSource> audio_sources( | |
173 static_cast<size_t>(1)); | |
174 audio_sources[0] = compontents[0].source(); | |
175 mixed_desc.videoSources(compontents); | |
176 WebKit::WebVector<WebKit::WebMediaStreamSource> video_sources( | |
177 static_cast<size_t>(1)); | |
178 video_sources[0] = compontents[0].source(); | |
179 cloned_desc.initialize("cloned stream", audio_sources, video_sources); | |
180 | |
181 // Test that we can clone the local MediaStream. | |
182 ms_impl_->CreateMediaStream(NULL, &cloned_desc); | |
183 | |
184 MediaStreamExtraData* extra_data = static_cast<MediaStreamExtraData*>( | |
185 mixed_desc.extraData()); | |
186 | |
187 MediaStreamExtraData* cloned_extra_data = static_cast<MediaStreamExtraData*>( | |
188 cloned_desc.extraData()); | |
189 | |
190 ASSERT_TRUE(extra_data && extra_data->local_stream()); | |
191 ASSERT_TRUE(cloned_extra_data && cloned_extra_data->local_stream()); | |
192 ASSERT_EQ(1u, extra_data->local_stream()->video_tracks()->count()); | |
193 ASSERT_EQ(1u, extra_data->local_stream()->audio_tracks()->count()); | |
194 | |
195 EXPECT_EQ(1u, cloned_extra_data->local_stream()->video_tracks()->count()); | |
196 EXPECT_EQ(1u, cloned_extra_data->local_stream()->audio_tracks()->count()); | |
197 EXPECT_NE(extra_data->local_stream()->label(), | |
198 cloned_extra_data->local_stream()->label()); | |
199 } | |
200 | |
201 // Test that we don't crash if a MediaStream is created in WebKit with unknown | |
202 // sources. This can for example happen if a MediaStream is created with | |
203 // remote tracks. | |
204 TEST_F(MediaStreamImplTest, CreateInvalidMediaStream) { | |
205 // Create a WebKit MediaStream description. | |
206 WebKit::WebMediaStreamDescriptor desc; | |
207 WebKit::WebVector<WebKit::WebMediaStreamSource> audio_sources( | |
208 static_cast<size_t>(1)); | |
209 audio_sources[0].initialize("audio source", | |
210 WebKit::WebMediaStreamSource::TypeAudio, | |
211 "something"); | |
212 WebKit::WebVector<WebKit::WebMediaStreamSource> video_sources( | |
213 static_cast<size_t>(1)); | |
214 video_sources[0].initialize("video source", | |
215 WebKit::WebMediaStreamSource::TypeVideo, | |
216 "something"); | |
217 desc.initialize("new stream", audio_sources, video_sources); | |
218 | |
219 ms_impl_->CreateMediaStream(NULL, &desc); | |
220 MediaStreamExtraData* extra_data = static_cast<MediaStreamExtraData*>( | |
221 desc.extraData()); | |
222 | |
223 ASSERT_TRUE(extra_data && extra_data->local_stream()); | |
224 EXPECT_EQ(0u, extra_data->local_stream()->video_tracks()->count()); | |
225 EXPECT_EQ(0u, extra_data->local_stream()->audio_tracks()->count()); | |
226 } | |
OLD | NEW |