18c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org/* 28c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 38c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org * 48c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org * Use of this source code is governed by a BSD-style license 58c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org * that can be found in the LICENSE file in the root of the source 68c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org * tree. An additional intellectual property rights grant can be found 78c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org * in the file PATENTS. All contributing project authors may 88c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org * be found in the AUTHORS file in the root of the source tree. 98c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org */ 108c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 11aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org#ifndef WEBRTC_TEST_FAKE_NETWORK_PIPE_H_ 12aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org#define WEBRTC_TEST_FAKE_NETWORK_PIPE_H_ 138c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 148c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org#include <queue> 158c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 16774b3d38a4a0f1a8ec08972a3c543cb5d607ce13henrike@webrtc.org#include "webrtc/base/constructormagic.h" 17aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org#include "webrtc/system_wrappers/interface/event_wrapper.h" 188c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 198c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org#include "webrtc/typedefs.h" 208c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 218c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.orgnamespace webrtc { 228c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 238c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.orgclass CriticalSectionWrapper; 248c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.orgclass NetworkPacket; 25aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.orgclass PacketReceiver; 268c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 278c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org// Class faking a network link. This is a simple and naive solution just faking 288c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org// capacity and adding an extra transport delay in addition to the capacity 298c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org// introduced delay. 308c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 318c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org// TODO(mflodman) Add random and bursty packet loss. 328c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.orgclass FakeNetworkPipe { 338c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org public: 34aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org struct Config { 35aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org Config() 3679b66f41cae3053e60b96fb715276e0b8876f248stefan@webrtc.org : queue_length_packets(0), 374f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org queue_delay_ms(0), 384f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org delay_standard_deviation_ms(0), 394f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org link_capacity_kbps(0), 404f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org loss_percent(0) { 414f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org } 42aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org // Queue length in number of packets. 4379b66f41cae3053e60b96fb715276e0b8876f248stefan@webrtc.org size_t queue_length_packets; 444f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org // Delay in addition to capacity induced delay. 454f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org int queue_delay_ms; 464f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org // Standard deviation of the extra delay. 474f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org int delay_standard_deviation_ms; 484f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org // Link capacity in kbps. 494f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org int link_capacity_kbps; 5040683136579a5814e13ec14b29a590f44a677d1dstefan@webrtc.org // Random packet loss. 514f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org int loss_percent; 524f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org }; 534f92005c526c3224903a6a8e6fd3d73215b8f715mflodman@webrtc.org 54aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org explicit FakeNetworkPipe(const FakeNetworkPipe::Config& config); 558c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org ~FakeNetworkPipe(); 568c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 57aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org // Must not be called in parallel with SendPacket or Process. 58aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org void SetReceiver(PacketReceiver* receiver); 59aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org 609900e37401509bbdcd8c7685a4471db42435ef8fhenrik.lundin@webrtc.org // Sets a new configuration. This won't affect packets already in the pipe. 619900e37401509bbdcd8c7685a4471db42435ef8fhenrik.lundin@webrtc.org void SetConfig(const FakeNetworkPipe::Config& config); 629900e37401509bbdcd8c7685a4471db42435ef8fhenrik.lundin@webrtc.org 638c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org // Sends a new packet to the link. 64aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org void SendPacket(const uint8_t* packet, size_t packet_length); 658c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 668c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org // Processes the network queues and trigger PacketReceiver::IncomingPacket for 678c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org // packets ready to be delivered. 68aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org void Process(); 69aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org int TimeUntilNextProcess() const; 708c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 718c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org // Get statistics. 728c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org float PercentageLoss(); 738c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org int AverageDelay(); 74aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org size_t dropped_packets() { return dropped_packets_; } 75aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org size_t sent_packets() { return sent_packets_; } 768c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 778c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org private: 78aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org scoped_ptr<CriticalSectionWrapper> lock_; 798c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org PacketReceiver* packet_receiver_; 808c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org std::queue<NetworkPacket*> capacity_link_; 818c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org std::queue<NetworkPacket*> delay_link_; 828c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 838c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org // Link configuration. 84aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org Config config_; 858c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 868c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org // Statistics. 87aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org size_t dropped_packets_; 88aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org size_t sent_packets_; 898c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org int total_packet_delay_; 908c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 91aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org int64_t next_process_time_; 92aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org 938c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org DISALLOW_COPY_AND_ASSIGN(FakeNetworkPipe); 948c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org}; 958c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 968c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org} // namespace webrtc 978c0b253660b055598a4ed3b00516e3be1282b42fmflodman@webrtc.org 98aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org#endif // WEBRTC_TEST_FAKE_NETWORK_PIPE_H_ 99