blob: 185668b528af6a727d3a3c28411c67b515224e22 [file] [log] [blame]
// Copyright (c) 2018 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.
#ifndef QUICHE_QUIC_QUARTC_SIMULATED_PACKET_TRANSPORT_H_
#define QUICHE_QUIC_QUARTC_SIMULATED_PACKET_TRANSPORT_H_
#include <string>
#include "net/third_party/quiche/src/quic/quartc/quartc_packet_writer.h"
#include "net/third_party/quiche/src/quic/test_tools/simulator/port.h"
#include "net/third_party/quiche/src/quic/test_tools/simulator/queue.h"
namespace quic {
namespace simulator {
// Simulated implementation of QuartcPacketTransport. This packet transport
// implementation connects Quartc to a QUIC simulator's network fabric.
// Assumes that its caller and delegate run on the same thread as the network
// simulation and therefore require no additional synchronization.
class SimulatedQuartcPacketTransport : public Endpoint,
public QuartcPacketTransport,
public UnconstrainedPortInterface,
public Queue::ListenerInterface {
public:
SimulatedQuartcPacketTransport(Simulator* simulator,
const std::string& name,
const std::string& peer_name,
QuicByteCount queue_capacity);
// QuartcPacketTransport methods.
int Write(const char* buffer,
size_t buf_len,
const PacketInfo& info) override;
void SetDelegate(Delegate* delegate) override;
// Simulation methods below. These are implementation details.
// Endpoint methods. Called by the simulation to connect the transport.
UnconstrainedPortInterface* GetRxPort() override;
void SetTxPort(ConstrainedPortInterface* port) override;
// UnconstrainedPortInterface method. Called by the simulation to deliver a
// packet to this transport.
void AcceptPacket(std::unique_ptr<Packet> packet) override;
// Queue::ListenerInterface method. Called when the internal egress queue has
// dispatched a packet and may have room for more.
void OnPacketDequeued() override;
// Actor method. The transport schedules this to run when the delegate is set
// in order to trigger an initial call to |Delegate::OnTransportCanWrite()|.
// (The Quartc packet writer starts in a blocked state and needs an initial
// callback to unblock it.)
void Act() override;
// Changes whether the transport is writable. If |writable| is false, the
// transport will reject calls to |Write| and will not call
// |Delegate::OnTransportCanWrite|. If |writable| is true, the transport will
// allow calls to |Write| and will call |Delegate::OnTransportCanWrite|
// whenever it is able to write another packet.
void SetWritable(bool writable);
// Last packet number sent over this simulated transport.
// TODO(b/112561077): Reorganize tests so that this method can be deleted.
// This exists purely for use by quartc_session_test.cc, to test that the
// packet writer passes packet numbers to the transport.
QuicPacketNumber last_packet_number() { return last_packet_number_; }
private:
std::string peer_name_;
Delegate* delegate_ = nullptr;
Queue egress_queue_;
QuicPacketNumber last_packet_number_;
// Controls whether the transport is considered to be writable. Used to
// simulate behavior that arises when the transport is blocked.
bool writable_ = true;
};
} // namespace simulator
} // namespace quic
#endif // QUICHE_QUIC_QUARTC_SIMULATED_PACKET_TRANSPORT_H_