blob: 20cd7a64396ccc3bcbe12653162035395a5f6c23 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
11#include <stdio.h>
12
13#include <algorithm>
14#include <list>
15#include <map>
kwibergd1fe2812016-04-27 06:47:29 -070016#include <memory>
kwiberg0eb15ed2015-12-17 03:04:15 -080017#include <utility>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000018#include <vector>
19
Henrik Kjellander15583c12016-02-10 10:53:12 +010020#include "webrtc/api/dtmfsender.h"
21#include "webrtc/api/fakemetricsobserver.h"
22#include "webrtc/api/localaudiosource.h"
23#include "webrtc/api/mediastreaminterface.h"
24#include "webrtc/api/peerconnection.h"
25#include "webrtc/api/peerconnectionfactory.h"
26#include "webrtc/api/peerconnectioninterface.h"
27#include "webrtc/api/test/fakeaudiocapturemodule.h"
28#include "webrtc/api/test/fakeconstraints.h"
Henrik Kjellander15583c12016-02-10 10:53:12 +010029#include "webrtc/api/test/fakeperiodicvideocapturer.h"
Henrik Boströmd79599d2016-06-01 13:58:50 +020030#include "webrtc/api/test/fakertccertificategenerator.h"
Henrik Kjellander15583c12016-02-10 10:53:12 +010031#include "webrtc/api/test/fakevideotrackrenderer.h"
32#include "webrtc/api/test/mockpeerconnectionobservers.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000033#include "webrtc/base/gunit.h"
pbos@webrtc.org9eacb8c2015-01-02 09:03:19 +000034#include "webrtc/base/physicalsocketserver.h"
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000035#include "webrtc/base/ssladapter.h"
36#include "webrtc/base/sslstreamadapter.h"
37#include "webrtc/base/thread.h"
pbos@webrtc.org9eacb8c2015-01-02 09:03:19 +000038#include "webrtc/base/virtualsocketserver.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010039#include "webrtc/media/engine/fakewebrtcvideoengine.h"
Taylor Brandstettera1c30352016-05-13 08:15:11 -070040#include "webrtc/p2p/base/fakeportallocator.h"
kjellanderf4752772016-03-02 05:42:30 -080041#include "webrtc/p2p/base/p2pconstants.h"
pbos@webrtc.org9eacb8c2015-01-02 09:03:19 +000042#include "webrtc/p2p/base/sessiondescription.h"
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010043#include "webrtc/pc/mediasession.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000044
45#define MAYBE_SKIP_TEST(feature) \
46 if (!(feature())) { \
47 LOG(LS_INFO) << "Feature disabled... skipping"; \
48 return; \
49 }
50
51using cricket::ContentInfo;
52using cricket::FakeWebRtcVideoDecoder;
53using cricket::FakeWebRtcVideoDecoderFactory;
54using cricket::FakeWebRtcVideoEncoder;
55using cricket::FakeWebRtcVideoEncoderFactory;
56using cricket::MediaContentDescription;
57using webrtc::DataBuffer;
58using webrtc::DataChannelInterface;
59using webrtc::DtmfSender;
60using webrtc::DtmfSenderInterface;
61using webrtc::DtmfSenderObserverInterface;
62using webrtc::FakeConstraints;
63using webrtc::MediaConstraintsInterface;
deadbeeffaac4972015-11-12 15:33:07 -080064using webrtc::MediaStreamInterface;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000065using webrtc::MediaStreamTrackInterface;
66using webrtc::MockCreateSessionDescriptionObserver;
67using webrtc::MockDataChannelObserver;
68using webrtc::MockSetSessionDescriptionObserver;
69using webrtc::MockStatsObserver;
deadbeeffaac4972015-11-12 15:33:07 -080070using webrtc::ObserverInterface;
jiayl@webrtc.orgdb41b4d2014-03-03 21:30:06 +000071using webrtc::PeerConnectionInterface;
Joachim Bauch04e5b492015-05-29 09:40:39 +020072using webrtc::PeerConnectionFactory;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073using webrtc::SessionDescriptionInterface;
74using webrtc::StreamCollectionInterface;
75
hta6b4f8392016-03-10 00:24:31 -080076namespace {
77
jiayl@webrtc.org61e00b02015-03-04 22:17:38 +000078static const int kMaxWaitMs = 10000;
pbos@webrtc.org044bdac2014-06-03 09:40:01 +000079// Disable for TSan v2, see
80// https://code.google.com/p/webrtc/issues/detail?id=1205 for details.
81// This declaration is also #ifdef'd as it causes uninitialized-variable
82// warnings.
83#if !defined(THREAD_SANITIZER)
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084static const int kMaxWaitForStatsMs = 3000;
pbos@webrtc.org044bdac2014-06-03 09:40:01 +000085#endif
deadbeeffac06552015-11-25 11:26:01 -080086static const int kMaxWaitForActivationMs = 5000;
buildbot@webrtc.org3e01e0b2014-05-13 17:54:10 +000087static const int kMaxWaitForFramesMs = 10000;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088static const int kEndAudioFrameCount = 3;
89static const int kEndVideoFrameCount = 3;
90
91static const char kStreamLabelBase[] = "stream_label";
92static const char kVideoTrackLabelBase[] = "video_track";
93static const char kAudioTrackLabelBase[] = "audio_track";
94static const char kDataChannelLabel[] = "data_channel";
95
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30 +000096// Disable for TSan v2, see
97// https://code.google.com/p/webrtc/issues/detail?id=1205 for details.
98// This declaration is also #ifdef'd as it causes unused-variable errors.
99#if !defined(THREAD_SANITIZER)
100// SRTP cipher name negotiated by the tests. This must be updated if the
101// default changes.
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -0800102static const int kDefaultSrtpCryptoSuite = rtc::SRTP_AES128_CM_SHA1_32;
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30 +0000103#endif
104
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000105static void RemoveLinesFromSdp(const std::string& line_start,
106 std::string* sdp) {
107 const char kSdpLineEnd[] = "\r\n";
108 size_t ssrc_pos = 0;
109 while ((ssrc_pos = sdp->find(line_start, ssrc_pos)) !=
110 std::string::npos) {
111 size_t end_ssrc = sdp->find(kSdpLineEnd, ssrc_pos);
112 sdp->erase(ssrc_pos, end_ssrc - ssrc_pos + strlen(kSdpLineEnd));
113 }
114}
115
hta6b4f8392016-03-10 00:24:31 -0800116bool StreamsHaveAudioTrack(StreamCollectionInterface* streams) {
117 for (size_t idx = 0; idx < streams->count(); idx++) {
118 auto stream = streams->at(idx);
119 if (stream->GetAudioTracks().size() > 0) {
120 return true;
121 }
122 }
123 return false;
124}
125
126bool StreamsHaveVideoTrack(StreamCollectionInterface* streams) {
127 for (size_t idx = 0; idx < streams->count(); idx++) {
128 auto stream = streams->at(idx);
129 if (stream->GetVideoTracks().size() > 0) {
130 return true;
131 }
132 }
133 return false;
134}
135
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000136class SignalingMessageReceiver {
137 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000138 virtual void ReceiveSdpMessage(const std::string& type,
139 std::string& msg) = 0;
140 virtual void ReceiveIceMessage(const std::string& sdp_mid,
141 int sdp_mline_index,
142 const std::string& msg) = 0;
143
144 protected:
deadbeefaf1b59c2015-10-15 12:08:41 -0700145 SignalingMessageReceiver() {}
146 virtual ~SignalingMessageReceiver() {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000147};
148
deadbeefaf1b59c2015-10-15 12:08:41 -0700149class PeerConnectionTestClient : public webrtc::PeerConnectionObserver,
deadbeeffaac4972015-11-12 15:33:07 -0800150 public SignalingMessageReceiver,
151 public ObserverInterface {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000152 public:
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -0800153 static PeerConnectionTestClient* CreateClientWithDtlsIdentityStore(
Guo-wei Shieh9c38c2d2015-12-05 09:46:07 -0800154 const std::string& id,
155 const MediaConstraintsInterface* constraints,
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -0800156 const PeerConnectionFactory::Options* options,
Henrik Boströmd79599d2016-06-01 13:58:50 +0200157 std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
perkj8aba9972016-04-10 23:54:34 -0700158 bool prefer_constraint_apis,
danilchape9021a32016-05-17 01:52:02 -0700159 rtc::Thread* network_thread,
perkj8aba9972016-04-10 23:54:34 -0700160 rtc::Thread* worker_thread) {
Guo-wei Shieh86aaa4b2015-12-05 09:55:44 -0800161 PeerConnectionTestClient* client(new PeerConnectionTestClient(id));
Henrik Boströmd79599d2016-06-01 13:58:50 +0200162 if (!client->Init(constraints, options, std::move(cert_generator),
danilchape9021a32016-05-17 01:52:02 -0700163 prefer_constraint_apis, network_thread, worker_thread)) {
Guo-wei Shieh86aaa4b2015-12-05 09:55:44 -0800164 delete client;
165 return nullptr;
166 }
167 return client;
Guo-wei Shieh9c38c2d2015-12-05 09:46:07 -0800168 }
169
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -0800170 static PeerConnectionTestClient* CreateClient(
171 const std::string& id,
172 const MediaConstraintsInterface* constraints,
perkj8aba9972016-04-10 23:54:34 -0700173 const PeerConnectionFactory::Options* options,
danilchape9021a32016-05-17 01:52:02 -0700174 rtc::Thread* network_thread,
perkj8aba9972016-04-10 23:54:34 -0700175 rtc::Thread* worker_thread) {
Henrik Boströmd79599d2016-06-01 13:58:50 +0200176 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
177 rtc::SSLStreamAdapter::HaveDtlsSrtp() ?
178 new FakeRTCCertificateGenerator() : nullptr);
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -0800179
danilchape9021a32016-05-17 01:52:02 -0700180 return CreateClientWithDtlsIdentityStore(
Henrik Boströmd79599d2016-06-01 13:58:50 +0200181 id, constraints, options, std::move(cert_generator), true,
danilchape9021a32016-05-17 01:52:02 -0700182 network_thread, worker_thread);
htaaac2dea2016-03-10 13:35:55 -0800183 }
184
185 static PeerConnectionTestClient* CreateClientPreferNoConstraints(
186 const std::string& id,
perkj8aba9972016-04-10 23:54:34 -0700187 const PeerConnectionFactory::Options* options,
danilchape9021a32016-05-17 01:52:02 -0700188 rtc::Thread* network_thread,
perkj8aba9972016-04-10 23:54:34 -0700189 rtc::Thread* worker_thread) {
Henrik Boströmd79599d2016-06-01 13:58:50 +0200190 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
191 rtc::SSLStreamAdapter::HaveDtlsSrtp() ?
192 new FakeRTCCertificateGenerator() : nullptr);
htaaac2dea2016-03-10 13:35:55 -0800193
danilchape9021a32016-05-17 01:52:02 -0700194 return CreateClientWithDtlsIdentityStore(
Henrik Boströmd79599d2016-06-01 13:58:50 +0200195 id, nullptr, options, std::move(cert_generator), false,
danilchape9021a32016-05-17 01:52:02 -0700196 network_thread, worker_thread);
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -0800197 }
198
deadbeefaf1b59c2015-10-15 12:08:41 -0700199 ~PeerConnectionTestClient() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000200 }
201
deadbeefaf1b59c2015-10-15 12:08:41 -0700202 void Negotiate() { Negotiate(true, true); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000203
deadbeefaf1b59c2015-10-15 12:08:41 -0700204 void Negotiate(bool audio, bool video) {
kwibergd1fe2812016-04-27 06:47:29 -0700205 std::unique_ptr<SessionDescriptionInterface> offer;
kwiberg2bbff992016-03-16 11:03:04 -0700206 ASSERT_TRUE(DoCreateOffer(&offer));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000207
deadbeefaf1b59c2015-10-15 12:08:41 -0700208 if (offer->description()->GetContentByName("audio")) {
209 offer->description()->GetContentByName("audio")->rejected = !audio;
210 }
211 if (offer->description()->GetContentByName("video")) {
212 offer->description()->GetContentByName("video")->rejected = !video;
213 }
214
215 std::string sdp;
216 EXPECT_TRUE(offer->ToString(&sdp));
217 EXPECT_TRUE(DoSetLocalDescription(offer.release()));
218 signaling_message_receiver_->ReceiveSdpMessage(
219 webrtc::SessionDescriptionInterface::kOffer, sdp);
220 }
221
222 // SignalingMessageReceiver callback.
223 void ReceiveSdpMessage(const std::string& type, std::string& msg) override {
224 FilterIncomingSdpMessage(&msg);
225 if (type == webrtc::SessionDescriptionInterface::kOffer) {
226 HandleIncomingOffer(msg);
227 } else {
228 HandleIncomingAnswer(msg);
229 }
230 }
231
232 // SignalingMessageReceiver callback.
233 void ReceiveIceMessage(const std::string& sdp_mid,
234 int sdp_mline_index,
235 const std::string& msg) override {
236 LOG(INFO) << id_ << "ReceiveIceMessage";
kwibergd1fe2812016-04-27 06:47:29 -0700237 std::unique_ptr<webrtc::IceCandidateInterface> candidate(
deadbeefaf1b59c2015-10-15 12:08:41 -0700238 webrtc::CreateIceCandidate(sdp_mid, sdp_mline_index, msg, nullptr));
239 EXPECT_TRUE(pc()->AddIceCandidate(candidate.get()));
240 }
241
242 // PeerConnectionObserver callbacks.
243 void OnSignalingChange(
244 webrtc::PeerConnectionInterface::SignalingState new_state) override {
245 EXPECT_EQ(pc()->signaling_state(), new_state);
246 }
Taylor Brandstetter98cde262016-05-31 13:02:21 -0700247 void OnAddStream(
248 rtc::scoped_refptr<MediaStreamInterface> media_stream) override {
deadbeeffaac4972015-11-12 15:33:07 -0800249 media_stream->RegisterObserver(this);
deadbeefaf1b59c2015-10-15 12:08:41 -0700250 for (size_t i = 0; i < media_stream->GetVideoTracks().size(); ++i) {
251 const std::string id = media_stream->GetVideoTracks()[i]->id();
252 ASSERT_TRUE(fake_video_renderers_.find(id) ==
253 fake_video_renderers_.end());
deadbeefc9be0072015-12-14 18:27:57 -0800254 fake_video_renderers_[id].reset(new webrtc::FakeVideoTrackRenderer(
255 media_stream->GetVideoTracks()[i]));
deadbeefaf1b59c2015-10-15 12:08:41 -0700256 }
257 }
Taylor Brandstetter98cde262016-05-31 13:02:21 -0700258 void OnRemoveStream(
259 rtc::scoped_refptr<MediaStreamInterface> media_stream) override {}
deadbeefaf1b59c2015-10-15 12:08:41 -0700260 void OnRenegotiationNeeded() override {}
261 void OnIceConnectionChange(
262 webrtc::PeerConnectionInterface::IceConnectionState new_state) override {
263 EXPECT_EQ(pc()->ice_connection_state(), new_state);
264 }
265 void OnIceGatheringChange(
266 webrtc::PeerConnectionInterface::IceGatheringState new_state) override {
267 EXPECT_EQ(pc()->ice_gathering_state(), new_state);
268 }
269 void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override {
270 LOG(INFO) << id_ << "OnIceCandidate";
271
272 std::string ice_sdp;
273 EXPECT_TRUE(candidate->ToString(&ice_sdp));
274 if (signaling_message_receiver_ == nullptr) {
275 // Remote party may be deleted.
276 return;
277 }
278 signaling_message_receiver_->ReceiveIceMessage(
279 candidate->sdp_mid(), candidate->sdp_mline_index(), ice_sdp);
280 }
281
deadbeeffaac4972015-11-12 15:33:07 -0800282 // MediaStreamInterface callback
283 void OnChanged() override {
284 // Track added or removed from MediaStream, so update our renderers.
285 rtc::scoped_refptr<StreamCollectionInterface> remote_streams =
286 pc()->remote_streams();
287 // Remove renderers for tracks that were removed.
288 for (auto it = fake_video_renderers_.begin();
289 it != fake_video_renderers_.end();) {
290 if (remote_streams->FindVideoTrack(it->first) == nullptr) {
deadbeefc9be0072015-12-14 18:27:57 -0800291 auto to_remove = it++;
292 removed_fake_video_renderers_.push_back(std::move(to_remove->second));
293 fake_video_renderers_.erase(to_remove);
deadbeeffaac4972015-11-12 15:33:07 -0800294 } else {
295 ++it;
296 }
297 }
298 // Create renderers for new video tracks.
299 for (size_t stream_index = 0; stream_index < remote_streams->count();
300 ++stream_index) {
301 MediaStreamInterface* remote_stream = remote_streams->at(stream_index);
302 for (size_t track_index = 0;
303 track_index < remote_stream->GetVideoTracks().size();
304 ++track_index) {
305 const std::string id =
306 remote_stream->GetVideoTracks()[track_index]->id();
307 if (fake_video_renderers_.find(id) != fake_video_renderers_.end()) {
308 continue;
309 }
deadbeefc9be0072015-12-14 18:27:57 -0800310 fake_video_renderers_[id].reset(new webrtc::FakeVideoTrackRenderer(
311 remote_stream->GetVideoTracks()[track_index]));
deadbeeffaac4972015-11-12 15:33:07 -0800312 }
313 }
314 }
315
deadbeefaf1b59c2015-10-15 12:08:41 -0700316 void SetVideoConstraints(const webrtc::FakeConstraints& video_constraint) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000317 video_constraints_ = video_constraint;
318 }
319
320 void AddMediaStream(bool audio, bool video) {
deadbeefaf1b59c2015-10-15 12:08:41 -0700321 std::string stream_label =
322 kStreamLabelBase +
323 rtc::ToString<int>(static_cast<int>(pc()->local_streams()->count()));
deadbeeffaac4972015-11-12 15:33:07 -0800324 rtc::scoped_refptr<MediaStreamInterface> stream =
buildbot@webrtc.orgb4c7b092014-08-25 12:11:58 +0000325 peer_connection_factory_->CreateLocalMediaStream(stream_label);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000326
327 if (audio && can_receive_audio()) {
deadbeeffac06552015-11-25 11:26:01 -0800328 stream->AddTrack(CreateLocalAudioTrack(stream_label));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000329 }
330 if (video && can_receive_video()) {
buildbot@webrtc.orgb4c7b092014-08-25 12:11:58 +0000331 stream->AddTrack(CreateLocalVideoTrack(stream_label));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000332 }
333
deadbeefaf1b59c2015-10-15 12:08:41 -0700334 EXPECT_TRUE(pc()->AddStream(stream));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000335 }
336
deadbeefaf1b59c2015-10-15 12:08:41 -0700337 size_t NumberOfLocalMediaStreams() { return pc()->local_streams()->count(); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000338
339 bool SessionActive() {
deadbeefaf1b59c2015-10-15 12:08:41 -0700340 return pc()->signaling_state() == webrtc::PeerConnectionInterface::kStable;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000341 }
342
deadbeeffaac4972015-11-12 15:33:07 -0800343 // Automatically add a stream when receiving an offer, if we don't have one.
344 // Defaults to true.
345 void set_auto_add_stream(bool auto_add_stream) {
346 auto_add_stream_ = auto_add_stream;
347 }
348
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000349 void set_signaling_message_receiver(
deadbeefaf1b59c2015-10-15 12:08:41 -0700350 SignalingMessageReceiver* signaling_message_receiver) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000351 signaling_message_receiver_ = signaling_message_receiver;
352 }
353
354 void EnableVideoDecoderFactory() {
355 video_decoder_factory_enabled_ = true;
356 fake_video_decoder_factory_->AddSupportedVideoCodecType(
357 webrtc::kVideoCodecVP8);
358 }
359
deadbeefaf1b59c2015-10-15 12:08:41 -0700360 void IceRestart() {
htaaac2dea2016-03-10 13:35:55 -0800361 offer_answer_constraints_.SetMandatoryIceRestart(true);
362 offer_answer_options_.ice_restart = true;
deadbeefaf1b59c2015-10-15 12:08:41 -0700363 SetExpectIceRestart(true);
364 }
365
366 void SetExpectIceRestart(bool expect_restart) {
367 expect_ice_restart_ = expect_restart;
368 }
369
370 bool ExpectIceRestart() const { return expect_ice_restart_; }
371
372 void SetReceiveAudioVideo(bool audio, bool video) {
373 SetReceiveAudio(audio);
374 SetReceiveVideo(video);
375 ASSERT_EQ(audio, can_receive_audio());
376 ASSERT_EQ(video, can_receive_video());
377 }
378
379 void SetReceiveAudio(bool audio) {
380 if (audio && can_receive_audio())
381 return;
htaaac2dea2016-03-10 13:35:55 -0800382 offer_answer_constraints_.SetMandatoryReceiveAudio(audio);
383 offer_answer_options_.offer_to_receive_audio = audio ? 1 : 0;
deadbeefaf1b59c2015-10-15 12:08:41 -0700384 }
385
386 void SetReceiveVideo(bool video) {
387 if (video && can_receive_video())
388 return;
htaaac2dea2016-03-10 13:35:55 -0800389 offer_answer_constraints_.SetMandatoryReceiveVideo(video);
390 offer_answer_options_.offer_to_receive_video = video ? 1 : 0;
deadbeefaf1b59c2015-10-15 12:08:41 -0700391 }
392
393 void RemoveMsidFromReceivedSdp(bool remove) { remove_msid_ = remove; }
394
395 void RemoveSdesCryptoFromReceivedSdp(bool remove) { remove_sdes_ = remove; }
396
397 void RemoveBundleFromReceivedSdp(bool remove) { remove_bundle_ = remove; }
398
perkjcaafdba2016-03-20 07:34:29 -0700399 void RemoveCvoFromReceivedSdp(bool remove) { remove_cvo_ = remove; }
400
deadbeefaf1b59c2015-10-15 12:08:41 -0700401 bool can_receive_audio() {
402 bool value;
htaaac2dea2016-03-10 13:35:55 -0800403 if (prefer_constraint_apis_) {
404 if (webrtc::FindConstraint(
405 &offer_answer_constraints_,
406 MediaConstraintsInterface::kOfferToReceiveAudio, &value,
407 nullptr)) {
408 return value;
409 }
410 return true;
deadbeefaf1b59c2015-10-15 12:08:41 -0700411 }
htaaac2dea2016-03-10 13:35:55 -0800412 return offer_answer_options_.offer_to_receive_audio > 0 ||
413 offer_answer_options_.offer_to_receive_audio ==
414 PeerConnectionInterface::RTCOfferAnswerOptions::kUndefined;
deadbeefaf1b59c2015-10-15 12:08:41 -0700415 }
416
417 bool can_receive_video() {
418 bool value;
htaaac2dea2016-03-10 13:35:55 -0800419 if (prefer_constraint_apis_) {
420 if (webrtc::FindConstraint(
421 &offer_answer_constraints_,
422 MediaConstraintsInterface::kOfferToReceiveVideo, &value,
423 nullptr)) {
424 return value;
425 }
426 return true;
deadbeefaf1b59c2015-10-15 12:08:41 -0700427 }
htaaac2dea2016-03-10 13:35:55 -0800428 return offer_answer_options_.offer_to_receive_video > 0 ||
429 offer_answer_options_.offer_to_receive_video ==
430 PeerConnectionInterface::RTCOfferAnswerOptions::kUndefined;
deadbeefaf1b59c2015-10-15 12:08:41 -0700431 }
432
Taylor Brandstetter98cde262016-05-31 13:02:21 -0700433 void OnDataChannel(
434 rtc::scoped_refptr<DataChannelInterface> data_channel) override {
deadbeefaf1b59c2015-10-15 12:08:41 -0700435 LOG(INFO) << id_ << "OnDataChannel";
436 data_channel_ = data_channel;
437 data_observer_.reset(new MockDataChannelObserver(data_channel));
438 }
439
440 void CreateDataChannel() {
441 data_channel_ = pc()->CreateDataChannel(kDataChannelLabel, nullptr);
442 ASSERT_TRUE(data_channel_.get() != nullptr);
443 data_observer_.reset(new MockDataChannelObserver(data_channel_));
444 }
445
deadbeeffac06552015-11-25 11:26:01 -0800446 rtc::scoped_refptr<webrtc::AudioTrackInterface> CreateLocalAudioTrack(
447 const std::string& stream_label) {
448 FakeConstraints constraints;
449 // Disable highpass filter so that we can get all the test audio frames.
450 constraints.AddMandatory(MediaConstraintsInterface::kHighpassFilter, false);
451 rtc::scoped_refptr<webrtc::AudioSourceInterface> source =
452 peer_connection_factory_->CreateAudioSource(&constraints);
453 // TODO(perkj): Test audio source when it is implemented. Currently audio
454 // always use the default input.
455 std::string label = stream_label + kAudioTrackLabelBase;
456 return peer_connection_factory_->CreateAudioTrack(label, source);
457 }
458
459 rtc::scoped_refptr<webrtc::VideoTrackInterface> CreateLocalVideoTrack(
460 const std::string& stream_label) {
461 // Set max frame rate to 10fps to reduce the risk of the tests to be flaky.
462 FakeConstraints source_constraints = video_constraints_;
463 source_constraints.SetMandatoryMaxFrameRate(10);
464
465 cricket::FakeVideoCapturer* fake_capturer =
466 new webrtc::FakePeriodicVideoCapturer();
perkjcaafdba2016-03-20 07:34:29 -0700467 fake_capturer->SetRotation(capture_rotation_);
deadbeeffac06552015-11-25 11:26:01 -0800468 video_capturers_.push_back(fake_capturer);
perkja3ede6c2016-03-08 01:27:48 +0100469 rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> source =
deadbeeffac06552015-11-25 11:26:01 -0800470 peer_connection_factory_->CreateVideoSource(fake_capturer,
471 &source_constraints);
472 std::string label = stream_label + kVideoTrackLabelBase;
perkjcaafdba2016-03-20 07:34:29 -0700473
474 rtc::scoped_refptr<webrtc::VideoTrackInterface> track(
475 peer_connection_factory_->CreateVideoTrack(label, source));
476 if (!local_video_renderer_) {
477 local_video_renderer_.reset(new webrtc::FakeVideoTrackRenderer(track));
478 }
479 return track;
deadbeeffac06552015-11-25 11:26:01 -0800480 }
481
deadbeefaf1b59c2015-10-15 12:08:41 -0700482 DataChannelInterface* data_channel() { return data_channel_; }
483 const MockDataChannelObserver* data_observer() const {
484 return data_observer_.get();
485 }
486
hta6b4f8392016-03-10 00:24:31 -0800487 webrtc::PeerConnectionInterface* pc() const { return peer_connection_.get(); }
deadbeefaf1b59c2015-10-15 12:08:41 -0700488
489 void StopVideoCapturers() {
perkjcaafdba2016-03-20 07:34:29 -0700490 for (auto* capturer : video_capturers_) {
491 capturer->Stop();
deadbeefaf1b59c2015-10-15 12:08:41 -0700492 }
493 }
494
perkjcaafdba2016-03-20 07:34:29 -0700495 void SetCaptureRotation(webrtc::VideoRotation rotation) {
496 ASSERT_TRUE(video_capturers_.empty());
497 capture_rotation_ = rotation;
498 }
499
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000500 bool AudioFramesReceivedCheck(int number_of_frames) const {
501 return number_of_frames <= fake_audio_capture_module_->frames_received();
502 }
503
deadbeefc9be0072015-12-14 18:27:57 -0800504 int audio_frames_received() const {
505 return fake_audio_capture_module_->frames_received();
506 }
507
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000508 bool VideoFramesReceivedCheck(int number_of_frames) {
509 if (video_decoder_factory_enabled_) {
510 const std::vector<FakeWebRtcVideoDecoder*>& decoders
511 = fake_video_decoder_factory_->decoders();
512 if (decoders.empty()) {
513 return number_of_frames <= 0;
514 }
hta6b4f8392016-03-10 00:24:31 -0800515 // Note - this checks that EACH decoder has the requisite number
516 // of frames. The video_frames_received() function sums them.
deadbeefc9be0072015-12-14 18:27:57 -0800517 for (FakeWebRtcVideoDecoder* decoder : decoders) {
518 if (number_of_frames > decoder->GetNumFramesReceived()) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000519 return false;
520 }
521 }
522 return true;
523 } else {
524 if (fake_video_renderers_.empty()) {
525 return number_of_frames <= 0;
526 }
527
deadbeefc9be0072015-12-14 18:27:57 -0800528 for (const auto& pair : fake_video_renderers_) {
529 if (number_of_frames > pair.second->num_rendered_frames()) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000530 return false;
531 }
532 }
533 return true;
534 }
535 }
deadbeefaf1b59c2015-10-15 12:08:41 -0700536
deadbeefc9be0072015-12-14 18:27:57 -0800537 int video_frames_received() const {
538 int total = 0;
539 if (video_decoder_factory_enabled_) {
540 const std::vector<FakeWebRtcVideoDecoder*>& decoders =
541 fake_video_decoder_factory_->decoders();
542 for (const FakeWebRtcVideoDecoder* decoder : decoders) {
543 total += decoder->GetNumFramesReceived();
544 }
545 } else {
546 for (const auto& pair : fake_video_renderers_) {
547 total += pair.second->num_rendered_frames();
548 }
549 for (const auto& renderer : removed_fake_video_renderers_) {
550 total += renderer->num_rendered_frames();
551 }
552 }
553 return total;
554 }
555
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000556 // Verify the CreateDtmfSender interface
557 void VerifyDtmf() {
kwibergd1fe2812016-04-27 06:47:29 -0700558 std::unique_ptr<DummyDtmfObserver> observer(new DummyDtmfObserver());
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000559 rtc::scoped_refptr<DtmfSenderInterface> dtmf_sender;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000560
561 // We can't create a DTMF sender with an invalid audio track or a non local
562 // track.
deadbeefaf1b59c2015-10-15 12:08:41 -0700563 EXPECT_TRUE(peer_connection_->CreateDtmfSender(nullptr) == nullptr);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000564 rtc::scoped_refptr<webrtc::AudioTrackInterface> non_localtrack(
deadbeefaf1b59c2015-10-15 12:08:41 -0700565 peer_connection_factory_->CreateAudioTrack("dummy_track", nullptr));
566 EXPECT_TRUE(peer_connection_->CreateDtmfSender(non_localtrack) == nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000567
568 // We should be able to create a DTMF sender from a local track.
569 webrtc::AudioTrackInterface* localtrack =
570 peer_connection_->local_streams()->at(0)->GetAudioTracks()[0];
571 dtmf_sender = peer_connection_->CreateDtmfSender(localtrack);
deadbeefaf1b59c2015-10-15 12:08:41 -0700572 EXPECT_TRUE(dtmf_sender.get() != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000573 dtmf_sender->RegisterObserver(observer.get());
574
575 // Test the DtmfSender object just created.
576 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
577 EXPECT_TRUE(dtmf_sender->InsertDtmf("1a", 100, 50));
578
579 // We don't need to verify that the DTMF tones are actually sent out because
580 // that is already covered by the tests of the lower level components.
581
582 EXPECT_TRUE_WAIT(observer->completed(), kMaxWaitMs);
583 std::vector<std::string> tones;
584 tones.push_back("1");
585 tones.push_back("a");
586 tones.push_back("");
587 observer->Verify(tones);
588
589 dtmf_sender->UnregisterObserver();
590 }
591
592 // Verifies that the SessionDescription have rejected the appropriate media
593 // content.
594 void VerifyRejectedMediaInSessionDescription() {
deadbeefaf1b59c2015-10-15 12:08:41 -0700595 ASSERT_TRUE(peer_connection_->remote_description() != nullptr);
596 ASSERT_TRUE(peer_connection_->local_description() != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000597 const cricket::SessionDescription* remote_desc =
598 peer_connection_->remote_description()->description();
599 const cricket::SessionDescription* local_desc =
600 peer_connection_->local_description()->description();
601
602 const ContentInfo* remote_audio_content = GetFirstAudioContent(remote_desc);
603 if (remote_audio_content) {
604 const ContentInfo* audio_content =
605 GetFirstAudioContent(local_desc);
606 EXPECT_EQ(can_receive_audio(), !audio_content->rejected);
607 }
608
609 const ContentInfo* remote_video_content = GetFirstVideoContent(remote_desc);
610 if (remote_video_content) {
611 const ContentInfo* video_content =
612 GetFirstVideoContent(local_desc);
613 EXPECT_EQ(can_receive_video(), !video_content->rejected);
614 }
615 }
616
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000617 void VerifyLocalIceUfragAndPassword() {
deadbeefaf1b59c2015-10-15 12:08:41 -0700618 ASSERT_TRUE(peer_connection_->local_description() != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000619 const cricket::SessionDescription* desc =
620 peer_connection_->local_description()->description();
621 const cricket::ContentInfos& contents = desc->contents();
622
623 for (size_t index = 0; index < contents.size(); ++index) {
624 if (contents[index].rejected)
625 continue;
626 const cricket::TransportDescription* transport_desc =
627 desc->GetTransportDescriptionByName(contents[index].name);
628
629 std::map<int, IceUfragPwdPair>::const_iterator ufragpair_it =
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000630 ice_ufrag_pwd_.find(static_cast<int>(index));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000631 if (ufragpair_it == ice_ufrag_pwd_.end()) {
632 ASSERT_FALSE(ExpectIceRestart());
henrike@webrtc.org28654cb2013-07-22 21:07:49 +0000633 ice_ufrag_pwd_[static_cast<int>(index)] =
634 IceUfragPwdPair(transport_desc->ice_ufrag, transport_desc->ice_pwd);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000635 } else if (ExpectIceRestart()) {
636 const IceUfragPwdPair& ufrag_pwd = ufragpair_it->second;
637 EXPECT_NE(ufrag_pwd.first, transport_desc->ice_ufrag);
638 EXPECT_NE(ufrag_pwd.second, transport_desc->ice_pwd);
639 } else {
640 const IceUfragPwdPair& ufrag_pwd = ufragpair_it->second;
641 EXPECT_EQ(ufrag_pwd.first, transport_desc->ice_ufrag);
642 EXPECT_EQ(ufrag_pwd.second, transport_desc->ice_pwd);
643 }
644 }
645 }
646
647 int GetAudioOutputLevelStats(webrtc::MediaStreamTrackInterface* track) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000648 rtc::scoped_refptr<MockStatsObserver>
649 observer(new rtc::RefCountedObject<MockStatsObserver>());
jiayl@webrtc.orgdb41b4d2014-03-03 21:30:06 +0000650 EXPECT_TRUE(peer_connection_->GetStats(
651 observer, track, PeerConnectionInterface::kStatsOutputLevelStandard));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000652 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs);
jbauchbe24c942015-06-22 15:06:43 -0700653 EXPECT_NE(0, observer->timestamp());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000654 return observer->AudioOutputLevel();
655 }
656
657 int GetAudioInputLevelStats() {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000658 rtc::scoped_refptr<MockStatsObserver>
659 observer(new rtc::RefCountedObject<MockStatsObserver>());
jiayl@webrtc.orgdb41b4d2014-03-03 21:30:06 +0000660 EXPECT_TRUE(peer_connection_->GetStats(
deadbeefaf1b59c2015-10-15 12:08:41 -0700661 observer, nullptr, PeerConnectionInterface::kStatsOutputLevelStandard));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000662 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs);
jbauchbe24c942015-06-22 15:06:43 -0700663 EXPECT_NE(0, observer->timestamp());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000664 return observer->AudioInputLevel();
665 }
666
667 int GetBytesReceivedStats(webrtc::MediaStreamTrackInterface* track) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000668 rtc::scoped_refptr<MockStatsObserver>
669 observer(new rtc::RefCountedObject<MockStatsObserver>());
jiayl@webrtc.orgdb41b4d2014-03-03 21:30:06 +0000670 EXPECT_TRUE(peer_connection_->GetStats(
671 observer, track, PeerConnectionInterface::kStatsOutputLevelStandard));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000672 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs);
jbauchbe24c942015-06-22 15:06:43 -0700673 EXPECT_NE(0, observer->timestamp());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000674 return observer->BytesReceived();
675 }
676
677 int GetBytesSentStats(webrtc::MediaStreamTrackInterface* track) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000678 rtc::scoped_refptr<MockStatsObserver>
679 observer(new rtc::RefCountedObject<MockStatsObserver>());
jiayl@webrtc.orgdb41b4d2014-03-03 21:30:06 +0000680 EXPECT_TRUE(peer_connection_->GetStats(
681 observer, track, PeerConnectionInterface::kStatsOutputLevelStandard));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000682 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs);
jbauchbe24c942015-06-22 15:06:43 -0700683 EXPECT_NE(0, observer->timestamp());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000684 return observer->BytesSent();
685 }
686
buildbot@webrtc.orgb4c7b092014-08-25 12:11:58 +0000687 int GetAvailableReceivedBandwidthStats() {
688 rtc::scoped_refptr<MockStatsObserver>
689 observer(new rtc::RefCountedObject<MockStatsObserver>());
690 EXPECT_TRUE(peer_connection_->GetStats(
deadbeefaf1b59c2015-10-15 12:08:41 -0700691 observer, nullptr, PeerConnectionInterface::kStatsOutputLevelStandard));
buildbot@webrtc.orgb4c7b092014-08-25 12:11:58 +0000692 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs);
jbauchbe24c942015-06-22 15:06:43 -0700693 EXPECT_NE(0, observer->timestamp());
buildbot@webrtc.orgb4c7b092014-08-25 12:11:58 +0000694 int bw = observer->AvailableReceiveBandwidth();
buildbot@webrtc.orgb4c7b092014-08-25 12:11:58 +0000695 return bw;
696 }
697
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30 +0000698 std::string GetDtlsCipherStats() {
699 rtc::scoped_refptr<MockStatsObserver>
700 observer(new rtc::RefCountedObject<MockStatsObserver>());
701 EXPECT_TRUE(peer_connection_->GetStats(
deadbeefaf1b59c2015-10-15 12:08:41 -0700702 observer, nullptr, PeerConnectionInterface::kStatsOutputLevelStandard));
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30 +0000703 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs);
jbauchbe24c942015-06-22 15:06:43 -0700704 EXPECT_NE(0, observer->timestamp());
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30 +0000705 return observer->DtlsCipher();
706 }
707
708 std::string GetSrtpCipherStats() {
709 rtc::scoped_refptr<MockStatsObserver>
710 observer(new rtc::RefCountedObject<MockStatsObserver>());
711 EXPECT_TRUE(peer_connection_->GetStats(
deadbeefaf1b59c2015-10-15 12:08:41 -0700712 observer, nullptr, PeerConnectionInterface::kStatsOutputLevelStandard));
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30 +0000713 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs);
jbauchbe24c942015-06-22 15:06:43 -0700714 EXPECT_NE(0, observer->timestamp());
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30 +0000715 return observer->SrtpCipher();
716 }
717
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000718 int rendered_width() {
719 EXPECT_FALSE(fake_video_renderers_.empty());
720 return fake_video_renderers_.empty() ? 1 :
721 fake_video_renderers_.begin()->second->width();
722 }
723
724 int rendered_height() {
725 EXPECT_FALSE(fake_video_renderers_.empty());
726 return fake_video_renderers_.empty() ? 1 :
727 fake_video_renderers_.begin()->second->height();
728 }
729
perkjcaafdba2016-03-20 07:34:29 -0700730 webrtc::VideoRotation rendered_rotation() {
731 EXPECT_FALSE(fake_video_renderers_.empty());
732 return fake_video_renderers_.empty()
733 ? webrtc::kVideoRotation_0
734 : fake_video_renderers_.begin()->second->rotation();
735 }
736
737 int local_rendered_width() {
738 return local_video_renderer_ ? local_video_renderer_->width() : 1;
739 }
740
741 int local_rendered_height() {
742 return local_video_renderer_ ? local_video_renderer_->height() : 1;
743 }
744
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000745 size_t number_of_remote_streams() {
746 if (!pc())
747 return 0;
748 return pc()->remote_streams()->count();
749 }
750
hta6b4f8392016-03-10 00:24:31 -0800751 StreamCollectionInterface* remote_streams() const {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000752 if (!pc()) {
753 ADD_FAILURE();
deadbeefaf1b59c2015-10-15 12:08:41 -0700754 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000755 }
756 return pc()->remote_streams();
757 }
758
759 StreamCollectionInterface* local_streams() {
760 if (!pc()) {
761 ADD_FAILURE();
deadbeefaf1b59c2015-10-15 12:08:41 -0700762 return nullptr;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000763 }
764 return pc()->local_streams();
765 }
766
hta6b4f8392016-03-10 00:24:31 -0800767 bool HasLocalAudioTrack() { return StreamsHaveAudioTrack(local_streams()); }
768
769 bool HasLocalVideoTrack() { return StreamsHaveVideoTrack(local_streams()); }
770
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000771 webrtc::PeerConnectionInterface::SignalingState signaling_state() {
772 return pc()->signaling_state();
773 }
774
775 webrtc::PeerConnectionInterface::IceConnectionState ice_connection_state() {
776 return pc()->ice_connection_state();
777 }
778
779 webrtc::PeerConnectionInterface::IceGatheringState ice_gathering_state() {
780 return pc()->ice_gathering_state();
781 }
782
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000783 private:
784 class DummyDtmfObserver : public DtmfSenderObserverInterface {
785 public:
786 DummyDtmfObserver() : completed_(false) {}
787
788 // Implements DtmfSenderObserverInterface.
deadbeefaf1b59c2015-10-15 12:08:41 -0700789 void OnToneChange(const std::string& tone) override {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000790 tones_.push_back(tone);
791 if (tone.empty()) {
792 completed_ = true;
793 }
794 }
795
796 void Verify(const std::vector<std::string>& tones) const {
797 ASSERT_TRUE(tones_.size() == tones.size());
798 EXPECT_TRUE(std::equal(tones.begin(), tones.end(), tones_.begin()));
799 }
800
801 bool completed() const { return completed_; }
802
803 private:
804 bool completed_;
805 std::vector<std::string> tones_;
806 };
807
deadbeefaf1b59c2015-10-15 12:08:41 -0700808 explicit PeerConnectionTestClient(const std::string& id) : id_(id) {}
809
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -0800810 bool Init(
811 const MediaConstraintsInterface* constraints,
812 const PeerConnectionFactory::Options* options,
Henrik Boströmd79599d2016-06-01 13:58:50 +0200813 std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
perkj8aba9972016-04-10 23:54:34 -0700814 bool prefer_constraint_apis,
danilchape9021a32016-05-17 01:52:02 -0700815 rtc::Thread* network_thread,
perkj8aba9972016-04-10 23:54:34 -0700816 rtc::Thread* worker_thread) {
deadbeefaf1b59c2015-10-15 12:08:41 -0700817 EXPECT_TRUE(!peer_connection_);
818 EXPECT_TRUE(!peer_connection_factory_);
htaaac2dea2016-03-10 13:35:55 -0800819 if (!prefer_constraint_apis) {
820 EXPECT_TRUE(!constraints);
821 }
822 prefer_constraint_apis_ = prefer_constraint_apis;
823
kwibergd1fe2812016-04-27 06:47:29 -0700824 std::unique_ptr<cricket::PortAllocator> port_allocator(
danilchape9021a32016-05-17 01:52:02 -0700825 new cricket::FakePortAllocator(network_thread, nullptr));
deadbeefaf1b59c2015-10-15 12:08:41 -0700826 fake_audio_capture_module_ = FakeAudioCaptureModule::Create();
827
828 if (fake_audio_capture_module_ == nullptr) {
829 return false;
830 }
831 fake_video_decoder_factory_ = new FakeWebRtcVideoDecoderFactory();
832 fake_video_encoder_factory_ = new FakeWebRtcVideoEncoderFactory();
danilchape9021a32016-05-17 01:52:02 -0700833 rtc::Thread* const signaling_thread = rtc::Thread::Current();
deadbeefaf1b59c2015-10-15 12:08:41 -0700834 peer_connection_factory_ = webrtc::CreatePeerConnectionFactory(
danilchape9021a32016-05-17 01:52:02 -0700835 network_thread, worker_thread, signaling_thread,
836 fake_audio_capture_module_, fake_video_encoder_factory_,
837 fake_video_decoder_factory_);
deadbeefaf1b59c2015-10-15 12:08:41 -0700838 if (!peer_connection_factory_) {
839 return false;
840 }
841 if (options) {
842 peer_connection_factory_->SetOptions(*options);
843 }
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -0800844 peer_connection_ = CreatePeerConnection(
Henrik Boströmd79599d2016-06-01 13:58:50 +0200845 std::move(port_allocator), constraints, std::move(cert_generator));
deadbeefaf1b59c2015-10-15 12:08:41 -0700846 return peer_connection_.get() != nullptr;
847 }
848
deadbeefaf1b59c2015-10-15 12:08:41 -0700849 rtc::scoped_refptr<webrtc::PeerConnectionInterface> CreatePeerConnection(
kwibergd1fe2812016-04-27 06:47:29 -0700850 std::unique_ptr<cricket::PortAllocator> port_allocator,
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -0800851 const MediaConstraintsInterface* constraints,
Henrik Boströmd79599d2016-06-01 13:58:50 +0200852 std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator) {
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800853 // CreatePeerConnection with RTCConfiguration.
854 webrtc::PeerConnectionInterface::RTCConfiguration config;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000855 webrtc::PeerConnectionInterface::IceServer ice_server;
856 ice_server.uri = "stun:stun.l.google.com:19302";
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800857 config.servers.push_back(ice_server);
jiayl@webrtc.orga576faf2014-01-29 17:45:53 +0000858
Henrik Boströmd79599d2016-06-01 13:58:50 +0200859 return peer_connection_factory_->CreatePeerConnection(
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -0800860 config, constraints, std::move(port_allocator),
Henrik Boströmd79599d2016-06-01 13:58:50 +0200861 std::move(cert_generator), this);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000862 }
863
864 void HandleIncomingOffer(const std::string& msg) {
deadbeefaf1b59c2015-10-15 12:08:41 -0700865 LOG(INFO) << id_ << "HandleIncomingOffer ";
deadbeeffaac4972015-11-12 15:33:07 -0800866 if (NumberOfLocalMediaStreams() == 0 && auto_add_stream_) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000867 // If we are not sending any streams ourselves it is time to add some.
868 AddMediaStream(true, true);
869 }
kwibergd1fe2812016-04-27 06:47:29 -0700870 std::unique_ptr<SessionDescriptionInterface> desc(
deadbeefaf1b59c2015-10-15 12:08:41 -0700871 webrtc::CreateSessionDescription("offer", msg, nullptr));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000872 EXPECT_TRUE(DoSetRemoteDescription(desc.release()));
kwibergd1fe2812016-04-27 06:47:29 -0700873 std::unique_ptr<SessionDescriptionInterface> answer;
kwiberg2bbff992016-03-16 11:03:04 -0700874 EXPECT_TRUE(DoCreateAnswer(&answer));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000875 std::string sdp;
876 EXPECT_TRUE(answer->ToString(&sdp));
877 EXPECT_TRUE(DoSetLocalDescription(answer.release()));
deadbeefaf1b59c2015-10-15 12:08:41 -0700878 if (signaling_message_receiver_) {
879 signaling_message_receiver_->ReceiveSdpMessage(
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000880 webrtc::SessionDescriptionInterface::kAnswer, sdp);
881 }
882 }
883
884 void HandleIncomingAnswer(const std::string& msg) {
deadbeefaf1b59c2015-10-15 12:08:41 -0700885 LOG(INFO) << id_ << "HandleIncomingAnswer";
kwibergd1fe2812016-04-27 06:47:29 -0700886 std::unique_ptr<SessionDescriptionInterface> desc(
deadbeefaf1b59c2015-10-15 12:08:41 -0700887 webrtc::CreateSessionDescription("answer", msg, nullptr));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000888 EXPECT_TRUE(DoSetRemoteDescription(desc.release()));
889 }
890
kwibergd1fe2812016-04-27 06:47:29 -0700891 bool DoCreateOfferAnswer(std::unique_ptr<SessionDescriptionInterface>* desc,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000892 bool offer) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000893 rtc::scoped_refptr<MockCreateSessionDescriptionObserver>
894 observer(new rtc::RefCountedObject<
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000895 MockCreateSessionDescriptionObserver>());
htaaac2dea2016-03-10 13:35:55 -0800896 if (prefer_constraint_apis_) {
897 if (offer) {
898 pc()->CreateOffer(observer, &offer_answer_constraints_);
899 } else {
900 pc()->CreateAnswer(observer, &offer_answer_constraints_);
901 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000902 } else {
htaaac2dea2016-03-10 13:35:55 -0800903 if (offer) {
904 pc()->CreateOffer(observer, offer_answer_options_);
905 } else {
906 pc()->CreateAnswer(observer, offer_answer_options_);
907 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000908 }
909 EXPECT_EQ_WAIT(true, observer->called(), kMaxWaitMs);
kwiberg2bbff992016-03-16 11:03:04 -0700910 desc->reset(observer->release_desc());
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000911 if (observer->result() && ExpectIceRestart()) {
912 EXPECT_EQ(0u, (*desc)->candidates(0)->count());
913 }
914 return observer->result();
915 }
916
kwibergd1fe2812016-04-27 06:47:29 -0700917 bool DoCreateOffer(std::unique_ptr<SessionDescriptionInterface>* desc) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000918 return DoCreateOfferAnswer(desc, true);
919 }
920
kwibergd1fe2812016-04-27 06:47:29 -0700921 bool DoCreateAnswer(std::unique_ptr<SessionDescriptionInterface>* desc) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000922 return DoCreateOfferAnswer(desc, false);
923 }
924
925 bool DoSetLocalDescription(SessionDescriptionInterface* desc) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000926 rtc::scoped_refptr<MockSetSessionDescriptionObserver>
927 observer(new rtc::RefCountedObject<
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000928 MockSetSessionDescriptionObserver>());
deadbeefaf1b59c2015-10-15 12:08:41 -0700929 LOG(INFO) << id_ << "SetLocalDescription ";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000930 pc()->SetLocalDescription(observer, desc);
931 // Ignore the observer result. If we wait for the result with
932 // EXPECT_TRUE_WAIT, local ice candidates might be sent to the remote peer
933 // before the offer which is an error.
934 // The reason is that EXPECT_TRUE_WAIT uses
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000935 // rtc::Thread::Current()->ProcessMessages(1);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000936 // ProcessMessages waits at least 1ms but processes all messages before
937 // returning. Since this test is synchronous and send messages to the remote
938 // peer whenever a callback is invoked, this can lead to messages being
939 // sent to the remote peer in the wrong order.
940 // TODO(perkj): Find a way to check the result without risking that the
941 // order of sent messages are changed. Ex- by posting all messages that are
942 // sent to the remote peer.
943 return true;
944 }
945
946 bool DoSetRemoteDescription(SessionDescriptionInterface* desc) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000947 rtc::scoped_refptr<MockSetSessionDescriptionObserver>
948 observer(new rtc::RefCountedObject<
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000949 MockSetSessionDescriptionObserver>());
deadbeefaf1b59c2015-10-15 12:08:41 -0700950 LOG(INFO) << id_ << "SetRemoteDescription ";
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000951 pc()->SetRemoteDescription(observer, desc);
952 EXPECT_TRUE_WAIT(observer->called(), kMaxWaitMs);
953 return observer->result();
954 }
955
956 // This modifies all received SDP messages before they are processed.
957 void FilterIncomingSdpMessage(std::string* sdp) {
958 if (remove_msid_) {
959 const char kSdpSsrcAttribute[] = "a=ssrc:";
960 RemoveLinesFromSdp(kSdpSsrcAttribute, sdp);
961 const char kSdpMsidSupportedAttribute[] = "a=msid-semantic:";
962 RemoveLinesFromSdp(kSdpMsidSupportedAttribute, sdp);
963 }
964 if (remove_bundle_) {
965 const char kSdpBundleAttribute[] = "a=group:BUNDLE";
966 RemoveLinesFromSdp(kSdpBundleAttribute, sdp);
967 }
968 if (remove_sdes_) {
969 const char kSdpSdesCryptoAttribute[] = "a=crypto";
970 RemoveLinesFromSdp(kSdpSdesCryptoAttribute, sdp);
971 }
perkjcaafdba2016-03-20 07:34:29 -0700972 if (remove_cvo_) {
973 const char kSdpCvoExtenstion[] = "urn:3gpp:video-orientation";
974 RemoveLinesFromSdp(kSdpCvoExtenstion, sdp);
975 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000976 }
977
deadbeefaf1b59c2015-10-15 12:08:41 -0700978 std::string id_;
979
deadbeefaf1b59c2015-10-15 12:08:41 -0700980 rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
981 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
982 peer_connection_factory_;
983
htaaac2dea2016-03-10 13:35:55 -0800984 bool prefer_constraint_apis_ = true;
deadbeeffaac4972015-11-12 15:33:07 -0800985 bool auto_add_stream_ = true;
986
deadbeefaf1b59c2015-10-15 12:08:41 -0700987 typedef std::pair<std::string, std::string> IceUfragPwdPair;
988 std::map<int, IceUfragPwdPair> ice_ufrag_pwd_;
989 bool expect_ice_restart_ = false;
990
deadbeefc9be0072015-12-14 18:27:57 -0800991 // Needed to keep track of number of frames sent.
deadbeefaf1b59c2015-10-15 12:08:41 -0700992 rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_;
993 // Needed to keep track of number of frames received.
kwibergd1fe2812016-04-27 06:47:29 -0700994 std::map<std::string, std::unique_ptr<webrtc::FakeVideoTrackRenderer>>
deadbeefc9be0072015-12-14 18:27:57 -0800995 fake_video_renderers_;
996 // Needed to ensure frames aren't received for removed tracks.
kwibergd1fe2812016-04-27 06:47:29 -0700997 std::vector<std::unique_ptr<webrtc::FakeVideoTrackRenderer>>
deadbeefc9be0072015-12-14 18:27:57 -0800998 removed_fake_video_renderers_;
deadbeefaf1b59c2015-10-15 12:08:41 -0700999 // Needed to keep track of number of frames received when external decoder
1000 // used.
1001 FakeWebRtcVideoDecoderFactory* fake_video_decoder_factory_ = nullptr;
1002 FakeWebRtcVideoEncoderFactory* fake_video_encoder_factory_ = nullptr;
1003 bool video_decoder_factory_enabled_ = false;
1004 webrtc::FakeConstraints video_constraints_;
1005
1006 // For remote peer communication.
1007 SignalingMessageReceiver* signaling_message_receiver_ = nullptr;
1008
1009 // Store references to the video capturers we've created, so that we can stop
1010 // them, if required.
perkjcaafdba2016-03-20 07:34:29 -07001011 std::vector<cricket::FakeVideoCapturer*> video_capturers_;
1012 webrtc::VideoRotation capture_rotation_ = webrtc::kVideoRotation_0;
1013 // |local_video_renderer_| attached to the first created local video track.
kwibergd1fe2812016-04-27 06:47:29 -07001014 std::unique_ptr<webrtc::FakeVideoTrackRenderer> local_video_renderer_;
deadbeefaf1b59c2015-10-15 12:08:41 -07001015
htaaac2dea2016-03-10 13:35:55 -08001016 webrtc::FakeConstraints offer_answer_constraints_;
1017 PeerConnectionInterface::RTCOfferAnswerOptions offer_answer_options_;
deadbeefaf1b59c2015-10-15 12:08:41 -07001018 bool remove_msid_ = false; // True if MSID should be removed in received SDP.
1019 bool remove_bundle_ =
1020 false; // True if bundle should be removed in received SDP.
1021 bool remove_sdes_ =
1022 false; // True if a=crypto should be removed in received SDP.
perkjcaafdba2016-03-20 07:34:29 -07001023 // |remove_cvo_| is true if extension urn:3gpp:video-orientation should be
1024 // removed in the received SDP.
1025 bool remove_cvo_ = false;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001026
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001027 rtc::scoped_refptr<DataChannelInterface> data_channel_;
kwibergd1fe2812016-04-27 06:47:29 -07001028 std::unique_ptr<MockDataChannelObserver> data_observer_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001029};
1030
deadbeef7c73bdb2015-12-10 15:10:44 -08001031class P2PTestConductor : public testing::Test {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001032 public:
deadbeef7c73bdb2015-12-10 15:10:44 -08001033 P2PTestConductor()
deadbeefeff5b852016-05-27 14:18:01 -07001034 : pss_(new rtc::PhysicalSocketServer),
pbos@webrtc.org9eacb8c2015-01-02 09:03:19 +00001035 ss_(new rtc::VirtualSocketServer(pss_.get())),
deadbeefeff5b852016-05-27 14:18:01 -07001036 network_thread_(new rtc::Thread(ss_.get())),
1037 worker_thread_(rtc::Thread::Create()) {
danilchape9021a32016-05-17 01:52:02 -07001038 RTC_CHECK(network_thread_->Start());
1039 RTC_CHECK(worker_thread_->Start());
perkj8aba9972016-04-10 23:54:34 -07001040 }
pbos@webrtc.org9eacb8c2015-01-02 09:03:19 +00001041
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001042 bool SessionActive() {
1043 return initiating_client_->SessionActive() &&
pbos@webrtc.org9eacb8c2015-01-02 09:03:19 +00001044 receiving_client_->SessionActive();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001045 }
pbos@webrtc.org9eacb8c2015-01-02 09:03:19 +00001046
hta6b4f8392016-03-10 00:24:31 -08001047 // Return true if the number of frames provided have been received
1048 // on the video and audio tracks provided.
1049 bool FramesHaveArrived(int audio_frames_to_receive,
1050 int video_frames_to_receive) {
1051 bool all_good = true;
1052 if (initiating_client_->HasLocalAudioTrack() &&
1053 receiving_client_->can_receive_audio()) {
1054 all_good &=
1055 receiving_client_->AudioFramesReceivedCheck(audio_frames_to_receive);
1056 }
1057 if (initiating_client_->HasLocalVideoTrack() &&
1058 receiving_client_->can_receive_video()) {
1059 all_good &=
1060 receiving_client_->VideoFramesReceivedCheck(video_frames_to_receive);
1061 }
1062 if (receiving_client_->HasLocalAudioTrack() &&
1063 initiating_client_->can_receive_audio()) {
1064 all_good &=
1065 initiating_client_->AudioFramesReceivedCheck(audio_frames_to_receive);
1066 }
1067 if (receiving_client_->HasLocalVideoTrack() &&
1068 initiating_client_->can_receive_video()) {
1069 all_good &=
1070 initiating_client_->VideoFramesReceivedCheck(video_frames_to_receive);
1071 }
1072 return all_good;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001073 }
hta6b4f8392016-03-10 00:24:31 -08001074
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001075 void VerifyDtmf() {
1076 initiating_client_->VerifyDtmf();
1077 receiving_client_->VerifyDtmf();
1078 }
1079
1080 void TestUpdateOfferWithRejectedContent() {
deadbeefc9be0072015-12-14 18:27:57 -08001081 // Renegotiate, rejecting the video m-line.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001082 initiating_client_->Negotiate(true, false);
deadbeefc9be0072015-12-14 18:27:57 -08001083 ASSERT_TRUE_WAIT(SessionActive(), kMaxWaitForActivationMs);
1084
1085 int pc1_audio_received = initiating_client_->audio_frames_received();
1086 int pc1_video_received = initiating_client_->video_frames_received();
1087 int pc2_audio_received = receiving_client_->audio_frames_received();
1088 int pc2_video_received = receiving_client_->video_frames_received();
1089
1090 // Wait for some additional audio frames to be received.
1091 EXPECT_TRUE_WAIT(initiating_client_->AudioFramesReceivedCheck(
1092 pc1_audio_received + kEndAudioFrameCount) &&
1093 receiving_client_->AudioFramesReceivedCheck(
1094 pc2_audio_received + kEndAudioFrameCount),
1095 kMaxWaitForFramesMs);
1096
1097 // During this time, we shouldn't have received any additional video frames
1098 // for the rejected video tracks.
1099 EXPECT_EQ(pc1_video_received, initiating_client_->video_frames_received());
1100 EXPECT_EQ(pc2_video_received, receiving_client_->video_frames_received());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001101 }
1102
1103 void VerifyRenderedSize(int width, int height) {
perkjcaafdba2016-03-20 07:34:29 -07001104 VerifyRenderedSize(width, height, webrtc::kVideoRotation_0);
1105 }
1106
1107 void VerifyRenderedSize(int width,
1108 int height,
1109 webrtc::VideoRotation rotation) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001110 EXPECT_EQ(width, receiving_client()->rendered_width());
1111 EXPECT_EQ(height, receiving_client()->rendered_height());
perkjcaafdba2016-03-20 07:34:29 -07001112 EXPECT_EQ(rotation, receiving_client()->rendered_rotation());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001113 EXPECT_EQ(width, initializing_client()->rendered_width());
1114 EXPECT_EQ(height, initializing_client()->rendered_height());
perkjcaafdba2016-03-20 07:34:29 -07001115 EXPECT_EQ(rotation, initializing_client()->rendered_rotation());
1116
1117 // Verify size of the local preview.
1118 EXPECT_EQ(width, initializing_client()->local_rendered_width());
1119 EXPECT_EQ(height, initializing_client()->local_rendered_height());
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001120 }
1121
1122 void VerifySessionDescriptions() {
1123 initiating_client_->VerifyRejectedMediaInSessionDescription();
1124 receiving_client_->VerifyRejectedMediaInSessionDescription();
1125 initiating_client_->VerifyLocalIceUfragAndPassword();
1126 receiving_client_->VerifyLocalIceUfragAndPassword();
1127 }
1128
deadbeef7c73bdb2015-12-10 15:10:44 -08001129 ~P2PTestConductor() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001130 if (initiating_client_) {
deadbeefaf1b59c2015-10-15 12:08:41 -07001131 initiating_client_->set_signaling_message_receiver(nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001132 }
1133 if (receiving_client_) {
deadbeefaf1b59c2015-10-15 12:08:41 -07001134 receiving_client_->set_signaling_message_receiver(nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001135 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001136 }
1137
deadbeefaf1b59c2015-10-15 12:08:41 -07001138 bool CreateTestClients() { return CreateTestClients(nullptr, nullptr); }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001139
1140 bool CreateTestClients(MediaConstraintsInterface* init_constraints,
1141 MediaConstraintsInterface* recv_constraints) {
deadbeefaf1b59c2015-10-15 12:08:41 -07001142 return CreateTestClients(init_constraints, nullptr, recv_constraints,
1143 nullptr);
Joachim Bauch04e5b492015-05-29 09:40:39 +02001144 }
1145
htaaac2dea2016-03-10 13:35:55 -08001146 bool CreateTestClientsThatPreferNoConstraints() {
1147 initiating_client_.reset(
perkj8aba9972016-04-10 23:54:34 -07001148 PeerConnectionTestClient::CreateClientPreferNoConstraints(
danilchape9021a32016-05-17 01:52:02 -07001149 "Caller: ", nullptr, network_thread_.get(), worker_thread_.get()));
htaaac2dea2016-03-10 13:35:55 -08001150 receiving_client_.reset(
perkj8aba9972016-04-10 23:54:34 -07001151 PeerConnectionTestClient::CreateClientPreferNoConstraints(
danilchape9021a32016-05-17 01:52:02 -07001152 "Callee: ", nullptr, network_thread_.get(), worker_thread_.get()));
htaaac2dea2016-03-10 13:35:55 -08001153 if (!initiating_client_ || !receiving_client_) {
1154 return false;
1155 }
1156 // Remember the choice for possible later resets of the clients.
1157 prefer_constraint_apis_ = false;
1158 SetSignalingReceivers();
1159 return true;
1160 }
1161
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001162 void SetSignalingReceivers() {
1163 initiating_client_->set_signaling_message_receiver(receiving_client_.get());
1164 receiving_client_->set_signaling_message_receiver(initiating_client_.get());
1165 }
1166
Joachim Bauch04e5b492015-05-29 09:40:39 +02001167 bool CreateTestClients(MediaConstraintsInterface* init_constraints,
1168 PeerConnectionFactory::Options* init_options,
1169 MediaConstraintsInterface* recv_constraints,
1170 PeerConnectionFactory::Options* recv_options) {
deadbeefaf1b59c2015-10-15 12:08:41 -07001171 initiating_client_.reset(PeerConnectionTestClient::CreateClient(
danilchape9021a32016-05-17 01:52:02 -07001172 "Caller: ", init_constraints, init_options, network_thread_.get(),
1173 worker_thread_.get()));
deadbeefaf1b59c2015-10-15 12:08:41 -07001174 receiving_client_.reset(PeerConnectionTestClient::CreateClient(
danilchape9021a32016-05-17 01:52:02 -07001175 "Callee: ", recv_constraints, recv_options, network_thread_.get(),
1176 worker_thread_.get()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001177 if (!initiating_client_ || !receiving_client_) {
1178 return false;
1179 }
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001180 SetSignalingReceivers();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001181 return true;
1182 }
1183
1184 void SetVideoConstraints(const webrtc::FakeConstraints& init_constraints,
1185 const webrtc::FakeConstraints& recv_constraints) {
1186 initiating_client_->SetVideoConstraints(init_constraints);
1187 receiving_client_->SetVideoConstraints(recv_constraints);
1188 }
1189
perkjcaafdba2016-03-20 07:34:29 -07001190 void SetCaptureRotation(webrtc::VideoRotation rotation) {
1191 initiating_client_->SetCaptureRotation(rotation);
1192 receiving_client_->SetCaptureRotation(rotation);
1193 }
1194
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001195 void EnableVideoDecoderFactory() {
1196 initiating_client_->EnableVideoDecoderFactory();
1197 receiving_client_->EnableVideoDecoderFactory();
1198 }
1199
1200 // This test sets up a call between two parties. Both parties send static
1201 // frames to each other. Once the test is finished the number of sent frames
1202 // is compared to the number of received frames.
Taylor Brandstetter0a1bc532016-04-19 18:03:26 -07001203 void LocalP2PTest() {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001204 if (initiating_client_->NumberOfLocalMediaStreams() == 0) {
1205 initiating_client_->AddMediaStream(true, true);
1206 }
1207 initiating_client_->Negotiate();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001208 // Assert true is used here since next tests are guaranteed to fail and
1209 // would eat up 5 seconds.
1210 ASSERT_TRUE_WAIT(SessionActive(), kMaxWaitForActivationMs);
1211 VerifySessionDescriptions();
1212
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001213 int audio_frame_count = kEndAudioFrameCount;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001214 int video_frame_count = kEndVideoFrameCount;
hta6b4f8392016-03-10 00:24:31 -08001215 // TODO(ronghuawu): Add test to cover the case of sendonly and recvonly.
1216
1217 if ((!initiating_client_->can_receive_audio() &&
1218 !initiating_client_->can_receive_video()) ||
1219 (!receiving_client_->can_receive_audio() &&
1220 !receiving_client_->can_receive_video())) {
1221 // Neither audio nor video will flow, so connections won't be
1222 // established. There's nothing more to check.
1223 // TODO(hta): Check connection if there's a data channel.
1224 return;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001225 }
1226
hta6b4f8392016-03-10 00:24:31 -08001227 // Audio or video is expected to flow, so both clients should reach the
1228 // Connected state, and the offerer (ICE controller) should proceed to
1229 // Completed.
1230 // Note: These tests have been observed to fail under heavy load at
1231 // shorter timeouts, so they may be flaky.
Taylor Brandstetter0a1bc532016-04-19 18:03:26 -07001232 EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionCompleted,
1233 initiating_client_->ice_connection_state(),
1234 kMaxWaitForFramesMs);
hta6b4f8392016-03-10 00:24:31 -08001235 EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionConnected,
1236 receiving_client_->ice_connection_state(),
1237 kMaxWaitForFramesMs);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001238
hta6b4f8392016-03-10 00:24:31 -08001239 // The ICE gathering state should end up in kIceGatheringComplete,
1240 // but there's a bug that prevents this at the moment, and the state
1241 // machine is being updated by the WEBRTC WG.
1242 // TODO(hta): Update this check when spec revisions finish.
1243 EXPECT_NE(webrtc::PeerConnectionInterface::kIceGatheringNew,
1244 initiating_client_->ice_gathering_state());
1245 EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceGatheringComplete,
1246 receiving_client_->ice_gathering_state(),
1247 kMaxWaitForFramesMs);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001248
hta6b4f8392016-03-10 00:24:31 -08001249 // Check that the expected number of frames have arrived.
1250 EXPECT_TRUE_WAIT(FramesHaveArrived(audio_frame_count, video_frame_count),
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001251 kMaxWaitForFramesMs);
1252 }
1253
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001254 void SetupAndVerifyDtlsCall() {
1255 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
1256 FakeConstraints setup_constraints;
1257 setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp,
1258 true);
1259 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints));
1260 LocalP2PTest();
1261 VerifyRenderedSize(640, 480);
1262 }
1263
1264 PeerConnectionTestClient* CreateDtlsClientWithAlternateKey() {
1265 FakeConstraints setup_constraints;
1266 setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp,
1267 true);
1268
Henrik Boströmd79599d2016-06-01 13:58:50 +02001269 std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
1270 rtc::SSLStreamAdapter::HaveDtlsSrtp() ?
1271 new FakeRTCCertificateGenerator() : nullptr);
1272 cert_generator->use_alternate_key();
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001273
1274 // Make sure the new client is using a different certificate.
1275 return PeerConnectionTestClient::CreateClientWithDtlsIdentityStore(
kwiberg0eb15ed2015-12-17 03:04:15 -08001276 "New Peer: ", &setup_constraints, nullptr,
Henrik Boströmd79599d2016-06-01 13:58:50 +02001277 std::move(cert_generator), prefer_constraint_apis_,
danilchape9021a32016-05-17 01:52:02 -07001278 network_thread_.get(), worker_thread_.get());
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001279 }
1280
jiayl@webrtc.org6c6f33b2014-06-12 21:05:19 +00001281 void SendRtpData(webrtc::DataChannelInterface* dc, const std::string& data) {
1282 // Messages may get lost on the unreliable DataChannel, so we send multiple
1283 // times to avoid test flakiness.
1284 static const size_t kSendAttempts = 5;
1285
1286 for (size_t i = 0; i < kSendAttempts; ++i) {
1287 dc->Send(DataBuffer(data));
1288 }
1289 }
1290
deadbeefaf1b59c2015-10-15 12:08:41 -07001291 PeerConnectionTestClient* initializing_client() {
1292 return initiating_client_.get();
1293 }
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001294
1295 // Set the |initiating_client_| to the |client| passed in and return the
1296 // original |initiating_client_|.
1297 PeerConnectionTestClient* set_initializing_client(
1298 PeerConnectionTestClient* client) {
1299 PeerConnectionTestClient* old = initiating_client_.release();
1300 initiating_client_.reset(client);
1301 return old;
1302 }
1303
deadbeefaf1b59c2015-10-15 12:08:41 -07001304 PeerConnectionTestClient* receiving_client() {
1305 return receiving_client_.get();
1306 }
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001307
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001308 // Set the |receiving_client_| to the |client| passed in and return the
1309 // original |receiving_client_|.
1310 PeerConnectionTestClient* set_receiving_client(
1311 PeerConnectionTestClient* client) {
1312 PeerConnectionTestClient* old = receiving_client_.release();
1313 receiving_client_.reset(client);
1314 return old;
1315 }
1316
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001317 private:
deadbeefeff5b852016-05-27 14:18:01 -07001318 // |ss_| is used by |network_thread_| so it must be destroyed later.
kwibergd1fe2812016-04-27 06:47:29 -07001319 std::unique_ptr<rtc::PhysicalSocketServer> pss_;
1320 std::unique_ptr<rtc::VirtualSocketServer> ss_;
deadbeefeff5b852016-05-27 14:18:01 -07001321 // |network_thread_| and |worker_thread_| are used by both
1322 // |initiating_client_| and |receiving_client_| so they must be destroyed
1323 // later.
1324 std::unique_ptr<rtc::Thread> network_thread_;
1325 std::unique_ptr<rtc::Thread> worker_thread_;
kwibergd1fe2812016-04-27 06:47:29 -07001326 std::unique_ptr<PeerConnectionTestClient> initiating_client_;
1327 std::unique_ptr<PeerConnectionTestClient> receiving_client_;
htaaac2dea2016-03-10 13:35:55 -08001328 bool prefer_constraint_apis_ = true;
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001329};
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001330
kjellander@webrtc.orgd1cfa712013-10-16 16:51:52 +00001331// Disable for TSan v2, see
1332// https://code.google.com/p/webrtc/issues/detail?id=1205 for details.
1333#if !defined(THREAD_SANITIZER)
1334
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001335// This test sets up a Jsep call between two parties and test Dtmf.
stefan@webrtc.orgda790082013-09-17 13:11:38 +00001336// TODO(holmer): Disabled due to sometimes crashing on buildbots.
1337// See issue webrtc/2378.
deadbeef7c73bdb2015-12-10 15:10:44 -08001338TEST_F(P2PTestConductor, DISABLED_LocalP2PTestDtmf) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001339 ASSERT_TRUE(CreateTestClients());
1340 LocalP2PTest();
1341 VerifyDtmf();
1342}
1343
1344// This test sets up a Jsep call between two parties and test that we can get a
1345// video aspect ratio of 16:9.
deadbeef7c73bdb2015-12-10 15:10:44 -08001346TEST_F(P2PTestConductor, LocalP2PTest16To9) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001347 ASSERT_TRUE(CreateTestClients());
1348 FakeConstraints constraint;
1349 double requested_ratio = 640.0/360;
1350 constraint.SetMandatoryMinAspectRatio(requested_ratio);
1351 SetVideoConstraints(constraint, constraint);
1352 LocalP2PTest();
1353
1354 ASSERT_LE(0, initializing_client()->rendered_height());
1355 double initiating_video_ratio =
henrike@webrtc.org28654cb2013-07-22 21:07:49 +00001356 static_cast<double>(initializing_client()->rendered_width()) /
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001357 initializing_client()->rendered_height();
1358 EXPECT_LE(requested_ratio, initiating_video_ratio);
1359
1360 ASSERT_LE(0, receiving_client()->rendered_height());
1361 double receiving_video_ratio =
henrike@webrtc.org28654cb2013-07-22 21:07:49 +00001362 static_cast<double>(receiving_client()->rendered_width()) /
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001363 receiving_client()->rendered_height();
1364 EXPECT_LE(requested_ratio, receiving_video_ratio);
1365}
1366
1367// This test sets up a Jsep call between two parties and test that the
1368// received video has a resolution of 1280*720.
1369// TODO(mallinath): Enable when
1370// http://code.google.com/p/webrtc/issues/detail?id=981 is fixed.
deadbeef7c73bdb2015-12-10 15:10:44 -08001371TEST_F(P2PTestConductor, DISABLED_LocalP2PTest1280By720) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001372 ASSERT_TRUE(CreateTestClients());
1373 FakeConstraints constraint;
1374 constraint.SetMandatoryMinWidth(1280);
1375 constraint.SetMandatoryMinHeight(720);
1376 SetVideoConstraints(constraint, constraint);
1377 LocalP2PTest();
1378 VerifyRenderedSize(1280, 720);
1379}
1380
1381// This test sets up a call between two endpoints that are configured to use
1382// DTLS key agreement. As a result, DTLS is negotiated and used for transport.
deadbeef7c73bdb2015-12-10 15:10:44 -08001383TEST_F(P2PTestConductor, LocalP2PTestDtls) {
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001384 SetupAndVerifyDtlsCall();
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001385}
1386
hta6b4f8392016-03-10 00:24:31 -08001387// This test sets up an one-way call, with media only from initiator to
1388// responder.
1389TEST_F(P2PTestConductor, OneWayMediaCall) {
1390 ASSERT_TRUE(CreateTestClients());
1391 receiving_client()->set_auto_add_stream(false);
1392 LocalP2PTest();
1393}
1394
htaaac2dea2016-03-10 13:35:55 -08001395TEST_F(P2PTestConductor, OneWayMediaCallWithoutConstraints) {
1396 ASSERT_TRUE(CreateTestClientsThatPreferNoConstraints());
1397 receiving_client()->set_auto_add_stream(false);
1398 LocalP2PTest();
1399}
1400
mallinath@webrtc.org19f27e62013-10-13 17:18:27 +00001401// This test sets up a audio call initially and then upgrades to audio/video,
1402// using DTLS.
deadbeef7c73bdb2015-12-10 15:10:44 -08001403TEST_F(P2PTestConductor, LocalP2PTestDtlsRenegotiate) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001404 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
mallinath@webrtc.org19f27e62013-10-13 17:18:27 +00001405 FakeConstraints setup_constraints;
1406 setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp,
1407 true);
1408 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints));
1409 receiving_client()->SetReceiveAudioVideo(true, false);
1410 LocalP2PTest();
1411 receiving_client()->SetReceiveAudioVideo(true, true);
1412 receiving_client()->Negotiate();
1413}
1414
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001415// This test sets up a call transfer to a new caller with a different DTLS
1416// fingerprint.
deadbeef7c73bdb2015-12-10 15:10:44 -08001417TEST_F(P2PTestConductor, LocalP2PTestDtlsTransferCallee) {
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001418 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
1419 SetupAndVerifyDtlsCall();
1420
1421 // Keeping the original peer around which will still send packets to the
1422 // receiving client. These SRTP packets will be dropped.
kwibergd1fe2812016-04-27 06:47:29 -07001423 std::unique_ptr<PeerConnectionTestClient> original_peer(
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001424 set_initializing_client(CreateDtlsClientWithAlternateKey()));
1425 original_peer->pc()->Close();
1426
1427 SetSignalingReceivers();
1428 receiving_client()->SetExpectIceRestart(true);
1429 LocalP2PTest();
1430 VerifyRenderedSize(640, 480);
1431}
1432
guoweis46383312015-12-17 16:45:59 -08001433// This test sets up a non-bundle call and apply bundle during ICE restart. When
1434// bundle is in effect in the restart, the channel can successfully reset its
1435// DTLS-SRTP context.
1436TEST_F(P2PTestConductor, LocalP2PTestDtlsBundleInIceRestart) {
1437 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
1438 FakeConstraints setup_constraints;
1439 setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp,
1440 true);
1441 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints));
1442 receiving_client()->RemoveBundleFromReceivedSdp(true);
1443 LocalP2PTest();
1444 VerifyRenderedSize(640, 480);
1445
1446 initializing_client()->IceRestart();
1447 receiving_client()->SetExpectIceRestart(true);
1448 receiving_client()->RemoveBundleFromReceivedSdp(false);
1449 LocalP2PTest();
1450 VerifyRenderedSize(640, 480);
1451}
1452
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001453// This test sets up a call transfer to a new callee with a different DTLS
1454// fingerprint.
deadbeef7c73bdb2015-12-10 15:10:44 -08001455TEST_F(P2PTestConductor, LocalP2PTestDtlsTransferCaller) {
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001456 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
1457 SetupAndVerifyDtlsCall();
1458
1459 // Keeping the original peer around which will still send packets to the
1460 // receiving client. These SRTP packets will be dropped.
kwibergd1fe2812016-04-27 06:47:29 -07001461 std::unique_ptr<PeerConnectionTestClient> original_peer(
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001462 set_receiving_client(CreateDtlsClientWithAlternateKey()));
1463 original_peer->pc()->Close();
1464
1465 SetSignalingReceivers();
1466 initializing_client()->IceRestart();
Taylor Brandstetter0a1bc532016-04-19 18:03:26 -07001467 LocalP2PTest();
Guo-wei Shieh1218d7a2015-12-05 09:59:56 -08001468 VerifyRenderedSize(640, 480);
1469}
1470
perkjcaafdba2016-03-20 07:34:29 -07001471TEST_F(P2PTestConductor, LocalP2PTestCVO) {
1472 ASSERT_TRUE(CreateTestClients());
1473 SetCaptureRotation(webrtc::kVideoRotation_90);
1474 LocalP2PTest();
1475 VerifyRenderedSize(640, 480, webrtc::kVideoRotation_90);
1476}
1477
1478TEST_F(P2PTestConductor, LocalP2PTestReceiverDoesntSupportCVO) {
1479 ASSERT_TRUE(CreateTestClients());
1480 SetCaptureRotation(webrtc::kVideoRotation_90);
1481 receiving_client()->RemoveCvoFromReceivedSdp(true);
1482 LocalP2PTest();
1483 VerifyRenderedSize(480, 640, webrtc::kVideoRotation_0);
1484}
1485
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001486// This test sets up a call between two endpoints that are configured to use
1487// DTLS key agreement. The offerer don't support SDES. As a result, DTLS is
1488// negotiated and used for transport.
deadbeef7c73bdb2015-12-10 15:10:44 -08001489TEST_F(P2PTestConductor, LocalP2PTestOfferDtlsButNotSdes) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001490 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001491 FakeConstraints setup_constraints;
1492 setup_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp,
1493 true);
1494 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints));
1495 receiving_client()->RemoveSdesCryptoFromReceivedSdp(true);
1496 LocalP2PTest();
1497 VerifyRenderedSize(640, 480);
1498}
1499
1500// This test sets up a Jsep call between two parties, and the callee only
1501// accept to receive video.
deadbeef7c73bdb2015-12-10 15:10:44 -08001502TEST_F(P2PTestConductor, LocalP2PTestAnswerVideo) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001503 ASSERT_TRUE(CreateTestClients());
1504 receiving_client()->SetReceiveAudioVideo(false, true);
1505 LocalP2PTest();
1506}
1507
1508// This test sets up a Jsep call between two parties, and the callee only
1509// accept to receive audio.
deadbeef7c73bdb2015-12-10 15:10:44 -08001510TEST_F(P2PTestConductor, LocalP2PTestAnswerAudio) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001511 ASSERT_TRUE(CreateTestClients());
1512 receiving_client()->SetReceiveAudioVideo(true, false);
1513 LocalP2PTest();
1514}
1515
1516// This test sets up a Jsep call between two parties, and the callee reject both
1517// audio and video.
deadbeef7c73bdb2015-12-10 15:10:44 -08001518TEST_F(P2PTestConductor, LocalP2PTestAnswerNone) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001519 ASSERT_TRUE(CreateTestClients());
1520 receiving_client()->SetReceiveAudioVideo(false, false);
1521 LocalP2PTest();
1522}
1523
1524// This test sets up an audio and video call between two parties. After the call
1525// runs for a while (10 frames), the caller sends an update offer with video
1526// being rejected. Once the re-negotiation is done, the video flow should stop
1527// and the audio flow should continue.
deadbeefc9be0072015-12-14 18:27:57 -08001528TEST_F(P2PTestConductor, UpdateOfferWithRejectedContent) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001529 ASSERT_TRUE(CreateTestClients());
1530 LocalP2PTest();
1531 TestUpdateOfferWithRejectedContent();
1532}
1533
1534// This test sets up a Jsep call between two parties. The MSID is removed from
1535// the SDP strings from the caller.
deadbeefc9be0072015-12-14 18:27:57 -08001536TEST_F(P2PTestConductor, LocalP2PTestWithoutMsid) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001537 ASSERT_TRUE(CreateTestClients());
1538 receiving_client()->RemoveMsidFromReceivedSdp(true);
1539 // TODO(perkj): Currently there is a bug that cause audio to stop playing if
1540 // audio and video is muxed when MSID is disabled. Remove
1541 // SetRemoveBundleFromSdp once
1542 // https://code.google.com/p/webrtc/issues/detail?id=1193 is fixed.
1543 receiving_client()->RemoveBundleFromReceivedSdp(true);
1544 LocalP2PTest();
1545}
1546
1547// This test sets up a Jsep call between two parties and the initiating peer
1548// sends two steams.
1549// TODO(perkj): Disabled due to
1550// https://code.google.com/p/webrtc/issues/detail?id=1454
deadbeef7c73bdb2015-12-10 15:10:44 -08001551TEST_F(P2PTestConductor, DISABLED_LocalP2PTestTwoStreams) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001552 ASSERT_TRUE(CreateTestClients());
1553 // Set optional video constraint to max 320pixels to decrease CPU usage.
1554 FakeConstraints constraint;
1555 constraint.SetOptionalMaxWidth(320);
1556 SetVideoConstraints(constraint, constraint);
1557 initializing_client()->AddMediaStream(true, true);
1558 initializing_client()->AddMediaStream(false, true);
1559 ASSERT_EQ(2u, initializing_client()->NumberOfLocalMediaStreams());
1560 LocalP2PTest();
1561 EXPECT_EQ(2u, receiving_client()->number_of_remote_streams());
1562}
1563
1564// Test that we can receive the audio output level from a remote audio track.
deadbeef7c73bdb2015-12-10 15:10:44 -08001565TEST_F(P2PTestConductor, GetAudioOutputLevelStats) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001566 ASSERT_TRUE(CreateTestClients());
1567 LocalP2PTest();
1568
1569 StreamCollectionInterface* remote_streams =
1570 initializing_client()->remote_streams();
1571 ASSERT_GT(remote_streams->count(), 0u);
1572 ASSERT_GT(remote_streams->at(0)->GetAudioTracks().size(), 0u);
1573 MediaStreamTrackInterface* remote_audio_track =
1574 remote_streams->at(0)->GetAudioTracks()[0];
1575
1576 // Get the audio output level stats. Note that the level is not available
1577 // until a RTCP packet has been received.
1578 EXPECT_TRUE_WAIT(
1579 initializing_client()->GetAudioOutputLevelStats(remote_audio_track) > 0,
1580 kMaxWaitForStatsMs);
1581}
1582
1583// Test that an audio input level is reported.
deadbeef7c73bdb2015-12-10 15:10:44 -08001584TEST_F(P2PTestConductor, GetAudioInputLevelStats) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001585 ASSERT_TRUE(CreateTestClients());
1586 LocalP2PTest();
1587
1588 // Get the audio input level stats. The level should be available very
1589 // soon after the test starts.
1590 EXPECT_TRUE_WAIT(initializing_client()->GetAudioInputLevelStats() > 0,
1591 kMaxWaitForStatsMs);
1592}
1593
1594// Test that we can get incoming byte counts from both audio and video tracks.
deadbeef7c73bdb2015-12-10 15:10:44 -08001595TEST_F(P2PTestConductor, GetBytesReceivedStats) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001596 ASSERT_TRUE(CreateTestClients());
1597 LocalP2PTest();
1598
1599 StreamCollectionInterface* remote_streams =
1600 initializing_client()->remote_streams();
1601 ASSERT_GT(remote_streams->count(), 0u);
1602 ASSERT_GT(remote_streams->at(0)->GetAudioTracks().size(), 0u);
1603 MediaStreamTrackInterface* remote_audio_track =
1604 remote_streams->at(0)->GetAudioTracks()[0];
1605 EXPECT_TRUE_WAIT(
1606 initializing_client()->GetBytesReceivedStats(remote_audio_track) > 0,
1607 kMaxWaitForStatsMs);
1608
1609 MediaStreamTrackInterface* remote_video_track =
1610 remote_streams->at(0)->GetVideoTracks()[0];
1611 EXPECT_TRUE_WAIT(
1612 initializing_client()->GetBytesReceivedStats(remote_video_track) > 0,
1613 kMaxWaitForStatsMs);
1614}
1615
1616// Test that we can get outgoing byte counts from both audio and video tracks.
deadbeef7c73bdb2015-12-10 15:10:44 -08001617TEST_F(P2PTestConductor, GetBytesSentStats) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001618 ASSERT_TRUE(CreateTestClients());
1619 LocalP2PTest();
1620
1621 StreamCollectionInterface* local_streams =
1622 initializing_client()->local_streams();
1623 ASSERT_GT(local_streams->count(), 0u);
1624 ASSERT_GT(local_streams->at(0)->GetAudioTracks().size(), 0u);
1625 MediaStreamTrackInterface* local_audio_track =
1626 local_streams->at(0)->GetAudioTracks()[0];
1627 EXPECT_TRUE_WAIT(
1628 initializing_client()->GetBytesSentStats(local_audio_track) > 0,
1629 kMaxWaitForStatsMs);
1630
1631 MediaStreamTrackInterface* local_video_track =
1632 local_streams->at(0)->GetVideoTracks()[0];
1633 EXPECT_TRUE_WAIT(
1634 initializing_client()->GetBytesSentStats(local_video_track) > 0,
1635 kMaxWaitForStatsMs);
1636}
1637
Joachim Bauch04e5b492015-05-29 09:40:39 +02001638// Test that DTLS 1.0 is used if both sides only support DTLS 1.0.
torbjorng43166b82016-03-11 00:06:47 -08001639TEST_F(P2PTestConductor, GetDtls12None) {
Joachim Bauch04e5b492015-05-29 09:40:39 +02001640 PeerConnectionFactory::Options init_options;
1641 init_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10;
1642 PeerConnectionFactory::Options recv_options;
1643 recv_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10;
deadbeefaf1b59c2015-10-15 12:08:41 -07001644 ASSERT_TRUE(
1645 CreateTestClients(nullptr, &init_options, nullptr, &recv_options));
jbauchac8869e2015-07-03 01:36:14 -07001646 rtc::scoped_refptr<webrtc::FakeMetricsObserver>
1647 init_observer = new rtc::RefCountedObject<webrtc::FakeMetricsObserver>();
1648 initializing_client()->pc()->RegisterUMAObserver(init_observer);
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30 +00001649 LocalP2PTest();
1650
torbjorng43166b82016-03-11 00:06:47 -08001651 EXPECT_TRUE_WAIT(
1652 rtc::SSLStreamAdapter::IsAcceptableCipher(
1653 initializing_client()->GetDtlsCipherStats(), rtc::KT_DEFAULT),
1654 kMaxWaitForStatsMs);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001655 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite),
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001656 initializing_client()->GetSrtpCipherStats(),
1657 kMaxWaitForStatsMs);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001658 EXPECT_EQ(1,
1659 init_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher,
1660 kDefaultSrtpCryptoSuite));
Joachim Bauch04e5b492015-05-29 09:40:39 +02001661}
1662
1663// Test that DTLS 1.2 is used if both ends support it.
torbjorng79a5a832016-01-15 07:16:51 -08001664TEST_F(P2PTestConductor, GetDtls12Both) {
Joachim Bauch04e5b492015-05-29 09:40:39 +02001665 PeerConnectionFactory::Options init_options;
1666 init_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12;
1667 PeerConnectionFactory::Options recv_options;
1668 recv_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12;
deadbeefaf1b59c2015-10-15 12:08:41 -07001669 ASSERT_TRUE(
1670 CreateTestClients(nullptr, &init_options, nullptr, &recv_options));
jbauchac8869e2015-07-03 01:36:14 -07001671 rtc::scoped_refptr<webrtc::FakeMetricsObserver>
1672 init_observer = new rtc::RefCountedObject<webrtc::FakeMetricsObserver>();
1673 initializing_client()->pc()->RegisterUMAObserver(init_observer);
Joachim Bauch04e5b492015-05-29 09:40:39 +02001674 LocalP2PTest();
1675
torbjorng43166b82016-03-11 00:06:47 -08001676 EXPECT_TRUE_WAIT(
1677 rtc::SSLStreamAdapter::IsAcceptableCipher(
1678 initializing_client()->GetDtlsCipherStats(), rtc::KT_DEFAULT),
1679 kMaxWaitForStatsMs);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001680 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite),
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001681 initializing_client()->GetSrtpCipherStats(),
1682 kMaxWaitForStatsMs);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001683 EXPECT_EQ(1,
1684 init_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher,
1685 kDefaultSrtpCryptoSuite));
Joachim Bauch04e5b492015-05-29 09:40:39 +02001686}
1687
1688// Test that DTLS 1.0 is used if the initator supports DTLS 1.2 and the
1689// received supports 1.0.
torbjorng43166b82016-03-11 00:06:47 -08001690TEST_F(P2PTestConductor, GetDtls12Init) {
Joachim Bauch04e5b492015-05-29 09:40:39 +02001691 PeerConnectionFactory::Options init_options;
1692 init_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12;
1693 PeerConnectionFactory::Options recv_options;
1694 recv_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10;
deadbeefaf1b59c2015-10-15 12:08:41 -07001695 ASSERT_TRUE(
1696 CreateTestClients(nullptr, &init_options, nullptr, &recv_options));
jbauchac8869e2015-07-03 01:36:14 -07001697 rtc::scoped_refptr<webrtc::FakeMetricsObserver>
1698 init_observer = new rtc::RefCountedObject<webrtc::FakeMetricsObserver>();
1699 initializing_client()->pc()->RegisterUMAObserver(init_observer);
Joachim Bauch04e5b492015-05-29 09:40:39 +02001700 LocalP2PTest();
1701
torbjorng43166b82016-03-11 00:06:47 -08001702 EXPECT_TRUE_WAIT(
1703 rtc::SSLStreamAdapter::IsAcceptableCipher(
1704 initializing_client()->GetDtlsCipherStats(), rtc::KT_DEFAULT),
1705 kMaxWaitForStatsMs);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001706 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite),
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001707 initializing_client()->GetSrtpCipherStats(),
1708 kMaxWaitForStatsMs);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001709 EXPECT_EQ(1,
1710 init_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher,
1711 kDefaultSrtpCryptoSuite));
Joachim Bauch04e5b492015-05-29 09:40:39 +02001712}
1713
1714// Test that DTLS 1.0 is used if the initator supports DTLS 1.0 and the
1715// received supports 1.2.
torbjorng43166b82016-03-11 00:06:47 -08001716TEST_F(P2PTestConductor, GetDtls12Recv) {
Joachim Bauch04e5b492015-05-29 09:40:39 +02001717 PeerConnectionFactory::Options init_options;
1718 init_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10;
1719 PeerConnectionFactory::Options recv_options;
1720 recv_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12;
deadbeefaf1b59c2015-10-15 12:08:41 -07001721 ASSERT_TRUE(
1722 CreateTestClients(nullptr, &init_options, nullptr, &recv_options));
jbauchac8869e2015-07-03 01:36:14 -07001723 rtc::scoped_refptr<webrtc::FakeMetricsObserver>
1724 init_observer = new rtc::RefCountedObject<webrtc::FakeMetricsObserver>();
1725 initializing_client()->pc()->RegisterUMAObserver(init_observer);
Joachim Bauch04e5b492015-05-29 09:40:39 +02001726 LocalP2PTest();
1727
torbjorng43166b82016-03-11 00:06:47 -08001728 EXPECT_TRUE_WAIT(
1729 rtc::SSLStreamAdapter::IsAcceptableCipher(
1730 initializing_client()->GetDtlsCipherStats(), rtc::KT_DEFAULT),
1731 kMaxWaitForStatsMs);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001732 EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite),
Guo-wei Shieh456696a2015-09-30 21:48:54 -07001733 initializing_client()->GetSrtpCipherStats(),
1734 kMaxWaitForStatsMs);
Guo-wei Shieh521ed7b2015-11-18 19:41:53 -08001735 EXPECT_EQ(1,
1736 init_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher,
1737 kDefaultSrtpCryptoSuite));
pthatcher@webrtc.org7bea1ff2015-03-04 01:38:30 +00001738}
1739
deadbeefb5cb19b2015-11-23 16:39:12 -08001740// This test sets up a call between two parties with audio, video and an RTP
1741// data channel.
deadbeef7c73bdb2015-12-10 15:10:44 -08001742TEST_F(P2PTestConductor, LocalP2PTestRtpDataChannel) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001743 FakeConstraints setup_constraints;
1744 setup_constraints.SetAllowRtpDataChannels();
1745 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints));
1746 initializing_client()->CreateDataChannel();
1747 LocalP2PTest();
deadbeefaf1b59c2015-10-15 12:08:41 -07001748 ASSERT_TRUE(initializing_client()->data_channel() != nullptr);
1749 ASSERT_TRUE(receiving_client()->data_channel() != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001750 EXPECT_TRUE_WAIT(initializing_client()->data_observer()->IsOpen(),
1751 kMaxWaitMs);
1752 EXPECT_TRUE_WAIT(receiving_client()->data_observer()->IsOpen(),
1753 kMaxWaitMs);
1754
1755 std::string data = "hello world";
jiayl@webrtc.org6c6f33b2014-06-12 21:05:19 +00001756
1757 SendRtpData(initializing_client()->data_channel(), data);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001758 EXPECT_EQ_WAIT(data, receiving_client()->data_observer()->last_message(),
1759 kMaxWaitMs);
jiayl@webrtc.org6c6f33b2014-06-12 21:05:19 +00001760
1761 SendRtpData(receiving_client()->data_channel(), data);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001762 EXPECT_EQ_WAIT(data, initializing_client()->data_observer()->last_message(),
1763 kMaxWaitMs);
1764
1765 receiving_client()->data_channel()->Close();
1766 // Send new offer and answer.
1767 receiving_client()->Negotiate();
1768 EXPECT_FALSE(initializing_client()->data_observer()->IsOpen());
1769 EXPECT_FALSE(receiving_client()->data_observer()->IsOpen());
1770}
1771
deadbeefb5cb19b2015-11-23 16:39:12 -08001772// This test sets up a call between two parties with audio, video and an SCTP
1773// data channel.
deadbeef7c73bdb2015-12-10 15:10:44 -08001774TEST_F(P2PTestConductor, LocalP2PTestSctpDataChannel) {
deadbeefb5cb19b2015-11-23 16:39:12 -08001775 ASSERT_TRUE(CreateTestClients());
1776 initializing_client()->CreateDataChannel();
1777 LocalP2PTest();
1778 ASSERT_TRUE(initializing_client()->data_channel() != nullptr);
1779 EXPECT_TRUE_WAIT(receiving_client()->data_channel() != nullptr, kMaxWaitMs);
1780 EXPECT_TRUE_WAIT(initializing_client()->data_observer()->IsOpen(),
1781 kMaxWaitMs);
1782 EXPECT_TRUE_WAIT(receiving_client()->data_observer()->IsOpen(), kMaxWaitMs);
1783
1784 std::string data = "hello world";
1785
1786 initializing_client()->data_channel()->Send(DataBuffer(data));
1787 EXPECT_EQ_WAIT(data, receiving_client()->data_observer()->last_message(),
1788 kMaxWaitMs);
1789
1790 receiving_client()->data_channel()->Send(DataBuffer(data));
1791 EXPECT_EQ_WAIT(data, initializing_client()->data_observer()->last_message(),
1792 kMaxWaitMs);
1793
1794 receiving_client()->data_channel()->Close();
deadbeef15887932015-12-14 19:32:34 -08001795 EXPECT_TRUE_WAIT(!initializing_client()->data_observer()->IsOpen(),
1796 kMaxWaitMs);
1797 EXPECT_TRUE_WAIT(!receiving_client()->data_observer()->IsOpen(), kMaxWaitMs);
deadbeefb5cb19b2015-11-23 16:39:12 -08001798}
1799
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001800// This test sets up a call between two parties and creates a data channel.
1801// The test tests that received data is buffered unless an observer has been
1802// registered.
1803// Rtp data channels can receive data before the underlying
1804// transport has detected that a channel is writable and thus data can be
1805// received before the data channel state changes to open. That is hard to test
1806// but the same buffering is used in that case.
deadbeef7c73bdb2015-12-10 15:10:44 -08001807TEST_F(P2PTestConductor, RegisterDataChannelObserver) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001808 FakeConstraints setup_constraints;
1809 setup_constraints.SetAllowRtpDataChannels();
1810 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints));
1811 initializing_client()->CreateDataChannel();
1812 initializing_client()->Negotiate();
1813
deadbeefaf1b59c2015-10-15 12:08:41 -07001814 ASSERT_TRUE(initializing_client()->data_channel() != nullptr);
1815 ASSERT_TRUE(receiving_client()->data_channel() != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001816 EXPECT_TRUE_WAIT(initializing_client()->data_observer()->IsOpen(),
1817 kMaxWaitMs);
1818 EXPECT_EQ_WAIT(DataChannelInterface::kOpen,
1819 receiving_client()->data_channel()->state(), kMaxWaitMs);
1820
1821 // Unregister the existing observer.
1822 receiving_client()->data_channel()->UnregisterObserver();
buildbot@webrtc.orgb4c7b092014-08-25 12:11:58 +00001823
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001824 std::string data = "hello world";
jiayl@webrtc.org6c6f33b2014-06-12 21:05:19 +00001825 SendRtpData(initializing_client()->data_channel(), data);
1826
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001827 // Wait a while to allow the sent data to arrive before an observer is
1828 // registered..
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001829 rtc::Thread::Current()->ProcessMessages(100);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001830
1831 MockDataChannelObserver new_observer(receiving_client()->data_channel());
1832 EXPECT_EQ_WAIT(data, new_observer.last_message(), kMaxWaitMs);
1833}
1834
1835// This test sets up a call between two parties with audio, video and but only
1836// the initiating client support data.
deadbeef7c73bdb2015-12-10 15:10:44 -08001837TEST_F(P2PTestConductor, LocalP2PTestReceiverDoesntSupportData) {
buildbot@webrtc.org61c1b8e2014-04-09 06:06:38 +00001838 FakeConstraints setup_constraints_1;
1839 setup_constraints_1.SetAllowRtpDataChannels();
1840 // Must disable DTLS to make negotiation succeed.
1841 setup_constraints_1.SetMandatory(
1842 MediaConstraintsInterface::kEnableDtlsSrtp, false);
1843 FakeConstraints setup_constraints_2;
1844 setup_constraints_2.SetMandatory(
1845 MediaConstraintsInterface::kEnableDtlsSrtp, false);
1846 ASSERT_TRUE(CreateTestClients(&setup_constraints_1, &setup_constraints_2));
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001847 initializing_client()->CreateDataChannel();
1848 LocalP2PTest();
deadbeefaf1b59c2015-10-15 12:08:41 -07001849 EXPECT_TRUE(initializing_client()->data_channel() != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001850 EXPECT_FALSE(receiving_client()->data_channel());
1851 EXPECT_FALSE(initializing_client()->data_observer()->IsOpen());
1852}
1853
1854// This test sets up a call between two parties with audio, video. When audio
1855// and video is setup and flowing and data channel is negotiated.
deadbeef7c73bdb2015-12-10 15:10:44 -08001856TEST_F(P2PTestConductor, AddDataChannelAfterRenegotiation) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001857 FakeConstraints setup_constraints;
1858 setup_constraints.SetAllowRtpDataChannels();
1859 ASSERT_TRUE(CreateTestClients(&setup_constraints, &setup_constraints));
1860 LocalP2PTest();
1861 initializing_client()->CreateDataChannel();
1862 // Send new offer and answer.
1863 initializing_client()->Negotiate();
deadbeefaf1b59c2015-10-15 12:08:41 -07001864 ASSERT_TRUE(initializing_client()->data_channel() != nullptr);
1865 ASSERT_TRUE(receiving_client()->data_channel() != nullptr);
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001866 EXPECT_TRUE_WAIT(initializing_client()->data_observer()->IsOpen(),
1867 kMaxWaitMs);
1868 EXPECT_TRUE_WAIT(receiving_client()->data_observer()->IsOpen(),
1869 kMaxWaitMs);
1870}
1871
jiayl@webrtc.org9c16c392014-05-01 18:30:30 +00001872// This test sets up a Jsep call with SCTP DataChannel and verifies the
1873// negotiation is completed without error.
1874#ifdef HAVE_SCTP
Taylor Brandstetter7ff17372016-04-01 11:50:39 -07001875TEST_F(P2PTestConductor, CreateOfferWithSctpDataChannel) {
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +00001876 MAYBE_SKIP_TEST(rtc::SSLStreamAdapter::HaveDtlsSrtp);
jiayl@webrtc.org9c16c392014-05-01 18:30:30 +00001877 FakeConstraints constraints;
1878 constraints.SetMandatory(
1879 MediaConstraintsInterface::kEnableDtlsSrtp, true);
1880 ASSERT_TRUE(CreateTestClients(&constraints, &constraints));
1881 initializing_client()->CreateDataChannel();
1882 initializing_client()->Negotiate(false, false);
1883}
1884#endif
1885
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001886// This test sets up a call between two parties with audio, and video.
1887// During the call, the initializing side restart ice and the test verifies that
1888// new ice candidates are generated and audio and video still can flow.
deadbeef7c73bdb2015-12-10 15:10:44 -08001889TEST_F(P2PTestConductor, IceRestart) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001890 ASSERT_TRUE(CreateTestClients());
1891
1892 // Negotiate and wait for ice completion and make sure audio and video plays.
1893 LocalP2PTest();
1894
1895 // Create a SDP string of the first audio candidate for both clients.
1896 const webrtc::IceCandidateCollection* audio_candidates_initiator =
1897 initializing_client()->pc()->local_description()->candidates(0);
1898 const webrtc::IceCandidateCollection* audio_candidates_receiver =
1899 receiving_client()->pc()->local_description()->candidates(0);
1900 ASSERT_GT(audio_candidates_initiator->count(), 0u);
1901 ASSERT_GT(audio_candidates_receiver->count(), 0u);
1902 std::string initiator_candidate;
1903 EXPECT_TRUE(
1904 audio_candidates_initiator->at(0)->ToString(&initiator_candidate));
1905 std::string receiver_candidate;
1906 EXPECT_TRUE(audio_candidates_receiver->at(0)->ToString(&receiver_candidate));
1907
1908 // Restart ice on the initializing client.
1909 receiving_client()->SetExpectIceRestart(true);
1910 initializing_client()->IceRestart();
1911
1912 // Negotiate and wait for ice completion again and make sure audio and video
1913 // plays.
1914 LocalP2PTest();
1915
1916 // Create a SDP string of the first audio candidate for both clients again.
1917 const webrtc::IceCandidateCollection* audio_candidates_initiator_restart =
1918 initializing_client()->pc()->local_description()->candidates(0);
1919 const webrtc::IceCandidateCollection* audio_candidates_reciever_restart =
1920 receiving_client()->pc()->local_description()->candidates(0);
1921 ASSERT_GT(audio_candidates_initiator_restart->count(), 0u);
1922 ASSERT_GT(audio_candidates_reciever_restart->count(), 0u);
1923 std::string initiator_candidate_restart;
1924 EXPECT_TRUE(audio_candidates_initiator_restart->at(0)->ToString(
1925 &initiator_candidate_restart));
1926 std::string receiver_candidate_restart;
1927 EXPECT_TRUE(audio_candidates_reciever_restart->at(0)->ToString(
1928 &receiver_candidate_restart));
1929
1930 // Verify that the first candidates in the local session descriptions has
1931 // changed.
1932 EXPECT_NE(initiator_candidate, initiator_candidate_restart);
1933 EXPECT_NE(receiver_candidate, receiver_candidate_restart);
1934}
1935
deadbeeffaac4972015-11-12 15:33:07 -08001936// This test sets up a call between two parties with audio, and video.
1937// It then renegotiates setting the video m-line to "port 0", then later
1938// renegotiates again, enabling video.
deadbeef7c73bdb2015-12-10 15:10:44 -08001939TEST_F(P2PTestConductor, LocalP2PTestVideoDisableEnable) {
deadbeeffaac4972015-11-12 15:33:07 -08001940 ASSERT_TRUE(CreateTestClients());
1941
1942 // Do initial negotiation. Will result in video and audio sendonly m-lines.
1943 receiving_client()->set_auto_add_stream(false);
1944 initializing_client()->AddMediaStream(true, true);
1945 initializing_client()->Negotiate();
1946
1947 // Negotiate again, disabling the video m-line (receiving client will
1948 // set port to 0 due to mandatory "OfferToReceiveVideo: false" constraint).
1949 receiving_client()->SetReceiveVideo(false);
1950 initializing_client()->Negotiate();
1951
1952 // Enable video and do negotiation again, making sure video is received
1953 // end-to-end.
1954 receiving_client()->SetReceiveVideo(true);
1955 receiving_client()->AddMediaStream(true, true);
1956 LocalP2PTest();
1957}
1958
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001959// This test sets up a Jsep call between two parties with external
1960// VideoDecoderFactory.
stefan@webrtc.orgda790082013-09-17 13:11:38 +00001961// TODO(holmer): Disabled due to sometimes crashing on buildbots.
1962// See issue webrtc/2378.
deadbeef7c73bdb2015-12-10 15:10:44 -08001963TEST_F(P2PTestConductor, DISABLED_LocalP2PTestWithVideoDecoderFactory) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001964 ASSERT_TRUE(CreateTestClients());
1965 EnableVideoDecoderFactory();
1966 LocalP2PTest();
1967}
buildbot@webrtc.orgb4c7b092014-08-25 12:11:58 +00001968
deadbeeffac06552015-11-25 11:26:01 -08001969// This tests that if we negotiate after calling CreateSender but before we
1970// have a track, then set a track later, frames from the newly-set track are
1971// received end-to-end.
deadbeef7c73bdb2015-12-10 15:10:44 -08001972TEST_F(P2PTestConductor, EarlyWarmupTest) {
deadbeeffac06552015-11-25 11:26:01 -08001973 ASSERT_TRUE(CreateTestClients());
deadbeefbd7d8f72015-12-18 16:58:44 -08001974 auto audio_sender =
1975 initializing_client()->pc()->CreateSender("audio", "stream_id");
1976 auto video_sender =
1977 initializing_client()->pc()->CreateSender("video", "stream_id");
deadbeeffac06552015-11-25 11:26:01 -08001978 initializing_client()->Negotiate();
1979 // Wait for ICE connection to complete, without any tracks.
1980 // Note that the receiving client WILL (in HandleIncomingOffer) create
1981 // tracks, so it's only the initiator here that's doing early warmup.
1982 ASSERT_TRUE_WAIT(SessionActive(), kMaxWaitForActivationMs);
1983 VerifySessionDescriptions();
1984 EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionCompleted,
1985 initializing_client()->ice_connection_state(),
1986 kMaxWaitForFramesMs);
1987 EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionConnected,
1988 receiving_client()->ice_connection_state(),
1989 kMaxWaitForFramesMs);
1990 // Now set the tracks, and expect frames to immediately start flowing.
1991 EXPECT_TRUE(
1992 audio_sender->SetTrack(initializing_client()->CreateLocalAudioTrack("")));
1993 EXPECT_TRUE(
1994 video_sender->SetTrack(initializing_client()->CreateLocalVideoTrack("")));
hta6b4f8392016-03-10 00:24:31 -08001995 EXPECT_TRUE_WAIT(FramesHaveArrived(kEndAudioFrameCount, kEndVideoFrameCount),
deadbeeffac06552015-11-25 11:26:01 -08001996 kMaxWaitForFramesMs);
1997}
1998
nissed98cf1f2016-04-22 07:27:36 -07001999TEST_F(P2PTestConductor, ForwardVideoOnlyStream) {
2000 ASSERT_TRUE(CreateTestClients());
2001 // One-way stream
2002 receiving_client()->set_auto_add_stream(false);
2003 // Video only, audio forwarding not expected to work.
2004 initializing_client()->AddMediaStream(false, true);
2005 initializing_client()->Negotiate();
2006
2007 ASSERT_TRUE_WAIT(SessionActive(), kMaxWaitForActivationMs);
2008 VerifySessionDescriptions();
2009
2010 ASSERT_TRUE(initializing_client()->can_receive_video());
2011 ASSERT_TRUE(receiving_client()->can_receive_video());
2012
2013 EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionCompleted,
2014 initializing_client()->ice_connection_state(),
2015 kMaxWaitForFramesMs);
2016 EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionConnected,
2017 receiving_client()->ice_connection_state(),
2018 kMaxWaitForFramesMs);
2019
2020 ASSERT_TRUE(receiving_client()->remote_streams()->count() == 1);
2021
2022 // Echo the stream back.
2023 receiving_client()->pc()->AddStream(
2024 receiving_client()->remote_streams()->at(0));
2025 receiving_client()->Negotiate();
2026
2027 EXPECT_TRUE_WAIT(
2028 initializing_client()->VideoFramesReceivedCheck(kEndVideoFrameCount),
2029 kMaxWaitForFramesMs);
2030}
2031
deadbeef0a6c4ca2015-10-06 11:38:28 -07002032class IceServerParsingTest : public testing::Test {
2033 public:
2034 // Convenience for parsing a single URL.
2035 bool ParseUrl(const std::string& url) {
2036 return ParseUrl(url, std::string(), std::string());
2037 }
2038
2039 bool ParseUrl(const std::string& url,
2040 const std::string& username,
2041 const std::string& password) {
2042 PeerConnectionInterface::IceServers servers;
2043 PeerConnectionInterface::IceServer server;
2044 server.urls.push_back(url);
2045 server.username = username;
2046 server.password = password;
2047 servers.push_back(server);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002048 return webrtc::ParseIceServers(servers, &stun_servers_, &turn_servers_);
deadbeef0a6c4ca2015-10-06 11:38:28 -07002049 }
2050
2051 protected:
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002052 cricket::ServerAddresses stun_servers_;
2053 std::vector<cricket::RelayServerConfig> turn_servers_;
deadbeef0a6c4ca2015-10-06 11:38:28 -07002054};
2055
2056// Make sure all STUN/TURN prefixes are parsed correctly.
2057TEST_F(IceServerParsingTest, ParseStunPrefixes) {
2058 EXPECT_TRUE(ParseUrl("stun:hostname"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002059 EXPECT_EQ(1U, stun_servers_.size());
2060 EXPECT_EQ(0U, turn_servers_.size());
2061 stun_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002062
2063 EXPECT_TRUE(ParseUrl("stuns:hostname"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002064 EXPECT_EQ(1U, stun_servers_.size());
2065 EXPECT_EQ(0U, turn_servers_.size());
2066 stun_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002067
2068 EXPECT_TRUE(ParseUrl("turn:hostname"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002069 EXPECT_EQ(0U, stun_servers_.size());
2070 EXPECT_EQ(1U, turn_servers_.size());
2071 EXPECT_FALSE(turn_servers_[0].ports[0].secure);
2072 turn_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002073
2074 EXPECT_TRUE(ParseUrl("turns:hostname"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002075 EXPECT_EQ(0U, stun_servers_.size());
2076 EXPECT_EQ(1U, turn_servers_.size());
2077 EXPECT_TRUE(turn_servers_[0].ports[0].secure);
2078 turn_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002079
2080 // invalid prefixes
2081 EXPECT_FALSE(ParseUrl("stunn:hostname"));
2082 EXPECT_FALSE(ParseUrl(":hostname"));
2083 EXPECT_FALSE(ParseUrl(":"));
2084 EXPECT_FALSE(ParseUrl(""));
2085}
2086
2087TEST_F(IceServerParsingTest, VerifyDefaults) {
2088 // TURNS defaults
2089 EXPECT_TRUE(ParseUrl("turns:hostname"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002090 EXPECT_EQ(1U, turn_servers_.size());
2091 EXPECT_EQ(5349, turn_servers_[0].ports[0].address.port());
2092 EXPECT_EQ(cricket::PROTO_TCP, turn_servers_[0].ports[0].proto);
2093 turn_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002094
2095 // TURN defaults
2096 EXPECT_TRUE(ParseUrl("turn:hostname"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002097 EXPECT_EQ(1U, turn_servers_.size());
2098 EXPECT_EQ(3478, turn_servers_[0].ports[0].address.port());
2099 EXPECT_EQ(cricket::PROTO_UDP, turn_servers_[0].ports[0].proto);
2100 turn_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002101
2102 // STUN defaults
2103 EXPECT_TRUE(ParseUrl("stun:hostname"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002104 EXPECT_EQ(1U, stun_servers_.size());
2105 EXPECT_EQ(3478, stun_servers_.begin()->port());
2106 stun_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002107}
2108
2109// Check that the 6 combinations of IPv4/IPv6/hostname and with/without port
2110// can be parsed correctly.
2111TEST_F(IceServerParsingTest, ParseHostnameAndPort) {
2112 EXPECT_TRUE(ParseUrl("stun:1.2.3.4:1234"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002113 EXPECT_EQ(1U, stun_servers_.size());
2114 EXPECT_EQ("1.2.3.4", stun_servers_.begin()->hostname());
2115 EXPECT_EQ(1234, stun_servers_.begin()->port());
2116 stun_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002117
2118 EXPECT_TRUE(ParseUrl("stun:[1:2:3:4:5:6:7:8]:4321"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002119 EXPECT_EQ(1U, stun_servers_.size());
2120 EXPECT_EQ("1:2:3:4:5:6:7:8", stun_servers_.begin()->hostname());
2121 EXPECT_EQ(4321, stun_servers_.begin()->port());
2122 stun_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002123
2124 EXPECT_TRUE(ParseUrl("stun:hostname:9999"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002125 EXPECT_EQ(1U, stun_servers_.size());
2126 EXPECT_EQ("hostname", stun_servers_.begin()->hostname());
2127 EXPECT_EQ(9999, stun_servers_.begin()->port());
2128 stun_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002129
2130 EXPECT_TRUE(ParseUrl("stun:1.2.3.4"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002131 EXPECT_EQ(1U, stun_servers_.size());
2132 EXPECT_EQ("1.2.3.4", stun_servers_.begin()->hostname());
2133 EXPECT_EQ(3478, stun_servers_.begin()->port());
2134 stun_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002135
2136 EXPECT_TRUE(ParseUrl("stun:[1:2:3:4:5:6:7:8]"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002137 EXPECT_EQ(1U, stun_servers_.size());
2138 EXPECT_EQ("1:2:3:4:5:6:7:8", stun_servers_.begin()->hostname());
2139 EXPECT_EQ(3478, stun_servers_.begin()->port());
2140 stun_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002141
2142 EXPECT_TRUE(ParseUrl("stun:hostname"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002143 EXPECT_EQ(1U, stun_servers_.size());
2144 EXPECT_EQ("hostname", stun_servers_.begin()->hostname());
2145 EXPECT_EQ(3478, stun_servers_.begin()->port());
2146 stun_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002147
2148 // Try some invalid hostname:port strings.
2149 EXPECT_FALSE(ParseUrl("stun:hostname:99a99"));
2150 EXPECT_FALSE(ParseUrl("stun:hostname:-1"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002151 EXPECT_FALSE(ParseUrl("stun:hostname:port:more"));
2152 EXPECT_FALSE(ParseUrl("stun:hostname:port more"));
deadbeef0a6c4ca2015-10-06 11:38:28 -07002153 EXPECT_FALSE(ParseUrl("stun:hostname:"));
2154 EXPECT_FALSE(ParseUrl("stun:[1:2:3:4:5:6:7:8]junk:1000"));
2155 EXPECT_FALSE(ParseUrl("stun::5555"));
2156 EXPECT_FALSE(ParseUrl("stun:"));
2157}
2158
2159// Test parsing the "?transport=xxx" part of the URL.
2160TEST_F(IceServerParsingTest, ParseTransport) {
2161 EXPECT_TRUE(ParseUrl("turn:hostname:1234?transport=tcp"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002162 EXPECT_EQ(1U, turn_servers_.size());
2163 EXPECT_EQ(cricket::PROTO_TCP, turn_servers_[0].ports[0].proto);
2164 turn_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002165
2166 EXPECT_TRUE(ParseUrl("turn:hostname?transport=udp"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002167 EXPECT_EQ(1U, turn_servers_.size());
2168 EXPECT_EQ(cricket::PROTO_UDP, turn_servers_[0].ports[0].proto);
2169 turn_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002170
2171 EXPECT_FALSE(ParseUrl("turn:hostname?transport=invalid"));
2172}
2173
2174// Test parsing ICE username contained in URL.
2175TEST_F(IceServerParsingTest, ParseUsername) {
2176 EXPECT_TRUE(ParseUrl("turn:user@hostname"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002177 EXPECT_EQ(1U, turn_servers_.size());
2178 EXPECT_EQ("user", turn_servers_[0].credentials.username);
2179 turn_servers_.clear();
deadbeef0a6c4ca2015-10-06 11:38:28 -07002180
2181 EXPECT_FALSE(ParseUrl("turn:@hostname"));
2182 EXPECT_FALSE(ParseUrl("turn:username@"));
2183 EXPECT_FALSE(ParseUrl("turn:@"));
2184 EXPECT_FALSE(ParseUrl("turn:user@name@hostname"));
2185}
2186
2187// Test that username and password from IceServer is copied into the resulting
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002188// RelayServerConfig.
deadbeef0a6c4ca2015-10-06 11:38:28 -07002189TEST_F(IceServerParsingTest, CopyUsernameAndPasswordFromIceServer) {
2190 EXPECT_TRUE(ParseUrl("turn:hostname", "username", "password"));
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002191 EXPECT_EQ(1U, turn_servers_.size());
2192 EXPECT_EQ("username", turn_servers_[0].credentials.username);
2193 EXPECT_EQ("password", turn_servers_[0].credentials.password);
deadbeef0a6c4ca2015-10-06 11:38:28 -07002194}
2195
2196// Ensure that if a server has multiple URLs, each one is parsed.
2197TEST_F(IceServerParsingTest, ParseMultipleUrls) {
2198 PeerConnectionInterface::IceServers servers;
2199 PeerConnectionInterface::IceServer server;
2200 server.urls.push_back("stun:hostname");
2201 server.urls.push_back("turn:hostname");
2202 servers.push_back(server);
Taylor Brandstetter0c7e9f52015-12-29 14:14:52 -08002203 EXPECT_TRUE(webrtc::ParseIceServers(servers, &stun_servers_, &turn_servers_));
2204 EXPECT_EQ(1U, stun_servers_.size());
2205 EXPECT_EQ(1U, turn_servers_.size());
deadbeef0a6c4ca2015-10-06 11:38:28 -07002206}
2207
Taylor Brandstetter893505d2016-01-07 15:12:48 -08002208// Ensure that TURN servers are given unique priorities,
2209// so that their resulting candidates have unique priorities.
2210TEST_F(IceServerParsingTest, TurnServerPrioritiesUnique) {
2211 PeerConnectionInterface::IceServers servers;
2212 PeerConnectionInterface::IceServer server;
2213 server.urls.push_back("turn:hostname");
2214 server.urls.push_back("turn:hostname2");
2215 servers.push_back(server);
2216 EXPECT_TRUE(webrtc::ParseIceServers(servers, &stun_servers_, &turn_servers_));
2217 EXPECT_EQ(2U, turn_servers_.size());
2218 EXPECT_NE(turn_servers_[0].priority, turn_servers_[1].priority);
2219}
2220
kjellander@webrtc.orgd1cfa712013-10-16 16:51:52 +00002221#endif // if !defined(THREAD_SANITIZER)
hta6b4f8392016-03-10 00:24:31 -08002222
2223} // namespace