blob: a03763943d429d06139e150fa9079236bf68a53c [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2012 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_versions.h"
6
7#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
nharper4fd11052019-06-04 14:23:22 -07008#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -05009#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
10#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
11#include "net/third_party/quiche/src/quic/platform/api/quic_mock_log.h"
12#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
13
14namespace quic {
15namespace test {
16namespace {
17
18using testing::_;
19
20class QuicVersionsTest : public QuicTest {
21 protected:
22 QuicVersionLabel MakeVersionLabel(char a, char b, char c, char d) {
23 return MakeQuicTag(d, c, b, a);
24 }
25};
26
27TEST_F(QuicVersionsTest, QuicVersionToQuicVersionLabel) {
28 // If you add a new version to the QuicTransportVersion enum you will need to
29 // add a new case to QuicVersionToQuicVersionLabel, otherwise this test will
30 // fail.
31
32 // Any logs would indicate an unsupported version which we don't expect.
33 CREATE_QUIC_MOCK_LOG(log);
34 EXPECT_QUIC_LOG_CALL(log).Times(0);
35 log.StartCapturingLogs();
36
37 // Explicitly test a specific version.
38 EXPECT_EQ(MakeQuicTag('9', '3', '0', 'Q'),
39 QuicVersionToQuicVersionLabel(QUIC_VERSION_39));
40
41 // Loop over all supported versions and make sure that we never hit the
42 // default case (i.e. all supported versions should be successfully converted
43 // to valid QuicVersionLabels).
44 for (size_t i = 0; i < QUIC_ARRAYSIZE(kSupportedTransportVersions); ++i) {
45 QuicTransportVersion version = kSupportedTransportVersions[i];
46 EXPECT_LT(0u, QuicVersionToQuicVersionLabel(version));
47 }
48}
49
50TEST_F(QuicVersionsTest, QuicVersionToQuicVersionLabelUnsupported) {
nharper4fd11052019-06-04 14:23:22 -070051 EXPECT_QUIC_BUG(QuicVersionToQuicVersionLabel(QUIC_VERSION_UNSUPPORTED),
52 "Unsupported QuicTransportVersion: 0");
QUICHE teama6ef0a62019-03-07 20:34:33 -050053}
54
55TEST_F(QuicVersionsTest, QuicVersionLabelToQuicTransportVersion) {
56 // If you add a new version to the QuicTransportVersion enum you will need to
57 // add a new case to QuicVersionLabelToQuicTransportVersion, otherwise this
58 // test will fail.
59
60 // Any logs would indicate an unsupported version which we don't expect.
61 CREATE_QUIC_MOCK_LOG(log);
62 EXPECT_QUIC_LOG_CALL(log).Times(0);
63 log.StartCapturingLogs();
64
65 // Explicitly test specific versions.
66 EXPECT_EQ(QUIC_VERSION_39,
67 QuicVersionLabelToQuicVersion(MakeQuicTag('9', '3', '0', 'Q')));
68
69 for (size_t i = 0; i < QUIC_ARRAYSIZE(kSupportedTransportVersions); ++i) {
70 QuicTransportVersion version = kSupportedTransportVersions[i];
71
72 // Get the label from the version (we can loop over QuicVersions easily).
73 QuicVersionLabel version_label = QuicVersionToQuicVersionLabel(version);
74 EXPECT_LT(0u, version_label);
75
76 // Now try converting back.
77 QuicTransportVersion label_to_transport_version =
78 QuicVersionLabelToQuicVersion(version_label);
79 EXPECT_EQ(version, label_to_transport_version);
80 EXPECT_NE(QUIC_VERSION_UNSUPPORTED, label_to_transport_version);
81 }
82}
83
84TEST_F(QuicVersionsTest, QuicVersionLabelToQuicVersionUnsupported) {
85 CREATE_QUIC_MOCK_LOG(log);
86 if (QUIC_DLOG_INFO_IS_ON()) {
87 EXPECT_QUIC_LOG_CALL_CONTAINS(log, INFO,
88 "Unsupported QuicVersionLabel version: EKAF")
89 .Times(1);
90 }
91 log.StartCapturingLogs();
92
93 EXPECT_EQ(QUIC_VERSION_UNSUPPORTED,
94 QuicVersionLabelToQuicVersion(MakeQuicTag('F', 'A', 'K', 'E')));
95}
96
97TEST_F(QuicVersionsTest, QuicVersionLabelToHandshakeProtocol) {
98 CREATE_QUIC_MOCK_LOG(log);
99 EXPECT_QUIC_LOG_CALL(log).Times(0);
100 log.StartCapturingLogs();
101
102 for (size_t i = 0; i < QUIC_ARRAYSIZE(kSupportedTransportVersions); ++i) {
103 QuicVersionLabel version_label =
104 QuicVersionToQuicVersionLabel(kSupportedTransportVersions[i]);
105 EXPECT_EQ(PROTOCOL_QUIC_CRYPTO,
106 QuicVersionLabelToHandshakeProtocol(version_label));
107 }
108
109 // Test a TLS version:
QUICHE teama6ef0a62019-03-07 20:34:33 -0500110 QuicTag tls_tag = MakeQuicTag('3', '4', '0', 'T');
111 EXPECT_EQ(PROTOCOL_TLS1_3, QuicVersionLabelToHandshakeProtocol(tls_tag));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500112}
113
114TEST_F(QuicVersionsTest, ParseQuicVersionLabel) {
115 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_39),
116 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '3', '9')));
117 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43),
118 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '3')));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500119 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46),
120 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '6')));
121 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_47),
122 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '7')));
nharper107ba5f2019-07-02 21:33:39 -0700123 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48),
124 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '8')));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500125
nharperf5e68452019-05-29 17:24:18 -0700126 // Test TLS versions:
QUICHE teama6ef0a62019-03-07 20:34:33 -0500127 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_39),
128 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '3', '9')));
129 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_43),
130 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '3')));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500131 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_46),
132 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '6')));
133 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_47),
134 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '7')));
nharper107ba5f2019-07-02 21:33:39 -0700135 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_48),
136 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '8')));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500137}
138
dschinazi8ae60012019-04-04 18:07:27 -0700139TEST_F(QuicVersionsTest, ParseQuicVersionString) {
140 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_39),
141 ParseQuicVersionString("Q039"));
142 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43),
143 ParseQuicVersionString("Q043"));
dschinazi8ae60012019-04-04 18:07:27 -0700144 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46),
145 ParseQuicVersionString("Q046"));
146 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_47),
147 ParseQuicVersionString("Q047"));
nharper107ba5f2019-07-02 21:33:39 -0700148 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48),
149 ParseQuicVersionString("Q048"));
dschinazi8ae60012019-04-04 18:07:27 -0700150
151 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString(""));
152 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString("Q 47"));
153 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString("Q047 "));
154
155 // Test a TLS version:
rch16df2a52019-09-10 10:50:09 -0700156 SetQuicReloadableFlag(quic_supports_tls_handshake, true);
dschinazi8ae60012019-04-04 18:07:27 -0700157 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_39),
158 ParseQuicVersionString("T039"));
159 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_43),
160 ParseQuicVersionString("T043"));
dschinazi8ae60012019-04-04 18:07:27 -0700161 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_46),
162 ParseQuicVersionString("T046"));
163 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_47),
164 ParseQuicVersionString("T047"));
nharper107ba5f2019-07-02 21:33:39 -0700165 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_48),
166 ParseQuicVersionString("T048"));
dschinazi8ae60012019-04-04 18:07:27 -0700167}
168
QUICHE teama6ef0a62019-03-07 20:34:33 -0500169TEST_F(QuicVersionsTest, CreateQuicVersionLabel) {
170 EXPECT_EQ(MakeVersionLabel('Q', '0', '3', '9'),
171 CreateQuicVersionLabel(
172 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_39)));
173 EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '3'),
174 CreateQuicVersionLabel(
175 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43)));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500176 EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '6'),
177 CreateQuicVersionLabel(
178 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46)));
179 EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '7'),
180 CreateQuicVersionLabel(
181 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_47)));
nharper107ba5f2019-07-02 21:33:39 -0700182 EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '8'),
183 CreateQuicVersionLabel(
184 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48)));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500185
186 // Test a TLS version:
QUICHE teama6ef0a62019-03-07 20:34:33 -0500187 EXPECT_EQ(MakeVersionLabel('T', '0', '3', '9'),
188 CreateQuicVersionLabel(
189 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_39)));
190 EXPECT_EQ(MakeVersionLabel('T', '0', '4', '3'),
191 CreateQuicVersionLabel(
192 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_43)));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500193 EXPECT_EQ(MakeVersionLabel('T', '0', '4', '6'),
194 CreateQuicVersionLabel(
195 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_46)));
196 EXPECT_EQ(MakeVersionLabel('T', '0', '4', '7'),
197 CreateQuicVersionLabel(
198 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_47)));
nharper107ba5f2019-07-02 21:33:39 -0700199 EXPECT_EQ(MakeVersionLabel('T', '0', '4', '8'),
200 CreateQuicVersionLabel(
201 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_48)));
dschinazi1ac22cc2019-06-25 11:47:50 -0700202
203 // Make sure the negotiation reserved version is in the IETF reserved space.
204 EXPECT_EQ(MakeVersionLabel(0xda, 0x5a, 0x3a, 0x3a) & 0x0f0f0f0f,
205 CreateQuicVersionLabel(ParsedQuicVersion(
206 PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_RESERVED_FOR_NEGOTIATION)) &
207 0x0f0f0f0f);
208
209 // Make sure that disabling randomness works.
210 SetQuicFlag(FLAGS_quic_disable_version_negotiation_grease_randomness, true);
211 EXPECT_EQ(MakeVersionLabel(0xda, 0x5a, 0x3a, 0x3a),
212 CreateQuicVersionLabel(ParsedQuicVersion(
213 PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_RESERVED_FOR_NEGOTIATION)));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500214}
215
216TEST_F(QuicVersionsTest, QuicVersionLabelToString) {
217 QuicVersionLabelVector version_labels = {
218 MakeVersionLabel('Q', '0', '3', '5'),
219 MakeVersionLabel('Q', '0', '3', '7'),
220 MakeVersionLabel('T', '0', '3', '8'),
221 };
222
223 EXPECT_EQ("Q035", QuicVersionLabelToString(version_labels[0]));
224 EXPECT_EQ("T038", QuicVersionLabelToString(version_labels[2]));
225
226 EXPECT_EQ("Q035,Q037,T038", QuicVersionLabelVectorToString(version_labels));
227 EXPECT_EQ("Q035:Q037:T038",
228 QuicVersionLabelVectorToString(version_labels, ":", 2));
229 EXPECT_EQ("Q035|Q037|...",
230 QuicVersionLabelVectorToString(version_labels, "|", 1));
231}
232
233TEST_F(QuicVersionsTest, QuicVersionToString) {
234 EXPECT_EQ("QUIC_VERSION_39", QuicVersionToString(QUIC_VERSION_39));
235 EXPECT_EQ("QUIC_VERSION_UNSUPPORTED",
236 QuicVersionToString(QUIC_VERSION_UNSUPPORTED));
237
238 QuicTransportVersion single_version[] = {QUIC_VERSION_39};
239 QuicTransportVersionVector versions_vector;
240 for (size_t i = 0; i < QUIC_ARRAYSIZE(single_version); ++i) {
241 versions_vector.push_back(single_version[i]);
242 }
243 EXPECT_EQ("QUIC_VERSION_39",
244 QuicTransportVersionVectorToString(versions_vector));
245
246 QuicTransportVersion multiple_versions[] = {QUIC_VERSION_UNSUPPORTED,
247 QUIC_VERSION_39};
248 versions_vector.clear();
249 for (size_t i = 0; i < QUIC_ARRAYSIZE(multiple_versions); ++i) {
250 versions_vector.push_back(multiple_versions[i]);
251 }
252 EXPECT_EQ("QUIC_VERSION_UNSUPPORTED,QUIC_VERSION_39",
253 QuicTransportVersionVectorToString(versions_vector));
254
255 // Make sure that all supported versions are present in QuicVersionToString.
256 for (size_t i = 0; i < QUIC_ARRAYSIZE(kSupportedTransportVersions); ++i) {
257 QuicTransportVersion version = kSupportedTransportVersions[i];
258 EXPECT_NE("QUIC_VERSION_UNSUPPORTED", QuicVersionToString(version));
259 }
260}
261
262TEST_F(QuicVersionsTest, ParsedQuicVersionToString) {
263 ParsedQuicVersion unsupported = UnsupportedQuicVersion();
264 ParsedQuicVersion version39(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_39);
265 EXPECT_EQ("Q039", ParsedQuicVersionToString(version39));
266 EXPECT_EQ("0", ParsedQuicVersionToString(unsupported));
267
268 ParsedQuicVersionVector versions_vector = {version39};
269 EXPECT_EQ("Q039", ParsedQuicVersionVectorToString(versions_vector));
270
271 versions_vector = {unsupported, version39};
272 EXPECT_EQ("0,Q039", ParsedQuicVersionVectorToString(versions_vector));
273 EXPECT_EQ("0:Q039", ParsedQuicVersionVectorToString(versions_vector, ":",
274 versions_vector.size()));
275 EXPECT_EQ("0|...", ParsedQuicVersionVectorToString(versions_vector, "|", 0));
276
277 // Make sure that all supported versions are present in
278 // ParsedQuicVersionToString.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500279 for (QuicTransportVersion transport_version : kSupportedTransportVersions) {
280 for (HandshakeProtocol protocol : kSupportedHandshakeProtocols) {
281 EXPECT_NE("0", ParsedQuicVersionToString(
282 ParsedQuicVersion(protocol, transport_version)));
283 }
284 }
285}
286TEST_F(QuicVersionsTest, AllSupportedTransportVersions) {
287 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
288 ASSERT_EQ(QUIC_ARRAYSIZE(kSupportedTransportVersions), all_versions.size());
289 for (size_t i = 0; i < all_versions.size(); ++i) {
290 EXPECT_EQ(kSupportedTransportVersions[i], all_versions[i]);
291 }
292}
293
294TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsAllVersions) {
295 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
dschinazic73506e2019-09-20 13:26:46 -0700296 static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 7u,
297 "Supported versions out of sync");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500298 SetQuicReloadableFlag(quic_disable_version_39, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500299 SetQuicReloadableFlag(quic_enable_version_47, true);
nharperd0f4a162019-08-21 11:03:21 -0700300 SetQuicReloadableFlag(quic_enable_version_48_2, true);
dschinazic73506e2019-09-20 13:26:46 -0700301 SetQuicReloadableFlag(quic_enable_version_49, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500302 SetQuicReloadableFlag(quic_enable_version_99, true);
ianswett14dfb2c2019-08-24 14:03:28 -0700303 SetQuicReloadableFlag(quic_use_parse_public_header, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500304 ParsedQuicVersionVector parsed_versions;
305 for (QuicTransportVersion version : all_versions) {
306 parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
307 }
308 QuicTransportVersionVector expected_versions = {
dschinazic73506e2019-09-20 13:26:46 -0700309 QUIC_VERSION_99, QUIC_VERSION_49, QUIC_VERSION_48, QUIC_VERSION_47,
fayang36825da2019-08-21 14:01:27 -0700310 QUIC_VERSION_46, QUIC_VERSION_43, QUIC_VERSION_39};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500311 ParsedQuicVersionVector expected_parsed_versions;
312 for (QuicTransportVersion version : expected_versions) {
313 expected_parsed_versions.push_back(
314 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
315 }
316
317 ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions));
318 ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions));
319}
320
321TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo99) {
322 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
dschinazic73506e2019-09-20 13:26:46 -0700323 static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 7u,
324 "Supported versions out of sync");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500325 SetQuicReloadableFlag(quic_disable_version_39, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500326 SetQuicReloadableFlag(quic_enable_version_47, true);
nharperd0f4a162019-08-21 11:03:21 -0700327 SetQuicReloadableFlag(quic_enable_version_48_2, true);
dschinazic73506e2019-09-20 13:26:46 -0700328 SetQuicReloadableFlag(quic_enable_version_49, true);
329 SetQuicReloadableFlag(quic_enable_version_99, false);
330 SetQuicReloadableFlag(quic_use_parse_public_header, true);
331 ParsedQuicVersionVector parsed_versions;
332 for (QuicTransportVersion version : all_versions) {
333 parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
334 }
335 QuicTransportVersionVector expected_versions = {
336 QUIC_VERSION_49, QUIC_VERSION_48, QUIC_VERSION_47,
337 QUIC_VERSION_46, QUIC_VERSION_43, QUIC_VERSION_39};
338 ParsedQuicVersionVector expected_parsed_versions;
339 for (QuicTransportVersion version : expected_versions) {
340 expected_parsed_versions.push_back(
341 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
342 }
343
344 ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions));
345 ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions));
346}
347
348TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo49) {
349 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
350 static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 7u,
351 "Supported versions out of sync");
352 SetQuicReloadableFlag(quic_disable_version_39, false);
353 SetQuicReloadableFlag(quic_enable_version_47, true);
354 SetQuicReloadableFlag(quic_enable_version_48_2, true);
355 SetQuicReloadableFlag(quic_enable_version_49, false);
nharper107ba5f2019-07-02 21:33:39 -0700356 SetQuicReloadableFlag(quic_enable_version_99, false);
357 ParsedQuicVersionVector parsed_versions;
358 for (QuicTransportVersion version : all_versions) {
359 parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
360 }
361 QuicTransportVersionVector expected_versions = {
fayang36825da2019-08-21 14:01:27 -0700362 QUIC_VERSION_48, QUIC_VERSION_47, QUIC_VERSION_46, QUIC_VERSION_43,
363 QUIC_VERSION_39};
nharper107ba5f2019-07-02 21:33:39 -0700364 ParsedQuicVersionVector expected_parsed_versions;
365 for (QuicTransportVersion version : expected_versions) {
366 expected_parsed_versions.push_back(
367 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
368 }
369
370 ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions));
371 ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions));
372}
373
374TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo48) {
375 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
dschinazic73506e2019-09-20 13:26:46 -0700376 static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 7u,
377 "Supported versions out of sync");
nharper107ba5f2019-07-02 21:33:39 -0700378 SetQuicReloadableFlag(quic_disable_version_39, false);
nharper107ba5f2019-07-02 21:33:39 -0700379 SetQuicReloadableFlag(quic_enable_version_47, true);
nharperd0f4a162019-08-21 11:03:21 -0700380 SetQuicReloadableFlag(quic_enable_version_48_2, false);
dschinazic73506e2019-09-20 13:26:46 -0700381 SetQuicReloadableFlag(quic_enable_version_49, false);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500382 SetQuicReloadableFlag(quic_enable_version_99, false);
383 ParsedQuicVersionVector parsed_versions;
384 for (QuicTransportVersion version : all_versions) {
385 parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
386 }
387 QuicTransportVersionVector expected_versions = {
fayang36825da2019-08-21 14:01:27 -0700388 QUIC_VERSION_47, QUIC_VERSION_46, QUIC_VERSION_43, QUIC_VERSION_39};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500389 ParsedQuicVersionVector expected_parsed_versions;
390 for (QuicTransportVersion version : expected_versions) {
391 expected_parsed_versions.push_back(
392 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
393 }
394
395 ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions));
396 ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions));
397}
398
399TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo47) {
400 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
dschinazic73506e2019-09-20 13:26:46 -0700401 static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 7u,
402 "Supported versions out of sync");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500403 SetQuicReloadableFlag(quic_disable_version_39, false);
fayangb880b4c2019-06-14 12:26:35 -0700404 SetQuicReloadableFlag(quic_enable_version_47, false);
nharperd0f4a162019-08-21 11:03:21 -0700405 SetQuicReloadableFlag(quic_enable_version_48_2, false);
dschinazic73506e2019-09-20 13:26:46 -0700406 SetQuicReloadableFlag(quic_enable_version_49, false);
fayangb880b4c2019-06-14 12:26:35 -0700407 SetQuicReloadableFlag(quic_enable_version_99, false);
408 ParsedQuicVersionVector parsed_versions;
409 for (QuicTransportVersion version : all_versions) {
410 parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
411 }
412 QuicTransportVersionVector expected_versions = {
413 QUIC_VERSION_46, QUIC_VERSION_43, QUIC_VERSION_39};
414 ParsedQuicVersionVector expected_parsed_versions;
415 for (QuicTransportVersion version : expected_versions) {
416 expected_parsed_versions.push_back(
417 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
418 }
419
420 ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions));
421 ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions));
422}
423
fayang3294e742019-06-12 13:10:15 -0700424TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo39) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500425 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
dschinazic73506e2019-09-20 13:26:46 -0700426 static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 7u,
427 "Supported versions out of sync");
fayang3294e742019-06-12 13:10:15 -0700428 SetQuicReloadableFlag(quic_disable_version_39, true);
fayangf36e29d2019-06-06 14:03:40 -0700429 SetQuicReloadableFlag(quic_enable_version_47, false);
nharperd0f4a162019-08-21 11:03:21 -0700430 SetQuicReloadableFlag(quic_enable_version_48_2, false);
dschinazic73506e2019-09-20 13:26:46 -0700431 SetQuicReloadableFlag(quic_enable_version_49, false);
fayangf36e29d2019-06-06 14:03:40 -0700432 SetQuicReloadableFlag(quic_enable_version_99, false);
433 ParsedQuicVersionVector parsed_versions;
434 for (QuicTransportVersion version : all_versions) {
435 parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
436 }
fayang36825da2019-08-21 14:01:27 -0700437 QuicTransportVersionVector expected_versions = {QUIC_VERSION_46,
438 QUIC_VERSION_43};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500439 ParsedQuicVersionVector expected_parsed_versions;
440 for (QuicTransportVersion version : expected_versions) {
441 expected_parsed_versions.push_back(
442 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
443 }
444
445 ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions));
446 ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions));
447}
448
449TEST_F(QuicVersionsTest, LookUpVersionByIndex) {
450 QuicTransportVersionVector all_versions = {QUIC_VERSION_39};
451 int version_count = all_versions.size();
452 for (int i = -5; i <= version_count + 1; ++i) {
453 if (i >= 0 && i < version_count) {
454 EXPECT_EQ(all_versions[i], VersionOfIndex(all_versions, i)[0]);
455 } else {
456 EXPECT_EQ(QUIC_VERSION_UNSUPPORTED, VersionOfIndex(all_versions, i)[0]);
457 }
458 }
459}
460
461TEST_F(QuicVersionsTest, LookUpParsedVersionByIndex) {
462 ParsedQuicVersionVector all_versions = AllSupportedVersions();
463 int version_count = all_versions.size();
464 for (int i = -5; i <= version_count + 1; ++i) {
465 if (i >= 0 && i < version_count) {
466 EXPECT_EQ(all_versions[i], ParsedVersionOfIndex(all_versions, i)[0]);
467 } else {
468 EXPECT_EQ(UnsupportedQuicVersion(),
469 ParsedVersionOfIndex(all_versions, i)[0]);
470 }
471 }
472}
473
474TEST_F(QuicVersionsTest, ParsedVersionsToTransportVersions) {
475 ParsedQuicVersionVector all_versions = AllSupportedVersions();
476 QuicTransportVersionVector transport_versions =
477 ParsedVersionsToTransportVersions(all_versions);
478 ASSERT_EQ(all_versions.size(), transport_versions.size());
479 for (size_t i = 0; i < all_versions.size(); ++i) {
480 EXPECT_EQ(transport_versions[i], all_versions[i].transport_version);
481 }
482}
483
484// This test may appear to be so simplistic as to be unnecessary,
485// yet a typo was made in doing the #defines and it was caught
486// only in some test far removed from here... Better safe than sorry.
487TEST_F(QuicVersionsTest, CheckVersionNumbersForTypos) {
dschinazic73506e2019-09-20 13:26:46 -0700488 static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 7u,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500489 "Supported versions out of sync");
490 EXPECT_EQ(QUIC_VERSION_39, 39);
491 EXPECT_EQ(QUIC_VERSION_43, 43);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500492 EXPECT_EQ(QUIC_VERSION_46, 46);
493 EXPECT_EQ(QUIC_VERSION_47, 47);
nharper107ba5f2019-07-02 21:33:39 -0700494 EXPECT_EQ(QUIC_VERSION_48, 48);
dschinazic73506e2019-09-20 13:26:46 -0700495 EXPECT_EQ(QUIC_VERSION_49, 49);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500496 EXPECT_EQ(QUIC_VERSION_99, 99);
497}
dschinazi8ae60012019-04-04 18:07:27 -0700498
dschinazi35e749e2019-04-09 09:36:04 -0700499TEST_F(QuicVersionsTest, AlpnForVersion) {
dschinazic73506e2019-09-20 13:26:46 -0700500 static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 7u,
501 "Supported versions out of sync");
dschinazi35e749e2019-04-09 09:36:04 -0700502 ParsedQuicVersion parsed_version_q047 =
503 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_47);
504 ParsedQuicVersion parsed_version_t047 =
505 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_47);
nharper107ba5f2019-07-02 21:33:39 -0700506 ParsedQuicVersion parsed_version_q048 =
507 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48);
508 ParsedQuicVersion parsed_version_t048 =
509 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_48);
dschinazic73506e2019-09-20 13:26:46 -0700510 ParsedQuicVersion parsed_version_q049 =
511 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_49);
512 ParsedQuicVersion parsed_version_t049 =
513 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_49);
dschinazi35e749e2019-04-09 09:36:04 -0700514 ParsedQuicVersion parsed_version_t099 =
515 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_99);
dschinazi35e749e2019-04-09 09:36:04 -0700516
rch5a2b3eb2019-08-23 11:49:33 -0700517 EXPECT_EQ("h3-Q047", AlpnForVersion(parsed_version_q047));
518 EXPECT_EQ("h3-T047", AlpnForVersion(parsed_version_t047));
519 EXPECT_EQ("h3-Q048", AlpnForVersion(parsed_version_q048));
520 EXPECT_EQ("h3-T048", AlpnForVersion(parsed_version_t048));
dschinazic73506e2019-09-20 13:26:46 -0700521 EXPECT_EQ("h3-Q049", AlpnForVersion(parsed_version_q049));
522 EXPECT_EQ("h3-T049", AlpnForVersion(parsed_version_t049));
rch181e9082019-09-14 19:36:58 -0700523 EXPECT_EQ("h3-23", AlpnForVersion(parsed_version_t099));
dschinazi8ae60012019-04-04 18:07:27 -0700524}
525
526TEST_F(QuicVersionsTest, QuicEnableVersion) {
dschinazic73506e2019-09-20 13:26:46 -0700527 static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 7u,
528 "Supported versions out of sync");
rch16df2a52019-09-10 10:50:09 -0700529 SetQuicReloadableFlag(quic_supports_tls_handshake, true);
dschinazi8ae60012019-04-04 18:07:27 -0700530 ParsedQuicVersion parsed_version_q047 =
531 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_47);
532 ParsedQuicVersion parsed_version_t047 =
533 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_47);
nharper107ba5f2019-07-02 21:33:39 -0700534 ParsedQuicVersion parsed_version_q048 =
535 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48);
536 ParsedQuicVersion parsed_version_t048 =
537 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_48);
dschinazic73506e2019-09-20 13:26:46 -0700538 ParsedQuicVersion parsed_version_q049 =
539 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_49);
540 ParsedQuicVersion parsed_version_t049 =
541 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_49);
dschinazi8ae60012019-04-04 18:07:27 -0700542 ParsedQuicVersion parsed_version_t099 =
543 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_99);
rch16df2a52019-09-10 10:50:09 -0700544 SetQuicReloadableFlag(quic_supports_tls_handshake, false);
dschinazi8ae60012019-04-04 18:07:27 -0700545 SetQuicReloadableFlag(quic_disable_version_39, false);
dschinazi8ae60012019-04-04 18:07:27 -0700546 SetQuicReloadableFlag(quic_enable_version_47, false);
nharperd0f4a162019-08-21 11:03:21 -0700547 SetQuicReloadableFlag(quic_enable_version_48_2, false);
dschinazic73506e2019-09-20 13:26:46 -0700548 SetQuicReloadableFlag(quic_enable_version_49, false);
dschinazi8ae60012019-04-04 18:07:27 -0700549 SetQuicReloadableFlag(quic_enable_version_99, false);
550
nharper107ba5f2019-07-02 21:33:39 -0700551 {
552 QuicFlagSaver flag_saver;
553 QuicEnableVersion(parsed_version_q047);
rch16df2a52019-09-10 10:50:09 -0700554 EXPECT_FALSE(GetQuicReloadableFlag(quic_supports_tls_handshake));
nharper107ba5f2019-07-02 21:33:39 -0700555 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_47));
nharperd0f4a162019-08-21 11:03:21 -0700556 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_48_2));
nharper107ba5f2019-07-02 21:33:39 -0700557 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_99));
558 }
dschinazi8ae60012019-04-04 18:07:27 -0700559
nharper107ba5f2019-07-02 21:33:39 -0700560 {
561 QuicFlagSaver flag_saver;
562 QuicEnableVersion(parsed_version_t047);
rch16df2a52019-09-10 10:50:09 -0700563 EXPECT_TRUE(GetQuicReloadableFlag(quic_supports_tls_handshake));
nharper107ba5f2019-07-02 21:33:39 -0700564 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_47));
nharperd0f4a162019-08-21 11:03:21 -0700565 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_48_2));
nharper107ba5f2019-07-02 21:33:39 -0700566 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_99));
567 }
dschinazi8ae60012019-04-04 18:07:27 -0700568
nharper107ba5f2019-07-02 21:33:39 -0700569 {
570 QuicFlagSaver flag_saver;
571 QuicEnableVersion(parsed_version_q048);
rch16df2a52019-09-10 10:50:09 -0700572 EXPECT_FALSE(GetQuicReloadableFlag(quic_supports_tls_handshake));
nharper107ba5f2019-07-02 21:33:39 -0700573 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_47));
nharperd0f4a162019-08-21 11:03:21 -0700574 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_48_2));
nharper107ba5f2019-07-02 21:33:39 -0700575 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_99));
576 }
577
578 {
579 QuicFlagSaver flag_saver;
580 QuicEnableVersion(parsed_version_t048);
rch16df2a52019-09-10 10:50:09 -0700581 EXPECT_TRUE(GetQuicReloadableFlag(quic_supports_tls_handshake));
nharper107ba5f2019-07-02 21:33:39 -0700582 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_47));
nharperd0f4a162019-08-21 11:03:21 -0700583 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_48_2));
nharper107ba5f2019-07-02 21:33:39 -0700584 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_99));
585 }
586
587 {
588 QuicFlagSaver flag_saver;
dschinazic73506e2019-09-20 13:26:46 -0700589 QuicEnableVersion(parsed_version_q049);
590 EXPECT_FALSE(GetQuicReloadableFlag(quic_supports_tls_handshake));
591 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_47));
592 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_48_2));
593 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_49));
594 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_99));
595 }
596
597 {
598 QuicFlagSaver flag_saver;
599 QuicEnableVersion(parsed_version_t049);
600 EXPECT_TRUE(GetQuicReloadableFlag(quic_supports_tls_handshake));
601 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_47));
602 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_48_2));
603 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_49));
604 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_99));
605 }
606
607 {
608 QuicFlagSaver flag_saver;
nharper107ba5f2019-07-02 21:33:39 -0700609 QuicEnableVersion(parsed_version_t099);
rch16df2a52019-09-10 10:50:09 -0700610 EXPECT_TRUE(GetQuicReloadableFlag(quic_supports_tls_handshake));
nharper107ba5f2019-07-02 21:33:39 -0700611 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_47));
nharperd0f4a162019-08-21 11:03:21 -0700612 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_48_2));
nharper107ba5f2019-07-02 21:33:39 -0700613 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_99));
614 }
dschinazi8ae60012019-04-04 18:07:27 -0700615}
616
dschinazi5a354c92019-05-09 12:18:53 -0700617TEST_F(QuicVersionsTest, ReservedForNegotiation) {
618 EXPECT_EQ(QUIC_VERSION_RESERVED_FOR_NEGOTIATION,
619 QuicVersionReservedForNegotiation().transport_version);
620 // QUIC_VERSION_RESERVED_FOR_NEGOTIATION MUST NOT be added to
621 // kSupportedTransportVersions.
622 for (size_t i = 0; i < QUIC_ARRAYSIZE(kSupportedTransportVersions); ++i) {
623 EXPECT_NE(QUIC_VERSION_RESERVED_FOR_NEGOTIATION,
624 kSupportedTransportVersions[i]);
625 }
626}
627
QUICHE teama6ef0a62019-03-07 20:34:33 -0500628} // namespace
629} // namespace test
630} // namespace quic