blob: 9be93096a39852ad1e36ab0ede5d25b2e942d492 [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>
16
17#include "api/jsepsessiondescription.h"
18#include "media/base/fakevideocapturer.h"
Steve Anton97a9f762017-10-06 10:14:03 -070019#include "pc/sdputils.h"
Steve Anton94286cb2017-09-26 16:20:19 -070020#include "rtc_base/gunit.h"
21#include "rtc_base/ptr_util.h"
22
23namespace webrtc {
24
25namespace {
Olga Sharonovab49b6612017-10-20 12:56:51 +000026const uint32_t kWaitTimeout = 10000U;
Steve Anton94286cb2017-09-26 16:20:19 -070027}
28
29PeerConnectionWrapper::PeerConnectionWrapper(
30 rtc::scoped_refptr<PeerConnectionFactoryInterface> pc_factory,
31 rtc::scoped_refptr<PeerConnectionInterface> pc,
32 std::unique_ptr<MockPeerConnectionObserver> observer)
Steve Anton8d3444d2017-10-20 15:30:51 -070033 : pc_factory_(pc_factory), observer_(std::move(observer)), pc_(pc) {
Steve Anton94286cb2017-09-26 16:20:19 -070034 RTC_DCHECK(pc_factory_);
35 RTC_DCHECK(pc_);
36 RTC_DCHECK(observer_);
37 observer_->SetPeerConnectionInterface(pc_.get());
38}
39
40PeerConnectionWrapper::~PeerConnectionWrapper() = default;
41
42PeerConnectionFactoryInterface* PeerConnectionWrapper::pc_factory() {
43 return pc_factory_.get();
44}
45
46PeerConnectionInterface* PeerConnectionWrapper::pc() {
47 return pc_.get();
48}
49
50MockPeerConnectionObserver* PeerConnectionWrapper::observer() {
51 return observer_.get();
52}
53
54std::unique_ptr<SessionDescriptionInterface>
55PeerConnectionWrapper::CreateOffer() {
56 return CreateOffer(PeerConnectionInterface::RTCOfferAnswerOptions());
57}
58
59std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateOffer(
Steve Anton8d3444d2017-10-20 15:30:51 -070060 const PeerConnectionInterface::RTCOfferAnswerOptions& options,
61 std::string* error_out) {
62 return CreateSdp(
63 [this, options](CreateSessionDescriptionObserver* observer) {
64 pc()->CreateOffer(observer, options);
65 },
66 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -070067}
68
69std::unique_ptr<SessionDescriptionInterface>
70PeerConnectionWrapper::CreateOfferAndSetAsLocal() {
Steve Anton8d3444d2017-10-20 15:30:51 -070071 return CreateOfferAndSetAsLocal(
72 PeerConnectionInterface::RTCOfferAnswerOptions());
73}
74
75std::unique_ptr<SessionDescriptionInterface>
76PeerConnectionWrapper::CreateOfferAndSetAsLocal(
77 const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
78 auto offer = CreateOffer(options);
Steve Anton94286cb2017-09-26 16:20:19 -070079 if (!offer) {
80 return nullptr;
81 }
82 EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(offer.get())));
83 return offer;
84}
85
86std::unique_ptr<SessionDescriptionInterface>
87PeerConnectionWrapper::CreateAnswer() {
88 return CreateAnswer(PeerConnectionInterface::RTCOfferAnswerOptions());
89}
90
91std::unique_ptr<SessionDescriptionInterface>
92PeerConnectionWrapper::CreateAnswer(
Steve Anton8d3444d2017-10-20 15:30:51 -070093 const PeerConnectionInterface::RTCOfferAnswerOptions& options,
94 std::string* error_out) {
95 return CreateSdp(
96 [this, options](CreateSessionDescriptionObserver* observer) {
97 pc()->CreateAnswer(observer, options);
98 },
99 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700100}
101
102std::unique_ptr<SessionDescriptionInterface>
103PeerConnectionWrapper::CreateAnswerAndSetAsLocal() {
Steve Anton8d3444d2017-10-20 15:30:51 -0700104 return CreateAnswerAndSetAsLocal(
105 PeerConnectionInterface::RTCOfferAnswerOptions());
106}
107
108std::unique_ptr<SessionDescriptionInterface>
109PeerConnectionWrapper::CreateAnswerAndSetAsLocal(
110 const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
111 auto answer = CreateAnswer(options);
Steve Anton94286cb2017-09-26 16:20:19 -0700112 if (!answer) {
113 return nullptr;
114 }
115 EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(answer.get())));
116 return answer;
117}
118
119std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateSdp(
Steve Anton8d3444d2017-10-20 15:30:51 -0700120 std::function<void(CreateSessionDescriptionObserver*)> fn,
121 std::string* error_out) {
Steve Anton94286cb2017-09-26 16:20:19 -0700122 rtc::scoped_refptr<MockCreateSessionDescriptionObserver> observer(
123 new rtc::RefCountedObject<MockCreateSessionDescriptionObserver>());
124 fn(observer);
Olga Sharonovab49b6612017-10-20 12:56:51 +0000125 EXPECT_EQ_WAIT(true, observer->called(), kWaitTimeout);
Steve Anton8d3444d2017-10-20 15:30:51 -0700126 if (error_out && !observer->result()) {
127 *error_out = observer->error();
128 }
Steve Anton94286cb2017-09-26 16:20:19 -0700129 return observer->MoveDescription();
130}
131
132bool PeerConnectionWrapper::SetLocalDescription(
Steve Anton8d3444d2017-10-20 15:30:51 -0700133 std::unique_ptr<SessionDescriptionInterface> desc,
134 std::string* error_out) {
135 return SetSdp(
136 [this, &desc](SetSessionDescriptionObserver* observer) {
137 pc()->SetLocalDescription(observer, desc.release());
138 },
139 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700140}
141
142bool PeerConnectionWrapper::SetRemoteDescription(
Steve Anton8d3444d2017-10-20 15:30:51 -0700143 std::unique_ptr<SessionDescriptionInterface> desc,
144 std::string* error_out) {
145 return SetSdp(
146 [this, &desc](SetSessionDescriptionObserver* observer) {
147 pc()->SetRemoteDescription(observer, desc.release());
148 },
149 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700150}
151
152bool PeerConnectionWrapper::SetSdp(
Steve Anton8d3444d2017-10-20 15:30:51 -0700153 std::function<void(SetSessionDescriptionObserver*)> fn,
154 std::string* error_out) {
Steve Anton94286cb2017-09-26 16:20:19 -0700155 rtc::scoped_refptr<MockSetSessionDescriptionObserver> observer(
156 new rtc::RefCountedObject<MockSetSessionDescriptionObserver>());
157 fn(observer);
Steve Anton8d3444d2017-10-20 15:30:51 -0700158 EXPECT_EQ_WAIT(true, observer->called(), kWaitTimeout);
159 if (error_out && !observer->result()) {
160 *error_out = observer->error();
Steve Anton94286cb2017-09-26 16:20:19 -0700161 }
162 return observer->result();
163}
164
Steve Anton8d3444d2017-10-20 15:30:51 -0700165rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddAudioTrack(
166 const std::string& track_label,
167 std::vector<MediaStreamInterface*> streams) {
168 auto media_stream_track =
169 pc_factory()->CreateAudioTrack(track_label, nullptr);
170 return pc()->AddTrack(media_stream_track, streams);
Steve Anton94286cb2017-09-26 16:20:19 -0700171}
172
Steve Anton8d3444d2017-10-20 15:30:51 -0700173rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddVideoTrack(
174 const std::string& track_label,
175 std::vector<MediaStreamInterface*> streams) {
Steve Anton94286cb2017-09-26 16:20:19 -0700176 auto video_source = pc_factory()->CreateVideoSource(
177 rtc::MakeUnique<cricket::FakeVideoCapturer>());
Steve Anton8d3444d2017-10-20 15:30:51 -0700178 auto media_stream_track =
179 pc_factory()->CreateVideoTrack(track_label, video_source);
180 return pc()->AddTrack(media_stream_track, streams);
Steve Anton94286cb2017-09-26 16:20:19 -0700181}
182
Steve Anton8d3444d2017-10-20 15:30:51 -0700183PeerConnectionInterface::SignalingState
184PeerConnectionWrapper::signaling_state() {
185 return pc()->signaling_state();
Steve Anton94286cb2017-09-26 16:20:19 -0700186}
187
Steve Antonf1c6db12017-10-13 11:13:35 -0700188bool PeerConnectionWrapper::IsIceGatheringDone() {
Olga Sharonovab49b6612017-10-20 12:56:51 +0000189 return observer()->ice_complete_;
Steve Antonf1c6db12017-10-13 11:13:35 -0700190}
191
Steve Anton94286cb2017-09-26 16:20:19 -0700192} // namespace webrtc