blob: b4b07823f7f069f9a7b2c92444d8dcaf5b6ec48d [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
128std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateSdp(
Mirko Bonadei2a823102017-11-13 11:50:33 +0100129 rtc::FunctionView<void(CreateSessionDescriptionObserver*)> fn,
Steve Anton8d3444d2017-10-20 15:30:51 -0700130 std::string* error_out) {
Steve Anton94286cb2017-09-26 16:20:19 -0700131 rtc::scoped_refptr<MockCreateSessionDescriptionObserver> observer(
132 new rtc::RefCountedObject<MockCreateSessionDescriptionObserver>());
133 fn(observer);
Steve Anton6f25b092017-10-23 09:39:20 -0700134 EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
Steve Anton8d3444d2017-10-20 15:30:51 -0700135 if (error_out && !observer->result()) {
136 *error_out = observer->error();
137 }
Steve Anton94286cb2017-09-26 16:20:19 -0700138 return observer->MoveDescription();
139}
140
141bool PeerConnectionWrapper::SetLocalDescription(
Steve Anton8d3444d2017-10-20 15:30:51 -0700142 std::unique_ptr<SessionDescriptionInterface> desc,
143 std::string* error_out) {
144 return SetSdp(
145 [this, &desc](SetSessionDescriptionObserver* observer) {
146 pc()->SetLocalDescription(observer, desc.release());
147 },
148 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700149}
150
151bool PeerConnectionWrapper::SetRemoteDescription(
Steve Anton8d3444d2017-10-20 15:30:51 -0700152 std::unique_ptr<SessionDescriptionInterface> desc,
153 std::string* error_out) {
154 return SetSdp(
155 [this, &desc](SetSessionDescriptionObserver* observer) {
156 pc()->SetRemoteDescription(observer, desc.release());
157 },
158 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700159}
160
Henrik Boström31638672017-11-23 17:48:32 +0100161bool PeerConnectionWrapper::SetRemoteDescription(
162 std::unique_ptr<SessionDescriptionInterface> desc,
163 RTCError* error_out) {
164 rtc::scoped_refptr<MockSetRemoteDescriptionObserver> observer =
165 new MockSetRemoteDescriptionObserver();
166 pc()->SetRemoteDescription(std::move(desc), observer);
167 EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
168 bool ok = observer->error().ok();
169 if (error_out)
170 *error_out = std::move(observer->error());
171 return ok;
172}
173
Steve Anton94286cb2017-09-26 16:20:19 -0700174bool PeerConnectionWrapper::SetSdp(
Mirko Bonadei2a823102017-11-13 11:50:33 +0100175 rtc::FunctionView<void(SetSessionDescriptionObserver*)> fn,
Steve Anton8d3444d2017-10-20 15:30:51 -0700176 std::string* error_out) {
Steve Anton94286cb2017-09-26 16:20:19 -0700177 rtc::scoped_refptr<MockSetSessionDescriptionObserver> observer(
178 new rtc::RefCountedObject<MockSetSessionDescriptionObserver>());
179 fn(observer);
Steve Anton6f25b092017-10-23 09:39:20 -0700180 EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
Steve Anton8d3444d2017-10-20 15:30:51 -0700181 if (error_out && !observer->result()) {
182 *error_out = observer->error();
Steve Anton94286cb2017-09-26 16:20:19 -0700183 }
184 return observer->result();
185}
186
Steve Antondcc3c022017-12-22 16:02:54 -0800187bool PeerConnectionWrapper::ExchangeOfferAnswerWith(
188 PeerConnectionWrapper* answerer) {
Steve Anton22da89f2018-01-25 13:58:07 -0800189 return ExchangeOfferAnswerWith(answerer, RTCOfferAnswerOptions(),
190 RTCOfferAnswerOptions());
191}
192
193bool PeerConnectionWrapper::ExchangeOfferAnswerWith(
194 PeerConnectionWrapper* answerer,
195 const PeerConnectionInterface::RTCOfferAnswerOptions& offer_options,
196 const PeerConnectionInterface::RTCOfferAnswerOptions& answer_options) {
Steve Antondcc3c022017-12-22 16:02:54 -0800197 RTC_DCHECK(answerer);
198 if (answerer == this) {
199 RTC_LOG(LS_ERROR) << "Cannot exchange offer/answer with ourself!";
200 return false;
201 }
Steve Anton22da89f2018-01-25 13:58:07 -0800202 auto offer = CreateOffer(offer_options);
Steve Antondcc3c022017-12-22 16:02:54 -0800203 EXPECT_TRUE(offer);
204 if (!offer) {
205 return false;
206 }
207 bool set_local_offer =
208 SetLocalDescription(CloneSessionDescription(offer.get()));
209 EXPECT_TRUE(set_local_offer);
210 if (!set_local_offer) {
211 return false;
212 }
213 bool set_remote_offer = answerer->SetRemoteDescription(std::move(offer));
214 EXPECT_TRUE(set_remote_offer);
215 if (!set_remote_offer) {
216 return false;
217 }
Steve Anton22da89f2018-01-25 13:58:07 -0800218 auto answer = answerer->CreateAnswer(answer_options);
Steve Antondcc3c022017-12-22 16:02:54 -0800219 EXPECT_TRUE(answer);
220 if (!answer) {
221 return false;
222 }
223 bool set_local_answer =
224 answerer->SetLocalDescription(CloneSessionDescription(answer.get()));
225 EXPECT_TRUE(set_local_answer);
226 if (!set_local_answer) {
227 return false;
228 }
229 bool set_remote_answer = SetRemoteDescription(std::move(answer));
230 EXPECT_TRUE(set_remote_answer);
231 return set_remote_answer;
232}
233
Steve Anton9158ef62017-11-27 13:01:52 -0800234rtc::scoped_refptr<RtpTransceiverInterface>
235PeerConnectionWrapper::AddTransceiver(cricket::MediaType media_type) {
236 RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
237 pc()->AddTransceiver(media_type);
238 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
239 return result.MoveValue();
240}
241
242rtc::scoped_refptr<RtpTransceiverInterface>
243PeerConnectionWrapper::AddTransceiver(cricket::MediaType media_type,
244 const RtpTransceiverInit& init) {
245 RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
246 pc()->AddTransceiver(media_type, init);
247 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
248 return result.MoveValue();
249}
250
251rtc::scoped_refptr<RtpTransceiverInterface>
252PeerConnectionWrapper::AddTransceiver(
253 rtc::scoped_refptr<MediaStreamTrackInterface> track) {
254 RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
255 pc()->AddTransceiver(track);
256 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
257 return result.MoveValue();
258}
259
260rtc::scoped_refptr<RtpTransceiverInterface>
261PeerConnectionWrapper::AddTransceiver(
262 rtc::scoped_refptr<MediaStreamTrackInterface> track,
263 const RtpTransceiverInit& init) {
264 RTCErrorOr<rtc::scoped_refptr<RtpTransceiverInterface>> result =
265 pc()->AddTransceiver(track, init);
266 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
267 return result.MoveValue();
268}
269
270rtc::scoped_refptr<AudioTrackInterface> PeerConnectionWrapper::CreateAudioTrack(
271 const std::string& label) {
272 return pc_factory()->CreateAudioTrack(label, nullptr);
273}
274
275rtc::scoped_refptr<VideoTrackInterface> PeerConnectionWrapper::CreateVideoTrack(
276 const std::string& label) {
Niels Möllere8ae5df2018-05-29 09:13:57 +0200277 return pc_factory()->CreateVideoTrack(label, FakeVideoTrackSource::Create());
Steve Anton9158ef62017-11-27 13:01:52 -0800278}
279
Steve Anton2d6c76a2018-01-05 17:10:52 -0800280rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddTrack(
281 rtc::scoped_refptr<MediaStreamTrackInterface> track,
Seth Hampson845e8782018-03-02 11:34:10 -0800282 const std::vector<std::string>& stream_ids) {
Steve Anton2d6c76a2018-01-05 17:10:52 -0800283 RTCErrorOr<rtc::scoped_refptr<RtpSenderInterface>> result =
Seth Hampson845e8782018-03-02 11:34:10 -0800284 pc()->AddTrack(track, stream_ids);
Steve Anton2d6c76a2018-01-05 17:10:52 -0800285 EXPECT_EQ(RTCErrorType::NONE, result.error().type());
286 return result.MoveValue();
287}
288
Steve Anton8d3444d2017-10-20 15:30:51 -0700289rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddAudioTrack(
290 const std::string& track_label,
Seth Hampson845e8782018-03-02 11:34:10 -0800291 const std::vector<std::string>& stream_ids) {
292 return AddTrack(CreateAudioTrack(track_label), stream_ids);
Steve Anton94286cb2017-09-26 16:20:19 -0700293}
294
Steve Anton8d3444d2017-10-20 15:30:51 -0700295rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddVideoTrack(
296 const std::string& track_label,
Seth Hampson845e8782018-03-02 11:34:10 -0800297 const std::vector<std::string>& stream_ids) {
298 return AddTrack(CreateVideoTrack(track_label), stream_ids);
Steve Anton94286cb2017-09-26 16:20:19 -0700299}
300
Steve Antonfa2260d2017-12-28 16:38:23 -0800301rtc::scoped_refptr<DataChannelInterface>
302PeerConnectionWrapper::CreateDataChannel(const std::string& label) {
303 return pc()->CreateDataChannel(label, nullptr);
304}
305
Steve Anton8d3444d2017-10-20 15:30:51 -0700306PeerConnectionInterface::SignalingState
307PeerConnectionWrapper::signaling_state() {
308 return pc()->signaling_state();
Steve Anton94286cb2017-09-26 16:20:19 -0700309}
310
Steve Antonf1c6db12017-10-13 11:13:35 -0700311bool PeerConnectionWrapper::IsIceGatheringDone() {
Steve Anton6f25b092017-10-23 09:39:20 -0700312 return observer()->ice_gathering_complete_;
313}
314
315bool PeerConnectionWrapper::IsIceConnected() {
316 return observer()->ice_connected_;
317}
318
319rtc::scoped_refptr<const webrtc::RTCStatsReport>
320PeerConnectionWrapper::GetStats() {
321 rtc::scoped_refptr<webrtc::MockRTCStatsCollectorCallback> callback(
322 new rtc::RefCountedObject<webrtc::MockRTCStatsCollectorCallback>());
323 pc()->GetStats(callback);
324 EXPECT_TRUE_WAIT(callback->called(), kDefaultTimeout);
325 return callback->report();
Steve Antonf1c6db12017-10-13 11:13:35 -0700326}
327
Steve Anton94286cb2017-09-26 16:20:19 -0700328} // namespace webrtc