| Index: net/tools/quic/test_tools/packet_dropping_test_writer.cc
|
| diff --git a/net/tools/quic/test_tools/packet_dropping_test_writer.cc b/net/tools/quic/test_tools/packet_dropping_test_writer.cc
|
| deleted file mode 100644
|
| index 9e01fd4bfb00d99d7585636bd193b7d4a9deb60d..0000000000000000000000000000000000000000
|
| --- a/net/tools/quic/test_tools/packet_dropping_test_writer.cc
|
| +++ /dev/null
|
| @@ -1,213 +0,0 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/tools/quic/test_tools/packet_dropping_test_writer.h"
|
| -
|
| -#include <limits>
|
| -
|
| -#include "base/rand_util.h"
|
| -#include "net/tools/quic/quic_epoll_connection_helper.h"
|
| -#include "net/tools/quic/quic_socket_utils.h"
|
| -
|
| -namespace net {
|
| -namespace tools {
|
| -namespace test {
|
| -
|
| -// An alarm that is scheduled if a blocked socket is simulated to indicate
|
| -// it's writable again.
|
| -class WriteUnblockedAlarm : public QuicAlarm::Delegate {
|
| - public:
|
| - explicit WriteUnblockedAlarm(PacketDroppingTestWriter* writer)
|
| - : writer_(writer) {}
|
| -
|
| - QuicTime OnAlarm() override {
|
| - DVLOG(1) << "Unblocking socket.";
|
| - writer_->OnCanWrite();
|
| - return QuicTime::Zero();
|
| - }
|
| -
|
| - private:
|
| - PacketDroppingTestWriter* writer_;
|
| -};
|
| -
|
| -// An alarm that is scheduled every time a new packet is to be written at a
|
| -// later point.
|
| -class DelayAlarm : public QuicAlarm::Delegate {
|
| - public:
|
| - explicit DelayAlarm(PacketDroppingTestWriter* writer) : writer_(writer) {}
|
| -
|
| - QuicTime OnAlarm() override { return writer_->ReleaseOldPackets(); }
|
| -
|
| - private:
|
| - PacketDroppingTestWriter* writer_;
|
| -};
|
| -
|
| -PacketDroppingTestWriter::PacketDroppingTestWriter()
|
| - : clock_(nullptr),
|
| - cur_buffer_size_(0),
|
| - config_mutex_(),
|
| - fake_packet_loss_percentage_(0),
|
| - fake_blocked_socket_percentage_(0),
|
| - fake_packet_reorder_percentage_(0),
|
| - fake_packet_delay_(QuicTime::Delta::Zero()),
|
| - fake_bandwidth_(QuicBandwidth::Zero()),
|
| - buffer_size_(0) {
|
| - uint32 seed = base::RandInt(0, std::numeric_limits<int32>::max());
|
| - VLOG(1) << "Seeding packet loss with " << seed;
|
| - simple_random_.set_seed(seed);
|
| -}
|
| -
|
| -PacketDroppingTestWriter::~PacketDroppingTestWriter() {}
|
| -
|
| -void PacketDroppingTestWriter::Initialize(
|
| - QuicEpollConnectionHelper* helper,
|
| - Delegate* on_can_write) {
|
| - clock_ = helper->GetClock();
|
| - write_unblocked_alarm_.reset(
|
| - helper->CreateAlarm(new WriteUnblockedAlarm(this)));
|
| - delay_alarm_.reset(
|
| - helper->CreateAlarm(new DelayAlarm(this)));
|
| - on_can_write_.reset(on_can_write);
|
| -}
|
| -
|
| -WriteResult PacketDroppingTestWriter::WritePacket(
|
| - const char* buffer,
|
| - size_t buf_len,
|
| - const net::IPAddressNumber& self_address,
|
| - const net::IPEndPoint& peer_address) {
|
| - ReleaseOldPackets();
|
| -
|
| - base::AutoLock locked(config_mutex_);
|
| - if (fake_packet_loss_percentage_ > 0 &&
|
| - simple_random_.RandUint64() % 100 <
|
| - static_cast<uint64>(fake_packet_loss_percentage_)) {
|
| - DVLOG(1) << "Dropping packet.";
|
| - return WriteResult(WRITE_STATUS_OK, buf_len);
|
| - }
|
| - if (fake_blocked_socket_percentage_ > 0 &&
|
| - simple_random_.RandUint64() % 100 <
|
| - static_cast<uint64>(fake_blocked_socket_percentage_)) {
|
| - CHECK(on_can_write_.get() != nullptr);
|
| - DVLOG(1) << "Blocking socket.";
|
| - if (!write_unblocked_alarm_->IsSet()) {
|
| - // Set the alarm to fire immediately.
|
| - write_unblocked_alarm_->Set(clock_->ApproximateNow());
|
| - }
|
| - return WriteResult(WRITE_STATUS_BLOCKED, EAGAIN);
|
| - }
|
| -
|
| - if (!fake_packet_delay_.IsZero() || !fake_bandwidth_.IsZero()) {
|
| - if (buffer_size_ > 0 && buf_len + cur_buffer_size_ > buffer_size_) {
|
| - // Drop packets which do not fit into the buffer.
|
| - DVLOG(1) << "Dropping packet because the buffer is full.";
|
| - return WriteResult(WRITE_STATUS_OK, buf_len);
|
| - }
|
| -
|
| - // Queue it to be sent.
|
| - QuicTime send_time = clock_->ApproximateNow().Add(fake_packet_delay_);
|
| - if (!fake_bandwidth_.IsZero()) {
|
| - // Calculate a time the bandwidth limit would impose.
|
| - QuicTime::Delta bandwidth_delay = QuicTime::Delta::FromMicroseconds(
|
| - (buf_len * kNumMicrosPerSecond) /
|
| - fake_bandwidth_.ToBytesPerSecond());
|
| - send_time = delayed_packets_.empty() ?
|
| - send_time.Add(bandwidth_delay) :
|
| - delayed_packets_.back().send_time.Add(bandwidth_delay);
|
| - }
|
| - delayed_packets_.push_back(DelayedWrite(buffer, buf_len, self_address,
|
| - peer_address, send_time));
|
| - cur_buffer_size_ += buf_len;
|
| -
|
| - // Set the alarm if it's not yet set.
|
| - if (!delay_alarm_->IsSet()) {
|
| - delay_alarm_->Set(send_time);
|
| - }
|
| -
|
| - return WriteResult(WRITE_STATUS_OK, buf_len);
|
| - }
|
| -
|
| - return QuicPacketWriterWrapper::WritePacket(
|
| - buffer, buf_len, self_address, peer_address);
|
| -}
|
| -
|
| -bool PacketDroppingTestWriter::IsWriteBlocked() const {
|
| - if (write_unblocked_alarm_.get() != nullptr &&
|
| - write_unblocked_alarm_->IsSet()) {
|
| - return true;
|
| - }
|
| - return QuicPacketWriterWrapper::IsWriteBlocked();
|
| -}
|
| -
|
| -void PacketDroppingTestWriter::SetWritable() {
|
| - if (write_unblocked_alarm_.get() != nullptr &&
|
| - write_unblocked_alarm_->IsSet()) {
|
| - write_unblocked_alarm_->Cancel();
|
| - }
|
| - QuicPacketWriterWrapper::SetWritable();
|
| -}
|
| -
|
| -QuicTime PacketDroppingTestWriter::ReleaseNextPacket() {
|
| - if (delayed_packets_.empty()) {
|
| - return QuicTime::Zero();
|
| - }
|
| - base::AutoLock locked(config_mutex_);
|
| - DelayedPacketList::iterator iter = delayed_packets_.begin();
|
| - // Determine if we should re-order.
|
| - if (delayed_packets_.size() > 1 && fake_packet_reorder_percentage_ > 0 &&
|
| - simple_random_.RandUint64() % 100 <
|
| - static_cast<uint64>(fake_packet_reorder_percentage_)) {
|
| - DVLOG(1) << "Reordering packets.";
|
| - ++iter;
|
| - // Swap the send times when re-ordering packets.
|
| - delayed_packets_.begin()->send_time = iter->send_time;
|
| - }
|
| -
|
| - DVLOG(1) << "Releasing packet. " << (delayed_packets_.size() - 1)
|
| - << " remaining.";
|
| - // Grab the next one off the queue and send it.
|
| - QuicPacketWriterWrapper::WritePacket(
|
| - iter->buffer.data(), iter->buffer.length(),
|
| - iter->self_address, iter->peer_address);
|
| - DCHECK_GE(cur_buffer_size_, iter->buffer.length());
|
| - cur_buffer_size_ -= iter->buffer.length();
|
| - delayed_packets_.erase(iter);
|
| -
|
| - // If there are others, find the time for the next to be sent.
|
| - if (delayed_packets_.empty()) {
|
| - return QuicTime::Zero();
|
| - }
|
| - return delayed_packets_.begin()->send_time;
|
| -}
|
| -
|
| -QuicTime PacketDroppingTestWriter::ReleaseOldPackets() {
|
| - while (!delayed_packets_.empty()) {
|
| - QuicTime next_send_time = delayed_packets_.front().send_time;
|
| - if (next_send_time > clock_->Now()) {
|
| - return next_send_time;
|
| - }
|
| - ReleaseNextPacket();
|
| - }
|
| - return QuicTime::Zero();
|
| -}
|
| -
|
| -void PacketDroppingTestWriter::OnCanWrite() {
|
| - on_can_write_->OnCanWrite();
|
| -}
|
| -
|
| -PacketDroppingTestWriter::DelayedWrite::DelayedWrite(
|
| - const char* buffer,
|
| - size_t buf_len,
|
| - const net::IPAddressNumber& self_address,
|
| - const net::IPEndPoint& peer_address,
|
| - QuicTime send_time)
|
| - : buffer(buffer, buf_len),
|
| - self_address(self_address),
|
| - peer_address(peer_address),
|
| - send_time(send_time) {}
|
| -
|
| -PacketDroppingTestWriter::DelayedWrite::~DelayedWrite() {}
|
| -
|
| -} // namespace test
|
| -} // namespace tools
|
| -} // namespace net
|
|
|