blob: 7c0b3391d0932f325972310cdfc8c663558f589c [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
Steve Anton10542f22019-01-11 09:11:00 -080011#include "pc/peer_connection_wrapper.h"
Steve Anton94286cb2017-09-26 16:20:19 -070012
Yves Gerey3e707812018-11-28 16:47:49 +010013#include <stdint.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020014
Steve Anton94286cb2017-09-26 16:20:19 -070015#include <memory>
16#include <string>
17#include <utility>
Steve Anton36b29d12017-10-30 09:57:42 -070018#include <vector>
Steve Anton94286cb2017-09-26 16:20:19 -070019
Artem Titov741daaf2019-03-21 14:37:36 +010020#include "api/function_view.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "api/set_remote_description_observer_interface.h"
22#include "pc/sdp_utils.h"
23#include "pc/test/fake_video_track_source.h"
Yves Gerey3e707812018-11-28 16:47:49 +010024#include "rtc_base/checks.h"
Steve Anton94286cb2017-09-26 16:20:19 -070025#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010026#include "rtc_base/logging.h"
Steve Anton10542f22019-01-11 09:11:00 -080027#include "rtc_base/ref_counted_object.h"
Yves Gerey3e707812018-11-28 16:47:49 +010028#include "test/gtest.h"
Steve Anton94286cb2017-09-26 16:20:19 -070029
30namespace webrtc {
31
Steve Anton22da89f2018-01-25 13:58:07 -080032using RTCOfferAnswerOptions = PeerConnectionInterface::RTCOfferAnswerOptions;
33
Steve Anton94286cb2017-09-26 16:20:19 -070034namespace {
Steve Anton6f25b092017-10-23 09:39:20 -070035const uint32_t kDefaultTimeout = 10000U;
Steve Anton94286cb2017-09-26 16:20:19 -070036}
37
38PeerConnectionWrapper::PeerConnectionWrapper(
39 rtc::scoped_refptr<PeerConnectionFactoryInterface> pc_factory,
40 rtc::scoped_refptr<PeerConnectionInterface> pc,
41 std::unique_ptr<MockPeerConnectionObserver> observer)
Mirko Bonadei2a823102017-11-13 11:50:33 +010042 : pc_factory_(std::move(pc_factory)),
43 observer_(std::move(observer)),
44 pc_(std::move(pc)) {
Steve Anton94286cb2017-09-26 16:20:19 -070045 RTC_DCHECK(pc_factory_);
46 RTC_DCHECK(pc_);
47 RTC_DCHECK(observer_);
48 observer_->SetPeerConnectionInterface(pc_.get());
49}
50
51PeerConnectionWrapper::~PeerConnectionWrapper() = default;
52
53PeerConnectionFactoryInterface* PeerConnectionWrapper::pc_factory() {
54 return pc_factory_.get();
55}
56
57PeerConnectionInterface* PeerConnectionWrapper::pc() {
58 return pc_.get();
59}
60
61MockPeerConnectionObserver* PeerConnectionWrapper::observer() {
62 return observer_.get();
63}
64
65std::unique_ptr<SessionDescriptionInterface>
66PeerConnectionWrapper::CreateOffer() {
Steve Anton22da89f2018-01-25 13:58:07 -080067 return CreateOffer(RTCOfferAnswerOptions());
Steve Anton94286cb2017-09-26 16:20:19 -070068}
69
70std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateOffer(
Steve Anton8d3444d2017-10-20 15:30:51 -070071 const PeerConnectionInterface::RTCOfferAnswerOptions& options,
72 std::string* error_out) {
73 return CreateSdp(
74 [this, options](CreateSessionDescriptionObserver* observer) {
75 pc()->CreateOffer(observer, options);
76 },
77 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -070078}
79
80std::unique_ptr<SessionDescriptionInterface>
81PeerConnectionWrapper::CreateOfferAndSetAsLocal() {
Steve Anton22da89f2018-01-25 13:58:07 -080082 return CreateOfferAndSetAsLocal(RTCOfferAnswerOptions());
Steve Anton8d3444d2017-10-20 15:30:51 -070083}
84
85std::unique_ptr<SessionDescriptionInterface>
86PeerConnectionWrapper::CreateOfferAndSetAsLocal(
87 const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
88 auto offer = CreateOffer(options);
Steve Anton94286cb2017-09-26 16:20:19 -070089 if (!offer) {
90 return nullptr;
91 }
92 EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(offer.get())));
93 return offer;
94}
95
96std::unique_ptr<SessionDescriptionInterface>
97PeerConnectionWrapper::CreateAnswer() {
Steve Anton22da89f2018-01-25 13:58:07 -080098 return CreateAnswer(RTCOfferAnswerOptions());
Steve Anton94286cb2017-09-26 16:20:19 -070099}
100
101std::unique_ptr<SessionDescriptionInterface>
102PeerConnectionWrapper::CreateAnswer(
Steve Anton8d3444d2017-10-20 15:30:51 -0700103 const PeerConnectionInterface::RTCOfferAnswerOptions& options,
104 std::string* error_out) {
105 return CreateSdp(
106 [this, options](CreateSessionDescriptionObserver* observer) {
107 pc()->CreateAnswer(observer, options);
108 },
109 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700110}
111
112std::unique_ptr<SessionDescriptionInterface>
113PeerConnectionWrapper::CreateAnswerAndSetAsLocal() {
Steve Anton22da89f2018-01-25 13:58:07 -0800114 return CreateAnswerAndSetAsLocal(RTCOfferAnswerOptions());
Steve Anton8d3444d2017-10-20 15:30:51 -0700115}
116
117std::unique_ptr<SessionDescriptionInterface>
118PeerConnectionWrapper::CreateAnswerAndSetAsLocal(
119 const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
120 auto answer = CreateAnswer(options);
Steve Anton94286cb2017-09-26 16:20:19 -0700121 if (!answer) {
122 return nullptr;
123 }
124 EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(answer.get())));
125 return answer;
126}
127
Eldar Rello5ab79e62019-10-09 18:29:44 +0300128std::unique_ptr<SessionDescriptionInterface>
129PeerConnectionWrapper::CreateRollback() {
130 return CreateSessionDescription(SdpType::kRollback, "");
131}
132
Steve Anton94286cb2017-09-26 16:20:19 -0700133std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateSdp(
Mirko Bonadei2a823102017-11-13 11:50:33 +0100134 rtc::FunctionView<void(CreateSessionDescriptionObserver*)> fn,
Steve Anton8d3444d2017-10-20 15:30:51 -0700135 std::string* error_out) {
Steve Anton94286cb2017-09-26 16:20:19 -0700136 rtc::scoped_refptr<MockCreateSessionDescriptionObserver> observer(
137 new rtc::RefCountedObject<MockCreateSessionDescriptionObserver>());
138 fn(observer);
Steve Anton6f25b092017-10-23 09:39:20 -0700139 EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
Steve Anton8d3444d2017-10-20 15:30:51 -0700140 if (error_out && !observer->result()) {
141 *error_out = observer->error();
142 }
Steve Anton94286cb2017-09-26 16:20:19 -0700143 return observer->MoveDescription();
144}
145
146bool PeerConnectionWrapper::SetLocalDescription(
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()->SetLocalDescription(observer, desc.release());
152 },
153 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700154}
155
156bool PeerConnectionWrapper::SetRemoteDescription(
Steve Anton8d3444d2017-10-20 15:30:51 -0700157 std::unique_ptr<SessionDescriptionInterface> desc,
158 std::string* error_out) {
159 return SetSdp(
160 [this, &desc](SetSessionDescriptionObserver* observer) {
161 pc()->SetRemoteDescription(observer, desc.release());
162 },
163 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700164}
165
Henrik Boström31638672017-11-23 17:48:32 +0100166bool PeerConnectionWrapper::SetRemoteDescription(
167 std::unique_ptr<SessionDescriptionInterface> desc,
168 RTCError* error_out) {
169 rtc::scoped_refptr<MockSetRemoteDescriptionObserver> observer =
170 new MockSetRemoteDescriptionObserver();
171 pc()->SetRemoteDescription(std::move(desc), observer);
172 EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
173 bool ok = observer->error().ok();
174 if (error_out)
175 *error_out = std::move(observer->error());
176 return ok;
177}
178
Steve Anton94286cb2017-09-26 16:20:19 -0700179bool PeerConnectionWrapper::SetSdp(
Mirko Bonadei2a823102017-11-13 11:50:33 +0100180 rtc::FunctionView<void(SetSessionDescriptionObserver*)> fn,
Steve Anton8d3444d2017-10-20 15:30:51 -0700181 std::string* error_out) {
Steve Anton94286cb2017-09-26 16:20:19 -0700182 rtc::scoped_refptr<MockSetSessionDescriptionObserver> observer(
183 new rtc::RefCountedObject<MockSetSessionDescriptionObserver>());
184 fn(observer);
Steve Anton6f25b092017-10-23 09:39:20 -0700185 EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
Steve Anton8d3444d2017-10-20 15:30:51 -0700186 if (error_out && !observer->result()) {
187 *error_out = observer->error();
Steve Anton94286cb2017-09-26 16:20:19 -0700188 }
189 return observer->result();
190}
191
Steve Antondcc3c022017-12-22 16:02:54 -0800192bool PeerConnectionWrapper::ExchangeOfferAnswerWith(
193 PeerConnectionWrapper* answerer) {
Steve Anton22da89f2018-01-25 13:58:07 -0800194 return ExchangeOfferAnswerWith(answerer, RTCOfferAnswerOptions(),
195 RTCOfferAnswerOptions());
196}
197
198bool PeerConnectionWrapper::ExchangeOfferAnswerWith(
199 PeerConnectionWrapper* answerer,
200 const PeerConnectionInterface::RTCOfferAnswerOptions& offer_options,
201 const PeerConnectionInterface::RTCOfferAnswerOptions& answer_options) {
Steve Antondcc3c022017-12-22 16:02:54 -0800202 RTC_DCHECK(answerer);
203 if (answerer == this) {
204 RTC_LOG(LS_ERROR) << "Cannot exchange offer/answer with ourself!";
205 return false;
206 }
Steve Anton22da89f2018-01-25 13:58:07 -0800207 auto offer = CreateOffer(offer_options);
Steve Antondcc3c022017-12-22 16:02:54 -0800208 EXPECT_TRUE(offer);
209 if (!offer) {
210 return false;
211 }
212 bool set_local_offer =
213 SetLocalDescription(CloneSessionDescription(offer.get()));
214 EXPECT_TRUE(set_local_offer);
215 if (!set_local_offer) {
216 return false;
217 }
218 bool set_remote_offer = answerer->SetRemoteDescription(std::move(offer));
219 EXPECT_TRUE(set_remote_offer);
220 if (!set_remote_offer) {
221 return false;
222 }
Steve Anton22da89f2018-01-25 13:58:07 -0800223 auto answer = answerer->CreateAnswer(answer_options);
Steve Antondcc3c022017-12-22 16:02:54 -0800224 EXPECT_TRUE(answer);
225 if (!answer) {
226 return false;
227 }
228 bool set_local_answer =
229 answerer->SetLocalDescription(CloneSessionDescription(answer.get()));
230 EXPECT_TRUE(set_local_answer);
231 if (!set_local_answer) {
232 return false;
233 }
234 bool set_remote_answer = SetRemoteDescription(std::move(answer));
235 EXPECT_TRUE(set_remote_answer);
236 return set_remote_answer;
237}
238
Steve Anton9158ef62017-11-27 13:01:52 -0800239rtc::scoped_refptr<RtpTransceiverInterface>
240PeerConnectionWrapper::AddTransceiver(cricket::MediaType media_type) {
241 RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
242 pc()->AddTransceiver(media_type);
243 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
244 return result.MoveValue();
245}
246
247rtc::scoped_refptr<RtpTransceiverInterface>
248PeerConnectionWrapper::AddTransceiver(cricket::MediaType media_type,
249 const RtpTransceiverInit& init) {
250 RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
251 pc()->AddTransceiver(media_type, init);
252 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
253 return result.MoveValue();
254}
255
256rtc::scoped_refptr<RtpTransceiverInterface>
257PeerConnectionWrapper::AddTransceiver(
258 rtc::scoped_refptr<MediaStreamTrackInterface> track) {
259 RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
260 pc()->AddTransceiver(track);
261 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
262 return result.MoveValue();
263}
264
265rtc::scoped_refptr<RtpTransceiverInterface>
266PeerConnectionWrapper::AddTransceiver(
267 rtc::scoped_refptr<MediaStreamTrackInterface> track,
268 const RtpTransceiverInit& init) {
269 RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
270 pc()->AddTransceiver(track, init);
271 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
272 return result.MoveValue();
273}
274
275rtc::scoped_refptr<AudioTrackInterface> PeerConnectionWrapper::CreateAudioTrack(
276 const std::string& label) {
277 return pc_factory()->CreateAudioTrack(label, nullptr);
278}
279
280rtc::scoped_refptr<VideoTrackInterface> PeerConnectionWrapper::CreateVideoTrack(
281 const std::string& label) {
Niels Möllere8ae5df2018-05-29 09:13:57 +0200282 return pc_factory()->CreateVideoTrack(label, FakeVideoTrackSource::Create());
Steve Anton9158ef62017-11-27 13:01:52 -0800283}
284
Steve Anton2d6c76a2018-01-05 17:10:52 -0800285rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddTrack(
286 rtc::scoped_refptr<MediaStreamTrackInterface> track,
Seth Hampson845e8782018-03-02 11:34:10 -0800287 const std::vector<std::string>& stream_ids) {
Steve Anton2d6c76a2018-01-05 17:10:52 -0800288 RTCErrorOr<rtc::scoped_refptr<RtpSenderInterface>> result =
Seth Hampson845e8782018-03-02 11:34:10 -0800289 pc()->AddTrack(track, stream_ids);
Steve Anton2d6c76a2018-01-05 17:10:52 -0800290 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
291 return result.MoveValue();
292}
293
Steve Anton8d3444d2017-10-20 15:30:51 -0700294rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddAudioTrack(
295 const std::string& track_label,
Seth Hampson845e8782018-03-02 11:34:10 -0800296 const std::vector<std::string>& stream_ids) {
297 return AddTrack(CreateAudioTrack(track_label), stream_ids);
Steve Anton94286cb2017-09-26 16:20:19 -0700298}
299
Steve Anton8d3444d2017-10-20 15:30:51 -0700300rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddVideoTrack(
301 const std::string& track_label,
Seth Hampson845e8782018-03-02 11:34:10 -0800302 const std::vector<std::string>& stream_ids) {
303 return AddTrack(CreateVideoTrack(track_label), stream_ids);
Steve Anton94286cb2017-09-26 16:20:19 -0700304}
305
Steve Antonfa2260d2017-12-28 16:38:23 -0800306rtc::scoped_refptr<DataChannelInterface>
307PeerConnectionWrapper::CreateDataChannel(const std::string& label) {
308 return pc()->CreateDataChannel(label, nullptr);
309}
310
Steve Anton8d3444d2017-10-20 15:30:51 -0700311PeerConnectionInterface::SignalingState
312PeerConnectionWrapper::signaling_state() {
313 return pc()->signaling_state();
Steve Anton94286cb2017-09-26 16:20:19 -0700314}
315
Steve Antonf1c6db12017-10-13 11:13:35 -0700316bool PeerConnectionWrapper::IsIceGatheringDone() {
Steve Anton6f25b092017-10-23 09:39:20 -0700317 return observer()->ice_gathering_complete_;
318}
319
320bool PeerConnectionWrapper::IsIceConnected() {
321 return observer()->ice_connected_;
322}
323
324rtc::scoped_refptr<const webrtc::RTCStatsReport>
325PeerConnectionWrapper::GetStats() {
326 rtc::scoped_refptr<webrtc::MockRTCStatsCollectorCallback> callback(
327 new rtc::RefCountedObject<webrtc::MockRTCStatsCollectorCallback>());
328 pc()->GetStats(callback);
329 EXPECT_TRUE_WAIT(callback->called(), kDefaultTimeout);
330 return callback->report();
Steve Antonf1c6db12017-10-13 11:13:35 -0700331}
332
Steve Anton94286cb2017-09-26 16:20:19 -0700333} // namespace webrtc