Implement ShouldProcessPendingStreamImmediately() with IsEncryptionEstablished() in QuicSession and stop overriding it everywhere.
This should be a no-op for HTTP/3 and Qbone as their original implementations has the same return value as IsEncryptionEstablished() at their call site.
PiperOrigin-RevId: 571957559
diff --git a/quiche/quic/core/http/quic_receive_control_stream_test.cc b/quiche/quic/core/http/quic_receive_control_stream_test.cc
index af7e5d4..d448fe1 100644
--- a/quiche/quic/core/http/quic_receive_control_stream_test.cc
+++ b/quiche/quic/core/http/quic_receive_control_stream_test.cc
@@ -88,6 +88,10 @@
session_(connection_) {
EXPECT_CALL(session_, OnCongestionWindowChange(_)).Times(AnyNumber());
session_.Initialize();
+ EXPECT_CALL(
+ static_cast<const MockQuicCryptoStream&>(*session_.GetCryptoStream()),
+ encryption_established())
+ .WillRepeatedly(testing::Return(true));
QuicStreamId id = perspective() == Perspective::IS_SERVER
? GetNthClientInitiatedUnidirectionalStreamId(
session_.transport_version(), 3)
diff --git a/quiche/quic/core/http/quic_spdy_session_test.cc b/quiche/quic/core/http/quic_spdy_session_test.cc
index 2d368c2..07bd3aa 100644
--- a/quiche/quic/core/http/quic_spdy_session_test.cc
+++ b/quiche/quic/core/http/quic_spdy_session_test.cc
@@ -1357,6 +1357,7 @@
QuicStreamId id;
// Initialize HTTP/3 control stream.
if (VersionUsesHttp3(transport_version())) {
+ CompleteHandshake();
id = GetNthClientInitiatedUnidirectionalStreamId(transport_version(), 3);
char type[] = {kControlStream};
@@ -1381,6 +1382,7 @@
std::string error_message;
// Initialize HTTP/3 control stream.
if (VersionUsesHttp3(transport_version())) {
+ CompleteHandshake();
id = GetNthClientInitiatedUnidirectionalStreamId(transport_version(), 3);
char type[] = {kControlStream};
@@ -1784,6 +1786,7 @@
return;
}
+ CompleteHandshake();
EXPECT_EQ(0u, QuicSessionPeer::GetNumOpenDynamicStreams(&session_));
QuicStreamId stream_id1 =
GetNthServerInitiatedUnidirectionalStreamId(transport_version(), 0);
@@ -1796,7 +1799,7 @@
if (!VersionUsesHttp3(transport_version())) {
return;
}
-
+ CompleteHandshake();
QuicStreamId stream_id = QuicUtils::GetFirstUnidirectionalStreamId(
transport_version(), Perspective::IS_SERVER);
@@ -1928,6 +1931,7 @@
return;
}
+ CompleteHandshake();
EXPECT_EQ(0u, QuicSessionPeer::GetNumOpenDynamicStreams(&session_));
// Push unidirectional stream is type 0x01.
@@ -1946,6 +1950,7 @@
return;
}
+ CompleteHandshake();
EXPECT_EQ(0u, QuicSessionPeer::GetNumOpenDynamicStreams(&session_));
// Push unidirectional stream is type 0x01.
@@ -2146,6 +2151,8 @@
StrictMock<MockHttp3DebugVisitor> debug_visitor;
session_.set_debug_visitor(&debug_visitor);
+ EXPECT_CALL(debug_visitor, OnSettingsFrameSent(_));
+ CompleteHandshake();
// Create control stream.
QuicStreamId receive_control_stream_id =
@@ -2214,6 +2221,7 @@
return;
}
+ CompleteHandshake();
StrictMock<MockHttp3DebugVisitor> debug_visitor;
session_.set_debug_visitor(&debug_visitor);
@@ -2261,6 +2269,7 @@
return;
}
+ CompleteHandshake();
StrictMock<MockHttp3DebugVisitor> debug_visitor;
session_.set_debug_visitor(&debug_visitor);
@@ -2479,6 +2488,7 @@
if (!VersionUsesHttp3(transport_version())) {
return;
}
+ CompleteHandshake();
// Use an arbitrary stream id.
QuicStreamId stream_id =
GetNthClientInitiatedUnidirectionalStreamId(transport_version(), 3);
@@ -2649,6 +2659,7 @@
return;
}
+ CompleteHandshake();
const QuicStreamId stream_id =
GetNthServerInitiatedUnidirectionalStreamId(transport_version(), 0);
ASSERT_TRUE(session_.UsesPendingStreamForFrame(STREAM_FRAME, stream_id));
@@ -2677,6 +2688,7 @@
return;
}
+ CompleteHandshake();
const QuicStreamId stream_id =
GetNthServerInitiatedUnidirectionalStreamId(transport_version(), 0);
ASSERT_TRUE(session_.UsesPendingStreamForFrame(STREAM_FRAME, stream_id));
@@ -2694,6 +2706,7 @@
return;
}
+ CompleteHandshake();
StrictMock<MockHttp3DebugVisitor> debug_visitor;
session_.set_debug_visitor(&debug_visitor);
@@ -2767,6 +2780,7 @@
return;
}
+ CompleteHandshake();
std::string data = absl::HexStringToBytes(
"02" // Encoder stream.
"00"); // Duplicate entry 0, but no entries exist.
@@ -2788,6 +2802,7 @@
return;
}
+ CompleteHandshake();
std::string data = absl::HexStringToBytes(
"03" // Decoder stream.
"00"); // Insert Count Increment with forbidden increment value of zero.
@@ -2843,6 +2858,7 @@
return;
}
+ CompleteHandshake();
StrictMock<MockHttp3DebugVisitor> debug_visitor;
session_.set_debug_visitor(&debug_visitor);
@@ -2956,6 +2972,7 @@
if (!VersionUsesHttp3(transport_version())) {
return;
}
+ CompleteHandshake();
struct {
char type;
@@ -3045,6 +3062,7 @@
return;
}
+ CompleteHandshake();
StrictMock<MockHttp3DebugVisitor> debug_visitor;
session_.set_debug_visitor(&debug_visitor);
@@ -3170,6 +3188,7 @@
return;
}
+ CompleteHandshake();
StrictMock<MockHttp3DebugVisitor> debug_visitor;
session_.set_debug_visitor(&debug_visitor);
@@ -3277,6 +3296,7 @@
return;
}
+ CompleteHandshake();
QpackEncoder* qpack_encoder = session_.qpack_encoder();
EXPECT_EQ(0u, qpack_encoder->MaximumDynamicTableCapacity());
EXPECT_EQ(0u, qpack_encoder->maximum_blocked_streams());
@@ -3345,6 +3365,7 @@
return;
}
+ CompleteHandshake();
QpackEncoder* qpack_encoder = session_.qpack_encoder();
EXPECT_EQ(0u, qpack_encoder->MaximumDynamicTableCapacity());
@@ -3408,6 +3429,7 @@
if (!version().UsesHttp3()) {
return;
}
+ CompleteHandshake();
session_.set_local_http_datagram_support(local_support);
// HTTP/3 datagrams aren't supported before SETTINGS are received.
EXPECT_FALSE(session_.SupportsH3Datagram());
diff --git a/quiche/quic/core/qpack/qpack_receive_stream_test.cc b/quiche/quic/core/qpack/qpack_receive_stream_test.cc
index 4f94802..e7560fa 100644
--- a/quiche/quic/core/qpack/qpack_receive_stream_test.cc
+++ b/quiche/quic/core/qpack/qpack_receive_stream_test.cc
@@ -56,6 +56,10 @@
session_(connection_) {
EXPECT_CALL(session_, OnCongestionWindowChange(_)).Times(AnyNumber());
session_.Initialize();
+ EXPECT_CALL(
+ static_cast<const MockQuicCryptoStream&>(*session_.GetCryptoStream()),
+ encryption_established())
+ .WillRepeatedly(testing::Return(true));
QuicStreamId id = perspective() == Perspective::IS_SERVER
? GetNthClientInitiatedUnidirectionalStreamId(
session_.transport_version(), 3)
diff --git a/quiche/quic/core/quic_session.cc b/quiche/quic/core/quic_session.cc
index f86e722..b57d3b1 100644
--- a/quiche/quic/core/quic_session.cc
+++ b/quiche/quic/core/quic_session.cc
@@ -2733,5 +2733,9 @@
}
}
+bool QuicSession::ShouldProcessPendingStreamImmediately() const {
+ return IsEncryptionEstablished();
+}
+
#undef ENDPOINT // undef for jumbo builds
} // namespace quic
diff --git a/quiche/quic/core/quic_session.h b/quiche/quic/core/quic_session.h
index f347153..76600f5 100644
--- a/quiche/quic/core/quic_session.h
+++ b/quiche/quic/core/quic_session.h
@@ -736,7 +736,7 @@
// Returns true if a pending stream should be converted to a real stream after
// a corresponding STREAM_FRAME is received.
- virtual bool ShouldProcessPendingStreamImmediately() const { return true; }
+ bool ShouldProcessPendingStreamImmediately() const;
spdy::SpdyPriority GetSpdyPriorityofStream(QuicStreamId stream_id) const {
return write_blocked_streams_->GetPriorityOfStream(stream_id)
diff --git a/quiche/quic/core/quic_session_test.cc b/quiche/quic/core/quic_session_test.cc
index 3b90633..929c844 100644
--- a/quiche/quic/core/quic_session_test.cc
+++ b/quiche/quic/core/quic_session_test.cc
@@ -416,19 +416,10 @@
}
}
- bool ShouldProcessPendingStreamImmediately() const override {
- return process_pending_stream_immediately_;
- }
-
void set_uses_pending_streams(bool uses_pending_streams) {
uses_pending_streams_ = uses_pending_streams;
}
- void set_process_pending_stream_immediately(
- bool process_pending_stream_immediately) {
- process_pending_stream_immediately_ = process_pending_stream_immediately;
- }
-
int num_incoming_streams_created() const {
return num_incoming_streams_created_;
}
@@ -445,7 +436,6 @@
bool writev_consumes_all_data_;
bool uses_pending_streams_;
- bool process_pending_stream_immediately_ = true;
QuicFrame save_frame_;
int num_incoming_streams_created_;
};
@@ -1832,8 +1822,8 @@
if (!VersionUsesHttp3(transport_version())) {
return;
}
+ CompleteHandshake();
session_.set_uses_pending_streams(true);
- session_.set_process_pending_stream_immediately(true);
QuicStreamId stream_id = QuicUtils::GetFirstUnidirectionalStreamId(
transport_version(), Perspective::IS_CLIENT);
@@ -1853,7 +1843,6 @@
return;
}
session_.set_uses_pending_streams(true);
- session_.set_process_pending_stream_immediately(false);
QuicStreamId stream_id = QuicUtils::GetFirstUnidirectionalStreamId(
transport_version(), Perspective::IS_CLIENT);
@@ -1891,7 +1880,6 @@
return;
}
session_.set_uses_pending_streams(true);
- session_.set_process_pending_stream_immediately(false);
QuicStreamId stream_id = QuicUtils::GetFirstUnidirectionalStreamId(
transport_version(), Perspective::IS_CLIENT);
@@ -1936,23 +1924,32 @@
EXPECT_EQ(0u, QuicSessionPeer::GetNumOpenDynamicStreams(&session_));
}
-TEST_P(QuicSessionTestServer, OnFinPendingStreams) {
+TEST_P(QuicSessionTestServer, OnFinPendingStreamsReadUnidirectional) {
if (!VersionUsesHttp3(transport_version())) {
return;
}
+ CompleteHandshake();
session_.set_uses_pending_streams(true);
- session_.set_process_pending_stream_immediately(true);
QuicStreamId stream_id = QuicUtils::GetFirstUnidirectionalStreamId(
transport_version(), Perspective::IS_CLIENT);
QuicStreamFrame data(stream_id, true, 0, "");
session_.OnStreamFrame(data);
+ // The pending stream will be immediately converted to a normal unidirectional
+ // stream, but because its FIN has been received, it should be closed
+ // immediately.
EXPECT_FALSE(QuicSessionPeer::GetPendingStream(&session_, stream_id));
EXPECT_EQ(0, session_.num_incoming_streams_created());
EXPECT_EQ(0u, QuicSessionPeer::GetNumOpenDynamicStreams(&session_));
+ EXPECT_EQ(nullptr, QuicSessionPeer::GetStream(&session_, stream_id));
+}
- session_.set_process_pending_stream_immediately(false);
+TEST_P(QuicSessionTestServer, OnFinPendingStreamsBidirectional) {
+ if (!VersionUsesHttp3(transport_version())) {
+ return;
+ }
+ session_.set_uses_pending_streams(true);
// Bidirectional pending stream remains after Fin is received.
// Bidirectional stream is buffered.
QuicStreamId bidirectional_stream_id =
@@ -2002,7 +1999,6 @@
}
session_.set_uses_pending_streams(true);
- session_.set_process_pending_stream_immediately(false);
QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
transport_version(), Perspective::IS_CLIENT);
QuicStreamFrame data(stream_id, true, 10, absl::string_view("HT"));
@@ -2050,7 +2046,6 @@
}
session_.set_uses_pending_streams(true);
- session_.set_process_pending_stream_immediately(false);
QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
transport_version(), Perspective::IS_CLIENT);
QuicStreamFrame data(stream_id, true, 0, absl::string_view("HT"));
diff --git a/quiche/quic/test_tools/quic_test_utils.cc b/quiche/quic/test_tools/quic_test_utils.cc
index c79537d..52bd115 100644
--- a/quiche/quic/test_tools/quic_test_utils.cc
+++ b/quiche/quic/test_tools/quic_test_utils.cc
@@ -593,7 +593,8 @@
connection->supported_versions(),
/*num_expected_unidirectional_static_streams = */ 0) {
if (create_mock_crypto_stream) {
- crypto_stream_ = std::make_unique<MockQuicCryptoStream>(this);
+ crypto_stream_ =
+ std::make_unique<testing::NiceMock<MockQuicCryptoStream>>(this);
}
ON_CALL(*this, WritevData(_, _, _, _, _, _))
.WillByDefault(testing::Return(QuicConsumedData(0, false)));
@@ -638,8 +639,6 @@
return ssl_early_data_unknown;
}
-bool MockQuicCryptoStream::encryption_established() const { return false; }
-
bool MockQuicCryptoStream::one_rtt_keys_available() const { return false; }
const QuicCryptoNegotiatedParameters&
diff --git a/quiche/quic/test_tools/quic_test_utils.h b/quiche/quic/test_tools/quic_test_utils.h
index 5fd0df1..20567e3 100644
--- a/quiche/quic/test_tools/quic_test_utils.h
+++ b/quiche/quic/test_tools/quic_test_utils.h
@@ -834,8 +834,9 @@
~MockQuicCryptoStream() override;
+ MOCK_METHOD(bool, encryption_established, (), (const));
+
ssl_early_data_reason_t EarlyDataReason() const override;
- bool encryption_established() const override;
bool one_rtt_keys_available() const override;
const QuicCryptoNegotiatedParameters& crypto_negotiated_params()
const override;