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.
4 
5 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_MOCK_PEER_CONNECTION_IMPL_H_
6 #define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_MOCK_PEER_CONNECTION_IMPL_H_
7 
8 #include <memory>
9 #include <string>
10 
11 #include "base/macros.h"
12 #include "base/optional.h"
13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "third_party/webrtc/api/dtls_transport_interface.h"
15 #include "third_party/webrtc/api/peer_connection_interface.h"
16 #include "third_party/webrtc/api/sctp_transport_interface.h"
17 #include "third_party/webrtc/api/stats/rtc_stats_report.h"
18 #include "third_party/webrtc/api/test/dummy_peer_connection.h"
19 
20 namespace blink {
21 
22 class MockPeerConnectionDependencyFactory;
23 class MockStreamCollection;
24 
25 class FakeRtpSender : public webrtc::RtpSenderInterface {
26  public:
27   FakeRtpSender(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track,
28                 std::vector<std::string> stream_ids);
29   ~FakeRtpSender() override;
30 
31   bool SetTrack(webrtc::MediaStreamTrackInterface* track) override;
32   rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track() const override;
33   rtc::scoped_refptr<webrtc::DtlsTransportInterface> dtls_transport()
34       const override;
35   uint32_t ssrc() const override;
36   cricket::MediaType media_type() const override;
37   std::string id() const override;
38   std::vector<std::string> stream_ids() const override;
39   std::vector<webrtc::RtpEncodingParameters> init_send_encodings()
40       const override;
41   webrtc::RtpParameters GetParameters() const override;
42   webrtc::RTCError SetParameters(
43       const webrtc::RtpParameters& parameters) override;
44   rtc::scoped_refptr<webrtc::DtmfSenderInterface> GetDtmfSender()
45       const override;
SetTransport(rtc::scoped_refptr<webrtc::DtlsTransportInterface> transport)46   void SetTransport(
47       rtc::scoped_refptr<webrtc::DtlsTransportInterface> transport) {
48     transport_ = transport;
49   }
50 
51  private:
52   rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track_;
53   rtc::scoped_refptr<webrtc::DtlsTransportInterface> transport_;
54   std::vector<std::string> stream_ids_;
55 };
56 
57 class FakeRtpReceiver : public webrtc::RtpReceiverInterface {
58  public:
59   FakeRtpReceiver(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track,
60                   std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>
61                       streams = {});
62   ~FakeRtpReceiver() override;
63 
64   rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track() const override;
65   rtc::scoped_refptr<webrtc::DtlsTransportInterface> dtls_transport()
66       const override;
67   std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>> streams()
68       const override;
69   std::vector<std::string> stream_ids() const override;
70   cricket::MediaType media_type() const override;
71   std::string id() const override;
72   webrtc::RtpParameters GetParameters() const override;
73   bool SetParameters(const webrtc::RtpParameters& parameters) override;
74   void SetObserver(webrtc::RtpReceiverObserverInterface* observer) override;
75   void SetJitterBufferMinimumDelay(
76       absl::optional<double> delay_seconds) override;
77   std::vector<webrtc::RtpSource> GetSources() const override;
SetTransport(rtc::scoped_refptr<webrtc::DtlsTransportInterface> transport)78   void SetTransport(
79       rtc::scoped_refptr<webrtc::DtlsTransportInterface> transport) {
80     transport_ = transport;
81   }
82 
83  private:
84   rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track_;
85   rtc::scoped_refptr<webrtc::DtlsTransportInterface> transport_;
86   std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>> streams_;
87 };
88 
89 class FakeRtpTransceiver : public webrtc::RtpTransceiverInterface {
90  public:
91   FakeRtpTransceiver(
92       cricket::MediaType media_type,
93       rtc::scoped_refptr<FakeRtpSender> sender,
94       rtc::scoped_refptr<FakeRtpReceiver> receiver,
95       base::Optional<std::string> mid,
96       bool stopped,
97       webrtc::RtpTransceiverDirection direction,
98       base::Optional<webrtc::RtpTransceiverDirection> current_direction);
99   ~FakeRtpTransceiver() override;
100 
101   void ReplaceWith(const FakeRtpTransceiver& other);
102 
103   cricket::MediaType media_type() const override;
104   absl::optional<std::string> mid() const override;
105   rtc::scoped_refptr<webrtc::RtpSenderInterface> sender() const override;
106   rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver() const override;
107   bool stopped() const override;
108   webrtc::RtpTransceiverDirection direction() const override;
109   void SetDirection(webrtc::RtpTransceiverDirection new_direction) override;
110   absl::optional<webrtc::RtpTransceiverDirection> current_direction()
111       const override;
112   void Stop() override;
113   void SetTransport(
114       rtc::scoped_refptr<webrtc::DtlsTransportInterface> transport);
115 
116  private:
117   cricket::MediaType media_type_;
118   rtc::scoped_refptr<FakeRtpSender> sender_;
119   rtc::scoped_refptr<FakeRtpReceiver> receiver_;
120   absl::optional<std::string> mid_;
121   bool stopped_;
122   webrtc::RtpTransceiverDirection direction_;
123   absl::optional<webrtc::RtpTransceiverDirection> current_direction_;
124 };
125 
126 class FakeDtlsTransport : public webrtc::DtlsTransportInterface {
127  public:
128   FakeDtlsTransport();
129   rtc::scoped_refptr<webrtc::IceTransportInterface> ice_transport() override;
130   webrtc::DtlsTransportInformation Information() override;
RegisterObserver(webrtc::DtlsTransportObserverInterface * observer)131   void RegisterObserver(
132       webrtc::DtlsTransportObserverInterface* observer) override {}
UnregisterObserver()133   void UnregisterObserver() override {}
134 };
135 
136 // TODO(hbos): The use of fakes and mocks is the wrong approach for testing of
137 // this. It introduces complexity, is error prone (not testing the right thing
138 // and bugs in the mocks). This class is a maintenance burden and should be
139 // removed. https://crbug.com/788659
140 class MockPeerConnectionImpl : public webrtc::DummyPeerConnection {
141  public:
142   explicit MockPeerConnectionImpl(MockPeerConnectionDependencyFactory* factory,
143                                   webrtc::PeerConnectionObserver* observer);
144 
145   // PeerConnectionInterface implementation.
local_streams()146   rtc::scoped_refptr<webrtc::StreamCollectionInterface> local_streams()
147       override {
148     NOTIMPLEMENTED();
149     return nullptr;
150   }
remote_streams()151   rtc::scoped_refptr<webrtc::StreamCollectionInterface> remote_streams()
152       override {
153     NOTIMPLEMENTED();
154     return nullptr;
155   }
AddStream(webrtc::MediaStreamInterface * local_stream)156   bool AddStream(webrtc::MediaStreamInterface* local_stream) override {
157     NOTIMPLEMENTED();
158     return false;
159   }
RemoveStream(webrtc::MediaStreamInterface * local_stream)160   void RemoveStream(webrtc::MediaStreamInterface* local_stream) override {
161     NOTIMPLEMENTED();
162   }
163   webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>>
AddTransceiver(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track)164   AddTransceiver(
165       rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track) override {
166     NOTIMPLEMENTED();
167     return webrtc::RTCErrorOr<
168         rtc::scoped_refptr<webrtc::RtpTransceiverInterface>>();
169   }
170   webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>>
AddTransceiver(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track,const webrtc::RtpTransceiverInit & init)171   AddTransceiver(rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track,
172                  const webrtc::RtpTransceiverInit& init) override {
173     NOTIMPLEMENTED();
174     return webrtc::RTCErrorOr<
175         rtc::scoped_refptr<webrtc::RtpTransceiverInterface>>();
176   }
177 
178   webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>>
AddTransceiver(cricket::MediaType media_type)179   AddTransceiver(cricket::MediaType media_type) override {
180     NOTIMPLEMENTED();
181     return webrtc::RTCErrorOr<
182         rtc::scoped_refptr<webrtc::RtpTransceiverInterface>>();
183   }
184   webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>>
AddTransceiver(cricket::MediaType media_type,const webrtc::RtpTransceiverInit & init)185   AddTransceiver(cricket::MediaType media_type,
186                  const webrtc::RtpTransceiverInit& init) override {
187     NOTIMPLEMENTED();
188     return webrtc::RTCErrorOr<
189         rtc::scoped_refptr<webrtc::RtpTransceiverInterface>>();
190   }
191 
CreateSender(const std::string & kind,const std::string & stream_id)192   rtc::scoped_refptr<webrtc::RtpSenderInterface> CreateSender(
193       const std::string& kind,
194       const std::string& stream_id) override {
195     NOTIMPLEMENTED();
196     return nullptr;
197   }
198 
199   webrtc::RTCErrorOr<rtc::scoped_refptr<webrtc::RtpSenderInterface>> AddTrack(
200       rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track,
201       const std::vector<std::string>& stream_ids) override;
202   bool RemoveTrack(webrtc::RtpSenderInterface* sender) override;
203   std::vector<rtc::scoped_refptr<webrtc::RtpSenderInterface>> GetSenders()
204       const override;
205   std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>> GetReceivers()
206       const override;
207   std::vector<rtc::scoped_refptr<webrtc::RtpTransceiverInterface>>
GetTransceivers()208   GetTransceivers() const override {
209     return {};
210   }
211   MOCK_CONST_METHOD0(GetSctpTransport,
212                      rtc::scoped_refptr<webrtc::SctpTransportInterface>());
213   rtc::scoped_refptr<webrtc::DataChannelInterface> CreateDataChannel(
214       const std::string& label,
215       const webrtc::DataChannelInit* config) override;
216 
217   bool GetStats(webrtc::StatsObserver* observer,
218                 webrtc::MediaStreamTrackInterface* track,
219                 StatsOutputLevel level) override;
220   void GetStats(webrtc::RTCStatsCollectorCallback* callback) override;
221   void GetStats(
222       rtc::scoped_refptr<webrtc::RtpSenderInterface> selector,
223       rtc::scoped_refptr<webrtc::RTCStatsCollectorCallback> callback) override;
224   void GetStats(
225       rtc::scoped_refptr<webrtc::RtpReceiverInterface> selector,
226       rtc::scoped_refptr<webrtc::RTCStatsCollectorCallback> callback) override;
227 
228   // Call this function to make sure next call to legacy GetStats fail.
SetGetStatsResult(bool result)229   void SetGetStatsResult(bool result) { getstats_result_ = result; }
230   // Set the report that |GetStats(RTCStatsCollectorCallback*)| returns.
231   void SetGetStatsReport(webrtc::RTCStatsReport* report);
LookupDtlsTransportByMid(const std::string & mid)232   rtc::scoped_refptr<webrtc::DtlsTransportInterface> LookupDtlsTransportByMid(
233       const std::string& mid) override {
234     return nullptr;
235   }
236 
signaling_state()237   SignalingState signaling_state() override {
238     NOTIMPLEMENTED();
239     return PeerConnectionInterface::kStable;
240   }
ice_connection_state()241   IceConnectionState ice_connection_state() override {
242     NOTIMPLEMENTED();
243     return PeerConnectionInterface::kIceConnectionNew;
244   }
standardized_ice_connection_state()245   IceConnectionState standardized_ice_connection_state() override {
246     NOTIMPLEMENTED();
247     return PeerConnectionInterface::kIceConnectionNew;
248   }
249 
peer_connection_state()250   PeerConnectionState peer_connection_state() override {
251     NOTIMPLEMENTED();
252     return PeerConnectionState::kNew;
253   }
254 
ice_gathering_state()255   IceGatheringState ice_gathering_state() override {
256     NOTIMPLEMENTED();
257     return PeerConnectionInterface::kIceGatheringNew;
258   }
259 
StartRtcEventLog(std::unique_ptr<webrtc::RtcEventLogOutput> output,int64_t output_period_ms)260   bool StartRtcEventLog(std::unique_ptr<webrtc::RtcEventLogOutput> output,
261                         int64_t output_period_ms) override {
262     NOTIMPLEMENTED();
263     return false;
264   }
StartRtcEventLog(std::unique_ptr<webrtc::RtcEventLogOutput> output)265   bool StartRtcEventLog(
266       std::unique_ptr<webrtc::RtcEventLogOutput> output) override {
267     NOTIMPLEMENTED();
268     return false;
269   }
StopRtcEventLog()270   void StopRtcEventLog() override { NOTIMPLEMENTED(); }
271 
272   MOCK_METHOD0(Close, void());
273 
274   const webrtc::SessionDescriptionInterface* local_description() const override;
275   const webrtc::SessionDescriptionInterface* remote_description()
276       const override;
current_local_description()277   const webrtc::SessionDescriptionInterface* current_local_description()
278       const override {
279     return nullptr;
280   }
current_remote_description()281   const webrtc::SessionDescriptionInterface* current_remote_description()
282       const override {
283     return nullptr;
284   }
pending_local_description()285   const webrtc::SessionDescriptionInterface* pending_local_description()
286       const override {
287     return nullptr;
288   }
pending_remote_description()289   const webrtc::SessionDescriptionInterface* pending_remote_description()
290       const override {
291     return nullptr;
292   }
293 
294   // JSEP01 APIs
295   void CreateOffer(webrtc::CreateSessionDescriptionObserver* observer,
296                    const RTCOfferAnswerOptions& options) override;
297   void CreateAnswer(webrtc::CreateSessionDescriptionObserver* observer,
298                     const RTCOfferAnswerOptions& options) override;
299   MOCK_METHOD2(SetLocalDescription,
300                void(webrtc::SetSessionDescriptionObserver* observer,
301                     webrtc::SessionDescriptionInterface* desc));
302   void SetLocalDescriptionWorker(
303       webrtc::SetSessionDescriptionObserver* observer,
304       webrtc::SessionDescriptionInterface* desc);
305   // TODO(hbos): Remove once no longer mandatory to implement.
306   MOCK_METHOD2(SetRemoteDescription,
307                void(webrtc::SetSessionDescriptionObserver* observer,
308                     webrtc::SessionDescriptionInterface* desc));
SetRemoteDescription(std::unique_ptr<webrtc::SessionDescriptionInterface> desc,rtc::scoped_refptr<webrtc::SetRemoteDescriptionObserverInterface> observer)309   void SetRemoteDescription(
310       std::unique_ptr<webrtc::SessionDescriptionInterface> desc,
311       rtc::scoped_refptr<webrtc::SetRemoteDescriptionObserverInterface>
312           observer) override {
313     SetRemoteDescriptionForMock(&desc, &observer);
314   }
315   // Work-around due to MOCK_METHOD being unable to handle move-only arguments.
316   MOCK_METHOD2(
317       SetRemoteDescriptionForMock,
318       void(std::unique_ptr<webrtc::SessionDescriptionInterface>* desc,
319            rtc::scoped_refptr<webrtc::SetRemoteDescriptionObserverInterface>*
320                observer));
321   void SetRemoteDescriptionWorker(
322       webrtc::SetSessionDescriptionObserver* observer,
323       webrtc::SessionDescriptionInterface* desc);
GetConfiguration()324   webrtc::PeerConnectionInterface::RTCConfiguration GetConfiguration() {
325     NOTIMPLEMENTED();
326     return webrtc::PeerConnectionInterface::RTCConfiguration();
327   }
328   webrtc::RTCError SetConfiguration(
329       const RTCConfiguration& configuration) override;
330 
331   bool AddIceCandidate(const webrtc::IceCandidateInterface* candidate) override;
332   void AddIceCandidate(std::unique_ptr<webrtc::IceCandidateInterface> candidate,
333                        std::function<void(webrtc::RTCError)> callback) override;
RemoveIceCandidates(const std::vector<cricket::Candidate> & candidates)334   bool RemoveIceCandidates(
335       const std::vector<cricket::Candidate>& candidates) override {
336     NOTIMPLEMENTED();
337     return false;
338   }
339 
340   webrtc::RTCError SetBitrate(const webrtc::BitrateSettings& bitrate) override;
341 
342   void AddRemoteStream(webrtc::MediaStreamInterface* stream);
343 
stream_label()344   const std::string& stream_label() const { return stream_label_; }
hint_audio()345   bool hint_audio() const { return hint_audio_; }
hint_video()346   bool hint_video() const { return hint_video_; }
description_sdp()347   const std::string& description_sdp() const { return description_sdp_; }
sdp_mid()348   const std::string& sdp_mid() const { return sdp_mid_; }
sdp_mline_index()349   int sdp_mline_index() const { return sdp_mline_index_; }
ice_sdp()350   const std::string& ice_sdp() const { return ice_sdp_; }
created_session_description()351   webrtc::SessionDescriptionInterface* created_session_description() const {
352     return created_sessiondescription_.get();
353   }
observer()354   webrtc::PeerConnectionObserver* observer() { return observer_; }
set_setconfiguration_error_type(webrtc::RTCErrorType error_type)355   void set_setconfiguration_error_type(webrtc::RTCErrorType error_type) {
356     setconfiguration_error_type_ = error_type;
357   }
358   static const char kDummyOffer[];
359   static const char kDummyAnswer[];
360 
361  protected:
362   ~MockPeerConnectionImpl() override;
363 
364  private:
365   // Used for creating MockSessionDescription.
366   MockPeerConnectionDependencyFactory* dependency_factory_;
367 
368   std::string stream_label_;
369   std::vector<std::string> local_stream_ids_;
370   rtc::scoped_refptr<MockStreamCollection> remote_streams_;
371   std::vector<rtc::scoped_refptr<FakeRtpSender>> senders_;
372   std::unique_ptr<webrtc::SessionDescriptionInterface> local_desc_;
373   std::unique_ptr<webrtc::SessionDescriptionInterface> remote_desc_;
374   std::unique_ptr<webrtc::SessionDescriptionInterface>
375       created_sessiondescription_;
376   bool hint_audio_;
377   bool hint_video_;
378   bool getstats_result_;
379   std::string description_sdp_;
380   std::string sdp_mid_;
381   int sdp_mline_index_;
382   std::string ice_sdp_;
383   webrtc::PeerConnectionObserver* observer_;
384   webrtc::RTCErrorType setconfiguration_error_type_ =
385       webrtc::RTCErrorType::NONE;
386   rtc::scoped_refptr<webrtc::RTCStatsReport> stats_report_;
387 
388   DISALLOW_COPY_AND_ASSIGN(MockPeerConnectionImpl);
389 };
390 
391 }  // namespace blink
392 
393 #endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_MOCK_PEER_CONNECTION_IMPL_H_
394