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

Side by Side Diff: net/tools/quic/test_tools/packet_dropping_test_writer.h

Issue 992733002: Remove //net (except for Android test stuff) and sdch (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 9 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
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef NET_TOOLS_QUIC_TEST_TOOLS_PACKET_DROPPING_TEST_WRITER_H_
6 #define NET_TOOLS_QUIC_TEST_TOOLS_PACKET_DROPPING_TEST_WRITER_H_
7
8 #include <list>
9 #include <string>
10
11 #include "base/basictypes.h"
12 #include "base/logging.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/synchronization/lock.h"
15 #include "net/quic/quic_alarm.h"
16 #include "net/quic/test_tools/quic_test_utils.h"
17 #include "net/tools/quic/quic_epoll_clock.h"
18 #include "net/tools/quic/quic_packet_writer_wrapper.h"
19 #include "net/tools/quic/test_tools/quic_test_client.h"
20 #include "net/tools/quic/test_tools/quic_test_utils.h"
21
22 namespace net {
23 namespace tools {
24 namespace test {
25
26 // Simulates a connection that drops packets a configured percentage of the time
27 // and has a blocked socket a configured percentage of the time. Also provides
28 // the options to delay packets and reorder packets if delay is enabled.
29 class PacketDroppingTestWriter : public QuicPacketWriterWrapper {
30 public:
31 class Delegate {
32 public:
33 virtual ~Delegate() {}
34 virtual void OnPacketSent(WriteResult result) = 0;
35 virtual void OnCanWrite() = 0;
36 };
37
38 PacketDroppingTestWriter();
39
40 ~PacketDroppingTestWriter() override;
41
42 // Must be called before blocking, reordering or delaying (loss is OK). May be
43 // called after connecting if the helper is not available before.
44 // |on_can_write| will be triggered when fake-unblocking; ownership will be
45 // assumed.
46 void Initialize(QuicEpollConnectionHelper* helper, Delegate* on_can_write);
47
48 // QuicPacketWriter methods:
49 WriteResult WritePacket(const char* buffer,
50 size_t buf_len,
51 const IPAddressNumber& self_address,
52 const IPEndPoint& peer_address) override;
53
54 bool IsWriteBlocked() const override;
55
56 void SetWritable() override;
57
58 // Writes out any packet which should have been sent by now
59 // to the contained writer and returns the time
60 // for the next delayed packet to be written.
61 QuicTime ReleaseOldPackets();
62
63 void OnCanWrite();
64
65 // The percent of time a packet is simulated as being lost.
66 void set_fake_packet_loss_percentage(int32 fake_packet_loss_percentage) {
67 base::AutoLock locked(config_mutex_);
68 fake_packet_loss_percentage_ = fake_packet_loss_percentage;
69 }
70
71 // The percent of time WritePacket will block and set WriteResult's status
72 // to WRITE_STATUS_BLOCKED.
73 void set_fake_blocked_socket_percentage(
74 int32 fake_blocked_socket_percentage) {
75 DCHECK(clock_);
76 base::AutoLock locked(config_mutex_);
77 fake_blocked_socket_percentage_ = fake_blocked_socket_percentage;
78 }
79
80 // The percent of time a packet is simulated as being reordered.
81 void set_fake_reorder_percentage(int32 fake_packet_reorder_percentage) {
82 DCHECK(clock_);
83 base::AutoLock locked(config_mutex_);
84 DCHECK(!fake_packet_delay_.IsZero());
85 fake_packet_reorder_percentage_ = fake_packet_reorder_percentage;
86 }
87
88 // The delay before writing this packet.
89 void set_fake_packet_delay(QuicTime::Delta fake_packet_delay) {
90 DCHECK(clock_);
91 base::AutoLock locked(config_mutex_);
92 fake_packet_delay_ = fake_packet_delay;
93 }
94
95 // The maximum bandwidth and buffer size of the connection. When these are
96 // set, packets will be delayed until a connection with that bandwidth would
97 // transmit it. Once the |buffer_size| is reached, all new packets are
98 // dropped.
99 void set_max_bandwidth_and_buffer_size(QuicBandwidth fake_bandwidth,
100 QuicByteCount buffer_size) {
101 DCHECK(clock_);
102 base::AutoLock locked(config_mutex_);
103 fake_bandwidth_ = fake_bandwidth;
104 buffer_size_ = buffer_size;
105 }
106
107 void set_seed(uint64 seed) {
108 simple_random_.set_seed(seed);
109 }
110
111 private:
112 // Writes out the next packet to the contained writer and returns the time
113 // for the next delayed packet to be written.
114 QuicTime ReleaseNextPacket();
115
116 // A single packet which will be sent at the supplied send_time.
117 struct DelayedWrite {
118 public:
119 DelayedWrite(const char* buffer,
120 size_t buf_len,
121 const IPAddressNumber& self_address,
122 const IPEndPoint& peer_address,
123 QuicTime send_time);
124 ~DelayedWrite();
125
126 std::string buffer;
127 const IPAddressNumber self_address;
128 const IPEndPoint peer_address;
129 QuicTime send_time;
130 };
131
132 typedef std::list<DelayedWrite> DelayedPacketList;
133
134 const QuicClock* clock_;
135 scoped_ptr<QuicAlarm> write_unblocked_alarm_;
136 scoped_ptr<QuicAlarm> delay_alarm_;
137 scoped_ptr<Delegate> on_can_write_;
138 net::test::SimpleRandom simple_random_;
139 // Stored packets delayed by fake packet delay or bandwidth restrictions.
140 DelayedPacketList delayed_packets_;
141 QuicByteCount cur_buffer_size_;
142
143 base::Lock config_mutex_;
144 int32 fake_packet_loss_percentage_;
145 int32 fake_blocked_socket_percentage_;
146 int32 fake_packet_reorder_percentage_;
147 QuicTime::Delta fake_packet_delay_;
148 QuicBandwidth fake_bandwidth_;
149 QuicByteCount buffer_size_;
150
151 DISALLOW_COPY_AND_ASSIGN(PacketDroppingTestWriter);
152 };
153
154 } // namespace test
155 } // namespace tools
156 } // namespace net
157
158 #endif // NET_TOOLS_QUIC_TEST_TOOLS_PACKET_DROPPING_TEST_WRITER_H_
OLDNEW
« no previous file with comments | « net/tools/quic/test_tools/mock_quic_dispatcher.cc ('k') | net/tools/quic/test_tools/packet_dropping_test_writer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698