Add QuicSpdySession::EnableServerPush().  Re-enable QuicSimpleServerSessionServerPushTests.

gfe-relnote: Add method only used in tests, re-enable some tests.  Not protected.
PiperOrigin-RevId: 302431681
Change-Id: I3eeb630b0be43c76fa7c36be6c2ac1f13ee97abb
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc
index 713a8d0..26bd5d0 100644
--- a/quic/core/http/quic_spdy_session.cc
+++ b/quic/core/http/quic_spdy_session.cc
@@ -388,7 +388,6 @@
       qpack_maximum_blocked_streams_(kDefaultMaximumBlockedStreams),
       max_inbound_header_list_size_(kDefaultMaxUncompressedHeaderSize),
       max_outbound_header_list_size_(std::numeric_limits<size_t>::max()),
-      server_push_enabled_(true),
       stream_id_(
           QuicUtils::GetInvalidStreamId(connection->transport_version())),
       promised_stream_id_(
@@ -397,6 +396,8 @@
       frame_len_(0),
       spdy_framer_(SpdyFramer::ENABLE_COMPRESSION),
       spdy_framer_visitor_(new SpdyFramerVisitor(this)),
+      server_push_enabled_(true),
+      ietf_server_push_enabled_(false),
       max_allowed_push_id_(0),
       destruction_indicator_(123456789),
       debug_visitor_(nullptr),
@@ -708,8 +709,8 @@
 }
 
 bool QuicSpdySession::server_push_enabled() const {
-  // TODO(b/151641466): Improve and enable server push for IETF QUIC.
-  return VersionUsesHttp3(transport_version()) ? false : server_push_enabled_;
+  return VersionUsesHttp3(transport_version()) ? ietf_server_push_enabled_
+                                               : server_push_enabled_;
 }
 
 void QuicSpdySession::SendInitialData() {
@@ -1223,6 +1224,13 @@
   send_control_stream_->SendMaxPushIdFrame(max_allowed_push_id_);
 }
 
