Fix bug in ParseQuicVersionString() which caused it to fail to parse the string-ified version of the QUIC v1 version label.
Add tests of QuicVersionLabelToString() for all current versions.
Add additional round-trip tests involving ParseQuicVersionString().
Also add a few static asserts to make sure that quic_version_tests stays in sync as new versions are added.
PiperOrigin-RevId: 427285599
diff --git a/quic/core/quic_versions.cc b/quic/core/quic_versions.cc
index 19fb6ad..c457dbf 100644
--- a/quic/core/quic_versions.cc
+++ b/quic/core/quic_versions.cc
@@ -331,22 +331,7 @@
if (version_string.empty()) {
return UnsupportedQuicVersion();
}
- int quic_version_number = 0;
const ParsedQuicVersionVector supported_versions = AllSupportedVersions();
- if (absl::SimpleAtoi(version_string, &quic_version_number) &&
- quic_version_number > 0) {
- QuicTransportVersion transport_version =
- static_cast<QuicTransportVersion>(quic_version_number);
- if (!ParsedQuicVersionIsValid(PROTOCOL_QUIC_CRYPTO, transport_version)) {
- return UnsupportedQuicVersion();
- }
- ParsedQuicVersion version(PROTOCOL_QUIC_CRYPTO, transport_version);
- if (std::find(supported_versions.begin(), supported_versions.end(),
- version) != supported_versions.end()) {
- return version;
- }
- return UnsupportedQuicVersion();
- }
for (const ParsedQuicVersion& version : supported_versions) {
if (version_string == ParsedQuicVersionToString(version) ||
version_string == AlpnForVersion(version) ||
@@ -362,6 +347,21 @@
return version;
}
}
+ int quic_version_number = 0;
+ if (absl::SimpleAtoi(version_string, &quic_version_number) &&
+ quic_version_number > 0) {
+ QuicTransportVersion transport_version =
+ static_cast<QuicTransportVersion>(quic_version_number);
+ if (!ParsedQuicVersionIsValid(PROTOCOL_QUIC_CRYPTO, transport_version)) {
+ return UnsupportedQuicVersion();
+ }
+ ParsedQuicVersion version(PROTOCOL_QUIC_CRYPTO, transport_version);
+ if (std::find(supported_versions.begin(), supported_versions.end(),
+ version) != supported_versions.end()) {
+ return version;
+ }
+ return UnsupportedQuicVersion();
+ }
// Reading from the client so this should not be considered an ERROR.
QUIC_DLOG(INFO) << "Unsupported QUIC version string: \"" << version_string
<< "\".";
diff --git a/quic/core/quic_versions_test.cc b/quic/core/quic_versions_test.cc
index 98b8574..5e8e97b 100644
--- a/quic/core/quic_versions_test.cc
+++ b/quic/core/quic_versions_test.cc
@@ -103,6 +103,8 @@
}
TEST(QuicVersionsTest, ParseQuicVersionLabel) {
+ static_assert(SupportedVersions().size() == 5u,
+ "Supported versions out of sync");
EXPECT_EQ(ParsedQuicVersion::Q043(),
ParseQuicVersionLabel(MakeVersionLabel('Q', '0', '4', '3')));
EXPECT_EQ(ParsedQuicVersion::Q046(),
@@ -119,9 +121,15 @@
MakeVersionLabel(0x00, 0x00, 0x00, 0x01),
MakeVersionLabel(0xaa, 0xaa, 0xaa, 0xaa),
MakeVersionLabel(0xff, 0x00, 0x00, 0x1d)}));
+
+ for (const ParsedQuicVersion& version : AllSupportedVersions()) {
+ EXPECT_EQ(version, ParseQuicVersionLabel(CreateQuicVersionLabel(version)));
+ }
}
TEST(QuicVersionsTest, ParseQuicVersionString) {
+ static_assert(SupportedVersions().size() == 5u,
+ "Supported versions out of sync");
EXPECT_EQ(ParsedQuicVersion::Q043(), ParseQuicVersionString("Q043"));
EXPECT_EQ(ParsedQuicVersion::Q046(),
ParseQuicVersionString("QUIC_VERSION_46"));
@@ -141,9 +149,16 @@
EXPECT_EQ(ParsedQuicVersion::Draft29(), ParseQuicVersionString("draft29"));
EXPECT_EQ(ParsedQuicVersion::Draft29(), ParseQuicVersionString("h3-29"));
+ EXPECT_EQ(ParsedQuicVersion::RFCv1(), ParseQuicVersionString("00000001"));
+ EXPECT_EQ(ParsedQuicVersion::RFCv1(), ParseQuicVersionString("h3"));
+
for (const ParsedQuicVersion& version : AllSupportedVersions()) {
EXPECT_EQ(version,
ParseQuicVersionString(ParsedQuicVersionToString(version)));
+ EXPECT_EQ(version, ParseQuicVersionString(QuicVersionLabelToString(
+ CreateQuicVersionLabel(version))));
+
+ EXPECT_EQ(version, ParseQuicVersionString(AlpnForVersion(version)));
}
}
@@ -203,6 +218,8 @@
// CreateQuicVersionLabel() uses MakeVersionLabel() internally,
// in case it has a bug.
TEST(QuicVersionsTest, CreateQuicVersionLabel) {
+ static_assert(SupportedVersions().size() == 5u,
+ "Supported versions out of sync");
EXPECT_EQ(0x51303433u, CreateQuicVersionLabel(ParsedQuicVersion::Q043()));
EXPECT_EQ(0x51303436u, CreateQuicVersionLabel(ParsedQuicVersion::Q046()));
EXPECT_EQ(0x51303530u, CreateQuicVersionLabel(ParsedQuicVersion::Q050()));
@@ -222,24 +239,39 @@
}
TEST(QuicVersionsTest, QuicVersionLabelToString) {
+ static_assert(SupportedVersions().size() == 5u,
+ "Supported versions out of sync");
+ EXPECT_EQ("Q043", QuicVersionLabelToString(
+ CreateQuicVersionLabel(ParsedQuicVersion::Q043())));
+ EXPECT_EQ("Q046", QuicVersionLabelToString(
+ CreateQuicVersionLabel(ParsedQuicVersion::Q046())));
+ EXPECT_EQ("Q050", QuicVersionLabelToString(
+ CreateQuicVersionLabel(ParsedQuicVersion::Q050())));
+ EXPECT_EQ("ff00001d", QuicVersionLabelToString(CreateQuicVersionLabel(
+ ParsedQuicVersion::Draft29())));
+ EXPECT_EQ("00000001", QuicVersionLabelToString(CreateQuicVersionLabel(
+ ParsedQuicVersion::RFCv1())));
+
QuicVersionLabelVector version_labels = {
MakeVersionLabel('Q', '0', '3', '5'),
- MakeVersionLabel('Q', '0', '3', '7'),
MakeVersionLabel('T', '0', '3', '8'),
+ MakeVersionLabel(0xff, 0, 0, 7),
};
EXPECT_EQ("Q035", QuicVersionLabelToString(version_labels[0]));
- EXPECT_EQ("T038", QuicVersionLabelToString(version_labels[2]));
+ EXPECT_EQ("T038", QuicVersionLabelToString(version_labels[1]));
+ EXPECT_EQ("ff000007", QuicVersionLabelToString(version_labels[2]));
- EXPECT_EQ("Q035,Q037,T038", QuicVersionLabelVectorToString(version_labels));
- EXPECT_EQ("Q035:Q037:T038",
+ EXPECT_EQ("Q035,T038,ff000007",
+ QuicVersionLabelVectorToString(version_labels));
+ EXPECT_EQ("Q035:T038:ff000007",
QuicVersionLabelVectorToString(version_labels, ":", 2));
- EXPECT_EQ("Q035|Q037|...",
+ EXPECT_EQ("Q035|T038|...",
QuicVersionLabelVectorToString(version_labels, "|", 1));
std::ostringstream os;
os << version_labels;
- EXPECT_EQ("Q035,Q037,T038", os.str());
+ EXPECT_EQ("Q035,T038,ff000007", os.str());
}
TEST(QuicVersionsTest, QuicVersionToString) {