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