Handle closing pending streams.
Make QuicSession handle if a pending stream is closed before it gets converted
into the appropriate incoming stream subclass.
gfe-relnote: n/a, no functional change outside QUIC v99-only code. Protected by existing disabled gfe2_reloadable_flag_quic_enable_version_99.
PiperOrigin-RevId: 262183753
Change-Id: I4147320860b867df0d80ba8fd55106bf779b15b3
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc
index 267208f..93596f2 100644
--- a/quic/core/quic_session_test.cc
+++ b/quic/core/quic_session_test.cc
@@ -1803,10 +1803,12 @@
transport_version(), Perspective::IS_CLIENT);
QuicStreamFrame data1(stream_id, true, 10, QuicStringPiece("HT"));
session_.OnStreamFrame(data1);
+ EXPECT_TRUE(QuicSessionPeer::GetPendingStream(&session_, stream_id));
EXPECT_EQ(0, session_.num_incoming_streams_created());
QuicStreamFrame data2(stream_id, false, 0, QuicStringPiece("HT"));
session_.OnStreamFrame(data2);
+ EXPECT_FALSE(QuicSessionPeer::GetPendingStream(&session_, stream_id));
EXPECT_EQ(1, session_.num_incoming_streams_created());
}
@@ -1820,6 +1822,7 @@
transport_version(), Perspective::IS_CLIENT);
QuicStreamFrame data1(stream_id, true, 10, QuicStringPiece("HT"));
session_.OnStreamFrame(data1);
+ EXPECT_TRUE(QuicSessionPeer::GetPendingStream(&session_, stream_id));
EXPECT_EQ(0, session_.num_incoming_streams_created());
EXPECT_EQ(0u, session_.GetNumOpenIncomingStreams());
@@ -1829,11 +1832,29 @@
QuicRstStreamFrame rst1(kInvalidControlFrameId, stream_id,
QUIC_ERROR_PROCESSING_STREAM, 12);
session_.OnRstStream(rst1);
+ EXPECT_FALSE(QuicSessionPeer::GetPendingStream(&session_, stream_id));
EXPECT_EQ(0, session_.num_incoming_streams_created());
EXPECT_EQ(0u, session_.GetNumOpenIncomingStreams());
QuicStreamFrame data2(stream_id, false, 0, QuicStringPiece("HT"));
session_.OnStreamFrame(data2);
+ EXPECT_FALSE(QuicSessionPeer::GetPendingStream(&session_, stream_id));
+ EXPECT_EQ(0, session_.num_incoming_streams_created());
+ EXPECT_EQ(0u, session_.GetNumOpenIncomingStreams());
+}
+
+TEST_P(QuicSessionTestServer, OnFinPendingStreams) {
+ if (!VersionHasIetfQuicFrames(transport_version())) {
+ return;
+ }
+ session_.set_uses_pending_streams(true);
+
+ QuicStreamId stream_id = QuicUtils::GetFirstUnidirectionalStreamId(
+ transport_version(), Perspective::IS_CLIENT);
+ QuicStreamFrame data(stream_id, true, 0, "");
+ session_.OnStreamFrame(data);
+
+ EXPECT_FALSE(QuicSessionPeer::GetPendingStream(&session_, stream_id));
EXPECT_EQ(0, session_.num_incoming_streams_created());
EXPECT_EQ(0u, session_.GetNumOpenIncomingStreams());
}
@@ -1848,6 +1869,7 @@
transport_version(), Perspective::IS_CLIENT);
QuicStreamFrame data1(stream_id, true, 10, QuicStringPiece("HT"));
session_.OnStreamFrame(data1);
+ EXPECT_TRUE(QuicSessionPeer::GetPendingStream(&session_, stream_id));
EXPECT_EQ(0, session_.num_incoming_streams_created());
QuicWindowUpdateFrame window_update_frame(kInvalidControlFrameId, stream_id,
0);