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

Side by Side Diff: webrtc/base/virtualsocketserver.h

Issue 2284903002: Adding ability to simulate EWOULDBLOCK/SignalReadyToSend. (Closed)
Patch Set: Created 4 years, 3 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
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 12 matching lines...) Expand all
23 namespace rtc { 23 namespace rtc {
24 24
25 class Packet; 25 class Packet;
26 class VirtualSocket; 26 class VirtualSocket;
27 class SocketAddressPair; 27 class SocketAddressPair;
28 28
29 // Simulates a network in the same manner as a loopback interface. The 29 // Simulates a network in the same manner as a loopback interface. The
30 // interface can create as many addresses as you want. All of the sockets 30 // interface can create as many addresses as you want. All of the sockets
31 // created by this network will be able to communicate with one another, unless 31 // created by this network will be able to communicate with one another, unless
32 // they are bound to addresses from incompatible families. 32 // they are bound to addresses from incompatible families.
33 class VirtualSocketServer : public SocketServer, public sigslot::has_slots<> { 33 class VirtualSocketServer : public SocketServer, public sigslot::has_slots<> {
skvlad 2016/08/26 22:39:04 Not related to the code review, more like a genera
Taylor Brandstetter 2016/08/26 23:01:03 The current convention seems to be to put test cod
34 public: 34 public:
35 // TODO: Add "owned" parameter. 35 // TODO: Add "owned" parameter.
36 // If "owned" is set, the supplied socketserver will be deleted later. 36 // If "owned" is set, the supplied socketserver will be deleted later.
37 explicit VirtualSocketServer(SocketServer* ss); 37 explicit VirtualSocketServer(SocketServer* ss);
38 ~VirtualSocketServer() override; 38 ~VirtualSocketServer() override;
39 39
40 SocketServer* socketserver() { return server_; } 40 SocketServer* socketserver() { return server_; }
41 41
42 // The default route indicates which local address to use when a socket is 42 // The default route indicates which local address to use when a socket is
43 // bound to the 'any' address, e.g. 0.0.0.0. 43 // bound to the 'any' address, e.g. 0.0.0.0.
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 void UpdateDelayDistribution(); 83 void UpdateDelayDistribution();
84 84
85 // Controls the (uniform) probability that any sent packet is dropped. This 85 // Controls the (uniform) probability that any sent packet is dropped. This
86 // is separate from calculations to drop based on queue size. 86 // is separate from calculations to drop based on queue size.
87 double drop_probability() { return drop_prob_; } 87 double drop_probability() { return drop_prob_; }
88 void set_drop_probability(double drop_prob) { 88 void set_drop_probability(double drop_prob) {
89 assert((0 <= drop_prob) && (drop_prob <= 1)); 89 assert((0 <= drop_prob) && (drop_prob <= 1));
90 drop_prob_ = drop_prob; 90 drop_prob_ = drop_prob;
91 } 91 }
92 92
93 // If |blocked| is true, subsequent attempts to send will result in -1 being
94 // returned, with the socket error set to EWOULDBLOCK.
95 //
96 // If this method is later called with |blocked| set to false, any sockets
97 // that previously failed to send with EWOULDBLOCK will emit SignalWriteEvent.
98 //
99 // This can be used to simulate the send buffer on a network interface being
100 // full, and test functionality related to EWOULDBLOCK/SignalWriteEvent.
101 void SetSendingBlocked(bool blocked);
102
93 // SocketFactory: 103 // SocketFactory:
94 Socket* CreateSocket(int type) override; 104 Socket* CreateSocket(int type) override;
95 Socket* CreateSocket(int family, int type) override; 105 Socket* CreateSocket(int family, int type) override;
96 106
97 AsyncSocket* CreateAsyncSocket(int type) override; 107 AsyncSocket* CreateAsyncSocket(int type) override;
98 AsyncSocket* CreateAsyncSocket(int family, int type) override; 108 AsyncSocket* CreateAsyncSocket(int family, int type) override;
99 109
100 // SocketServer: 110 // SocketServer:
101 void SetMessageQueue(MessageQueue* queue) override; 111 void SetMessageQueue(MessageQueue* queue) override;
102 bool Wait(int cms, bool process_io) override; 112 bool Wait(int cms, bool process_io) override;
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 // This applies even if the IPv4 address is 0.0.0.0. 226 // This applies even if the IPv4 address is 0.0.0.0.
217 // The socket arguments are optional; the sockets are checked to see if they 227 // The socket arguments are optional; the sockets are checked to see if they
218 // were explicitly bound to IPv6-any ('::'), and if so communication is 228 // were explicitly bound to IPv6-any ('::'), and if so communication is
219 // permitted. 229 // permitted.
220 // NB: This scheme doesn't permit non-dualstack IPv6 sockets. 230 // NB: This scheme doesn't permit non-dualstack IPv6 sockets.
221 static bool CanInteractWith(VirtualSocket* local, VirtualSocket* remote); 231 static bool CanInteractWith(VirtualSocket* local, VirtualSocket* remote);
222 232
223 private: 233 private:
224 friend class VirtualSocket; 234 friend class VirtualSocket;
225 235
236 // Sending was previously blocked, but now isn't.
237 sigslot::signal0<> SignalReadyToSend;
238
226 typedef std::map<SocketAddress, VirtualSocket*> AddressMap; 239 typedef std::map<SocketAddress, VirtualSocket*> AddressMap;
227 typedef std::map<SocketAddressPair, VirtualSocket*> ConnectionMap; 240 typedef std::map<SocketAddressPair, VirtualSocket*> ConnectionMap;
228 241
229 SocketServer* server_; 242 SocketServer* server_;
230 bool server_owned_; 243 bool server_owned_;
231 MessageQueue* msg_queue_; 244 MessageQueue* msg_queue_;
232 bool stop_on_idle_; 245 bool stop_on_idle_;
233 int64_t network_delay_; 246 int64_t network_delay_;
234 in_addr next_ipv4_; 247 in_addr next_ipv4_;
235 in6_addr next_ipv6_; 248 in6_addr next_ipv6_;
236 uint16_t next_port_; 249 uint16_t next_port_;
237 AddressMap* bindings_; 250 AddressMap* bindings_;
238 ConnectionMap* connections_; 251 ConnectionMap* connections_;
239 252
240 IPAddress default_route_v4_; 253 IPAddress default_route_v4_;
241 IPAddress default_route_v6_; 254 IPAddress default_route_v6_;
242 255
243 uint32_t bandwidth_; 256 uint32_t bandwidth_;
244 uint32_t network_capacity_; 257 uint32_t network_capacity_;
245 uint32_t send_buffer_capacity_; 258 uint32_t send_buffer_capacity_;
246 uint32_t recv_buffer_capacity_; 259 uint32_t recv_buffer_capacity_;
247 uint32_t delay_mean_; 260 uint32_t delay_mean_;
248 uint32_t delay_stddev_; 261 uint32_t delay_stddev_;
249 uint32_t delay_samples_; 262 uint32_t delay_samples_;
250 Function* delay_dist_; 263 Function* delay_dist_;
251 CriticalSection delay_crit_; 264 CriticalSection delay_crit_;
252 265
253 double drop_prob_; 266 double drop_prob_;
267 bool sending_blocked_ = false;
254 RTC_DISALLOW_COPY_AND_ASSIGN(VirtualSocketServer); 268 RTC_DISALLOW_COPY_AND_ASSIGN(VirtualSocketServer);
255 }; 269 };
256 270
257 // Implements the socket interface using the virtual network. Packets are 271 // Implements the socket interface using the virtual network. Packets are
258 // passed as messages using the message queue of the socket server. 272 // passed as messages using the message queue of the socket server.
259 class VirtualSocket : public AsyncSocket, public MessageHandler { 273 class VirtualSocket : public AsyncSocket,
274 public MessageHandler,
275 public sigslot::has_slots<> {
260 public: 276 public:
261 VirtualSocket(VirtualSocketServer* server, int family, int type, bool async); 277 VirtualSocket(VirtualSocketServer* server, int family, int type, bool async);
262 ~VirtualSocket() override; 278 ~VirtualSocket() override;
263 279
264 SocketAddress GetLocalAddress() const override; 280 SocketAddress GetLocalAddress() const override;
265 SocketAddress GetRemoteAddress() const override; 281 SocketAddress GetRemoteAddress() const override;
266 282
267 // Used by TurnPortTest to mimic a case where proxy returns local host address 283 // Used by TurnPortTest to mimic a case where proxy returns local host address
268 // instead of the original one TurnPort was bound against. Please see WebRTC 284 // instead of the original one TurnPort was bound against. Please see WebRTC
269 // issue 3927 for more detail. 285 // issue 3927 for more detail.
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 typedef std::map<Option, int> OptionsMap; 325 typedef std::map<Option, int> OptionsMap;
310 326
311 int InitiateConnect(const SocketAddress& addr, bool use_delay); 327 int InitiateConnect(const SocketAddress& addr, bool use_delay);
312 void CompleteConnect(const SocketAddress& addr, bool notify); 328 void CompleteConnect(const SocketAddress& addr, bool notify);
313 int SendUdp(const void* pv, size_t cb, const SocketAddress& addr); 329 int SendUdp(const void* pv, size_t cb, const SocketAddress& addr);
314 int SendTcp(const void* pv, size_t cb); 330 int SendTcp(const void* pv, size_t cb);
315 331
316 // Used by server sockets to set the local address without binding. 332 // Used by server sockets to set the local address without binding.
317 void SetLocalAddress(const SocketAddress& addr); 333 void SetLocalAddress(const SocketAddress& addr);
318 334
335 void OnSocketServerReadyToSend();
336
319 VirtualSocketServer* server_; 337 VirtualSocketServer* server_;
320 int type_; 338 int type_;
321 bool async_; 339 bool async_;
322 ConnState state_; 340 ConnState state_;
323 int error_; 341 int error_;
324 SocketAddress local_addr_; 342 SocketAddress local_addr_;
325 SocketAddress alternative_local_addr_; 343 SocketAddress alternative_local_addr_;
326 SocketAddress remote_addr_; 344 SocketAddress remote_addr_;
327 345
328 // Pending sockets which can be Accepted 346 // Pending sockets which can be Accepted
329 ListenQueue* listen_queue_; 347 ListenQueue* listen_queue_;
330 348
331 // Data which tcp has buffered for sending 349 // Data which tcp has buffered for sending
332 SendBuffer send_buffer_; 350 SendBuffer send_buffer_;
333 bool write_enabled_; 351 // Set to false if the last attempt to send resulted in EWOULDBLOCK.
352 // Set back to true when the socket can send again.
353 bool ready_to_send_ = true;
334 354
335 // Critical section to protect the recv_buffer and queue_ 355 // Critical section to protect the recv_buffer and queue_
336 CriticalSection crit_; 356 CriticalSection crit_;
337 357
338 // Network model that enforces bandwidth and capacity constraints 358 // Network model that enforces bandwidth and capacity constraints
339 NetworkQueue network_; 359 NetworkQueue network_;
340 size_t network_size_; 360 size_t network_size_;
341 361
342 // Data which has been received from the network 362 // Data which has been received from the network
343 RecvBuffer recv_buffer_; 363 RecvBuffer recv_buffer_;
(...skipping 11 matching lines...) Expand all
355 375
356 // Store the options that are set 376 // Store the options that are set
357 OptionsMap options_map_; 377 OptionsMap options_map_;
358 378
359 friend class VirtualSocketServer; 379 friend class VirtualSocketServer;
360 }; 380 };
361 381
362 } // namespace rtc 382 } // namespace rtc
363 383
364 #endif // WEBRTC_BASE_VIRTUALSOCKETSERVER_H_ 384 #endif // WEBRTC_BASE_VIRTUALSOCKETSERVER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698