| // 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_ |