Cloned from CL 231494986 by 'g4 patch'.
Original change by bnc@bnc:majom-bnc-chromium-google3-headers-git5:2181:citc on 2019/01/29 16:21:02.

Send HEADERS on the request stream.

In QUIC version 99, send HEADERS (including trailers) on the request stream
instead of the headers stream, compressed with QPACK instead of HPACK.

gfe-relnote: Send HEADERS on the request stream in QUIC version 99 only.  Not flag protected.
PiperOrigin-RevId: 249121660
Change-Id: I933f9433da8bfffc8c2979aea742d485639b33c5
diff --git a/quic/tools/quic_simple_server_session_test.cc b/quic/tools/quic_simple_server_session_test.cc
index aa9104a..e08af9a 100644
--- a/quic/tools/quic_simple_server_session_test.cc
+++ b/quic/tools/quic_simple_server_session_test.cc
@@ -46,7 +46,12 @@
 namespace quic {
 namespace test {
 namespace {
+
 typedef QuicSimpleServerSession::PromisedStreamInfo PromisedStreamInfo;
+
+const QuicByteCount kHeadersFrameHeaderLength = 2;
+const QuicByteCount kHeadersFramePayloadLength = 9;
+
 }  // namespace
 
 class QuicSimpleServerSessionPeer {
@@ -643,6 +648,16 @@
         // Since flow control window is smaller than response body, not the
         // whole body will be sent.
         QuicStreamOffset offset = 0;
+        if (VersionUsesQpack(connection_->transport_version())) {
+          EXPECT_CALL(*connection_,
+                      SendStreamData(stream_id, kHeadersFrameHeaderLength,
+                                     offset, NO_FIN));
+          offset += kHeadersFrameHeaderLength;
+          EXPECT_CALL(*connection_,
+                      SendStreamData(stream_id, kHeadersFramePayloadLength,
+                                     offset, NO_FIN));
+          offset += kHeadersFramePayloadLength;
+        }
         if (VersionHasDataFrameHeader(connection_->transport_version())) {
           EXPECT_CALL(*connection_,
                       SendStreamData(stream_id, data_frame_header_length,
@@ -661,11 +676,13 @@
     return data_frame_header_length;
   }
 
-  void ConsumeHeadersStreamData() {
-    QuicStreamId headers_stream_id =
-        QuicUtils::GetHeadersStreamId(connection_->transport_version());
-    EXPECT_CALL(*connection_, SendStreamData(headers_stream_id, _, _, _))
-        .Times(AtLeast(1));
+  void MaybeConsumeHeadersStreamData() {
+    if (!VersionUsesQpack(connection_->transport_version())) {
+      QuicStreamId headers_stream_id =
+          QuicUtils::GetHeadersStreamId(connection_->transport_version());
+      EXPECT_CALL(*connection_, SendStreamData(headers_stream_id, _, _, _))
+          .Times(AtLeast(1));
+    }
   }
 };
 
@@ -677,7 +694,7 @@
 // PUSH_PROMISE's will be sent out and only kMaxStreamsForTest streams will be
 // opened and send push response.
 TEST_P(QuicSimpleServerSessionServerPushTest, TestPromisePushResources) {
-  ConsumeHeadersStreamData();
+  MaybeConsumeHeadersStreamData();
   size_t num_resources = kMaxStreamsForTest + 5;
   PromisePushResources(num_resources);
   EXPECT_EQ(kMaxStreamsForTest, session_->GetNumOpenOutgoingStreams());
@@ -687,7 +704,7 @@
 // draining, a queued promised stream will become open and send push response.
 TEST_P(QuicSimpleServerSessionServerPushTest,
        HandlePromisedPushRequestsAfterStreamDraining) {
-  ConsumeHeadersStreamData();
+  MaybeConsumeHeadersStreamData();
   size_t num_resources = kMaxStreamsForTest + 1;
   QuicByteCount data_frame_header_length = PromisePushResources(num_resources);
   QuicStreamId next_out_going_stream_id =
@@ -696,6 +713,16 @@
   // After an open stream is marked draining, a new stream is expected to be
   // created and a response sent on the stream.
   QuicStreamOffset offset = 0;
+  if (VersionUsesQpack(connection_->transport_version())) {
+    EXPECT_CALL(*connection_,
+                SendStreamData(next_out_going_stream_id,
+                               kHeadersFrameHeaderLength, offset, NO_FIN));
+    offset += kHeadersFrameHeaderLength;
+    EXPECT_CALL(*connection_,
+                SendStreamData(next_out_going_stream_id,
+                               kHeadersFramePayloadLength, offset, NO_FIN));
+    offset += kHeadersFramePayloadLength;
+  }
   if (VersionHasDataFrameHeader(connection_->transport_version())) {
     EXPECT_CALL(*connection_,
                 SendStreamData(next_out_going_stream_id,
@@ -728,7 +755,7 @@
 // prevent a promised resource to be send out.
 TEST_P(QuicSimpleServerSessionServerPushTest,
        ResetPromisedStreamToCancelServerPush) {
-  ConsumeHeadersStreamData();
+  MaybeConsumeHeadersStreamData();
 
   // 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.
@@ -763,6 +790,16 @@
       GetNthServerInitiatedUnidirectionalId(kMaxStreamsForTest);
   InSequence s;
   QuicStreamOffset offset = 0;
+  if (VersionUsesQpack(connection_->transport_version())) {
+    EXPECT_CALL(*connection_,
+                SendStreamData(stream_not_reset, kHeadersFrameHeaderLength,
+                               offset, NO_FIN));
+    offset += kHeadersFrameHeaderLength;
+    EXPECT_CALL(*connection_,
+                SendStreamData(stream_not_reset, kHeadersFramePayloadLength,
+                               offset, NO_FIN));
+    offset += kHeadersFramePayloadLength;
+  }
   if (VersionHasDataFrameHeader(connection_->transport_version())) {
     EXPECT_CALL(*connection_,
                 SendStreamData(stream_not_reset, data_frame_header_length,
@@ -791,7 +828,7 @@
 // the queue to be send out.
 TEST_P(QuicSimpleServerSessionServerPushTest,
        CloseStreamToHandleMorePromisedStream) {
-  ConsumeHeadersStreamData();
+  MaybeConsumeHeadersStreamData();
   size_t num_resources = kMaxStreamsForTest + 1;
   if (IsVersion99()) {
     // V99 will send out a stream-id-blocked frame when the we desired to exceed
@@ -816,6 +853,16 @@
                 OnStreamReset(stream_got_reset, QUIC_RST_ACKNOWLEDGEMENT));
   }
   QuicStreamOffset offset = 0;
+  if (VersionUsesQpack(connection_->transport_version())) {
+    EXPECT_CALL(*connection_,
+                SendStreamData(stream_to_open, kHeadersFrameHeaderLength,
+                               offset, NO_FIN));
+    offset += kHeadersFrameHeaderLength;
+    EXPECT_CALL(*connection_,
+                SendStreamData(stream_to_open, kHeadersFramePayloadLength,
+                               offset, NO_FIN));
+    offset += kHeadersFramePayloadLength;
+  }
   if (VersionHasDataFrameHeader(connection_->transport_version())) {
     EXPECT_CALL(*connection_,
                 SendStreamData(stream_to_open, data_frame_header_length, offset,