blob: 4f048fa3ab72bb0f7a363339fb36a324069a4b13 [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +00001// 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>
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +01006#include <vector>
Torne (Richard Coles)58218062012-11-14 11:43:16 +00007
8#include "base/memory/scoped_ptr.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +01009#include "base/strings/utf_string_conversions.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000010#include "base/values.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000011#include "content/renderer/media/media_stream_extra_data.h"
12#include "content/renderer/media/mock_media_stream_dependency_factory.h"
13#include "content/renderer/media/mock_peer_connection_impl.h"
14#include "content/renderer/media/mock_web_rtc_peer_connection_handler_client.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000015#include "content/renderer/media/peer_connection_tracker.h"
16#include "content/renderer/media/rtc_media_constraints.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000017#include "content/renderer/media/rtc_peer_connection_handler.h"
Ben Murdochbb1529c2013-08-08 10:24:53 +010018#include "content/renderer/media/webrtc_audio_capturer.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000019#include "testing/gmock/include/gmock/gmock.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000020#include "testing/gtest/include/gtest/gtest.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010021#include "third_party/WebKit/public/platform/WebMediaConstraints.h"
22#include "third_party/WebKit/public/platform/WebMediaStream.h"
23#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
24#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
25#include "third_party/WebKit/public/platform/WebRTCConfiguration.h"
26#include "third_party/WebKit/public/platform/WebRTCDTMFSenderHandler.h"
27#include "third_party/WebKit/public/platform/WebRTCDataChannelHandler.h"
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010028#include "third_party/WebKit/public/platform/WebRTCDataChannelInit.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010029#include "third_party/WebKit/public/platform/WebRTCICECandidate.h"
30#include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandlerClient.h"
31#include "third_party/WebKit/public/platform/WebRTCSessionDescription.h"
32#include "third_party/WebKit/public/platform/WebRTCSessionDescriptionRequest.h"
33#include "third_party/WebKit/public/platform/WebRTCStatsRequest.h"
34#include "third_party/WebKit/public/platform/WebRTCVoidRequest.h"
35#include "third_party/WebKit/public/platform/WebURL.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000036#include "third_party/libjingle/source/talk/app/webrtc/peerconnectioninterface.h"
Torne (Richard Coles)58218062012-11-14 11:43:16 +000037
38static const char kDummySdp[] = "dummy sdp";
39static const char kDummySdpType[] = "dummy type";
40
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000041using WebKit::WebRTCPeerConnectionHandlerClient;
42using testing::NiceMock;
43using testing::_;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010044using testing::Ref;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000045
Torne (Richard Coles)58218062012-11-14 11:43:16 +000046namespace content {
47
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000048class MockRTCStatsResponse : public LocalRTCStatsResponse {
49 public:
50 MockRTCStatsResponse()
51 : report_count_(0),
52 statistic_count_(0) {
53 }
54
55 virtual size_t addReport(WebKit::WebString type,
56 WebKit::WebString id,
57 double timestamp) OVERRIDE {
58 ++report_count_;
59 return report_count_;
60 }
61
62 virtual void addStatistic(size_t report,
63 WebKit::WebString name, WebKit::WebString value)
64 OVERRIDE {
65 ++statistic_count_;
66 }
67 int report_count() const { return report_count_; }
68
69 private:
70 int report_count_;
71 int statistic_count_;
72};
73
74// Mocked wrapper for WebKit::WebRTCStatsRequest
75class MockRTCStatsRequest : public LocalRTCStatsRequest {
76 public:
77 MockRTCStatsRequest()
78 : has_selector_(false),
79 stream_(),
80 request_succeeded_called_(false) {}
81
82 virtual bool hasSelector() const OVERRIDE {
83 return has_selector_;
84 }
85 virtual WebKit::WebMediaStream stream() const OVERRIDE {
86 return stream_;
87 }
88 virtual WebKit::WebMediaStreamTrack component() const OVERRIDE {
89 return component_;
90 }
91 virtual scoped_refptr<LocalRTCStatsResponse> createResponse() OVERRIDE {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010092 DCHECK(!response_.get());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000093 response_ = new talk_base::RefCountedObject<MockRTCStatsResponse>();
94 return response_;
95 }
96
97 virtual void requestSucceeded(const LocalRTCStatsResponse* response)
98 OVERRIDE {
99 EXPECT_EQ(response, response_.get());
100 request_succeeded_called_ = true;
101 }
102
103 // Function for setting whether or not a selector is available.
104 void setSelector(const WebKit::WebMediaStream& stream,
105 const WebKit::WebMediaStreamTrack& component) {
106 has_selector_ = true;
107 stream_ = stream;
108 component_ = component;
109 }
110
111 // Function for inspecting the result of a stats request.
112 MockRTCStatsResponse* result() {
113 if (request_succeeded_called_) {
114 return response_.get();
115 } else {
116 return NULL;
117 }
118 }
119
120 private:
121 bool has_selector_;
122 WebKit::WebMediaStream stream_;
123 WebKit::WebMediaStreamTrack component_;
124 scoped_refptr<MockRTCStatsResponse> response_;
125 bool request_succeeded_called_;
126};
127
128class MockPeerConnectionTracker : public PeerConnectionTracker {
129 public:
130 MOCK_METHOD1(UnregisterPeerConnection,
131 void(RTCPeerConnectionHandler* pc_handler));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100132 // TODO(jiayl): add coverage for the following methods
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000133 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,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100141 const WebKit::WebRTCSessionDescription& desc,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000142 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 WebKit::WebRTCICECandidate& candidate,
152 Source source));
153 MOCK_METHOD3(TrackAddStream,
154 void(RTCPeerConnectionHandler* pc_handler,
155 const WebKit::WebMediaStream& stream,
156 Source source));
157 MOCK_METHOD3(TrackRemoveStream,
158 void(RTCPeerConnectionHandler* pc_handler,
159 const WebKit::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,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100182 void(RTCPeerConnectionHandler* pc_handler,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000183 const WebKit::WebMediaStreamTrack& track));
184};
185
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000186class RTCPeerConnectionHandlerUnderTest : public RTCPeerConnectionHandler {
187 public:
188 RTCPeerConnectionHandlerUnderTest(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000189 WebRTCPeerConnectionHandlerClient* client,
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000190 MediaStreamDependencyFactory* dependency_factory)
191 : RTCPeerConnectionHandler(client, dependency_factory) {
192 }
193
194 MockPeerConnectionImpl* native_peer_connection() {
195 return static_cast<MockPeerConnectionImpl*>(native_peer_connection_.get());
196 }
197};
198
199class RTCPeerConnectionHandlerTest : public ::testing::Test {
200 public:
201 RTCPeerConnectionHandlerTest() : mock_peer_connection_(NULL) {
202 }
203
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000204 virtual void SetUp() {
205 mock_client_.reset(new NiceMock<MockWebRTCPeerConnectionHandlerClient>());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000206 mock_dependency_factory_.reset(new MockMediaStreamDependencyFactory());
207 mock_dependency_factory_->EnsurePeerConnectionFactory();
208 pc_handler_.reset(
209 new RTCPeerConnectionHandlerUnderTest(mock_client_.get(),
210 mock_dependency_factory_.get()));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000211 mock_tracker_.reset(new NiceMock<MockPeerConnectionTracker>());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000212 WebKit::WebRTCConfiguration config;
213 WebKit::WebMediaConstraints constraints;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000214 EXPECT_TRUE(pc_handler_->InitializeForTest(config, constraints,
215 mock_tracker_.get()));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000216
217 mock_peer_connection_ = pc_handler_->native_peer_connection();
218 ASSERT_TRUE(mock_peer_connection_);
219 }
220
221 // Creates a WebKit local MediaStream.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000222 WebKit::WebMediaStream CreateLocalMediaStream(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000223 const std::string& stream_label) {
224 std::string video_track_label("video-label");
225 std::string audio_track_label("audio-label");
226
Ben Murdochbbcdd452013-07-25 10:06:34 +0100227 WebKit::WebMediaStreamSource audio_source;
228 audio_source.initialize(WebKit::WebString::fromUTF8(audio_track_label),
229 WebKit::WebMediaStreamSource::TypeAudio,
230 WebKit::WebString::fromUTF8("audio_track"));
231 WebKit::WebMediaStreamSource video_source;
232 video_source.initialize(WebKit::WebString::fromUTF8(video_track_label),
233 WebKit::WebMediaStreamSource::TypeVideo,
234 WebKit::WebString::fromUTF8("video_track"));
235
236 WebKit::WebVector<WebKit::WebMediaStreamTrack> audio_tracks(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000237 static_cast<size_t>(1));
Ben Murdochbbcdd452013-07-25 10:06:34 +0100238 audio_tracks[0].initialize(audio_source.id(), audio_source);
239 WebKit::WebVector<WebKit::WebMediaStreamTrack> video_tracks(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000240 static_cast<size_t>(1));
Ben Murdochbbcdd452013-07-25 10:06:34 +0100241 video_tracks[0].initialize(video_source.id(), video_source);
242
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000243 WebKit::WebMediaStream local_stream;
Ben Murdochbbcdd452013-07-25 10:06:34 +0100244 local_stream.initialize(UTF8ToUTF16(stream_label), audio_tracks,
245 video_tracks);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000246
247 scoped_refptr<webrtc::MediaStreamInterface> native_stream(
248 mock_dependency_factory_->CreateLocalMediaStream(stream_label));
Ben Murdochbbcdd452013-07-25 10:06:34 +0100249
250 local_stream.audioTracks(audio_tracks);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000251 const std::string audio_track_id = UTF16ToUTF8(audio_tracks[0].id());
Ben Murdochbb1529c2013-08-08 10:24:53 +0100252 scoped_refptr<WebRtcAudioCapturer> capturer;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000253 scoped_refptr<webrtc::AudioTrackInterface> audio_track(
254 mock_dependency_factory_->CreateLocalAudioTrack(audio_track_id,
Ben Murdochbb1529c2013-08-08 10:24:53 +0100255 capturer,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000256 NULL));
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100257 native_stream->AddTrack(audio_track.get());
Ben Murdochbbcdd452013-07-25 10:06:34 +0100258
259 local_stream.videoTracks(video_tracks);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000260 const std::string video_track_id = UTF16ToUTF8(video_tracks[0].id());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100261 webrtc::VideoSourceInterface* source = NULL;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000262 scoped_refptr<webrtc::VideoTrackInterface> video_track(
263 mock_dependency_factory_->CreateLocalVideoTrack(
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100264 video_track_id, source));
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100265 native_stream->AddTrack(video_track.get());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000266
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100267 local_stream.setExtraData(
268 new MediaStreamExtraData(native_stream.get(), true));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000269 return local_stream;
270 }
271
272 // Creates a remote MediaStream and adds it to the mocked native
273 // peer connection.
274 scoped_refptr<webrtc::MediaStreamInterface>
275 AddRemoteMockMediaStream(const std::string& stream_label,
276 const std::string& video_track_label,
277 const std::string& audio_track_label) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000278 scoped_refptr<webrtc::MediaStreamInterface> stream(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000279 mock_dependency_factory_->CreateLocalMediaStream(stream_label));
280 if (!video_track_label.empty()) {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100281 webrtc::VideoSourceInterface* source = NULL;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000282 scoped_refptr<webrtc::VideoTrackInterface> video_track(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000283 mock_dependency_factory_->CreateLocalVideoTrack(
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100284 video_track_label, source));
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100285 stream->AddTrack(video_track.get());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000286 }
287 if (!audio_track_label.empty()) {
Ben Murdochbb1529c2013-08-08 10:24:53 +0100288 scoped_refptr<WebRtcAudioCapturer> capturer;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000289 scoped_refptr<webrtc::AudioTrackInterface> audio_track(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000290 mock_dependency_factory_->CreateLocalAudioTrack(audio_track_label,
Ben Murdochbb1529c2013-08-08 10:24:53 +0100291 capturer,
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000292 NULL));
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100293 stream->AddTrack(audio_track.get());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000294 }
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100295 mock_peer_connection_->AddRemoteStream(stream.get());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000296 return stream;
297 }
298
299 scoped_ptr<MockWebRTCPeerConnectionHandlerClient> mock_client_;
300 scoped_ptr<MockMediaStreamDependencyFactory> mock_dependency_factory_;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000301 scoped_ptr<NiceMock<MockPeerConnectionTracker> > mock_tracker_;
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000302 scoped_ptr<RTCPeerConnectionHandlerUnderTest> pc_handler_;
303
304 // Weak reference to the mocked native peer connection implementation.
305 MockPeerConnectionImpl* mock_peer_connection_;
306};
307
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000308TEST_F(RTCPeerConnectionHandlerTest, Destruct) {
309 EXPECT_CALL(*mock_tracker_.get(), UnregisterPeerConnection(pc_handler_.get()))
310 .Times(1);
311 pc_handler_.reset(NULL);
312}
313
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000314TEST_F(RTCPeerConnectionHandlerTest, CreateOffer) {
315 WebKit::WebRTCSessionDescriptionRequest request;
316 WebKit::WebMediaConstraints options;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000317 EXPECT_CALL(*mock_tracker_.get(), TrackCreateOffer(pc_handler_.get(), _));
318
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000319 // TODO(perkj): Can WebKit::WebRTCSessionDescriptionRequest be changed so
320 // the |reqest| requestSucceeded can be tested? Currently the |request| object
321 // can not be initialized from a unit test.
322 EXPECT_FALSE(mock_peer_connection_->created_session_description() != NULL);
323 pc_handler_->createOffer(request, options);
324 EXPECT_TRUE(mock_peer_connection_->created_session_description() != NULL);
325}
326
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000327TEST_F(RTCPeerConnectionHandlerTest, CreateAnswer) {
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000328 WebKit::WebRTCSessionDescriptionRequest request;
329 WebKit::WebMediaConstraints options;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000330 EXPECT_CALL(*mock_tracker_.get(), TrackCreateAnswer(pc_handler_.get(), _));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000331 // TODO(perkj): Can WebKit::WebRTCSessionDescriptionRequest be changed so
332 // the |reqest| requestSucceeded can be tested? Currently the |request| object
333 // can not be initialized from a unit test.
334 EXPECT_FALSE(mock_peer_connection_->created_session_description() != NULL);
335 pc_handler_->createAnswer(request, options);
336 EXPECT_TRUE(mock_peer_connection_->created_session_description() != NULL);
337}
338
339TEST_F(RTCPeerConnectionHandlerTest, setLocalDescription) {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100340 WebKit::WebRTCVoidRequest request;
341 WebKit::WebRTCSessionDescription description;
342 description.initialize(kDummySdpType, kDummySdp);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000343 // PeerConnectionTracker::TrackSetSessionDescription is expected to be called
344 // before |mock_peer_connection| is called.
345 testing::InSequence sequence;
346 EXPECT_CALL(*mock_tracker_.get(),
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100347 TrackSetSessionDescription(pc_handler_.get(), Ref(description),
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000348 PeerConnectionTracker::SOURCE_LOCAL));
349 EXPECT_CALL(*mock_peer_connection_, SetLocalDescription(_, _));
350
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000351 pc_handler_->setLocalDescription(request, description);
352 EXPECT_EQ(description.type(), pc_handler_->localDescription().type());
353 EXPECT_EQ(description.sdp(), pc_handler_->localDescription().sdp());
354
355 std::string sdp_string;
356 ASSERT_TRUE(mock_peer_connection_->local_description() != NULL);
357 EXPECT_EQ(kDummySdpType, mock_peer_connection_->local_description()->type());
358 mock_peer_connection_->local_description()->ToString(&sdp_string);
359 EXPECT_EQ(kDummySdp, sdp_string);
360}
361
362TEST_F(RTCPeerConnectionHandlerTest, setRemoteDescription) {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100363 WebKit::WebRTCVoidRequest request;
364 WebKit::WebRTCSessionDescription description;
365 description.initialize(kDummySdpType, kDummySdp);
366
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000367 // PeerConnectionTracker::TrackSetSessionDescription is expected to be called
368 // before |mock_peer_connection| is called.
369 testing::InSequence sequence;
370 EXPECT_CALL(*mock_tracker_.get(),
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100371 TrackSetSessionDescription(pc_handler_.get(), Ref(description),
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000372 PeerConnectionTracker::SOURCE_REMOTE));
373 EXPECT_CALL(*mock_peer_connection_, SetRemoteDescription(_, _));
374
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000375 pc_handler_->setRemoteDescription(request, description);
376 EXPECT_EQ(description.type(), pc_handler_->remoteDescription().type());
377 EXPECT_EQ(description.sdp(), pc_handler_->remoteDescription().sdp());
378
379 std::string sdp_string;
380 ASSERT_TRUE(mock_peer_connection_->remote_description() != NULL);
381 EXPECT_EQ(kDummySdpType, mock_peer_connection_->remote_description()->type());
382 mock_peer_connection_->remote_description()->ToString(&sdp_string);
383 EXPECT_EQ(kDummySdp, sdp_string);
384}
385
386TEST_F(RTCPeerConnectionHandlerTest, updateICE) {
387 WebKit::WebRTCConfiguration config;
388 WebKit::WebMediaConstraints constraints;
389
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000390 EXPECT_CALL(*mock_tracker_.get(), TrackUpdateIce(pc_handler_.get(), _, _));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000391 // TODO(perkj): Test that the parameters in |config| can be translated when a
392 // WebRTCConfiguration can be constructed. It's WebKit class and can't be
393 // initialized from a test.
394 EXPECT_TRUE(pc_handler_->updateICE(config, constraints));
395}
396
397TEST_F(RTCPeerConnectionHandlerTest, addICECandidate) {
398 WebKit::WebRTCICECandidate candidate;
399 candidate.initialize(kDummySdp, "mid", 1);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000400
401 EXPECT_CALL(*mock_tracker_.get(),
402 TrackAddIceCandidate(pc_handler_.get(),
403 testing::Ref(candidate),
404 PeerConnectionTracker::SOURCE_REMOTE));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000405 EXPECT_TRUE(pc_handler_->addICECandidate(candidate));
406 EXPECT_EQ(kDummySdp, mock_peer_connection_->ice_sdp());
407 EXPECT_EQ(1, mock_peer_connection_->sdp_mline_index());
408 EXPECT_EQ("mid", mock_peer_connection_->sdp_mid());
409}
410
411TEST_F(RTCPeerConnectionHandlerTest, addAndRemoveStream) {
412 std::string stream_label = "local_stream";
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000413 WebKit::WebMediaStream local_stream(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000414 CreateLocalMediaStream(stream_label));
415 WebKit::WebMediaConstraints constraints;
416
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000417 EXPECT_CALL(*mock_tracker_.get(),
418 TrackAddStream(pc_handler_.get(),
419 testing::Ref(local_stream),
420 PeerConnectionTracker::SOURCE_LOCAL));
421 EXPECT_CALL(*mock_tracker_.get(),
422 TrackRemoveStream(pc_handler_.get(),
423 testing::Ref(local_stream),
424 PeerConnectionTracker::SOURCE_LOCAL));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000425 EXPECT_TRUE(pc_handler_->addStream(local_stream, constraints));
426 EXPECT_EQ(stream_label, mock_peer_connection_->stream_label());
427 EXPECT_EQ(1u,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000428 mock_peer_connection_->local_streams()->at(0)->GetAudioTracks().size());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000429 EXPECT_EQ(1u,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000430 mock_peer_connection_->local_streams()->at(0)->GetVideoTracks().size());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000431
432 pc_handler_->removeStream(local_stream);
433 EXPECT_EQ(0u, mock_peer_connection_->local_streams()->count());
434}
435
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000436TEST_F(RTCPeerConnectionHandlerTest, GetStatsNoSelector) {
437 scoped_refptr<MockRTCStatsRequest> request(
438 new talk_base::RefCountedObject<MockRTCStatsRequest>());
439 pc_handler_->getStats(request.get());
440 // Note that callback gets executed synchronously by mock.
441 ASSERT_TRUE(request->result());
442 EXPECT_LT(1, request->result()->report_count());
443}
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000444
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000445TEST_F(RTCPeerConnectionHandlerTest, GetStatsAfterClose) {
446 scoped_refptr<MockRTCStatsRequest> request(
447 new talk_base::RefCountedObject<MockRTCStatsRequest>());
448 pc_handler_->stop();
449 pc_handler_->getStats(request.get());
450 // Note that callback gets executed synchronously by mock.
451 ASSERT_TRUE(request->result());
452 EXPECT_LT(1, request->result()->report_count());
453}
454
455TEST_F(RTCPeerConnectionHandlerTest, GetStatsWithLocalSelector) {
456 WebKit::WebMediaStream local_stream(
457 CreateLocalMediaStream("local_stream"));
458 WebKit::WebMediaConstraints constraints;
459 pc_handler_->addStream(local_stream, constraints);
460 WebKit::WebVector<WebKit::WebMediaStreamTrack> tracks;
Ben Murdochbbcdd452013-07-25 10:06:34 +0100461 local_stream.audioTracks(tracks);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000462 ASSERT_LE(1ul, tracks.size());
463
464 scoped_refptr<MockRTCStatsRequest> request(
465 new talk_base::RefCountedObject<MockRTCStatsRequest>());
466 request->setSelector(local_stream, tracks[0]);
467 pc_handler_->getStats(request.get());
468 EXPECT_EQ(1, request->result()->report_count());
469}
470
471TEST_F(RTCPeerConnectionHandlerTest, GetStatsWithRemoteSelector) {
472 scoped_refptr<webrtc::MediaStreamInterface> stream(
473 AddRemoteMockMediaStream("remote_stream", "video", "audio"));
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100474 pc_handler_->OnAddStream(stream.get());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000475 const WebKit::WebMediaStream& remote_stream = mock_client_->remote_stream();
476
477 WebKit::WebVector<WebKit::WebMediaStreamTrack> tracks;
Ben Murdochbbcdd452013-07-25 10:06:34 +0100478 remote_stream.audioTracks(tracks);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000479 ASSERT_LE(1ul, tracks.size());
480
481 scoped_refptr<MockRTCStatsRequest> request(
482 new talk_base::RefCountedObject<MockRTCStatsRequest>());
483 request->setSelector(remote_stream, tracks[0]);
484 pc_handler_->getStats(request.get());
485 EXPECT_EQ(1, request->result()->report_count());
486}
487
488TEST_F(RTCPeerConnectionHandlerTest, GetStatsWithBadSelector) {
489 // The setup is the same as GetStatsWithLocalSelector, but the stream is not
490 // added to the PeerConnection.
491 WebKit::WebMediaStream local_stream(
492 CreateLocalMediaStream("local_stream_2"));
493 WebKit::WebMediaConstraints constraints;
494 WebKit::WebVector<WebKit::WebMediaStreamTrack> tracks;
495
Ben Murdochbbcdd452013-07-25 10:06:34 +0100496 local_stream.audioTracks(tracks);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000497 WebKit::WebMediaStreamTrack component = tracks[0];
498 mock_peer_connection_->SetGetStatsResult(false);
499
500 scoped_refptr<MockRTCStatsRequest> request(
501 new talk_base::RefCountedObject<MockRTCStatsRequest>());
502 request->setSelector(local_stream, component);
503 pc_handler_->getStats(request.get());
504 EXPECT_EQ(0, request->result()->report_count());
505}
506
507TEST_F(RTCPeerConnectionHandlerTest, OnSignalingChange) {
508 testing::InSequence sequence;
509
510 webrtc::PeerConnectionInterface::SignalingState new_state =
511 webrtc::PeerConnectionInterface::kHaveRemoteOffer;
512 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
513 pc_handler_.get(),
514 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer));
515 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
516 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer));
517 pc_handler_->OnSignalingChange(new_state);
518
519 new_state = webrtc::PeerConnectionInterface::kHaveLocalPrAnswer;
520 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
521 pc_handler_.get(),
522 WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalPrAnswer));
523 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
524 WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalPrAnswer));
525 pc_handler_->OnSignalingChange(new_state);
526
527 new_state = webrtc::PeerConnectionInterface::kHaveLocalOffer;
528 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
529 pc_handler_.get(),
530 WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalOffer));
531 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
532 WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalOffer));
533 pc_handler_->OnSignalingChange(new_state);
534
535 new_state = webrtc::PeerConnectionInterface::kHaveRemotePrAnswer;
536 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
537 pc_handler_.get(),
538 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemotePrAnswer));
539 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
540 WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemotePrAnswer));
541 pc_handler_->OnSignalingChange(new_state);
542
543 new_state = webrtc::PeerConnectionInterface::kClosed;
544 EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange(
545 pc_handler_.get(),
546 WebRTCPeerConnectionHandlerClient::SignalingStateClosed));
547 EXPECT_CALL(*mock_client_.get(), didChangeSignalingState(
548 WebRTCPeerConnectionHandlerClient::SignalingStateClosed));
549 pc_handler_->OnSignalingChange(new_state);
550}
551
552TEST_F(RTCPeerConnectionHandlerTest, OnIceConnectionChange) {
553 testing::InSequence sequence;
554
555 webrtc::PeerConnectionInterface::IceConnectionState new_state =
556 webrtc::PeerConnectionInterface::kIceConnectionNew;
557 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
558 pc_handler_.get(),
559 WebRTCPeerConnectionHandlerClient::ICEConnectionStateStarting));
560 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
561 WebRTCPeerConnectionHandlerClient::ICEConnectionStateStarting));
562 pc_handler_->OnIceConnectionChange(new_state);
563
564 new_state = webrtc::PeerConnectionInterface::kIceConnectionChecking;
565 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
566 pc_handler_.get(),
567 WebRTCPeerConnectionHandlerClient::ICEConnectionStateChecking));
568 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
569 WebRTCPeerConnectionHandlerClient::ICEConnectionStateChecking));
570 pc_handler_->OnIceConnectionChange(new_state);
571
572 new_state = webrtc::PeerConnectionInterface::kIceConnectionConnected;
573 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
574 pc_handler_.get(),
575 WebRTCPeerConnectionHandlerClient::ICEConnectionStateConnected));
576 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
577 WebRTCPeerConnectionHandlerClient::ICEConnectionStateConnected));
578 pc_handler_->OnIceConnectionChange(new_state);
579
580 new_state = webrtc::PeerConnectionInterface::kIceConnectionCompleted;
581 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
582 pc_handler_.get(),
583 WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted));
584 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
585 WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted));
586 pc_handler_->OnIceConnectionChange(new_state);
587
588 new_state = webrtc::PeerConnectionInterface::kIceConnectionFailed;
589 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
590 pc_handler_.get(),
591 WebRTCPeerConnectionHandlerClient::ICEConnectionStateFailed));
592 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
593 WebRTCPeerConnectionHandlerClient::ICEConnectionStateFailed));
594 pc_handler_->OnIceConnectionChange(new_state);
595
596 new_state = webrtc::PeerConnectionInterface::kIceConnectionDisconnected;
597 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
598 pc_handler_.get(),
599 WebRTCPeerConnectionHandlerClient::ICEConnectionStateDisconnected));
600 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
601 WebRTCPeerConnectionHandlerClient::ICEConnectionStateDisconnected));
602 pc_handler_->OnIceConnectionChange(new_state);
603
604 new_state = webrtc::PeerConnectionInterface::kIceConnectionClosed;
605 EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange(
606 pc_handler_.get(),
607 WebRTCPeerConnectionHandlerClient::ICEConnectionStateClosed));
608 EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState(
609 WebRTCPeerConnectionHandlerClient::ICEConnectionStateClosed));
610 pc_handler_->OnIceConnectionChange(new_state);
611}
612
613TEST_F(RTCPeerConnectionHandlerTest, OnIceGatheringChange) {
614 testing::InSequence sequence;
615 EXPECT_CALL(*mock_tracker_.get(), TrackIceGatheringStateChange(
616 pc_handler_.get(),
617 WebRTCPeerConnectionHandlerClient::ICEGatheringStateNew));
618 EXPECT_CALL(*mock_client_.get(), didChangeICEGatheringState(
619 WebRTCPeerConnectionHandlerClient::ICEGatheringStateNew));
620 EXPECT_CALL(*mock_tracker_.get(), TrackIceGatheringStateChange(
621 pc_handler_.get(),
622 WebRTCPeerConnectionHandlerClient::ICEGatheringStateGathering));
623 EXPECT_CALL(*mock_client_.get(), didChangeICEGatheringState(
624 WebRTCPeerConnectionHandlerClient::ICEGatheringStateGathering));
625 EXPECT_CALL(*mock_tracker_.get(), TrackIceGatheringStateChange(
626 pc_handler_.get(),
627 WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete));
628 EXPECT_CALL(*mock_client_.get(), didChangeICEGatheringState(
629 WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete));
630
631 webrtc::PeerConnectionInterface::IceGatheringState new_state =
632 webrtc::PeerConnectionInterface::kIceGatheringNew;
633 pc_handler_->OnIceGatheringChange(new_state);
634
635 new_state = webrtc::PeerConnectionInterface::kIceGatheringGathering;
636 pc_handler_->OnIceGatheringChange(new_state);
637
638 new_state = webrtc::PeerConnectionInterface::kIceGatheringComplete;
639 pc_handler_->OnIceGatheringChange(new_state);
640
641 // Check NULL candidate after ice gathering is completed.
642 EXPECT_EQ("", mock_client_->candidate_mid());
643 EXPECT_EQ(-1, mock_client_->candidate_mlineindex());
644 EXPECT_EQ("", mock_client_->candidate_sdp());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000645}
646
647TEST_F(RTCPeerConnectionHandlerTest, OnAddAndOnRemoveStream) {
648 std::string remote_stream_label("remote_stream");
649 scoped_refptr<webrtc::MediaStreamInterface> remote_stream(
650 AddRemoteMockMediaStream(remote_stream_label, "video", "audio"));
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000651
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000652 testing::InSequence sequence;
653 EXPECT_CALL(*mock_tracker_.get(), TrackAddStream(
654 pc_handler_.get(),
Ben Murdochbbcdd452013-07-25 10:06:34 +0100655 testing::Property(&WebKit::WebMediaStream::id,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000656 UTF8ToUTF16(remote_stream_label)),
657 PeerConnectionTracker::SOURCE_REMOTE));
658 EXPECT_CALL(*mock_client_.get(), didAddRemoteStream(
Ben Murdochbbcdd452013-07-25 10:06:34 +0100659 testing::Property(&WebKit::WebMediaStream::id,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000660 UTF8ToUTF16(remote_stream_label))));
661
662 EXPECT_CALL(*mock_tracker_.get(), TrackRemoveStream(
663 pc_handler_.get(),
Ben Murdochbbcdd452013-07-25 10:06:34 +0100664 testing::Property(&WebKit::WebMediaStream::id,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000665 UTF8ToUTF16(remote_stream_label)),
666 PeerConnectionTracker::SOURCE_REMOTE));
667 EXPECT_CALL(*mock_client_.get(), didRemoveRemoteStream(
Ben Murdochbbcdd452013-07-25 10:06:34 +0100668 testing::Property(&WebKit::WebMediaStream::id,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000669 UTF8ToUTF16(remote_stream_label))));
670
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100671 pc_handler_->OnAddStream(remote_stream.get());
672 pc_handler_->OnRemoveStream(remote_stream.get());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000673}
674
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100675// This test that WebKit is notified about remote track state changes.
676TEST_F(RTCPeerConnectionHandlerTest, RemoteTrackState) {
677 std::string remote_stream_label("remote_stream");
678 scoped_refptr<webrtc::MediaStreamInterface> remote_stream(
679 AddRemoteMockMediaStream(remote_stream_label, "video", "audio"));
680
681 testing::InSequence sequence;
682 EXPECT_CALL(*mock_client_.get(), didAddRemoteStream(
Ben Murdochbbcdd452013-07-25 10:06:34 +0100683 testing::Property(&WebKit::WebMediaStream::id,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100684 UTF8ToUTF16(remote_stream_label))));
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100685 pc_handler_->OnAddStream(remote_stream.get());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100686 const WebKit::WebMediaStream& webkit_stream = mock_client_->remote_stream();
687
688 WebKit::WebVector<WebKit::WebMediaStreamTrack> audio_tracks;
689 webkit_stream.audioTracks(audio_tracks);
690 EXPECT_EQ(WebKit::WebMediaStreamSource::ReadyStateLive,
691 audio_tracks[0].source().readyState());
692
693 WebKit::WebVector<WebKit::WebMediaStreamTrack> video_tracks;
694 webkit_stream.videoTracks(video_tracks);
695 EXPECT_EQ(WebKit::WebMediaStreamSource::ReadyStateLive,
696 video_tracks[0].source().readyState());
697
698 remote_stream->GetAudioTracks()[0]->set_state(
699 webrtc::MediaStreamTrackInterface::kEnded);
700 EXPECT_EQ(WebKit::WebMediaStreamSource::ReadyStateEnded,
701 audio_tracks[0].source().readyState());
702
703 remote_stream->GetVideoTracks()[0]->set_state(
704 webrtc::MediaStreamTrackInterface::kEnded);
705 EXPECT_EQ(WebKit::WebMediaStreamSource::ReadyStateEnded,
706 video_tracks[0].source().readyState());
707}
708
709TEST_F(RTCPeerConnectionHandlerTest, RemoveAndAddAudioTrackFromRemoteStream) {
710 std::string remote_stream_label("remote_stream");
711 scoped_refptr<webrtc::MediaStreamInterface> remote_stream(
712 AddRemoteMockMediaStream(remote_stream_label, "video", "audio"));
713
714 EXPECT_CALL(*mock_client_.get(), didAddRemoteStream(
Ben Murdochbbcdd452013-07-25 10:06:34 +0100715 testing::Property(&WebKit::WebMediaStream::id,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100716 UTF8ToUTF16(remote_stream_label))));
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100717 pc_handler_->OnAddStream(remote_stream.get());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100718 const WebKit::WebMediaStream& webkit_stream = mock_client_->remote_stream();
719
720 WebKit::WebVector<WebKit::WebMediaStreamTrack> audio_tracks;
721 webkit_stream.audioTracks(audio_tracks);
722 EXPECT_EQ(1u, audio_tracks.size());
723
724 // Remove the Webrtc audio track from the Webrtc MediaStream.
725 scoped_refptr<webrtc::AudioTrackInterface> webrtc_track =
726 remote_stream->GetAudioTracks()[0].get();
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100727 remote_stream->RemoveTrack(webrtc_track.get());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100728 WebKit::WebVector<WebKit::WebMediaStreamTrack> modified_audio_tracks1;
729 webkit_stream.audioTracks(modified_audio_tracks1);
730 EXPECT_EQ(0u, modified_audio_tracks1.size());
731
732 // Add the WebRtc audio track again.
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100733 remote_stream->AddTrack(webrtc_track.get());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100734 WebKit::WebVector<WebKit::WebMediaStreamTrack> modified_audio_tracks2;
735 webkit_stream.audioTracks(modified_audio_tracks2);
736 EXPECT_EQ(1u, modified_audio_tracks2.size());
737}
738
739TEST_F(RTCPeerConnectionHandlerTest, RemoveAndAddVideoTrackFromRemoteStream) {
740 std::string remote_stream_label("remote_stream");
741 scoped_refptr<webrtc::MediaStreamInterface> remote_stream(
742 AddRemoteMockMediaStream(remote_stream_label, "video", "video"));
743
744 EXPECT_CALL(*mock_client_.get(), didAddRemoteStream(
Ben Murdochbbcdd452013-07-25 10:06:34 +0100745 testing::Property(&WebKit::WebMediaStream::id,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100746 UTF8ToUTF16(remote_stream_label))));
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100747 pc_handler_->OnAddStream(remote_stream.get());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100748 const WebKit::WebMediaStream& webkit_stream = mock_client_->remote_stream();
749
750 WebKit::WebVector<WebKit::WebMediaStreamTrack> video_tracks;
751 webkit_stream.videoTracks(video_tracks);
752 EXPECT_EQ(1u, video_tracks.size());
753
754 // Remove the Webrtc video track from the Webrtc MediaStream.
755 scoped_refptr<webrtc::VideoTrackInterface> webrtc_track =
756 remote_stream->GetVideoTracks()[0].get();
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100757 remote_stream->RemoveTrack(webrtc_track.get());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100758 WebKit::WebVector<WebKit::WebMediaStreamTrack> modified_video_tracks1;
759 webkit_stream.videoTracks(modified_video_tracks1);
760 EXPECT_EQ(0u, modified_video_tracks1.size());
761
762 // Add the WebRtc video track again.
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100763 remote_stream->AddTrack(webrtc_track.get());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100764 WebKit::WebVector<WebKit::WebMediaStreamTrack> modified_video_tracks2;
765 webkit_stream.videoTracks(modified_video_tracks2);
766 EXPECT_EQ(1u, modified_video_tracks2.size());
767}
768
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000769TEST_F(RTCPeerConnectionHandlerTest, OnIceCandidate) {
770 testing::InSequence sequence;
771 EXPECT_CALL(*mock_tracker_.get(),
772 TrackAddIceCandidate(pc_handler_.get(), _,
773 PeerConnectionTracker::SOURCE_LOCAL));
774 EXPECT_CALL(*mock_client_.get(), didGenerateICECandidate(_));
775
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000776 scoped_ptr<webrtc::IceCandidateInterface> native_candidate(
777 mock_dependency_factory_->CreateIceCandidate("mid", 1, kDummySdp));
778 pc_handler_->OnIceCandidate(native_candidate.get());
779 EXPECT_EQ("mid", mock_client_->candidate_mid());
780 EXPECT_EQ(1, mock_client_->candidate_mlineindex());
781 EXPECT_EQ(kDummySdp, mock_client_->candidate_sdp());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000782}
783
784TEST_F(RTCPeerConnectionHandlerTest, OnRenegotiationNeeded) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000785 testing::InSequence sequence;
786 EXPECT_CALL(*mock_tracker_.get(),
787 TrackOnRenegotiationNeeded(pc_handler_.get()));
788 EXPECT_CALL(*mock_client_.get(), negotiationNeeded());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000789 pc_handler_->OnRenegotiationNeeded();
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000790}
791
792TEST_F(RTCPeerConnectionHandlerTest, CreateDataChannel) {
793 WebKit::WebString label = "d1";
794 EXPECT_CALL(*mock_tracker_.get(),
795 TrackCreateDataChannel(pc_handler_.get(),
796 testing::NotNull(),
797 PeerConnectionTracker::SOURCE_LOCAL));
798 scoped_ptr<WebKit::WebRTCDataChannelHandler> channel(
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100799 pc_handler_->createDataChannel("d1", WebKit::WebRTCDataChannelInit()));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000800 EXPECT_TRUE(channel.get() != NULL);
801 EXPECT_EQ(label, channel->label());
802}
803
804TEST_F(RTCPeerConnectionHandlerTest, CreateDtmfSender) {
805 std::string stream_label = "local_stream";
806 WebKit::WebMediaStream local_stream(CreateLocalMediaStream(stream_label));
807 WebKit::WebMediaConstraints constraints;
808 pc_handler_->addStream(local_stream, constraints);
809
810 WebKit::WebVector<WebKit::WebMediaStreamTrack> tracks;
Ben Murdochbbcdd452013-07-25 10:06:34 +0100811 local_stream.videoTracks(tracks);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000812
813 ASSERT_LE(1ul, tracks.size());
814 EXPECT_FALSE(pc_handler_->createDTMFSender(tracks[0]));
815
Ben Murdochbbcdd452013-07-25 10:06:34 +0100816 local_stream.audioTracks(tracks);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000817 ASSERT_LE(1ul, tracks.size());
818
819 EXPECT_CALL(*mock_tracker_.get(),
820 TrackCreateDTMFSender(pc_handler_.get(),
821 testing::Ref(tracks[0])));
822
823 scoped_ptr<WebKit::WebRTCDTMFSenderHandler> sender(
824 pc_handler_->createDTMFSender(tracks[0]));
825 EXPECT_TRUE(sender.get());
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000826}
827
828} // namespace content