chrome.bluetoothSocket: clean-up Listen functions
[chromium-blink-merge.git] / content / renderer / media / rtc_peer_connection_handler_unittest.cc
blob7ed95ffb2af4400223ab4b52a6d29d08bb80c0f1
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.
5 #include <string>
6 #include <vector>
8 #include "base/memory/scoped_ptr.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "base/values.h"
12 #include "content/child/child_process.h"
13 #include "content/renderer/media/media_stream.h"
14 #include "content/renderer/media/media_stream_audio_source.h"
15 #include "content/renderer/media/media_stream_source.h"
16 #include "content/renderer/media/media_stream_video_track.h"
17 #include "content/renderer/media/mock_media_stream_video_source.h"
18 #include "content/renderer/media/mock_peer_connection_impl.h"
19 #include "content/renderer/media/mock_web_rtc_peer_connection_handler_client.h"
20 #include "content/renderer/media/peer_connection_tracker.h"
21 #include "content/renderer/media/rtc_media_constraints.h"
22 #include "content/renderer/media/rtc_peer_connection_handler.h"
23 #include "content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h"
24 #include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h"
25 #include "content/renderer/media/webrtc_audio_capturer.h"
26 #include "testing/gmock/include/gmock/gmock.h"
27 #include "testing/gtest/include/gtest/gtest.h"
28 #include "third_party/WebKit/public/platform/WebMediaConstraints.h"
29 #include "third_party/WebKit/public/platform/WebMediaStream.h"
30 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
31 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
32 #include "third_party/WebKit/public/platform/WebRTCConfiguration.h"
33 #include "third_party/WebKit/public/platform/WebRTCDTMFSenderHandler.h"
34 #include "third_party/WebKit/public/platform/WebRTCDataChannelHandler.h"
35 #include "third_party/WebKit/public/platform/WebRTCDataChannelInit.h"
36 #include "third_party/WebKit/public/platform/WebRTCICECandidate.h"
37 #include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandlerClient.h"
38 #include "third_party/WebKit/public/platform/WebRTCSessionDescription.h"
39 #include "third_party/WebKit/public/platform/WebRTCSessionDescriptionRequest.h"
40 #include "third_party/WebKit/public/platform/WebRTCStatsRequest.h"
41 #include "third_party/WebKit/public/platform/WebRTCVoidRequest.h"
42 #include "third_party/WebKit/public/platform/WebURL.h"
43 #include "third_party/libjingle/source/talk/app/webrtc/peerconnectioninterface.h"
45 static const char kDummySdp[] = "dummy sdp";
46 static const char kDummySdpType[] = "dummy type";
48 using blink::WebRTCPeerConnectionHandlerClient;
49 using testing::NiceMock;
50 using testing::_;
51 using testing::Ref;
53 namespace content {
55 class MockRTCStatsResponse : public LocalRTCStatsResponse {
56 public:
57 MockRTCStatsResponse()
58 : report_count_(0),
59 statistic_count_(0) {
62 virtual size_t addReport(blink::WebString type,
63 blink::WebString id,
64 double timestamp) OVERRIDE {
65 ++report_count_;
66 return report_count_;
69 virtual void addStatistic(size_t report,
70 blink::WebString name, blink::WebString value)
71 OVERRIDE {
72 ++statistic_count_;
74 int report_count() const { return report_count_; }
76 private:
77 int report_count_;
78 int statistic_count_;
81 // Mocked wrapper for blink::WebRTCStatsRequest
82 class MockRTCStatsRequest : public LocalRTCStatsRequest {
83 public:
84 MockRTCStatsRequest()
85 : has_selector_(false),
86 request_succeeded_called_(false) {}
88 virtual bool hasSelector() const OVERRIDE {
89 return has_selector_;
91 virtual blink::WebMediaStreamTrack component() const OVERRIDE {
92 return component_;
94 virtual scoped_refptr<LocalRTCStatsResponse> createResponse() OVERRIDE {
95 DCHECK(!response_.get());
96 response_ = new talk_base::RefCountedObject<MockRTCStatsResponse>();
97 return response_;
100 virtual void requestSucceeded(const LocalRTCStatsResponse* response)
101 OVERRIDE {
102 EXPECT_EQ(response, response_.get());
103 request_succeeded_called_ = true;
106 // Function for setting whether or not a selector is available.
107 void setSelector(const blink::WebMediaStreamTrack& component) {
108 has_selector_ = true;
109 component_ = component;
112 // Function for inspecting the result of a stats request.
113 MockRTCStatsResponse* result() {
114 if (request_succeeded_called_) {
115 return response_.get();
116 } else {
117 return NULL;
121 private:
122 bool has_selector_;
123 blink::WebMediaStreamTrack component_;
124 scoped_refptr<MockRTCStatsResponse> response_;
125 bool request_succeeded_called_;
128 class MockPeerConnectionTracker : public PeerConnectionTracker {
129 public:
130 MOCK_METHOD1(UnregisterPeerConnection,
131 void(RTCPeerConnectionHandler* pc_handler));
132 // TODO(jiayl): add coverage for the following methods
133 MOCK_METHOD2(TrackCreateOffer,
134 void(RTCPeerConnectionHandler* pc_handler,
135 const RTCMediaConstraints& constraints));
136 MOCK_METHOD2(TrackCreateAnswer,
137 void(RTCPeerConnectionHandler* pc_handler,
138 const RTCMediaConstraints& constraints));
139 MOCK_METHOD3(TrackSetSessionDescription,
140 void(RTCPeerConnectionHandler* pc_handler,
141 const blink::WebRTCSessionDescription& desc,
142 Source source));
143 MOCK_METHOD3(
144 TrackUpdateIce,
145 void(RTCPeerConnectionHandler* pc_handler,
146 const std::vector<
147 webrtc::PeerConnectionInterface::IceServer>& servers,
148 const RTCMediaConstraints& options));
149 MOCK_METHOD3(TrackAddIceCandidate,
150 void(RTCPeerConnectionHandler* pc_handler,
151 const blink::WebRTCICECandidate& candidate,
152 Source source));
153 MOCK_METHOD3(TrackAddStream,
154 void(RTCPeerConnectionHandler* pc_handler,
155 const blink::WebMediaStream& stream,
156 Source source));
157 MOCK_METHOD3(TrackRemoveStream,
158 void(RTCPeerConnectionHandler* pc_handler,
159 const blink::WebMediaStream& stream,
160 Source source));
161 MOCK_METHOD1(TrackOnIceComplete,
162 void(RTCPeerConnectionHandler* pc_handler));
163 MOCK_METHOD3(TrackCreateDataChannel,
164 void(RTCPeerConnectionHandler* pc_handler,
165 const webrtc::DataChannelInterface* data_channel,
166 Source source));
167 MOCK_METHOD1(TrackStop, void(RTCPeerConnectionHandler* pc_handler));
168 MOCK_METHOD2(TrackSignalingStateChange,
169 void(RTCPeerConnectionHandler* pc_handler,
170 WebRTCPeerConnectionHandlerClient::SignalingState state));
171 MOCK_METHOD2(
172 TrackIceConnectionStateChange,
173 void(RTCPeerConnectionHandler* pc_handler,
174 WebRTCPeerConnectionHandlerClient::ICEConnectionState state));
175 MOCK_METHOD2(
176 TrackIceGatheringStateChange,
177 void(RTCPeerConnectionHandler* pc_handler,
178 WebRTCPeerConnectionHandlerClient::ICEGatheringState state));
179 MOCK_METHOD1(TrackOnRenegotiationNeeded,
180 void(RTCPeerConnectionHandler* pc_handler));
181 MOCK_METHOD2(TrackCreateDTMFSender,
182 void(RTCPeerConnectionHandler* pc_handler,
183 const blink::WebMediaStreamTrack& track));
186 class RTCPeerConnectionHandlerUnderTest : public RTCPeerConnectionHandler {
187 public:
188 RTCPeerConnectionHandlerUnderTest(
189 WebRTCPeerConnectionHandlerClient* client,
190 PeerConnectionDependencyFactory* dependency_factory)
191 : RTCPeerConnectionHandler(client, dependency_factory) {
194 MockPeerConnectionImpl* native_peer_connection() {
195 return static_cast<MockPeerConnectionImpl*>(
196 RTCPeerConnectionHandler::native_peer_connection());
200 class RTCPeerConnectionHandlerTest : public ::testing::Test {
201 public:
202 RTCPeerConnectionHandlerTest() : mock_peer_connection_(NULL) {
203 child_process_.reset(new ChildProcess());
206 virtual void SetUp() {
207 mock_client_.reset(new NiceMock<MockWebRTCPeerConnectionHandlerClient>());
208 mock_dependency_factory_.reset(new MockPeerConnectionDependencyFactory());
209 pc_handler_.reset(
210 new RTCPeerConnectionHandlerUnderTest(mock_client_.get(),
211 mock_dependency_factory_.get()));
212 mock_tracker_.reset(new NiceMock<MockPeerConnectionTracker>());
213 blink::WebRTCConfiguration config;
214 blink::WebMediaConstraints constraints;
215 EXPECT_TRUE(pc_handler_->InitializeForTest(config, constraints,
216 mock_tracker_.get()));
218 mock_peer_connection_ = pc_handler_->native_peer_connection();
219 ASSERT_TRUE(mock_peer_connection_);
222 // Creates a WebKit local MediaStream.
223 blink::WebMediaStream CreateLocalMediaStream(
224 const std::string& stream_label) {
225 std::string video_track_label("video-label");
226 std::string audio_track_label("audio-label");
228 blink::WebMediaStreamSource audio_source;
229 audio_source.initialize(blink::WebString::fromUTF8(audio_track_label),
230 blink::WebMediaStreamSource::TypeAudio,
231 blink::WebString::fromUTF8("audio_track"));
232 audio_source.setExtraData(new MediaStreamAudioSource());
233 blink::WebMediaStreamSource video_source;
234 video_source.initialize(blink::WebString::fromUTF8(video_track_label),
235 blink::WebMediaStreamSource::TypeVideo,
236 blink::WebString::fromUTF8("video_track"));
237 MockMediaStreamVideoSource* native_video_source =
238 new MockMediaStreamVideoSource(false);
239 video_source.setExtraData(native_video_source);
241 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks(
242 static_cast<size_t>(1));
243 audio_tracks[0].initialize(audio_source.id(), audio_source);
244 audio_tracks[0].setExtraData(
245 new MediaStreamTrack(
246 WebRtcLocalAudioTrackAdapter::Create(audio_track_label,
247 NULL),
248 true));
249 blink::WebVector<blink::WebMediaStreamTrack> video_tracks(
250 static_cast<size_t>(1));
251 blink::WebMediaConstraints constraints;
252 constraints.initialize();
253 video_tracks[0] = MediaStreamVideoTrack::CreateVideoTrack(
254 native_video_source, constraints,
255 MediaStreamVideoSource::ConstraintsCallback(), true);
257 blink::WebMediaStream local_stream;
258 local_stream.initialize(base::UTF8ToUTF16(stream_label), audio_tracks,
259 video_tracks);
260 local_stream.setExtraData(
261 new MediaStream(local_stream));
262 return local_stream;
265 // Creates a remote MediaStream and adds it to the mocked native
266 // peer connection.
267 scoped_refptr<webrtc::MediaStreamInterface>
268 AddRemoteMockMediaStream(const std::string& stream_label,
269 const std::string& video_track_label,
270 const std::string& audio_track_label) {
271 scoped_refptr<webrtc::MediaStreamInterface> stream(
272 mock_dependency_factory_->CreateLocalMediaStream(stream_label));
273 if (!video_track_label.empty()) {
274 webrtc::VideoSourceInterface* source = NULL;
275 scoped_refptr<webrtc::VideoTrackInterface> video_track(
276 mock_dependency_factory_->CreateLocalVideoTrack(
277 video_track_label, source));
278 stream->AddTrack(video_track.get());
280 if (!audio_track_label.empty()) {
281 scoped_refptr<WebRtcAudioCapturer> capturer;
282 scoped_refptr<webrtc::AudioTrackInterface> audio_track(
283 WebRtcLocalAudioTrackAdapter::Create(audio_track_label, NULL));
284 stream->AddTrack(audio_track.get());
286 mock_peer_connection_->AddRemoteStream(stream.get());
287 return stream;
290 base::MessageLoop message_loop_;
291 scoped_ptr<ChildProcess> child_process_;
292 scoped_ptr<MockWebRTCPeerConnectionHandlerClient> mock_client_;
293 scoped_ptr<MockPeerConnectionDependencyFactory> mock_dependency_factory_;
294 scoped_ptr<NiceMock<MockPeerConnectionTracker> > mock_tracker_;
295 scoped_ptr<RTCPeerConnectionHandlerUnderTest> pc_handler_;
297 // Weak reference to the mocked native peer connection implementation.
298 MockPeerConnectionImpl* mock_peer_connection_;
301 TEST_F(RTCPeerConnectionHandlerTest, Destruct) {
302 EXPECT_CALL(*mock_tracker_.get(), UnregisterPeerConnection(pc_handler_.get()))
303 .Times(1);
304 pc_handler_.reset(NULL);
307 TEST_F(RTCPeerConnectionHandlerTest, CreateOffer) {
308 blink::WebRTCSessionDescriptionRequest request;
309 blink::WebMediaConstraints options;
310 EXPECT_CALL(*mock_tracker_.get(), TrackCreateOffer(pc_handler_.get(), _));
312 // TODO(perkj): Can blink::WebRTCSessionDescriptionRequest be changed so
313 // the |reqest| requestSucceeded can be tested? Currently the |request| object
314 // can not be initialized from a unit test.
315 EXPECT_FALSE(mock_peer_connection_->created_session_description() != NULL);
316 pc_handler_->createOffer(request, options);
317 EXPECT_TRUE(mock_peer_connection_->created_session_description() != NULL);
320 TEST_F(RTCPeerConnectionHandlerTest, CreateAnswer) {
321 blink::WebRTCSessionDescriptionRequest request;
322 blink::WebMediaConstraints options;
323 EXPECT_CALL(*mock_tracker_.get(), TrackCreateAnswer(pc_handler_.get(), _));
324 // TODO(perkj): Can blink::WebRTCSessionDescriptionRequest be changed so
325 // the |reqest| requestSucceeded can be tested? Currently the |request| object
326 // can not be initialized from a unit test.
327 EXPECT_FALSE(mock_peer_connection_->created_session_description() != NULL);
328 pc_handler_->createAnswer(request, options);
329 EXPECT_TRUE(mock_peer_connection_->created_session_description() != NULL);
332 TEST_F(RTCPeerConnectionHandlerTest, setLocalDescription) {
333 blink::WebRTCVoidRequest request;
334 blink::WebRTCSessionDescription description;
335 description.initialize(kDummySdpType, kDummySdp);
336 // PeerConnectionTracker::TrackSetSessionDescription is expected to be called
337 // before |mock_peer_connection| is called.
338 testing::InSequence sequence;
339 EXPECT_CALL(*mock_tracker_.get(),
340 TrackSetSessionDescription(pc_handler_.get(), Ref(description),
341 PeerConnectionTracker::SOURCE_LOCAL));
342 EXPECT_CALL(*mock_peer_connection_, SetLocalDescription(_, _));
344 pc_handler_->setLocalDescription(request, description);
345 EXPECT_EQ(description.type(), pc_handler_->localDescription().type());
346 EXPECT_EQ(description.sdp(), pc_handler_->localDescription().sdp());
348 std::string sdp_string;
349 ASSERT_TRUE(mock_peer_connection_->local_description() != NULL);
350 EXPECT_EQ(kDummySdpType, mock_peer_connection_->local_description()->type());
351 mock_peer_connection_->local_description()->ToString(&sdp_string);
352 EXPECT_EQ(kDummySdp, sdp_string);
355 TEST_F(RTCPeerConnectionHandlerTest, setRemoteDescription) {
356 blink::WebRTCVoidRequest request;
357 blink::WebRTCSessionDescription description;
358 description.initialize(kDummySdpType, kDummySdp);
360 // PeerConnectionTracker::TrackSetSessionDescription is expected to be called
361 // before |mock_peer_connection| is called.
362 testing::InSequence sequence;
363 EXPECT_CALL(*mock_tracker_.get(),
364 TrackSetSessionDescription(pc_handler_.get(), Ref(description),
365 PeerConnectionTracker::SOURCE_REMOTE));
366 EXPECT_CALL(*mock_peer_connection_, SetRemoteDescription(_, _));
368 pc_handler_->setRemoteDescription(request, description);
369 EXPECT_EQ(description.type(), pc_handler_->remoteDescription().type());
370 EXPECT_EQ(description.sdp(), pc_handler_->remoteDescription().sdp());
372 std::string sdp_string;
373 ASSERT_TRUE(mock_peer_connection_->remote_description() != NULL);
374 EXPECT_EQ(kDummySdpType, mock_peer_connection_->remote_description()->type());
375 mock_peer_connection_->remote_description()->ToString(&sdp_string);
376 EXPECT_EQ(kDummySdp, sdp_string);
379 TEST_F(RTCPeerConnectionHandlerTest, updateICE) {
380 blink::WebRTCConfiguration config;
381 blink::WebMediaConstraints constraints;
383 EXPECT_CALL(*mock_tracker_.get(), TrackUpdateIce(pc_handler_.get(), _, _));
384 // TODO(perkj): Test that the parameters in |config| can be translated when a
385 // WebRTCConfiguration can be constructed. It's WebKit class and can't be
386 // initialized from a test.
387 EXPECT_TRUE(pc_handler_->updateICE(config, constraints));
390 TEST_F(RTCPeerConnectionHandlerTest, addICECandidate) {
391 blink::WebRTCICECandidate candidate;
392 candidate.initialize(kDummySdp, "mid", 1);
394 EXPECT_CALL(*mock_tracker_.get(),
395 TrackAddIceCandidate(pc_handler_.get(),
396 testing::Ref(candidate),
397 PeerConnectionTracker::SOURCE_REMOTE));
398 EXPECT_TRUE(pc_handler_->addICECandidate(candidate));
399 EXPECT_EQ(kDummySdp, mock_peer_connection_->ice_sdp());
400 EXPECT_EQ(1, mock_peer_connection_->sdp_mline_index());
401 EXPECT_EQ("mid", mock_peer_connection_->sdp_mid());
404 TEST_F(RTCPeerConnectionHandlerTest, addAndRemoveStream) {
405 std::string stream_label = "local_stream";
406 blink::WebMediaStream local_stream(
407 CreateLocalMediaStream(stream_label));
408 blink::WebMediaConstraints constraints;
410 EXPECT_CALL(*mock_tracker_.get(),
411 TrackAddStream(pc_handler_.get(),
412 testing::Ref(local_stream),
413 PeerConnectionTracker::SOURCE_LOCAL));
414 EXPECT_CALL(*mock_tracker_.get(),
415 TrackRemoveStream(pc_handler_.get(),
416 testing::Ref(local_stream),
417 PeerConnectionTracker::SOURCE_LOCAL));
418 EXPECT_TRUE(pc_handler_->addStream(local_stream, constraints));
419 EXPECT_EQ(stream_label, mock_peer_connection_->stream_label());
420 EXPECT_EQ(1u,
421 mock_peer_connection_->local_streams()->at(0)->GetAudioTracks().size());
422 EXPECT_EQ(1u,
423 mock_peer_connection_->local_streams()->at(0)->GetVideoTracks().size());
425 EXPECT_FALSE(pc_handler_->addStream(local_stream, constraints));
427 pc_handler_->removeStream(local_stream);
428 EXPECT_EQ(0u, mock_peer_connection_->local_streams()->count());
431 TEST_F(RTCPeerConnectionHandlerTest, addStreamWithStoppedAudioAndVideoTrack) {
432 std::string stream_label = "local_stream";
433 blink::WebMediaStream local_stream(
434 CreateLocalMediaStream(stream_label));
435 blink::WebMediaConstraints constraints;
437 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
438 local_stream.audioTracks(audio_tracks);
439 MediaStreamAudioSource* native_audio_source =
440 static_cast<MediaStreamAudioSource*>(
441 audio_tracks[0].source().extraData());
442 native_audio_source->StopSource();
444 blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
445 local_stream.videoTracks(video_tracks);
446 MediaStreamVideoSource* native_video_source =
447 static_cast<MediaStreamVideoSource*>(
448 video_tracks[0].source().extraData());
449 native_video_source->StopSource();
451 EXPECT_TRUE(pc_handler_->addStream(local_stream, constraints));
452 EXPECT_EQ(stream_label, mock_peer_connection_->stream_label());
453 EXPECT_EQ(
455 mock_peer_connection_->local_streams()->at(0)->GetAudioTracks().size());
456 EXPECT_EQ(
458 mock_peer_connection_->local_streams()->at(0)->GetVideoTracks().size());
461 TEST_F(RTCPeerConnectionHandlerTest, GetStatsNoSelector) {
462 scoped_refptr<MockRTCStatsRequest> request(
463 new talk_base::RefCountedObject<MockRTCStatsRequest>());
464 pc_handler_->getStats(request.get());
465 // Note that callback gets executed synchronously by mock.
466 ASSERT_TRUE(request->result());
467 EXPECT_LT(1, request->result()->report_count());
470 TEST_F(RTCPeerConnectionHandlerTest, GetStatsAfterClose) {
471 scoped_refptr<MockRTCStatsRequest> request(
472 new talk_base::RefCountedObject<MockRTCStatsRequest>());
473 pc_handler_->stop();
474 pc_handler_->getStats(request.get());
475 // Note that callback gets executed synchronously by mock.
476 ASSERT_TRUE(request->result());
477 EXPECT_LT(1, request->result()->report_count());
480 TEST_F(RTCPeerConnectionHandlerTest, GetStatsWithLocalSelector) {
481 blink::WebMediaStream local_stream(
482 CreateLocalMediaStream("local_stream"));
483 blink::WebMediaConstraints constraints;
484 pc_handler_->addStream(local_stream, constraints);
485 blink::WebVector<blink::WebMediaStreamTrack> tracks;
486 local_stream.audioTracks(tracks);
487 ASSERT_LE(1ul, tracks.size());
489 scoped_refptr<MockRTCStatsRequest> request(
490 new talk_base::RefCountedObject<MockRTCStatsRequest>());
491 request->setSelector(tracks[0]);
492 pc_handler_->getStats(request.get());
493 EXPECT_EQ(1, request->result()->report_count());
496 TEST_F(RTCPeerConnectionHandlerTest, GetStatsWithRemoteSelector) {
497 scoped_refptr<webrtc::MediaStreamInterface> stream(
498 AddRemoteMockMediaStream("remote_stream", "video", "audio"));
499 pc_handler_->OnAddStream(stream.get());
500 const blink::WebMediaStream& remote_stream = mock_client_->remote_stream();
502 blink::WebVector<blink::WebMediaStreamTrack> tracks;
503 remote_stream.audioTracks(tracks);
504 ASSERT_LE(1ul, tracks.size());
506 scoped_refptr<MockRTCStatsRequest> request(
507 new talk_base::RefCountedObject<MockRTCStatsRequest>());
508 request->setSelector(tracks[0]);
509 pc_handler_->getStats(request.get());
510 EXPECT_EQ(1, request->result()->report_count());
513 TEST_F(RTCPeerConnectionHandlerTest, GetStatsWithBadSelector) {
514 // The setup is the same as GetStatsWithLocalSelector, but the stream is not
515 // added to the PeerConnection.
516 blink::WebMediaStream local_stream(
517 CreateLocalMediaStream("local_stream_2"));
518 blink::WebMediaConstraints constraints;
519 blink::WebVector<blink::WebMediaStreamTrack> tracks;
521 local_stream.audioTracks(tracks);
522 blink::WebMediaStreamTrack component = tracks[0];
523 mock_peer_connection_->SetGetStatsResult(false);
525 scoped_refptr<MockRTCStatsRequest> request(
526 new talk_base::RefCountedObject<MockRTCStatsRequest>());
527 request->setSelector(component);
528 pc_handler_->getStats(request.get());
529 EXPECT_EQ(0, request->result()->report_count());
532 TEST_F(RTCPeerConnectionHandlerTest, OnSignalingChange) {
533 testing::InSequence sequence;
535 webrtc::PeerConnectionInterface::SignalingState new_state =
536 webrtc::PeerConnectionInterface::kHaveRemoteOffer;
537 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
538 pc_handler_.get(),
539 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer));
540 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
541 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer));
542 pc_handler_->OnSignalingChange(new_state);
544 new_state = webrtc::PeerConnectionInterface::kHaveLocalPrAnswer;
545 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
546 pc_handler_.get(),
547 WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalPrAnswer));
548 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
549 WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalPrAnswer));
550 pc_handler_->OnSignalingChange(new_state);
552 new_state = webrtc::PeerConnectionInterface::kHaveLocalOffer;
553 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
554 pc_handler_.get(),
555 WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalOffer));
556 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
557 WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalOffer));
558 pc_handler_->OnSignalingChange(new_state);
560 new_state = webrtc::PeerConnectionInterface::kHaveRemotePrAnswer;
561 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
562 pc_handler_.get(),
563 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemotePrAnswer));
564 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
565 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemotePrAnswer));
566 pc_handler_->OnSignalingChange(new_state);
568 new_state = webrtc::PeerConnectionInterface::kClosed;
569 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
570 pc_handler_.get(),
571 WebRTCPeerConnectionHandlerClient::SignalingStateClosed));
572 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
573 WebRTCPeerConnectionHandlerClient::SignalingStateClosed));
574 pc_handler_->OnSignalingChange(new_state);
577 TEST_F(RTCPeerConnectionHandlerTest, OnIceConnectionChange) {
578 testing::InSequence sequence;
580 webrtc::PeerConnectionInterface::IceConnectionState new_state =
581 webrtc::PeerConnectionInterface::kIceConnectionNew;
582 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
583 pc_handler_.get(),
584 WebRTCPeerConnectionHandlerClient::ICEConnectionStateStarting));
585 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
586 WebRTCPeerConnectionHandlerClient::ICEConnectionStateStarting));
587 pc_handler_->OnIceConnectionChange(new_state);
589 new_state = webrtc::PeerConnectionInterface::kIceConnectionChecking;
590 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
591 pc_handler_.get(),
592 WebRTCPeerConnectionHandlerClient::ICEConnectionStateChecking));
593 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
594 WebRTCPeerConnectionHandlerClient::ICEConnectionStateChecking));
595 pc_handler_->OnIceConnectionChange(new_state);
597 new_state = webrtc::PeerConnectionInterface::kIceConnectionConnected;
598 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
599 pc_handler_.get(),
600 WebRTCPeerConnectionHandlerClient::ICEConnectionStateConnected));
601 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
602 WebRTCPeerConnectionHandlerClient::ICEConnectionStateConnected));
603 pc_handler_->OnIceConnectionChange(new_state);
605 new_state = webrtc::PeerConnectionInterface::kIceConnectionCompleted;
606 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
607 pc_handler_.get(),
608 WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted));
609 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
610 WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted));
611 pc_handler_->OnIceConnectionChange(new_state);
613 new_state = webrtc::PeerConnectionInterface::kIceConnectionFailed;
614 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
615 pc_handler_.get(),
616 WebRTCPeerConnectionHandlerClient::ICEConnectionStateFailed));
617 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
618 WebRTCPeerConnectionHandlerClient::ICEConnectionStateFailed));
619 pc_handler_->OnIceConnectionChange(new_state);
621 new_state = webrtc::PeerConnectionInterface::kIceConnectionDisconnected;
622 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
623 pc_handler_.get(),
624 WebRTCPeerConnectionHandlerClient::ICEConnectionStateDisconnected));
625 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
626 WebRTCPeerConnectionHandlerClient::ICEConnectionStateDisconnected));
627 pc_handler_->OnIceConnectionChange(new_state);
629 new_state = webrtc::PeerConnectionInterface::kIceConnectionClosed;
630 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
631 pc_handler_.get(),
632 WebRTCPeerConnectionHandlerClient::ICEConnectionStateClosed));
633 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
634 WebRTCPeerConnectionHandlerClient::ICEConnectionStateClosed));
635 pc_handler_->OnIceConnectionChange(new_state);
638 TEST_F(RTCPeerConnectionHandlerTest, OnIceGatheringChange) {
639 testing::InSequence sequence;
640 EXPECT_CALL(*mock_tracker_.get(), TrackIceGatheringStateChange(
641 pc_handler_.get(),
642 WebRTCPeerConnectionHandlerClient::ICEGatheringStateNew));
643 EXPECT_CALL(*mock_client_.get(), didChangeICEGatheringState(
644 WebRTCPeerConnectionHandlerClient::ICEGatheringStateNew));
645 EXPECT_CALL(*mock_tracker_.get(), TrackIceGatheringStateChange(
646 pc_handler_.get(),
647 WebRTCPeerConnectionHandlerClient::ICEGatheringStateGathering));
648 EXPECT_CALL(*mock_client_.get(), didChangeICEGatheringState(
649 WebRTCPeerConnectionHandlerClient::ICEGatheringStateGathering));
650 EXPECT_CALL(*mock_tracker_.get(), TrackIceGatheringStateChange(
651 pc_handler_.get(),
652 WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete));
653 EXPECT_CALL(*mock_client_.get(), didChangeICEGatheringState(
654 WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete));
656 webrtc::PeerConnectionInterface::IceGatheringState new_state =
657 webrtc::PeerConnectionInterface::kIceGatheringNew;
658 pc_handler_->OnIceGatheringChange(new_state);
660 new_state = webrtc::PeerConnectionInterface::kIceGatheringGathering;
661 pc_handler_->OnIceGatheringChange(new_state);
663 new_state = webrtc::PeerConnectionInterface::kIceGatheringComplete;
664 pc_handler_->OnIceGatheringChange(new_state);
666 // Check NULL candidate after ice gathering is completed.
667 EXPECT_EQ("", mock_client_->candidate_mid());
668 EXPECT_EQ(-1, mock_client_->candidate_mlineindex());
669 EXPECT_EQ("", mock_client_->candidate_sdp());
672 TEST_F(RTCPeerConnectionHandlerTest, OnAddAndOnRemoveStream) {
673 std::string remote_stream_label("remote_stream");
674 scoped_refptr<webrtc::MediaStreamInterface> remote_stream(
675 AddRemoteMockMediaStream(remote_stream_label, "video", "audio"));
677 testing::InSequence sequence;
678 EXPECT_CALL(*mock_tracker_.get(), TrackAddStream(
679 pc_handler_.get(),
680 testing::Property(&blink::WebMediaStream::id,
681 base::UTF8ToUTF16(remote_stream_label)),
682 PeerConnectionTracker::SOURCE_REMOTE));
683 EXPECT_CALL(*mock_client_.get(), didAddRemoteStream(
684 testing::Property(&blink::WebMediaStream::id,
685 base::UTF8ToUTF16(remote_stream_label))));
687 EXPECT_CALL(*mock_tracker_.get(), TrackRemoveStream(
688 pc_handler_.get(),
689 testing::Property(&blink::WebMediaStream::id,
690 base::UTF8ToUTF16(remote_stream_label)),
691 PeerConnectionTracker::SOURCE_REMOTE));
692 EXPECT_CALL(*mock_client_.get(), didRemoveRemoteStream(
693 testing::Property(&blink::WebMediaStream::id,
694 base::UTF8ToUTF16(remote_stream_label))));
696 pc_handler_->OnAddStream(remote_stream.get());
697 pc_handler_->OnRemoveStream(remote_stream.get());
700 // This test that WebKit is notified about remote track state changes.
701 TEST_F(RTCPeerConnectionHandlerTest, RemoteTrackState) {
702 std::string remote_stream_label("remote_stream");
703 scoped_refptr<webrtc::MediaStreamInterface> remote_stream(
704 AddRemoteMockMediaStream(remote_stream_label, "video", "audio"));
706 testing::InSequence sequence;
707 EXPECT_CALL(*mock_client_.get(), didAddRemoteStream(
708 testing::Property(&blink::WebMediaStream::id,
709 base::UTF8ToUTF16(remote_stream_label))));
710 pc_handler_->OnAddStream(remote_stream.get());
711 const blink::WebMediaStream& webkit_stream = mock_client_->remote_stream();
713 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
714 webkit_stream.audioTracks(audio_tracks);
715 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive,
716 audio_tracks[0].source().readyState());
718 blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
719 webkit_stream.videoTracks(video_tracks);
720 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive,
721 video_tracks[0].source().readyState());
723 remote_stream->GetAudioTracks()[0]->set_state(
724 webrtc::MediaStreamTrackInterface::kEnded);
725 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded,
726 audio_tracks[0].source().readyState());
728 remote_stream->GetVideoTracks()[0]->set_state(
729 webrtc::MediaStreamTrackInterface::kEnded);
730 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded,
731 video_tracks[0].source().readyState());
734 TEST_F(RTCPeerConnectionHandlerTest, RemoveAndAddAudioTrackFromRemoteStream) {
735 std::string remote_stream_label("remote_stream");
736 scoped_refptr<webrtc::MediaStreamInterface> remote_stream(
737 AddRemoteMockMediaStream(remote_stream_label, "video", "audio"));
739 EXPECT_CALL(*mock_client_.get(), didAddRemoteStream(
740 testing::Property(&blink::WebMediaStream::id,
741 base::UTF8ToUTF16(remote_stream_label))));
742 pc_handler_->OnAddStream(remote_stream.get());
743 const blink::WebMediaStream& webkit_stream = mock_client_->remote_stream();
746 // Test in a small scope so that |audio_tracks| don't hold on to destroyed
747 // source later.
748 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
749 webkit_stream.audioTracks(audio_tracks);
750 EXPECT_EQ(1u, audio_tracks.size());
753 // Remove the Webrtc audio track from the Webrtc MediaStream.
754 scoped_refptr<webrtc::AudioTrackInterface> webrtc_track =
755 remote_stream->GetAudioTracks()[0].get();
756 remote_stream->RemoveTrack(webrtc_track.get());
759 blink::WebVector<blink::WebMediaStreamTrack> modified_audio_tracks1;
760 webkit_stream.audioTracks(modified_audio_tracks1);
761 EXPECT_EQ(0u, modified_audio_tracks1.size());
764 // Add the WebRtc audio track again.
765 remote_stream->AddTrack(webrtc_track.get());
766 blink::WebVector<blink::WebMediaStreamTrack> modified_audio_tracks2;
767 webkit_stream.audioTracks(modified_audio_tracks2);
768 EXPECT_EQ(1u, modified_audio_tracks2.size());
771 TEST_F(RTCPeerConnectionHandlerTest, RemoveAndAddVideoTrackFromRemoteStream) {
772 std::string remote_stream_label("remote_stream");
773 scoped_refptr<webrtc::MediaStreamInterface> remote_stream(
774 AddRemoteMockMediaStream(remote_stream_label, "video", "video"));
776 EXPECT_CALL(*mock_client_.get(), didAddRemoteStream(
777 testing::Property(&blink::WebMediaStream::id,
778 base::UTF8ToUTF16(remote_stream_label))));
779 pc_handler_->OnAddStream(remote_stream.get());
780 const blink::WebMediaStream& webkit_stream = mock_client_->remote_stream();
783 // Test in a small scope so that |video_tracks| don't hold on to destroyed
784 // source later.
785 blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
786 webkit_stream.videoTracks(video_tracks);
787 EXPECT_EQ(1u, video_tracks.size());
790 // Remove the Webrtc video track from the Webrtc MediaStream.
791 scoped_refptr<webrtc::VideoTrackInterface> webrtc_track =
792 remote_stream->GetVideoTracks()[0].get();
793 remote_stream->RemoveTrack(webrtc_track.get());
795 blink::WebVector<blink::WebMediaStreamTrack> modified_video_tracks1;
796 webkit_stream.videoTracks(modified_video_tracks1);
797 EXPECT_EQ(0u, modified_video_tracks1.size());
800 // Add the WebRtc video track again.
801 remote_stream->AddTrack(webrtc_track.get());
802 blink::WebVector<blink::WebMediaStreamTrack> modified_video_tracks2;
803 webkit_stream.videoTracks(modified_video_tracks2);
804 EXPECT_EQ(1u, modified_video_tracks2.size());
807 TEST_F(RTCPeerConnectionHandlerTest, OnIceCandidate) {
808 testing::InSequence sequence;
809 EXPECT_CALL(*mock_tracker_.get(),
810 TrackAddIceCandidate(pc_handler_.get(), _,
811 PeerConnectionTracker::SOURCE_LOCAL));
812 EXPECT_CALL(*mock_client_.get(), didGenerateICECandidate(_));
814 scoped_ptr<webrtc::IceCandidateInterface> native_candidate(
815 mock_dependency_factory_->CreateIceCandidate("mid", 1, kDummySdp));
816 pc_handler_->OnIceCandidate(native_candidate.get());
817 EXPECT_EQ("mid", mock_client_->candidate_mid());
818 EXPECT_EQ(1, mock_client_->candidate_mlineindex());
819 EXPECT_EQ(kDummySdp, mock_client_->candidate_sdp());
822 TEST_F(RTCPeerConnectionHandlerTest, OnRenegotiationNeeded) {
823 testing::InSequence sequence;
824 EXPECT_CALL(*mock_tracker_.get(),
825 TrackOnRenegotiationNeeded(pc_handler_.get()));
826 EXPECT_CALL(*mock_client_.get(), negotiationNeeded());
827 pc_handler_->OnRenegotiationNeeded();
830 TEST_F(RTCPeerConnectionHandlerTest, CreateDataChannel) {
831 blink::WebString label = "d1";
832 EXPECT_CALL(*mock_tracker_.get(),
833 TrackCreateDataChannel(pc_handler_.get(),
834 testing::NotNull(),
835 PeerConnectionTracker::SOURCE_LOCAL));
836 scoped_ptr<blink::WebRTCDataChannelHandler> channel(
837 pc_handler_->createDataChannel("d1", blink::WebRTCDataChannelInit()));
838 EXPECT_TRUE(channel.get() != NULL);
839 EXPECT_EQ(label, channel->label());
842 TEST_F(RTCPeerConnectionHandlerTest, CreateDtmfSender) {
843 std::string stream_label = "local_stream";
844 blink::WebMediaStream local_stream(CreateLocalMediaStream(stream_label));
845 blink::WebMediaConstraints constraints;
846 pc_handler_->addStream(local_stream, constraints);
848 blink::WebVector<blink::WebMediaStreamTrack> tracks;
849 local_stream.videoTracks(tracks);
851 ASSERT_LE(1ul, tracks.size());
852 EXPECT_FALSE(pc_handler_->createDTMFSender(tracks[0]));
854 local_stream.audioTracks(tracks);
855 ASSERT_LE(1ul, tracks.size());
857 EXPECT_CALL(*mock_tracker_.get(),
858 TrackCreateDTMFSender(pc_handler_.get(),
859 testing::Ref(tracks[0])));
861 scoped_ptr<blink::WebRTCDTMFSenderHandler> sender(
862 pc_handler_->createDTMFSender(tracks[0]));
863 EXPECT_TRUE(sender.get());
866 } // namespace content