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

Unified Diff: webrtc/test/fake_network_pipe.h

Issue 1606183002: Allow packets to be reordered in the fake network pipe. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: uint8_t[] instead of uint8_t Created 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | webrtc/test/fake_network_pipe.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_;
« no previous file with comments | « no previous file | webrtc/test/fake_network_pipe.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698