Enable QuicConnectionId variable length flags

This change reenables the QuicConnectionId variable length flags
(which makes QuicConnectionId be represented in memory in network
byte order) and fixes chromium-specific behavior that used to rely
on the connection IDs being 64 bits.

Bug: b/123008920
Change-Id: I9497c516a8612be3c0aaddd152825f559a9086f3
Reviewed-on: https://chromium-review.googlesource.com/c/1418632
Commit-Queue: David Schinazi <[email protected]>
Auto-Submit: David Schinazi <[email protected]>
Reviewed-by: Steve Anton <[email protected]>
Reviewed-by: Ryan Hamilton <[email protected]>
Cr-Commit-Position: refs/heads/master@{#625530}
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc
index fae3d65c..521b1c8 100644
--- a/net/quic/quic_network_transaction_unittest.cc
+++ b/net/quic/quic_network_transaction_unittest.cc
@@ -259,24 +259,26 @@
       : version_(std::get<0>(GetParam())),
         client_headers_include_h2_stream_dependency_(std::get<1>(GetParam())),
         supported_versions_(quic::test::SupportedTransportVersions(version_)),
-        client_maker_(version_,
-                      quic::EmptyQuicConnectionId(),
-                      &clock_,
-                      kDefaultServerHostName,
-                      quic::Perspective::IS_CLIENT,
-                      client_headers_include_h2_stream_dependency_),
-        server_maker_(version_,
-                      quic::EmptyQuicConnectionId(),
-                      &clock_,
-                      kDefaultServerHostName,
-                      quic::Perspective::IS_SERVER,
-                      false),
+        random_generator_(0),
+        client_maker_(
+            version_,
+            quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+            &clock_,
+            kDefaultServerHostName,
+            quic::Perspective::IS_CLIENT,
+            client_headers_include_h2_stream_dependency_),
+        server_maker_(
+            version_,
+            quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+            &clock_,
+            kDefaultServerHostName,
+            quic::Perspective::IS_SERVER,
+            false),
         cert_transparency_verifier_(new MultiLogCTVerifier()),
         ssl_config_service_(new SSLConfigServiceDefaults),
         proxy_resolution_service_(ProxyResolutionService::CreateDirect()),
         auth_handler_factory_(
             HttpAuthHandlerFactory::CreateDefault(&host_resolver_)),
-        random_generator_(0),
         ssl_data_(ASYNC, OK) {
     request_.method = "GET";
     std::string url("https://");
@@ -948,6 +950,7 @@
   quic::QuicTransportVersionVector supported_versions_;
   QuicFlagSaver flags_;  // Save/restore all QUIC flag values.
   quic::MockClock clock_;
+  quic::test::MockRandom random_generator_;
   QuicTestPacketMaker client_maker_;
   QuicTestPacketMaker server_maker_;
   std::unique_ptr<HttpNetworkSession> session_;
@@ -963,7 +966,6 @@
   std::unique_ptr<SSLConfigServiceDefaults> ssl_config_service_;
   std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
   std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
-  quic::test::MockRandom random_generator_;
   HttpServerPropertiesImpl http_server_properties_;
   HttpNetworkSession::Params session_params_;
   HttpNetworkSession::Context session_context_;
@@ -4138,12 +4140,12 @@
   // Second request will go over the pooled QUIC connection, but will be
   // reset by the server.
   QuicTestPacketMaker client_maker2(
-      version_, quic::EmptyQuicConnectionId(), &clock_, origin2.host(),
-      quic::Perspective::IS_CLIENT,
+      version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+      &clock_, origin2.host(), quic::Perspective::IS_CLIENT,
       client_headers_include_h2_stream_dependency_);
-  QuicTestPacketMaker server_maker2(version_, quic::EmptyQuicConnectionId(),
-                                    &clock_, origin2.host(),
-                                    quic::Perspective::IS_SERVER, false);
+  QuicTestPacketMaker server_maker2(
+      version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+      &clock_, origin2.host(), quic::Perspective::IS_SERVER, false);
   mock_quic_data.AddWrite(
       SYNCHRONOUS,
       ConstructClientRequestHeadersPacket(
@@ -4527,12 +4529,12 @@
 
   // Second request.
   QuicTestPacketMaker client_maker2(
-      version_, quic::EmptyQuicConnectionId(), &clock_, origin2.host(),
-      quic::Perspective::IS_CLIENT,
+      version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+      &clock_, origin2.host(), quic::Perspective::IS_CLIENT,
       client_headers_include_h2_stream_dependency_);
-  QuicTestPacketMaker server_maker2(version_, quic::EmptyQuicConnectionId(),
-                                    &clock_, origin2.host(),
-                                    quic::Perspective::IS_SERVER, false);
+  QuicTestPacketMaker server_maker2(
+      version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+      &clock_, origin2.host(), quic::Perspective::IS_SERVER, false);
   mock_quic_data.AddWrite(
       SYNCHRONOUS,
       ConstructClientRequestHeadersPacket(
@@ -4640,8 +4642,8 @@
   quic::QuicStreamOffset response_header_offset = 0;
 
   QuicTestPacketMaker client_maker(
-      version_, quic::EmptyQuicConnectionId(), &clock_, "mail.example.org",
-      quic::Perspective::IS_CLIENT,
+      version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+      &clock_, "mail.example.org", quic::Perspective::IS_CLIENT,
       client_headers_include_h2_stream_dependency_);
   server_maker_.set_hostname("www.example.org");
   client_maker_.set_hostname("www.example.org");
@@ -5598,7 +5600,8 @@
   socket_factory_.AddSSLSocketDataProvider(&ssl_data_);
 
   CreateSession();
-  AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START);
+  AddQuicAlternateProtocolMapping(
+      MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
   SendRequestAndExpectHttpResponse("hello from http");
   ExpectBrokenAlternateProtocolMapping();
 }
@@ -5905,12 +5908,8 @@
 
 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnect) {
   MockQuicData mock_quic_data;
-  mock_quic_data.AddRead(SYNCHRONOUS, ConstructServerConnectionClosePacket(1));
-  mock_quic_data.AddWrite(
-      SYNCHRONOUS, ConstructClientRequestHeadersPacket(
-                       1, GetNthClientInitiatedBidirectionalStreamId(0), true,
-                       true, GetRequestHeaders("GET", "https", "/")));
-  mock_quic_data.AddWrite(SYNCHRONOUS, ConstructClientAckPacket(2, 1, 1, 1));
+  mock_quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeDummyCHLOPacket(1));
+  mock_quic_data.AddRead(ASYNC, ConstructServerConnectionClosePacket(1));
   mock_quic_data.AddSocketDataToFactory(&socket_factory_);
 
   // When the QUIC connection fails, we will try the request again over HTTP.
@@ -5939,7 +5938,9 @@
   EXPECT_THAT(rv, IsOk());
 
   CreateSession();
-  AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT);
+  // TODO(rch): Check if we need a 0RTT version of ConnectionCloseDuringConnect
+  AddQuicAlternateProtocolMapping(
+      MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
   SendRequestAndExpectHttpResponse("hello world");
 }
 
@@ -5973,7 +5974,8 @@
 
 TEST_P(QuicNetworkTransactionTest, ConnectionCloseDuringConnectProxy) {
   MockQuicData mock_quic_data;
-  mock_quic_data.AddRead(SYNCHRONOUS, ConstructServerConnectionClosePacket(1));
+  mock_quic_data.AddWrite(SYNCHRONOUS, client_maker_.MakeDummyCHLOPacket(1));
+  mock_quic_data.AddRead(ASYNC, ConstructServerConnectionClosePacket(1));
   mock_quic_data.AddWrite(
       SYNCHRONOUS, ConstructClientRequestHeadersPacket(
                        1, GetNthClientInitiatedBidirectionalStreamId(0), true,
@@ -6017,6 +6019,8 @@
   EXPECT_THAT(rv, IsOk());
 
   CreateSession();
+  crypto_client_stream_factory_.set_handshake_mode(
+      MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
   SendRequestAndExpectHttpResponseFromProxy("hello world", true, 443);
   EXPECT_THAT(session_->proxy_resolution_service()->proxy_retry_info(),
               ElementsAre(Key("quic://myproxy.org:443")));
@@ -7223,12 +7227,12 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
 
   QuicTestPacketMaker client_maker(
-      version_, quic::EmptyQuicConnectionId(), &clock_, origin1_,
-      quic::Perspective::IS_CLIENT,
+      version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+      &clock_, origin1_, quic::Perspective::IS_CLIENT,
       client_headers_include_h2_stream_dependency_);
-  QuicTestPacketMaker server_maker(version_, quic::EmptyQuicConnectionId(),
-                                   &clock_, origin1_,
-                                   quic::Perspective::IS_SERVER, false);
+  QuicTestPacketMaker server_maker(
+      version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+      &clock_, origin1_, quic::Perspective::IS_SERVER, false);
 
   quic::QuicStreamOffset request_header_offset(0);
   quic::QuicStreamOffset response_header_offset(0);
@@ -7324,12 +7328,12 @@
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
 
   QuicTestPacketMaker client_maker1(
-      version_, quic::EmptyQuicConnectionId(), &clock_, origin1_,
-      quic::Perspective::IS_CLIENT,
+      version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+      &clock_, origin1_, quic::Perspective::IS_CLIENT,
       client_headers_include_h2_stream_dependency_);
-  QuicTestPacketMaker server_maker1(version_, quic::EmptyQuicConnectionId(),
-                                    &clock_, origin1_,
-                                    quic::Perspective::IS_SERVER, false);
+  QuicTestPacketMaker server_maker1(
+      version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+      &clock_, origin1_, quic::Perspective::IS_SERVER, false);
 
   MockQuicData mock_quic_data1;
   quic::QuicStreamOffset header_stream_offset1 = 0;
@@ -7356,12 +7360,12 @@
   mock_quic_data1.AddSocketDataToFactory(&socket_factory_);
 
   QuicTestPacketMaker client_maker2(
-      version_, quic::EmptyQuicConnectionId(), &clock_, origin2_,
-      quic::Perspective::IS_CLIENT,
+      version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+      &clock_, origin2_, quic::Perspective::IS_CLIENT,
       client_headers_include_h2_stream_dependency_);
-  QuicTestPacketMaker server_maker2(version_, quic::EmptyQuicConnectionId(),
-                                    &clock_, origin2_,
-                                    quic::Perspective::IS_SERVER, false);
+  QuicTestPacketMaker server_maker2(
+      version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+      &clock_, origin2_, quic::Perspective::IS_SERVER, false);
 
   MockQuicData mock_quic_data2;
   quic::QuicStreamOffset header_stream_offset2 = 0;
@@ -8416,12 +8420,12 @@
   // reused. See http://crbug.com/544255.
   for (int i = 0; i < 2; ++i) {
     client_maker.reset(new QuicTestPacketMaker(
-        version_, quic::EmptyQuicConnectionId(), &clock_,
-        kDefaultServerHostName, quic::Perspective::IS_CLIENT,
+        version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+        &clock_, kDefaultServerHostName, quic::Perspective::IS_CLIENT,
         client_headers_include_h2_stream_dependency_));
     server_maker.reset(new QuicTestPacketMaker(
-        version_, quic::EmptyQuicConnectionId(), &clock_,
-        kDefaultServerHostName, quic::Perspective::IS_SERVER, false));
+        version_, quic::QuicUtils::CreateRandomConnectionId(&random_generator_),
+        &clock_, kDefaultServerHostName, quic::Perspective::IS_SERVER, false));
 
     session_params_.enable_quic = true;
     session_params_.enable_quic_proxies_for_https_urls = true;