This lays the groundwork for splitting up the PeerConnectionInterface unit tests into multiple files so that the tests can be organized better. The intent is for each unit test file to declare a test fixture which subclasses PeerConnectionUnitTestFixture and creates PeerConnectionWrappers to write assertions against. Bug: webrtc:8222 Change-Id: I21175b1e1828a6cd5012305a8a27faaf4eecf81c Reviewed-on: https://webrtc-review.googlesource.com/1120 Commit-Queue: Steve Anton <steveanton@webrtc.org> Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org> Cr-Commit-Position: refs/heads/master@{#20004}
179 lines
6.3 KiB
C++
179 lines
6.3 KiB
C++
/*
|
|
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "pc/peerconnectionwrapper.h"
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
#include "api/jsepsessiondescription.h"
|
|
#include "media/base/fakevideocapturer.h"
|
|
#include "rtc_base/gunit.h"
|
|
#include "rtc_base/ptr_util.h"
|
|
|
|
namespace webrtc {
|
|
|
|
namespace {
|
|
const uint32_t kWaitTimeout = 10000U;
|
|
}
|
|
|
|
PeerConnectionWrapper::PeerConnectionWrapper(
|
|
rtc::scoped_refptr<PeerConnectionFactoryInterface> pc_factory,
|
|
rtc::scoped_refptr<PeerConnectionInterface> pc,
|
|
std::unique_ptr<MockPeerConnectionObserver> observer)
|
|
: pc_factory_(pc_factory), pc_(pc), observer_(std::move(observer)) {
|
|
RTC_DCHECK(pc_factory_);
|
|
RTC_DCHECK(pc_);
|
|
RTC_DCHECK(observer_);
|
|
observer_->SetPeerConnectionInterface(pc_.get());
|
|
}
|
|
|
|
PeerConnectionWrapper::~PeerConnectionWrapper() = default;
|
|
|
|
PeerConnectionFactoryInterface* PeerConnectionWrapper::pc_factory() {
|
|
return pc_factory_.get();
|
|
}
|
|
|
|
PeerConnectionInterface* PeerConnectionWrapper::pc() {
|
|
return pc_.get();
|
|
}
|
|
|
|
MockPeerConnectionObserver* PeerConnectionWrapper::observer() {
|
|
return observer_.get();
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface>
|
|
PeerConnectionWrapper::CreateOffer() {
|
|
return CreateOffer(PeerConnectionInterface::RTCOfferAnswerOptions());
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateOffer(
|
|
const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
|
|
return CreateSdp([this, options](CreateSessionDescriptionObserver* observer) {
|
|
pc()->CreateOffer(observer, options);
|
|
});
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface>
|
|
PeerConnectionWrapper::CreateOfferAndSetAsLocal() {
|
|
auto offer = CreateOffer();
|
|
if (!offer) {
|
|
return nullptr;
|
|
}
|
|
EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(offer.get())));
|
|
return offer;
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface>
|
|
PeerConnectionWrapper::CreateAnswer() {
|
|
return CreateAnswer(PeerConnectionInterface::RTCOfferAnswerOptions());
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface>
|
|
PeerConnectionWrapper::CreateAnswer(
|
|
const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
|
|
return CreateSdp([this, options](CreateSessionDescriptionObserver* observer) {
|
|
pc()->CreateAnswer(observer, options);
|
|
});
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface>
|
|
PeerConnectionWrapper::CreateAnswerAndSetAsLocal() {
|
|
auto answer = CreateAnswer();
|
|
if (!answer) {
|
|
return nullptr;
|
|
}
|
|
EXPECT_TRUE(SetLocalDescription(CloneSessionDescription(answer.get())));
|
|
return answer;
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface> PeerConnectionWrapper::CreateSdp(
|
|
std::function<void(CreateSessionDescriptionObserver*)> fn) {
|
|
rtc::scoped_refptr<MockCreateSessionDescriptionObserver> observer(
|
|
new rtc::RefCountedObject<MockCreateSessionDescriptionObserver>());
|
|
fn(observer);
|
|
EXPECT_EQ_WAIT(true, observer->called(), kWaitTimeout);
|
|
return observer->MoveDescription();
|
|
}
|
|
|
|
bool PeerConnectionWrapper::SetLocalDescription(
|
|
std::unique_ptr<SessionDescriptionInterface> desc) {
|
|
return SetSdp([this, &desc](SetSessionDescriptionObserver* observer) {
|
|
pc()->SetLocalDescription(observer, desc.release());
|
|
});
|
|
}
|
|
|
|
bool PeerConnectionWrapper::SetRemoteDescription(
|
|
std::unique_ptr<SessionDescriptionInterface> desc) {
|
|
return SetSdp([this, &desc](SetSessionDescriptionObserver* observer) {
|
|
pc()->SetRemoteDescription(observer, desc.release());
|
|
});
|
|
}
|
|
|
|
bool PeerConnectionWrapper::SetSdp(
|
|
std::function<void(SetSessionDescriptionObserver*)> fn) {
|
|
rtc::scoped_refptr<MockSetSessionDescriptionObserver> observer(
|
|
new rtc::RefCountedObject<MockSetSessionDescriptionObserver>());
|
|
fn(observer);
|
|
if (pc()->signaling_state() != PeerConnectionInterface::kClosed) {
|
|
EXPECT_EQ_WAIT(true, observer->called(), kWaitTimeout);
|
|
}
|
|
return observer->result();
|
|
}
|
|
|
|
std::unique_ptr<SessionDescriptionInterface>
|
|
PeerConnectionWrapper::CloneSessionDescription(
|
|
const SessionDescriptionInterface* desc) {
|
|
std::unique_ptr<JsepSessionDescription> clone(
|
|
new JsepSessionDescription(desc->type()));
|
|
RTC_DCHECK(clone->Initialize(desc->description()->Copy(), desc->session_id(),
|
|
desc->session_version()));
|
|
return clone;
|
|
}
|
|
|
|
void PeerConnectionWrapper::AddAudioStream(const std::string& stream_label,
|
|
const std::string& track_label) {
|
|
auto stream = pc_factory()->CreateLocalMediaStream(stream_label);
|
|
auto audio_track = pc_factory()->CreateAudioTrack(track_label, nullptr);
|
|
EXPECT_TRUE(pc()->AddTrack(audio_track, {stream}));
|
|
EXPECT_TRUE_WAIT(observer()->renegotiation_needed_, kWaitTimeout);
|
|
observer()->renegotiation_needed_ = false;
|
|
}
|
|
|
|
void PeerConnectionWrapper::AddVideoStream(const std::string& stream_label,
|
|
const std::string& track_label) {
|
|
auto stream = pc_factory()->CreateLocalMediaStream(stream_label);
|
|
auto video_source = pc_factory()->CreateVideoSource(
|
|
rtc::MakeUnique<cricket::FakeVideoCapturer>());
|
|
auto video_track = pc_factory()->CreateVideoTrack(track_label, video_source);
|
|
EXPECT_TRUE(pc()->AddTrack(video_track, {stream}));
|
|
EXPECT_TRUE_WAIT(observer()->renegotiation_needed_, kWaitTimeout);
|
|
observer()->renegotiation_needed_ = false;
|
|
}
|
|
|
|
void PeerConnectionWrapper::AddAudioVideoStream(
|
|
const std::string& stream_label,
|
|
const std::string& audio_track_label,
|
|
const std::string& video_track_label) {
|
|
auto stream = pc_factory()->CreateLocalMediaStream(stream_label);
|
|
auto audio_track = pc_factory()->CreateAudioTrack(audio_track_label, nullptr);
|
|
EXPECT_TRUE(pc()->AddTrack(audio_track, {stream}));
|
|
auto video_source = pc_factory()->CreateVideoSource(
|
|
rtc::MakeUnique<cricket::FakeVideoCapturer>());
|
|
auto video_track =
|
|
pc_factory()->CreateVideoTrack(video_track_label, video_source);
|
|
EXPECT_TRUE(pc()->AddTrack(video_track, {stream}));
|
|
EXPECT_TRUE_WAIT(observer()->renegotiation_needed_, kWaitTimeout);
|
|
observer()->renegotiation_needed_ = false;
|
|
}
|
|
|
|
} // namespace webrtc
|