blob: 55c38bdb868c3320d35cc4d846f64b93d277b5db [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
nharper4fd11052019-06-04 14:23:22 -07007#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -05008#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
9#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
10#include "net/third_party/quiche/src/quic/platform/api/quic_mock_log.h"
11#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
bnc4e9283d2019-12-17 07:08:57 -080012#include "net/third_party/quiche/src/common/platform/api/quiche_arraysize.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050013
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.
fayang8265a2a2019-10-16 11:23:51 -070038 EXPECT_EQ(MakeQuicTag('3', '4', '0', 'Q'),
39 QuicVersionToQuicVersionLabel(QUIC_VERSION_43));
QUICHE teama6ef0a62019-03-07 20:34:33 -050040
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).
vasilvv228602e2020-02-06 01:11:49 -080044 for (QuicTransportVersion transport_version : SupportedTransportVersions()) {
dschinazi41616842020-01-21 15:46:11 -080045 if (!ParsedQuicVersionIsValid(PROTOCOL_QUIC_CRYPTO, transport_version)) {
46 continue;
47 }
48 EXPECT_LT(0u, QuicVersionToQuicVersionLabel(transport_version));
QUICHE teama6ef0a62019-03-07 20:34:33 -050049 }
50}
51
52TEST_F(QuicVersionsTest, QuicVersionToQuicVersionLabelUnsupported) {
dschinazidc770fc2020-01-13 15:42:41 -080053 EXPECT_QUIC_BUG(CreateQuicVersionLabel(UnsupportedQuicVersion()),
54 "Invalid HandshakeProtocol: 0");
55}
56
57TEST_F(QuicVersionsTest, KnownAndValid) {
58 for (const ParsedQuicVersion& version : AllSupportedVersions()) {
59 EXPECT_TRUE(version.IsKnown());
60 EXPECT_TRUE(ParsedQuicVersionIsValid(version.handshake_protocol,
61 version.transport_version));
62 }
63 ParsedQuicVersion unsupported = UnsupportedQuicVersion();
64 EXPECT_FALSE(unsupported.IsKnown());
65 EXPECT_TRUE(ParsedQuicVersionIsValid(unsupported.handshake_protocol,
66 unsupported.transport_version));
67 ParsedQuicVersion reserved = QuicVersionReservedForNegotiation();
68 EXPECT_TRUE(reserved.IsKnown());
69 EXPECT_TRUE(ParsedQuicVersionIsValid(reserved.handshake_protocol,
70 reserved.transport_version));
QUICHE teama6ef0a62019-03-07 20:34:33 -050071}
72
73TEST_F(QuicVersionsTest, QuicVersionLabelToQuicTransportVersion) {
74 // If you add a new version to the QuicTransportVersion enum you will need to
75 // add a new case to QuicVersionLabelToQuicTransportVersion, otherwise this
76 // test will fail.
77
78 // Any logs would indicate an unsupported version which we don't expect.
79 CREATE_QUIC_MOCK_LOG(log);
80 EXPECT_QUIC_LOG_CALL(log).Times(0);
81 log.StartCapturingLogs();
82
83 // Explicitly test specific versions.
fayang8265a2a2019-10-16 11:23:51 -070084 EXPECT_EQ(QUIC_VERSION_43,
85 QuicVersionLabelToQuicVersion(MakeQuicTag('3', '4', '0', 'Q')));
QUICHE teama6ef0a62019-03-07 20:34:33 -050086
vasilvv228602e2020-02-06 01:11:49 -080087 for (QuicTransportVersion transport_version : SupportedTransportVersions()) {
dschinazi41616842020-01-21 15:46:11 -080088 if (!ParsedQuicVersionIsValid(PROTOCOL_QUIC_CRYPTO, transport_version)) {
89 continue;
90 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050091
92 // Get the label from the version (we can loop over QuicVersions easily).
dschinazi41616842020-01-21 15:46:11 -080093 QuicVersionLabel version_label =
94 QuicVersionToQuicVersionLabel(transport_version);
QUICHE teama6ef0a62019-03-07 20:34:33 -050095 EXPECT_LT(0u, version_label);
96
97 // Now try converting back.
98 QuicTransportVersion label_to_transport_version =
99 QuicVersionLabelToQuicVersion(version_label);
dschinazi41616842020-01-21 15:46:11 -0800100 EXPECT_EQ(transport_version, label_to_transport_version);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500101 EXPECT_NE(QUIC_VERSION_UNSUPPORTED, label_to_transport_version);
102 }
103}
104
105TEST_F(QuicVersionsTest, QuicVersionLabelToQuicVersionUnsupported) {
106 CREATE_QUIC_MOCK_LOG(log);
107 if (QUIC_DLOG_INFO_IS_ON()) {
108 EXPECT_QUIC_LOG_CALL_CONTAINS(log, INFO,
109 "Unsupported QuicVersionLabel version: EKAF")
110 .Times(1);
111 }
112 log.StartCapturingLogs();
113
114 EXPECT_EQ(QUIC_VERSION_UNSUPPORTED,
115 QuicVersionLabelToQuicVersion(MakeQuicTag('F', 'A', 'K', 'E')));
116}
117
118TEST_F(QuicVersionsTest, QuicVersionLabelToHandshakeProtocol) {
119 CREATE_QUIC_MOCK_LOG(log);
120 EXPECT_QUIC_LOG_CALL(log).Times(0);
121 log.StartCapturingLogs();
122
dschinazidc770fc2020-01-13 15:42:41 -0800123 for (const ParsedQuicVersion& version : AllSupportedVersions()) {
124 if (version.handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
125 continue;
126 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500127 QuicVersionLabel version_label =
dschinazidc770fc2020-01-13 15:42:41 -0800128 QuicVersionToQuicVersionLabel(version.transport_version);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500129 EXPECT_EQ(PROTOCOL_QUIC_CRYPTO,
130 QuicVersionLabelToHandshakeProtocol(version_label));
131 }
132
133 // Test a TLS version:
dschinazidc770fc2020-01-13 15:42:41 -0800134 QuicTag tls_tag = MakeQuicTag('0', '5', '0', 'T');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500135 EXPECT_EQ(PROTOCOL_TLS1_3, QuicVersionLabelToHandshakeProtocol(tls_tag));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500136}
137
138TEST_F(QuicVersionsTest, ParseQuicVersionLabel) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500139 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43),
140 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '3')));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500141 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46),
142 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '6')));
nharper107ba5f2019-07-02 21:33:39 -0700143 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48),
144 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '8')));
nharperc32d8ab2019-10-09 11:09:06 -0700145 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_50),
146 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '5', '0')));
nharperc32d8ab2019-10-09 11:09:06 -0700147 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50),
148 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '5', '0')));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500149}
150
dschinazi8ae60012019-04-04 18:07:27 -0700151TEST_F(QuicVersionsTest, ParseQuicVersionString) {
dschinazi8ae60012019-04-04 18:07:27 -0700152 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43),
153 ParseQuicVersionString("Q043"));
dschinazi8ae60012019-04-04 18:07:27 -0700154 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46),
155 ParseQuicVersionString("Q046"));
nharper107ba5f2019-07-02 21:33:39 -0700156 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48),
157 ParseQuicVersionString("Q048"));
nharperc32d8ab2019-10-09 11:09:06 -0700158 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_50),
159 ParseQuicVersionString("Q050"));
dschinazi8ae60012019-04-04 18:07:27 -0700160
161 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString(""));
dschinazi8b1c45a2019-10-17 08:48:13 -0700162 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString("Q 46"));
163 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString("Q046 "));
dschinazi8ae60012019-04-04 18:07:27 -0700164
165 // Test a TLS version:
nharperc32d8ab2019-10-09 11:09:06 -0700166 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50),
167 ParseQuicVersionString("T050"));
dschinazi8ae60012019-04-04 18:07:27 -0700168}
169
QUICHE teama6ef0a62019-03-07 20:34:33 -0500170TEST_F(QuicVersionsTest, CreateQuicVersionLabel) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500171 EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '3'),
172 CreateQuicVersionLabel(
173 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43)));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500174 EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '6'),
175 CreateQuicVersionLabel(
176 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46)));
nharper107ba5f2019-07-02 21:33:39 -0700177 EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '8'),
178 CreateQuicVersionLabel(
179 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48)));
nharperc32d8ab2019-10-09 11:09:06 -0700180 EXPECT_EQ(MakeVersionLabel('Q', '0', '5', '0'),
181 CreateQuicVersionLabel(
182 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_50)));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500183
184 // Test a TLS version:
nharperc32d8ab2019-10-09 11:09:06 -0700185 EXPECT_EQ(MakeVersionLabel('T', '0', '5', '0'),
186 CreateQuicVersionLabel(
187 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50)));
dschinazi1ac22cc2019-06-25 11:47:50 -0700188
189 // Make sure the negotiation reserved version is in the IETF reserved space.
190 EXPECT_EQ(MakeVersionLabel(0xda, 0x5a, 0x3a, 0x3a) & 0x0f0f0f0f,
191 CreateQuicVersionLabel(ParsedQuicVersion(
192 PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_RESERVED_FOR_NEGOTIATION)) &
193 0x0f0f0f0f);
194
195 // Make sure that disabling randomness works.
196 SetQuicFlag(FLAGS_quic_disable_version_negotiation_grease_randomness, true);
197 EXPECT_EQ(MakeVersionLabel(0xda, 0x5a, 0x3a, 0x3a),
198 CreateQuicVersionLabel(ParsedQuicVersion(
199 PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_RESERVED_FOR_NEGOTIATION)));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500200}
201
202TEST_F(QuicVersionsTest, QuicVersionLabelToString) {
203 QuicVersionLabelVector version_labels = {
204 MakeVersionLabel('Q', '0', '3', '5'),
205 MakeVersionLabel('Q', '0', '3', '7'),
206 MakeVersionLabel('T', '0', '3', '8'),
207 };
208
209 EXPECT_EQ("Q035", QuicVersionLabelToString(version_labels[0]));
210 EXPECT_EQ("T038", QuicVersionLabelToString(version_labels[2]));
211
212 EXPECT_EQ("Q035,Q037,T038", QuicVersionLabelVectorToString(version_labels));
213 EXPECT_EQ("Q035:Q037:T038",
214 QuicVersionLabelVectorToString(version_labels, ":", 2));
215 EXPECT_EQ("Q035|Q037|...",
216 QuicVersionLabelVectorToString(version_labels, "|", 1));
217}
218
219TEST_F(QuicVersionsTest, QuicVersionToString) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500220 EXPECT_EQ("QUIC_VERSION_UNSUPPORTED",
221 QuicVersionToString(QUIC_VERSION_UNSUPPORTED));
222
fayang8265a2a2019-10-16 11:23:51 -0700223 QuicTransportVersion single_version[] = {QUIC_VERSION_43};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500224 QuicTransportVersionVector versions_vector;
bnc4e9283d2019-12-17 07:08:57 -0800225 for (size_t i = 0; i < QUICHE_ARRAYSIZE(single_version); ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500226 versions_vector.push_back(single_version[i]);
227 }
fayang8265a2a2019-10-16 11:23:51 -0700228 EXPECT_EQ("QUIC_VERSION_43",
QUICHE teama6ef0a62019-03-07 20:34:33 -0500229 QuicTransportVersionVectorToString(versions_vector));
230
231 QuicTransportVersion multiple_versions[] = {QUIC_VERSION_UNSUPPORTED,
fayang8265a2a2019-10-16 11:23:51 -0700232 QUIC_VERSION_43};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500233 versions_vector.clear();
bnc4e9283d2019-12-17 07:08:57 -0800234 for (size_t i = 0; i < QUICHE_ARRAYSIZE(multiple_versions); ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500235 versions_vector.push_back(multiple_versions[i]);
236 }
fayang8265a2a2019-10-16 11:23:51 -0700237 EXPECT_EQ("QUIC_VERSION_UNSUPPORTED,QUIC_VERSION_43",
QUICHE teama6ef0a62019-03-07 20:34:33 -0500238 QuicTransportVersionVectorToString(versions_vector));
239
240 // Make sure that all supported versions are present in QuicVersionToString.
vasilvv228602e2020-02-06 01:11:49 -0800241 for (QuicTransportVersion transport_version : SupportedTransportVersions()) {
242 EXPECT_NE("QUIC_VERSION_UNSUPPORTED",
243 QuicVersionToString(transport_version));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500244 }
245}
246
247TEST_F(QuicVersionsTest, ParsedQuicVersionToString) {
248 ParsedQuicVersion unsupported = UnsupportedQuicVersion();
fayang8265a2a2019-10-16 11:23:51 -0700249 ParsedQuicVersion version43(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43);
250 EXPECT_EQ("Q043", ParsedQuicVersionToString(version43));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500251 EXPECT_EQ("0", ParsedQuicVersionToString(unsupported));
252
fayang8265a2a2019-10-16 11:23:51 -0700253 ParsedQuicVersionVector versions_vector = {version43};
254 EXPECT_EQ("Q043", ParsedQuicVersionVectorToString(versions_vector));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500255
fayang8265a2a2019-10-16 11:23:51 -0700256 versions_vector = {unsupported, version43};
257 EXPECT_EQ("0,Q043", ParsedQuicVersionVectorToString(versions_vector));
258 EXPECT_EQ("0:Q043", ParsedQuicVersionVectorToString(versions_vector, ":",
QUICHE teama6ef0a62019-03-07 20:34:33 -0500259 versions_vector.size()));
260 EXPECT_EQ("0|...", ParsedQuicVersionVectorToString(versions_vector, "|", 0));
261
262 // Make sure that all supported versions are present in
263 // ParsedQuicVersionToString.
dschinazidc770fc2020-01-13 15:42:41 -0800264 for (const ParsedQuicVersion& version : AllSupportedVersions()) {
265 EXPECT_NE("0", ParsedQuicVersionToString(version));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500266 }
267}
QUICHE teama6ef0a62019-03-07 20:34:33 -0500268
dschinazi4101ead2019-12-06 15:26:07 -0800269TEST_F(QuicVersionsTest, FilterSupportedVersionsAllVersions) {
dschinazi40f0b3d2020-02-19 17:54:05 -0800270 static_assert(SupportedVersions().size() == 8u,
dschinazic73506e2019-09-20 13:26:46 -0700271 "Supported versions out of sync");
dschinazi76881f02019-12-09 14:56:14 -0800272 SetQuicReloadableFlag(quic_enable_version_t099, true);
dschinazi40f0b3d2020-02-19 17:54:05 -0800273 SetQuicReloadableFlag(quic_enable_version_draft_25, true);
dschinazi76881f02019-12-09 14:56:14 -0800274 SetQuicReloadableFlag(quic_enable_version_t050, true);
275 SetQuicReloadableFlag(quic_disable_version_q050, false);
276 SetQuicReloadableFlag(quic_disable_version_q049, false);
277 SetQuicReloadableFlag(quic_disable_version_q048, false);
278 SetQuicReloadableFlag(quic_disable_version_q046, false);
279 SetQuicReloadableFlag(quic_disable_version_q043, false);
280
QUICHE teama6ef0a62019-03-07 20:34:33 -0500281 ParsedQuicVersionVector expected_parsed_versions;
dschinazi4101ead2019-12-06 15:26:07 -0800282 expected_parsed_versions.push_back(
dschinazi4101ead2019-12-06 15:26:07 -0800283 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_50));
284 expected_parsed_versions.push_back(
285 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_49));
286 expected_parsed_versions.push_back(
287 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48));
288 expected_parsed_versions.push_back(
289 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46));
290 expected_parsed_versions.push_back(
291 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43));
292 expected_parsed_versions.push_back(
293 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_99));
294 expected_parsed_versions.push_back(
dschinazi40f0b3d2020-02-19 17:54:05 -0800295 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_25));
296 expected_parsed_versions.push_back(
dschinazi4101ead2019-12-06 15:26:07 -0800297 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500298
dschinazi4101ead2019-12-06 15:26:07 -0800299 ASSERT_EQ(expected_parsed_versions,
300 FilterSupportedVersions(AllSupportedVersions()));
301 ASSERT_EQ(expected_parsed_versions, AllSupportedVersions());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500302}
303
dschinazi4101ead2019-12-06 15:26:07 -0800304TEST_F(QuicVersionsTest, FilterSupportedVersionsNo99) {
dschinazi40f0b3d2020-02-19 17:54:05 -0800305 static_assert(SupportedVersions().size() == 8u,
dschinazic73506e2019-09-20 13:26:46 -0700306 "Supported versions out of sync");
dschinazi76881f02019-12-09 14:56:14 -0800307 SetQuicReloadableFlag(quic_enable_version_t099, false);
dschinazi40f0b3d2020-02-19 17:54:05 -0800308 SetQuicReloadableFlag(quic_enable_version_draft_25, true);
dschinazi76881f02019-12-09 14:56:14 -0800309 SetQuicReloadableFlag(quic_enable_version_t050, true);
310 SetQuicReloadableFlag(quic_disable_version_q050, false);
311 SetQuicReloadableFlag(quic_disable_version_q049, false);
312 SetQuicReloadableFlag(quic_disable_version_q048, false);
313 SetQuicReloadableFlag(quic_disable_version_q046, false);
314 SetQuicReloadableFlag(quic_disable_version_q043, false);
315
nharperc32d8ab2019-10-09 11:09:06 -0700316 ParsedQuicVersionVector expected_parsed_versions;
dschinazi4101ead2019-12-06 15:26:07 -0800317 expected_parsed_versions.push_back(
318 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_50));
319 expected_parsed_versions.push_back(
320 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_49));
321 expected_parsed_versions.push_back(
322 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48));
323 expected_parsed_versions.push_back(
324 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46));
325 expected_parsed_versions.push_back(
326 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43));
327 expected_parsed_versions.push_back(
dschinazi40f0b3d2020-02-19 17:54:05 -0800328 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_25));
329 expected_parsed_versions.push_back(
dschinazi4101ead2019-12-06 15:26:07 -0800330 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50));
nharperc32d8ab2019-10-09 11:09:06 -0700331
dschinazi4101ead2019-12-06 15:26:07 -0800332 ASSERT_EQ(expected_parsed_versions,
333 FilterSupportedVersions(AllSupportedVersions()));
nharperc32d8ab2019-10-09 11:09:06 -0700334}
335
dschinazi4101ead2019-12-06 15:26:07 -0800336TEST_F(QuicVersionsTest, FilterSupportedVersionsNoFlags) {
dschinazi40f0b3d2020-02-19 17:54:05 -0800337 static_assert(SupportedVersions().size() == 8u,
dschinazic73506e2019-09-20 13:26:46 -0700338 "Supported versions out of sync");
dschinazi76881f02019-12-09 14:56:14 -0800339 SetQuicReloadableFlag(quic_enable_version_t099, false);
dschinazi40f0b3d2020-02-19 17:54:05 -0800340 SetQuicReloadableFlag(quic_enable_version_draft_25, false);
dschinazi76881f02019-12-09 14:56:14 -0800341 SetQuicReloadableFlag(quic_enable_version_t050, false);
342 SetQuicReloadableFlag(quic_disable_version_q050, false);
343 SetQuicReloadableFlag(quic_disable_version_q049, false);
344 SetQuicReloadableFlag(quic_disable_version_q048, false);
345 SetQuicReloadableFlag(quic_disable_version_q046, false);
346 SetQuicReloadableFlag(quic_disable_version_q043, false);
347
QUICHE teama6ef0a62019-03-07 20:34:33 -0500348 ParsedQuicVersionVector expected_parsed_versions;
dschinazi4101ead2019-12-06 15:26:07 -0800349 expected_parsed_versions.push_back(
350 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_50));
351 expected_parsed_versions.push_back(
352 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_49));
353 expected_parsed_versions.push_back(
354 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48));
355 expected_parsed_versions.push_back(
356 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46));
357 expected_parsed_versions.push_back(
358 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500359
dschinazi4101ead2019-12-06 15:26:07 -0800360 ASSERT_EQ(expected_parsed_versions,
361 FilterSupportedVersions(AllSupportedVersions()));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500362}
363
364TEST_F(QuicVersionsTest, LookUpVersionByIndex) {
fayang8265a2a2019-10-16 11:23:51 -0700365 QuicTransportVersionVector all_versions = {QUIC_VERSION_43};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500366 int version_count = all_versions.size();
367 for (int i = -5; i <= version_count + 1; ++i) {
368 if (i >= 0 && i < version_count) {
369 EXPECT_EQ(all_versions[i], VersionOfIndex(all_versions, i)[0]);
370 } else {
371 EXPECT_EQ(QUIC_VERSION_UNSUPPORTED, VersionOfIndex(all_versions, i)[0]);
372 }
373 }
374}
375
376TEST_F(QuicVersionsTest, LookUpParsedVersionByIndex) {
377 ParsedQuicVersionVector all_versions = AllSupportedVersions();
378 int version_count = all_versions.size();
379 for (int i = -5; i <= version_count + 1; ++i) {
380 if (i >= 0 && i < version_count) {
381 EXPECT_EQ(all_versions[i], ParsedVersionOfIndex(all_versions, i)[0]);
382 } else {
383 EXPECT_EQ(UnsupportedQuicVersion(),
384 ParsedVersionOfIndex(all_versions, i)[0]);
385 }
386 }
387}
388
389TEST_F(QuicVersionsTest, ParsedVersionsToTransportVersions) {
390 ParsedQuicVersionVector all_versions = AllSupportedVersions();
391 QuicTransportVersionVector transport_versions =
392 ParsedVersionsToTransportVersions(all_versions);
393 ASSERT_EQ(all_versions.size(), transport_versions.size());
394 for (size_t i = 0; i < all_versions.size(); ++i) {
395 EXPECT_EQ(transport_versions[i], all_versions[i].transport_version);
396 }
397}
398
399// This test may appear to be so simplistic as to be unnecessary,
400// yet a typo was made in doing the #defines and it was caught
401// only in some test far removed from here... Better safe than sorry.
dschinazi40f0b3d2020-02-19 17:54:05 -0800402TEST_F(QuicVersionsTest, CheckTransportVersionNumbersForTypos) {
403 static_assert(SupportedTransportVersions().size() == 7u,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500404 "Supported versions out of sync");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500405 EXPECT_EQ(QUIC_VERSION_43, 43);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500406 EXPECT_EQ(QUIC_VERSION_46, 46);
nharper107ba5f2019-07-02 21:33:39 -0700407 EXPECT_EQ(QUIC_VERSION_48, 48);
dschinazic73506e2019-09-20 13:26:46 -0700408 EXPECT_EQ(QUIC_VERSION_49, 49);
nharperc32d8ab2019-10-09 11:09:06 -0700409 EXPECT_EQ(QUIC_VERSION_50, 50);
dschinazi40f0b3d2020-02-19 17:54:05 -0800410 EXPECT_EQ(QUIC_VERSION_IETF_DRAFT_25, 70);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500411 EXPECT_EQ(QUIC_VERSION_99, 99);
412}
dschinazi8ae60012019-04-04 18:07:27 -0700413
dschinazi35e749e2019-04-09 09:36:04 -0700414TEST_F(QuicVersionsTest, AlpnForVersion) {
dschinazi40f0b3d2020-02-19 17:54:05 -0800415 static_assert(SupportedVersions().size() == 8u,
dschinazic73506e2019-09-20 13:26:46 -0700416 "Supported versions out of sync");
nharper107ba5f2019-07-02 21:33:39 -0700417 ParsedQuicVersion parsed_version_q048 =
418 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_48);
dschinazic73506e2019-09-20 13:26:46 -0700419 ParsedQuicVersion parsed_version_q049 =
420 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_49);
nharperc32d8ab2019-10-09 11:09:06 -0700421 ParsedQuicVersion parsed_version_q050 =
422 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_50);
423 ParsedQuicVersion parsed_version_t050 =
424 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50);
dschinazi40f0b3d2020-02-19 17:54:05 -0800425 ParsedQuicVersion parsed_version_draft_25 =
426 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_25);
dschinazi35e749e2019-04-09 09:36:04 -0700427 ParsedQuicVersion parsed_version_t099 =
428 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_99);
dschinazi35e749e2019-04-09 09:36:04 -0700429
rch5a2b3eb2019-08-23 11:49:33 -0700430 EXPECT_EQ("h3-Q048", AlpnForVersion(parsed_version_q048));
dschinazic73506e2019-09-20 13:26:46 -0700431 EXPECT_EQ("h3-Q049", AlpnForVersion(parsed_version_q049));
nharperc32d8ab2019-10-09 11:09:06 -0700432 EXPECT_EQ("h3-Q050", AlpnForVersion(parsed_version_q050));
433 EXPECT_EQ("h3-T050", AlpnForVersion(parsed_version_t050));
dschinazi40f0b3d2020-02-19 17:54:05 -0800434 EXPECT_EQ("h3-25", AlpnForVersion(parsed_version_draft_25));
435 EXPECT_EQ("h3-26", AlpnForVersion(parsed_version_t099));
436 static_assert(kQuicIetfDraftVersion == 26,
dschinazi70e6b762019-11-05 13:34:15 -0800437 "ALPN does not match draft version");
dschinazi8ae60012019-04-04 18:07:27 -0700438}
439
440TEST_F(QuicVersionsTest, QuicEnableVersion) {
dschinazi40f0b3d2020-02-19 17:54:05 -0800441 static_assert(SupportedVersions().size() == 8u,
dschinazic73506e2019-09-20 13:26:46 -0700442 "Supported versions out of sync");
dschinazi8ae60012019-04-04 18:07:27 -0700443 ParsedQuicVersion parsed_version_t099 =
444 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_99);
dschinazi40f0b3d2020-02-19 17:54:05 -0800445 ParsedQuicVersion parsed_version_draft_25 =
446 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_IETF_DRAFT_25);
dschinazi76881f02019-12-09 14:56:14 -0800447 ParsedQuicVersion parsed_version_q050 =
448 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_50);
449 ParsedQuicVersion parsed_version_t050 =
450 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_50);
dschinazi8ae60012019-04-04 18:07:27 -0700451
nharper107ba5f2019-07-02 21:33:39 -0700452 {
453 QuicFlagSaver flag_saver;
dschinazi76881f02019-12-09 14:56:14 -0800454 SetQuicReloadableFlag(quic_enable_version_t099, false);
nharper107ba5f2019-07-02 21:33:39 -0700455 QuicEnableVersion(parsed_version_t099);
dschinazi76881f02019-12-09 14:56:14 -0800456 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_t099));
457 }
458
459 {
460 QuicFlagSaver flag_saver;
dschinazi40f0b3d2020-02-19 17:54:05 -0800461 SetQuicReloadableFlag(quic_enable_version_draft_25, false);
462 QuicEnableVersion(parsed_version_draft_25);
463 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_draft_25));
464 }
465
466 {
467 QuicFlagSaver flag_saver;
dschinazi76881f02019-12-09 14:56:14 -0800468 SetQuicReloadableFlag(quic_disable_version_q050, true);
469 QuicEnableVersion(parsed_version_q050);
470 EXPECT_FALSE(GetQuicReloadableFlag(quic_disable_version_q050));
471 }
472
473 {
474 QuicFlagSaver flag_saver;
475 SetQuicReloadableFlag(quic_enable_version_t050, false);
476 QuicEnableVersion(parsed_version_t050);
477 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_t050));
nharper107ba5f2019-07-02 21:33:39 -0700478 }
dschinazi40f0b3d2020-02-19 17:54:05 -0800479
480 {
481 QuicFlagSaver flag_saver;
482 for (const ParsedQuicVersion& version : SupportedVersions()) {
483 QuicEnableVersion(version);
484 }
485 ASSERT_EQ(AllSupportedVersions(), CurrentSupportedVersions());
486 }
dschinazi8ae60012019-04-04 18:07:27 -0700487}
488
dschinazi5a354c92019-05-09 12:18:53 -0700489TEST_F(QuicVersionsTest, ReservedForNegotiation) {
490 EXPECT_EQ(QUIC_VERSION_RESERVED_FOR_NEGOTIATION,
491 QuicVersionReservedForNegotiation().transport_version);
492 // QUIC_VERSION_RESERVED_FOR_NEGOTIATION MUST NOT be added to
493 // kSupportedTransportVersions.
vasilvv228602e2020-02-06 01:11:49 -0800494 for (QuicTransportVersion transport_version : SupportedTransportVersions()) {
495 EXPECT_NE(QUIC_VERSION_RESERVED_FOR_NEGOTIATION, transport_version);
dschinazi5a354c92019-05-09 12:18:53 -0700496 }
497}
498
nharper2891b2d2020-01-14 16:46:07 -0800499TEST_F(QuicVersionsTest, SupportedVersionsHasCorrectList) {
500 size_t index = 0;
vasilvv228602e2020-02-06 01:11:49 -0800501 for (HandshakeProtocol handshake_protocol : SupportedHandshakeProtocols()) {
502 for (QuicTransportVersion transport_version :
503 SupportedTransportVersions()) {
nharper2891b2d2020-01-14 16:46:07 -0800504 SCOPED_TRACE(index);
505 if (ParsedQuicVersionIsValid(handshake_protocol, transport_version)) {
vasilvv228602e2020-02-06 01:11:49 -0800506 EXPECT_EQ(SupportedVersions()[index],
nharper2891b2d2020-01-14 16:46:07 -0800507 ParsedQuicVersion(handshake_protocol, transport_version));
508 index++;
509 }
510 }
511 }
vasilvv228602e2020-02-06 01:11:49 -0800512 EXPECT_EQ(SupportedVersions().size(), index);
nharper2891b2d2020-01-14 16:46:07 -0800513}
514
dschinazi40f0b3d2020-02-19 17:54:05 -0800515TEST_F(QuicVersionsTest, SupportedVersionsAllDistinct) {
516 for (size_t index1 = 0; index1 < SupportedVersions().size(); ++index1) {
517 ParsedQuicVersion version1 = SupportedVersions()[index1];
518 for (size_t index2 = index1 + 1; index2 < SupportedVersions().size();
519 ++index2) {
520 ParsedQuicVersion version2 = SupportedVersions()[index2];
521 EXPECT_NE(version1, version2) << version1 << " " << version2;
522 EXPECT_NE(CreateQuicVersionLabel(version1),
523 CreateQuicVersionLabel(version2))
524 << version1 << " " << version2;
525 EXPECT_NE(AlpnForVersion(version1), AlpnForVersion(version2))
526 << version1 << " " << version2;
527 }
528 }
529}
530
QUICHE teama6ef0a62019-03-07 20:34:33 -0500531} // namespace
532} // namespace test
533} // namespace quic