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) {