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.
5 #ifndef NET_TOOLS_QUIC_TEST_TOOLS_PACKET_DROPPING_TEST_WRITER_H_
6 #define NET_TOOLS_QUIC_TEST_TOOLS_PACKET_DROPPING_TEST_WRITER_H_
10 #include "base/logging.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/synchronization/lock.h"
13 #include "net/quic/quic_alarm.h"
14 #include "net/quic/quic_blocked_writer_interface.h"
15 #include "net/quic/quic_packet_writer.h"
16 #include "net/quic/test_tools/quic_test_writer.h"
17 #include "net/tools/quic/quic_epoll_clock.h"
18 #include "net/tools/quic/test_tools/quic_test_client.h"
19 #include "net/tools/quic/test_tools/quic_test_utils.h"
25 // Simulates a connection that drops packets a configured percentage of the time
26 // and has a blocked socket a configured percentage of the time. Also provides
27 // the options to delay packets and reorder packets if delay is enabled.
28 class PacketDroppingTestWriter : public net::test::QuicTestWriter {
30 PacketDroppingTestWriter();
32 virtual ~PacketDroppingTestWriter();
34 void SetConnectionHelper(QuicEpollConnectionHelper* helper);
36 // QuicPacketWriter methods:
37 virtual WriteResult WritePacket(
38 const char* buffer, size_t buf_len,
39 const IPAddressNumber& self_address,
40 const IPEndPoint& peer_address,
41 QuicBlockedWriterInterface* blocked_writer) OVERRIDE;
43 virtual bool IsWriteBlockedDataBuffered() const OVERRIDE;
45 // Writes out the next packet to the contained writer and returns the time
46 // for the next delayed packet to be written.
47 QuicTime ReleaseNextPacket();
49 QuicBlockedWriterInterface* blocked_writer() { return blocked_writer_; }
51 // The percent of time a packet is simulated as being lost.
52 void set_fake_packet_loss_percentage(int32 fake_packet_loss_percentage) {
53 base::AutoLock locked(config_mutex_);
54 fake_packet_loss_percentage_ = fake_packet_loss_percentage;
57 // The percent of time WritePacket will block and set WriteResult's status
58 // to WRITE_STATUS_BLOCKED.
59 void set_fake_blocked_socket_percentage(
60 int32 fake_blocked_socket_percentage) {
62 base::AutoLock locked(config_mutex_);
63 fake_blocked_socket_percentage_ = fake_blocked_socket_percentage;
66 // The percent of time a packet is simulated as being reordered.
67 void set_fake_reorder_percentage(int32 fake_packet_reorder_percentage) {
69 base::AutoLock locked(config_mutex_);
70 DCHECK(!fake_packet_delay_.IsZero());
71 fake_packet_reorder_percentage_ = fake_packet_reorder_percentage;
74 // The percent of time WritePacket will block and set WriteResult's status
75 // to WRITE_STATUS_BLOCKED.
76 void set_fake_packet_delay(QuicTime::Delta fake_packet_delay) {
78 base::AutoLock locked(config_mutex_);
79 fake_packet_delay_ = fake_packet_delay;
82 void set_seed(uint64 seed) {
83 simple_random_.set_seed(seed);
87 // A single packet which will be sent at the supplied send_time.
90 DelayedWrite(const char* buffer,
92 const IPAddressNumber& self_address,
93 const IPEndPoint& peer_address,
98 const IPAddressNumber self_address;
99 const IPEndPoint peer_address;
103 typedef std::list<DelayedWrite> DelayedPacketList;
105 const QuicClock* clock_;
106 scoped_ptr<QuicAlarm> write_unblocked_alarm_;
107 scoped_ptr<QuicAlarm> delay_alarm_;
108 QuicBlockedWriterInterface* blocked_writer_;
109 SimpleRandom simple_random_;
110 DelayedPacketList delayed_packets_;
112 base::Lock config_mutex_;
113 int32 fake_packet_loss_percentage_;
114 int32 fake_blocked_socket_percentage_;
115 int32 fake_packet_reorder_percentage_;
116 QuicTime::Delta fake_packet_delay_;
118 DISALLOW_COPY_AND_ASSIGN(PacketDroppingTestWriter);
125 #endif // NET_TOOLS_QUIC_TEST_TOOLS_PACKET_DROPPING_TEST_WRITER_H_