Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: content/renderer/media/rtc_peer_connection_handler_unittest.cc

Issue 10703095: New PeerConnection handler in Chrome to support latest PeerConnection draft (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix code review issues found by Wei. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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_web_rtc_peer_connection_handler_client.h"
12 #include "content/renderer/media/mock_peer_connection_impl.h"
Ronghua Wu (Left Chromium) 2012/08/14 00:59:03 order
perkj_chrome 2012/08/14 09:15:40 Done.
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/WebRTCICECandidateD escriptor.h"
21 #include "third_party/WebKit/Source/Platform/chromium/public/WebRTCPeerConnectio nHandlerClient.h"
22 #include "third_party/WebKit/Source/Platform/chromium/public/WebRTCSessionDescri ptionDescriptor.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(
52 new MockMediaStreamDependencyFactory(NULL));
53 mock_dependency_factory_->CreatePeerConnectionFactory(NULL,
54 NULL,
55 NULL,
56 NULL,
57 NULL);
58 pc_handler_.reset(
59 new RTCPeerConnectionHandlerUnderTest(mock_client_.get(),
60 mock_dependency_factory_.get()));
61
62 WebKit::WebRTCConfiguration config;
63 WebKit::WebMediaConstraints constraints;
64 EXPECT_TRUE(pc_handler_->initialize(config, constraints));
65
66 mock_peer_connection_ = pc_handler_->native_peer_connection();
67 ASSERT_TRUE(mock_peer_connection_);
68 }
69
70 void Initialize(const std::string& server, const std::string& password) {
71 WebKit::WebRTCConfiguration config;
72 WebKit::WebMediaConstraints constraints;
73
74 // TODO(perkj): Test that the parameters in |config| can be translated when
75 // a WebRTCConfiguration can be constructed. It's WebKit class and can't be
76 // initialized from a test.
77 EXPECT_TRUE(pc_handler_->initialize(config, constraints));
78
79 mock_peer_connection_ = pc_handler_->native_peer_connection();
80 ASSERT_TRUE(mock_peer_connection_);
81 }
82
83 // Creates a WebKit local MediaStream.
84 WebKit::WebMediaStreamDescriptor CreateLocalMediaStream(
85 const std::string& stream_label) {
86 std::string video_track_label("video-label");
87 std::string audio_track_label("audio-label");
88
89 talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface> native_stream(
90 mock_dependency_factory_->CreateLocalMediaStream(stream_label));
91 talk_base::scoped_refptr<webrtc::LocalAudioTrackInterface> audio_track(
92 mock_dependency_factory_->CreateLocalAudioTrack(audio_track_label,
93 NULL));
94 native_stream->AddTrack(audio_track);
95 talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> video_track(
96 mock_dependency_factory_->CreateLocalVideoTrack(video_track_label, 0));
97 native_stream->AddTrack(video_track);
98
99 WebKit::WebVector<WebKit::WebMediaStreamSource> audio_sources(
100 static_cast<size_t>(1));
101 audio_sources[0].initialize(WebKit::WebString::fromUTF8(video_track_label),
102 WebKit::WebMediaStreamSource::TypeAudio,
103 WebKit::WebString::fromUTF8("audio_track"));
104 WebKit::WebVector<WebKit::WebMediaStreamSource> video_sources(
105 static_cast<size_t>(1));
106 video_sources[0].initialize(WebKit::WebString::fromUTF8(video_track_label),
107 WebKit::WebMediaStreamSource::TypeVideo,
108 WebKit::WebString::fromUTF8("video_track"));
109 WebKit::WebMediaStreamDescriptor local_stream;
110 local_stream.initialize(UTF8ToUTF16(stream_label), audio_sources,
111 video_sources);
112 local_stream.setExtraData(new MediaStreamExtraData(native_stream));
113 return local_stream;
114 }
115
116 // Creates a remote MediaStream and adds it to the mocked native
117 // peer connection.
118 talk_base::scoped_refptr<webrtc::MediaStreamInterface>
119 AddRemoteMockMediaStream(const std::string& stream_label,
120 const std::string& video_track_label,
121 const std::string& audio_track_label) {
122 // We use a local stream as a remote since for testing purposes we really
123 // only need the MediaStreamInterface.
124 talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface> stream(
125 mock_dependency_factory_->CreateLocalMediaStream(stream_label));
126 if (!video_track_label.empty()) {
127 talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> video_track(
128 mock_dependency_factory_->CreateLocalVideoTrack(video_track_label,
129 0));
130 stream->AddTrack(video_track);
131 }
132 if (!audio_track_label.empty()) {
133 talk_base::scoped_refptr<webrtc::LocalAudioTrackInterface> audio_track(
134 mock_dependency_factory_->CreateLocalAudioTrack(audio_track_label,
135 NULL));
136 stream->AddTrack(audio_track);
137 }
138 mock_peer_connection_->AddRemoteStream(stream);
139 return stream;
140 }
141
142 scoped_ptr<WebKit::MockWebRTCPeerConnectionHandlerClient> mock_client_;
143 scoped_ptr<MockMediaStreamDependencyFactory> mock_dependency_factory_;
144 scoped_ptr<RTCPeerConnectionHandlerUnderTest> pc_handler_;
145
146 // Weak reference to the mocked native peer connection implementation.
147 webrtc::MockPeerConnectionImpl* mock_peer_connection_;
148 };
149
150 TEST_F(RTCPeerConnectionHandlerTest, Initialize) {
151 Initialize("dummy", "dummy_pwd");
152 }
153
154 TEST_F(RTCPeerConnectionHandlerTest, CreateOffer) {
155 WebKit::WebRTCSessionDescriptionRequest request;
156 WebKit::WebMediaConstraints options;
157 pc_handler_->createOffer(request, options);
Ronghua Wu (Left Chromium) 2012/08/14 00:59:03 verify the result somehow.
perkj_chrome 2012/08/14 09:15:40 Done.
158 }
159
160 TEST_F(RTCPeerConnectionHandlerTest, setLocalDescription) {
161 WebKit::WebRTCVoidRequest request;
162 WebKit::WebRTCSessionDescriptionDescriptor description;
163 description.initialize(kDummySdpType, kDummySdp);
164 pc_handler_->setLocalDescription(request, description);
165 EXPECT_EQ(description.type(), pc_handler_->localDescription().type());
166 EXPECT_EQ(description.sdp(), pc_handler_->localDescription().sdp());
167
168 std::string sdp_string;
169 ASSERT_TRUE(mock_peer_connection_->local_description() != NULL);
170 EXPECT_EQ(kDummySdpType, mock_peer_connection_->local_description()->type());
171 mock_peer_connection_->local_description()->ToString(&sdp_string);
172 EXPECT_EQ(kDummySdp, sdp_string);
173 }
174
175 TEST_F(RTCPeerConnectionHandlerTest, setRemoteDescription) {
176 WebKit::WebRTCVoidRequest request;
177 WebKit::WebRTCSessionDescriptionDescriptor description;
178 description.initialize(kDummySdpType, kDummySdp);
179 pc_handler_->setRemoteDescription(request, description);
180 EXPECT_EQ(description.type(), pc_handler_->remoteDescription().type());
181 EXPECT_EQ(description.sdp(), pc_handler_->remoteDescription().sdp());
182
183 std::string sdp_string;
184 ASSERT_TRUE(mock_peer_connection_->remote_description() != NULL);
185 EXPECT_EQ(kDummySdpType, mock_peer_connection_->remote_description()->type());
186 mock_peer_connection_->remote_description()->ToString(&sdp_string);
187 EXPECT_EQ(kDummySdp, sdp_string);
188 }
189
190 TEST_F(RTCPeerConnectionHandlerTest, updateICE) {
191 WebKit::WebRTCConfiguration config;
192 WebKit::WebMediaConstraints constraints;
193
194 // TODO(perkj): Test that the parameters in |config| can be translated when a
195 // WebRTCConfiguration can be constructed. It's WebKit class and can't be
196 // initialized from a test.
197 EXPECT_TRUE(pc_handler_->updateICE(config, constraints));
198 }
199
200 TEST_F(RTCPeerConnectionHandlerTest, addICECandidate) {
201 WebKit::WebRTCICECandidateDescriptor candidate;
202 candidate.initialize(kDummySdp, "mid", 1);
203 EXPECT_TRUE(pc_handler_->addICECandidate(candidate));
204 EXPECT_EQ(kDummySdp, mock_peer_connection_->ice_sdp());
205 EXPECT_EQ(1, mock_peer_connection_->sdp_mline_index());
206 EXPECT_EQ("mid", mock_peer_connection_->sdp_mid());
207 }
208
209 TEST_F(RTCPeerConnectionHandlerTest, addAndRemoveStream) {
210 std::string stream_label = "local_stream";
211 WebKit::WebMediaStreamDescriptor local_stream(
212 CreateLocalMediaStream(stream_label));
213 WebKit::WebMediaConstraints constraints;
214
215 EXPECT_TRUE(pc_handler_->addStream(local_stream, constraints));
216 EXPECT_EQ(stream_label, mock_peer_connection_->stream_label());
217 EXPECT_EQ(1u,
218 mock_peer_connection_->local_streams()->at(0)->audio_tracks()->count());
219 EXPECT_EQ(1u,
220 mock_peer_connection_->local_streams()->at(0)->video_tracks()->count());
221
222 pc_handler_->removeStream(local_stream);
223 EXPECT_EQ("", mock_peer_connection_->stream_label());
Ronghua Wu (Left Chromium) 2012/08/14 00:59:03 expect count() is 0
perkj_chrome 2012/08/14 09:15:40 Done.
224 }
225
226 TEST_F(RTCPeerConnectionHandlerTest, OnStateChange) {
227 webrtc::PeerConnectionObserver::StateType state =
Ronghua Wu (Left Chromium) 2012/08/14 00:59:03 // Ready states.
perkj_chrome 2012/08/14 09:15:40 Done.
228 webrtc::PeerConnectionObserver::kReadyState;
229 mock_peer_connection_->SetReadyState(
230 webrtc::PeerConnectionInterface::kOpening);
231 pc_handler_->OnStateChange(state);
232 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ReadyStateOpening,
233 mock_client_->ready_state());
234 mock_peer_connection_->SetReadyState(
235 webrtc::PeerConnectionInterface::kActive);
236 pc_handler_->OnStateChange(state);
237 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ReadyStateActive,
238 mock_client_->ready_state());
239 mock_peer_connection_->SetReadyState(
240 webrtc::PeerConnectionInterface::kClosing);
241 pc_handler_->OnStateChange(state);
242 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ReadyStateClosing,
243 mock_client_->ready_state());
244 mock_peer_connection_->SetReadyState(
245 webrtc::PeerConnectionInterface::kClosed);
246 pc_handler_->OnStateChange(state);
247 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ReadyStateClosed,
248 mock_client_->ready_state());
249
250 // Ice states.
251 state = webrtc::PeerConnectionObserver::kIceState;
252 mock_peer_connection_->SetIceState(
253 webrtc::PeerConnectionInterface::kIceGathering);
254 pc_handler_->OnStateChange(state);
255 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateGathering,
256 mock_client_->ice_state());
257 mock_peer_connection_->SetIceState(
258 webrtc::PeerConnectionInterface::kIceWaiting);
259 pc_handler_->OnStateChange(state);
260 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateWaiting,
261 mock_client_->ice_state());
262 mock_peer_connection_->SetIceState(
263 webrtc::PeerConnectionInterface::kIceChecking);
264 pc_handler_->OnStateChange(state);
265 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateChecking,
266 mock_client_->ice_state());
267 mock_peer_connection_->SetIceState(
268 webrtc::PeerConnectionInterface::kIceConnected);
269 pc_handler_->OnStateChange(state);
270 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateConnected,
271 mock_client_->ice_state());
272 mock_peer_connection_->SetIceState(
273 webrtc::PeerConnectionInterface::kIceCompleted);
274 pc_handler_->OnStateChange(state);
275 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateCompleted,
276 mock_client_->ice_state());
277 mock_peer_connection_->SetIceState(
278 webrtc::PeerConnectionInterface::kIceFailed);
279 pc_handler_->OnStateChange(state);
280 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateFailed,
281 mock_client_->ice_state());
282 mock_peer_connection_->SetIceState(
283 webrtc::PeerConnectionInterface::kIceClosed);
284 pc_handler_->OnStateChange(state);
285 EXPECT_EQ(WebKit::WebRTCPeerConnectionHandlerClient::ICEStateClosed,
286 mock_client_->ice_state());
287 }
288
289 TEST_F(RTCPeerConnectionHandlerTest, OnAddAndOnRemoveStream) {
290 std::string remote_stream_label("remote_stream");
291 talk_base::scoped_refptr<webrtc::MediaStreamInterface> remote_stream(
292 AddRemoteMockMediaStream(remote_stream_label, "video", "audio"));
293 pc_handler_->OnAddStream(remote_stream);
294 EXPECT_EQ(remote_stream_label, mock_client_->stream_label());
295
296 pc_handler_->OnRemoveStream(remote_stream);
297 EXPECT_TRUE(mock_client_->stream_label().empty());
298 }
299
300 TEST_F(RTCPeerConnectionHandlerTest, OnIceCandidateAndOnIceComplete) {
301 scoped_ptr<webrtc::IceCandidateInterface> native_candidate(
302 mock_dependency_factory_->CreateIceCandidate("mid", 1, kDummySdp));
303 pc_handler_->OnIceCandidate(native_candidate.get());
304 EXPECT_EQ("mid", mock_client_->candidate_mid());
305 EXPECT_EQ(1, mock_client_->candidate_mlineindex());
306 EXPECT_EQ(kDummySdp, mock_client_->candidate_sdp());
307
308 pc_handler_->OnIceComplete();
309 EXPECT_EQ("", mock_client_->candidate_mid());
310 EXPECT_EQ(0, mock_client_->candidate_mlineindex());
311 EXPECT_EQ("", mock_client_->candidate_sdp());
312 }
313
314 TEST_F(RTCPeerConnectionHandlerTest, OnRenegotiationNeeded) {
315 EXPECT_FALSE(mock_client_->renegotiate());
316 pc_handler_->OnRenegotiationNeeded();
317 EXPECT_TRUE(mock_client_->renegotiate());
318 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698