| // Copyright 2022 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_TEST_TOOLS_SIMULATOR_TEST_HARNESS_H_ |
| #define QUICHE_QUIC_TEST_TOOLS_SIMULATOR_TEST_HARNESS_H_ |
| |
| #include <memory> |
| |
| #include "absl/types/optional.h" |
| #include "quiche/quic/core/quic_constants.h" |
| #include "quiche/quic/core/quic_versions.h" |
| #include "quiche/quic/test_tools/simulator/link.h" |
| #include "quiche/quic/test_tools/simulator/port.h" |
| #include "quiche/quic/test_tools/simulator/quic_endpoint_base.h" |
| #include "quiche/quic/test_tools/simulator/simulator.h" |
| #include "quiche/quic/test_tools/simulator/switch.h" |
| |
| namespace quic::simulator { |
| |
| // A subclass of QuicEndpointBase that creates the connection object for the |
| // caller. Uses a fixed connection ID (0x10) and IP addresses derived from the |
| // names supplied. |
| class QuicEndpointWithConnection : public QuicEndpointBase { |
| public: |
| QuicEndpointWithConnection(Simulator* simulator, const std::string& name, |
| const std::string& peer_name, |
| Perspective perspective, |
| const ParsedQuicVersionVector& supported_versions); |
| }; |
| |
| // A test harness that provides a reasonable preset for running unit tests. |
| class TestHarness { |
| public: |
| // The configuration of the test harness. |
| static constexpr QuicBandwidth kClientBandwidth = |
| QuicBandwidth::FromKBitsPerSecond(10000); |
| static constexpr QuicTime::Delta kClientPropagationDelay = |
| QuicTime::Delta::FromMilliseconds(2); |
| static constexpr QuicBandwidth kServerBandwidth = |
| QuicBandwidth::FromKBitsPerSecond(4000); |
| static constexpr QuicTime::Delta kServerPropagationDelay = |
| QuicTime::Delta::FromMilliseconds(50); |
| static constexpr QuicTime::Delta kTransferTime = |
| kClientBandwidth.TransferTime(kMaxOutgoingPacketSize) + |
| kServerBandwidth.TransferTime(kMaxOutgoingPacketSize); |
| static constexpr QuicTime::Delta kRtt = |
| (kClientPropagationDelay + kServerPropagationDelay + kTransferTime) * 2; |
| static constexpr QuicByteCount kBdp = kRtt * kServerBandwidth; |
| |
| static constexpr QuicTime::Delta kDefaultTimeout = |
| QuicTime::Delta::FromSeconds(3); |
| |
| TestHarness(); |
| |
| Simulator& simulator() { return simulator_; } |
| void set_client(Endpoint* client) { client_ = client; } |
| void set_server(Endpoint* server) { server_ = server; } |
| |
| // Connects |client_| and |server_| to a virtual switch; must be called after |
| // set_client/set_server are called. |
| void WireUpEndpoints(); |
| |
| // A convenience wrapper around Simulator::RunUntilOrTimeout(). |
| template <class TerminationPredicate> |
| bool RunUntilWithDefaultTimeout(TerminationPredicate termination_predicate) { |
| return simulator_.RunUntilOrTimeout(std::move(termination_predicate), |
| kDefaultTimeout); |
| } |
| |
| private: |
| Simulator simulator_; |
| Switch switch_; |
| absl::optional<SymmetricLink> client_link_; |
| absl::optional<SymmetricLink> server_link_; |
| |
| Endpoint* client_; |
| Endpoint* server_; |
| }; |
| |
| } // namespace quic::simulator |
| |
| #endif // QUICHE_QUIC_TEST_TOOLS_SIMULATOR_TEST_HARNESS_H_ |