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