Add default version for QuicTransport and use it in all unit tests.

This currently uses draft25, as draft27 doesn't yet has a quic_verions codepoint.

gfe-relnote: n/a (not used in production)
PiperOrigin-RevId: 298468043
Change-Id: I5dfd78a05717f166c56092b0ca3d868afb257072
diff --git a/quic/quic_transport/quic_transport_client_session_test.cc b/quic/quic_transport/quic_transport_client_session_test.cc
index 312b132..ba65ce2 100644
--- a/quic/quic_transport/quic_transport_client_session_test.cc
+++ b/quic/quic_transport/quic_transport_client_session_test.cc
@@ -36,15 +36,7 @@
 }
 
 ParsedQuicVersionVector GetVersions() {
-  for (const ParsedQuicVersion& version : AllSupportedVersions()) {
-    // Find the first version that supports IETF QUIC.
-    if (version.HasIetfQuicFrames() &&
-        version.handshake_protocol == quic::PROTOCOL_TLS1_3) {
-      return {version};
-    }
-  }
-  CHECK(false);
-  return {};
+  return {DefaultVersionForQuicTransport()};
 }
 
 std::string DataInStream(QuicStream* stream) {
@@ -65,6 +57,7 @@
                     Perspective::IS_CLIENT,
                     GetVersions()),
         crypto_config_(crypto_test_utils::ProofVerifierForTesting()) {
+    QuicEnableVersion(DefaultVersionForQuicTransport());
     CreateSession(GetTestOrigin(), "");
   }
 
