xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/test_tools/simulator/test_harness.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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