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