1 // Copyright 2022 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef QUICHE_QUIC_TEST_TOOLS_SIMULATOR_TEST_HARNESS_H_ 6 #define QUICHE_QUIC_TEST_TOOLS_SIMULATOR_TEST_HARNESS_H_ 7 8 #include <memory> 9 #include <optional> 10 #include <string> 11 12 #include "quiche/quic/core/quic_bandwidth.h" 13 #include "quiche/quic/core/quic_constants.h" 14 #include "quiche/quic/core/quic_time.h" 15 #include "quiche/quic/core/quic_types.h" 16 #include "quiche/quic/core/quic_versions.h" 17 #include "quiche/quic/test_tools/simulator/link.h" 18 #include "quiche/quic/test_tools/simulator/packet_filter.h" 19 #include "quiche/quic/test_tools/simulator/port.h" 20 #include "quiche/quic/test_tools/simulator/quic_endpoint_base.h" 21 #include "quiche/quic/test_tools/simulator/simulator.h" 22 #include "quiche/quic/test_tools/simulator/switch.h" 23 24 namespace quic::simulator { 25 26 // A subclass of QuicEndpointBase that creates the connection object for the 27 // caller. Uses a fixed connection ID (0x10) and IP addresses derived from the 28 // names supplied. 29 class QuicEndpointWithConnection : public QuicEndpointBase { 30 public: 31 QuicEndpointWithConnection(Simulator* simulator, const std::string& name, 32 const std::string& peer_name, 33 Perspective perspective, 34 const ParsedQuicVersionVector& supported_versions); 35 }; 36 37 // A test harness that provides a reasonable preset for running unit tests. 38 class TestHarness { 39 public: 40 // The configuration of the test harness. 41 static constexpr QuicBandwidth kClientBandwidth = 42 QuicBandwidth::FromKBitsPerSecond(10000); 43 static constexpr QuicTime::Delta kClientPropagationDelay = 44 QuicTime::Delta::FromMilliseconds(2); 45 static constexpr QuicBandwidth kServerBandwidth = 46 QuicBandwidth::FromKBitsPerSecond(4000); 47 static constexpr QuicTime::Delta kServerPropagationDelay = 48 QuicTime::Delta::FromMilliseconds(50); 49 static constexpr QuicTime::Delta kTransferTime = 50 kClientBandwidth.TransferTime(kMaxOutgoingPacketSize) + 51 kServerBandwidth.TransferTime(kMaxOutgoingPacketSize); 52 static constexpr QuicTime::Delta kRtt = 53 (kClientPropagationDelay + kServerPropagationDelay + kTransferTime) * 2; 54 static constexpr QuicByteCount kBdp = kRtt * kServerBandwidth; 55 56 static constexpr QuicTime::Delta kDefaultTimeout = 57 QuicTime::Delta::FromSeconds(3); 58 59 TestHarness(); 60 simulator()61 Simulator& simulator() { return simulator_; } set_client(Endpoint * client)62 void set_client(Endpoint* client) { client_ = client; } set_server(Endpoint * server)63 void set_server(Endpoint* server) { server_ = server; } 64 65 // Connects |client_| and |server_| to a virtual switch; must be called after 66 // set_client/set_server are called. 67 void WireUpEndpoints(); 68 69 // Same as above, except triggers loss of every Nth packet in both directions. 70 void WireUpEndpointsWithLoss(int lose_every_n); 71 72 // A convenience wrapper around Simulator::RunUntilOrTimeout(). 73 template <class TerminationPredicate> RunUntilWithDefaultTimeout(TerminationPredicate termination_predicate)74 bool RunUntilWithDefaultTimeout(TerminationPredicate termination_predicate) { 75 return simulator_.RunUntilOrTimeout(std::move(termination_predicate), 76 kDefaultTimeout); 77 } 78 79 private: 80 Simulator simulator_; 81 Switch switch_; 82 std::optional<SymmetricLink> client_link_; 83 std::optional<SymmetricLink> server_link_; 84 std::unique_ptr<PacketFilter> client_filter_; 85 std::unique_ptr<PacketFilter> server_filter_; 86 87 Endpoint* client_; 88 Endpoint* server_; 89 }; 90 91 } // namespace quic::simulator 92 93 #endif // QUICHE_QUIC_TEST_TOOLS_SIMULATOR_TEST_HARNESS_H_ 94