1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/renderer/media/mock_peer_connection_impl.h"
9 #include "base/logging.h"
10 #include "content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h"
13 using webrtc::AudioTrackInterface;
14 using webrtc::CreateSessionDescriptionObserver;
15 using webrtc::DtmfSenderInterface;
16 using webrtc::DtmfSenderObserverInterface;
17 using webrtc::IceCandidateInterface;
18 using webrtc::MediaConstraintsInterface;
19 using webrtc::MediaStreamInterface;
20 using webrtc::PeerConnectionInterface;
21 using webrtc::SessionDescriptionInterface;
22 using webrtc::SetSessionDescriptionObserver;
26 class MockStreamCollection : public webrtc::StreamCollectionInterface {
28 size_t count() override { return streams_.size(); }
29 MediaStreamInterface* at(size_t index) override { return streams_[index]; }
30 MediaStreamInterface* find(const std::string& label) override {
31 for (size_t i = 0; i < streams_.size(); ++i) {
32 if (streams_[i]->label() == label)
37 webrtc::MediaStreamTrackInterface* FindAudioTrack(
38 const std::string& id) override {
39 for (size_t i = 0; i < streams_.size(); ++i) {
40 webrtc::MediaStreamTrackInterface* track =
41 streams_.at(i)->FindAudioTrack(id);
47 webrtc::MediaStreamTrackInterface* FindVideoTrack(
48 const std::string& id) override {
49 for (size_t i = 0; i < streams_.size(); ++i) {
50 webrtc::MediaStreamTrackInterface* track =
51 streams_.at(i)->FindVideoTrack(id);
57 void AddStream(MediaStreamInterface* stream) {
58 streams_.push_back(stream);
60 void RemoveStream(MediaStreamInterface* stream) {
61 StreamVector::iterator it = streams_.begin();
62 for (; it != streams_.end(); ++it) {
63 if (it->get() == stream) {
71 ~MockStreamCollection() override {}
74 typedef std::vector<rtc::scoped_refptr<MediaStreamInterface> >
76 StreamVector streams_;
79 class MockDataChannel : public webrtc::DataChannelInterface {
81 MockDataChannel(const std::string& label,
82 const webrtc::DataChannelInit* config)
84 reliable_(config->reliable),
85 state_(webrtc::DataChannelInterface::kConnecting),
89 void RegisterObserver(webrtc::DataChannelObserver* observer) override {}
91 void UnregisterObserver() override {}
93 std::string label() const override { return label_; }
95 bool reliable() const override { return reliable_; }
97 bool ordered() const override { return config_.ordered; }
99 unsigned short maxRetransmitTime() const override {
100 return config_.maxRetransmitTime;
103 unsigned short maxRetransmits() const override {
104 return config_.maxRetransmits;
107 std::string protocol() const override { return config_.protocol; }
109 bool negotiated() const override { return config_.negotiated; }
111 int id() const override {
116 DataState state() const override { return state_; }
118 uint64 buffered_amount() const override {
123 void Close() override { state_ = webrtc::DataChannelInterface::kClosing; }
125 bool Send(const webrtc::DataBuffer& buffer) override {
126 return state_ == webrtc::DataChannelInterface::kOpen;
130 ~MockDataChannel() override {}
135 webrtc::DataChannelInterface::DataState state_;
136 webrtc::DataChannelInit config_;
139 class MockDtmfSender : public DtmfSenderInterface {
141 explicit MockDtmfSender(AudioTrackInterface* track)
145 inter_tone_gap_(0) {}
146 void RegisterObserver(DtmfSenderObserverInterface* observer) override {
147 observer_ = observer;
149 void UnregisterObserver() override { observer_ = NULL; }
150 bool CanInsertDtmf() override { return true; }
151 bool InsertDtmf(const std::string& tones,
153 int inter_tone_gap) override {
155 duration_ = duration;
156 inter_tone_gap_ = inter_tone_gap;
159 const AudioTrackInterface* track() const override { return track_.get(); }
160 std::string tones() const override { return tones_; }
161 int duration() const override { return duration_; }
162 int inter_tone_gap() const override { return inter_tone_gap_; }
165 ~MockDtmfSender() override {}
168 rtc::scoped_refptr<AudioTrackInterface> track_;
169 DtmfSenderObserverInterface* observer_;
175 const char MockPeerConnectionImpl::kDummyOffer[] = "dummy offer";
176 const char MockPeerConnectionImpl::kDummyAnswer[] = "dummy answer";
178 MockPeerConnectionImpl::MockPeerConnectionImpl(
179 MockPeerConnectionDependencyFactory* factory,
180 webrtc::PeerConnectionObserver* observer)
181 : dependency_factory_(factory),
182 local_streams_(new rtc::RefCountedObject<MockStreamCollection>),
183 remote_streams_(new rtc::RefCountedObject<MockStreamCollection>),
186 getstats_result_(true),
187 sdp_mline_index_(-1),
188 observer_(observer) {
189 ON_CALL(*this, SetLocalDescription(_, _)).WillByDefault(testing::Invoke(
190 this, &MockPeerConnectionImpl::SetLocalDescriptionWorker));
191 ON_CALL(*this, SetRemoteDescription(_, _)).WillByDefault(testing::Invoke(
192 this, &MockPeerConnectionImpl::SetRemoteDescriptionWorker));
195 MockPeerConnectionImpl::~MockPeerConnectionImpl() {}
197 rtc::scoped_refptr<webrtc::StreamCollectionInterface>
198 MockPeerConnectionImpl::local_streams() {
199 return local_streams_;
202 rtc::scoped_refptr<webrtc::StreamCollectionInterface>
203 MockPeerConnectionImpl::remote_streams() {
204 return remote_streams_;
207 bool MockPeerConnectionImpl::AddStream(MediaStreamInterface* local_stream) {
208 DCHECK(stream_label_.empty());
209 stream_label_ = local_stream->label();
210 local_streams_->AddStream(local_stream);
214 void MockPeerConnectionImpl::RemoveStream(
215 MediaStreamInterface* local_stream) {
216 DCHECK_EQ(stream_label_, local_stream->label());
217 stream_label_.clear();
218 local_streams_->RemoveStream(local_stream);
221 rtc::scoped_refptr<DtmfSenderInterface>
222 MockPeerConnectionImpl::CreateDtmfSender(AudioTrackInterface* track) {
226 return new rtc::RefCountedObject<MockDtmfSender>(track);
229 rtc::scoped_refptr<webrtc::DataChannelInterface>
230 MockPeerConnectionImpl::CreateDataChannel(const std::string& label,
231 const webrtc::DataChannelInit* config) {
232 return new rtc::RefCountedObject<MockDataChannel>(label, config);
235 bool MockPeerConnectionImpl::GetStats(
236 webrtc::StatsObserver* observer,
237 webrtc::MediaStreamTrackInterface* track,
238 StatsOutputLevel level) {
239 if (!getstats_result_)
242 DCHECK_EQ(kStatsOutputLevelStandard, level);
243 webrtc::StatsReport report1, report2;
245 report1.type = "ssrc";
246 report1.timestamp = 42;
247 report1.values.push_back(
248 webrtc::StatsReport::Value(
249 webrtc::StatsReport::kStatsValueNameFingerprint,
252 webrtc::StatsReports reports;
253 reports.push_back(&report1);
255 // If selector is given, we pass back one report.
256 // If selector is not given, we pass back two.
258 report2.id = "nontrack";
259 report2.type = "generic";
260 report2.timestamp = 44;
261 report2.values.push_back(
262 webrtc::StatsReport::Value(
263 webrtc::StatsReport::kStatsValueNameFingerprintAlgorithm,
265 reports.push_back(&report2);
268 // Note that the callback is synchronous, not asynchronous; it will
269 // happen before the request call completes.
270 observer->OnComplete(reports);
275 const webrtc::SessionDescriptionInterface*
276 MockPeerConnectionImpl::local_description() const {
277 return local_desc_.get();
280 const webrtc::SessionDescriptionInterface*
281 MockPeerConnectionImpl::remote_description() const {
282 return remote_desc_.get();
285 void MockPeerConnectionImpl::AddRemoteStream(MediaStreamInterface* stream) {
286 remote_streams_->AddStream(stream);
289 void MockPeerConnectionImpl::CreateOffer(
290 CreateSessionDescriptionObserver* observer,
291 const MediaConstraintsInterface* constraints) {
293 created_sessiondescription_.reset(
294 dependency_factory_->CreateSessionDescription("unknown", kDummyOffer,
298 void MockPeerConnectionImpl::CreateAnswer(
299 CreateSessionDescriptionObserver* observer,
300 const MediaConstraintsInterface* constraints) {
302 created_sessiondescription_.reset(
303 dependency_factory_->CreateSessionDescription("unknown", kDummyAnswer,
307 void MockPeerConnectionImpl::SetLocalDescriptionWorker(
308 SetSessionDescriptionObserver* observer,
309 SessionDescriptionInterface* desc) {
310 desc->ToString(&description_sdp_);
311 local_desc_.reset(desc);
314 void MockPeerConnectionImpl::SetRemoteDescriptionWorker(
315 SetSessionDescriptionObserver* observer,
316 SessionDescriptionInterface* desc) {
317 desc->ToString(&description_sdp_);
318 remote_desc_.reset(desc);
321 bool MockPeerConnectionImpl::UpdateIce(
322 const IceServers& configuration,
323 const MediaConstraintsInterface* constraints) {
327 bool MockPeerConnectionImpl::AddIceCandidate(
328 const IceCandidateInterface* candidate) {
329 sdp_mid_ = candidate->sdp_mid();
330 sdp_mline_index_ = candidate->sdp_mline_index();
331 return candidate->ToString(&ice_sdp_);
334 void MockPeerConnectionImpl::RegisterUMAObserver(
335 webrtc::UMAObserver* observer) {
339 } // namespace content