+void QuicSpdySession::EnableServerPush() {
+  DCHECK(VersionUsesHttp3(transport_version()));
+  DCHECK_EQ(perspective(), Perspective::IS_SERVER);
+
+  ietf_server_push_enabled_ = true;
+}
+
 void QuicSpdySession::CloseConnectionOnDuplicateHttp3UnidirectionalStreams(
     quiche::QuicheStringPiece type) {
   QUIC_PEER_BUG << quiche::QuicheStrCat("Received a duplicate ", type,
diff --git a/quic/core/http/quic_spdy_session.h b/quic/core/http/quic_spdy_session.h
index 71a001d..631c036 100644
--- a/quic/core/http/quic_spdy_session.h
+++ b/quic/core/http/quic_spdy_session.h
@@ -296,6 +296,14 @@
 
   QuicStreamId max_allowed_push_id() { return max_allowed_push_id_; }
 
+  // Enables server push.
+  // Must only be called when using IETF QUIC, for which server push is disabled
+  // by default.  Server push defaults to enabled and cannot be disabled for
+  // Google QUIC.
+  // Must only be called for a server.  A client can effectively disable push by
+  // never calling SetMaxAllowedPushId().
+  void EnableServerPush();
+
   int32_t destruction_indicator() const { return destruction_indicator_; }
 
   void set_debug_visitor(Http3DebugVisitor* debug_visitor) {
@@ -476,10 +484,6 @@
   // TODO(b/148616439): Honor this field when sending headers.
   size_t max_outbound_header_list_size_;
 
-  // Set during handshake. If true, resources in x-associated-content and link
-  // headers will be pushed.
-  bool server_push_enabled_;
-
   // Data about the stream whose headers are being processed.
   QuicStreamId stream_id_;
   QuicStreamId promised_stream_id_;
@@ -489,6 +493,16 @@
   spdy::SpdyFramer spdy_framer_;
   http2::Http2DecoderAdapter h2_deframer_;
   std::unique_ptr<SpdyFramerVisitor> spdy_framer_visitor_;
+
+  // Used in Google QUIC only.  Set every time SETTINGS_ENABLE_PUSH is received.
+  // Defaults to true.
+  bool server_push_enabled_;
+
+  // Used in IETF QUIC only, and only for servers.  Set locally via
+  // EnableServerPush(), not influenced by data received from the client.
+  // Defaults to false.
+  bool ietf_server_push_enabled_;
+
   QuicStreamId max_allowed_push_id_;
 
   // An integer used for live check. The indicator is assigned a value in
diff --git a/quic/tools/quic_simple_server_session_test.cc b/quic/tools/quic_simple_server_session_test.cc
index 363dfd9..b127cd6 100644
--- a/quic/tools/quic_simple_server_session_test.cc
+++ b/quic/tools/quic_simple_server_session_test.cc
@@ -754,13 +754,11 @@
 // PUSH_PROMISE's will be sent out and only kMaxStreamsForTest streams will be
 // opened and send push response.
 TEST_P(QuicSimpleServerSessionServerPushTest, TestPromisePushResources) {
-  // TODO(b/151641466): Re-enable server push for IETF QUIC.
-  if (VersionUsesHttp3(transport_version())) {
-    return;
-  }
-
   MaybeConsumeHeadersStreamData();
-  session_->SetMaxAllowedPushId(kMaxQuicStreamId);
+  if (VersionUsesHttp3(transport_version())) {
+    session_->EnableServerPush();
+    session_->SetMaxAllowedPushId(kMaxQuicStreamId);
+  }
   size_t num_resources = kMaxStreamsForTest + 5;
   PromisePushResources(num_resources);
   EXPECT_EQ(kMaxStreamsForTest, session_->GetNumOpenOutgoingStreams());
@@ -770,13 +768,11 @@
 // draining, a queued promised stream will become open and send push response.
 TEST_P(QuicSimpleServerSessionServerPushTest,
        HandlePromisedPushRequestsAfterStreamDraining) {
-  // TODO(b/151641466): Re-enable server push for IETF QUIC.
-  if (VersionUsesHttp3(transport_version())) {
-    return;
-  }
-
   MaybeConsumeHeadersStreamData();
-  session_->SetMaxAllowedPushId(kMaxQuicStreamId);
+  if (VersionUsesHttp3(transport_version())) {
+    session_->EnableServerPush();
+    session_->SetMaxAllowedPushId(kMaxQuicStreamId);
+  }
   size_t num_resources = kMaxStreamsForTest + 1;
   QuicByteCount data_frame_header_length = PromisePushResources(num_resources);
   QuicStreamId next_out_going_stream_id;
@@ -851,7 +847,10 @@
     return;
   }
   MaybeConsumeHeadersStreamData();
-  session_->SetMaxAllowedPushId(kMaxQuicStreamId);
+  if (VersionUsesHttp3(transport_version())) {
+    session_->EnableServerPush();
+    session_->SetMaxAllowedPushId(kMaxQuicStreamId);
+  }
 
   // Having two extra resources to be send later. One of them will be reset, so
   // when opened stream become close, only one will become open.
@@ -935,13 +934,11 @@
 // the queue to be send out.
 TEST_P(QuicSimpleServerSessionServerPushTest,
        CloseStreamToHandleMorePromisedStream) {
-  // TODO(b/151641466): Re-enable server push for IETF QUIC.
-  if (VersionUsesHttp3(transport_version())) {
-    return;
-  }
-
   MaybeConsumeHeadersStreamData();
-  session_->SetMaxAllowedPushId(kMaxQuicStreamId);
+  if (VersionUsesHttp3(transport_version())) {
+    session_->EnableServerPush();
+    session_->SetMaxAllowedPushId(kMaxQuicStreamId);
+  }
   size_t num_resources = kMaxStreamsForTest + 1;
   if (VersionHasIetfQuicFrames(transport_version())) {
     // V99 will send out a stream-id-blocked frame when the we desired to exceed