blob: 69ce78de0fd1075ce724130acb03da5b4c143e50 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2013 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/core/quic_config.h"
6
vasilvv872e7a32019-03-12 16:42:44 -07007#include <string>
8
QUICHE teama6ef0a62019-03-07 20:34:33 -05009#include "net/third_party/quiche/src/quic/core/crypto/crypto_handshake_message.h"
10#include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h"
11#include "net/third_party/quiche/src/quic/core/quic_packets.h"
12#include "net/third_party/quiche/src/quic/core/quic_time.h"
13#include "net/third_party/quiche/src/quic/core/quic_utils.h"
14#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050015#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
16#include "net/third_party/quiche/src/quic/platform/api/quic_uint128.h"
17#include "net/third_party/quiche/src/quic/test_tools/quic_config_peer.h"
18#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
19
20namespace quic {
21namespace test {
22namespace {
23
dschinazi58881132019-11-11 11:34:02 -080024const uint32_t kMaxPacketSizeForTest = 1234;
dschinazicd86dd12019-11-14 10:11:13 -080025const uint32_t kMaxDatagramFrameSizeForTest = 1333;
dschinazi58881132019-11-11 11:34:02 -080026
fkastenholzd3a1de92019-05-15 07:00:07 -070027class QuicConfigTest : public QuicTestWithParam<QuicTransportVersion> {
QUICHE teama6ef0a62019-03-07 20:34:33 -050028 protected:
29 QuicConfig config_;
30};
31
fkastenholzd3a1de92019-05-15 07:00:07 -070032// Run all tests with all versions of QUIC.
33INSTANTIATE_TEST_SUITE_P(QuicConfigTests,
34 QuicConfigTest,
dschinazi142051a2019-09-18 18:17:29 -070035 ::testing::ValuesIn(AllSupportedTransportVersions()),
36 ::testing::PrintToStringParamName());
fkastenholzd3a1de92019-05-15 07:00:07 -070037
rchb0451852019-09-11 21:17:01 -070038TEST_P(QuicConfigTest, SetDefaults) {
39 EXPECT_EQ(kMinimumFlowControlSendWindow,
40 config_.GetInitialStreamFlowControlWindowToSend());
41 EXPECT_EQ(kMinimumFlowControlSendWindow,
42 config_.GetInitialMaxStreamDataBytesIncomingBidirectionalToSend());
43 EXPECT_EQ(kMinimumFlowControlSendWindow,
44 config_.GetInitialMaxStreamDataBytesOutgoingBidirectionalToSend());
45 EXPECT_EQ(kMinimumFlowControlSendWindow,
46 config_.GetInitialMaxStreamDataBytesUnidirectionalToSend());
47 EXPECT_FALSE(config_.HasReceivedInitialStreamFlowControlWindowBytes());
48 EXPECT_FALSE(
49 config_.HasReceivedInitialMaxStreamDataBytesIncomingBidirectional());
50 EXPECT_FALSE(
51 config_.HasReceivedInitialMaxStreamDataBytesOutgoingBidirectional());
52 EXPECT_FALSE(config_.HasReceivedInitialMaxStreamDataBytesUnidirectional());
dschinazi58881132019-11-11 11:34:02 -080053 EXPECT_EQ(kMaxIncomingPacketSize, config_.GetMaxPacketSizeToSend());
54 EXPECT_FALSE(config_.HasReceivedMaxPacketSize());
rchb0451852019-09-11 21:17:01 -070055}
56
dschinazi90165ee2019-10-15 15:11:41 -070057TEST_P(QuicConfigTest, AutoSetIetfFlowControl) {
58 EXPECT_EQ(kMinimumFlowControlSendWindow,
59 config_.GetInitialStreamFlowControlWindowToSend());
60 EXPECT_EQ(kMinimumFlowControlSendWindow,
61 config_.GetInitialMaxStreamDataBytesIncomingBidirectionalToSend());
62 EXPECT_EQ(kMinimumFlowControlSendWindow,
63 config_.GetInitialMaxStreamDataBytesOutgoingBidirectionalToSend());
64 EXPECT_EQ(kMinimumFlowControlSendWindow,
65 config_.GetInitialMaxStreamDataBytesUnidirectionalToSend());
66 static const uint32_t kTestWindowSize = 1234567;
67 config_.SetInitialStreamFlowControlWindowToSend(kTestWindowSize);
68 EXPECT_EQ(kTestWindowSize, config_.GetInitialStreamFlowControlWindowToSend());
69 EXPECT_EQ(kTestWindowSize,
70 config_.GetInitialMaxStreamDataBytesIncomingBidirectionalToSend());
71 EXPECT_EQ(kTestWindowSize,
72 config_.GetInitialMaxStreamDataBytesOutgoingBidirectionalToSend());
73 EXPECT_EQ(kTestWindowSize,
74 config_.GetInitialMaxStreamDataBytesUnidirectionalToSend());
75 static const uint32_t kTestWindowSizeTwo = 2345678;
76 config_.SetInitialMaxStreamDataBytesIncomingBidirectionalToSend(
77 kTestWindowSizeTwo);
78 EXPECT_EQ(kTestWindowSize, config_.GetInitialStreamFlowControlWindowToSend());
79 EXPECT_EQ(kTestWindowSizeTwo,
80 config_.GetInitialMaxStreamDataBytesIncomingBidirectionalToSend());
81 EXPECT_EQ(kTestWindowSize,
82 config_.GetInitialMaxStreamDataBytesOutgoingBidirectionalToSend());
83 EXPECT_EQ(kTestWindowSize,
84 config_.GetInitialMaxStreamDataBytesUnidirectionalToSend());
85}
86
fkastenholzd3a1de92019-05-15 07:00:07 -070087TEST_P(QuicConfigTest, ToHandshakeMessage) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050088 config_.SetInitialStreamFlowControlWindowToSend(
89 kInitialStreamFlowControlWindowForTest);
90 config_.SetInitialSessionFlowControlWindowToSend(
91 kInitialSessionFlowControlWindowForTest);
92 config_.SetIdleNetworkTimeout(QuicTime::Delta::FromSeconds(5),
93 QuicTime::Delta::FromSeconds(2));
94 CryptoHandshakeMessage msg;
fkastenholzd3a1de92019-05-15 07:00:07 -070095 config_.ToHandshakeMessage(&msg, GetParam());
QUICHE teama6ef0a62019-03-07 20:34:33 -050096
97 uint32_t value;
98 QuicErrorCode error = msg.GetUint32(kICSL, &value);
bncf54082a2019-11-27 10:19:47 -080099 EXPECT_THAT(error, IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500100 EXPECT_EQ(5u, value);
101
102 error = msg.GetUint32(kSFCW, &value);
bncf54082a2019-11-27 10:19:47 -0800103 EXPECT_THAT(error, IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500104 EXPECT_EQ(kInitialStreamFlowControlWindowForTest, value);
105
106 error = msg.GetUint32(kCFCW, &value);
bncf54082a2019-11-27 10:19:47 -0800107 EXPECT_THAT(error, IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500108 EXPECT_EQ(kInitialSessionFlowControlWindowForTest, value);
109}
110
fkastenholzd3a1de92019-05-15 07:00:07 -0700111TEST_P(QuicConfigTest, ProcessClientHello) {
fkastenholz4c7303c2019-07-29 08:17:07 -0700112 const uint32_t kTestMaxAckDelayMs =
113 static_cast<uint32_t>(kDefaultDelayedAckTimeMs + 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500114 QuicConfig client_config;
115 QuicTagVector cgst;
116 cgst.push_back(kQBIC);
117 client_config.SetIdleNetworkTimeout(
118 QuicTime::Delta::FromSeconds(2 * kMaximumIdleTimeoutSecs),
119 QuicTime::Delta::FromSeconds(kMaximumIdleTimeoutSecs));
120 client_config.SetInitialRoundTripTimeUsToSend(10 * kNumMicrosPerMilli);
121 client_config.SetInitialStreamFlowControlWindowToSend(
122 2 * kInitialStreamFlowControlWindowForTest);
123 client_config.SetInitialSessionFlowControlWindowToSend(
124 2 * kInitialSessionFlowControlWindowForTest);
125 QuicTagVector copt;
126 copt.push_back(kTBBR);
127 client_config.SetConnectionOptionsToSend(copt);
fkastenholz4c7303c2019-07-29 08:17:07 -0700128 client_config.SetMaxAckDelayToSendMs(kTestMaxAckDelayMs);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500129 CryptoHandshakeMessage msg;
fkastenholzd3a1de92019-05-15 07:00:07 -0700130 client_config.ToHandshakeMessage(&msg, GetParam());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500131
vasilvvc48c8712019-03-11 13:38:16 -0700132 std::string error_details;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500133 QuicTagVector initial_received_options;
134 initial_received_options.push_back(kIW50);
135 EXPECT_TRUE(
136 config_.SetInitialReceivedConnectionOptions(initial_received_options));
137 EXPECT_FALSE(
138 config_.SetInitialReceivedConnectionOptions(initial_received_options))
139 << "You can only set initial options once.";
140 const QuicErrorCode error =
141 config_.ProcessPeerHello(msg, CLIENT, &error_details);
142 EXPECT_FALSE(
143 config_.SetInitialReceivedConnectionOptions(initial_received_options))
144 << "You cannot set initial options after the hello.";
bncf54082a2019-11-27 10:19:47 -0800145 EXPECT_THAT(error, IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500146 EXPECT_TRUE(config_.negotiated());
147 EXPECT_EQ(QuicTime::Delta::FromSeconds(kMaximumIdleTimeoutSecs),
148 config_.IdleNetworkTimeout());
149 EXPECT_EQ(10 * kNumMicrosPerMilli, config_.ReceivedInitialRoundTripTimeUs());
150 EXPECT_TRUE(config_.HasReceivedConnectionOptions());
151 EXPECT_EQ(2u, config_.ReceivedConnectionOptions().size());
152 EXPECT_EQ(config_.ReceivedConnectionOptions()[0], kIW50);
153 EXPECT_EQ(config_.ReceivedConnectionOptions()[1], kTBBR);
154 EXPECT_EQ(config_.ReceivedInitialStreamFlowControlWindowBytes(),
155 2 * kInitialStreamFlowControlWindowForTest);
156 EXPECT_EQ(config_.ReceivedInitialSessionFlowControlWindowBytes(),
157 2 * kInitialSessionFlowControlWindowForTest);
fkastenholz4c7303c2019-07-29 08:17:07 -0700158 if (GetQuicReloadableFlag(quic_negotiate_ack_delay_time)) {
159 EXPECT_TRUE(config_.HasReceivedMaxAckDelayMs());
160 EXPECT_EQ(kTestMaxAckDelayMs, config_.ReceivedMaxAckDelayMs());
161 } else {
162 EXPECT_FALSE(config_.HasReceivedMaxAckDelayMs());
163 }
rchb0451852019-09-11 21:17:01 -0700164
165 // IETF QUIC stream limits should not be received in QUIC crypto messages.
166 EXPECT_FALSE(
167 config_.HasReceivedInitialMaxStreamDataBytesIncomingBidirectional());
168 EXPECT_FALSE(
169 config_.HasReceivedInitialMaxStreamDataBytesOutgoingBidirectional());
170 EXPECT_FALSE(config_.HasReceivedInitialMaxStreamDataBytesUnidirectional());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500171}
172
fkastenholzd3a1de92019-05-15 07:00:07 -0700173TEST_P(QuicConfigTest, ProcessServerHello) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500174 QuicIpAddress host;
175 host.FromString("127.0.3.1");
176 const QuicSocketAddress kTestServerAddress = QuicSocketAddress(host, 1234);
177 const QuicUint128 kTestResetToken = MakeQuicUint128(0, 10111100001);
fkastenholz4c7303c2019-07-29 08:17:07 -0700178 const uint32_t kTestMaxAckDelayMs =
179 static_cast<uint32_t>(kDefaultDelayedAckTimeMs + 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500180 QuicConfig server_config;
181 QuicTagVector cgst;
182 cgst.push_back(kQBIC);
183 server_config.SetIdleNetworkTimeout(
184 QuicTime::Delta::FromSeconds(kMaximumIdleTimeoutSecs / 2),
185 QuicTime::Delta::FromSeconds(kMaximumIdleTimeoutSecs / 2));
186 server_config.SetInitialRoundTripTimeUsToSend(10 * kNumMicrosPerMilli);
187 server_config.SetInitialStreamFlowControlWindowToSend(
188 2 * kInitialStreamFlowControlWindowForTest);
189 server_config.SetInitialSessionFlowControlWindowToSend(
190 2 * kInitialSessionFlowControlWindowForTest);
191 server_config.SetAlternateServerAddressToSend(kTestServerAddress);
192 server_config.SetStatelessResetTokenToSend(kTestResetToken);
fkastenholz4c7303c2019-07-29 08:17:07 -0700193 server_config.SetMaxAckDelayToSendMs(kTestMaxAckDelayMs);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500194 CryptoHandshakeMessage msg;
fkastenholzd3a1de92019-05-15 07:00:07 -0700195 server_config.ToHandshakeMessage(&msg, GetParam());
vasilvvc48c8712019-03-11 13:38:16 -0700196 std::string error_details;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500197 const QuicErrorCode error =
198 config_.ProcessPeerHello(msg, SERVER, &error_details);
bncf54082a2019-11-27 10:19:47 -0800199 EXPECT_THAT(error, IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500200 EXPECT_TRUE(config_.negotiated());
201 EXPECT_EQ(QuicTime::Delta::FromSeconds(kMaximumIdleTimeoutSecs / 2),
202 config_.IdleNetworkTimeout());
203 EXPECT_EQ(10 * kNumMicrosPerMilli, config_.ReceivedInitialRoundTripTimeUs());
204 EXPECT_EQ(config_.ReceivedInitialStreamFlowControlWindowBytes(),
205 2 * kInitialStreamFlowControlWindowForTest);
206 EXPECT_EQ(config_.ReceivedInitialSessionFlowControlWindowBytes(),
207 2 * kInitialSessionFlowControlWindowForTest);
208 EXPECT_TRUE(config_.HasReceivedAlternateServerAddress());
209 EXPECT_EQ(kTestServerAddress, config_.ReceivedAlternateServerAddress());
210 EXPECT_TRUE(config_.HasReceivedStatelessResetToken());
211 EXPECT_EQ(kTestResetToken, config_.ReceivedStatelessResetToken());
fkastenholz4c7303c2019-07-29 08:17:07 -0700212 if (GetQuicReloadableFlag(quic_negotiate_ack_delay_time)) {
213 EXPECT_TRUE(config_.HasReceivedMaxAckDelayMs());
214 EXPECT_EQ(kTestMaxAckDelayMs, config_.ReceivedMaxAckDelayMs());
215 } else {
216 EXPECT_FALSE(config_.HasReceivedMaxAckDelayMs());
217 }
rchb0451852019-09-11 21:17:01 -0700218
219 // IETF QUIC stream limits should not be received in QUIC crypto messages.
220 EXPECT_FALSE(
221 config_.HasReceivedInitialMaxStreamDataBytesIncomingBidirectional());
222 EXPECT_FALSE(
223 config_.HasReceivedInitialMaxStreamDataBytesOutgoingBidirectional());
224 EXPECT_FALSE(config_.HasReceivedInitialMaxStreamDataBytesUnidirectional());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500225}
226
fkastenholzd3a1de92019-05-15 07:00:07 -0700227TEST_P(QuicConfigTest, MissingOptionalValuesInCHLO) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500228 CryptoHandshakeMessage msg;
229 msg.SetValue(kICSL, 1);
230
231 // Set all REQUIRED tags.
232 msg.SetValue(kICSL, 1);
fkastenholzd3a1de92019-05-15 07:00:07 -0700233 msg.SetValue(kMIBS, 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500234
235 // No error, as rest are optional.
vasilvvc48c8712019-03-11 13:38:16 -0700236 std::string error_details;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500237 const QuicErrorCode error =
238 config_.ProcessPeerHello(msg, CLIENT, &error_details);
bncf54082a2019-11-27 10:19:47 -0800239 EXPECT_THAT(error, IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500240 EXPECT_TRUE(config_.negotiated());
241}
242
fkastenholzd3a1de92019-05-15 07:00:07 -0700243TEST_P(QuicConfigTest, MissingOptionalValuesInSHLO) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500244 CryptoHandshakeMessage msg;
245
246 // Set all REQUIRED tags.
247 msg.SetValue(kICSL, 1);
fkastenholzd3a1de92019-05-15 07:00:07 -0700248 msg.SetValue(kMIBS, 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500249
250 // No error, as rest are optional.
vasilvvc48c8712019-03-11 13:38:16 -0700251 std::string error_details;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500252 const QuicErrorCode error =
253 config_.ProcessPeerHello(msg, SERVER, &error_details);
bncf54082a2019-11-27 10:19:47 -0800254 EXPECT_THAT(error, IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500255 EXPECT_TRUE(config_.negotiated());
256}
257
fkastenholzd3a1de92019-05-15 07:00:07 -0700258TEST_P(QuicConfigTest, MissingValueInCHLO) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500259 // Server receives CHLO with missing kICSL.
260 CryptoHandshakeMessage msg;
vasilvvc48c8712019-03-11 13:38:16 -0700261 std::string error_details;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500262 const QuicErrorCode error =
263 config_.ProcessPeerHello(msg, CLIENT, &error_details);
bncf54082a2019-11-27 10:19:47 -0800264 EXPECT_THAT(error, IsError(QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500265}
266
fkastenholzd3a1de92019-05-15 07:00:07 -0700267TEST_P(QuicConfigTest, MissingValueInSHLO) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500268 // Client receives SHLO with missing kICSL.
269 CryptoHandshakeMessage msg;
vasilvvc48c8712019-03-11 13:38:16 -0700270 std::string error_details;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500271 const QuicErrorCode error =
272 config_.ProcessPeerHello(msg, SERVER, &error_details);
bncf54082a2019-11-27 10:19:47 -0800273 EXPECT_THAT(error, IsError(QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500274}
275
fkastenholzd3a1de92019-05-15 07:00:07 -0700276TEST_P(QuicConfigTest, OutOfBoundSHLO) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500277 QuicConfig server_config;
278 server_config.SetIdleNetworkTimeout(
279 QuicTime::Delta::FromSeconds(2 * kMaximumIdleTimeoutSecs),
280 QuicTime::Delta::FromSeconds(2 * kMaximumIdleTimeoutSecs));
281
282 CryptoHandshakeMessage msg;
fkastenholzd3a1de92019-05-15 07:00:07 -0700283 server_config.ToHandshakeMessage(&msg, GetParam());
vasilvvc48c8712019-03-11 13:38:16 -0700284 std::string error_details;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500285 const QuicErrorCode error =
286 config_.ProcessPeerHello(msg, SERVER, &error_details);
bncf54082a2019-11-27 10:19:47 -0800287 EXPECT_THAT(error, IsError(QUIC_INVALID_NEGOTIATED_VALUE));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500288}
289
fkastenholzd3a1de92019-05-15 07:00:07 -0700290TEST_P(QuicConfigTest, InvalidFlowControlWindow) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500291 // QuicConfig should not accept an invalid flow control window to send to the
292 // peer: the receive window must be at least the default of 16 Kb.
293 QuicConfig config;
294 const uint64_t kInvalidWindow = kMinimumFlowControlSendWindow - 1;
295 EXPECT_QUIC_BUG(
296 config.SetInitialStreamFlowControlWindowToSend(kInvalidWindow),
297 "Initial stream flow control receive window");
298
299 EXPECT_EQ(kMinimumFlowControlSendWindow,
300 config.GetInitialStreamFlowControlWindowToSend());
301}
302
fkastenholzd3a1de92019-05-15 07:00:07 -0700303TEST_P(QuicConfigTest, HasClientSentConnectionOption) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500304 QuicConfig client_config;
305 QuicTagVector copt;
306 copt.push_back(kTBBR);
307 client_config.SetConnectionOptionsToSend(copt);
308 EXPECT_TRUE(client_config.HasClientSentConnectionOption(
309 kTBBR, Perspective::IS_CLIENT));
310
311 CryptoHandshakeMessage msg;
fkastenholzd3a1de92019-05-15 07:00:07 -0700312 client_config.ToHandshakeMessage(&msg, GetParam());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500313
vasilvvc48c8712019-03-11 13:38:16 -0700314 std::string error_details;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500315 const QuicErrorCode error =
316 config_.ProcessPeerHello(msg, CLIENT, &error_details);
bncf54082a2019-11-27 10:19:47 -0800317 EXPECT_THAT(error, IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500318 EXPECT_TRUE(config_.negotiated());
319
320 EXPECT_TRUE(config_.HasReceivedConnectionOptions());
321 EXPECT_EQ(1u, config_.ReceivedConnectionOptions().size());
322 EXPECT_TRUE(
323 config_.HasClientSentConnectionOption(kTBBR, Perspective::IS_SERVER));
324}
325
fkastenholzd3a1de92019-05-15 07:00:07 -0700326TEST_P(QuicConfigTest, DontSendClientConnectionOptions) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500327 QuicConfig client_config;
328 QuicTagVector copt;
329 copt.push_back(kTBBR);
330 client_config.SetClientConnectionOptions(copt);
331
332 CryptoHandshakeMessage msg;
fkastenholzd3a1de92019-05-15 07:00:07 -0700333 client_config.ToHandshakeMessage(&msg, GetParam());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500334
vasilvvc48c8712019-03-11 13:38:16 -0700335 std::string error_details;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500336 const QuicErrorCode error =
337 config_.ProcessPeerHello(msg, CLIENT, &error_details);
bncf54082a2019-11-27 10:19:47 -0800338 EXPECT_THAT(error, IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500339 EXPECT_TRUE(config_.negotiated());
340
341 EXPECT_FALSE(config_.HasReceivedConnectionOptions());
342}
343
fkastenholzd3a1de92019-05-15 07:00:07 -0700344TEST_P(QuicConfigTest, HasClientRequestedIndependentOption) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500345 QuicConfig client_config;
346 QuicTagVector client_opt;
347 client_opt.push_back(kRENO);
348 QuicTagVector copt;
349 copt.push_back(kTBBR);
350 client_config.SetClientConnectionOptions(client_opt);
351 client_config.SetConnectionOptionsToSend(copt);
352 EXPECT_TRUE(client_config.HasClientSentConnectionOption(
353 kTBBR, Perspective::IS_CLIENT));
354 EXPECT_TRUE(client_config.HasClientRequestedIndependentOption(
355 kRENO, Perspective::IS_CLIENT));
356 EXPECT_FALSE(client_config.HasClientRequestedIndependentOption(
357 kTBBR, Perspective::IS_CLIENT));
358
359 CryptoHandshakeMessage msg;
fkastenholzd3a1de92019-05-15 07:00:07 -0700360 client_config.ToHandshakeMessage(&msg, GetParam());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500361
vasilvvc48c8712019-03-11 13:38:16 -0700362 std::string error_details;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500363 const QuicErrorCode error =
364 config_.ProcessPeerHello(msg, CLIENT, &error_details);
bncf54082a2019-11-27 10:19:47 -0800365 EXPECT_THAT(error, IsQuicNoError());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500366 EXPECT_TRUE(config_.negotiated());
367
368 EXPECT_TRUE(config_.HasReceivedConnectionOptions());
369 EXPECT_EQ(1u, config_.ReceivedConnectionOptions().size());
370 EXPECT_FALSE(config_.HasClientRequestedIndependentOption(
371 kRENO, Perspective::IS_SERVER));
372 EXPECT_TRUE(config_.HasClientRequestedIndependentOption(
373 kTBBR, Perspective::IS_SERVER));
374}
375
dschinazi6464c4a2019-09-11 16:25:01 -0700376TEST_P(QuicConfigTest, IncomingLargeIdleTimeoutTransportParameter) {
377 // Configure our default to 30s and max to 60s, then receive 120s from peer.
378 // Since the received value is above the max, we should then use the max.
379 config_.SetIdleNetworkTimeout(quic::QuicTime::Delta::FromSeconds(60),
380 quic::QuicTime::Delta::FromSeconds(30));
381 TransportParameters params;
382 params.idle_timeout_milliseconds.set_value(120000);
383
384 std::string error_details = "foobar";
bncf54082a2019-11-27 10:19:47 -0800385 EXPECT_THAT(
386 config_.ProcessTransportParameters(params, SERVER, &error_details),
387 IsQuicNoError());
dschinazi6464c4a2019-09-11 16:25:01 -0700388 EXPECT_EQ("", error_details);
389 EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(60),
390 config_.IdleNetworkTimeout());
391}
392
rchb0451852019-09-11 21:17:01 -0700393TEST_P(QuicConfigTest, FillTransportParams) {
394 config_.SetInitialMaxStreamDataBytesIncomingBidirectionalToSend(
395 2 * kMinimumFlowControlSendWindow);
396 config_.SetInitialMaxStreamDataBytesOutgoingBidirectionalToSend(
397 3 * kMinimumFlowControlSendWindow);
398 config_.SetInitialMaxStreamDataBytesUnidirectionalToSend(
399 4 * kMinimumFlowControlSendWindow);
dschinazi58881132019-11-11 11:34:02 -0800400 config_.SetMaxPacketSizeToSend(kMaxPacketSizeForTest);
dschinazicd86dd12019-11-14 10:11:13 -0800401 config_.SetMaxDatagramFrameSizeToSend(kMaxDatagramFrameSizeForTest);
rchb0451852019-09-11 21:17:01 -0700402
403 TransportParameters params;
404 config_.FillTransportParameters(&params);
405
406 EXPECT_EQ(2 * kMinimumFlowControlSendWindow,
rchb0451852019-09-11 21:17:01 -0700407 params.initial_max_stream_data_bidi_remote.value());
dschinazi18cdf132019-10-09 16:08:18 -0700408 EXPECT_EQ(3 * kMinimumFlowControlSendWindow,
409 params.initial_max_stream_data_bidi_local.value());
rchb0451852019-09-11 21:17:01 -0700410 EXPECT_EQ(4 * kMinimumFlowControlSendWindow,
411 params.initial_max_stream_data_uni.value());
dschinaziaab68182019-10-09 15:39:51 -0700412
413 EXPECT_EQ(static_cast<uint64_t>(kMaximumIdleTimeoutSecs * 1000),
414 params.idle_timeout_milliseconds.value());
dschinazi58881132019-11-11 11:34:02 -0800415
416 EXPECT_EQ(kMaxPacketSizeForTest, params.max_packet_size.value());
dschinazicd86dd12019-11-14 10:11:13 -0800417 EXPECT_EQ(kMaxDatagramFrameSizeForTest,
418 params.max_datagram_frame_size.value());
rchb0451852019-09-11 21:17:01 -0700419}
420
421TEST_P(QuicConfigTest, ProcessTransportParametersServer) {
422 TransportParameters params;
423
424 params.initial_max_stream_data_bidi_local.set_value(
425 2 * kMinimumFlowControlSendWindow);
426 params.initial_max_stream_data_bidi_remote.set_value(
427 3 * kMinimumFlowControlSendWindow);
428 params.initial_max_stream_data_uni.set_value(4 *
429 kMinimumFlowControlSendWindow);
dschinazi58881132019-11-11 11:34:02 -0800430 params.max_packet_size.set_value(kMaxPacketSizeForTest);
dschinazicd86dd12019-11-14 10:11:13 -0800431 params.max_datagram_frame_size.set_value(kMaxDatagramFrameSizeForTest);
rchb0451852019-09-11 21:17:01 -0700432
433 std::string error_details;
bncf54082a2019-11-27 10:19:47 -0800434 EXPECT_THAT(
435 config_.ProcessTransportParameters(params, SERVER, &error_details),
436 IsQuicNoError());
rchb0451852019-09-11 21:17:01 -0700437
438 ASSERT_TRUE(
439 config_.HasReceivedInitialMaxStreamDataBytesIncomingBidirectional());
440 EXPECT_EQ(2 * kMinimumFlowControlSendWindow,
441 config_.ReceivedInitialMaxStreamDataBytesIncomingBidirectional());
442
443 ASSERT_TRUE(
444 config_.HasReceivedInitialMaxStreamDataBytesOutgoingBidirectional());
445 EXPECT_EQ(3 * kMinimumFlowControlSendWindow,
446 config_.ReceivedInitialMaxStreamDataBytesOutgoingBidirectional());
447
448 ASSERT_TRUE(config_.HasReceivedInitialMaxStreamDataBytesUnidirectional());
449 EXPECT_EQ(4 * kMinimumFlowControlSendWindow,
450 config_.ReceivedInitialMaxStreamDataBytesUnidirectional());
dschinazi58881132019-11-11 11:34:02 -0800451
452 ASSERT_TRUE(config_.HasReceivedMaxPacketSize());
453 EXPECT_EQ(kMaxPacketSizeForTest, config_.ReceivedMaxPacketSize());
dschinazicd86dd12019-11-14 10:11:13 -0800454
455 ASSERT_TRUE(config_.HasReceivedMaxDatagramFrameSize());
456 EXPECT_EQ(kMaxDatagramFrameSizeForTest,
457 config_.ReceivedMaxDatagramFrameSize());
458
dschinazi8067d552019-11-13 19:44:00 -0800459 EXPECT_FALSE(config_.DisableConnectionMigration());
460}
461
462TEST_P(QuicConfigTest, DisableMigrationTransportParameter) {
463 TransportParameters params;
464 params.disable_migration = true;
465 std::string error_details;
bncf54082a2019-11-27 10:19:47 -0800466 EXPECT_THAT(
467 config_.ProcessTransportParameters(params, SERVER, &error_details),
468 IsQuicNoError());
dschinazi8067d552019-11-13 19:44:00 -0800469 EXPECT_TRUE(config_.DisableConnectionMigration());
rchb0451852019-09-11 21:17:01 -0700470}
471
QUICHE teama6ef0a62019-03-07 20:34:33 -0500472} // namespace
473} // namespace test
474} // namespace quic