blob: 3fbd18b83f33861dc73add84555d044eeadf059a [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2018 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#include "net/third_party/quiche/src/quic/quartc/simulated_packet_transport.h"
6
7#include "testing/gmock/include/gmock/gmock.h"
8#include "testing/gtest/include/gtest/gtest.h"
9#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
10#include "net/third_party/quiche/src/quic/quartc/quartc_packet_writer.h"
11#include "net/third_party/quiche/src/quic/test_tools/simulator/simulator.h"
12#include "net/third_party/quiche/src/quic/test_tools/simulator/switch.h"
13
14namespace quic {
15namespace simulator {
16namespace {
17
18using ::testing::ElementsAre;
19
20const QuicBandwidth kDefaultBandwidth =
21 QuicBandwidth::FromKBitsPerSecond(10 * 1000);
22const QuicTime::Delta kDefaultPropagationDelay =
23 QuicTime::Delta::FromMilliseconds(20);
24const QuicByteCount kDefaultBdp = kDefaultBandwidth * kDefaultPropagationDelay;
25const QuicByteCount kDefaultPacketSize = 1200;
26const QuicPacketCount kDefaultQueueLength = 10;
27
28class FakeDelegate : public QuartcPacketTransport::Delegate {
29 public:
30 explicit FakeDelegate(QuartcPacketTransport* transport)
31 : transport_(transport) {
32 transport_->SetDelegate(this);
33 }
34
35 ~FakeDelegate() { transport_->SetDelegate(nullptr); }
36
37 void OnTransportCanWrite() override {
38 while (!packets_to_send_.empty()) {
39 const QuicString& packet = packets_to_send_.front();
40 if (transport_->Write(packet.data(), packet.size(),
41 QuartcPacketTransport::PacketInfo()) <
42 static_cast<int>(packet.size())) {
43 ++write_blocked_count_;
44 return;
45 }
46 packets_to_send_.pop();
47 }
48 }
49
50 void OnTransportReceived(const char* data, size_t data_len) override {
51 packets_received_.emplace_back(data, data_len);
52 }
53
54 void AddPacketToSend(const QuicString& packet) {
55 packets_to_send_.push(packet);
56 }
57
58 size_t packets_to_send() { return packets_to_send_.size(); }
59 const std::vector<QuicString>& packets_received() {
60 return packets_received_;
61 }
62 int write_blocked_count() { return write_blocked_count_; }
63
64 private:
65 QuartcPacketTransport* const transport_ = nullptr;
66 std::queue<QuicString> packets_to_send_;
67 std::vector<QuicString> packets_received_;
68 int write_blocked_count_ = 0;
69};
70
71class SimulatedPacketTransportTest : public QuicTest {
72 protected:
73 SimulatedPacketTransportTest()
74 : switch_(&simulator_, "Switch", /*port_count=*/8, 2 * kDefaultBdp),
75 client_(&simulator_,
76 "sender",
77 "receiver",
78 kDefaultQueueLength * kDefaultPacketSize),
79 server_(&simulator_,
80 "receiver",
81 "sender",
82 kDefaultQueueLength * kDefaultPacketSize),
83 client_link_(&client_,
84 switch_.port(1),
85 kDefaultBandwidth,
86 kDefaultPropagationDelay),
87 server_link_(&server_,
88 switch_.port(2),
89 kDefaultBandwidth,
90 kDefaultPropagationDelay),
91 client_delegate_(&client_),
92 server_delegate_(&server_) {}
93
94 Simulator simulator_;
95 Switch switch_;
96
97 SimulatedQuartcPacketTransport client_;
98 SimulatedQuartcPacketTransport server_;
99
100 SymmetricLink client_link_;
101 SymmetricLink server_link_;
102
103 FakeDelegate client_delegate_;
104 FakeDelegate server_delegate_;
105};
106
107TEST_F(SimulatedPacketTransportTest, OneWayTransmission) {
108 QuicString packet_1(kDefaultPacketSize, 'a');
109 QuicString packet_2(kDefaultPacketSize, 'b');
110 client_delegate_.AddPacketToSend(packet_1);
111 client_delegate_.AddPacketToSend(packet_2);
112
113 simulator_.RunUntil(
114 [this] { return client_delegate_.packets_to_send() == 0; });
115 simulator_.RunFor(3 * kDefaultPropagationDelay);
116
117 EXPECT_THAT(server_delegate_.packets_received(),
118 ElementsAre(packet_1, packet_2));
119 EXPECT_THAT(client_delegate_.packets_received(), ElementsAre());
120}
121
122TEST_F(SimulatedPacketTransportTest, TwoWayTransmission) {
123 QuicString packet_1(kDefaultPacketSize, 'a');
124 QuicString packet_2(kDefaultPacketSize, 'b');
125 QuicString packet_3(kDefaultPacketSize, 'c');
126 QuicString packet_4(kDefaultPacketSize, 'd');
127
128 client_delegate_.AddPacketToSend(packet_1);
129 client_delegate_.AddPacketToSend(packet_2);
130 server_delegate_.AddPacketToSend(packet_3);
131 server_delegate_.AddPacketToSend(packet_4);
132
133 simulator_.RunUntil(
134 [this] { return client_delegate_.packets_to_send() == 0; });
135 simulator_.RunUntil(
136 [this] { return server_delegate_.packets_to_send() == 0; });
137 simulator_.RunFor(3 * kDefaultPropagationDelay);
138
139 EXPECT_THAT(server_delegate_.packets_received(),
140 ElementsAre(packet_1, packet_2));
141 EXPECT_THAT(client_delegate_.packets_received(),
142 ElementsAre(packet_3, packet_4));
143}
144
145TEST_F(SimulatedPacketTransportTest, TestWriteBlocked) {
146 // Add 10 packets beyond what fits in the egress queue.
147 std::vector<QuicString> packets;
148 for (unsigned int i = 0; i < kDefaultQueueLength + 10; ++i) {
149 packets.push_back(QuicString(kDefaultPacketSize, 'a' + i));
150 client_delegate_.AddPacketToSend(packets.back());
151 }
152
153 simulator_.RunUntil(
154 [this] { return client_delegate_.packets_to_send() == 0; });
155 simulator_.RunFor(3 * kDefaultPropagationDelay);
156
157 // Each of the 10 packets in excess of the sender's egress queue length will
158 // block the first time |client_delegate_| tries to write them.
159 EXPECT_EQ(client_delegate_.write_blocked_count(), 10);
160 EXPECT_EQ(server_delegate_.packets_received(), packets);
161}
162
163} // namespace
164} // namespace simulator
165} // namespace quic