diff --git a/quic/quic_transport/quic_transport_integration_test.cc b/quic/quic_transport/quic_transport_integration_test.cc
index 2da47fa..355f6cc 100644
--- a/quic/quic_transport/quic_transport_integration_test.cc
+++ b/quic/quic_transport/quic_transport_integration_test.cc
@@ -49,15 +49,7 @@
 }
 
 ParsedQuicVersionVector GetVersions() {
-  for (const ParsedQuicVersion& version : AllSupportedVersions()) {
-    // Find the first version that supports IETF QUIC.
-    if (version.HasIetfQuicFrames() &&
-        version.handshake_protocol == quic::PROTOCOL_TLS1_3) {
-      return {version};
-    }
-  }
-  CHECK(false);
-  return {};
+  return {DefaultVersionForQuicTransport()};
 }
 
 class QuicTransportEndpointBase : public QuicEndpointBase {
@@ -67,6 +59,7 @@
                             const std::string& peer_name,
                             Perspective perspective)
       : QuicEndpointBase(simulator, name, peer_name) {
+    QuicEnableVersion(DefaultVersionForQuicTransport());
     connection_ = std::make_unique<QuicConnection>(
         TestConnectionId(0x10), simulator::GetAddressFromName(peer_name),
         simulator, simulator->GetAlarmFactory(), &writer_,
diff --git a/quic/quic_transport/quic_transport_protocol.h b/quic/quic_transport/quic_transport_protocol.h
index 23f0d8d..6d95acc 100644
--- a/quic/quic_transport/quic_transport_protocol.h
+++ b/quic/quic_transport/quic_transport_protocol.h
@@ -6,7 +6,9 @@
 #define QUICHE_QUIC_QUIC_TRANSPORT_QUIC_TRANSPORT_PROTOCOL_H_
 
 #include "net/third_party/quiche/src/quic/core/quic_types.h"
+#include "net/third_party/quiche/src/quic/core/quic_versions.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
 
 namespace quic {
 
@@ -31,6 +33,23 @@
   kPath = 0x0001,
 };
 
+// Returns if the specified QUIC version can be used by QuicTransport.
+QUIC_EXPORT_PRIVATE constexpr bool IsVersionValidForQuicTransport(
+    const ParsedQuicVersion& version) {
+  return VersionSupportsMessageFrames(version.transport_version) &&
+         VersionHasIetfQuicFrames(version.transport_version) &&
+         version.handshake_protocol == PROTOCOL_TLS1_3;
+}
+
+// Returns default QUIC version used for QuicTransport.
+QUIC_EXPORT_PRIVATE inline ParsedQuicVersion DefaultVersionForQuicTransport() {
+  constexpr ParsedQuicVersion version(PROTOCOL_TLS1_3,
+                                      QUIC_VERSION_IETF_DRAFT_25);
+  static_assert(IsVersionValidForQuicTransport(version),
+                "Default QUIC version used by QuicTransport is invalid");
+  return version;
+}
+
 }  // namespace quic
 
 #endif  // QUICHE_QUIC_QUIC_TRANSPORT_QUIC_TRANSPORT_PROTOCOL_H_
diff --git a/quic/quic_transport/quic_transport_server_session_test.cc b/quic/quic_transport/quic_transport_server_session_test.cc
index c8ef5c7..8176b03 100644
--- a/quic/quic_transport/quic_transport_server_session_test.cc
+++ b/quic/quic_transport/quic_transport_server_session_test.cc
@@ -51,15 +51,7 @@
 }
 
 ParsedQuicVersionVector GetVersions() {
-  for (const ParsedQuicVersion& version : AllSupportedVersions()) {
-    // Find the first version that supports IETF QUIC.
-    if (version.HasIetfQuicFrames() &&
-        version.handshake_protocol == quic::PROTOCOL_TLS1_3) {
-      return {version};
-    }
-  }
-  CHECK(false);
-  return {};
+  return {DefaultVersionForQuicTransport()};
 }
 
 class QuicTransportServerSessionTest : public QuicTest {
@@ -75,6 +67,7 @@
                        KeyExchangeSource::Default()),
         compressed_certs_cache_(
             QuicCompressedCertsCache::kQuicCompressedCertsCacheSize) {
+    QuicEnableVersion(DefaultVersionForQuicTransport());
     connection_.AdvanceTime(QuicTime::Delta::FromSeconds(100000));
     crypto_test_utils::SetupCryptoServerConfigForTest(
         helper_.GetClock(), helper_.GetRandomGenerator(), &crypto_config_);
diff --git a/quic/quic_transport/quic_transport_stream_test.cc b/quic/quic_transport/quic_transport_stream_test.cc
index 3c92101..6a91702 100644
--- a/quic/quic_transport/quic_transport_stream_test.cc
+++ b/quic/quic_transport/quic_transport_stream_test.cc
@@ -24,15 +24,7 @@
 using testing::Return;
 
 ParsedQuicVersionVector GetVersions() {
-  for (const ParsedQuicVersion& version : AllSupportedVersions()) {
-    // Find the first version that supports IETF QUIC.
-    if (version.HasIetfQuicFrames() &&
-        version.handshake_protocol == quic::PROTOCOL_TLS1_3) {
-      return {version};
-    }
-  }
-  CHECK(false);
-  return {};
+  return {DefaultVersionForQuicTransport()};
 }
 
 class MockQuicTransportSessionInterface : public QuicTransportSessionInterface {
@@ -48,6 +40,7 @@
                                            Perspective::IS_CLIENT,
                                            GetVersions())),
         session_(connection_) {
+    QuicEnableVersion(DefaultVersionForQuicTransport());
     session_.Initialize();
 
     stream_ = new QuicTransportStream(0, &session_, &interface_);
diff --git a/quic/test_tools/crypto_test_utils.cc b/quic/test_tools/crypto_test_utils.cc
index 9537ec7..bfe4a5e 100644
--- a/quic/test_tools/crypto_test_utils.cc
+++ b/quic/test_tools/crypto_test_utils.cc
@@ -4,6 +4,7 @@
 
 #include "net/third_party/quiche/src/quic/test_tools/crypto_test_utils.h"
 
+#include <algorithm>
 #include <memory>
 #include <string>
 #include <utility>
@@ -271,24 +272,26 @@
                             const QuicServerId& server_id,
                             const FakeClientOptions& options,
                             std::string alpn) {
-  ParsedQuicVersionVector supported_versions = AllSupportedVersions();
+  // This function does not do version negotiation; read the supported versions
+  // directly from the server connection instead.
+  ParsedQuicVersionVector supported_versions =
+      server_conn->supported_versions();
   if (options.only_tls_versions) {
-    supported_versions.clear();
-    for (ParsedQuicVersion version : AllSupportedVersions()) {
-      if (version.handshake_protocol != PROTOCOL_TLS1_3) {
-        continue;
-      }
-      supported_versions.push_back(version);
-    }
+    supported_versions.erase(
+        std::remove_if(supported_versions.begin(), supported_versions.end(),
+                       [](const ParsedQuicVersion& version) {
+                         return version.handshake_protocol != PROTOCOL_TLS1_3;
+                       }),
+        supported_versions.end());
     CHECK(!options.only_quic_crypto_versions);
   } else if (options.only_quic_crypto_versions) {
-    supported_versions.clear();
-    for (ParsedQuicVersion version : AllSupportedVersions()) {
-      if (version.handshake_protocol != PROTOCOL_QUIC_CRYPTO) {
-        continue;
-      }
-      supported_versions.push_back(version);
-    }
+    supported_versions.erase(
+        std::remove_if(supported_versions.begin(), supported_versions.end(),
+                       [](const ParsedQuicVersion& version) {
+                         return version.handshake_protocol !=
+                                PROTOCOL_QUIC_CRYPTO;
+                       }),
+        supported_versions.end());
   }
   PacketSavingConnection* client_conn = new PacketSavingConnection(
       helper, alarm_factory, Perspective::IS_CLIENT, supported_versions);