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

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

Issue 131503016: Properly trigger OnCanWrite processing from PacketDroppingTestWriter. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « net/tools/quic/test_tools/packet_dropping_test_writer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/tools/quic/test_tools/packet_dropping_test_writer.h" 5 #include "net/tools/quic/test_tools/packet_dropping_test_writer.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/rand_util.h" 9 #include "base/rand_util.h"
10 #include "net/tools/quic/quic_epoll_connection_helper.h" 10 #include "net/tools/quic/quic_epoll_connection_helper.h"
11 #include "net/tools/quic/quic_socket_utils.h" 11 #include "net/tools/quic/quic_socket_utils.h"
12 12
13 namespace net { 13 namespace net {
14 namespace tools { 14 namespace tools {
15 namespace test { 15 namespace test {
16 16
17 // An alarm that is scheduled if a blocked socket is simulated to indicate 17 // An alarm that is scheduled if a blocked socket is simulated to indicate
18 // it's writable again. 18 // it's writable again.
19 class WriteUnblockedAlarm : public QuicAlarm::Delegate { 19 class WriteUnblockedAlarm : public QuicAlarm::Delegate {
20 public: 20 public:
21 explicit WriteUnblockedAlarm(PacketDroppingTestWriter* writer) 21 explicit WriteUnblockedAlarm(PacketDroppingTestWriter* writer)
22 : writer_(writer) { } 22 : writer_(writer) { }
23 23
24 virtual QuicTime OnAlarm() OVERRIDE { 24 virtual QuicTime OnAlarm() OVERRIDE {
25 DCHECK(writer_->blocked_writer());
26 DVLOG(1) << "Unblocking socket."; 25 DVLOG(1) << "Unblocking socket.";
27 writer_->blocked_writer()->OnCanWrite(); 26 writer_->OnCanWrite();
28 return QuicTime::Zero(); 27 return QuicTime::Zero();
29 } 28 }
30 29
31 private: 30 private:
32 PacketDroppingTestWriter* writer_; 31 PacketDroppingTestWriter* writer_;
33 }; 32 };
34 33
35 // An alarm that is scheduled every time a new packet is to be written at a 34 // An alarm that is scheduled every time a new packet is to be written at a
36 // later point. 35 // later point.
37 class DelayAlarm : public QuicAlarm::Delegate { 36 class DelayAlarm : public QuicAlarm::Delegate {
38 public: 37 public:
39 explicit DelayAlarm(PacketDroppingTestWriter* writer) 38 explicit DelayAlarm(PacketDroppingTestWriter* writer)
40 : writer_(writer) { } 39 : writer_(writer) { }
41 40
42 virtual QuicTime OnAlarm() OVERRIDE { 41 virtual QuicTime OnAlarm() OVERRIDE {
43 return writer_->ReleaseOldPackets(); 42 return writer_->ReleaseOldPackets();
44 } 43 }
45 44
46 private: 45 private:
47 PacketDroppingTestWriter* writer_; 46 PacketDroppingTestWriter* writer_;
48 }; 47 };
49 48
50 PacketDroppingTestWriter::PacketDroppingTestWriter() 49 PacketDroppingTestWriter::PacketDroppingTestWriter()
51 : clock_(NULL), 50 : clock_(NULL),
52 blocked_writer_(NULL),
53 cur_buffer_size_(0), 51 cur_buffer_size_(0),
54 config_mutex_(), 52 config_mutex_(),
55 fake_packet_loss_percentage_(0), 53 fake_packet_loss_percentage_(0),
56 fake_blocked_socket_percentage_(0), 54 fake_blocked_socket_percentage_(0),
57 fake_packet_reorder_percentage_(0), 55 fake_packet_reorder_percentage_(0),
58 fake_packet_delay_(QuicTime::Delta::Zero()), 56 fake_packet_delay_(QuicTime::Delta::Zero()),
59 fake_bandwidth_(QuicBandwidth::Zero()), 57 fake_bandwidth_(QuicBandwidth::Zero()),
60 buffer_size_(0) { 58 buffer_size_(0) {
61 uint32 seed = base::RandInt(0, std::numeric_limits<int32>::max()); 59 uint32 seed = base::RandInt(0, std::numeric_limits<int32>::max());
62 VLOG(1) << "Seeding packet loss with " << seed; 60 VLOG(1) << "Seeding packet loss with " << seed;
63 simple_random_.set_seed(seed); 61 simple_random_.set_seed(seed);
64 } 62 }
65 63
66 PacketDroppingTestWriter::~PacketDroppingTestWriter() {} 64 PacketDroppingTestWriter::~PacketDroppingTestWriter() {}
67 65
68 void PacketDroppingTestWriter::SetConnectionHelper( 66 void PacketDroppingTestWriter::Initialize(
69 QuicEpollConnectionHelper* helper) { 67 QuicEpollConnectionHelper* helper,
68 Delegate* on_can_write) {
70 clock_ = helper->GetClock(); 69 clock_ = helper->GetClock();
71 write_unblocked_alarm_.reset( 70 write_unblocked_alarm_.reset(
72 helper->CreateAlarm(new WriteUnblockedAlarm(this))); 71 helper->CreateAlarm(new WriteUnblockedAlarm(this)));
73 delay_alarm_.reset( 72 delay_alarm_.reset(
74 helper->CreateAlarm(new DelayAlarm(this))); 73 helper->CreateAlarm(new DelayAlarm(this)));
74 on_can_write_.reset(on_can_write);
75 } 75 }
76 76
77 WriteResult PacketDroppingTestWriter::WritePacket( 77 WriteResult PacketDroppingTestWriter::WritePacket(
78 const char* buffer, 78 const char* buffer,
79 size_t buf_len, 79 size_t buf_len,
80 const net::IPAddressNumber& self_address, 80 const net::IPAddressNumber& self_address,
81 const net::IPEndPoint& peer_address, 81 const net::IPEndPoint& peer_address,
82 QuicBlockedWriterInterface* blocked_writer) { 82 QuicBlockedWriterInterface* blocked_writer) {
83 ReleaseOldPackets(); 83 ReleaseOldPackets();
84 84
85 base::AutoLock locked(config_mutex_); 85 base::AutoLock locked(config_mutex_);
86 if (fake_packet_loss_percentage_ > 0 && 86 if (fake_packet_loss_percentage_ > 0 &&
87 simple_random_.RandUint64() % 100 < 87 simple_random_.RandUint64() % 100 <
88 static_cast<uint64>(fake_packet_loss_percentage_)) { 88 static_cast<uint64>(fake_packet_loss_percentage_)) {
89 DVLOG(1) << "Dropping packet."; 89 DVLOG(1) << "Dropping packet.";
90 return WriteResult(WRITE_STATUS_OK, buf_len); 90 return WriteResult(WRITE_STATUS_OK, buf_len);
91 } 91 }
92 if (fake_blocked_socket_percentage_ > 0 && 92 if (fake_blocked_socket_percentage_ > 0 &&
93 simple_random_.RandUint64() % 100 < 93 simple_random_.RandUint64() % 100 <
94 static_cast<uint64>(fake_blocked_socket_percentage_)) { 94 static_cast<uint64>(fake_blocked_socket_percentage_)) {
95 CHECK(on_can_write_.get() != NULL);
95 DVLOG(1) << "Blocking socket."; 96 DVLOG(1) << "Blocking socket.";
96 if (!write_unblocked_alarm_->IsSet()) { 97 if (!write_unblocked_alarm_->IsSet()) {
97 blocked_writer_ = blocked_writer;
98 // Set the alarm to fire immediately. 98 // Set the alarm to fire immediately.
99 write_unblocked_alarm_->Set(clock_->ApproximateNow()); 99 write_unblocked_alarm_->Set(clock_->ApproximateNow());
100 } 100 }
101 return WriteResult(WRITE_STATUS_BLOCKED, EAGAIN); 101 return WriteResult(WRITE_STATUS_BLOCKED, EAGAIN);
102 } 102 }
103 103
104 if (!fake_packet_delay_.IsZero() || !fake_bandwidth_.IsZero()) { 104 if (!fake_packet_delay_.IsZero() || !fake_bandwidth_.IsZero()) {
105 if (buffer_size_ > 0 && buf_len + cur_buffer_size_ > buffer_size_) { 105 if (buffer_size_ > 0 && buf_len + cur_buffer_size_ > buffer_size_) {
106 // Drop packets which do not fit into the buffer. 106 // Drop packets which do not fit into the buffer.
107 DVLOG(1) << "Dropping packet because the buffer is full."; 107 DVLOG(1) << "Dropping packet because the buffer is full.";
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 while (!delayed_packets_.empty()) { 186 while (!delayed_packets_.empty()) {
187 QuicTime next_send_time = delayed_packets_.front().send_time; 187 QuicTime next_send_time = delayed_packets_.front().send_time;
188 if (next_send_time > clock_->Now()) { 188 if (next_send_time > clock_->Now()) {
189 return next_send_time; 189 return next_send_time;
190 } 190 }
191 ReleaseNextPacket(); 191 ReleaseNextPacket();
192 } 192 }
193 return QuicTime::Zero(); 193 return QuicTime::Zero();
194 } 194 }
195 195
196 void PacketDroppingTestWriter::OnCanWrite() {
197 on_can_write_->OnCanWrite();
198 }
199
196 PacketDroppingTestWriter::DelayedWrite::DelayedWrite( 200 PacketDroppingTestWriter::DelayedWrite::DelayedWrite(
197 const char* buffer, 201 const char* buffer,
198 size_t buf_len, 202 size_t buf_len,
199 const net::IPAddressNumber& self_address, 203 const net::IPAddressNumber& self_address,
200 const net::IPEndPoint& peer_address, 204 const net::IPEndPoint& peer_address,
201 QuicTime send_time) 205 QuicTime send_time)
202 : buffer(buffer, buf_len), 206 : buffer(buffer, buf_len),
203 self_address(self_address), 207 self_address(self_address),
204 peer_address(peer_address), 208 peer_address(peer_address),
205 send_time(send_time) {} 209 send_time(send_time) {}
206 210
207 PacketDroppingTestWriter::DelayedWrite::~DelayedWrite() {} 211 PacketDroppingTestWriter::DelayedWrite::~DelayedWrite() {}
208 212
209 } // namespace test 213 } // namespace test
210 } // namespace tools 214 } // namespace tools
211 } // namespace net 215 } // namespace net
OLDNEW
« no previous file with comments | « net/tools/quic/test_tools/packet_dropping_test_writer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698