blob: 7379aec5952fb11d30d014dbb2ad912d3171701d [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 {
26const uint32_t kWaitTimeout = 10000U;
27}
28
29PeerConnectionWrapper::PeerConnectionWrapper(
30 rtc::scoped_refptr<PeerConnectionFactoryInterface> pc_factory,
31 rtc::scoped_refptr<PeerConnectionInterface> pc,
32 std::unique_ptr<MockPeerConnectionObserver> observer)
33 : pc_factory_(pc_factory), pc_(pc), observer_(std::move(observer)) {
34 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(
60 const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
61 return CreateSdp([this, options](CreateSessionDescriptionObserver* observer) {
62 pc()->CreateOffer(observer, options);
63 });
64}
65
66std::unique_ptr<SessionDescriptionInterface>
67PeerConnectionWrapper::CreateOfferAndSetAsLocal() {
68 auto offer = CreateOffer();
69 if (!offer) {
70 return nullptr;
71 }
72 EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(offer.get())));
73 return offer;
74}
75
76std::unique_ptr<SessionDescriptionInterface>
77PeerConnectionWrapper::CreateAnswer() {
78 return CreateAnswer(PeerConnectionInterface::RTCOfferAnswerOptions());
79}
80
81std::unique_ptr<SessionDescriptionInterface>
82PeerConnectionWrapper::CreateAnswer(
83 const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
84 return CreateSdp([this, options](CreateSessionDescriptionObserver* observer) {
85 pc()->CreateAnswer(observer, options);
86 });
87}
88
89std::unique_ptr<SessionDescriptionInterface>
90PeerConnectionWrapper::CreateAnswerAndSetAsLocal() {
91 auto answer = CreateAnswer();
92 if (!answer) {
93 return nullptr;
94 }
95 EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(answer.get())));
96 return answer;
97}
98
99std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateSdp(
100 std::function<void(CreateSessionDescriptionObserver*)> fn) {
101 rtc::scoped_refptr<MockCreateSessionDescriptionObserver> observer(
102 new rtc::RefCountedObject<MockCreateSessionDescriptionObserver>());
103 fn(observer);
104 EXPECT_EQ_WAIT(true, observer->called(), kWaitTimeout);
105 return observer->MoveDescription();
106}
107
108bool PeerConnectionWrapper::SetLocalDescription(
109 std::unique_ptr<SessionDescriptionInterface> desc) {
110 return SetSdp([this, &desc](SetSessionDescriptionObserver* observer) {
111 pc()->SetLocalDescription(observer, desc.release());
112 });
113}
114
115bool PeerConnectionWrapper::SetRemoteDescription(
116 std::unique_ptr<SessionDescriptionInterface> desc) {
117 return SetSdp([this, &desc](SetSessionDescriptionObserver* observer) {
118 pc()->SetRemoteDescription(observer, desc.release());
119 });
120}
121
122bool PeerConnectionWrapper::SetSdp(
123 std::function<void(SetSessionDescriptionObserver*)> fn) {
124 rtc::scoped_refptr<MockSetSessionDescriptionObserver> observer(
125 new rtc::RefCountedObject<MockSetSessionDescriptionObserver>());
126 fn(observer);
127 if (pc()->signaling_state() != PeerConnectionInterface::kClosed) {
128 EXPECT_EQ_WAIT(true, observer->called(), kWaitTimeout);
129 }
130 return observer->result();
131}
132
Steve Anton94286cb2017-09-26 16:20:19 -0700133void PeerConnectionWrapper::AddAudioStream(const std::string& stream_label,
134 const std::string& track_label) {
135 auto stream = pc_factory()->CreateLocalMediaStream(stream_label);
136 auto audio_track = pc_factory()->CreateAudioTrack(track_label, nullptr);
137 EXPECT_TRUE(pc()->AddTrack(audio_track, {stream}));
138 EXPECT_TRUE_WAIT(observer()->renegotiation_needed_, kWaitTimeout);
139 observer()->renegotiation_needed_ = false;
140}
141
142void PeerConnectionWrapper::AddVideoStream(const std::string& stream_label,
143 const std::string& track_label) {
144 auto stream = pc_factory()->CreateLocalMediaStream(stream_label);
145 auto video_source = pc_factory()->CreateVideoSource(
146 rtc::MakeUnique<cricket::FakeVideoCapturer>());
147 auto video_track = pc_factory()->CreateVideoTrack(track_label, video_source);
148 EXPECT_TRUE(pc()->AddTrack(video_track, {stream}));
149 EXPECT_TRUE_WAIT(observer()->renegotiation_needed_, kWaitTimeout);
150 observer()->renegotiation_needed_ = false;
151}
152
153void PeerConnectionWrapper::AddAudioVideoStream(
154 const std::string& stream_label,
155 const std::string& audio_track_label,
156 const std::string& video_track_label) {
157 auto stream = pc_factory()->CreateLocalMediaStream(stream_label);
158 auto audio_track = pc_factory()->CreateAudioTrack(audio_track_label, nullptr);
159 EXPECT_TRUE(pc()->AddTrack(audio_track, {stream}));
160 auto video_source = pc_factory()->CreateVideoSource(
161 rtc::MakeUnique<cricket::FakeVideoCapturer>());
162 auto video_track =
163 pc_factory()->CreateVideoTrack(video_track_label, video_source);
164 EXPECT_TRUE(pc()->AddTrack(video_track, {stream}));
165 EXPECT_TRUE_WAIT(observer()->renegotiation_needed_, kWaitTimeout);
166 observer()->renegotiation_needed_ = false;
167}
168
169} // namespace webrtc