blob: c09258d13b5defaad509d3b0ef4b002477cf4684 [file] [log] [blame]
Steve Anton94286cb2017-09-26 16:20:19 -07001/*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * 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.
9 */
10
11#include "pc/peerconnectionwrapper.h"
12
13#include <memory>
14#include <string>
15#include <utility>
Steve Anton36b29d12017-10-30 09:57:42 -070016#include <vector>
Steve Anton94286cb2017-09-26 16:20:19 -070017
18#include "api/jsepsessiondescription.h"
19#include "media/base/fakevideocapturer.h"
Steve Anton97a9f762017-10-06 10:14:03 -070020#include "pc/sdputils.h"
Mirko Bonadei2a823102017-11-13 11:50:33 +010021#include "rtc_base/function_view.h"
Steve Anton94286cb2017-09-26 16:20:19 -070022#include "rtc_base/gunit.h"
23#include "rtc_base/ptr_util.h"
24
25namespace webrtc {
26
Steve Anton22da89f2018-01-25 13:58:07 -080027using RTCOfferAnswerOptions = PeerConnectionInterface::RTCOfferAnswerOptions;
28
Steve Anton94286cb2017-09-26 16:20:19 -070029namespace {
Steve Anton6f25b092017-10-23 09:39:20 -070030const uint32_t kDefaultTimeout = 10000U;
Steve Anton94286cb2017-09-26 16:20:19 -070031}
32
33PeerConnectionWrapper::PeerConnectionWrapper(
34 rtc::scoped_refptr<PeerConnectionFactoryInterface> pc_factory,
35 rtc::scoped_refptr<PeerConnectionInterface> pc,
36 std::unique_ptr<MockPeerConnectionObserver> observer)
Mirko Bonadei2a823102017-11-13 11:50:33 +010037 : pc_factory_(std::move(pc_factory)),
38 observer_(std::move(observer)),
39 pc_(std::move(pc)) {
Steve Anton94286cb2017-09-26 16:20:19 -070040 RTC_DCHECK(pc_factory_);
41 RTC_DCHECK(pc_);
42 RTC_DCHECK(observer_);
43 observer_->SetPeerConnectionInterface(pc_.get());
44}
45
46PeerConnectionWrapper::~PeerConnectionWrapper() = default;
47
48PeerConnectionFactoryInterface* PeerConnectionWrapper::pc_factory() {
49 return pc_factory_.get();
50}
51
52PeerConnectionInterface* PeerConnectionWrapper::pc() {
53 return pc_.get();
54}
55
56MockPeerConnectionObserver* PeerConnectionWrapper::observer() {
57 return observer_.get();
58}
59
60std::unique_ptr<SessionDescriptionInterface>
61PeerConnectionWrapper::CreateOffer() {
Steve Anton22da89f2018-01-25 13:58:07 -080062 return CreateOffer(RTCOfferAnswerOptions());
Steve Anton94286cb2017-09-26 16:20:19 -070063}
64
65std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateOffer(
Steve Anton8d3444d2017-10-20 15:30:51 -070066 const PeerConnectionInterface::RTCOfferAnswerOptions& options,
67 std::string* error_out) {
68 return CreateSdp(
69 [this, options](CreateSessionDescriptionObserver* observer) {
70 pc()->CreateOffer(observer, options);
71 },
72 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -070073}
74
75std::unique_ptr<SessionDescriptionInterface>
76PeerConnectionWrapper::CreateOfferAndSetAsLocal() {
Steve Anton22da89f2018-01-25 13:58:07 -080077 return CreateOfferAndSetAsLocal(RTCOfferAnswerOptions());
Steve Anton8d3444d2017-10-20 15:30:51 -070078}
79
80std::unique_ptr<SessionDescriptionInterface>
81PeerConnectionWrapper::CreateOfferAndSetAsLocal(
82 const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
83 auto offer = CreateOffer(options);
Steve Anton94286cb2017-09-26 16:20:19 -070084 if (!offer) {
85 return nullptr;
86 }
87 EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(offer.get())));
88 return offer;
89}
90
91std::unique_ptr<SessionDescriptionInterface>
92PeerConnectionWrapper::CreateAnswer() {
Steve Anton22da89f2018-01-25 13:58:07 -080093 return CreateAnswer(RTCOfferAnswerOptions());
Steve Anton94286cb2017-09-26 16:20:19 -070094}
95
96std::unique_ptr<SessionDescriptionInterface>
97PeerConnectionWrapper::CreateAnswer(
Steve Anton8d3444d2017-10-20 15:30:51 -070098 const PeerConnectionInterface::RTCOfferAnswerOptions& options,
99 std::string* error_out) {
100 return CreateSdp(
101 [this, options](CreateSessionDescriptionObserver* observer) {
102 pc()->CreateAnswer(observer, options);
103 },
104 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700105}
106
107std::unique_ptr<SessionDescriptionInterface>
108PeerConnectionWrapper::CreateAnswerAndSetAsLocal() {
Steve Anton22da89f2018-01-25 13:58:07 -0800109 return CreateAnswerAndSetAsLocal(RTCOfferAnswerOptions());
Steve Anton8d3444d2017-10-20 15:30:51 -0700110}
111
112std::unique_ptr<SessionDescriptionInterface>
113PeerConnectionWrapper::CreateAnswerAndSetAsLocal(
114 const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
115 auto answer = CreateAnswer(options);
Steve Anton94286cb2017-09-26 16:20:19 -0700116 if (!answer) {
117 return nullptr;
118 }
119 EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(answer.get())));
120 return answer;
121}
122
123std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateSdp(
Mirko Bonadei2a823102017-11-13 11:50:33 +0100124 rtc::FunctionView<void(CreateSessionDescriptionObserver*)> fn,
Steve Anton8d3444d2017-10-20 15:30:51 -0700125 std::string* error_out) {
Steve Anton94286cb2017-09-26 16:20:19 -0700126 rtc::scoped_refptr<MockCreateSessionDescriptionObserver> observer(
127 new rtc::RefCountedObject<MockCreateSessionDescriptionObserver>());
128 fn(observer);
Steve Anton6f25b092017-10-23 09:39:20 -0700129 EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
Steve Anton8d3444d2017-10-20 15:30:51 -0700130 if (error_out && !observer->result()) {
131 *error_out = observer->error();
132 }
Steve Anton94286cb2017-09-26 16:20:19 -0700133 return observer->MoveDescription();
134}
135
136bool PeerConnectionWrapper::SetLocalDescription(
Steve Anton8d3444d2017-10-20 15:30:51 -0700137 std::unique_ptr<SessionDescriptionInterface> desc,
138 std::string* error_out) {
139 return SetSdp(
140 [this, &desc](SetSessionDescriptionObserver* observer) {
141 pc()->SetLocalDescription(observer, desc.release());
142 },
143 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700144}
145
146bool PeerConnectionWrapper::SetRemoteDescription(
Steve Anton8d3444d2017-10-20 15:30:51 -0700147 std::unique_ptr<SessionDescriptionInterface> desc,
148 std::string* error_out) {
149 return SetSdp(
150 [this, &desc](SetSessionDescriptionObserver* observer) {
151 pc()->SetRemoteDescription(observer, desc.release());
152 },
153 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700154}
155
Henrik Boström31638672017-11-23 17:48:32 +0100156bool PeerConnectionWrapper::SetRemoteDescription(
157 std::unique_ptr<SessionDescriptionInterface> desc,
158 RTCError* error_out) {
159 rtc::scoped_refptr<MockSetRemoteDescriptionObserver> observer =
160 new MockSetRemoteDescriptionObserver();
161 pc()->SetRemoteDescription(std::move(desc), observer);
162 EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
163 bool ok = observer->error().ok();
164 if (error_out)
165 *error_out = std::move(observer->error());
166 return ok;
167}
168
Steve Anton94286cb2017-09-26 16:20:19 -0700169bool PeerConnectionWrapper::SetSdp(
Mirko Bonadei2a823102017-11-13 11:50:33 +0100170 rtc::FunctionView<void(SetSessionDescriptionObserver*)> fn,
Steve Anton8d3444d2017-10-20 15:30:51 -0700171 std::string* error_out) {
Steve Anton94286cb2017-09-26 16:20:19 -0700172 rtc::scoped_refptr<MockSetSessionDescriptionObserver> observer(
173 new rtc::RefCountedObject<MockSetSessionDescriptionObserver>());
174 fn(observer);
Steve Anton6f25b092017-10-23 09:39:20 -0700175 EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
Steve Anton8d3444d2017-10-20 15:30:51 -0700176 if (error_out && !observer->result()) {
177 *error_out = observer->error();
Steve Anton94286cb2017-09-26 16:20:19 -0700178 }
179 return observer->result();
180}
181
Steve Antondcc3c022017-12-22 16:02:54 -0800182bool PeerConnectionWrapper::ExchangeOfferAnswerWith(
183 PeerConnectionWrapper* answerer) {
Steve Anton22da89f2018-01-25 13:58:07 -0800184 return ExchangeOfferAnswerWith(answerer, RTCOfferAnswerOptions(),
185 RTCOfferAnswerOptions());
186}
187
188bool PeerConnectionWrapper::ExchangeOfferAnswerWith(
189 PeerConnectionWrapper* answerer,
190 const PeerConnectionInterface::RTCOfferAnswerOptions& offer_options,
191 const PeerConnectionInterface::RTCOfferAnswerOptions& answer_options) {
Steve Antondcc3c022017-12-22 16:02:54 -0800192 RTC_DCHECK(answerer);
193 if (answerer == this) {
194 RTC_LOG(LS_ERROR) << "Cannot exchange offer/answer with ourself!";
195 return false;
196 }
Steve Anton22da89f2018-01-25 13:58:07 -0800197 auto offer = CreateOffer(offer_options);
Steve Antondcc3c022017-12-22 16:02:54 -0800198 EXPECT_TRUE(offer);
199 if (!offer) {
200 return false;
201 }
202 bool set_local_offer =
203 SetLocalDescription(CloneSessionDescription(offer.get()));
204 EXPECT_TRUE(set_local_offer);
205 if (!set_local_offer) {
206 return false;
207 }
208 bool set_remote_offer = answerer->SetRemoteDescription(std::move(offer));
209 EXPECT_TRUE(set_remote_offer);
210 if (!set_remote_offer) {
211 return false;
212 }
Steve Anton22da89f2018-01-25 13:58:07 -0800213 auto answer = answerer->CreateAnswer(answer_options);
Steve Antondcc3c022017-12-22 16:02:54 -0800214 EXPECT_TRUE(answer);
215 if (!answer) {
216 return false;
217 }
218 bool set_local_answer =
219 answerer->SetLocalDescription(CloneSessionDescription(answer.get()));
220 EXPECT_TRUE(set_local_answer);
221 if (!set_local_answer) {
222 return false;
223 }
224 bool set_remote_answer = SetRemoteDescription(std::move(answer));
225 EXPECT_TRUE(set_remote_answer);
226 return set_remote_answer;
227}
228
Steve Anton9158ef62017-11-27 13:01:52 -0800229rtc::scoped_refptr<RtpTransceiverInterface>
230PeerConnectionWrapper::AddTransceiver(cricket::MediaType media_type) {
231 RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
232 pc()->AddTransceiver(media_type);
233 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
234 return result.MoveValue();
235}
236
237rtc::scoped_refptr<RtpTransceiverInterface>
238PeerConnectionWrapper::AddTransceiver(cricket::MediaType media_type,
239 const RtpTransceiverInit& init) {
240 RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
241 pc()->AddTransceiver(media_type, init);
242 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
243 return result.MoveValue();
244}
245
246rtc::scoped_refptr<RtpTransceiverInterface>
247PeerConnectionWrapper::AddTransceiver(
248 rtc::scoped_refptr<MediaStreamTrackInterface> track) {
249 RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
250 pc()->AddTransceiver(track);
251 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
252 return result.MoveValue();
253}
254
255rtc::scoped_refptr<RtpTransceiverInterface>
256PeerConnectionWrapper::AddTransceiver(
257 rtc::scoped_refptr<MediaStreamTrackInterface> track,
258 const RtpTransceiverInit& init) {
259 RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
260 pc()->AddTransceiver(track, init);
261 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
262 return result.MoveValue();
263}
264
265rtc::scoped_refptr<AudioTrackInterface> PeerConnectionWrapper::CreateAudioTrack(
266 const std::string& label) {
267 return pc_factory()->CreateAudioTrack(label, nullptr);
268}
269
270rtc::scoped_refptr<VideoTrackInterface> PeerConnectionWrapper::CreateVideoTrack(
271 const std::string& label) {
272 auto video_source = pc_factory()->CreateVideoSource(
273 rtc::MakeUnique<cricket::FakeVideoCapturer>());
274 return pc_factory()->CreateVideoTrack(label, video_source);
275}
276
Steve Anton2d6c76a2018-01-05 17:10:52 -0800277rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddTrack(
278 rtc::scoped_refptr<MediaStreamTrackInterface> track,
279 const std::vector<std::string>& stream_labels) {
280 RTCErrorOr<rtc::scoped_refptr<RtpSenderInterface>> result =
281 pc()->AddTrack(track, stream_labels);
282 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
283 return result.MoveValue();
284}
285
Steve Anton8d3444d2017-10-20 15:30:51 -0700286rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddAudioTrack(
287 const std::string& track_label,
Steve Antonef65ef12018-01-10 17:15:20 -0800288 const std::vector<std::string>& stream_labels) {
289 return AddTrack(CreateAudioTrack(track_label), stream_labels);
Steve Anton94286cb2017-09-26 16:20:19 -0700290}
291
Steve Anton8d3444d2017-10-20 15:30:51 -0700292rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddVideoTrack(
293 const std::string& track_label,
Steve Antonef65ef12018-01-10 17:15:20 -0800294 const std::vector<std::string>& stream_labels) {
295 return AddTrack(CreateVideoTrack(track_label), stream_labels);
Steve Anton94286cb2017-09-26 16:20:19 -0700296}
297
Steve Antonfa2260d2017-12-28 16:38:23 -0800298rtc::scoped_refptr<DataChannelInterface>
299PeerConnectionWrapper::CreateDataChannel(const std::string& label) {
300 return pc()->CreateDataChannel(label, nullptr);
301}
302
Steve Anton8d3444d2017-10-20 15:30:51 -0700303PeerConnectionInterface::SignalingState
304PeerConnectionWrapper::signaling_state() {
305 return pc()->signaling_state();
Steve Anton94286cb2017-09-26 16:20:19 -0700306}
307
Steve Antonf1c6db12017-10-13 11:13:35 -0700308bool PeerConnectionWrapper::IsIceGatheringDone() {
Steve Anton6f25b092017-10-23 09:39:20 -0700309 return observer()->ice_gathering_complete_;
310}
311
312bool PeerConnectionWrapper::IsIceConnected() {
313 return observer()->ice_connected_;
314}
315
316rtc::scoped_refptr<const webrtc::RTCStatsReport>
317PeerConnectionWrapper::GetStats() {
318 rtc::scoped_refptr<webrtc::MockRTCStatsCollectorCallback> callback(
319 new rtc::RefCountedObject<webrtc::MockRTCStatsCollectorCallback>());
320 pc()->GetStats(callback);
321 EXPECT_TRUE_WAIT(callback->called(), kDefaultTimeout);
322 return callback->report();
Steve Antonf1c6db12017-10-13 11:13:35 -0700323}
324
Steve Anton94286cb2017-09-26 16:20:19 -0700325} // namespace webrtc