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 : dependency_factory_(factory
),
181 local_streams_(new rtc::RefCountedObject
<MockStreamCollection
>),
182 remote_streams_(new rtc::RefCountedObject
<MockStreamCollection
>),
185 getstats_result_(true),
186 sdp_mline_index_(-1) {
187 ON_CALL(*this, SetLocalDescription(_
, _
)).WillByDefault(testing::Invoke(
188 this, &MockPeerConnectionImpl::SetLocalDescriptionWorker
));
189 ON_CALL(*this, SetRemoteDescription(_
, _
)).WillByDefault(testing::Invoke(
190 this, &MockPeerConnectionImpl::SetRemoteDescriptionWorker
));
193 MockPeerConnectionImpl::~MockPeerConnectionImpl() {}
195 rtc::scoped_refptr
<webrtc::StreamCollectionInterface
>
196 MockPeerConnectionImpl::local_streams() {
197 return local_streams_
;
200 rtc::scoped_refptr
<webrtc::StreamCollectionInterface
>
201 MockPeerConnectionImpl::remote_streams() {
202 return remote_streams_
;
205 bool MockPeerConnectionImpl::AddStream(
206 MediaStreamInterface
* local_stream
,
207 const MediaConstraintsInterface
* constraints
) {
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