blob: b04db0caff13f7163da6237f545aa0f3e2b577c1 [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"
8#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"
12
13namespace quic {
14namespace test {
15namespace {
16
17using testing::_;
18
19class QuicVersionsTest : public QuicTest {
20 protected:
21 QuicVersionLabel MakeVersionLabel(char a, char b, char c, char d) {
22 return MakeQuicTag(d, c, b, a);
23 }
24};
25
26TEST_F(QuicVersionsTest, QuicVersionToQuicVersionLabel) {
27 // If you add a new version to the QuicTransportVersion enum you will need to
28 // add a new case to QuicVersionToQuicVersionLabel, otherwise this test will
29 // fail.
30
31 // Any logs would indicate an unsupported version which we don't expect.
32 CREATE_QUIC_MOCK_LOG(log);
33 EXPECT_QUIC_LOG_CALL(log).Times(0);
34 log.StartCapturingLogs();
35
36 // Explicitly test a specific version.
37 EXPECT_EQ(MakeQuicTag('9', '3', '0', 'Q'),
38 QuicVersionToQuicVersionLabel(QUIC_VERSION_39));
39
40 // Loop over all supported versions and make sure that we never hit the
41 // default case (i.e. all supported versions should be successfully converted
42 // to valid QuicVersionLabels).
43 for (size_t i = 0; i < QUIC_ARRAYSIZE(kSupportedTransportVersions); ++i) {
44 QuicTransportVersion version = kSupportedTransportVersions[i];
45 EXPECT_LT(0u, QuicVersionToQuicVersionLabel(version));
46 }
47}
48
49TEST_F(QuicVersionsTest, QuicVersionToQuicVersionLabelUnsupported) {
50 // TODO(rjshade): Change to DFATAL once we actually support multiple versions,
51 // and QuicConnectionTest::SendVersionNegotiationPacket can be changed to use
52 // mis-matched versions rather than relying on QUIC_VERSION_UNSUPPORTED.
53 CREATE_QUIC_MOCK_LOG(log);
54 log.StartCapturingLogs();
55
56 if (QUIC_LOG_ERROR_IS_ON()) {
57 EXPECT_QUIC_LOG_CALL_CONTAINS(log, ERROR,
58 "Unsupported QuicTransportVersion: 0");
59 }
60
61 EXPECT_EQ(0u, QuicVersionToQuicVersionLabel(QUIC_VERSION_UNSUPPORTED));
62}
63
64TEST_F(QuicVersionsTest, QuicVersionLabelToQuicTransportVersion) {
65 // If you add a new version to the QuicTransportVersion enum you will need to
66 // add a new case to QuicVersionLabelToQuicTransportVersion, otherwise this
67 // test will fail.
68
69 // Any logs would indicate an unsupported version which we don't expect.
70 CREATE_QUIC_MOCK_LOG(log);
71 EXPECT_QUIC_LOG_CALL(log).Times(0);
72 log.StartCapturingLogs();
73
74 // Explicitly test specific versions.
75 EXPECT_EQ(QUIC_VERSION_39,
76 QuicVersionLabelToQuicVersion(MakeQuicTag('9', '3', '0', 'Q')));
77
78 for (size_t i = 0; i < QUIC_ARRAYSIZE(kSupportedTransportVersions); ++i) {
79 QuicTransportVersion version = kSupportedTransportVersions[i];
80
81 // Get the label from the version (we can loop over QuicVersions easily).
82 QuicVersionLabel version_label = QuicVersionToQuicVersionLabel(version);
83 EXPECT_LT(0u, version_label);
84
85 // Now try converting back.
86 QuicTransportVersion label_to_transport_version =
87 QuicVersionLabelToQuicVersion(version_label);
88 EXPECT_EQ(version, label_to_transport_version);
89 EXPECT_NE(QUIC_VERSION_UNSUPPORTED, label_to_transport_version);
90 }
91}
92
93TEST_F(QuicVersionsTest, QuicVersionLabelToQuicVersionUnsupported) {
94 CREATE_QUIC_MOCK_LOG(log);
95 if (QUIC_DLOG_INFO_IS_ON()) {
96 EXPECT_QUIC_LOG_CALL_CONTAINS(log, INFO,
97 "Unsupported QuicVersionLabel version: EKAF")
98 .Times(1);
99 }
100 log.StartCapturingLogs();
101
102 EXPECT_EQ(QUIC_VERSION_UNSUPPORTED,
103 QuicVersionLabelToQuicVersion(MakeQuicTag('F', 'A', 'K', 'E')));
104}
105
106TEST_F(QuicVersionsTest, QuicVersionLabelToHandshakeProtocol) {
107 CREATE_QUIC_MOCK_LOG(log);
108 EXPECT_QUIC_LOG_CALL(log).Times(0);
109 log.StartCapturingLogs();
110
111 for (size_t i = 0; i < QUIC_ARRAYSIZE(kSupportedTransportVersions); ++i) {
112 QuicVersionLabel version_label =
113 QuicVersionToQuicVersionLabel(kSupportedTransportVersions[i]);
114 EXPECT_EQ(PROTOCOL_QUIC_CRYPTO,
115 QuicVersionLabelToHandshakeProtocol(version_label));
116 }
117
118 // Test a TLS version:
119 FLAGS_quic_supports_tls_handshake = true;
120 QuicTag tls_tag = MakeQuicTag('3', '4', '0', 'T');
121 EXPECT_EQ(PROTOCOL_TLS1_3, QuicVersionLabelToHandshakeProtocol(tls_tag));
122
123 FLAGS_quic_supports_tls_handshake = false;
124 if (QUIC_DLOG_INFO_IS_ON()) {
125 EXPECT_QUIC_LOG_CALL_CONTAINS(log, INFO,
126 "Unsupported QuicVersionLabel version: T043")
127 .Times(1);
128 }
129 EXPECT_EQ(PROTOCOL_UNSUPPORTED, QuicVersionLabelToHandshakeProtocol(tls_tag));
130}
131
132TEST_F(QuicVersionsTest, ParseQuicVersionLabel) {
133 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_39),
134 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '3', '9')));
135 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43),
136 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '3')));
137 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_44),
138 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '4')));
139 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46),
140 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '6')));
141 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_47),
142 ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '7')));
143
144 // Test a TLS version:
145 FLAGS_quic_supports_tls_handshake = true;
146 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_39),
147 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '3', '9')));
148 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_43),
149 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '3')));
150 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_44),
151 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '4')));
152 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_46),
153 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '6')));
154 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_47),
155 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '7')));
156
157 FLAGS_quic_supports_tls_handshake = false;
158 EXPECT_EQ(UnsupportedQuicVersion(),
159 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '3', '5')));
160 EXPECT_EQ(UnsupportedQuicVersion(),
161 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '3', '9')));
162 EXPECT_EQ(UnsupportedQuicVersion(),
163 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '3')));
164 EXPECT_EQ(UnsupportedQuicVersion(),
165 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '4')));
166 EXPECT_EQ(UnsupportedQuicVersion(),
167 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '5')));
168 EXPECT_EQ(UnsupportedQuicVersion(),
169 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '6')));
170 EXPECT_EQ(UnsupportedQuicVersion(),
171 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '7')));
172}
173
dschinazi8ae60012019-04-04 18:07:27 -0700174TEST_F(QuicVersionsTest, ParseQuicVersionString) {
175 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_39),
176 ParseQuicVersionString("Q039"));
177 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43),
178 ParseQuicVersionString("Q043"));
179 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_44),
180 ParseQuicVersionString("Q044"));
181 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46),
182 ParseQuicVersionString("Q046"));
183 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_47),
184 ParseQuicVersionString("Q047"));
185
186 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString(""));
187 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString("Q 47"));
188 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString("Q047 "));
189
190 // Test a TLS version:
191 FLAGS_quic_supports_tls_handshake = true;
192 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_39),
193 ParseQuicVersionString("T039"));
194 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_43),
195 ParseQuicVersionString("T043"));
196 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_44),
197 ParseQuicVersionString("T044"));
198 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_46),
199 ParseQuicVersionString("T046"));
200 EXPECT_EQ(ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_47),
201 ParseQuicVersionString("T047"));
202
203 FLAGS_quic_supports_tls_handshake = false;
204 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString("T035"));
205 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString("T039"));
206 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString("T043"));
207 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString("T044"));
208 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString("T045"));
209 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString("T046"));
210 EXPECT_EQ(UnsupportedQuicVersion(), ParseQuicVersionString("T047"));
211}
212
QUICHE teama6ef0a62019-03-07 20:34:33 -0500213TEST_F(QuicVersionsTest, CreateQuicVersionLabel) {
214 EXPECT_EQ(MakeVersionLabel('Q', '0', '3', '9'),
215 CreateQuicVersionLabel(
216 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_39)));
217 EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '3'),
218 CreateQuicVersionLabel(
219 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_43)));
220 EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '4'),
221 CreateQuicVersionLabel(
222 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_44)));
223 EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '6'),
224 CreateQuicVersionLabel(
225 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_46)));
226 EXPECT_EQ(MakeVersionLabel('Q', '0', '4', '7'),
227 CreateQuicVersionLabel(
228 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_47)));
229
230 // Test a TLS version:
231 FLAGS_quic_supports_tls_handshake = true;
232 EXPECT_EQ(MakeVersionLabel('T', '0', '3', '9'),
233 CreateQuicVersionLabel(
234 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_39)));
235 EXPECT_EQ(MakeVersionLabel('T', '0', '4', '3'),
236 CreateQuicVersionLabel(
237 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_43)));
238 EXPECT_EQ(MakeVersionLabel('T', '0', '4', '4'),
239 CreateQuicVersionLabel(
240 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_44)));
241 EXPECT_EQ(MakeVersionLabel('T', '0', '4', '6'),
242 CreateQuicVersionLabel(
243 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_46)));
244 EXPECT_EQ(MakeVersionLabel('T', '0', '4', '7'),
245 CreateQuicVersionLabel(
246 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_47)));
247
248 FLAGS_quic_supports_tls_handshake = false;
249 EXPECT_EQ(UnsupportedQuicVersion(),
250 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '3', '5')));
251 EXPECT_EQ(UnsupportedQuicVersion(),
252 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '3', '9')));
253 EXPECT_EQ(UnsupportedQuicVersion(),
254 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '3')));
255 EXPECT_EQ(UnsupportedQuicVersion(),
256 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '4')));
257 EXPECT_EQ(UnsupportedQuicVersion(),
258 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '6')));
259 EXPECT_EQ(UnsupportedQuicVersion(),
260 ParseQuicVersionLabel(MakeVersionLabel('T', '0', '4', '7')));
261}
262
263TEST_F(QuicVersionsTest, QuicVersionLabelToString) {
264 QuicVersionLabelVector version_labels = {
265 MakeVersionLabel('Q', '0', '3', '5'),
266 MakeVersionLabel('Q', '0', '3', '7'),
267 MakeVersionLabel('T', '0', '3', '8'),
268 };
269
270 EXPECT_EQ("Q035", QuicVersionLabelToString(version_labels[0]));
271 EXPECT_EQ("T038", QuicVersionLabelToString(version_labels[2]));
272
273 EXPECT_EQ("Q035,Q037,T038", QuicVersionLabelVectorToString(version_labels));
274 EXPECT_EQ("Q035:Q037:T038",
275 QuicVersionLabelVectorToString(version_labels, ":", 2));
276 EXPECT_EQ("Q035|Q037|...",
277 QuicVersionLabelVectorToString(version_labels, "|", 1));
278}
279
280TEST_F(QuicVersionsTest, QuicVersionToString) {
281 EXPECT_EQ("QUIC_VERSION_39", QuicVersionToString(QUIC_VERSION_39));
282 EXPECT_EQ("QUIC_VERSION_UNSUPPORTED",
283 QuicVersionToString(QUIC_VERSION_UNSUPPORTED));
284
285 QuicTransportVersion single_version[] = {QUIC_VERSION_39};
286 QuicTransportVersionVector versions_vector;
287 for (size_t i = 0; i < QUIC_ARRAYSIZE(single_version); ++i) {
288 versions_vector.push_back(single_version[i]);
289 }
290 EXPECT_EQ("QUIC_VERSION_39",
291 QuicTransportVersionVectorToString(versions_vector));
292
293 QuicTransportVersion multiple_versions[] = {QUIC_VERSION_UNSUPPORTED,
294 QUIC_VERSION_39};
295 versions_vector.clear();
296 for (size_t i = 0; i < QUIC_ARRAYSIZE(multiple_versions); ++i) {
297 versions_vector.push_back(multiple_versions[i]);
298 }
299 EXPECT_EQ("QUIC_VERSION_UNSUPPORTED,QUIC_VERSION_39",
300 QuicTransportVersionVectorToString(versions_vector));
301
302 // Make sure that all supported versions are present in QuicVersionToString.
303 for (size_t i = 0; i < QUIC_ARRAYSIZE(kSupportedTransportVersions); ++i) {
304 QuicTransportVersion version = kSupportedTransportVersions[i];
305 EXPECT_NE("QUIC_VERSION_UNSUPPORTED", QuicVersionToString(version));
306 }
307}
308
309TEST_F(QuicVersionsTest, ParsedQuicVersionToString) {
310 ParsedQuicVersion unsupported = UnsupportedQuicVersion();
311 ParsedQuicVersion version39(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_39);
312 EXPECT_EQ("Q039", ParsedQuicVersionToString(version39));
313 EXPECT_EQ("0", ParsedQuicVersionToString(unsupported));
314
315 ParsedQuicVersionVector versions_vector = {version39};
316 EXPECT_EQ("Q039", ParsedQuicVersionVectorToString(versions_vector));
317
318 versions_vector = {unsupported, version39};
319 EXPECT_EQ("0,Q039", ParsedQuicVersionVectorToString(versions_vector));
320 EXPECT_EQ("0:Q039", ParsedQuicVersionVectorToString(versions_vector, ":",
321 versions_vector.size()));
322 EXPECT_EQ("0|...", ParsedQuicVersionVectorToString(versions_vector, "|", 0));
323
324 // Make sure that all supported versions are present in
325 // ParsedQuicVersionToString.
326 FLAGS_quic_supports_tls_handshake = true;
327 for (QuicTransportVersion transport_version : kSupportedTransportVersions) {
328 for (HandshakeProtocol protocol : kSupportedHandshakeProtocols) {
329 EXPECT_NE("0", ParsedQuicVersionToString(
330 ParsedQuicVersion(protocol, transport_version)));
331 }
332 }
333}
334TEST_F(QuicVersionsTest, AllSupportedTransportVersions) {
335 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
336 ASSERT_EQ(QUIC_ARRAYSIZE(kSupportedTransportVersions), all_versions.size());
337 for (size_t i = 0; i < all_versions.size(); ++i) {
338 EXPECT_EQ(kSupportedTransportVersions[i], all_versions[i]);
339 }
340}
341
342TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsAllVersions) {
343 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
344 SetQuicReloadableFlag(quic_disable_version_39, false);
345 SetQuicReloadableFlag(quic_enable_version_43, true);
346 SetQuicReloadableFlag(quic_enable_version_44, true);
347 SetQuicReloadableFlag(quic_enable_version_46, true);
348 SetQuicReloadableFlag(quic_enable_version_47, true);
349 SetQuicReloadableFlag(quic_enable_version_99, true);
350 ParsedQuicVersionVector parsed_versions;
351 for (QuicTransportVersion version : all_versions) {
352 parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
353 }
354 QuicTransportVersionVector expected_versions = {
355 QUIC_VERSION_99, QUIC_VERSION_47, QUIC_VERSION_46,
356 QUIC_VERSION_44, QUIC_VERSION_43, QUIC_VERSION_39};
357 ParsedQuicVersionVector expected_parsed_versions;
358 for (QuicTransportVersion version : expected_versions) {
359 expected_parsed_versions.push_back(
360 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
361 }
362
363 ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions));
364 ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions));
365}
366
367TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo99) {
368 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
369 SetQuicReloadableFlag(quic_disable_version_39, false);
370 SetQuicReloadableFlag(quic_enable_version_43, true);
371 SetQuicReloadableFlag(quic_enable_version_44, true);
372 SetQuicReloadableFlag(quic_enable_version_46, true);
373 SetQuicReloadableFlag(quic_enable_version_47, true);
374 SetQuicReloadableFlag(quic_enable_version_99, false);
375 ParsedQuicVersionVector parsed_versions;
376 for (QuicTransportVersion version : all_versions) {
377 parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
378 }
379 QuicTransportVersionVector expected_versions = {
380 QUIC_VERSION_47, QUIC_VERSION_46, QUIC_VERSION_44, QUIC_VERSION_43,
381 QUIC_VERSION_39};
382 ParsedQuicVersionVector expected_parsed_versions;
383 for (QuicTransportVersion version : expected_versions) {
384 expected_parsed_versions.push_back(
385 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
386 }
387
388 ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions));
389 ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions));
390}
391
392TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo47) {
393 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
394 SetQuicReloadableFlag(quic_disable_version_39, false);
395 SetQuicReloadableFlag(quic_enable_version_43, true);
396 SetQuicReloadableFlag(quic_enable_version_44, true);
397 SetQuicReloadableFlag(quic_enable_version_46, true);
398 SetQuicReloadableFlag(quic_enable_version_47, false);
399 SetQuicReloadableFlag(quic_enable_version_99, false);
400 ParsedQuicVersionVector parsed_versions;
401 for (QuicTransportVersion version : all_versions) {
402 parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
403 }
404 QuicTransportVersionVector expected_versions = {
405 QUIC_VERSION_46, QUIC_VERSION_44, QUIC_VERSION_43, QUIC_VERSION_39};
406 ParsedQuicVersionVector expected_parsed_versions;
407 for (QuicTransportVersion version : expected_versions) {
408 expected_parsed_versions.push_back(
409 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
410 }
411
412 ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions));
413 ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions));
414}
415
416TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo46) {
417 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
418 SetQuicReloadableFlag(quic_disable_version_39, false);
419 SetQuicReloadableFlag(quic_enable_version_43, true);
420 SetQuicReloadableFlag(quic_enable_version_44, true);
421 SetQuicReloadableFlag(quic_enable_version_46, false);
422 SetQuicReloadableFlag(quic_enable_version_47, false);
423 SetQuicReloadableFlag(quic_enable_version_99, false);
424 ParsedQuicVersionVector parsed_versions;
425 for (QuicTransportVersion version : all_versions) {
426 parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
427 }
428 QuicTransportVersionVector expected_versions = {
429 QUIC_VERSION_44, QUIC_VERSION_43, QUIC_VERSION_39};
430 ParsedQuicVersionVector expected_parsed_versions;
431 for (QuicTransportVersion version : expected_versions) {
432 expected_parsed_versions.push_back(
433 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
434 }
435
436 ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions));
437 ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions));
438}
439
440TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo44) {
441 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
442 SetQuicReloadableFlag(quic_disable_version_39, false);
443 SetQuicReloadableFlag(quic_enable_version_43, true);
444 SetQuicReloadableFlag(quic_enable_version_44, false);
445 SetQuicReloadableFlag(quic_enable_version_46, false);
446 SetQuicReloadableFlag(quic_enable_version_47, false);
447 SetQuicReloadableFlag(quic_enable_version_99, false);
448 ParsedQuicVersionVector parsed_versions;
449 for (QuicTransportVersion version : all_versions) {
450 parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
451 }
452 QuicTransportVersionVector expected_versions = {QUIC_VERSION_43,
453 QUIC_VERSION_39};
454 ParsedQuicVersionVector expected_parsed_versions;
455 for (QuicTransportVersion version : expected_versions) {
456 expected_parsed_versions.push_back(
457 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
458 }
459
460 ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions));
461 ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions));
462}
463
464TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo43) {
465 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
466 SetQuicReloadableFlag(quic_disable_version_39, false);
467 SetQuicReloadableFlag(quic_enable_version_43, false);
468 SetQuicReloadableFlag(quic_enable_version_44, false);
469 SetQuicReloadableFlag(quic_enable_version_46, false);
470 SetQuicReloadableFlag(quic_enable_version_47, false);
471 SetQuicReloadableFlag(quic_enable_version_99, false);
472 ParsedQuicVersionVector parsed_versions;
473 for (QuicTransportVersion version : all_versions) {
474 parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
475 }
476 QuicTransportVersionVector expected_versions = {QUIC_VERSION_39};
477 ParsedQuicVersionVector expected_parsed_versions;
478 for (QuicTransportVersion version : expected_versions) {
479 expected_parsed_versions.push_back(
480 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
481 }
482
483 ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions));
484 ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions));
485}
486
487TEST_F(QuicVersionsTest, FilterSupportedTransportVersionsNo39) {
488 QuicTransportVersionVector all_versions = AllSupportedTransportVersions();
489 SetQuicReloadableFlag(quic_disable_version_39, true);
490 SetQuicReloadableFlag(quic_enable_version_43, true);
491 SetQuicReloadableFlag(quic_enable_version_44, false);
492 SetQuicReloadableFlag(quic_enable_version_46, false);
493 SetQuicReloadableFlag(quic_enable_version_47, false);
494 SetQuicReloadableFlag(quic_enable_version_99, false);
495 ParsedQuicVersionVector parsed_versions;
496 for (QuicTransportVersion version : all_versions) {
497 parsed_versions.push_back(ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
498 }
499 QuicTransportVersionVector expected_versions = {QUIC_VERSION_43};
500 ParsedQuicVersionVector expected_parsed_versions;
501 for (QuicTransportVersion version : expected_versions) {
502 expected_parsed_versions.push_back(
503 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, version));
504 }
505
506 ASSERT_EQ(expected_versions, FilterSupportedTransportVersions(all_versions));
507 ASSERT_EQ(expected_parsed_versions, FilterSupportedVersions(parsed_versions));
508}
509
510TEST_F(QuicVersionsTest, LookUpVersionByIndex) {
511 QuicTransportVersionVector all_versions = {QUIC_VERSION_39};
512 int version_count = all_versions.size();
513 for (int i = -5; i <= version_count + 1; ++i) {
514 if (i >= 0 && i < version_count) {
515 EXPECT_EQ(all_versions[i], VersionOfIndex(all_versions, i)[0]);
516 } else {
517 EXPECT_EQ(QUIC_VERSION_UNSUPPORTED, VersionOfIndex(all_versions, i)[0]);
518 }
519 }
520}
521
522TEST_F(QuicVersionsTest, LookUpParsedVersionByIndex) {
523 ParsedQuicVersionVector all_versions = AllSupportedVersions();
524 int version_count = all_versions.size();
525 for (int i = -5; i <= version_count + 1; ++i) {
526 if (i >= 0 && i < version_count) {
527 EXPECT_EQ(all_versions[i], ParsedVersionOfIndex(all_versions, i)[0]);
528 } else {
529 EXPECT_EQ(UnsupportedQuicVersion(),
530 ParsedVersionOfIndex(all_versions, i)[0]);
531 }
532 }
533}
534
535TEST_F(QuicVersionsTest, ParsedVersionsToTransportVersions) {
536 ParsedQuicVersionVector all_versions = AllSupportedVersions();
537 QuicTransportVersionVector transport_versions =
538 ParsedVersionsToTransportVersions(all_versions);
539 ASSERT_EQ(all_versions.size(), transport_versions.size());
540 for (size_t i = 0; i < all_versions.size(); ++i) {
541 EXPECT_EQ(transport_versions[i], all_versions[i].transport_version);
542 }
543}
544
545// This test may appear to be so simplistic as to be unnecessary,
546// yet a typo was made in doing the #defines and it was caught
547// only in some test far removed from here... Better safe than sorry.
548TEST_F(QuicVersionsTest, CheckVersionNumbersForTypos) {
549 static_assert(QUIC_ARRAYSIZE(kSupportedTransportVersions) == 6u,
550 "Supported versions out of sync");
551 EXPECT_EQ(QUIC_VERSION_39, 39);
552 EXPECT_EQ(QUIC_VERSION_43, 43);
553 EXPECT_EQ(QUIC_VERSION_44, 44);
554 EXPECT_EQ(QUIC_VERSION_46, 46);
555 EXPECT_EQ(QUIC_VERSION_47, 47);
556 EXPECT_EQ(QUIC_VERSION_99, 99);
557}
dschinazi8ae60012019-04-04 18:07:27 -0700558
dschinazi35e749e2019-04-09 09:36:04 -0700559TEST_F(QuicVersionsTest, AlpnForVersion) {
560 FLAGS_quic_supports_tls_handshake = true;
561 ParsedQuicVersion parsed_version_q047 =
562 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_47);
563 ParsedQuicVersion parsed_version_t047 =
564 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_47);
565 ParsedQuicVersion parsed_version_t099 =
566 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_99);
567 FLAGS_quic_supports_tls_handshake = false;
568
569 EXPECT_EQ("h3-google-Q047", AlpnForVersion(parsed_version_q047));
570 EXPECT_EQ("h3-google-T047", AlpnForVersion(parsed_version_t047));
571 EXPECT_EQ("h3-google-T099", AlpnForVersion(parsed_version_t099));
572}
573
dschinazi8ae60012019-04-04 18:07:27 -0700574TEST_F(QuicVersionsTest, InitializeSupportForIetfDraft) {
575 FLAGS_quic_supports_tls_handshake = true;
576 ParsedQuicVersion parsed_version_t099 =
577 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_99);
578 FLAGS_quic_supports_tls_handshake = false;
579 EXPECT_EQ(MakeVersionLabel('T', '0', '9', '9'),
580 CreateQuicVersionLabel(parsed_version_t099));
dschinazi35e749e2019-04-09 09:36:04 -0700581 EXPECT_EQ("h3-google-T099", AlpnForVersion(parsed_version_t099));
dschinazi8ae60012019-04-04 18:07:27 -0700582
583 QuicVersionInitializeSupportForIetfDraft(0);
584 EXPECT_EQ(MakeVersionLabel('T', '0', '9', '9'),
585 CreateQuicVersionLabel(parsed_version_t099));
dschinazi35e749e2019-04-09 09:36:04 -0700586 EXPECT_EQ("h3-google-T099", AlpnForVersion(parsed_version_t099));
dschinazi8ae60012019-04-04 18:07:27 -0700587 EXPECT_FALSE(FLAGS_quic_supports_tls_handshake);
588
589 QuicVersionInitializeSupportForIetfDraft(18);
590 EXPECT_TRUE(FLAGS_quic_supports_tls_handshake);
591 EXPECT_EQ(MakeVersionLabel(0xff, 0, 0, 18),
592 CreateQuicVersionLabel(parsed_version_t099));
dschinazi35e749e2019-04-09 09:36:04 -0700593 EXPECT_EQ("h3-18", AlpnForVersion(parsed_version_t099));
dschinazi52627472019-04-09 16:20:20 -0700594
595 QuicVersionInitializeSupportForIetfDraft(0);
596 EXPECT_EQ(MakeVersionLabel('T', '0', '9', '9'),
597 CreateQuicVersionLabel(parsed_version_t099));
598 EXPECT_EQ("h3-google-T099", AlpnForVersion(parsed_version_t099));
dschinazi8ae60012019-04-04 18:07:27 -0700599}
600
601TEST_F(QuicVersionsTest, QuicEnableVersion) {
602 FLAGS_quic_supports_tls_handshake = true;
603 ParsedQuicVersion parsed_version_q047 =
604 ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, QUIC_VERSION_47);
605 ParsedQuicVersion parsed_version_t047 =
606 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_47);
607 ParsedQuicVersion parsed_version_t099 =
608 ParsedQuicVersion(PROTOCOL_TLS1_3, QUIC_VERSION_99);
609 FLAGS_quic_supports_tls_handshake = false;
610 SetQuicReloadableFlag(quic_disable_version_39, false);
611 SetQuicReloadableFlag(quic_enable_version_43, true);
612 SetQuicReloadableFlag(quic_enable_version_44, true);
613 SetQuicReloadableFlag(quic_enable_version_46, true);
614 SetQuicReloadableFlag(quic_enable_version_47, false);
615 SetQuicReloadableFlag(quic_enable_version_99, false);
616
617 QuicEnableVersion(parsed_version_q047);
618 EXPECT_FALSE(FLAGS_quic_supports_tls_handshake);
619 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_47));
620 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_99));
621
622 QuicEnableVersion(parsed_version_t047);
623 EXPECT_TRUE(FLAGS_quic_supports_tls_handshake);
624 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_47));
625 EXPECT_FALSE(GetQuicReloadableFlag(quic_enable_version_99));
626
627 QuicEnableVersion(parsed_version_t099);
628 EXPECT_TRUE(FLAGS_quic_supports_tls_handshake);
629 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_47));
630 EXPECT_TRUE(GetQuicReloadableFlag(quic_enable_version_99));
631}
632
QUICHE teama6ef0a62019-03-07 20:34:33 -0500633} // namespace
634} // namespace test
635} // namespace quic