1 /* 2 * Copyright 2019 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef API_TEST_FAKE_DATAGRAM_TRANSPORT_H_ 12 #define API_TEST_FAKE_DATAGRAM_TRANSPORT_H_ 13 14 #include <cstddef> 15 #include <string> 16 17 #include "api/transport/datagram_transport_interface.h" 18 #include "api/transport/media/media_transport_interface.h" 19 20 namespace webrtc { 21 22 // Maxmum size of datagrams sent by |FakeDatagramTransport|. 23 constexpr size_t kMaxFakeDatagramSize = 1000; 24 25 // Fake datagram transport. Does not support making an actual connection 26 // or sending data. Only used for tests that need to stub out a transport. 27 class FakeDatagramTransport : public DatagramTransportInterface { 28 public: FakeDatagramTransport(const MediaTransportSettings & settings,std::string transport_parameters,const std::function<bool (absl::string_view,absl::string_view)> & are_parameters_compatible)29 FakeDatagramTransport( 30 const MediaTransportSettings& settings, 31 std::string transport_parameters, 32 const std::function<bool(absl::string_view, absl::string_view)>& 33 are_parameters_compatible) 34 : settings_(settings), 35 transport_parameters_(transport_parameters), 36 are_parameters_compatible_(are_parameters_compatible) {} 37 ~FakeDatagramTransport()38 ~FakeDatagramTransport() override { RTC_DCHECK(!state_callback_); } 39 Connect(rtc::PacketTransportInternal * packet_transport)40 void Connect(rtc::PacketTransportInternal* packet_transport) override { 41 packet_transport_ = packet_transport; 42 } 43 congestion_control()44 CongestionControlInterface* congestion_control() override { 45 return nullptr; // Datagram interface doesn't provide this yet. 46 } 47 SetTransportStateCallback(MediaTransportStateCallback * callback)48 void SetTransportStateCallback( 49 MediaTransportStateCallback* callback) override { 50 state_callback_ = callback; 51 } 52 SendDatagram(rtc::ArrayView<const uint8_t> data,DatagramId datagram_id)53 RTCError SendDatagram(rtc::ArrayView<const uint8_t> data, 54 DatagramId datagram_id) override { 55 return RTCError::OK(); 56 } 57 GetLargestDatagramSize()58 size_t GetLargestDatagramSize() const override { 59 return kMaxFakeDatagramSize; 60 } 61 SetDatagramSink(DatagramSinkInterface * sink)62 void SetDatagramSink(DatagramSinkInterface* sink) override {} 63 GetTransportParameters()64 std::string GetTransportParameters() const override { 65 if (settings_.remote_transport_parameters) { 66 return *settings_.remote_transport_parameters; 67 } 68 return transport_parameters_; 69 } 70 SetRemoteTransportParameters(absl::string_view remote_parameters)71 RTCError SetRemoteTransportParameters( 72 absl::string_view remote_parameters) override { 73 if (are_parameters_compatible_(GetTransportParameters(), 74 remote_parameters)) { 75 return RTCError::OK(); 76 } 77 return RTCError(RTCErrorType::UNSUPPORTED_PARAMETER, 78 "Incompatible remote transport parameters"); 79 } 80 OpenChannel(int channel_id)81 RTCError OpenChannel(int channel_id) override { 82 return RTCError(RTCErrorType::UNSUPPORTED_OPERATION); 83 } 84 SendData(int channel_id,const SendDataParams & params,const rtc::CopyOnWriteBuffer & buffer)85 RTCError SendData(int channel_id, 86 const SendDataParams& params, 87 const rtc::CopyOnWriteBuffer& buffer) override { 88 return RTCError(RTCErrorType::UNSUPPORTED_OPERATION); 89 } 90 CloseChannel(int channel_id)91 RTCError CloseChannel(int channel_id) override { 92 return RTCError(RTCErrorType::UNSUPPORTED_OPERATION); 93 } 94 SetDataSink(DataChannelSink *)95 void SetDataSink(DataChannelSink* /*sink*/) override {} 96 IsReadyToSend()97 bool IsReadyToSend() const override { return false; } 98 packet_transport()99 rtc::PacketTransportInternal* packet_transport() { return packet_transport_; } 100 set_state(webrtc::MediaTransportState state)101 void set_state(webrtc::MediaTransportState state) { 102 if (state_callback_) { 103 state_callback_->OnStateChanged(state); 104 } 105 } 106 settings()107 const MediaTransportSettings& settings() { return settings_; } 108 109 private: 110 const MediaTransportSettings settings_; 111 const std::string transport_parameters_; 112 const std::function<bool(absl::string_view, absl::string_view)> 113 are_parameters_compatible_; 114 115 rtc::PacketTransportInternal* packet_transport_ = nullptr; 116 MediaTransportStateCallback* state_callback_ = nullptr; 117 }; 118 119 } // namespace webrtc 120 121 #endif // API_TEST_FAKE_DATAGRAM_TRANSPORT_H_ 122