Improve QuicSpdyStreamTest to call OnCryptoHandshakeEvent on the session to ensure that the various HTTP/3 initialization steps happen, matching what happens in production. gfe-relnote: n/a - test only PiperOrigin-RevId: 274254994 Change-Id: Ic9053ad49c905e4aa37a41691e7f6e2c31d6c53c
diff --git a/quic/core/http/quic_spdy_stream_test.cc b/quic/core/http/quic_spdy_stream_test.cc index a993126..c545265 100644 --- a/quic/core/http/quic_spdy_stream_test.cc +++ b/quic/core/http/quic_spdy_stream_test.cc
@@ -222,6 +222,30 @@ QuicConfigPeer::SetReceivedMaxIncomingUnidirectionalStreams( session_->config(), 10); session_->OnConfigNegotiated(); + EXPECT_CALL(*connection_, OnCanWrite()); + if (UsesHttp3()) { + // In this case, TestStream::WriteHeadersImpl() does not prevent writes. + // Six writes include priority for headers, headers frame header, headers + // frame, priority of trailers, trailing headers frame header, and + // trailers. + auto send_control_stream = + QuicSpdySessionPeer::GetSendControlStream(session_.get()); + // The control stream will write 3 times, including stream type, settings + // frame, priority for headers. + EXPECT_CALL(*session_, WritevData(send_control_stream, + send_control_stream->id(), _, _, _)) + .Times(2); + auto qpack_encoder_stream = + QuicSpdySessionPeer::GetQpackEncoderSendStream(session_.get()); + EXPECT_CALL(*session_, WritevData(qpack_encoder_stream, + qpack_encoder_stream->id(), 1, 0, _)); + auto qpack_decoder_stream = + QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get()); + EXPECT_CALL(*session_, WritevData(qpack_decoder_stream, + qpack_decoder_stream->id(), 1, 0, _)); + } + static_cast<QuicSession*>(session_.get()) + ->OnCryptoHandshakeEvent(QuicSession::ENCRYPTION_ESTABLISHED); } QuicHeaderList ProcessHeaders(bool fin, const SpdyHeaderBlock& headers) { @@ -1239,19 +1263,10 @@ .Times(4); auto send_control_stream = QuicSpdySessionPeer::GetSendControlStream(session_.get()); - // The control stream will write 3 times, including stream type, settings - // frame, priority for headers. + // The control stream will write priority for headers. EXPECT_CALL(*session_, WritevData(send_control_stream, send_control_stream->id(), _, _, _)) - .Times(3); - auto qpack_encoder_stream = - QuicSpdySessionPeer::GetQpackEncoderSendStream(session_.get()); - EXPECT_CALL(*session_, WritevData(qpack_encoder_stream, - qpack_encoder_stream->id(), 1, 0, _)); - auto qpack_decoder_stream = - QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get()); - EXPECT_CALL(*session_, WritevData(qpack_decoder_stream, - qpack_decoder_stream->id(), 1, 0, _)); + .Times(1); } // Write the initial headers, without a FIN. @@ -1860,8 +1875,6 @@ // The stream byte will be written in the first byte. EXPECT_CALL(*session_, WritevData(decoder_send_stream, - decoder_send_stream->id(), 1, 0, _)); - EXPECT_CALL(*session_, WritevData(decoder_send_stream, decoder_send_stream->id(), _, _, _)); // Deliver dynamic table entry to decoder. session_->qpack_decoder()->OnInsertWithoutNameReference("foo", "bar"); @@ -1924,8 +1937,6 @@ // The stream byte will be written in the first byte. EXPECT_CALL(*session_, WritevData(decoder_send_stream, - decoder_send_stream->id(), 1, 0, _)); - EXPECT_CALL(*session_, WritevData(decoder_send_stream, decoder_send_stream->id(), _, _, _)); // Deliver dynamic table entry to decoder. session_->qpack_decoder()->OnInsertWithoutNameReference("foo", "bar"); @@ -2015,8 +2026,6 @@ // The stream byte will be written in the first byte. EXPECT_CALL(*session_, WritevData(decoder_send_stream, - decoder_send_stream->id(), 1, 0, _)); - EXPECT_CALL(*session_, WritevData(decoder_send_stream, decoder_send_stream->id(), _, _, _)); // Deliver dynamic table entry to decoder. session_->qpack_decoder()->OnInsertWithoutNameReference("foo", "bar");