OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include <string> | |
6 | |
7 #include "base/memory/scoped_ptr.h" | |
8 #include "base/utf_string_conversions.h" | |
9 #include "content/renderer/media/media_stream_extra_data.h" | |
10 #include "content/renderer/media/mock_media_stream_dependency_factory.h" | |
11 #include "content/renderer/media/mock_peer_connection_impl.h" | |
12 #include "content/renderer/media/mock_web_rtc_peer_connection_handler_client.h" | |
13 #include "content/renderer/media/rtc_peer_connection_handler.h" | |
14 #include "testing/gtest/include/gtest/gtest.h" | |
15 #include "third_party/libjingle/source/talk/app/webrtc/peerconnectioninterface.h " | |
16 #include "third_party/WebKit/Source/Platform/chromium/public/WebMediaConstraints .h" | |
17 #include "third_party/WebKit/Source/Platform/chromium/public/WebMediaStreamDescr iptor.h" | |
18 #include "third_party/WebKit/Source/Platform/chromium/public/WebMediaStreamSourc e.h" | |
19 #include "third_party/WebKit/Source/Platform/chromium/public/WebRTCConfiguration .h" | |
20 #include "third_party/WebKit/Source/Platform/chromium/public/WebRTCICECandidate. h" | |
21 #include "third_party/WebKit/Source/Platform/chromium/public/WebRTCPeerConnectio nHandlerClient.h" | |
22 #include "third_party/WebKit/Source/Platform/chromium/public/WebRTCSessionDescri ption.h" | |
23 #include "third_party/WebKit/Source/Platform/chromium/public/WebRTCSessionDescri ptionRequest.h" | |
24 #include "third_party/WebKit/Source/Platform/chromium/public/WebRTCVoidRequest.h " | |
25 #include "third_party/WebKit/Source/Platform/chromium/public/WebURL.h" | |
26 | |
27 static const char kDummySdp[] = "dummy sdp"; | |
28 static const char kDummySdpType[] = "dummy type"; | |
29 | |
30 class RTCPeerConnectionHandlerUnderTest : public RTCPeerConnectionHandler { | |
31 public: | |
32 RTCPeerConnectionHandlerUnderTest( | |
33 WebKit::WebRTCPeerConnectionHandlerClient* client, | |
34 MediaStreamDependencyFactory* dependency_factory) | |
35 : RTCPeerConnectionHandler(client, dependency_factory) { | |
36 } | |
37 | |
38 webrtc::MockPeerConnectionImpl* native_peer_connection() { | |
39 return static_cast<webrtc::MockPeerConnectionImpl*>( | |
40 native_peer_connection_.get()); | |
41 } | |
42 }; | |
43 | |
44 class RTCPeerConnectionHandlerTest : public ::testing::Test { | |
45 public: | |
46 RTCPeerConnectionHandlerTest() : mock_peer_connection_(NULL) { | |
47 } | |
48 | |
49 void SetUp() { | |
50 mock_client_.reset(new WebKit::MockWebRTCPeerConnectionHandlerClient()); | |
51 mock_dependency_factory_.reset(new MockMediaStreamDependencyFactory()); | |
52 mock_dependency_factory_->EnsurePeerConnectionFactory(); | |
53 pc_handler_.reset( | |
54 new RTCPeerConnectionHandlerUnderTest(mock_client_.get(), | |
55 mock_dependency_factory_.get())); | |
56 | |
57 WebKit::WebRTCConfiguration config; | |
58 WebKit::WebMediaConstraints constraints; | |
59 EXPECT_TRUE(pc_handler_->initialize(config, constraints)); | |
60 | |
61 mock_peer_connection_ = pc_handler_->native_peer_connection(); | |
62 ASSERT_TRUE(mock_peer_connection_); | |
63 } | |
64 | |
65 void Initialize(const std::string& server, const std::string& password) { | |
66 WebKit::WebRTCConfiguration config; | |
67 WebKit::WebMediaConstraints constraints; | |
68 | |
69 // TODO(perkj): Test that the parameters in |config| can be translated when | |
70 // a WebRTCConfiguration can be constructed. It's WebKit class and can't be | |
71 // initialized from a test. | |
72 EXPECT_TRUE(pc_handler_->initialize(config, constraints)); | |
73 | |
74 mock_peer_connection_ = pc_handler_->native_peer_connection(); | |
75 ASSERT_TRUE(mock_peer_connection_); | |
76 } | |
77 | |
78 // Creates a WebKit local MediaStream. | |
79 WebKit::WebMediaStreamDescriptor CreateLocalMediaStream( | |
80 const std::string& stream_label) { | |
81 std::string video_track_label("video-label"); | |
82 std::string audio_track_label("audio-label"); | |
83 | |
84 talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface> native_stream( | |
85 mock_dependency_factory_->CreateLocalMediaStream(stream_label)); | |
86 talk_base::scoped_refptr<webrtc::LocalAudioTrackInterface> audio_track( | |
87 mock_dependency_factory_->CreateLocalAudioTrack(audio_track_label, | |
88 NULL)); | |
89 native_stream->AddTrack(audio_track); | |
90 talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> video_track( | |
91 mock_dependency_factory_->CreateLocalVideoTrack(video_track_label, 0)); | |
92 native_stream->AddTrack(video_track); | |
93 | |
94 WebKit::WebVector<WebKit::WebMediaStreamSource> audio_sources( | |
95 static_cast<size_t>(1)); | |
96 audio_sources[0].initialize(WebKit::WebString::fromUTF8(video_track_label), | |
97 WebKit::WebMediaStreamSource::TypeAudio, | |
98 WebKit::WebString::fromUTF8("audio_track")); | |
99 WebKit::WebVector<WebKit::WebMediaStreamSource> video_sources( | |
100 static_cast<size_t>(1)); | |
101 video_sources[0].initialize(WebKit::WebString::fromUTF8(video_track_label), | |
102 WebKit::WebMediaStreamSource::TypeVideo, | |
103 WebKit::WebString::fromUTF8("video_track")); | |
104 WebKit::WebMediaStreamDescriptor local_stream; | |
105 local_stream.initialize(UTF8ToUTF16(stream_label), audio_sources, | |
106 video_sources); | |
107 local_stream.setExtraData(new MediaStreamExtraData(native_stream)); | |
108 return local_stream; | |
109 } | |
110 | |
111 // Creates a remote MediaStream and adds it to the mocked native | |
112 // peer connection. | |
113 talk_base::scoped_refptr<webrtc::MediaStreamInterface> | |
tommi (sloooow) - chröme
2012/09/13 12:20:14
use Chrome's scoped_refptr wherever possible.
perkj_chrome
2012/09/13 13:41:34
Done.
| |
114 AddRemoteMockMediaStream(const std::string& stream_label, | |
115 const std::string& video_track_label, | |
116 const std::string& audio_track_label) { | |
117 // We use a local stream as a remote since for testing purposes we really | |
118 // only need the MediaStreamInterface. | |
119 talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface> stream( | |
120 mock_dependency_factory_->CreateLocalMediaStream(stream_label)); | |
121 if (!video_track_label.empty()) { | |
122 talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> video_track( | |
123 mock_dependency_factory_->CreateLocalVideoTrack(video_track_label, | |
124 0)); | |
125 stream->AddTrack(video_track); | |
126 } | |
127 if (!audio_track_label.empty()) { | |
128 talk_base::scoped_refptr<webrtc::LocalAudioTrackInterface> audio_track( | |
129 mock_dependency_factory_->CreateLocalAudioTrack(audio_track_label, | |
130 NULL)); | |
131 stream->AddTrack(audio_track); | |
132 } | |
133 mock_peer_connection_->AddRemoteStream(stream); | |
134 return stream; | |
135 } | |
136 | |
137 scoped_ptr<WebKit::MockWebRTCPeerConnectionHandlerClient> mock_client_; | |
138 scoped_ptr<MockMediaStreamDependencyFactory> mock_dependency_factory_; | |
139 scoped_ptr<RTCPeerConnectionHandlerUnderTest> pc_handler_; | |
140 | |
141 // Weak reference to the mocked native peer connection implementation. | |
142 webrtc::MockPeerConnectionImpl* mock_peer_connection_; | |
143 }; | |
144 | |
145 TEST_F(RTCPeerConnectionHandlerTest, Initialize) { | |
146 Initialize("dummy", "dummy_pwd"); | |
147 } | |
148 | |
149 TEST_F(RTCPeerConnectionHandlerTest, CreateOffer) { | |
150 WebKit::WebRTCSessionDescriptionRequest request; | |
151 WebKit::WebMediaConstraints options; | |
152 // TODO(perkj): Can WebKit::WebRTCSessionDescriptionRequest be changed so | |
153 // the |reqest| requestSucceeded can be tested? Currently the |request| object | |
154 // can not be initialized from a unit test. | |
155 EXPECT_FALSE(mock_peer_connection_->created_session_description() != NULL); | |
156 pc_handler_->createOffer(request, options); | |
157 EXPECT_TRUE(mock_peer_connection_->created_session_description() != NULL); | |
158 } | |
159 | |
160 TEST_F(RTCPeerConnectionHandlerTest, CreateAnser) { | |
161 WebKit::WebRTCSessionDescriptionRequest request; | |
162 WebKit::WebMediaConstraints options; | |
163 // TODO(perkj): Can WebKit::WebRTCSessionDescriptionRequest be changed so | |
164 // the |reqest| requestSucceeded can be tested? Currently the |request| object | |
165 // can not be initialized from a unit test. | |
166 EXPECT_FALSE(mock_peer_connection_->created_session_description() != NULL); | |
167 pc_handler_->createAnswer(request, options); | |
168 EXPECT_TRUE(mock_peer_connection_->created_session_description() != NULL); | |
169 } | |
170 | |
171 TEST_F(RTCPeerConnectionHandlerTest, setLocalDescription) { | |
172 WebKit::WebRTCVoidRequest request; | |
173 WebKit::WebRTCSessionDescription description; | |
174 description.initialize(kDummySdpType, kDummySdp); | |
175 pc_handler_->setLocalDescription(request, description); | |
176 EXPECT_EQ(description.type(), pc_handler_->localDescription().type()); | |
177 EXPECT_EQ(description.sdp(), pc_handler_->localDescription().sdp()); | |
178 | |
179 std::string sdp_string; | |
180 ASSERT_TRUE(mock_peer_connection_->local_description() != NULL); | |
181 EXPECT_EQ(kDummySdpType, mock_peer_connection_->local_description()->type()); | |
182 mock_peer_connection_->local_description()->ToString(&sdp_string); | |
183 EXPECT_EQ(kDummySdp, sdp_string); | |
184 } | |
185 | |
186 TEST_F(RTCPeerConnectionHandlerTest, setRemoteDescription) { | |
187 WebKit::WebRTCVoidRequest request; | |
188 WebKit::WebRTCSessionDescription description; | |
189 description.initialize(kDummySdpType, kDummySdp); | |
190 pc_handler_->setRemoteDescription(request, description); | |
191 EXPECT_EQ(description.type(), pc_handler_->remoteDescription().type()); | |
192 EXPECT_EQ(description.sdp(), pc_handler_->remoteDescription().sdp()); | |
193 | |
194 std::string sdp_string; | |
195 ASSERT_TRUE(mock_peer_connection_->remote_description() != NULL); | |
196 EXPECT_EQ(kDummySdpType, mock_peer_connection_->remote_description()->type()); | |
197 mock_peer_connection_->remote_description()->ToString(&sdp_string); | |
198 EXPECT_EQ(kDummySdp, sdp_string); | |
199 } | |
200 | |
201 TEST_F(RTCPeerConnectionHandlerTest, updateICE) { | |
202 WebKit::WebRTCConfiguration config; | |
203 WebKit::WebMediaConstraints constraints; | |
204 | |
205 // TODO(perkj): Test that the parameters in |config| can be translated when a | |
206 // WebRTCConfiguration can be constructed. It's WebKit class and can't be | |
207 // initialized from a test. | |
208 EXPECT_TRUE(pc_handler_->updateICE(config, constraints)); | |
209 } | |
210 | |
211 TEST_F(RTCPeerConnectionHandlerTest, addICECandidate) { | |
212 WebKit::WebRTCICECandidate candidate; | |
213 candidate.initialize(kDummySdp, "mid", 1); | |
214 EXPECT_TRUE(pc_handler_->addICECandidate(candidate)); | |
215 EXPECT_EQ(kDummySdp, mock_peer_connection_->ice_sdp()); | |
216 EXPECT_EQ(1, mock_peer_connection_->sdp_mline_index()); | |
217 EXPECT_EQ("mid", mock_peer_connection_->sdp_mid()); | |
218 } | |
219 | |
220 TEST_F(RTCPeerConnectionHandlerTest, addAndRemoveStream) { | |
221 std::string stream_label = "local_stream"; | |
222 WebKit::WebMediaStreamDescriptor local_stream( | |
223 CreateLocalMediaStream(stream_label)); | |
224 WebKit::WebMediaConstraints constraints; | |
225 | |
226 EXPECT_TRUE(pc_handler_->addStream(local_stream, constraints)); | |
227 EXPECT_EQ(stream_label, mock_peer_connection_->stream_label()); | |
228 EXPECT_EQ(1u, | |
229 mock_peer_connection_->local_streams()->at(0)->audio_tracks()->count()); | |
230 EXPECT_EQ(1u, | |
231 mock_peer_connection_->local_streams()->at(0)->video_tracks()->count()); | |
232 | |
233 pc_handler_->removeStream(local_stream); | |
234 EXPECT_EQ(0u, mock_peer_connection_->local_streams()->count()); | |
235 } | |
236 | |
237 TEST_F(RTCPeerConnectionHandlerTest, OnStateChange) { | |
238 // Ready states. | |
239 webrtc::PeerConnectionObserver::StateType state = | |
240 webrtc::PeerConnectionObserver::kReadyState; | |
241 mock_peer_connection_->SetReadyState( | |
242 webrtc::PeerConnectionInterface::kOpening); | |
243 pc_handler_->OnStateChange(state); | |
244 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ReadyStateOpening, | |
245 mock_client_->ready_state()); | |
246 mock_peer_connection_->SetReadyState( | |
247 webrtc::PeerConnectionInterface::kActive); | |
248 pc_handler_->OnStateChange(state); | |
249 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ReadyStateActive, | |
250 mock_client_->ready_state()); | |
251 mock_peer_connection_->SetReadyState( | |
252 webrtc::PeerConnectionInterface::kClosing); | |
253 pc_handler_->OnStateChange(state); | |
254 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ReadyStateClosing, | |
255 mock_client_->ready_state()); | |
256 mock_peer_connection_->SetReadyState( | |
257 webrtc::PeerConnectionInterface::kClosed); | |
258 pc_handler_->OnStateChange(state); | |
259 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ReadyStateClosed, | |
260 mock_client_->ready_state()); | |
261 | |
262 // Ice states. | |
263 state = webrtc::PeerConnectionObserver::kIceState; | |
264 mock_peer_connection_->SetIceState( | |
265 webrtc::PeerConnectionInterface::kIceGathering); | |
266 pc_handler_->OnStateChange(state); | |
267 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateGathering, | |
268 mock_client_->ice_state()); | |
269 mock_peer_connection_->SetIceState( | |
270 webrtc::PeerConnectionInterface::kIceWaiting); | |
271 pc_handler_->OnStateChange(state); | |
272 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateWaiting, | |
273 mock_client_->ice_state()); | |
274 mock_peer_connection_->SetIceState( | |
275 webrtc::PeerConnectionInterface::kIceChecking); | |
276 pc_handler_->OnStateChange(state); | |
277 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateChecking, | |
278 mock_client_->ice_state()); | |
279 mock_peer_connection_->SetIceState( | |
280 webrtc::PeerConnectionInterface::kIceConnected); | |
281 pc_handler_->OnStateChange(state); | |
282 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateConnected, | |
283 mock_client_->ice_state()); | |
284 mock_peer_connection_->SetIceState( | |
285 webrtc::PeerConnectionInterface::kIceCompleted); | |
286 pc_handler_->OnStateChange(state); | |
287 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateCompleted, | |
288 mock_client_->ice_state()); | |
289 mock_peer_connection_->SetIceState( | |
290 webrtc::PeerConnectionInterface::kIceFailed); | |
291 pc_handler_->OnStateChange(state); | |
292 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateFailed, | |
293 mock_client_->ice_state()); | |
294 mock_peer_connection_->SetIceState( | |
295 webrtc::PeerConnectionInterface::kIceClosed); | |
296 pc_handler_->OnStateChange(state); | |
297 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateClosed, | |
298 mock_client_->ice_state()); | |
299 } | |
300 | |
301 TEST_F(RTCPeerConnectionHandlerTest, OnAddAndOnRemoveStream) { | |
302 std::string remote_stream_label("remote_stream"); | |
303 talk_base::scoped_refptr<webrtc::MediaStreamInterface> remote_stream( | |
304 AddRemoteMockMediaStream(remote_stream_label, "video", "audio")); | |
305 pc_handler_->OnAddStream(remote_stream); | |
306 EXPECT_EQ(remote_stream_label, mock_client_->stream_label()); | |
307 | |
308 pc_handler_->OnRemoveStream(remote_stream); | |
309 EXPECT_TRUE(mock_client_->stream_label().empty()); | |
310 } | |
311 | |
312 TEST_F(RTCPeerConnectionHandlerTest, OnIceCandidateAndOnIceComplete) { | |
313 scoped_ptr<webrtc::IceCandidateInterface> native_candidate( | |
314 mock_dependency_factory_->CreateIceCandidate("mid", 1, kDummySdp)); | |
315 pc_handler_->OnIceCandidate(native_candidate.get()); | |
316 EXPECT_EQ("mid", mock_client_->candidate_mid()); | |
317 EXPECT_EQ(1, mock_client_->candidate_mlineindex()); | |
318 EXPECT_EQ(kDummySdp, mock_client_->candidate_sdp()); | |
319 | |
320 pc_handler_->OnIceComplete(); | |
321 EXPECT_EQ("", mock_client_->candidate_mid()); | |
322 EXPECT_EQ(-1, mock_client_->candidate_mlineindex()); | |
323 EXPECT_EQ("", mock_client_->candidate_sdp()); | |
324 } | |
325 | |
326 TEST_F(RTCPeerConnectionHandlerTest, OnRenegotiationNeeded) { | |
327 EXPECT_FALSE(mock_client_->renegotiate()); | |
328 pc_handler_->OnRenegotiationNeeded(); | |
329 EXPECT_TRUE(mock_client_->renegotiate()); | |
330 } | |
OLD | NEW |