Index: webrtc/test/fake_network_pipe.h |
diff --git a/webrtc/test/fake_network_pipe.h b/webrtc/test/fake_network_pipe.h |
index 1af63b074983a35746b1a364ab00eea91b708f75..1d75c766f6297c434986df4d65a4489aeabb810d 100644 |
--- a/webrtc/test/fake_network_pipe.h |
+++ b/webrtc/test/fake_network_pipe.h |
@@ -11,10 +11,13 @@ |
#ifndef WEBRTC_TEST_FAKE_NETWORK_PIPE_H_ |
#define WEBRTC_TEST_FAKE_NETWORK_PIPE_H_ |
+#include <set> |
+#include <string.h> |
#include <queue> |
#include "webrtc/base/constructormagic.h" |
#include "webrtc/base/criticalsection.h" |
+#include "webrtc/base/random.h" |
#include "webrtc/base/scoped_ptr.h" |
#include "webrtc/typedefs.h" |
@@ -22,9 +25,40 @@ namespace webrtc { |
class Clock; |
class CriticalSectionWrapper; |
-class NetworkPacket; |
class PacketReceiver; |
+class NetworkPacket { |
+ public: |
+ NetworkPacket(const uint8_t* data, |
+ size_t length, |
+ int64_t send_time, |
+ int64_t arrival_time) |
+ : data_(new uint8_t[length]), |
+ data_length_(length), |
+ send_time_(send_time), |
+ arrival_time_(arrival_time) { |
+ memcpy(data_.get(), data, length); |
+ } |
+ |
+ uint8_t* data() const { return data_.get(); } |
+ size_t data_length() const { return data_length_; } |
+ int64_t send_time() const { return send_time_; } |
+ int64_t arrival_time() const { return arrival_time_; } |
+ void IncrementArrivalTime(int64_t extra_delay) { |
+ arrival_time_ += extra_delay; |
+ } |
+ |
+ private: |
+ // The packet data. |
+ rtc::scoped_ptr<uint8_t[]> data_; |
+ // Length of data_. |
+ size_t data_length_; |
+ // The time the packet was sent out on the network. |
+ const int64_t send_time_; |
+ // The time the packet should arrive at the receiver. |
+ int64_t arrival_time_; |
+}; |
+ |
// Class faking a network link. This is a simple and naive solution just faking |
// capacity and adding an extra transport delay in addition to the capacity |
// introduced delay. |
@@ -44,9 +78,14 @@ class FakeNetworkPipe { |
int link_capacity_kbps = 0; |
// Random packet loss. |
int loss_percent = 0; |
+ // If packets are allowed to be reordered. |
+ bool allow_reordering = false; |
}; |
FakeNetworkPipe(Clock* clock, const FakeNetworkPipe::Config& config); |
+ FakeNetworkPipe(Clock* clock, |
+ const FakeNetworkPipe::Config& config, |
+ uint64_t seed); |
~FakeNetworkPipe(); |
// Must not be called in parallel with SendPacket or Process. |
@@ -74,7 +113,17 @@ class FakeNetworkPipe { |
mutable rtc::CriticalSection lock_; |
PacketReceiver* packet_receiver_; |
std::queue<NetworkPacket*> capacity_link_; |
- std::queue<NetworkPacket*> delay_link_; |
+ Random random_; |
+ |
+ // Since we need to access both the packet with the earliest and latest |
+ // arrival time we need to use a multiset to keep all packets sorted, |
+ // hence, we cannot use a priority queue. |
+ struct PacketArrivalTimeComparator { |
+ bool operator()(const NetworkPacket* p1, const NetworkPacket* p2) { |
+ return p1->arrival_time() < p2->arrival_time(); |
+ } |
+ }; |
+ std::multiset<NetworkPacket*, PacketArrivalTimeComparator> delay_link_; |
// Link configuration. |
Config config_; |