Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Side by Side Diff: webrtc/p2p/base/fakeicetransport.h

Issue 2648233003: Adding ability for BaseChannel to use PacketTransportInterface. (Closed)
Patch Set: Fix TSAN warning in test by starting thread after setting fake clock Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/p2p/base/fakedtlstransport.h ('k') | webrtc/p2p/base/fakepackettransport.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2017 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 WEBRTC_P2P_BASE_FAKEICETRANSPORT_H_
12 #define WEBRTC_P2P_BASE_FAKEICETRANSPORT_H_
13
14 #include <string>
15
16 #include "webrtc/base/asyncinvoker.h"
17 #include "webrtc/base/copyonwritebuffer.h"
18 #include "webrtc/p2p/base/icetransportinternal.h"
19
20 namespace cricket {
21
22 class FakeIceTransport : public IceTransportInternal {
23 public:
24 explicit FakeIceTransport(const std::string& name, int component)
25 : name_(name), component_(component) {}
26 ~FakeIceTransport() override {
27 if (dest_ && dest_->dest_ == this) {
28 dest_->dest_ = nullptr;
29 }
30 }
31
32 // If async, will send packets by "Post"-ing to message queue instead of
33 // synchronously "Send"-ing.
34 void SetAsync(bool async) { async_ = async; }
35 void SetAsyncDelay(int delay_ms) { async_delay_ms_ = delay_ms; }
36
37 // SetWritable, SetReceiving and SetDestination are the main methods that can
38 // be used for testing, to simulate connectivity or lack thereof.
39 void SetWritable(bool writable) { set_writable(writable); }
40 void SetReceiving(bool receiving) { set_receiving(receiving); }
41
42 // Simulates the two transports connecting to each other.
43 // If |asymmetric| is true this method only affects this FakeIceTransport.
44 // If false, it affects |dest| as well.
45 void SetDestination(FakeIceTransport* dest, bool asymmetric = false) {
46 if (dest == dest_) {
47 return;
48 }
49 RTC_DCHECK(!dest || !dest_)
50 << "Changing fake destination from one to another is not supported.";
51 if (dest) {
52 // This simulates the delivery of candidates.
53 dest_ = dest;
54 set_writable(true);
55 if (!asymmetric) {
56 dest->SetDestination(this, true);
57 }
58 } else {
59 // Simulates loss of connectivity, by asymmetrically forgetting dest_.
60 dest_ = nullptr;
61 set_writable(false);
62 }
63 }
64
65 void SetConnectionCount(size_t connection_count) {
66 size_t old_connection_count = connection_count_;
67 connection_count_ = connection_count;
68 if (connection_count) {
69 had_connection_ = true;
70 }
71 // In this fake transport channel, |connection_count_| determines the
72 // transport state.
73 if (connection_count_ < old_connection_count) {
74 SignalStateChanged(this);
75 }
76 }
77
78 void SetCandidatesGatheringComplete() {
79 if (gathering_state_ != kIceGatheringComplete) {
80 gathering_state_ = kIceGatheringComplete;
81 SignalGatheringState(this);
82 }
83 }
84
85 // Convenience functions for accessing ICE config and other things.
86 int receiving_timeout() const { return ice_config_.receiving_timeout; }
87 bool gather_continually() const { return ice_config_.gather_continually(); }
88 const Candidates& remote_candidates() const { return remote_candidates_; }
89
90 // Fake IceTransportInternal implementation.
91 const std::string& transport_name() const override { return name_; }
92 int component() const override { return component_; }
93 uint64_t IceTiebreaker() const { return tiebreaker_; }
94 IceMode remote_ice_mode() const { return remote_ice_mode_; }
95 const std::string& ice_ufrag() const { return ice_ufrag_; }
96 const std::string& ice_pwd() const { return ice_pwd_; }
97 const std::string& remote_ice_ufrag() const { return remote_ice_ufrag_; }
98 const std::string& remote_ice_pwd() const { return remote_ice_pwd_; }
99
100 IceTransportState GetState() const override {
101 if (connection_count_ == 0) {
102 return had_connection_ ? IceTransportState::STATE_FAILED
103 : IceTransportState::STATE_INIT;
104 }
105
106 if (connection_count_ == 1) {
107 return IceTransportState::STATE_COMPLETED;
108 }
109
110 return IceTransportState::STATE_CONNECTING;
111 }
112
113 void SetIceRole(IceRole role) override { role_ = role; }
114 IceRole GetIceRole() const override { return role_; }
115 void SetIceTiebreaker(uint64_t tiebreaker) override {
116 tiebreaker_ = tiebreaker;
117 }
118 void SetIceParameters(const IceParameters& ice_params) override {
119 ice_ufrag_ = ice_params.ufrag;
120 ice_pwd_ = ice_params.pwd;
121 }
122 void SetRemoteIceParameters(const IceParameters& params) override {
123 remote_ice_ufrag_ = params.ufrag;
124 remote_ice_pwd_ = params.pwd;
125 }
126
127 void SetRemoteIceMode(IceMode mode) override { remote_ice_mode_ = mode; }
128
129 void MaybeStartGathering() override {
130 if (gathering_state_ == kIceGatheringNew) {
131 gathering_state_ = kIceGatheringGathering;
132 SignalGatheringState(this);
133 }
134 }
135
136 IceGatheringState gathering_state() const override {
137 return gathering_state_;
138 }
139
140 void SetIceConfig(const IceConfig& config) override { ice_config_ = config; }
141
142 void AddRemoteCandidate(const Candidate& candidate) override {
143 remote_candidates_.push_back(candidate);
144 }
145 void RemoveRemoteCandidate(const Candidate& candidate) override {}
146
147 bool GetStats(ConnectionInfos* infos) override {
148 ConnectionInfo info;
149 infos->clear();
150 infos->push_back(info);
151 return true;
152 }
153
154 void SetMetricsObserver(webrtc::MetricsObserverInterface* observer) override {
155 }
156
157 // Fake PacketTransportInterface implementation.
158 bool writable() const override { return writable_; }
159 bool receiving() const override { return receiving_; }
160 int SendPacket(const char* data,
161 size_t len,
162 const rtc::PacketOptions& options,
163 int flags) override {
164 if (!dest_) {
165 return -1;
166 }
167 rtc::CopyOnWriteBuffer packet(data, len);
168 if (async_) {
169 invoker_.AsyncInvokeDelayed<void>(
170 RTC_FROM_HERE, rtc::Thread::Current(),
171 rtc::Bind(&FakeIceTransport::SendPacketInternal, this, packet),
172 async_delay_ms_);
173 } else {
174 SendPacketInternal(packet);
175 }
176 rtc::SentPacket sent_packet(options.packet_id, rtc::TimeMillis());
177 SignalSentPacket(this, sent_packet);
178 return static_cast<int>(len);
179 }
180 int SetOption(rtc::Socket::Option opt, int value) override { return true; }
181 bool GetOption(rtc::Socket::Option opt, int* value) override { return true; }
182 int GetError() override { return 0; }
183
184 private:
185 void set_writable(bool writable) {
186 if (writable_ == writable) {
187 return;
188 }
189 LOG(INFO) << "set_writable from:" << writable_ << " to " << writable;
190 writable_ = writable;
191 if (writable_) {
192 SignalReadyToSend(this);
193 }
194 SignalWritableState(this);
195 }
196
197 void set_receiving(bool receiving) {
198 if (receiving_ == receiving) {
199 return;
200 }
201 receiving_ = receiving;
202 SignalReceivingState(this);
203 }
204
205 void SendPacketInternal(const rtc::CopyOnWriteBuffer& packet) {
206 if (dest_) {
207 dest_->SignalReadPacket(dest_, packet.data<char>(), packet.size(),
208 rtc::CreatePacketTime(0), 0);
209 }
210 }
211
212 rtc::AsyncInvoker invoker_;
213 std::string name_;
214 int component_;
215 FakeIceTransport* dest_ = nullptr;
216 bool async_ = false;
217 int async_delay_ms_ = 0;
218 Candidates remote_candidates_;
219 IceConfig ice_config_;
220 IceRole role_ = ICEROLE_UNKNOWN;
221 uint64_t tiebreaker_ = 0;
222 std::string ice_ufrag_;
223 std::string ice_pwd_;
224 std::string remote_ice_ufrag_;
225 std::string remote_ice_pwd_;
226 IceMode remote_ice_mode_ = ICEMODE_FULL;
227 size_t connection_count_ = 0;
228 IceGatheringState gathering_state_ = kIceGatheringNew;
229 bool had_connection_ = false;
230 bool writable_ = false;
231 bool receiving_ = false;
232 };
233
234 } // namespace cricket
235
236 #endif // WEBRTC_P2P_BASE_FAKEICETRANSPORT_H_
OLDNEW
« no previous file with comments | « webrtc/p2p/base/fakedtlstransport.h ('k') | webrtc/p2p/base/fakepackettransport.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698