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