blob: ddfa5a690740faed659a0e88ffcb8810d2a91eee [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"
Steve Anton94286cb2017-09-26 16:20:19 -070021#include "rtc_base/gunit.h"
22#include "rtc_base/ptr_util.h"
23
24namespace webrtc {
25
26namespace {
Steve Anton6f25b092017-10-23 09:39:20 -070027const uint32_t kDefaultTimeout = 10000U;
Steve Anton94286cb2017-09-26 16:20:19 -070028}
29
30PeerConnectionWrapper::PeerConnectionWrapper(
31 rtc::scoped_refptr<PeerConnectionFactoryInterface> pc_factory,
32 rtc::scoped_refptr<PeerConnectionInterface> pc,
33 std::unique_ptr<MockPeerConnectionObserver> observer)
Steve Anton8d3444d2017-10-20 15:30:51 -070034 : pc_factory_(pc_factory), observer_(std::move(observer)), pc_(pc) {
Steve Anton94286cb2017-09-26 16:20:19 -070035 RTC_DCHECK(pc_factory_);
36 RTC_DCHECK(pc_);
37 RTC_DCHECK(observer_);
38 observer_->SetPeerConnectionInterface(pc_.get());
39}
40
41PeerConnectionWrapper::~PeerConnectionWrapper() = default;
42
43PeerConnectionFactoryInterface* PeerConnectionWrapper::pc_factory() {
44 return pc_factory_.get();
45}
46
47PeerConnectionInterface* PeerConnectionWrapper::pc() {
48 return pc_.get();
49}
50
51MockPeerConnectionObserver* PeerConnectionWrapper::observer() {
52 return observer_.get();
53}
54
55std::unique_ptr<SessionDescriptionInterface>
56PeerConnectionWrapper::CreateOffer() {
57 return CreateOffer(PeerConnectionInterface::RTCOfferAnswerOptions());
58}
59
60std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateOffer(
Steve Anton8d3444d2017-10-20 15:30:51 -070061 const PeerConnectionInterface::RTCOfferAnswerOptions& options,
62 std::string* error_out) {
63 return CreateSdp(
64 [this, options](CreateSessionDescriptionObserver* observer) {
65 pc()->CreateOffer(observer, options);
66 },
67 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -070068}
69
70std::unique_ptr<SessionDescriptionInterface>
71PeerConnectionWrapper::CreateOfferAndSetAsLocal() {
Steve Anton8d3444d2017-10-20 15:30:51 -070072 return CreateOfferAndSetAsLocal(
73 PeerConnectionInterface::RTCOfferAnswerOptions());
74}
75
76std::unique_ptr<SessionDescriptionInterface>
77PeerConnectionWrapper::CreateOfferAndSetAsLocal(
78 const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
79 auto offer = CreateOffer(options);
Steve Anton94286cb2017-09-26 16:20:19 -070080 if (!offer) {
81 return nullptr;
82 }
83 EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(offer.get())));
84 return offer;
85}
86
87std::unique_ptr<SessionDescriptionInterface>
88PeerConnectionWrapper::CreateAnswer() {
89 return CreateAnswer(PeerConnectionInterface::RTCOfferAnswerOptions());
90}
91
92std::unique_ptr<SessionDescriptionInterface>
93PeerConnectionWrapper::CreateAnswer(
Steve Anton8d3444d2017-10-20 15:30:51 -070094 const PeerConnectionInterface::RTCOfferAnswerOptions& options,
95 std::string* error_out) {
96 return CreateSdp(
97 [this, options](CreateSessionDescriptionObserver* observer) {
98 pc()->CreateAnswer(observer, options);
99 },
100 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700101}
102
103std::unique_ptr<SessionDescriptionInterface>
104PeerConnectionWrapper::CreateAnswerAndSetAsLocal() {
Steve Anton8d3444d2017-10-20 15:30:51 -0700105 return CreateAnswerAndSetAsLocal(
106 PeerConnectionInterface::RTCOfferAnswerOptions());
107}
108
109std::unique_ptr<SessionDescriptionInterface>
110PeerConnectionWrapper::CreateAnswerAndSetAsLocal(
111 const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
112 auto answer = CreateAnswer(options);
Steve Anton94286cb2017-09-26 16:20:19 -0700113 if (!answer) {
114 return nullptr;
115 }
116 EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(answer.get())));
117 return answer;
118}
119
120std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateSdp(
Steve Anton8d3444d2017-10-20 15:30:51 -0700121 std::function<void(CreateSessionDescriptionObserver*)> fn,
122 std::string* error_out) {
Steve Anton94286cb2017-09-26 16:20:19 -0700123 rtc::scoped_refptr<MockCreateSessionDescriptionObserver> observer(
124 new rtc::RefCountedObject<MockCreateSessionDescriptionObserver>());
125 fn(observer);
Steve Anton6f25b092017-10-23 09:39:20 -0700126 EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
Steve Anton8d3444d2017-10-20 15:30:51 -0700127 if (error_out && !observer->result()) {
128 *error_out = observer->error();
129 }
Steve Anton94286cb2017-09-26 16:20:19 -0700130 return observer->MoveDescription();
131}
132
133bool PeerConnectionWrapper::SetLocalDescription(
Steve Anton8d3444d2017-10-20 15:30:51 -0700134 std::unique_ptr<SessionDescriptionInterface> desc,
135 std::string* error_out) {
136 return SetSdp(
137 [this, &desc](SetSessionDescriptionObserver* observer) {
138 pc()->SetLocalDescription(observer, desc.release());
139 },
140 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700141}
142
143bool PeerConnectionWrapper::SetRemoteDescription(
Steve Anton8d3444d2017-10-20 15:30:51 -0700144 std::unique_ptr<SessionDescriptionInterface> desc,
145 std::string* error_out) {
146 return SetSdp(
147 [this, &desc](SetSessionDescriptionObserver* observer) {
148 pc()->SetRemoteDescription(observer, desc.release());
149 },
150 error_out);
Steve Anton94286cb2017-09-26 16:20:19 -0700151}
152
153bool PeerConnectionWrapper::SetSdp(
Steve Anton8d3444d2017-10-20 15:30:51 -0700154 std::function<void(SetSessionDescriptionObserver*)> fn,
155 std::string* error_out) {
Steve Anton94286cb2017-09-26 16:20:19 -0700156 rtc::scoped_refptr<MockSetSessionDescriptionObserver> observer(
157 new rtc::RefCountedObject<MockSetSessionDescriptionObserver>());
158 fn(observer);
Steve Anton6f25b092017-10-23 09:39:20 -0700159 EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
Steve Anton8d3444d2017-10-20 15:30:51 -0700160 if (error_out && !observer->result()) {
161 *error_out = observer->error();
Steve Anton94286cb2017-09-26 16:20:19 -0700162 }
163 return observer->result();
164}
165
Steve Anton8d3444d2017-10-20 15:30:51 -0700166rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddAudioTrack(
167 const std::string& track_label,
168 std::vector<MediaStreamInterface*> streams) {
169 auto media_stream_track =
170 pc_factory()->CreateAudioTrack(track_label, nullptr);
171 return pc()->AddTrack(media_stream_track, streams);
Steve Anton94286cb2017-09-26 16:20:19 -0700172}
173
Steve Anton8d3444d2017-10-20 15:30:51 -0700174rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddVideoTrack(
175 const std::string& track_label,
176 std::vector<MediaStreamInterface*> streams) {
Steve Anton94286cb2017-09-26 16:20:19 -0700177 auto video_source = pc_factory()->CreateVideoSource(
178 rtc::MakeUnique<cricket::FakeVideoCapturer>());
Steve Anton8d3444d2017-10-20 15:30:51 -0700179 auto media_stream_track =
180 pc_factory()->CreateVideoTrack(track_label, video_source);
181 return pc()->AddTrack(media_stream_track, streams);
Steve Anton94286cb2017-09-26 16:20:19 -0700182}
183
Steve Anton8d3444d2017-10-20 15:30:51 -0700184PeerConnectionInterface::SignalingState
185PeerConnectionWrapper::signaling_state() {
186 return pc()->signaling_state();
Steve Anton94286cb2017-09-26 16:20:19 -0700187}
188
Steve Antonf1c6db12017-10-13 11:13:35 -0700189bool PeerConnectionWrapper::IsIceGatheringDone() {
Steve Anton6f25b092017-10-23 09:39:20 -0700190 return observer()->ice_gathering_complete_;
191}
192
193bool PeerConnectionWrapper::IsIceConnected() {
194 return observer()->ice_connected_;
195}
196
197rtc::scoped_refptr<const webrtc::RTCStatsReport>
198PeerConnectionWrapper::GetStats() {
199 rtc::scoped_refptr<webrtc::MockRTCStatsCollectorCallback> callback(
200 new rtc::RefCountedObject<webrtc::MockRTCStatsCollectorCallback>());
201 pc()->GetStats(callback);
202 EXPECT_TRUE_WAIT(callback->called(), kDefaultTimeout);
203 return callback->report();
Steve Antonf1c6db12017-10-13 11:13:35 -0700204}
205
Steve Anton94286cb2017-09-26 16:20:19 -0700206} // namespace webrtc