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.
8 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "base/values.h"
11 #include "content/renderer/media/media_stream.h"
12 #include "content/renderer/media/media_stream_audio_source.h"
13 #include "content/renderer/media/media_stream_source.h"
14 #include "content/renderer/media/media_stream_video_track.h"
15 #include "content/renderer/media/mock_media_stream_dependency_factory.h"
16 #include "content/renderer/media/mock_media_stream_video_source.h"
17 #include "content/renderer/media/mock_peer_connection_impl.h"
18 #include "content/renderer/media/mock_web_rtc_peer_connection_handler_client.h"
19 #include "content/renderer/media/peer_connection_tracker.h"
20 #include "content/renderer/media/rtc_media_constraints.h"
21 #include "content/renderer/media/rtc_peer_connection_handler.h"
22 #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h"
23 #include "content/renderer/media/webrtc_audio_capturer.h"
24 #include "testing/gmock/include/gmock/gmock.h"
25 #include "testing/gtest/include/gtest/gtest.h"
26 #include "third_party/WebKit/public/platform/WebMediaConstraints.h"
27 #include "third_party/WebKit/public/platform/WebMediaStream.h"
28 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
29 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
30 #include "third_party/WebKit/public/platform/WebRTCConfiguration.h"
31 #include "third_party/WebKit/public/platform/WebRTCDTMFSenderHandler.h"
32 #include "third_party/WebKit/public/platform/WebRTCDataChannelHandler.h"
33 #include "third_party/WebKit/public/platform/WebRTCDataChannelInit.h"
34 #include "third_party/WebKit/public/platform/WebRTCICECandidate.h"
35 #include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandlerClient.h"
36 #include "third_party/WebKit/public/platform/WebRTCSessionDescription.h"
37 #include "third_party/WebKit/public/platform/WebRTCSessionDescriptionRequest.h"
38 #include "third_party/WebKit/public/platform/WebRTCStatsRequest.h"
39 #include "third_party/WebKit/public/platform/WebRTCVoidRequest.h"
40 #include "third_party/WebKit/public/platform/WebURL.h"
41 #include "third_party/libjingle/source/talk/app/webrtc/peerconnectioninterface.h"
43 static const char kDummySdp[] = "dummy sdp";
44 static const char kDummySdpType[] = "dummy type";
46 using blink::WebRTCPeerConnectionHandlerClient;
47 using testing::NiceMock;
53 class MockRTCStatsResponse : public LocalRTCStatsResponse {
55 MockRTCStatsResponse()
60 virtual size_t addReport(blink::WebString type,
62 double timestamp) OVERRIDE {
67 virtual void addStatistic(size_t report,
68 blink::WebString name, blink::WebString value)
72 int report_count() const { return report_count_; }
79 // Mocked wrapper for blink::WebRTCStatsRequest
80 class MockRTCStatsRequest : public LocalRTCStatsRequest {
83 : has_selector_(false),
84 request_succeeded_called_(false) {}
86 virtual bool hasSelector() const OVERRIDE {
89 virtual blink::WebMediaStreamTrack component() const OVERRIDE {
92 virtual scoped_refptr<LocalRTCStatsResponse> createResponse() OVERRIDE {
93 DCHECK(!response_.get());
94 response_ = new talk_base::RefCountedObject<MockRTCStatsResponse>();
98 virtual void requestSucceeded(const LocalRTCStatsResponse* response)
100 EXPECT_EQ(response, response_.get());
101 request_succeeded_called_ = true;
104 // Function for setting whether or not a selector is available.
105 void setSelector(const blink::WebMediaStreamTrack& component) {
106 has_selector_ = true;
107 component_ = component;
110 // Function for inspecting the result of a stats request.
111 MockRTCStatsResponse* result() {
112 if (request_succeeded_called_) {
113 return response_.get();
121 blink::WebMediaStreamTrack component_;
122 scoped_refptr<MockRTCStatsResponse> response_;
123 bool request_succeeded_called_;
126 class MockPeerConnectionTracker : public PeerConnectionTracker {
128 MOCK_METHOD1(UnregisterPeerConnection,
129 void(RTCPeerConnectionHandler* pc_handler));
130 // TODO(jiayl): add coverage for the following methods
131 MOCK_METHOD2(TrackCreateOffer,
132 void(RTCPeerConnectionHandler* pc_handler,
133 const RTCMediaConstraints& constraints));
134 MOCK_METHOD2(TrackCreateAnswer,
135 void(RTCPeerConnectionHandler* pc_handler,
136 const RTCMediaConstraints& constraints));
137 MOCK_METHOD3(TrackSetSessionDescription,
138 void(RTCPeerConnectionHandler* pc_handler,
139 const blink::WebRTCSessionDescription& desc,
143 void(RTCPeerConnectionHandler* pc_handler,
145 webrtc::PeerConnectionInterface::IceServer>& servers,
146 const RTCMediaConstraints& options));
147 MOCK_METHOD3(TrackAddIceCandidate,
148 void(RTCPeerConnectionHandler* pc_handler,
149 const blink::WebRTCICECandidate& candidate,
151 MOCK_METHOD3(TrackAddStream,
152 void(RTCPeerConnectionHandler* pc_handler,
153 const blink::WebMediaStream& stream,
155 MOCK_METHOD3(TrackRemoveStream,
156 void(RTCPeerConnectionHandler* pc_handler,
157 const blink::WebMediaStream& stream,
159 MOCK_METHOD1(TrackOnIceComplete,
160 void(RTCPeerConnectionHandler* pc_handler));
161 MOCK_METHOD3(TrackCreateDataChannel,
162 void(RTCPeerConnectionHandler* pc_handler,
163 const webrtc::DataChannelInterface* data_channel,
165 MOCK_METHOD1(TrackStop, void(RTCPeerConnectionHandler* pc_handler));
166 MOCK_METHOD2(TrackSignalingStateChange,
167 void(RTCPeerConnectionHandler* pc_handler,
168 WebRTCPeerConnectionHandlerClient::SignalingState state));
170 TrackIceConnectionStateChange,
171 void(RTCPeerConnectionHandler* pc_handler,
172 WebRTCPeerConnectionHandlerClient::ICEConnectionState state));
174 TrackIceGatheringStateChange,
175 void(RTCPeerConnectionHandler* pc_handler,
176 WebRTCPeerConnectionHandlerClient::ICEGatheringState state));
177 MOCK_METHOD1(TrackOnRenegotiationNeeded,
178 void(RTCPeerConnectionHandler* pc_handler));
179 MOCK_METHOD2(TrackCreateDTMFSender,
180 void(RTCPeerConnectionHandler* pc_handler,
181 const blink::WebMediaStreamTrack& track));
184 class RTCPeerConnectionHandlerUnderTest : public RTCPeerConnectionHandler {
186 RTCPeerConnectionHandlerUnderTest(
187 WebRTCPeerConnectionHandlerClient* client,
188 MediaStreamDependencyFactory* dependency_factory)
189 : RTCPeerConnectionHandler(client, dependency_factory) {
192 MockPeerConnectionImpl* native_peer_connection() {
193 return static_cast<MockPeerConnectionImpl*>(native_peer_connection_.get());
197 class RTCPeerConnectionHandlerTest : public ::testing::Test {
199 RTCPeerConnectionHandlerTest() : mock_peer_connection_(NULL) {
202 virtual void SetUp() {
203 mock_client_.reset(new NiceMock<MockWebRTCPeerConnectionHandlerClient>());
204 mock_dependency_factory_.reset(new MockMediaStreamDependencyFactory());
206 new RTCPeerConnectionHandlerUnderTest(mock_client_.get(),
207 mock_dependency_factory_.get()));
208 mock_tracker_.reset(new NiceMock<MockPeerConnectionTracker>());
209 blink::WebRTCConfiguration config;
210 blink::WebMediaConstraints constraints;
211 EXPECT_TRUE(pc_handler_->InitializeForTest(config, constraints,
212 mock_tracker_.get()));
214 mock_peer_connection_ = pc_handler_->native_peer_connection();
215 ASSERT_TRUE(mock_peer_connection_);
218 // Creates a WebKit local MediaStream.
219 blink::WebMediaStream CreateLocalMediaStream(
220 const std::string& stream_label) {
221 std::string video_track_label("video-label");
222 std::string audio_track_label("audio-label");
224 blink::WebMediaStreamSource audio_source;
225 audio_source.initialize(blink::WebString::fromUTF8(audio_track_label),
226 blink::WebMediaStreamSource::TypeAudio,
227 blink::WebString::fromUTF8("audio_track"));
228 audio_source.setExtraData(new MediaStreamAudioSource());
229 blink::WebMediaStreamSource video_source;
230 video_source.initialize(blink::WebString::fromUTF8(video_track_label),
231 blink::WebMediaStreamSource::TypeVideo,
232 blink::WebString::fromUTF8("video_track"));
233 MockMediaStreamVideoSource* native_video_source =
234 new MockMediaStreamVideoSource(mock_dependency_factory_.get(),
236 video_source.setExtraData(native_video_source);
239 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks(
240 static_cast<size_t>(1));
241 audio_tracks[0].initialize(audio_source.id(), audio_source);
242 audio_tracks[0].setExtraData(
243 new MediaStreamTrack(
244 WebRtcLocalAudioTrackAdapter::Create(audio_track_label,
247 blink::WebVector<blink::WebMediaStreamTrack> video_tracks(
248 static_cast<size_t>(1));
249 blink::WebMediaConstraints constraints;
250 constraints.initialize();
251 video_tracks[0] = MediaStreamVideoTrack::CreateVideoTrack(
252 native_video_source, constraints,
253 MediaStreamVideoSource::ConstraintsCallback(), true,
254 mock_dependency_factory_.get());
256 blink::WebMediaStream local_stream;
257 local_stream.initialize(base::UTF8ToUTF16(stream_label), audio_tracks,
259 local_stream.setExtraData(
260 new MediaStream(mock_dependency_factory_.get(),
261 MediaStream::StreamStopCallback(),
266 // Creates a remote MediaStream and adds it to the mocked native
268 scoped_refptr<webrtc::MediaStreamInterface>
269 AddRemoteMockMediaStream(const std::string& stream_label,
270 const std::string& video_track_label,
271 const std::string& audio_track_label) {
272 scoped_refptr<webrtc::MediaStreamInterface> stream(
273 mock_dependency_factory_->CreateLocalMediaStream(stream_label));
274 if (!video_track_label.empty()) {
275 webrtc::VideoSourceInterface* source = NULL;
276 scoped_refptr<webrtc::VideoTrackInterface> video_track(
277 mock_dependency_factory_->CreateLocalVideoTrack(
278 video_track_label, source));
279 stream->AddTrack(video_track.get());
281 if (!audio_track_label.empty()) {
282 scoped_refptr<WebRtcAudioCapturer> capturer;
283 scoped_refptr<webrtc::AudioTrackInterface> audio_track(
284 WebRtcLocalAudioTrackAdapter::Create(audio_track_label, NULL));
285 stream->AddTrack(audio_track.get());
287 mock_peer_connection_->AddRemoteStream(stream.get());
291 scoped_ptr<MockWebRTCPeerConnectionHandlerClient> mock_client_;
292 scoped_ptr<MockMediaStreamDependencyFactory> mock_dependency_factory_;
293 scoped_ptr<NiceMock<MockPeerConnectionTracker> > mock_tracker_;
294 scoped_ptr<RTCPeerConnectionHandlerUnderTest> pc_handler_;
296 // Weak reference to the mocked native peer connection implementation.
297 MockPeerConnectionImpl* mock_peer_connection_;
300 TEST_F(RTCPeerConnectionHandlerTest, Destruct) {
301 EXPECT_CALL(*mock_tracker_.get(), UnregisterPeerConnection(pc_handler_.get()))
303 pc_handler_.reset(NULL);
306 TEST_F(RTCPeerConnectionHandlerTest, CreateOffer) {
307 blink::WebRTCSessionDescriptionRequest request;
308 blink::WebMediaConstraints options;
309 EXPECT_CALL(*mock_tracker_.get(), TrackCreateOffer(pc_handler_.get(), _));
311 // TODO(perkj): Can blink::WebRTCSessionDescriptionRequest be changed so
312 // the |reqest| requestSucceeded can be tested? Currently the |request| object
313 // can not be initialized from a unit test.
314 EXPECT_FALSE(mock_peer_connection_->created_session_description() != NULL);
315 pc_handler_->createOffer(request, options);
316 EXPECT_TRUE(mock_peer_connection_->created_session_description() != NULL);
319 TEST_F(RTCPeerConnectionHandlerTest, CreateAnswer) {
320 blink::WebRTCSessionDescriptionRequest request;
321 blink::WebMediaConstraints options;
322 EXPECT_CALL(*mock_tracker_.get(), TrackCreateAnswer(pc_handler_.get(), _));
323 // TODO(perkj): Can blink::WebRTCSessionDescriptionRequest be changed so
324 // the |reqest| requestSucceeded can be tested? Currently the |request| object
325 // can not be initialized from a unit test.
326 EXPECT_FALSE(mock_peer_connection_->created_session_description() != NULL);
327 pc_handler_->createAnswer(request, options);
328 EXPECT_TRUE(mock_peer_connection_->created_session_description() != NULL);
331 TEST_F(RTCPeerConnectionHandlerTest, setLocalDescription) {
332 blink::WebRTCVoidRequest request;
333 blink::WebRTCSessionDescription description;
334 description.initialize(kDummySdpType, kDummySdp);
335 // PeerConnectionTracker::TrackSetSessionDescription is expected to be called
336 // before |mock_peer_connection| is called.
337 testing::InSequence sequence;
338 EXPECT_CALL(*mock_tracker_.get(),
339 TrackSetSessionDescription(pc_handler_.get(), Ref(description),
340 PeerConnectionTracker::SOURCE_LOCAL));
341 EXPECT_CALL(*mock_peer_connection_, SetLocalDescription(_, _));
343 pc_handler_->setLocalDescription(request, description);
344 EXPECT_EQ(description.type(), pc_handler_->localDescription().type());
345 EXPECT_EQ(description.sdp(), pc_handler_->localDescription().sdp());
347 std::string sdp_string;
348 ASSERT_TRUE(mock_peer_connection_->local_description() != NULL);
349 EXPECT_EQ(kDummySdpType, mock_peer_connection_->local_description()->type());
350 mock_peer_connection_->local_description()->ToString(&sdp_string);
351 EXPECT_EQ(kDummySdp, sdp_string);
354 TEST_F(RTCPeerConnectionHandlerTest, setRemoteDescription) {
355 blink::WebRTCVoidRequest request;
356 blink::WebRTCSessionDescription description;
357 description.initialize(kDummySdpType, kDummySdp);
359 // PeerConnectionTracker::TrackSetSessionDescription is expected to be called
360 // before |mock_peer_connection| is called.
361 testing::InSequence sequence;
362 EXPECT_CALL(*mock_tracker_.get(),
363 TrackSetSessionDescription(pc_handler_.get(), Ref(description),
364 PeerConnectionTracker::SOURCE_REMOTE));
365 EXPECT_CALL(*mock_peer_connection_, SetRemoteDescription(_, _));
367 pc_handler_->setRemoteDescription(request, description);
368 EXPECT_EQ(description.type(), pc_handler_->remoteDescription().type());
369 EXPECT_EQ(description.sdp(), pc_handler_->remoteDescription().sdp());
371 std::string sdp_string;
372 ASSERT_TRUE(mock_peer_connection_->remote_description() != NULL);
373 EXPECT_EQ(kDummySdpType, mock_peer_connection_->remote_description()->type());
374 mock_peer_connection_->remote_description()->ToString(&sdp_string);
375 EXPECT_EQ(kDummySdp, sdp_string);
378 TEST_F(RTCPeerConnectionHandlerTest, updateICE) {
379 blink::WebRTCConfiguration config;
380 blink::WebMediaConstraints constraints;
382 EXPECT_CALL(*mock_tracker_.get(), TrackUpdateIce(pc_handler_.get(), _, _));
383 // TODO(perkj): Test that the parameters in |config| can be translated when a
384 // WebRTCConfiguration can be constructed. It's WebKit class and can't be
385 // initialized from a test.
386 EXPECT_TRUE(pc_handler_->updateICE(config, constraints));
389 TEST_F(RTCPeerConnectionHandlerTest, addICECandidate) {
390 blink::WebRTCICECandidate candidate;
391 candidate.initialize(kDummySdp, "mid", 1);
393 EXPECT_CALL(*mock_tracker_.get(),
394 TrackAddIceCandidate(pc_handler_.get(),
395 testing::Ref(candidate),
396 PeerConnectionTracker::SOURCE_REMOTE));
397 EXPECT_TRUE(pc_handler_->addICECandidate(candidate));
398 EXPECT_EQ(kDummySdp, mock_peer_connection_->ice_sdp());
399 EXPECT_EQ(1, mock_peer_connection_->sdp_mline_index());
400 EXPECT_EQ("mid", mock_peer_connection_->sdp_mid());
403 TEST_F(RTCPeerConnectionHandlerTest, addAndRemoveStream) {
404 std::string stream_label = "local_stream";
405 blink::WebMediaStream local_stream(
406 CreateLocalMediaStream(stream_label));
407 blink::WebMediaConstraints constraints;
409 EXPECT_CALL(*mock_tracker_.get(),
410 TrackAddStream(pc_handler_.get(),
411 testing::Ref(local_stream),
412 PeerConnectionTracker::SOURCE_LOCAL));
413 EXPECT_CALL(*mock_tracker_.get(),
414 TrackRemoveStream(pc_handler_.get(),
415 testing::Ref(local_stream),
416 PeerConnectionTracker::SOURCE_LOCAL));
417 EXPECT_TRUE(pc_handler_->addStream(local_stream, constraints));
418 EXPECT_EQ(stream_label, mock_peer_connection_->stream_label());
420 mock_peer_connection_->local_streams()->at(0)->GetAudioTracks().size());
422 mock_peer_connection_->local_streams()->at(0)->GetVideoTracks().size());
424 pc_handler_->removeStream(local_stream);
425 EXPECT_EQ(0u, mock_peer_connection_->local_streams()->count());
428 TEST_F(RTCPeerConnectionHandlerTest, addStreamWithStoppedAudioAndVideoTrack) {
429 std::string stream_label = "local_stream";
430 blink::WebMediaStream local_stream(
431 CreateLocalMediaStream(stream_label));
432 blink::WebMediaConstraints constraints;
434 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
435 local_stream.audioTracks(audio_tracks);
436 MediaStreamAudioSource* native_audio_source =
437 static_cast<MediaStreamAudioSource*>(
438 audio_tracks[0].source().extraData());
439 native_audio_source->StopSource();
441 blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
442 local_stream.videoTracks(video_tracks);
443 MediaStreamVideoSource* native_video_source =
444 static_cast<MediaStreamVideoSource*>(
445 video_tracks[0].source().extraData());
446 native_video_source->StopSource();
448 EXPECT_TRUE(pc_handler_->addStream(local_stream, constraints));
449 EXPECT_EQ(stream_label, mock_peer_connection_->stream_label());
452 mock_peer_connection_->local_streams()->at(0)->GetAudioTracks().size());
455 mock_peer_connection_->local_streams()->at(0)->GetVideoTracks().size());
458 TEST_F(RTCPeerConnectionHandlerTest, GetStatsNoSelector) {
459 scoped_refptr<MockRTCStatsRequest> request(
460 new talk_base::RefCountedObject<MockRTCStatsRequest>());
461 pc_handler_->getStats(request.get());
462 // Note that callback gets executed synchronously by mock.
463 ASSERT_TRUE(request->result());
464 EXPECT_LT(1, request->result()->report_count());
467 TEST_F(RTCPeerConnectionHandlerTest, GetStatsAfterClose) {
468 scoped_refptr<MockRTCStatsRequest> request(
469 new talk_base::RefCountedObject<MockRTCStatsRequest>());
471 pc_handler_->getStats(request.get());
472 // Note that callback gets executed synchronously by mock.
473 ASSERT_TRUE(request->result());
474 EXPECT_LT(1, request->result()->report_count());
477 TEST_F(RTCPeerConnectionHandlerTest, GetStatsWithLocalSelector) {
478 blink::WebMediaStream local_stream(
479 CreateLocalMediaStream("local_stream"));
480 blink::WebMediaConstraints constraints;
481 pc_handler_->addStream(local_stream, constraints);
482 blink::WebVector<blink::WebMediaStreamTrack> tracks;
483 local_stream.audioTracks(tracks);
484 ASSERT_LE(1ul, tracks.size());
486 scoped_refptr<MockRTCStatsRequest> request(
487 new talk_base::RefCountedObject<MockRTCStatsRequest>());
488 request->setSelector(tracks[0]);
489 pc_handler_->getStats(request.get());
490 EXPECT_EQ(1, request->result()->report_count());
493 TEST_F(RTCPeerConnectionHandlerTest, GetStatsWithRemoteSelector) {
494 scoped_refptr<webrtc::MediaStreamInterface> stream(
495 AddRemoteMockMediaStream("remote_stream", "video", "audio"));
496 pc_handler_->OnAddStream(stream.get());
497 const blink::WebMediaStream& remote_stream = mock_client_->remote_stream();
499 blink::WebVector<blink::WebMediaStreamTrack> tracks;
500 remote_stream.audioTracks(tracks);
501 ASSERT_LE(1ul, tracks.size());
503 scoped_refptr<MockRTCStatsRequest> request(
504 new talk_base::RefCountedObject<MockRTCStatsRequest>());
505 request->setSelector(tracks[0]);
506 pc_handler_->getStats(request.get());
507 EXPECT_EQ(1, request->result()->report_count());
510 TEST_F(RTCPeerConnectionHandlerTest, GetStatsWithBadSelector) {
511 // The setup is the same as GetStatsWithLocalSelector, but the stream is not
512 // added to the PeerConnection.
513 blink::WebMediaStream local_stream(
514 CreateLocalMediaStream("local_stream_2"));
515 blink::WebMediaConstraints constraints;
516 blink::WebVector<blink::WebMediaStreamTrack> tracks;
518 local_stream.audioTracks(tracks);
519 blink::WebMediaStreamTrack component = tracks[0];
520 mock_peer_connection_->SetGetStatsResult(false);
522 scoped_refptr<MockRTCStatsRequest> request(
523 new talk_base::RefCountedObject<MockRTCStatsRequest>());
524 request->setSelector(component);
525 pc_handler_->getStats(request.get());
526 EXPECT_EQ(0, request->result()->report_count());
529 TEST_F(RTCPeerConnectionHandlerTest, OnSignalingChange) {
530 testing::InSequence sequence;
532 webrtc::PeerConnectionInterface::SignalingState new_state =
533 webrtc::PeerConnectionInterface::kHaveRemoteOffer;
534 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
536 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer));
537 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
538 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer));
539 pc_handler_->OnSignalingChange(new_state);
541 new_state = webrtc::PeerConnectionInterface::kHaveLocalPrAnswer;
542 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
544 WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalPrAnswer));
545 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
546 WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalPrAnswer));
547 pc_handler_->OnSignalingChange(new_state);
549 new_state = webrtc::PeerConnectionInterface::kHaveLocalOffer;
550 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
552 WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalOffer));
553 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
554 WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalOffer));
555 pc_handler_->OnSignalingChange(new_state);
557 new_state = webrtc::PeerConnectionInterface::kHaveRemotePrAnswer;
558 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
560 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemotePrAnswer));
561 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
562 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemotePrAnswer));
563 pc_handler_->OnSignalingChange(new_state);
565 new_state = webrtc::PeerConnectionInterface::kClosed;
566 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
568 WebRTCPeerConnectionHandlerClient::SignalingStateClosed));
569 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
570 WebRTCPeerConnectionHandlerClient::SignalingStateClosed));
571 pc_handler_->OnSignalingChange(new_state);
574 TEST_F(RTCPeerConnectionHandlerTest, OnIceConnectionChange) {
575 testing::InSequence sequence;
577 webrtc::PeerConnectionInterface::IceConnectionState new_state =
578 webrtc::PeerConnectionInterface::kIceConnectionNew;
579 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
581 WebRTCPeerConnectionHandlerClient::ICEConnectionStateStarting));
582 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
583 WebRTCPeerConnectionHandlerClient::ICEConnectionStateStarting));
584 pc_handler_->OnIceConnectionChange(new_state);
586 new_state = webrtc::PeerConnectionInterface::kIceConnectionChecking;
587 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
589 WebRTCPeerConnectionHandlerClient::ICEConnectionStateChecking));
590 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
591 WebRTCPeerConnectionHandlerClient::ICEConnectionStateChecking));
592 pc_handler_->OnIceConnectionChange(new_state);
594 new_state = webrtc::PeerConnectionInterface::kIceConnectionConnected;
595 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
597 WebRTCPeerConnectionHandlerClient::ICEConnectionStateConnected));
598 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
599 WebRTCPeerConnectionHandlerClient::ICEConnectionStateConnected));
600 pc_handler_->OnIceConnectionChange(new_state);
602 new_state = webrtc::PeerConnectionInterface::kIceConnectionCompleted;
603 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
605 WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted));
606 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
607 WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted));
608 pc_handler_->OnIceConnectionChange(new_state);
610 new_state = webrtc::PeerConnectionInterface::kIceConnectionFailed;
611 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
613 WebRTCPeerConnectionHandlerClient::ICEConnectionStateFailed));
614 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
615 WebRTCPeerConnectionHandlerClient::ICEConnectionStateFailed));
616 pc_handler_->OnIceConnectionChange(new_state);
618 new_state = webrtc::PeerConnectionInterface::kIceConnectionDisconnected;
619 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
621 WebRTCPeerConnectionHandlerClient::ICEConnectionStateDisconnected));
622 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
623 WebRTCPeerConnectionHandlerClient::ICEConnectionStateDisconnected));
624 pc_handler_->OnIceConnectionChange(new_state);
626 new_state = webrtc::PeerConnectionInterface::kIceConnectionClosed;
627 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
629 WebRTCPeerConnectionHandlerClient::ICEConnectionStateClosed));
630 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
631 WebRTCPeerConnectionHandlerClient::ICEConnectionStateClosed));
632 pc_handler_->OnIceConnectionChange(new_state);
635 TEST_F(RTCPeerConnectionHandlerTest, OnIceGatheringChange) {
636 testing::InSequence sequence;
637 EXPECT_CALL(*mock_tracker_.get(), TrackIceGatheringStateChange(
639 WebRTCPeerConnectionHandlerClient::ICEGatheringStateNew));
640 EXPECT_CALL(*mock_client_.get(), didChangeICEGatheringState(
641 WebRTCPeerConnectionHandlerClient::ICEGatheringStateNew));
642 EXPECT_CALL(*mock_tracker_.get(), TrackIceGatheringStateChange(
644 WebRTCPeerConnectionHandlerClient::ICEGatheringStateGathering));
645 EXPECT_CALL(*mock_client_.get(), didChangeICEGatheringState(
646 WebRTCPeerConnectionHandlerClient::ICEGatheringStateGathering));
647 EXPECT_CALL(*mock_tracker_.get(), TrackIceGatheringStateChange(
649 WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete));
650 EXPECT_CALL(*mock_client_.get(), didChangeICEGatheringState(
651 WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete));
653 webrtc::PeerConnectionInterface::IceGatheringState new_state =
654 webrtc::PeerConnectionInterface::kIceGatheringNew;
655 pc_handler_->OnIceGatheringChange(new_state);
657 new_state = webrtc::PeerConnectionInterface::kIceGatheringGathering;
658 pc_handler_->OnIceGatheringChange(new_state);
660 new_state = webrtc::PeerConnectionInterface::kIceGatheringComplete;
661 pc_handler_->OnIceGatheringChange(new_state);
663 // Check NULL candidate after ice gathering is completed.
664 EXPECT_EQ("", mock_client_->candidate_mid());
665 EXPECT_EQ(-1, mock_client_->candidate_mlineindex());
666 EXPECT_EQ("", mock_client_->candidate_sdp());
669 TEST_F(RTCPeerConnectionHandlerTest, OnAddAndOnRemoveStream) {
670 std::string remote_stream_label("remote_stream");
671 scoped_refptr<webrtc::MediaStreamInterface> remote_stream(
672 AddRemoteMockMediaStream(remote_stream_label, "video", "audio"));
674 testing::InSequence sequence;
675 EXPECT_CALL(*mock_tracker_.get(), TrackAddStream(
677 testing::Property(&blink::WebMediaStream::id,
678 base::UTF8ToUTF16(remote_stream_label)),
679 PeerConnectionTracker::SOURCE_REMOTE));
680 EXPECT_CALL(*mock_client_.get(), didAddRemoteStream(
681 testing::Property(&blink::WebMediaStream::id,
682 base::UTF8ToUTF16(remote_stream_label))));
684 EXPECT_CALL(*mock_tracker_.get(), TrackRemoveStream(
686 testing::Property(&blink::WebMediaStream::id,
687 base::UTF8ToUTF16(remote_stream_label)),
688 PeerConnectionTracker::SOURCE_REMOTE));
689 EXPECT_CALL(*mock_client_.get(), didRemoveRemoteStream(
690 testing::Property(&blink::WebMediaStream::id,
691 base::UTF8ToUTF16(remote_stream_label))));
693 pc_handler_->OnAddStream(remote_stream.get());
694 pc_handler_->OnRemoveStream(remote_stream.get());
697 // This test that WebKit is notified about remote track state changes.
698 TEST_F(RTCPeerConnectionHandlerTest, RemoteTrackState) {
699 std::string remote_stream_label("remote_stream");
700 scoped_refptr<webrtc::MediaStreamInterface> remote_stream(
701 AddRemoteMockMediaStream(remote_stream_label, "video", "audio"));
703 testing::InSequence sequence;
704 EXPECT_CALL(*mock_client_.get(), didAddRemoteStream(
705 testing::Property(&blink::WebMediaStream::id,
706 base::UTF8ToUTF16(remote_stream_label))));
707 pc_handler_->OnAddStream(remote_stream.get());
708 const blink::WebMediaStream& webkit_stream = mock_client_->remote_stream();
710 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
711 webkit_stream.audioTracks(audio_tracks);
712 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive,
713 audio_tracks[0].source().readyState());
715 blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
716 webkit_stream.videoTracks(video_tracks);
717 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive,
718 video_tracks[0].source().readyState());
720 remote_stream->GetAudioTracks()[0]->set_state(
721 webrtc::MediaStreamTrackInterface::kEnded);
722 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded,
723 audio_tracks[0].source().readyState());
725 remote_stream->GetVideoTracks()[0]->set_state(
726 webrtc::MediaStreamTrackInterface::kEnded);
727 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded,
728 video_tracks[0].source().readyState());
731 TEST_F(RTCPeerConnectionHandlerTest, RemoveAndAddAudioTrackFromRemoteStream) {
732 std::string remote_stream_label("remote_stream");
733 scoped_refptr<webrtc::MediaStreamInterface> remote_stream(
734 AddRemoteMockMediaStream(remote_stream_label, "video", "audio"));
736 EXPECT_CALL(*mock_client_.get(), didAddRemoteStream(
737 testing::Property(&blink::WebMediaStream::id,
738 base::UTF8ToUTF16(remote_stream_label))));
739 pc_handler_->OnAddStream(remote_stream.get());
740 const blink::WebMediaStream& webkit_stream = mock_client_->remote_stream();
742 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
743 webkit_stream.audioTracks(audio_tracks);
744 EXPECT_EQ(1u, audio_tracks.size());
746 // Remove the Webrtc audio track from the Webrtc MediaStream.
747 scoped_refptr<webrtc::AudioTrackInterface> webrtc_track =
748 remote_stream->GetAudioTracks()[0].get();
749 remote_stream->RemoveTrack(webrtc_track.get());
750 blink::WebVector<blink::WebMediaStreamTrack> modified_audio_tracks1;
751 webkit_stream.audioTracks(modified_audio_tracks1);
752 EXPECT_EQ(0u, modified_audio_tracks1.size());
754 // Add the WebRtc audio track again.
755 remote_stream->AddTrack(webrtc_track.get());
756 blink::WebVector<blink::WebMediaStreamTrack> modified_audio_tracks2;
757 webkit_stream.audioTracks(modified_audio_tracks2);
758 EXPECT_EQ(1u, modified_audio_tracks2.size());
761 TEST_F(RTCPeerConnectionHandlerTest, RemoveAndAddVideoTrackFromRemoteStream) {
762 std::string remote_stream_label("remote_stream");
763 scoped_refptr<webrtc::MediaStreamInterface> remote_stream(
764 AddRemoteMockMediaStream(remote_stream_label, "video", "video"));
766 EXPECT_CALL(*mock_client_.get(), didAddRemoteStream(
767 testing::Property(&blink::WebMediaStream::id,
768 base::UTF8ToUTF16(remote_stream_label))));
769 pc_handler_->OnAddStream(remote_stream.get());
770 const blink::WebMediaStream& webkit_stream = mock_client_->remote_stream();
772 blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
773 webkit_stream.videoTracks(video_tracks);
774 EXPECT_EQ(1u, video_tracks.size());
776 // Remove the Webrtc video track from the Webrtc MediaStream.
777 scoped_refptr<webrtc::VideoTrackInterface> webrtc_track =
778 remote_stream->GetVideoTracks()[0].get();
779 remote_stream->RemoveTrack(webrtc_track.get());
780 blink::WebVector<blink::WebMediaStreamTrack> modified_video_tracks1;
781 webkit_stream.videoTracks(modified_video_tracks1);
782 EXPECT_EQ(0u, modified_video_tracks1.size());
784 // Add the WebRtc video track again.
785 remote_stream->AddTrack(webrtc_track.get());
786 blink::WebVector<blink::WebMediaStreamTrack> modified_video_tracks2;
787 webkit_stream.videoTracks(modified_video_tracks2);
788 EXPECT_EQ(1u, modified_video_tracks2.size());
791 TEST_F(RTCPeerConnectionHandlerTest, OnIceCandidate) {
792 testing::InSequence sequence;
793 EXPECT_CALL(*mock_tracker_.get(),
794 TrackAddIceCandidate(pc_handler_.get(), _,
795 PeerConnectionTracker::SOURCE_LOCAL));
796 EXPECT_CALL(*mock_client_.get(), didGenerateICECandidate(_));
798 scoped_ptr<webrtc::IceCandidateInterface> native_candidate(
799 mock_dependency_factory_->CreateIceCandidate("mid", 1, kDummySdp));
800 pc_handler_->OnIceCandidate(native_candidate.get());
801 EXPECT_EQ("mid", mock_client_->candidate_mid());
802 EXPECT_EQ(1, mock_client_->candidate_mlineindex());
803 EXPECT_EQ(kDummySdp, mock_client_->candidate_sdp());
806 TEST_F(RTCPeerConnectionHandlerTest, OnRenegotiationNeeded) {
807 testing::InSequence sequence;
808 EXPECT_CALL(*mock_tracker_.get(),
809 TrackOnRenegotiationNeeded(pc_handler_.get()));
810 EXPECT_CALL(*mock_client_.get(), negotiationNeeded());
811 pc_handler_->OnRenegotiationNeeded();
814 TEST_F(RTCPeerConnectionHandlerTest, CreateDataChannel) {
815 blink::WebString label = "d1";
816 EXPECT_CALL(*mock_tracker_.get(),
817 TrackCreateDataChannel(pc_handler_.get(),
819 PeerConnectionTracker::SOURCE_LOCAL));
820 scoped_ptr<blink::WebRTCDataChannelHandler> channel(
821 pc_handler_->createDataChannel("d1", blink::WebRTCDataChannelInit()));
822 EXPECT_TRUE(channel.get() != NULL);
823 EXPECT_EQ(label, channel->label());
826 TEST_F(RTCPeerConnectionHandlerTest, CreateDtmfSender) {
827 std::string stream_label = "local_stream";
828 blink::WebMediaStream local_stream(CreateLocalMediaStream(stream_label));
829 blink::WebMediaConstraints constraints;
830 pc_handler_->addStream(local_stream, constraints);
832 blink::WebVector<blink::WebMediaStreamTrack> tracks;
833 local_stream.videoTracks(tracks);
835 ASSERT_LE(1ul, tracks.size());
836 EXPECT_FALSE(pc_handler_->createDTMFSender(tracks[0]));
838 local_stream.audioTracks(tracks);
839 ASSERT_LE(1ul, tracks.size());
841 EXPECT_CALL(*mock_tracker_.get(),
842 TrackCreateDTMFSender(pc_handler_.get(),
843 testing::Ref(tracks[0])));
845 scoped_ptr<blink::WebRTCDTMFSenderHandler> sender(
846 pc_handler_->createDTMFSender(tracks[0]));
847 EXPECT_TRUE(sender.get());
850 } // namespace content