Add a unit test to exercise reset reliability It currently does not pass (since we've not fixed this yet), but it's a good starting point. PiperOrigin-RevId: 525613854
diff --git a/quiche/quic/core/http/end_to_end_test.cc b/quiche/quic/core/http/end_to_end_test.cc index 35fe13a..bf8e903 100644 --- a/quiche/quic/core/http/end_to_end_test.cc +++ b/quiche/quic/core/http/end_to_end_test.cc
@@ -6991,6 +6991,49 @@ })); } +// This test currently does not pass; we need support for +// https://datatracker.ietf.org/doc/draft-seemann-quic-reliable-stream-reset/ in +// order to make this work. +TEST_P(EndToEndTest, DISABLED_WebTransportSessionResetReliability) { + enable_web_transport_ = true; + ASSERT_TRUE(Initialize()); + + if (!version_.UsesHttp3()) { + return; + } + + SetPacketLossPercentage(30); + + WebTransportHttp3* session = + CreateWebTransportSession("/resets", /*wait_for_server_response=*/true); + ASSERT_TRUE(session != nullptr); + + NiceMock<MockWebTransportSessionVisitor>& visitor = + SetupWebTransportVisitor(session); + EXPECT_CALL(visitor, OnIncomingUnidirectionalStreamAvailable()) + .WillRepeatedly([this, session]() { + ReadAllIncomingWebTransportUnidirectionalStreams(session); + }); + + std::vector<std::string> expected_log; + constexpr int kStreamsToCreate = 10; + for (int i = 0; i < kStreamsToCreate; i++) { + WebTransportStream* stream = session->OpenOutgoingBidirectionalStream(); + QuicStreamId id = stream->GetStreamId(); + ASSERT_TRUE(stream != nullptr); + stream->ResetWithUserCode(42); + + expected_log.push_back( + absl::StrCat("Received reset for stream ", id, " with error code 42")); + } + client_->WaitUntil(2000, [this, &expected_log]() { + return received_webtransport_unidirectional_streams_.size() >= + expected_log.size(); + }); + EXPECT_THAT(received_webtransport_unidirectional_streams_, + UnorderedElementsAreArray(expected_log)); +} + TEST_P(EndToEndTest, WebTransportSession404) { enable_web_transport_ = true; ASSERT_TRUE(Initialize());